~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/ddrawex/main.c

Version: ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*        DirectDrawEx
  2  *
  3  * Copyright 2006 Ulrich Czekalla
  4  *
  5  * This library is free software; you can redistribute it and/or
  6  * modify it under the terms of the GNU Lesser General Public
  7  * License as published by the Free Software Foundation; either
  8  * version 2.1 of the License, or (at your option) any later version.
  9  *
 10  * This library is distributed in the hope that it will be useful,
 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 13  * Lesser General Public License for more details.
 14  *
 15  * You should have received a copy of the GNU Lesser General Public
 16  * License along with this library; if not, write to the Free Software
 17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 18  */
 19 
 20 
 21 #include "wine/debug.h"
 22 
 23 #define COBJMACROS
 24 
 25 #include "winbase.h"
 26 #include "wingdi.h"
 27 #include "objbase.h"
 28 #include "rpcproxy.h"
 29 
 30 #include "ddraw.h"
 31 
 32 #include "initguid.h"
 33 #include "ddrawex_private.h"
 34 
 35 WINE_DEFAULT_DEBUG_CHANNEL(ddrawex);
 36 
 37 static HINSTANCE instance;
 38 
 39 /******************************************************************************
 40  * DirectDraw ClassFactory implementation
 41  ******************************************************************************/
 42 typedef struct
 43 {
 44     IClassFactory IClassFactory_iface;
 45     LONG ref;
 46     HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID iid, LPVOID *ppObj);
 47 } IClassFactoryImpl;
 48 
 49 static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
 50 {
 51     return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
 52 }
 53 
 54 /*******************************************************************************
 55  * IDirectDrawClassFactory::QueryInterface
 56  *
 57  *******************************************************************************/
 58 static HRESULT WINAPI IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface, REFIID riid,
 59         void **obj)
 60 {
 61     TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj);
 62 
 63     if (IsEqualGUID(riid, &IID_IUnknown)
 64         || IsEqualGUID(riid, &IID_IClassFactory))
 65     {
 66         IClassFactory_AddRef(iface);
 67         *obj = iface;
 68         return S_OK;
 69     }
 70 
 71     WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
 72 
 73     *obj = NULL;
 74     return E_NOINTERFACE;
 75 }
 76 
 77 /*******************************************************************************
 78  * IDirectDrawClassFactory::AddRef
 79  *
 80  *******************************************************************************/
 81 static ULONG WINAPI IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface)
 82 {
 83     IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 84     ULONG ref = InterlockedIncrement(&This->ref);
 85 
 86     TRACE("(%p)->() incrementing from %d.\n", This, ref - 1);
 87 
 88     return ref;
 89 }
 90 
 91 /*******************************************************************************
 92  * IDirectDrawClassFactory::Release
 93  *
 94  *******************************************************************************/
 95 static ULONG WINAPI IDirectDrawClassFactoryImpl_Release(IClassFactory *iface)
 96 {
 97     IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 98     ULONG ref = InterlockedDecrement(&This->ref);
 99 
100     TRACE("(%p)->() decrementing from %d.\n", This, ref+1);
101 
102     if (ref == 0)
103         HeapFree(GetProcessHeap(), 0, This);
104 
105     return ref;
106 }
107 
108 
109 /*******************************************************************************
110  * IDirectDrawClassFactory::CreateInstance
111  *
112  *******************************************************************************/
113 static HRESULT WINAPI IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface,
114         IUnknown *UnkOuter, REFIID riid, void **obj)
115 {
116     IClassFactoryImpl *This = impl_from_IClassFactory(iface);
117 
118     TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj);
119 
120     return This->pfnCreateInstance(UnkOuter, riid, obj);
121 }
122 
123 /*******************************************************************************
124  * IDirectDrawClassFactory::LockServer
125  *
126  *******************************************************************************/
127 static HRESULT WINAPI IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock)
128 {
129     IClassFactoryImpl *This = impl_from_IClassFactory(iface);
130 
131     FIXME("(%p)->(%d),stub!\n",This,dolock);
132 
133     return S_OK;
134 }
135 
136 
137 /*******************************************************************************
138  * The class factory VTable
139  *******************************************************************************/
140 static const IClassFactoryVtbl IClassFactory_Vtbl =
141 {
142     IDirectDrawClassFactoryImpl_QueryInterface,
143     IDirectDrawClassFactoryImpl_AddRef,
144     IDirectDrawClassFactoryImpl_Release,
145     IDirectDrawClassFactoryImpl_CreateInstance,
146     IDirectDrawClassFactoryImpl_LockServer
147 };
148 
149 
150 /******************************************************************************
151  * DirectDrawFactory implementation
152  ******************************************************************************/
153 typedef struct
154 {
155     IDirectDrawFactory IDirectDrawFactory_iface;
156     LONG ref;
157 } IDirectDrawFactoryImpl;
158 
159 static inline IDirectDrawFactoryImpl *impl_from_IDirectDrawFactory(IDirectDrawFactory *iface)
160 {
161     return CONTAINING_RECORD(iface, IDirectDrawFactoryImpl, IDirectDrawFactory_iface);
162 }
163 
164 /*******************************************************************************
165  * IDirectDrawFactory::QueryInterface
166  *
167  *******************************************************************************/
168 static HRESULT WINAPI IDirectDrawFactoryImpl_QueryInterface(IDirectDrawFactory *iface, REFIID riid,
169         void **obj)
170 {
171     TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj);
172 
173     if (IsEqualGUID(riid, &IID_IUnknown)
174         || IsEqualGUID(riid, &IID_IDirectDrawFactory))
175     {
176         IDirectDrawFactory_AddRef(iface);
177         *obj = iface;
178         return S_OK;
179     }
180 
181     WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
182 
183     *obj = NULL;
184     return E_NOINTERFACE;
185 }
186 
187 /*******************************************************************************
188  * IDirectDrawFactory::AddRef
189  *
190  *******************************************************************************/
191 static ULONG WINAPI IDirectDrawFactoryImpl_AddRef(IDirectDrawFactory *iface)
192 {
193     IDirectDrawFactoryImpl *This = impl_from_IDirectDrawFactory(iface);
194     ULONG ref = InterlockedIncrement(&This->ref);
195 
196     TRACE("(%p)->() incrementing from %d.\n", This, ref - 1);
197 
198     return ref;
199 }
200 
201 /*******************************************************************************
202  * IDirectDrawFactory::Release
203  *
204  *******************************************************************************/
205 static ULONG WINAPI IDirectDrawFactoryImpl_Release(IDirectDrawFactory *iface)
206 {
207     IDirectDrawFactoryImpl *This = impl_from_IDirectDrawFactory(iface);
208     ULONG ref = InterlockedDecrement(&This->ref);
209 
210     TRACE("(%p)->() decrementing from %d.\n", This, ref+1);
211 
212     if (ref == 0)
213         HeapFree(GetProcessHeap(), 0, This);
214 
215     return ref;
216 }
217 
218 /*******************************************************************************
219  * IDirectDrawFactoryImpl_DirectDrawEnumerate
220  *******************************************************************************/
221 static HRESULT WINAPI
222 IDirectDrawFactoryImpl_DirectDrawEnumerate(IDirectDrawFactory* iface,
223                                            LPDDENUMCALLBACKW lpCallback,
224                                            LPVOID lpContext)
225 {
226     FIXME("Stub!\n");
227     return E_FAIL;
228 }
229 
230 
231 /*******************************************************************************
232  * Direct Draw Factory VTable
233  *******************************************************************************/
234 static const IDirectDrawFactoryVtbl IDirectDrawFactory_Vtbl =
235 {
236     IDirectDrawFactoryImpl_QueryInterface,
237     IDirectDrawFactoryImpl_AddRef,
238     IDirectDrawFactoryImpl_Release,
239     IDirectDrawFactoryImpl_CreateDirectDraw,
240     IDirectDrawFactoryImpl_DirectDrawEnumerate,
241 };
242 
243 /***********************************************************************
244  * CreateDirectDrawFactory
245  *
246  ***********************************************************************/
247 static HRESULT
248 CreateDirectDrawFactory(IUnknown* UnkOuter, REFIID iid, void **obj)
249 {
250     HRESULT hr;
251     IDirectDrawFactoryImpl *This = NULL;
252 
253     TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj);
254 
255     if (UnkOuter != NULL)
256         return CLASS_E_NOAGGREGATION;
257 
258     This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawFactoryImpl));
259 
260     if(!This)
261     {
262         ERR("Out of memory when creating DirectDraw\n");
263         return E_OUTOFMEMORY;
264     }
265 
266     This->IDirectDrawFactory_iface.lpVtbl = &IDirectDrawFactory_Vtbl;
267 
268     hr = IDirectDrawFactory_QueryInterface(&This->IDirectDrawFactory_iface, iid,  obj);
269 
270     if (FAILED(hr))
271         HeapFree(GetProcessHeap(), 0, This);
272 
273     return hr;
274 }
275 
276 
277 /*******************************************************************************
278  * DllCanUnloadNow [DDRAWEX.@]  Determines whether the DLL is in use.
279  */
280 HRESULT WINAPI DllCanUnloadNow(void)
281 {
282     return S_FALSE;
283 }
284 
285 
286 /*******************************************************************************
287  * DllGetClassObject [DDRAWEX.@]
288  */
289 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
290 {
291     IClassFactoryImpl *factory;
292 
293     TRACE("ddrawex (%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
294 
295     if (!IsEqualGUID( &IID_IClassFactory, riid)
296         && !IsEqualGUID( &IID_IUnknown, riid))
297         return E_NOINTERFACE;
298 
299     if (!IsEqualGUID(&CLSID_DirectDrawFactory, rclsid))
300     {
301         FIXME("%s: no class found.\n", debugstr_guid(rclsid));
302         return CLASS_E_CLASSNOTAVAILABLE;
303     }
304 
305     factory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*factory));
306     if (factory == NULL) return E_OUTOFMEMORY;
307 
308     factory->IClassFactory_iface.lpVtbl = &IClassFactory_Vtbl;
309     factory->ref = 1;
310 
311     factory->pfnCreateInstance = CreateDirectDrawFactory;
312 
313     *ppv = factory;
314 
315     return S_OK;
316 }
317 
318 
319 /***********************************************************************
320  * DllMain
321  */
322 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID lpv)
323 {
324     switch (reason)
325     {
326     case DLL_PROCESS_ATTACH:
327         instance = hInstDLL;
328         DisableThreadLibraryCalls( hInstDLL );
329         break;
330     }
331     return TRUE;
332 }
333 
334 /***********************************************************************
335  *              DllRegisterServer (DDRAWEX.@)
336  */
337 HRESULT WINAPI DllRegisterServer(void)
338 {
339     return __wine_register_resources( instance );
340 }
341 
342 /***********************************************************************
343  *              DllUnregisterServer (DDRAWEX.@)
344  */
345 HRESULT WINAPI DllUnregisterServer(void)
346 {
347     return __wine_unregister_resources( instance );
348 }
349 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.