0870dd7f143653d10dffe563346f9dea52c3e5e9
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / drm_port.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/drm_port.c
5 * PURPOSE: portcls drm port object
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "private.h"
10
11 typedef struct
12 {
13 IDrmPort2Vtbl *lpVtbl;
14 LONG ref;
15 }IDrmPort2Impl;
16
17 ULONG
18 NTAPI
19 IDrmPort2_fnAddRef(
20 IN IDrmPort2* iface)
21 {
22 IDrmPort2Impl * This = (IDrmPort2Impl*)iface;
23
24 DPRINT("IDrmPort2_AddRef: This %p\n", This);
25
26 return InterlockedIncrement(&This->ref);
27 }
28
29 ULONG
30 NTAPI
31 IDrmPort2_fnRelease(
32 IN IDrmPort2* iface)
33 {
34 IDrmPort2Impl * This = (IDrmPort2Impl*)iface;
35
36 InterlockedDecrement(&This->ref);
37
38 if (This->ref == 0)
39 {
40 FreeItem(This, TAG_PORTCLASS);
41 return 0;
42 }
43 /* Return new reference count */
44 return This->ref;
45 }
46
47 NTSTATUS
48 NTAPI
49 IDrmPort2_fnQueryInterface(
50 IN IDrmPort2* iface,
51 IN REFIID refiid,
52 OUT PVOID* Output)
53 {
54 UNICODE_STRING GuidString;
55 IDrmPort2Impl * This = (IDrmPort2Impl*)iface;
56
57 if (IsEqualGUIDAligned(refiid, &IID_IDrmPort) ||
58 IsEqualGUIDAligned(refiid, &IID_IDrmPort2) ||
59 IsEqualGUIDAligned(refiid, &IID_IUnknown))
60 {
61 *Output = (PVOID)&This->lpVtbl;
62 InterlockedIncrement(&This->ref);
63 return STATUS_SUCCESS;
64 }
65
66 if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
67 {
68 DPRINT1("IDrmPort2_QueryInterface no interface!!! iface %S\n", GuidString.Buffer);
69 RtlFreeUnicodeString(&GuidString);
70 }
71 return STATUS_UNSUCCESSFUL;
72 }
73
74 NTSTATUS
75 NTAPI
76 IDrmPort2_fnCreateContentMixed(
77 IN IDrmPort2 * iface,
78 IN PULONG paContentId,
79 IN ULONG cContentId,
80 OUT PULONG pMixedContentId)
81 {
82 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
83 return DrmCreateContentMixed(paContentId, cContentId, pMixedContentId);
84 }
85
86 NTSTATUS
87 NTAPI
88 IDrmPort2_fnDestroyContent(
89 IN IDrmPort2 * iface,
90 IN ULONG ContentId)
91 {
92 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
93 return DrmDestroyContent(ContentId);
94 }
95
96 NTSTATUS
97 NTAPI
98 IDrmPort2_fnForwardContentToFileObject(
99 IN IDrmPort2 * iface,
100 IN ULONG ContentId,
101 IN PFILE_OBJECT FileObject)
102 {
103 return DrmForwardContentToFileObject(ContentId, FileObject);
104 }
105
106 NTSTATUS
107 NTAPI
108 IDrmPort2_fnForwardContentToInterface(
109 IN IDrmPort2 * iface,
110 IN ULONG ContentId,
111 IN PUNKNOWN pUnknown,
112 IN ULONG NumMethods)
113 {
114 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
115 return DrmForwardContentToInterface(ContentId, pUnknown, NumMethods);
116 }
117
118 NTSTATUS
119 NTAPI
120 IDrmPort2_fnGetContentRights(
121 IN IDrmPort2 * iface,
122 IN ULONG ContentId,
123 OUT PDRMRIGHTS DrmRights)
124 {
125 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
126 return DrmGetContentRights(ContentId, DrmRights);
127 }
128
129 NTSTATUS
130 NTAPI
131 IDrmPort2_fnAddContentHandlers(
132 IN IDrmPort2 * iface,
133 IN ULONG ContentId,
134 IN PVOID * paHandlers,
135 IN ULONG NumHandlers)
136 {
137 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
138 return DrmAddContentHandlers(ContentId, paHandlers, NumHandlers);
139 }
140
141 NTSTATUS
142 NTAPI
143 IDrmPort2_fnForwardContentToDeviceObject(
144 IN IDrmPort2 * iface,
145 IN ULONG ContentId,
146 IN PVOID Reserved,
147 IN PCDRMFORWARD DrmForward)
148 {
149 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
150 return DrmForwardContentToDeviceObject(ContentId, Reserved, DrmForward);
151 }
152
153 static IDrmPort2Vtbl vt_IDrmPort2 =
154 {
155 /* IUnknown methods */
156 IDrmPort2_fnQueryInterface,
157 IDrmPort2_fnAddRef,
158 IDrmPort2_fnRelease,
159 IDrmPort2_fnCreateContentMixed,
160 IDrmPort2_fnDestroyContent,
161 IDrmPort2_fnForwardContentToFileObject,
162 IDrmPort2_fnForwardContentToInterface,
163 IDrmPort2_fnGetContentRights,
164 IDrmPort2_fnAddContentHandlers,
165 IDrmPort2_fnForwardContentToDeviceObject
166 };
167
168 NTSTATUS
169 NewIDrmPort(
170 OUT PDRMPORT2 *OutPort)
171 {
172 IDrmPort2Impl * This = AllocateItem(NonPagedPool, sizeof(IDrmPort2Impl), TAG_PORTCLASS);
173 if (!This)
174 return STATUS_INSUFFICIENT_RESOURCES;
175
176 This->lpVtbl = &vt_IDrmPort2;
177 This->ref = 1;
178
179 *OutPort = (PDRMPORT2)&This->lpVtbl;
180 return STATUS_SUCCESS;
181 }