ReactOS  0.4.14-dev-583-g2a1ba2c
main.c
Go to the documentation of this file.
1 /*
2  * MultiMedia Streams Base Functions (AMSTREAM.DLL)
3  *
4  * Copyright 2004 Christian Costa
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include <stdarg.h>
22 #include <string.h>
23 
24 #define COBJMACROS
25 
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winerror.h"
30 
31 #include "ole2.h"
32 #include "rpcproxy.h"
33 
34 #include "amstream_private.h"
35 
36 #include "wine/debug.h"
37 
39 
41 
42 /* For the moment, do nothing here. */
43 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
44 {
45  switch(fdwReason) {
46  case DLL_PROCESS_ATTACH:
47  instance = hInstDLL;
48  DisableThreadLibraryCalls(hInstDLL);
49  break;
50  }
51  return TRUE;
52 }
53 
54 /******************************************************************************
55  * Multimedia Streams ClassFactory
56  */
57 typedef struct {
59  LONG ref;
60  HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
62 
64 {
65  return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
66 }
67 
69 {
70  const CLSID *clsid;
71  HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
72 };
73 
74 static const struct object_creation_info object_creation[] =
75 {
76  { &CLSID_AMMultiMediaStream, AM_create },
77  { &CLSID_AMDirectDrawStream, AM_create },
78  { &CLSID_AMAudioData, AMAudioData_create },
79  { &CLSID_MediaStreamFilter, MediaStreamFilter_create }
80 };
81 
83 {
86  {
87  IClassFactory_AddRef(iface);
88  *ppobj = iface;
89  return S_OK;
90  }
91 
92  *ppobj = NULL;
93  WARN("(%p)->(%s,%p), not found\n", iface, debugstr_guid(riid), ppobj);
94  return E_NOINTERFACE;
95 }
96 
98 {
100  return InterlockedIncrement(&This->ref);
101 }
102 
104 {
107 
108  if (ref == 0)
110 
111  return ref;
112 }
113 
114 
116  REFIID riid, void **ppobj)
117 {
119  HRESULT hres;
120  IUnknown *punk;
121 
122  TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
123 
124  *ppobj = NULL;
125  hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
126  if (SUCCEEDED(hres)) {
127  hres = IUnknown_QueryInterface(punk, riid, ppobj);
128  IUnknown_Release(punk);
129  }
130  return hres;
131 }
132 
134 {
136  FIXME("(%p)->(%d),stub!\n",This,dolock);
137  return S_OK;
138 }
139 
140 static const IClassFactoryVtbl DSCF_Vtbl =
141 {
143  AMCF_AddRef,
144  AMCF_Release,
147 };
148 
149 /*******************************************************************************
150  * DllGetClassObject [AMSTREAM.@]
151  * Retrieves class object from a DLL object
152  *
153  * NOTES
154  * Docs say returns STDAPI
155  *
156  * PARAMS
157  * rclsid [I] CLSID for the class object
158  * riid [I] Reference to identifier of interface for class object
159  * ppv [O] Address of variable to receive interface pointer for riid
160  *
161  * RETURNS
162  * Success: S_OK
163  * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
164  * E_UNEXPECTED
165  */
167 {
168  unsigned int i;
170 
171  TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
172 
174  && ! IsEqualGUID( &IID_IUnknown, riid) )
175  return E_NOINTERFACE;
176 
177  for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
178  {
179  if (IsEqualGUID(object_creation[i].clsid, rclsid))
180  break;
181  }
182 
183  if (i == sizeof(object_creation)/sizeof(object_creation[0]))
184  {
185  FIXME("%s: no class found.\n", debugstr_guid(rclsid));
187  }
188 
189  factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory));
190  if (factory == NULL) return E_OUTOFMEMORY;
191 
193  factory->ref = 1;
194 
195  factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
196 
198  return S_OK;
199 }
200 
201 /***********************************************************************
202  * DllCanUnloadNow (AMSTREAM.@)
203  */
205 {
206  return S_FALSE;
207 }
208 
209 /***********************************************************************
210  * DllRegisterServer (AMSTREAM.@)
211  */
213 {
215 }
216 
217 /***********************************************************************
218  * DllUnregisterServer (AMSTREAM.@)
219  */
221 {
223 }
HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: amstream.c:54
HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN
static ULONG WINAPI AMCF_AddRef(IClassFactory *iface)
Definition: main.c:97
#define HRESULT
Definition: msvc.h:7
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
HRESULT __wine_register_resources(HMODULE module) DECLSPEC_HIDDEN
Definition: register.c:98
WINE_DEFAULT_DEBUG_CHANNEL(wmic)
REFIID riid
Definition: precomp.h:44
#define REFCLSID
Definition: guiddef.h:117
#define WARN(fmt,...)
Definition: debug.h:111
static HRESULT WINAPI AMCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: main.c:82
HRESULT AMAudioData_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN
Definition: audiodata.c:222
REFIID LPVOID * ppv
Definition: atlbase.h:39
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
static HRESULT WINAPI AMCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: main.c:115
static const IClassFactoryVtbl DSCF_Vtbl
Definition: main.c:140
#define DLL_PROCESS_ATTACH
Definition: compat.h:120
const CLSID * clsid
Definition: main.c:70
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
Definition: send.c:47
struct tagIClassFactoryImpl IClassFactoryImpl
HRESULT(* pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: main.c:71
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT WINAPI DllRegisterServer(void)
Definition: main.c:212
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
Definition: main.c:438
HRESULT WINAPI DllUnregisterServer(void)
Definition: main.c:220
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
#define S_FALSE
Definition: winerror.h:2357
smooth NULL
Definition: ftsmooth.c:416
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
static ULONG WINAPI AMCF_Release(IClassFactory *iface)
Definition: main.c:103
static IClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: main.c:63
REFCLSID clsid
Definition: msctf.c:82
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT __wine_unregister_resources(HMODULE module) DECLSPEC_HIDDEN
Definition: register.c:110
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
static HRESULT WINAPI AMCF_LockServer(IClassFactory *iface, BOOL dolock)
Definition: main.c:133
IClassFactory IClassFactory_iface
Definition: main.c:58
static HINSTANCE instance
Definition: main.c:40
HRESULT WINAPI DllCanUnloadNow(void)
Definition: main.c:204
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static const struct object_creation_info object_creation[]
Definition: main.c:74
unsigned int ULONG
Definition: retypes.h:1
static ClassFactoryImpl factory
Definition: ole_server.c:234
const GUID IID_IClassFactory
IClassFactory IClassFactory_iface
Definition: main.c:440
#define HeapFree(x, y, z)
Definition: compat.h:402
#define SUCCEEDED(hr)
Definition: intsafe.h:57
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: main.c:166
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
Definition: main.c:26