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