summaryrefslogtreecommitdiff
path: root/wpd/WpdWudfSampleDriver/WpdObjectResources.h
diff options
context:
space:
mode:
Diffstat (limited to 'wpd/WpdWudfSampleDriver/WpdObjectResources.h')
-rw-r--r--wpd/WpdWudfSampleDriver/WpdObjectResources.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/wpd/WpdWudfSampleDriver/WpdObjectResources.h b/wpd/WpdWudfSampleDriver/WpdObjectResources.h
new file mode 100644
index 00000000..81894662
--- /dev/null
+++ b/wpd/WpdWudfSampleDriver/WpdObjectResources.h
@@ -0,0 +1,129 @@
+#pragma once
+
+// This context is used for managing reads/writes for data transfer.
+// It keeps track of the number of bytes read/written for the current transfer.
+class ResourceContext : public IUnknown
+{
+public:
+ ResourceContext() :
+ NumBytesTransfered(0),
+ m_cRef(1),
+ CreateRequest(FALSE)
+ {
+
+
+ Key = WPD_PROPERTY_NULL;
+ }
+
+ ~ResourceContext()
+ {
+
+ }
+
+ CAtlStringW ObjectID;
+ PROPERTYKEY Key;
+ DWORD NumBytesTransfered;
+ BOOL CreateRequest;
+
+public: // IUnknown
+ ULONG __stdcall AddRef()
+ {
+ InterlockedIncrement((long*) &m_cRef);
+ return m_cRef;
+ }
+
+ _At_(this, __drv_freesMem(Mem))
+ ULONG __stdcall Release()
+ {
+ ULONG ulRefCount = m_cRef - 1;
+
+ if (InterlockedDecrement((long*) &m_cRef) == 0)
+ {
+ delete this;
+ return 0;
+ }
+ return ulRefCount;
+ }
+
+ HRESULT __stdcall 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;
+ }
+
+private:
+ DWORD m_cRef;
+};
+
+class WpdObjectResources
+{
+public:
+ WpdObjectResources();
+ ~WpdObjectResources();
+
+ HRESULT Initialize(_In_ FakeDevice *pFakeDevice);
+
+ HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
+ _In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnGetSupportedResources(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnGetAttributes(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnOpen(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnRead(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnWrite(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnClose(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnDelete(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnCreate(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnRevert(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+ HRESULT OnSeek(_In_ IPortableDeviceValues* pParams,
+ _In_ IPortableDeviceValues* pResults);
+
+private:
+ HRESULT CreateResourceContext(
+ _In_ ContextMap* pContextMap,
+ _In_ LPCWSTR pszObjectID,
+ _In_ REFPROPERTYKEY ResourceKey,
+ _In_ BOOL bCreateRequest,
+ _Outptr_ LPWSTR* ppszResourceContext);
+
+ HRESULT DestroyResourceContext(
+ _In_ ContextMap* pContextMap,
+ _In_ LPCWSTR pszResourceContext);
+
+private:
+
+ FakeDevice* m_pFakeDevice;
+};