aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/storageEnum.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/storageEnum.cpp')
-rw-r--r--Src/omBrowser/storageEnum.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/Src/omBrowser/storageEnum.cpp b/Src/omBrowser/storageEnum.cpp
new file mode 100644
index 00000000..a4824e20
--- /dev/null
+++ b/Src/omBrowser/storageEnum.cpp
@@ -0,0 +1,119 @@
+#include "main.h"
+#include "./storageEnum.h"
+#include "./ifc_omstorage.h"
+
+OmStorageEnumerator::OmStorageEnumerator(ifc_omstorage **storageList, size_t storageSize, const GUID *type, UINT capabilities)
+ : ref(1), index(0), list(storageList), size(storageSize)
+{
+ fType = (NULL != type) ? *type : GUID_NULL;
+ fCapabilities = capabilities;
+}
+
+OmStorageEnumerator::~OmStorageEnumerator()
+{
+}
+
+HRESULT OmStorageEnumerator::CreateInstance(ifc_omstorage **storageList, size_t storageSize, const GUID *type, UINT capabilities, OmStorageEnumerator **instance)
+{
+ if (NULL == instance) return E_POINTER;
+
+ *instance = new OmStorageEnumerator(storageList, storageSize, type, capabilities);
+ if (NULL == *instance) return E_OUTOFMEMORY;
+
+ return S_OK;
+}
+
+size_t OmStorageEnumerator::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+size_t OmStorageEnumerator::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+int OmStorageEnumerator::QueryInterface(GUID interface_guid, void **object)
+{
+ if (NULL == object) return E_POINTER;
+
+ if (IsEqualIID(interface_guid, IFC_OmStorageEnumerator))
+ *object = static_cast<ifc_omstorageenumerator*>(this);
+ else
+ {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+
+ if (NULL == *object)
+ return E_UNEXPECTED;
+
+ AddRef();
+ return S_OK;
+}
+
+HRESULT OmStorageEnumerator::Next(ULONG listSize, ifc_omstorage **elementList, ULONG *elementCount)
+{
+ if (NULL == elementList || 0 == listSize) return E_INVALIDARG;
+ if (index >= size)
+ {
+ if (NULL != elementCount) *elementCount = 0;
+ return S_FALSE;
+ }
+
+ ULONG count = 0;
+ ifc_omstorage *storage = NULL;
+ GUID storageId = GUID_NULL;
+
+ for (;index < size && count < listSize; index++)
+ {
+ storage = list[index];
+ if (NULL != storage &&
+ SUCCEEDED(storage->GetType(&storageId)) && IsEqualGUID(storageId, fType) &&
+ (0 == fCapabilities || fCapabilities == (fCapabilities & storage->GetCapabilities())))
+ {
+ elementList[count] = storage;
+ storage->AddRef();
+ count++;
+ }
+ }
+
+ if (NULL != elementCount) *elementCount = count;
+
+ return (count == listSize) ? S_OK : S_FALSE;
+}
+
+HRESULT OmStorageEnumerator::Reset(void)
+{
+ index = 0;
+ return S_OK;
+}
+
+HRESULT OmStorageEnumerator::Skip(ULONG elementCount)
+{
+ index += elementCount;
+ if (index >= size)
+ {
+ index = (size - 1);
+ return S_FALSE;
+ }
+ return S_OK;
+}
+
+#define CBCLASS OmStorageEnumerator
+START_DISPATCH;
+CB(ADDREF, AddRef)
+CB(RELEASE, Release)
+CB(QUERYINTERFACE, QueryInterface)
+CB(API_NEXT, Next)
+CB(API_RESET, Reset)
+CB(API_SKIP, Skip)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file