diff options
| author | Adonais Romero González <[email protected]> | 2024-05-06 16:21:31 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-05-06 16:21:31 -0700 |
| commit | a74a241c664c4e1d7c0838287b34076c19d9858a (patch) | |
| tree | 6ff7562612967b122acf8acf8a69c4dcfd5905db /wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp | |
| parent | def8e8e34ed2b7b1deb2fc9112ac4255f1a0f2ba (diff) | |
| parent | 15477ce52bbb6b42ca591ecdfb484cac089f89ab (diff) | |
Merge develop changes prior to upcoming WDK release (May 2024)
Diffstat (limited to 'wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp')
| -rw-r--r-- | wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp | 393 |
1 files changed, 0 insertions, 393 deletions
diff --git a/wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp b/wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp deleted file mode 100644 index adb9d3b3..00000000 --- a/wpd/WpdServiceSampleDriver/WpdBaseDriver.cpp +++ /dev/null @@ -1,393 +0,0 @@ -#include "stdafx.h" - -#include "WpdBaseDriver.tmh" - -WpdBaseDriver::WpdBaseDriver() : - m_cRef(1) -{ -} - -WpdBaseDriver::~WpdBaseDriver() -{ - -} - -ULONG __stdcall WpdBaseDriver::AddRef() -{ - InterlockedIncrement((long*) &m_cRef); - return m_cRef; -} - -_At_(this, __drv_freesMem(Mem)) -ULONG __stdcall WpdBaseDriver::Release() -{ - ULONG ulRefCount = m_cRef - 1; - - if (InterlockedDecrement((long*) &m_cRef) == 0) - { - delete this; - return 0; - } - return ulRefCount; -} - -HRESULT __stdcall WpdBaseDriver::QueryInterface( - REFIID riid, - void** ppv) -{ - HRESULT hr = S_OK; - - if(riid == IID_IUnknown) - { - *ppv = static_cast<IUnknown*>(this); - AddRef(); - } - else - { - *ppv = NULL; - hr = E_NOINTERFACE; - } - return hr; -} - -/** - * This method is called to initialize the driver object. - * This is where the driver would set up it's I/O libraries - * and so on. - */ -HRESULT WpdBaseDriver::Initialize() -{ - HRESULT hr = m_Device.InitializeContent(); - CHECK_HR(hr, ("Failed to initialize content")); - - if (hr == S_OK) - { - hr = m_Service.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdService")); - } - - if (hr == S_OK) - { - hr = m_ObjectEnum.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdObjectEnum")); - } - - if (hr == S_OK) - { - m_Capabilities.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdCapabilities")); - } - - if (hr == S_OK) - { - m_ObjectManagement.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdObjectManagement")); - } - - if (hr == S_OK) - { - m_ObjectProperties.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdObjectProperties")); - } - - if (hr == S_OK) - { - m_ObjectResources.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdObjectResources")); - } - - if (hr == S_OK) - { - m_ObjectPropertiesBulk.Initialize(&m_Device); - CHECK_HR(hr, ("Failed to initialize WpdObjectPropertiesBulk")); - } - - return hr; -} - -/** - * This method is called to uninitialize the driver object. - * In a real driver, this is where the driver would clean up - * any resources held by this driver. - */ -VOID WpdBaseDriver::Uninitialize() -{ -} - -HRESULT WpdBaseDriver::DispatchWpdMessage(_In_ IPortableDeviceValues* pParams, - _In_ IPortableDeviceValues* pResults) -{ - - HRESULT hr = S_OK; - GUID guidCommandCategory = {0}; - DWORD dwCommandID = 0; - PROPERTYKEY CommandKey = WPD_PROPERTY_NULL; - - if (hr == S_OK) - { - hr = pParams->GetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY, &guidCommandCategory); - CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_CATEGORY from input parameters"); - } - - if (hr == S_OK) - { - hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID, &dwCommandID); - CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_ID from input parameters"); - } - - // If WPD_PROPERTY_COMMON_COMMAND_CATEGORY or WPD_PROPERTY_COMMON_COMMAND_ID could not be extracted - // properly then we should return E_INVALIDARG to the client. - if (FAILED(hr)) - { - hr = E_INVALIDARG; - CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_CATEGORY or WPD_PROPERTY_COMMON_COMMAND_ID from input parameters"); - } - - if (hr == S_OK) - { - CommandKey.fmtid = guidCommandCategory; - CommandKey.pid = dwCommandID; - - if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_ENUMERATION) - { - hr = m_ObjectEnum.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_PROPERTIES) - { - hr = m_ObjectProperties.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_RESOURCES) - { - hr = m_ObjectResources.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if (CommandKey.fmtid == WPD_CATEGORY_CAPABILITIES) - { - hr = m_Capabilities.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if(CommandKey.fmtid == WPD_CATEGORY_OBJECT_MANAGEMENT) - { - hr = m_ObjectManagement.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if(CommandKey.fmtid == WPD_CATEGORY_OBJECT_PROPERTIES_BULK) - { - hr = m_ObjectPropertiesBulk.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else if (IsEqualPropertyKey(CommandKey, WPD_COMMAND_COMMON_GET_OBJECT_IDS_FROM_PERSISTENT_UNIQUE_IDS)) - { - hr = OnGetObjectIDsFromPersistentUniqueIDs(pParams, pResults); - } - else if(IsEqualPropertyKey(CommandKey, WPD_COMMAND_COMMON_SAVE_CLIENT_INFORMATION)) - { - hr = OnSaveClientInfo(pParams, pResults); - } - else if (CommandKey.fmtid == WPD_CATEGORY_SERVICE_COMMON || - CommandKey.fmtid == WPD_CATEGORY_SERVICE_METHODS || - CommandKey.fmtid == WPD_CATEGORY_SERVICE_CAPABILITIES) - { - hr = m_Service.DispatchWpdMessage(CommandKey, pParams, pResults); - } - else - { - hr = E_NOTIMPL; - CHECK_HR(hr, "Unknown command %ws.%d received",CComBSTR(CommandKey.fmtid), CommandKey.pid); - } - } - - HRESULT hrTemp = pResults->SetErrorValue(WPD_PROPERTY_COMMON_HRESULT, hr); - CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_COMMON_HRESULT")); - - // Set to a success code, to indicate that the message was received. - // the return code for the actual command's results is stored in the - // WPD_PROPERTY_COMMON_HRESULT property. - hr = S_OK; - - return hr; -} - -/** - * This method is called when we receive a WPD_COMMAND_COMMON_GET_OBJECT_IDS_FROM_PERSISTENT_UNIQUE_IDS - * command. - * - * The parameters sent to us are: - * - WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS: Contains an IPortableDevicePropVariantCollection of VT_LPWSTR, - * indicating the PersistentUniqueIDs. - * - * The driver should: - * - Iterate through the PersistentUniqueIDs, and convert to a currently valid object id. - * This object ID list should be returned as an IPortableDevicePropVariantCollection of VT_LPWSTR - * in WPD_PROPERTY_COMMON_OBJECT_IDS. - * Order is implicit, i.e. the first element in the Persistent Unique ID list corresponds to the - * to the first element of the ObjectID list and so on. - * - * For those elements where an existing ObjectID could not be found (e.g. the - * object is no longer present on the device), the element will contain the - * empty string (L""). - */ -HRESULT WpdBaseDriver::OnGetObjectIDsFromPersistentUniqueIDs( - _In_ IPortableDeviceValues* pParams, - _In_ IPortableDeviceValues* pResults) -{ - - HRESULT hr = S_OK; - CComPtr<IPortableDevicePropVariantCollection> pPersistentIDs; - CComPtr<IPortableDevicePropVariantCollection> pObjectIDs; - - if((pParams == NULL) || - (pResults == NULL)) - { - hr = E_POINTER; - CHECK_HR(hr, "Cannot have NULL parameter"); - return hr; - } - - // Get the list of Persistent IDs - if (hr == S_OK) - { - hr = pParams->GetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS, &pPersistentIDs); - CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS"); - } - - // Create the collection to hold the ObjectIDs - if (hr == S_OK) - { - hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection, - NULL, - CLSCTX_INPROC_SERVER, - IID_IPortableDevicePropVariantCollection, - (VOID**) &pObjectIDs); - CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection"); - } - - - if (hr == S_OK) - { - ACCESS_SCOPE Scope = m_Device.GetAccessScope(pParams); - hr = m_Device.GetObjectIDsFromPersistentUniqueIDs(Scope, pPersistentIDs, pObjectIDs); - CHECK_HR(hr, "Failed to get object IDs from persistent IDs"); - } - - if (hr == S_OK) - { - hr = pResults->SetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_COMMON_OBJECT_IDS, pObjectIDs); - CHECK_HR(hr, "Failed to set WPD_PROPERTY_COMMON_OBJECT_IDS"); - } - - return hr; -} - - -/** - * This method is called when we receive a WPD_COMMAND_COMMON_SAVE_CLIENT_INFORMATION - * command. - * - * The parameters sent to us are: - * - WPD_PROPERTY_COMMON_CLIENT_INFORMATION: Contains information about the client, including version - * and optionally the client event cookie. - * - * The driver should: - * - Save the client information and return an LPWSTR context for this client. - * The client can be identified using this context for subsequent commands to the driver. - */ -HRESULT WpdBaseDriver::OnSaveClientInfo( - _In_ IPortableDeviceValues* pParams, - _In_ IPortableDeviceValues* pResults) -{ - - HRESULT hr = S_OK; - GUID guidContext = GUID_NULL; - CComBSTR bstrContext; - ClientContext* pContext = NULL; - ContextMap* pContextMap = NULL; - - CComPtr<IPortableDeviceValues> pClientInfo; - - if((pParams == NULL) || - (pResults == NULL)) - { - hr = E_POINTER; - CHECK_HR(hr, "Cannot have NULL parameter"); - return hr; - } - - hr = CoCreateGuid(&guidContext); - if (hr == S_OK) - { - bstrContext = guidContext; - if(bstrContext.Length() == 0) - { - hr = E_OUTOFMEMORY; - CHECK_HR(hr, "Failed to create BSTR from GUID"); - } - } - - // Get the client info - if (hr == S_OK) - { - hr = pParams->GetIPortableDeviceValuesValue(WPD_PROPERTY_COMMON_CLIENT_INFORMATION, &pClientInfo); - CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_CLIENT_INFORMATION"); - } - - // Get the context map which the driver stored in pParams for convenience - if (hr == S_OK) - { - hr = GetClientContextMap(pParams, &pContextMap); - CHECK_HR(hr, "Failed to get client context map"); - } - - // Create the new client info context we will save in the context map - if (hr == S_OK) - { - pContext = new ClientContext(); - if(pContext == NULL) - { - hr = E_OUTOFMEMORY; - CHECK_HR(hr, ("Could not allocate memory for client info context")); - } - } - - // Save the client info. Since these are optional, none of this is fatal if - // they don't exist. - if (hr == S_OK) - { - LPWSTR pszClientName = NULL; - LPWSTR pszEventCookie = NULL; - - pClientInfo->GetStringValue(WPD_CLIENT_NAME, &pszClientName); - if(pszClientName != NULL) - { - pContext->ClientName = pszClientName; - } - pClientInfo->GetUnsignedIntegerValue(WPD_CLIENT_MAJOR_VERSION, &(pContext->MajorVersion)); - pClientInfo->GetUnsignedIntegerValue(WPD_CLIENT_MINOR_VERSION, &(pContext->MinorVersion)); - pClientInfo->GetUnsignedIntegerValue(WPD_CLIENT_REVISION, &(pContext->Revision)); - - pClientInfo->GetStringValue(WPD_CLIENT_EVENT_COOKIE, &pszEventCookie); - if (pszEventCookie != NULL) - { - pContext->EventCookie = pszEventCookie; - } - - CoTaskMemFree(pszClientName); - CoTaskMemFree(pszEventCookie); - } - - if ((hr == S_OK) && - (pContext->ClientName.GetLength() > 0) && - (pContextMap != NULL)) - { - CAtlStringW strContext; - hr = pContextMap->Add(pContext, strContext); - CHECK_HR(hr, "Failed to add client info context to context map"); - - if (hr == S_OK) - { - hr = pResults->SetStringValue(WPD_PROPERTY_COMMON_CLIENT_INFORMATION_CONTEXT, strContext); - CHECK_HR(hr, "Failed to set WPD_PROPERTY_COMMON_CLIENT_INFORMATION_CONTEXT"); - } - } - - SAFE_RELEASE(pContext); - SAFE_RELEASE(pContextMap); - - return hr; -} |
