summaryrefslogtreecommitdiff
path: root/wpd/WpdServiceSampleDriver/FakeContent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wpd/WpdServiceSampleDriver/FakeContent.cpp')
-rw-r--r--wpd/WpdServiceSampleDriver/FakeContent.cpp635
1 files changed, 0 insertions, 635 deletions
diff --git a/wpd/WpdServiceSampleDriver/FakeContent.cpp b/wpd/WpdServiceSampleDriver/FakeContent.cpp
deleted file mode 100644
index 96139791..00000000
--- a/wpd/WpdServiceSampleDriver/FakeContent.cpp
+++ /dev/null
@@ -1,635 +0,0 @@
-#include "stdafx.h"
-#include "FakeContent.tmh"
-
-HRESULT FakeContent::InitializeContent(_Inout_ DWORD *pdwLastObjectID)
-{
- UNREFERENCED_PARAMETER(pdwLastObjectID);
- return S_OK;
-}
-
-HRESULT FakeContent::InitializeEnumerationContext(
- ACCESS_SCOPE Scope,
- _In_ WpdObjectEnumeratorContext* pEnumeratorContext)
-{
- HRESULT hr = S_OK;
- UNREFERENCED_PARAMETER(Scope);
-
- if (pEnumeratorContext == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- pEnumeratorContext->m_TotalChildren = static_cast<DWORD>(m_Children.GetCount());
- return hr;
-}
-
-HRESULT FakeContent::GetSupportedProperties(_In_ IPortableDeviceKeyCollection *pKeys)
-{
- HRESULT hr = S_OK;
-
- if(pKeys == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL collection parameter");
- return hr;
- }
-
- hr = pKeys->Add(WPD_OBJECT_ID);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_ID");
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_PERSISTENT_UNIQUE_ID);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_PERSISTENT_UNIQUE_ID");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_PARENT_ID);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_PARENT_ID");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_NAME);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_NAME");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_CONTENT_TYPE);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_CONTENT_TYPE");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_FORMAT);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_FORMAT");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_OBJECT_CAN_DELETE);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_CAN_DELETE");
- }
-
- return hr;
-}
-
-HRESULT FakeContent::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 = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_DELETE");
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_READ, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_READ");
- }
-
- if (hr == S_OK)
- {
- if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_WRITE");
- }
- else
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_WRITE");
- }
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, WPD_PROPERTY_ATTRIBUTE_FORM_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM");
- }
-
- return hr;
-}
-
-HRESULT FakeContent::GetValue(
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pStore)
-{
- HRESULT hr = S_OK;
- PropVariantWrapper pvValue;
-
- if(pStore == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
- {
- // Add WPD_OBJECT_ID
- pvValue = ObjectID;
- hr = pStore->SetValue(WPD_OBJECT_ID, &pvValue);
- CHECK_HR(hr, ("Failed to set WPD_OBJECT_ID"));
- }
- else if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
- {
- // Add WPD_OBJECT_PERSISTENT_UNIQUE_ID
- pvValue = this->PersistentUniqueID;
- hr = pStore->SetValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, &pvValue);
- CHECK_HR(hr, ("Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID"));
- }
- else if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
- {
- // Add WPD_OBJECT_PARENT_ID
- pvValue = ParentID;
- hr = pStore->SetValue(WPD_OBJECT_PARENT_ID, &pvValue);
- CHECK_HR(hr, ("Failed to set WPD_OBJECT_PARENT_ID"));
- }
- else if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- // Add WPD_OBJECT_NAME
- pvValue = Name;
- hr = pStore->SetValue(WPD_OBJECT_NAME, &pvValue);
- CHECK_HR(hr, ("Failed to set WPD_OBJECT_NAME"));
- }
- else if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
- {
- // Add 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_FORMAT))
- {
- // Add 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_CAN_DELETE))
- {
- // Add WPD_OBJECT_CAN_DELETE
- hr = pStore->SetBoolValue(WPD_OBJECT_CAN_DELETE, CanDelete);
- CHECK_HR(hr, ("Failed to set WPD_OBJECT_CAN_DELETE"));
- }
- 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 FakeContent::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
- {
- 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 FakeContent::CreatePropertiesOnlyObject(
- _In_ IPortableDeviceValues* pObjectProperties,
- _Out_ DWORD* pdwLastObjectID,
- _Outptr_result_nullonfailure_ FakeContent** ppNewObject)
-{
- UNREFERENCED_PARAMETER(pObjectProperties);
- UNREFERENCED_PARAMETER(pdwLastObjectID);
- *ppNewObject = NULL;
- return E_ACCESSDENIED;
-}
-
-HRESULT FakeContent::GetSupportedResources(
- _In_ IPortableDeviceKeyCollection* pResources)
-{
- UNREFERENCED_PARAMETER(pResources);
- return S_OK;
-}
-
-HRESULT FakeContent::GetResourceAttributes(
- _In_ REFPROPERTYKEY Resource,
- _In_ IPortableDeviceValues* pAttributes)
-{
- UNREFERENCED_PARAMETER(Resource);
- UNREFERENCED_PARAMETER(pAttributes);
- return S_OK;
-}
-
-HRESULT FakeContent::OpenResource(
- _In_ REFPROPERTYKEY Resource,
- const DWORD dwMode,
- _In_ WpdObjectResourceContext* pResourceContext)
-{
- UNREFERENCED_PARAMETER(Resource);
- UNREFERENCED_PARAMETER(dwMode);
- UNREFERENCED_PARAMETER(pResourceContext);
- return S_OK;
-}
-
-HRESULT FakeContent::ReadResourceData(
- _In_ WpdObjectResourceContext* pResourceContext,
- _Out_writes_to_(dwNumBytesToRead, *pdwNumBytesRead) BYTE* pBuffer,
- const DWORD dwNumBytesToRead,
- _Out_ DWORD* pdwNumBytesRead)
-{
- UNREFERENCED_PARAMETER(pResourceContext);
- UNREFERENCED_PARAMETER(pBuffer);
- UNREFERENCED_PARAMETER(dwNumBytesToRead);
- *pdwNumBytesRead = 0;
- return S_OK;
-}
-
-bool FakeContent::CanAccess(
- ACCESS_SCOPE Scope)
-{
- return ((Scope & RequiredScope) == RequiredScope);
-}
-
-HRESULT FakeContent::GetAllValues(
- _In_ IPortableDeviceValues* pStore)
-{
- HRESULT hr = S_OK;
- DWORD cKeys = 0;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- if(pStore == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // CoCreate a collection to store the property keys we are going to use
- // to request the property values of.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- if (hr == S_OK)
- {
- hr = GetSupportedProperties(pKeys);
- CHECK_HR(hr, "Failed to get supported properties");
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->GetCount(&cKeys);
- CHECK_HR(hr, "Failed to get supported properties");
- }
-
- if (hr == S_OK)
- {
- for (DWORD i=0; i<cKeys; i++)
- {
- PROPERTYKEY Key = {0};
- hr = pKeys->GetAt(i, &Key);
- CHECK_HR(hr, "Failed to get supported property at index %d", i);
- if (hr == S_OK)
- {
- hr = GetValue(Key, pStore);
- CHECK_HR(hr, "Failed to get property value at index %d", i);
- }
- }
- }
-
- return hr;
-}
-
-HRESULT FakeContent::WriteValues(
- _In_ IPortableDeviceValues* pValues,
- _In_ IPortableDeviceValues* pResults,
- _Out_ bool* pbObjectChanged)
-{
- HRESULT hr = S_OK;
- DWORD cValues = 0;
- bool hasFailedWrite = false;
-
- if (pValues == NULL || pResults == NULL || pbObjectChanged == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = pValues->GetCount(&cValues);
- CHECK_HR(hr, "Failed to get total number of values");
-
- (*pbObjectChanged) = false;
-
- for (DWORD dwIndex = 0; dwIndex < cValues; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- PROPVARIANT Value;
- PropVariantInit(&Value);
-
- hr = pValues->GetAt(dwIndex, &Key, &Value);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d", dwIndex);
-
- if (hr == S_OK)
- {
- HRESULT hrWrite = WriteValue(Key, Value);
- if (FAILED(hrWrite))
- {
- CHECK_HR(hrWrite, "Failed to write value at index %d", dwIndex);
- hasFailedWrite = true;
- }
- else
- {
- (*pbObjectChanged) = true;
- }
-
- hr = pResults->SetErrorValue(Key, hrWrite);
- CHECK_HR(hr, "Failed to set error result value at index %d", dwIndex);
- }
-
- PropVariantClear(&Value);
- }
-
- // Since we have set failures for the property set operations we must let the application
- // know by returning S_FALSE. This will instruct the application to look at the
- // property set operation results for failure values.
- if ((hr == S_OK) && hasFailedWrite)
- {
- hr = S_FALSE;
- }
-
- return hr;
-}
-
-_Success_(return)
-bool FakeContent::FindNext(
- ACCESS_SCOPE Scope,
- const DWORD dwIndex,
- _Outptr_result_nullonfailure_ FakeContent** ppChild)
-{
- HRESULT hr = S_OK;
- bool bFound = false;
-
- if (ppChild == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return false;
- }
-
- *ppChild = NULL;
-
- if (dwIndex < m_Children.GetCount())
- {
- if (m_Children[dwIndex] && (m_Children[dwIndex]->CanAccess(Scope)))
- {
- *ppChild = m_Children[dwIndex];
- bFound = true;
- }
- }
-
- return bFound;
-}
-
-HRESULT FakeContent::GetContent(
- ACCESS_SCOPE Scope,
- _In_ LPCWSTR wszObjectID,
- _Outptr_result_nullonfailure_ FakeContent** ppContent)
-{
- HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
- *ppContent = NULL;
-
- if (CanAccess(Scope))
- {
- if (ObjectID.CompareNoCase(wszObjectID) == 0)
- {
- hr = S_OK;
- *ppContent = this;
- }
- else
- {
- DWORD dwIndex = 0;
- FakeContent* pChild = NULL;
- while (FindNext(Scope, dwIndex, &pChild))
- {
- hr = pChild->GetContent(Scope, wszObjectID, ppContent);
- if (hr == S_OK || hr == E_ACCESSDENIED)
- {
- break;
- }
- dwIndex++;
- }
- }
- }
- else
- {
- hr = E_ACCESSDENIED;
- CHECK_HR(hr, "GetContent: '%ws' was found but falls outside scope", wszObjectID);
- }
-
- return hr;
-}
-
-HRESULT FakeContent::GetObjectIDsByFormat(
- ACCESS_SCOPE Scope,
- _In_ REFGUID guidFormat,
- const DWORD dwDepth,
- _In_ IPortableDevicePropVariantCollection* pObjectIDs)
-{
- HRESULT hr = S_OK;
-
- if (CanAccess(Scope))
- {
- DWORD dwIndex = 0;
- FakeContent* pChild = NULL;
-
- if (Format == guidFormat || guidFormat == WPD_OBJECT_FORMAT_ALL)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- pv.vt = VT_LPWSTR;
- pv.pwszVal = ObjectID.GetBuffer();
- hr = pObjectIDs->Add(&pv);
- CHECK_HR(hr, "Failed to add '%ws' to the list of object IDs by format", ObjectID);
- }
-
- if (dwDepth > 0)
- {
- while ((hr == S_OK) && (FindNext(Scope, dwIndex, &pChild)))
- {
- hr = pChild->GetObjectIDsByFormat(Scope, guidFormat, dwDepth-1, pObjectIDs);
- CHECK_HR(hr, "Failed to get object IDs by format for child at index %d", dwIndex);
- dwIndex++;
- }
- }
- }
- else
- {
- hr = E_ACCESSDENIED;
- }
-
- return hr;
-}
-
-HRESULT FakeContent::GetObjectIDByPersistentID(
- ACCESS_SCOPE Scope,
- _In_ LPCWSTR wszPersistentID,
- _In_ IPortableDevicePropVariantCollection* pObjectIDs)
-{
- HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
-
- if (CanAccess(Scope))
- {
- if (PersistentUniqueID.CompareNoCase(wszPersistentID) == 0)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- pv.vt = VT_LPWSTR;
- pv.pwszVal = ObjectID.GetBuffer();
-
- hr = pObjectIDs->Add(&pv);
- CHECK_HR(hr, "Failed to add '%ws' to the list of object IDs", ObjectID);
- }
- else
- {
- DWORD dwIndex = 0;
- FakeContent* pChild = NULL;
- while (FindNext(Scope, dwIndex, &pChild))
- {
- hr = pChild->GetObjectIDByPersistentID(Scope, wszPersistentID, pObjectIDs);
- if (hr == S_OK || hr == E_ACCESSDENIED)
- {
- // Found the object or was denied access
- break;
- }
- else if (hr != HRESULT_FROM_WIN32(ERROR_NOT_FOUND))
- {
- CHECK_HR(hr, "Failed to get object ID for child at index %d", dwIndex);
- }
- dwIndex++;
- }
- }
- }
- else
- {
- hr = E_ACCESSDENIED;
- }
-
- return hr;
-}
-
-HRESULT FakeContent::MarkForDelete(
- const DWORD dwOptions)
-{
- HRESULT hr = S_OK;
-
- if (CanDelete == false)
- {
- hr = E_ACCESSDENIED;
- CHECK_HR(hr, "Object '%ws' is not deletable", ObjectID);
- return hr;
- }
-
- if (dwOptions == PORTABLE_DEVICE_DELETE_NO_RECURSION)
- {
- if (m_Children.GetCount() > 0)
- {
- hr = HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY);
- }
- }
- else if (dwOptions == PORTABLE_DEVICE_DELETE_WITH_RECURSION)
- {
- // Mark children for delete
- for (size_t Index = 0; Index < m_Children.GetCount(); Index++)
- {
- if (m_Children[Index])
- {
- hr = m_Children[Index]->MarkForDelete(dwOptions);
- CHECK_HR(hr, "Failed to mark child '%ws' for deletion", m_Children[Index]->ObjectID);
- }
- }
- }
-
- if (hr == S_OK)
- {
- // All successful. Mark self for delete
- MarkedForDeletion = true;
- }
-
- return hr;
-}
-
-HRESULT FakeContent::RemoveObjectsMarkedForDeletion(
- ACCESS_SCOPE Scope)
-{
- HRESULT hr = S_OK;
- DWORD dwIndex = 0;
- FakeContent* pChild = NULL;
-
- while (FindNext(Scope, dwIndex, &pChild))
- {
- if (pChild != NULL)
- {
- hr = pChild->RemoveObjectsMarkedForDeletion(Scope);
- CHECK_HR(hr, "Failed to remove children marked for deletion for object '%ws'", pChild->ObjectID);
-
- if ((hr == S_OK) && (pChild->MarkedForDeletion == true))
- {
- m_Children.RemoveAt(dwIndex);
- delete pChild;
- pChild = NULL;
- }
- }
- dwIndex++;
- }
-
- m_Children.FreeExtra();
-
- return hr;
-}