summaryrefslogtreecommitdiff
path: root/wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2024-05-06 16:21:31 -0700
committerGitHub <[email protected]>2024-05-06 16:21:31 -0700
commita74a241c664c4e1d7c0838287b34076c19d9858a (patch)
tree6ff7562612967b122acf8acf8a69c4dcfd5905db /wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp
parentdef8e8e34ed2b7b1deb2fc9112ac4255f1a0f2ba (diff)
parent15477ce52bbb6b42ca591ecdfb484cac089f89ab (diff)
Merge develop changes prior to upcoming WDK release (May 2024)
Diffstat (limited to 'wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp')
-rw-r--r--wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp297
1 files changed, 0 insertions, 297 deletions
diff --git a/wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp b/wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp
deleted file mode 100644
index 932735ae..00000000
--- a/wpd/WpdServiceSampleDriver/WpdObjectManagement.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-#include "stdafx.h"
-
-#include "WpdObjectManagement.tmh"
-
-WpdObjectManagement::WpdObjectManagement() : m_pDevice(NULL)
-{
-
-}
-
-WpdObjectManagement::~WpdObjectManagement()
-{
-
-}
-
-HRESULT WpdObjectManagement::Initialize(_In_ FakeDevice* pDevice)
-{
- if (pDevice == NULL)
- {
- return E_POINTER;
- }
- m_pDevice = pDevice;
- return S_OK;
-}
-
-HRESULT WpdObjectManagement::DispatchWpdMessage(
- _In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
-
- HRESULT hr = S_OK;
-
- if (hr == S_OK)
- {
- if (Command.fmtid != WPD_CATEGORY_OBJECT_MANAGEMENT)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid));
- }
- }
-
- if (hr == S_OK)
- {
- if (Command.pid == WPD_COMMAND_OBJECT_MANAGEMENT_CREATE_OBJECT_WITH_PROPERTIES_ONLY.pid)
- {
- hr = OnCreateObjectWithPropertiesOnly(pParams, pResults);
- CHECK_HR(hr, "Failed to create object");
- }
- else if (Command.pid == WPD_COMMAND_OBJECT_MANAGEMENT_DELETE_OBJECTS.pid)
- {
- hr = OnDelete(pParams, pResults);
- CHECK_HR(hr, "Failed to delete object");
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "This object does not support this command id %d", Command.pid);
- }
- }
-
- return hr;
-}
-
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_MANAGEMENT_CREATE_OBJECT_WITH_PROPERTIES_ONLY
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_MANAGEMENT_CREATION_PROPERTIES: Contains an IPortableDeviceValues, describing
- * properties of the new object. At the very least, it will contain:
- * - WPD_OBJECT_NAME: The object name.
- * - WPD_PARENT_ID: Identifies the parent object. The object should be inserted as a child of
- * this parent (e.g. this would be the target directory in a file system based device).
- *
- * The driver should:
- * - Create the object, and return its ID in WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_ID.
- */
-HRESULT WpdObjectManagement::OnCreateObjectWithPropertiesOnly(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR pszObjectID = NULL;
-
- CComPtr<IPortableDeviceValues> pObjectProperties;
- CComPtr<IPortableDeviceValues> pEventParams;
-
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pEventParams);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
-
- // Get the Object Properties
- if (SUCCEEDED(hr))
- {
- hr = pParams->GetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_MANAGEMENT_CREATION_PROPERTIES, &pObjectProperties);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_MANAGEMENT_CREATION_PROPERTIES");
- }
-
- // Save the object to the device here.
- if (SUCCEEDED(hr))
- {
- ACCESS_SCOPE Scope = m_pDevice->GetAccessScope(pParams);
- hr = m_pDevice->CreatePropertiesOnlyObject(Scope, pObjectProperties, pEventParams, &pszObjectID);
- CHECK_HR(hr, "Failed to save new (properties only) object to device");
- }
-
- if (SUCCEEDED(hr))
- {
- // Create is successful, so we post an event.
- // This is best effort, so errors are ignored
- HRESULT hrEvent = PostWpdEvent(pParams, pEventParams);
- CHECK_HR(hrEvent, "Failed post event for new object [%ws] (errors ignored)", pszObjectID);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = pResults->SetStringValue(WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_ID, pszObjectID);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_ID");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(pszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_MANAGEMENT_DELETE_OBJECTS
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS: the ObjectIDs, indicating which objects to delete. These may
- * contain children.
- * - WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_OPTIONS: Flag parameter indicating delete options. Must be one
- * of the following:
- * - PORTABLE_DEVICE_DELETE_NO_RECURSION - Deletes the
- * object only. This should fail if children exist.
- * - PORTABLE_DEVICE_DELETE_WITH_RECURSION - Deletes this
- * object and all children.
- *
- * The driver should:
- * - If the flag is PORTABLE_DEVICE_DELETE_NO_RECURSION the driver should delete the
- * specified object only. If the object still has children the driver should not delete
- * the object and instead return HRESULT_FROM_WIN32(ERROR_INVALID_OPERATION).
- * - If the flag is PORTABLE_DEVICE_DELETE_WITH_RECURSION the driver should delete the
- * specified object and all of its children.
- * - Fill out the operation results in WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_RESULTS. It contains an IPortableDevicePropVariantCollection of
- * VT_ERROR values indicating the success or failure of the operation for that element.
- * Order is implicit, i.e. the first element of WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_RESULTS corresponds to the first element of WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS and so on.
- * - The driver should return:
- * - S_OK if all objects were deleted successfully.
- * - S_FALSE if any object delete failed.
- * - An error return indicates that the driver did not delete any objects, and
- * WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_RESULTS is ignored.
- */
-HRESULT WpdObjectManagement::OnDelete(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
-
- HRESULT hr = S_OK;
- DWORD dwOptions = PORTABLE_DEVICE_DELETE_NO_RECURSION;
- BOOL bDeleteFailed = FALSE;
- VARTYPE vt = VT_EMPTY;
-
- CComPtr<IPortableDevicePropVariantCollection> pObjectIDs;
- CComPtr<IPortableDevicePropVariantCollection> pDeleteResults;
- CComPtr<IPortableDeviceValues> pEventParams;
-
- if (hr == S_OK)
- {
- hr = pParams->GetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS, &pObjectIDs);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS");
- }
-
- // Ensure that this is a collection of VT_LPWSTR
- if (hr == S_OK)
- {
- hr = pObjectIDs->GetType(&vt);
- CHECK_HR(hr, "Failed to get the VARTYP of WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS");
- if (hr == S_OK)
- {
- if (vt != VT_LPWSTR)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "WPD_PROPERTY_OBJECT_MANAGEMENT_OBJECT_IDS is not a collection of VT_LPWSTR");
- }
- }
- }
-
- if (hr == S_OK)
- {
- hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_OPTIONS, &dwOptions);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_OPTIONS");
- }
-
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pDeleteResults);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDevicePropVariantCollection");
- }
-
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pEventParams);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
- }
-
- if (hr == S_OK)
- {
- DWORD cObjects = 0;
- // Loop through the object list and attempt to delete
- hr = pObjectIDs->GetCount(&cObjects);
- CHECK_HR(hr, "Failed to get number of objects to delete");
-
- if (hr == S_OK)
- {
- ACCESS_SCOPE Scope = m_pDevice->GetAccessScope(pParams);
-
- for(DWORD dwIndex = 0; dwIndex < cObjects; dwIndex++)
- {
- HRESULT hrTemp = S_OK;
- PROPVARIANT pv = {0};
-
- PropVariantInit(&pv);
- // Get the next Object to delete
- hr = pObjectIDs->GetAt(dwIndex, &pv);
- CHECK_HR(hr, "Failed to get next object id at index %d", dwIndex);
- if (hr == S_OK)
- {
- HRESULT hrDelete = S_OK;
- PROPVARIANT pvResult = {0};
-
- PropVariantInit(&pvResult);
-
- hrDelete = m_pDevice->DeleteObject(Scope, dwOptions, pv.pwszVal, pEventParams);
- CHECK_HR(hrDelete, "Failed to delete object [%ws]", pv.pwszVal);
-
- if(FAILED(hrDelete))
- {
- bDeleteFailed = TRUE;
- }
- else
- {
- // Delete is successful, so we post an event.
- // This is best effort, so errors are ignored
- HRESULT hrEvent = PostWpdEvent(pParams, pEventParams);
- CHECK_HR(hrEvent, "Failed post event for deleted object [%ws] (errors ignored)", pv.pwszVal);
- }
-
- // Clear event parameters for reuse
- pEventParams->Clear();
-
- // Save this result
- pvResult.vt = VT_ERROR;
- pvResult.scode = hrDelete;
- hrTemp = pDeleteResults->Add(&pvResult);
- PropVariantClear(&pvResult);
- CHECK_HR(hrTemp, "Failed to add result for [%ws] to list of results", pv.pwszVal);
-
- PropVariantClear(&pv);
- }
- else
- {
- break;
- }
- }
- }
- }
-
- // Set the results
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_RESULTS, pDeleteResults);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_MANAGEMENT_DELETE_RESULTS");
- }
-
- // If an object failed to delete, make sure we return S_FALSE
- if ((hr == S_OK) && (bDeleteFailed))
- {
- hr = S_FALSE;
- }
-
- return hr;
-}