summaryrefslogtreecommitdiff
path: root/wpd/WpdServiceSampleDriver/FakeContactsService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'wpd/WpdServiceSampleDriver/FakeContactsService.cpp')
-rw-r--r--wpd/WpdServiceSampleDriver/FakeContactsService.cpp753
1 files changed, 0 insertions, 753 deletions
diff --git a/wpd/WpdServiceSampleDriver/FakeContactsService.cpp b/wpd/WpdServiceSampleDriver/FakeContactsService.cpp
deleted file mode 100644
index 405279a9..00000000
--- a/wpd/WpdServiceSampleDriver/FakeContactsService.cpp
+++ /dev/null
@@ -1,753 +0,0 @@
-#include "stdafx.h"
-
-#include "FakeContactsService.tmh"
-
-const FormatAttributeInfo g_SupportedContactFormats[] =
-{
- {&FORMAT_AbstractContact, L"AbstractContact"},
- {&FORMAT_VCard2Contact, L"VCard2"}
-};
-
-const GUID* g_SupportedMethods[] =
-{
- &METHOD_FullEnumSyncSvc_BeginSync,
- &METHOD_FullEnumSyncSvc_EndSync,
- &MyCustomMethod
-};
-
-// Method parameters
-const MethodParameterAttributeInfo g_MethodParameters[] =
-{
- {&MyCustomMethodResult, VT_BOOL, WPD_PARAMETER_USAGE_RETURN, WPD_PARAMETER_ATTRIBUTE_FORM_UNSPECIFIED, 0, L"Result"},
- {&MyCustomMethodParam, VT_UI4, WPD_PARAMETER_USAGE_IN, WPD_PARAMETER_ATTRIBUTE_FORM_UNSPECIFIED, 1, L"Integer_Param"},
- {&MyCustomMethodParamInOut, VT_LPWSTR, WPD_PARAMETER_USAGE_INOUT, WPD_PARAMETER_ATTRIBUTE_FORM_OBJECT_IDENTIFIER, 2, L"ObjectId_Param"},
-};
-
-const GUID* g_SupportedServiceEvents[] =
-{
- &WPD_EVENT_OBJECT_ADDED,
- &WPD_EVENT_OBJECT_REMOVED,
- &WPD_EVENT_OBJECT_UPDATED,
- &MyCustomEvent,
-};
-
-// Event parameters
-const EventParameterAttributeInfo g_ServiceEventParameters[] =
-{
- {&WPD_EVENT_OBJECT_ADDED, &WPD_EVENT_PARAMETER_EVENT_ID, VT_CLSID},
- {&WPD_EVENT_OBJECT_ADDED, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_ADDED, &WPD_EVENT_PARAMETER_OBJECT_PARENT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_ADDED, &WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, VT_LPWSTR},
-
- {&WPD_EVENT_OBJECT_REMOVED, &WPD_EVENT_PARAMETER_EVENT_ID, VT_CLSID},
- {&WPD_EVENT_OBJECT_REMOVED, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_REMOVED, &WPD_EVENT_PARAMETER_OBJECT_PARENT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_REMOVED, &WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, VT_LPWSTR},
-
- {&WPD_EVENT_OBJECT_UPDATED, &WPD_EVENT_PARAMETER_EVENT_ID, VT_CLSID},
- {&WPD_EVENT_OBJECT_UPDATED, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_UPDATED, &WPD_EVENT_PARAMETER_OBJECT_PARENT_PERSISTENT_UNIQUE_ID, VT_LPWSTR},
- {&WPD_EVENT_OBJECT_UPDATED, &WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, VT_LPWSTR},
-
- {&MyCustomEvent, &WPD_EVENT_PARAMETER_EVENT_ID, VT_CLSID},
- {&MyCustomEvent, &WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, VT_LPWSTR},
- {&MyCustomEvent, &MyCustomEventParam0, VT_BOOL},
- {&MyCustomEvent, &MyCustomEventParam1, VT_UI4},
-};
-
-// Supported commands for this service
-const PROPERTYKEY* g_ServiceSupportedCommands[] =
-{
- // WPD_CATEGORY_OBJECT_ENUMERATION
- &WPD_COMMAND_OBJECT_ENUMERATION_START_FIND,
- &WPD_COMMAND_OBJECT_ENUMERATION_FIND_NEXT,
- &WPD_COMMAND_OBJECT_ENUMERATION_END_FIND,
-
- // WPD_CATEGORY_OBJECT_PROPERTIES
- &WPD_COMMAND_OBJECT_PROPERTIES_GET_SUPPORTED,
- &WPD_COMMAND_OBJECT_PROPERTIES_GET,
- &WPD_COMMAND_OBJECT_PROPERTIES_GET_ALL,
- &WPD_COMMAND_OBJECT_PROPERTIES_SET,
- &WPD_COMMAND_OBJECT_PROPERTIES_GET_ATTRIBUTES,
- &WPD_COMMAND_OBJECT_PROPERTIES_DELETE,
-
- // WPD_CATEGORY_OBJECT_RESOURCES
- &WPD_COMMAND_OBJECT_RESOURCES_GET_SUPPORTED,
- &WPD_COMMAND_OBJECT_RESOURCES_OPEN,
- &WPD_COMMAND_OBJECT_RESOURCES_READ,
- &WPD_COMMAND_OBJECT_RESOURCES_CLOSE,
- &WPD_COMMAND_OBJECT_RESOURCES_GET_ATTRIBUTES,
-
- // WPD_CATEGORY_OBJECT_MANAGEMENT
- &WPD_COMMAND_OBJECT_MANAGEMENT_CREATE_OBJECT_WITH_PROPERTIES_ONLY,
- &WPD_COMMAND_OBJECT_MANAGEMENT_DELETE_OBJECTS,
-
- // WPD_CATEGORY_OBJECT_PROPERTIES_BULK
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_LIST_START,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_LIST_NEXT,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_LIST_END,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_FORMAT_START,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_FORMAT_NEXT,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_GET_VALUES_BY_OBJECT_FORMAT_END,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_SET_VALUES_BY_OBJECT_LIST_START,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_SET_VALUES_BY_OBJECT_LIST_NEXT,
- &WPD_COMMAND_OBJECT_PROPERTIES_BULK_SET_VALUES_BY_OBJECT_LIST_END,
-
- // WPD_CATEGORY_COMMON
- &WPD_COMMAND_COMMON_GET_OBJECT_IDS_FROM_PERSISTENT_UNIQUE_IDS,
-
- // WPD_CATEGORY_SERVICE_COMMON
- &WPD_COMMAND_SERVICE_COMMON_GET_SERVICE_OBJECT_ID,
-
- // WPD_CATEGORY_SERVICE_CAPABILITIES
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_COMMANDS,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_COMMAND_OPTIONS,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_METHODS,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_METHODS_BY_FORMAT,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_METHOD_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_METHOD_PARAMETER_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_FORMATS,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_FORMAT_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_FORMAT_PROPERTIES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_FORMAT_PROPERTY_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_SUPPORTED_EVENTS,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_EVENT_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_EVENT_PARAMETER_ATTRIBUTES,
- &WPD_COMMAND_SERVICE_CAPABILITIES_GET_INHERITED_SERVICES
-};
-
-
-HRESULT FakeContactsService::GetSupportedCommands(
- _In_ IPortableDeviceKeyCollection* pCommands)
-{
- HRESULT hr = S_OK;
-
- if(pCommands == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_ServiceSupportedCommands); dwIndex++)
- {
- PROPERTYKEY key = *(g_ServiceSupportedCommands[dwIndex]);
- hr = pCommands->Add(key);
- CHECK_HR(hr, "Failed to add supported command at index %d", dwIndex);
- if (FAILED(hr))
- {
- break;
- }
- }
- return hr;
-}
-
-HRESULT FakeContactsService::GetCommandOptions(
- _In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pOptions)
-{
- HRESULT hr = S_OK;
-
- if(pOptions == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // Check for command options
- if (IsEqualPropertyKey(WPD_COMMAND_OBJECT_MANAGEMENT_DELETE_OBJECTS, Command))
- {
- // This driver does not support recursive deletion
- hr = pOptions->SetBoolValue(WPD_OPTION_OBJECT_MANAGEMENT_RECURSIVE_DELETE_SUPPORTED, TRUE);
- CHECK_HR(hr, "Failed to set WPD_OPTION_OBJECT_MANAGEMENT_RECURSIVE_DELETE_SUPPORTED");
- }
-
- return hr;
-}
-
-
-HRESULT FakeContactsService::GetSupportedMethods(
- _In_ IPortableDevicePropVariantCollection* pMethods)
-{
- HRESULT hr = S_OK;
-
- if (pMethods == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // Add the supported methods to the collection.
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedMethods); dwIndex++)
- {
- PROPVARIANT pv;
- pv.vt = VT_CLSID;
- pv.puuid = (GUID*)g_SupportedMethods[dwIndex]; // Assignment only, don't PropVariantClear this
-
- hr = pMethods->Add(&pv);
- CHECK_HR(hr, "Failed to add supported method at index %d", dwIndex);
- if (FAILED(hr))
- {
- break;
- }
- }
-
- return hr;
-}
-
-BOOL FakeContactsService::IsMethodSupported(
- _In_ REFGUID Method)
-{
- // Add the supported methods to the collection.
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedMethods); dwIndex++)
- {
- if (Method == *g_SupportedMethods[dwIndex])
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-HRESULT FakeContactsService::GetSupportedMethodsByFormat(
- _In_ REFGUID Format,
- _In_ IPortableDevicePropVariantCollection* pMethods)
-{
- HRESULT hr = S_OK;
-
- if (pMethods == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedContactFormats); i++)
- {
- if (Format == *g_SupportedContactFormats[i].pFormatGuid)
- {
- // Add the supported methods for the format to the collection, right now there are none, so we
- // return an emtpy collection
- hr = S_OK;
- break;
- }
- }
- CHECK_HR(hr, "Format %ws is not supported", CComBSTR(Format));
-
- return hr;
-}
-
-
-HRESULT FakeContactsService::GetMethodAttributes(
- _In_ REFGUID Method,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceKeyCollection> pParameters;
-
- if (pAttributes == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // CoCreate a collection for specifying the method parameters.
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pParameters);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
-
- // Add the method attributes to this collection
- if (Method == METHOD_FullEnumSyncSvc_BeginSync)
- {
- if (hr == S_OK)
- {
- hr = pAttributes->SetStringValue(WPD_METHOD_ATTRIBUTE_NAME, L"BeginSync");
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_NAME");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_METHOD_ATTRIBUTE_ACCESS, WPD_COMMAND_ACCESS_READWRITE);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ACCESS");
- }
-
- if (hr == S_OK)
- {
- // no parameters, set empty collection
- hr = pAttributes->SetIPortableDeviceKeyCollectionValue(WPD_METHOD_ATTRIBUTE_PARAMETERS, pParameters);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_PARAMETERS");
- }
-
- if (hr == S_OK)
- {
- // no associated format, set GUID_NULL
- hr = pAttributes->SetGuidValue(WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT, GUID_NULL);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT");
- }
-
- }
- else if (Method == METHOD_FullEnumSyncSvc_EndSync)
- {
- if (hr == S_OK)
- {
- hr = pAttributes->SetStringValue(WPD_METHOD_ATTRIBUTE_NAME, L"EndSync");
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_NAME");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_METHOD_ATTRIBUTE_ACCESS, WPD_COMMAND_ACCESS_READWRITE);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ACCESS");
- }
-
- if (hr == S_OK)
- {
- // no parameters, set empty collection
- hr = pAttributes->SetIPortableDeviceKeyCollectionValue(WPD_METHOD_ATTRIBUTE_PARAMETERS, pParameters);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_PARAMETERS");
- }
-
- if (hr == S_OK)
- {
- // no associated format, set GUID_NULL
- hr = pAttributes->SetGuidValue(WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT, GUID_NULL);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT");
- }
- }
- else if (Method == MyCustomMethod)
- {
- if (hr == S_OK)
- {
- hr = pAttributes->SetStringValue(WPD_METHOD_ATTRIBUTE_NAME, L"CustomMethod");
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_NAME");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_METHOD_ATTRIBUTE_ACCESS, WPD_COMMAND_ACCESS_READWRITE);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ACCESS");
- }
-
- if (hr == S_OK)
- {
- // Set the supported parameters
- for (size_t i=0; i<ARRAYSIZE(g_MethodParameters); i++)
- {
- pParameters->Add(*(g_MethodParameters[i].pKey));
- }
-
- hr = pAttributes->SetIPortableDeviceKeyCollectionValue(WPD_METHOD_ATTRIBUTE_PARAMETERS, pParameters);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_PARAMETERS");
- }
-
- if (hr == S_OK)
- {
- // no associated format, set GUID_NULL
- hr = pAttributes->SetGuidValue(WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT, GUID_NULL);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_ASSOCIATED_FORMAT");
- }
- }
- else
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- CHECK_HR(hr, "Unknown method %ws received",CComBSTR(Method));
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetMethodParameterAttributes(
- _In_ REFPROPERTYKEY Parameter,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
-
- if (pAttributes == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = SetMethodParameterAttributes(Parameter, &g_MethodParameters[0], ARRAYSIZE(g_MethodParameters), pAttributes);
- CHECK_HR(hr, "Failed to set method parameter attributes");
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetSupportedFormats(
- _In_ IPortableDevicePropVariantCollection* pFormats)
-{
- HRESULT hr = S_OK;
-
- if (pFormats == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- if (hr == S_OK)
- {
- // Add the supported formats to this collection
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedContactFormats); i++)
- {
- PROPVARIANT pv = {0};
- pv.vt = VT_CLSID;
- pv.puuid = (CLSID*)g_SupportedContactFormats[i].pFormatGuid; // assignment, do not call PropVariantClear
-
- hr = pFormats->Add(&pv);
- CHECK_HR(hr, "Failed to add format to IPortableDevicePropVariantCollection");
- }
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetFormatAttributes(
- _In_ REFGUID Format,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
-
- if (pAttributes == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-
- // Add the supported formats to this collection
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedContactFormats); i++)
- {
- if (Format == *g_SupportedContactFormats[i].pFormatGuid)
- {
- hr = pAttributes->SetStringValue(WPD_FORMAT_ATTRIBUTE_NAME, g_SupportedContactFormats[i].wszName);
- CHECK_HR(hr, "Failed to set WPD_FORMAT_ATTRIBUTE_NAME");
- break;
- }
- }
-
- if (hr == HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
- {
- CHECK_HR(hr, "Unknown format %ws received",CComBSTR(Format));
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetSupportedFormatProperties(
- _In_ REFGUID Format,
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- HRESULT hr = S_OK;
-
- if (pKeys == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // Add the supported format properties to this collection
- // The formats of this service happen to support the same set of properties
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedContactFormats); i++)
- {
- if (Format == (*g_SupportedContactFormats[i].pFormatGuid))
- {
- hr = GetSupportedContactProperties(pKeys);
- CHECK_HR(hr, "Failed to add supported contact format properties");
- break;
- }
- }
- CHECK_HR(hr, "Format %ws is not supported", CComBSTR(Format));
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetPropertyAttributes(
- _In_ REFGUID Format,
- _In_ REFPROPERTYKEY Property,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
-
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedContactFormats); i++)
- {
- if (Format == (*g_SupportedContactFormats[i].pFormatGuid))
- {
- hr = GetContactPropertyAttributes(Property, pAttributes);
- CHECK_HR(hr, "Failed to get property attributes");
- break;
- }
- }
-
- CHECK_HR(hr, "Failed to find supported format to retrieve property attributes");
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetSupportedEvents(
- _In_ IPortableDevicePropVariantCollection* pEvents)
-{
- HRESULT hr = S_OK;
-
- if (pEvents == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- PROPVARIANT pv;
- pv.vt = VT_CLSID;
-
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedServiceEvents); i++)
- {
- pv.puuid = (CLSID*)g_SupportedServiceEvents[i]; // Assignment, don't PropVariantClear this
-
- hr = pEvents->Add(&pv);
- CHECK_HR(hr, "Failed to add event to the collection");
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetEventAttributes(
- _In_ REFGUID Event,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceValues> pEventOptions;
- CComPtr<IPortableDeviceKeyCollection> pEventParameters;
-
- if (pAttributes == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // CoCreate a collection to store the event options.
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pEventOptions);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- if (hr == S_OK)
- {
- hr = pEventOptions->SetBoolValue(WPD_EVENT_OPTION_IS_BROADCAST_EVENT, TRUE);
- CHECK_HR(hr, "Failed to set WPD_EVENT_OPTION_IS_BROADCAST_EVENT");
- }
-
- // Loop through the supported events for this service to find a match
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- for (DWORD i=0; i<ARRAYSIZE(g_SupportedServiceEvents); i++)
- {
- if (Event == *g_SupportedServiceEvents[i])
- {
- // Set the event options.
- hr = pAttributes->SetIPortableDeviceValuesValue(WPD_EVENT_ATTRIBUTE_OPTIONS, pEventOptions);
- CHECK_HR(hr, "Failed to set WPD_EVENT_ATTRIBUTE_OPTIONS");
-
- // Set the event parameters.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pEventParameters);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- if (hr == S_OK)
- {
- hr = SetEventParameters(Event, &g_ServiceEventParameters[0], ARRAYSIZE(g_ServiceEventParameters), pEventParameters);
- CHECK_HR(hr, "Failed to set event parameters");
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetIPortableDeviceKeyCollectionValue(WPD_EVENT_ATTRIBUTE_PARAMETERS, pEventParameters);
- CHECK_HR(hr, "Failed to set WPD_METHOD_ATTRIBUTE_PARAMETERS");
- }
- }
-
- // Set a name for the custom event
- if (hr == S_OK)
- {
- if (Event == MyCustomEvent)
- {
- hr = pAttributes->SetStringValue(WPD_EVENT_ATTRIBUTE_NAME , L"MyCustomEvent");
- CHECK_HR(hr, "Failed to set WPD_EVENT_ATTRIBUTE_NAME");
- }
- }
- break;
- }
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetEventParameterAttributes(
- _In_ REFPROPERTYKEY Parameter,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
-
- if (pAttributes == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = SetEventParameterAttributes(Parameter, &g_ServiceEventParameters[0], ARRAYSIZE(g_ServiceEventParameters), pAttributes);
- CHECK_HR(hr, "Failed to set event parameter attributes");
-
- return hr;
-}
-
-HRESULT FakeContactsService::GetInheritedServices(
- const DWORD dwInheritanceType,
- _In_ IPortableDevicePropVariantCollection* pServices)
-{
- HRESULT hr = S_OK;
-
- if (pServices == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- if (dwInheritanceType == WPD_SERVICE_INHERITANCE_IMPLEMENTATION)
- {
- PROPVARIANT pv;
- pv.vt = VT_CLSID;
- pv.puuid = (CLSID*)&SERVICE_FullEnumSync; // Assignment, don't PropVariantClear this
-
- hr = pServices->Add(&pv);
- CHECK_HR(hr, "Failed to add service GUID to the collection");
- }
-
- return hr;
-}
-
-HRESULT FakeContactsService::OnBeginSync(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- UNREFERENCED_PARAMETER(pParams);
- UNREFERENCED_PARAMETER(pResults);
-
- // This is where the sync service receives a notification from the application that
- // sync is about to begin so that it can lock the session
- // This method does not do anything right now
-
- return S_OK;
-}
-
-HRESULT FakeContactsService::OnEndSync(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- UNREFERENCED_PARAMETER(pParams);
- UNREFERENCED_PARAMETER(pResults);
-
- // This is where the sync service receives a notification from the application that
- // sync is about to end so that it can unlock the session
- // This method does not do anything right now
-
- return S_OK;
-}
-
-// This demonstrates how a custom service method can be implemented
-HRESULT FakeContactsService::OnMyCustomMethod(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults,
- _In_ IPortableDeviceValues* pEventParams)
-{
- HRESULT hr = S_OK;
- DWORD dwParamValue = 0;
- BOOL bResultValue = FALSE;
- LPWSTR pszParamValue = NULL;
-
- if (pParams == NULL || pResults == NULL || pEventParams == NULL)
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- hr = pParams->GetUnsignedIntegerValue(MyCustomMethodParam, &dwParamValue);
- CHECK_HR(hr, "Failed to get MyCustomMethodParam");
-
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(MyCustomMethodParamInOut, &pszParamValue);
- CHECK_HR(hr, "Failed to get MyCustomMethodParamInOut");
- }
-
- if (hr == S_OK)
- {
- // For demonstration purposes only, we simply return the inout parameter as is
- hr = pResults->SetStringValue(MyCustomMethodParamInOut, pszParamValue);
- CHECK_HR(hr, "Failed to set MyCustomMethodParamInOut");
- }
-
- if (hr == S_OK)
- {
- // This is where the device will process the method invocation
- // For demonstration purposes only, we return TRUE if the input is an even number
- bResultValue = (dwParamValue % 1 == 0)?TRUE:FALSE;
- }
-
- if (hr == S_OK)
- {
- hr = pResults->SetBoolValue(MyCustomMethodResult, bResultValue);
- CHECK_HR(hr, "Failed to set MyCustomMethodResult");
- }
-
- if (hr == S_OK)
- {
- hr = pEventParams->SetGuidValue(WPD_EVENT_PARAMETER_EVENT_ID, MyCustomEvent);
- CHECK_HR(hr, "Failed to add WPD_EVENT_PARAMETER_EVENT_ID");
-
- if (hr == S_OK)
- {
- // Adding this event parameter will allow WPD to scope this event to the container functional object
- hr = pEventParams->SetStringValue(WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID, RequestFilename);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_CONTAINER_FUNCTIONAL_OBJECT_ID");
- }
-
- if (hr == S_OK)
- {
- // set the first custom event parameter
- hr = pEventParams->SetBoolValue(MyCustomEventParam0, bResultValue);
- CHECK_HR(hr, "Failed to add MyCustomEvent parameter 0");
- }
-
- if (hr == S_OK)
- {
- // set the second custom event parameter
- hr = pEventParams->SetUnsignedIntegerValue(MyCustomEventParam1, dwParamValue);
- CHECK_HR(hr, "Failed to add MyCustomEvent parameter 1");
- }
- }
-
- CoTaskMemFree(pszParamValue);
- return hr;
-}