diff options
| author | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
|---|---|---|
| committer | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
| commit | 97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch) | |
| tree | 46f3701832d70b420eb0fc0eb93261f9da45db3f /wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h | |
| parent | ef1905bf1e8825bb31120dfb27e0daf3154d859a (diff) | |
Initial publish
Diffstat (limited to 'wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h')
| -rw-r--r-- | wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h b/wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h new file mode 100644 index 00000000..884d078b --- /dev/null +++ b/wpd/WpdWudfSampleDriver/DeviceObjectFakeContent.h @@ -0,0 +1,410 @@ +#include "DeviceObjectFakeContent.h.tmh" + +#define DEVICE_PROTOCOL_VALUE L"WPD Sample Driver Protocol ver 1.00" +#define DEVICE_FIRMWARE_VERSION_VALUE L"1.0.0.0" +#define DEVICE_MODEL_VALUE L"Sample Device 1000" +#define DEVICE_MANUFACTURER_VALUE L"Windows Portable Devices Group" +#define DEVICE_SERIAL_NUMBER_VALUE L"12309342465230-12390123432111" +#define DEVICE_POWER_LEVEL_VALUE 100 +#define DEVICE_FRIENDLY_NAME L"My Sample Device 1000" + +__declspec(selectany) BYTE g_NetworkIdentifier[] = { 0x01, 0x02, 0x03, 0xff, 0xff, 0x04, 0x05, 0x06 }; + +class DeviceObjectFakeContent : public FakeContent +{ +public: + DeviceObjectFakeContent( + _In_ IPortableDeviceClassExtension* pPortableDeviceClassExtension) : FakeContent() + { + FriendlyName = DEVICE_FRIENDLY_NAME; + SyncPartner = L""; + m_pPortableDeviceClassExtension = pPortableDeviceClassExtension; + } + + DeviceObjectFakeContent(const FakeContent& src) + { + *this = src; + } + + virtual ~DeviceObjectFakeContent() + { + } + + virtual HRESULT GetSupportedProperties(_COM_Outptr_ IPortableDeviceKeyCollection** ppKeys) + { + HRESULT hr = S_OK; + + if(ppKeys == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL collection parameter"); + return hr; + } + + if (SUCCEEDED(hr)) + { + hr = AddSupportedProperties(WPD_FUNCTIONAL_CATEGORY_DEVICE, ppKeys); + CHECK_HR(hr, "Failed to add additional properties for DeviceObjectFakeContent"); + } + return hr; + } + + virtual HRESULT GetAllValues( + _In_ IPortableDeviceValues* pValues) + { + HRESULT hr = S_OK; + HRESULT hrSetValue = S_OK; + + if(pValues == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL parameter"); + return hr; + } + + // Call the base class to fill in the standard properties + hr = FakeContent::GetAllValues(pValues); + if (FAILED(hr)) + { + CHECK_HR(hr, "Failed to get basic property set"); + return hr; + } + + // Add WPD_DEVICE_SUPPORTS_NON_CONSUMABLE + hrSetValue = pValues->SetBoolValue(WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, TRUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_SUPPORTS_NON_CONSUMABLE"); + return hrSetValue; + } + + // Add WPD_OBJECT_CONTENT_TYPE + hrSetValue = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_OBJECT_CONTENT_TYPE"); + return hrSetValue; + } + + // Add WPD_FUNCTIONAL_OBJECT_CATEGORY + hrSetValue = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_DEVICE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY"); + return hrSetValue; + } + + // Add WPD_DEVICE_FIRMWARE_VERSION + hrSetValue = pValues->SetStringValue(WPD_DEVICE_FIRMWARE_VERSION, DEVICE_FIRMWARE_VERSION_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_FIRMWARE_VERSION"); + return hrSetValue; + } + + // Add WPD_DEVICE_POWER_LEVEL + hrSetValue = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_LEVEL, DEVICE_POWER_LEVEL_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_POWER_LEVEL"); + return hrSetValue; + } + + // Add WPD_DEVICE_POWER_SOURCE + hrSetValue = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_SOURCE, WPD_POWER_SOURCE_EXTERNAL); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_POWER_SOURCE"); + return hrSetValue; + } + + // Add WPD_DEVICE_PROTOCOL + hrSetValue = pValues->SetStringValue(WPD_DEVICE_PROTOCOL, DEVICE_PROTOCOL_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_PROTOCOL"); + return hrSetValue; + } + + // Add WPD_DEVICE_MODEL + hrSetValue = pValues->SetStringValue(WPD_DEVICE_MODEL, DEVICE_MODEL_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_MODEL"); + return hrSetValue; + } + + // Add WPD_DEVICE_FRIENDLY_NAME + hrSetValue = pValues->SetStringValue(WPD_DEVICE_FRIENDLY_NAME, FriendlyName); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_FRIENDLY_NAME"); + return hrSetValue; + } + + // Add WPD_DEVICE_SERIAL_NUMBER + hrSetValue = pValues->SetStringValue(WPD_DEVICE_SERIAL_NUMBER, DEVICE_SERIAL_NUMBER_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_SERIAL_NUMBER"); + return hrSetValue; + } + + // Add WPD_DEVICE_MANUFACTURER + hrSetValue = pValues->SetStringValue(WPD_DEVICE_MANUFACTURER, DEVICE_MANUFACTURER_VALUE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_MANUFACTURER"); + return hrSetValue; + } + + // Add WPD_DEVICE_TYPE + hrSetValue = pValues->SetUnsignedIntegerValue(WPD_DEVICE_TYPE, WPD_DEVICE_TYPE_PHONE); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_TYPE"); + return hrSetValue; + } + + // Add WPD_DEVICE_SYNC_PARTNER + hrSetValue = pValues->SetStringValue(WPD_DEVICE_SYNC_PARTNER, SyncPartner); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_SYNC_PARTNER"); + return hrSetValue; + } + + // Add WPD_DEVICE_NETWORK_IDENTIFIER + if (sizeof(ULONGLONG) == sizeof(g_NetworkIdentifier)) + { + ULONGLONG ullTemp; + + CopyMemory(&ullTemp, g_NetworkIdentifier, sizeof(ULONGLONG)); + hrSetValue = pValues->SetUnsignedLargeIntegerValue(WPD_DEVICE_NETWORK_IDENTIFIER, ullTemp); + if (hrSetValue != S_OK) + { + CHECK_HR(hrSetValue, "Failed to set WPD_DEVICE_NETWORK_IDENTIFIER"); + return hrSetValue; + } + } + else + { + hr = E_UNEXPECTED; // This is a coding error + CHECK_HR(hr, "Failed to set WPD_DEVICE_NETWORK_IDENTIFIER"); + } + + return hr; + } + + virtual HRESULT WriteValue( + _In_ REFPROPERTYKEY key, + _In_ REFPROPVARIANT Value) + { + HRESULT hr = S_OK; + PropVariantWrapper pvValue; + + if(IsEqualPropertyKey(key, WPD_DEVICE_FRIENDLY_NAME)) + { + if(Value.vt == VT_LPWSTR) + { + if (Value.pwszVal != NULL && Value.pwszVal[0] != L'\0') + { + FriendlyName = Value.pwszVal; + // Let the Class Extension know about the change in Friendly Name so it can update the registry value of the same name + HRESULT hrTemp = UpdateDeviceFriendlyName(m_pPortableDeviceClassExtension, Value.pwszVal); + CHECK_HR(hrTemp, "Failed to update device friendly name"); + } + else + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Failed to set WPD_DEVICE_FRIENDLY_NAME because value was an empty string"); + } + } + else + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Failed to set WPD_DEVICE_FRIENDLY_NAME because type was not VT_LPWSTR"); + } + } + else if(IsEqualPropertyKey(key, WPD_DEVICE_SYNC_PARTNER)) + { + if (Value.vt == VT_LPWSTR) + { + SyncPartner = Value.pwszVal; + } + else + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Failed to set WPD_DEVICE_SYNC_PARTNER because type was not VT_LPWSTR"); + } + } + else + { + // Let the base class take care of any other property writes + hr = FakeContent::WriteValue(key, Value); + // No need to log the error since the base class already does it. + } + + return hr; + } + + virtual HRESULT GetSupportedResources(_COM_Outptr_ IPortableDeviceKeyCollection** ppKeys) + { + HRESULT hr = S_OK; + CComPtr<IPortableDeviceKeyCollection> pKeys; + + if(ppKeys == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL collection parameter"); + return hr; + } + + *ppKeys = NULL; + + if (SUCCEEDED(hr)) + { + // Call the base class to fill in the standard resources if any + hr = FakeContent::GetSupportedResources(&pKeys); + CHECK_HR(hr, "Failed to get basic supported resources"); + } + + if (SUCCEEDED(hr)) + { + // Add the icon resource + hr = pKeys->Add(WPD_RESOURCE_ICON); + CHECK_HR(hr, "Failed to add WPD_RESOURCE_ICON to supported resource list"); + } + + if (SUCCEEDED(hr)) + { + hr = pKeys->QueryInterface(IID_IPortableDeviceKeyCollection, (VOID**) ppKeys); + CHECK_HR(hr, "Failed to QI for IPortableDeviceKeyCollection on IPortableDeviceKeyCollection"); + } + + return hr; + } + + virtual HRESULT GetResourceAttributes( + _In_ REFPROPERTYKEY Key, + _COM_Outptr_ IPortableDeviceValues** ppAttributes) + { + UNREFERENCED_PARAMETER(Key); + + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pAttributes; + + if(ppAttributes == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL attributes parameter"); + return hr; + } + + *ppAttributes = NULL; + + if (SUCCEEDED(hr)) + { + // Fill in the common resource attributes + hr = GetCommonResourceAttributes(&pAttributes); + CHECK_HR(hr, "Failed to get common resource attributes set"); + } + + if (SUCCEEDED(hr)) + { + if (IsEqualPropertyKey(Key, WPD_RESOURCE_ICON)) + { + // Override the size attribute for this resource. + hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE, GetResourceSize(IDR_WPD_SAMPLEDRIVER_DEVICE_ICON)); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE"); + + // Override the format attribute for this resource. + hr = pAttributes->SetGuidValue(WPD_RESOURCE_ATTRIBUTE_FORMAT, WPD_OBJECT_FORMAT_ICON); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_FORMAT"); + } + } + + // Return the resource attributes + if (SUCCEEDED(hr)) + { + hr = pAttributes->QueryInterface(IID_IPortableDeviceValues, (VOID**) ppAttributes); + CHECK_HR(hr, "Failed to QI for IPortableDeviceValues on Wpd IPortableDeviceValues"); + } + return hr; + } + + // This sample driver uses a embedded image file resource as its data. + virtual HRESULT ReadData( + _In_ REFPROPERTYKEY ResourceKey, + DWORD dwStartByte, + _Out_writes_to_(dwNumBytesToRead, *pdwNumBytesRead) BYTE* pBuffer, + DWORD dwNumBytesToRead, + _Out_ DWORD* pdwNumBytesRead) + { + HRESULT hr = S_OK; + DWORD dwBytesToTransfer = 0; + DWORD dwObjectDataSize = 0; + PBYTE pResource = NULL; + + if((pBuffer == NULL) || + (pdwNumBytesRead == NULL)) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL parameter"); + return hr; + } + + *pdwNumBytesRead = 0; + + if (IsEqualPropertyKey(ResourceKey, WPD_RESOURCE_DEFAULT)) + { + return FakeContent::ReadData(ResourceKey, dwStartByte, pBuffer, dwNumBytesToRead, pdwNumBytesRead); + } + + pResource = GetResourceData(IDR_WPD_SAMPLEDRIVER_DEVICE_ICON); + dwObjectDataSize = GetResourceSize(IDR_WPD_SAMPLEDRIVER_DEVICE_ICON); + + if (pResource == NULL) + { + hr = E_UNEXPECTED; + CHECK_HR(hr, "Failed to get resource representing the device icon data"); + } + + // Calculate how many bytes to transfer + if (hr == S_OK) + { + if (dwStartByte < dwObjectDataSize) + { + dwBytesToTransfer = (dwObjectDataSize - dwStartByte); + if (dwBytesToTransfer > dwNumBytesToRead) + { + dwBytesToTransfer = dwNumBytesToRead; + } + } + } + + // Copy the embedded image file data. + if ((hr == S_OK) && (dwBytesToTransfer > 0)) + { + memcpy(pBuffer, pResource + dwStartByte, dwBytesToTransfer); + } + + if (hr == S_OK) + { + *pdwNumBytesRead = dwBytesToTransfer; + } + + return hr; + } + + virtual GUID GetObjectFormat() + { + return FakeDeviceContent_Format; + } + +private: + CAtlStringW FriendlyName; + CAtlStringW SyncPartner; + CComPtr<IPortableDeviceClassExtension> m_pPortableDeviceClassExtension; +}; + |
