summaryrefslogtreecommitdiff
path: root/wpd/WpdServiceSampleDriver/FakeStorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wpd/WpdServiceSampleDriver/FakeStorage.cpp')
-rw-r--r--wpd/WpdServiceSampleDriver/FakeStorage.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/wpd/WpdServiceSampleDriver/FakeStorage.cpp b/wpd/WpdServiceSampleDriver/FakeStorage.cpp
new file mode 100644
index 00000000..0d54e671
--- /dev/null
+++ b/wpd/WpdServiceSampleDriver/FakeStorage.cpp
@@ -0,0 +1,217 @@
+#include "stdafx.h"
+
+#include "FakeStorage.tmh"
+
+const PropertyAttributeInfo g_SupportedStorageProperties[] =
+{
+ {&WPD_OBJECT_ID, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_PERSISTENT_UNIQUE_ID, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_PARENT_ID, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_NAME, VT_LPWSTR, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_FORMAT, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_CONTENT_TYPE, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_CAN_DELETE, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_TYPE, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_FILE_SYSTEM_TYPE, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_CAPACITY, VT_UI8, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_FREE_SPACE_IN_BYTES, VT_UI8, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_SERIAL_NUMBER, VT_LPWSTR, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+ {&WPD_STORAGE_DESCRIPTION, VT_LPWSTR, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast, NULL},
+ {&WPD_FUNCTIONAL_OBJECT_CATEGORY, VT_CLSID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast, NULL},
+};
+
+HRESULT FakeStorage::GetSupportedProperties(
+ _In_ IPortableDeviceKeyCollection *pKeys)
+{
+ HRESULT hr = S_OK;
+
+ if (pKeys == NULL)
+ {
+ hr = E_POINTER;
+ CHECK_HR(hr, "Cannot have NULL parameter");
+ return hr;
+ }
+
+ for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedStorageProperties); dwIndex++)
+ {
+ hr = pKeys->Add(*g_SupportedStorageProperties[dwIndex].pKey);
+ CHECK_HR(hr, "Failed to add storage property");
+ }
+
+ return hr;
+}
+
+HRESULT FakeStorage::GetValue(
+ _In_ REFPROPERTYKEY Key,
+ _In_ IPortableDeviceValues* pStore)
+{
+ HRESULT hr = S_OK;
+
+ if(pStore == NULL)
+ {
+ hr = E_POINTER;
+ CHECK_HR(hr, "Cannot have NULL parameter");
+ return hr;
+ }
+
+ if (IsEqualPropertyKey(Key, WPD_STORAGE_SERIAL_NUMBER))
+ {
+ hr = pStore->SetStringValue(WPD_STORAGE_SERIAL_NUMBER, SerialNumber);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_SERIAL_NUMBER");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_STORAGE_FREE_SPACE_IN_BYTES))
+ {
+ hr = pStore->SetUnsignedLargeIntegerValue(WPD_STORAGE_FREE_SPACE_IN_BYTES, FreeSpace);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_FREE_SPACE_IN_BYTES");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_STORAGE_CAPACITY))
+ {
+ hr = pStore->SetUnsignedLargeIntegerValue(WPD_STORAGE_CAPACITY, Capacity);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_CAPACITY");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_STORAGE_TYPE))
+ {
+ hr = pStore->SetUnsignedIntegerValue(WPD_STORAGE_TYPE, StorageType);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_TYPE");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_STORAGE_FILE_SYSTEM_TYPE))
+ {
+ hr = pStore->SetStringValue(WPD_STORAGE_FILE_SYSTEM_TYPE, FileSystemType);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_FILE_SYSTEM_TYPE");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_STORAGE_DESCRIPTION))
+ {
+ hr = pStore->SetStringValue(WPD_STORAGE_DESCRIPTION, Description);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
+ {
+ hr = pStore->SetStringValue(WPD_OBJECT_ID, ObjectID);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
+ {
+ hr = pStore->SetStringValue(WPD_OBJECT_NAME, Name);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
+ {
+ hr = pStore->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, PersistentUniqueID);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
+ {
+ hr = pStore->SetStringValue(WPD_OBJECT_PARENT_ID, ParentID);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
+ {
+ hr = pStore->SetGuidValue(WPD_OBJECT_FORMAT, Format);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
+ {
+ hr = pStore->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, ContentType);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
+ {
+ hr = pStore->SetBoolValue(WPD_OBJECT_CAN_DELETE, CanDelete);
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
+ {
+ hr = pStore->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, FunctionalCategory);
+ CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
+ }
+ else if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID))
+ {
+ hr = pStore->SetStringValue(WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, ContainerFunctionalObjectID);
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION");
+ }
+ else
+ {
+ hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
+ CHECK_HR(hr, "Property {%ws}.%d is not supported", CComBSTR(Key.fmtid), Key.pid);
+ }
+
+ return hr;
+}
+
+HRESULT FakeStorage::WriteValue(
+ _In_ REFPROPERTYKEY Key,
+ _In_ REFPROPVARIANT Value)
+{
+ HRESULT hr = S_OK;
+ PropVariantWrapper pvValue;
+
+ if(IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
+ {
+ if(Value.vt == VT_LPWSTR)
+ {
+ if (Value.pwszVal != NULL && Value.pwszVal[0] != L'\0')
+ {
+ Name = Value.pwszVal;
+ }
+ else
+ {
+ hr = E_INVALIDARG;
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME because value was an empty string");
+ }
+ }
+ else
+ {
+ hr = E_INVALIDARG;
+ CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME because type was not VT_LPWSTR");
+ }
+ }
+ else if(IsEqualPropertyKey(Key, WPD_STORAGE_DESCRIPTION))
+ {
+ if(Value.vt == VT_LPWSTR)
+ {
+ if (Value.pwszVal != NULL && Value.pwszVal[0] != L'\0')
+ {
+ Description = Value.pwszVal;
+ }
+ else
+ {
+ hr = E_INVALIDARG;
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION because value was an empty string");
+ }
+ }
+ else
+ {
+ hr = E_INVALIDARG;
+ CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION because type was not VT_LPWSTR");
+ }
+ }
+ else
+ {
+ hr = E_ACCESSDENIED;
+ CHECK_HR(hr, "Property %ws.%d on [%ws] does not support set value operation", CComBSTR(Key.fmtid), Key.pid, ObjectID);
+ }
+
+ return hr;
+}
+
+
+HRESULT FakeStorage::GetPropertyAttributes(
+ _In_ REFPROPERTYKEY Key,
+ _In_ IPortableDeviceValues* pAttributes)
+{
+ HRESULT hr = S_OK;
+
+ if(pAttributes == NULL)
+ {
+ hr = E_POINTER;
+ CHECK_HR(hr, "Cannot have NULL attributes parameter");
+ return hr;
+ }
+
+ hr = SetPropertyAttributes(Key, &g_SupportedStorageProperties[0], ARRAYSIZE(g_SupportedStorageProperties), pAttributes);
+ CHECK_HR(hr, "Failed to set storage property attributes");
+
+ return hr;
+}
+