diff options
Diffstat (limited to 'wpd/WpdWudfSampleDriver/WpdNetworkConfig.cpp')
| -rw-r--r-- | wpd/WpdWudfSampleDriver/WpdNetworkConfig.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/wpd/WpdWudfSampleDriver/WpdNetworkConfig.cpp b/wpd/WpdWudfSampleDriver/WpdNetworkConfig.cpp new file mode 100644 index 00000000..c09f7c25 --- /dev/null +++ b/wpd/WpdWudfSampleDriver/WpdNetworkConfig.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" +#include "WpdNetworkConfig.tmh" + +WpdNetworkConfig::WpdNetworkConfig() +{ + +} + +WpdNetworkConfig::~WpdNetworkConfig() +{ + +} + +HRESULT WpdNetworkConfig::Initialize(_In_ FakeDevice *pFakeDevice) +{ + HRESULT hr = S_OK; + + if(pFakeDevice == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL parameter"); + return hr; + } + m_pFakeDevice = pFakeDevice; + return hr; +} + + +HRESULT WpdNetworkConfig::DispatchWpdMessage(_In_ REFPROPERTYKEY Command, + _In_ IPortableDeviceValues* pParams, + _In_ IPortableDeviceValues* pResults) +{ + HRESULT hr = S_OK; + + if (hr == S_OK) + { + if (Command.fmtid != WPD_CATEGORY_NETWORK_CONFIGURATION) + { + hr = E_INVALIDARG; + CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid)); + } + } + + if (hr == S_OK) + { + if(IsEqualPropertyKey(Command, WPD_COMMAND_PROCESS_WIRELESS_PROFILE)) + { + hr = OnProcessWFCObject(pParams, pResults); + CHECK_HR(hr, "Failed to commit WFC file"); + } + 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_PROCESS_WIRELESS_PROFILE + * command. + * + * The parameters sent to us are: + * - WPD_PROPERTY_OBJECT_ID: identifies the object to process. + * + * The driver should: + * - + */ +HRESULT WpdNetworkConfig::OnProcessWFCObject( + _In_ IPortableDeviceValues* pParams, + _In_ IPortableDeviceValues* pResults) +{ + HRESULT hr = S_OK; + LPWSTR pszObjectID = NULL; + + UNREFERENCED_PARAMETER(pResults); + + // Get the Object ID + hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &pszObjectID); + if (hr == S_OK) + { + FakeContent* pElement = NULL; + + // Check if the object exists + if(m_pFakeDevice->GetContent(pszObjectID, &pElement)) + { + // Check if the object is of the proper content type + if (IsEqualGUID(pElement->ContentType, WPD_CONTENT_TYPE_WIRELESS_PROFILE)) + { + BYTE Buffer[16]; + DWORD dwNumBytesRead = 0; + + // Perform minimal validation on the object contents (just read some bytes for this sample) + hr = pElement->ReadData(WPD_RESOURCE_DEFAULT, 0, Buffer, sizeof(Buffer), &dwNumBytesRead); + CHECK_HR(hr, "Failed to read resource data for %ws.%d", CComBSTR(WPD_RESOURCE_DEFAULT.fmtid), WPD_RESOURCE_DEFAULT.pid); + } + else + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Invalid ObjectID for OnProcessWFCObject [%ws]", pszObjectID); + } + } + else + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Invalid ObjectID [%ws]", pszObjectID); + } + + CoTaskMemFree(pszObjectID); + } + else + { + CHECK_HR(hr, "Missing or invalid value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID"); + } + + return hr; +} + + |
