Merge trunk head (r43756)
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / drm_port.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/drm_port.cpp
5 * PURPOSE: portcls drm port object
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "private.hpp"
10
11 class CDrmPort2 : public IDrmPort2
12 {
13 public:
14 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
15
16 STDMETHODIMP_(ULONG) AddRef()
17 {
18 InterlockedIncrement(&m_Ref);
19 return m_Ref;
20 }
21 STDMETHODIMP_(ULONG) Release()
22 {
23 InterlockedDecrement(&m_Ref);
24
25 if (!m_Ref)
26 {
27 delete this;
28 return 0;
29 }
30 return m_Ref;
31 }
32 IMP_IDrmPort2;
33 CDrmPort2(IUnknown *OuterUnknown){}
34 virtual ~CDrmPort2(){}
35
36 protected:
37 LONG m_Ref;
38
39 };
40
41 NTSTATUS
42 NTAPI
43 CDrmPort2::QueryInterface(
44 IN REFIID refiid,
45 OUT PVOID* Output)
46 {
47 UNICODE_STRING GuidString;
48
49 if (IsEqualGUIDAligned(refiid, IID_IDrmPort) ||
50 IsEqualGUIDAligned(refiid, IID_IDrmPort2) ||
51 IsEqualGUIDAligned(refiid, IID_IUnknown))
52 {
53 *Output = PVOID(PUNKNOWN(this));
54 PUNKNOWN(*Output)->AddRef();
55 return STATUS_SUCCESS;
56 }
57
58 if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
59 {
60 DPRINT("IDrmPort2_QueryInterface no interface!!! iface %S\n", GuidString.Buffer);
61 RtlFreeUnicodeString(&GuidString);
62 }
63 return STATUS_UNSUCCESSFUL;
64 }
65
66 NTSTATUS
67 NTAPI
68 CDrmPort2::CreateContentMixed(
69 IN PULONG paContentId,
70 IN ULONG cContentId,
71 OUT PULONG pMixedContentId)
72 {
73 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
74 return DrmCreateContentMixed(paContentId, cContentId, pMixedContentId);
75 }
76
77 NTSTATUS
78 NTAPI
79 CDrmPort2::DestroyContent(
80 IN ULONG ContentId)
81 {
82 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
83 return DrmDestroyContent(ContentId);
84 }
85
86 NTSTATUS
87 NTAPI
88 CDrmPort2::ForwardContentToFileObject(
89 IN ULONG ContentId,
90 IN PFILE_OBJECT FileObject)
91 {
92 return DrmForwardContentToFileObject(ContentId, FileObject);
93 }
94
95 NTSTATUS
96 NTAPI
97 CDrmPort2::ForwardContentToInterface(
98 IN ULONG ContentId,
99 IN PUNKNOWN pUnknown,
100 IN ULONG NumMethods)
101 {
102 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
103 return DrmForwardContentToInterface(ContentId, pUnknown, NumMethods);
104 }
105
106 NTSTATUS
107 NTAPI
108 CDrmPort2::GetContentRights(
109 IN ULONG ContentId,
110 OUT PDRMRIGHTS DrmRights)
111 {
112 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
113 return DrmGetContentRights(ContentId, DrmRights);
114 }
115
116 NTSTATUS
117 NTAPI
118 CDrmPort2::AddContentHandlers(
119 IN ULONG ContentId,
120 IN PVOID * paHandlers,
121 IN ULONG NumHandlers)
122 {
123 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
124 return DrmAddContentHandlers(ContentId, paHandlers, NumHandlers);
125 }
126
127 NTSTATUS
128 NTAPI
129 CDrmPort2::ForwardContentToDeviceObject(
130 IN ULONG ContentId,
131 IN PVOID Reserved,
132 IN PCDRMFORWARD DrmForward)
133 {
134 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
135 return DrmForwardContentToDeviceObject(ContentId, Reserved, DrmForward);
136 }
137
138 NTSTATUS
139 NewIDrmPort(
140 OUT PDRMPORT2 *OutPort)
141 {
142 CDrmPort2 * This = new(NonPagedPool, TAG_PORTCLASS)CDrmPort2(NULL);
143 if (!This)
144 return STATUS_INSUFFICIENT_RESOURCES;
145
146 This->AddRef();
147
148 *OutPort = (PDRMPORT2)This;
149 return STATUS_SUCCESS;
150 }
151
152