| /* DirectDrawEx |
| * |
| * Copyright 2006 Ulrich Czekalla |
| * |
| * This file contains the (internal) driver registration functions, |
| * driver enumeration APIs and DirectDraw creation functions. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| |
| #include "wine/debug.h" |
| |
| #define COBJMACROS |
| |
| #include "winbase.h" |
| #include "wingdi.h" |
| |
| #include "ddraw.h" |
| |
| #include "initguid.h" |
| #include "ddrawex_private.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(ddrawex); |
| |
| |
| /******************************************************************************* |
| * IDirectDrawClassFactory::QueryInterface |
| * |
| *******************************************************************************/ |
| static HRESULT WINAPI |
| IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface, |
| REFIID riid, |
| void **obj) |
| { |
| IClassFactoryImpl *This = (IClassFactoryImpl*) iface; |
| |
| TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); |
| |
| if (IsEqualGUID(riid, &IID_IUnknown) |
| || IsEqualGUID(riid, &IID_IClassFactory)) |
| { |
| IClassFactory_AddRef(iface); |
| *obj = This; |
| return S_OK; |
| } |
| |
| WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),obj); |
| return E_NOINTERFACE; |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawClassFactory::AddRef |
| * |
| *******************************************************************************/ |
| static ULONG WINAPI |
| IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface) |
| { |
| IClassFactoryImpl *This = (IClassFactoryImpl*) iface; |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->() incrementing from %d.\n", This, ref - 1); |
| |
| return ref; |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawClassFactory::Release |
| * |
| *******************************************************************************/ |
| static ULONG WINAPI |
| IDirectDrawClassFactoryImpl_Release(IClassFactory *iface) |
| { |
| IClassFactoryImpl *This = (IClassFactoryImpl*) iface; |
| ULONG ref = InterlockedDecrement(&This->ref); |
| TRACE("(%p)->() decrementing from %d.\n", This, ref+1); |
| |
| if (ref == 0) |
| HeapFree(GetProcessHeap(), 0, This); |
| |
| return ref; |
| } |
| |
| |
| /******************************************************************************* |
| * IDirectDrawClassFactory::CreateInstance |
| * |
| *******************************************************************************/ |
| static HRESULT WINAPI |
| IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface, |
| IUnknown *UnkOuter, |
| REFIID riid, |
| void **obj) |
| { |
| IClassFactoryImpl *This = (IClassFactoryImpl*) iface; |
| |
| TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj); |
| |
| return This->pfnCreateInstance(UnkOuter, riid, obj); |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawClassFactory::LockServer |
| * |
| *******************************************************************************/ |
| static HRESULT WINAPI |
| IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock) |
| { |
| IClassFactoryImpl *This = (IClassFactoryImpl*) iface; |
| FIXME("(%p)->(%d),stub!\n",This,dolock); |
| return S_OK; |
| } |
| |
| |
| /******************************************************************************* |
| * The class factory VTable |
| *******************************************************************************/ |
| static const IClassFactoryVtbl IClassFactory_Vtbl = |
| { |
| IDirectDrawClassFactoryImpl_QueryInterface, |
| IDirectDrawClassFactoryImpl_AddRef, |
| IDirectDrawClassFactoryImpl_Release, |
| IDirectDrawClassFactoryImpl_CreateInstance, |
| IDirectDrawClassFactoryImpl_LockServer |
| }; |
| |
| |
| /******************************************************************************* |
| * IDirectDrawFactory::QueryInterface |
| * |
| *******************************************************************************/ |
| static HRESULT WINAPI |
| IDirectDrawFactoryImpl_QueryInterface(IDirectDrawFactory *iface, |
| REFIID riid, |
| void **obj) |
| { |
| IDirectDrawFactoryImpl *This = (IDirectDrawFactoryImpl*) iface; |
| |
| TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); |
| |
| if (IsEqualGUID(riid, &IID_IUnknown) |
| || IsEqualGUID(riid, &IID_IDirectDrawFactory)) |
| { |
| IDirectDrawFactory_AddRef(iface); |
| *obj = This; |
| return S_OK; |
| } |
| |
| WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),obj); |
| return E_NOINTERFACE; |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawFactory::AddRef |
| * |
| *******************************************************************************/ |
| static ULONG WINAPI |
| IDirectDrawFactoryImpl_AddRef(IDirectDrawFactory *iface) |
| { |
| IDirectDrawFactoryImpl *This = (IDirectDrawFactoryImpl*) iface; |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->() incrementing from %d.\n", This, ref - 1); |
| |
| return ref; |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawFactory::Release |
| * |
| *******************************************************************************/ |
| static ULONG WINAPI |
| IDirectDrawFactoryImpl_Release(IDirectDrawFactory *iface) |
| { |
| IDirectDrawFactoryImpl *This = (IDirectDrawFactoryImpl*) iface; |
| ULONG ref = InterlockedDecrement(&This->ref); |
| TRACE("(%p)->() decrementing from %d.\n", This, ref+1); |
| |
| if (ref == 0) |
| HeapFree(GetProcessHeap(), 0, This); |
| |
| return ref; |
| } |
| |
| /******************************************************************************* |
| * IDirectDrawFactoryImpl_DirectDrawEnumerate |
| *******************************************************************************/ |
| static HRESULT WINAPI |
| IDirectDrawFactoryImpl_DirectDrawEnumerate(IDirectDrawFactory* iface, |
| LPDDENUMCALLBACKW lpCallback, |
| LPVOID lpContext) |
| { |
| FIXME("Stub!\n"); |
| return E_FAIL; |
| } |
| |
| |
| /******************************************************************************* |
| * Direct Draw Factory VTable |
| *******************************************************************************/ |
| static const IDirectDrawFactoryVtbl IDirectDrawFactory_Vtbl = |
| { |
| IDirectDrawFactoryImpl_QueryInterface, |
| IDirectDrawFactoryImpl_AddRef, |
| IDirectDrawFactoryImpl_Release, |
| IDirectDrawFactoryImpl_CreateDirectDraw, |
| IDirectDrawFactoryImpl_DirectDrawEnumerate, |
| }; |
| |
| /*********************************************************************** |
| * CreateDirectDrawFactory |
| * |
| ***********************************************************************/ |
| static HRESULT |
| CreateDirectDrawFactory(IUnknown* UnkOuter, REFIID iid, void **obj) |
| { |
| HRESULT hr; |
| IDirectDrawFactoryImpl *This = NULL; |
| |
| TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj); |
| |
| if (UnkOuter != NULL) |
| return CLASS_E_NOAGGREGATION; |
| |
| This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawFactoryImpl)); |
| |
| if(!This) |
| { |
| ERR("Out of memory when creating DirectDraw\n"); |
| return E_OUTOFMEMORY; |
| } |
| |
| This->lpVtbl = &IDirectDrawFactory_Vtbl; |
| |
| hr = IDirectDrawFactory_QueryInterface((IDirectDrawFactory *)This, iid, obj); |
| |
| if (FAILED(hr)) |
| HeapFree(GetProcessHeap(), 0, This); |
| |
| return hr; |
| } |
| |
| |
| /******************************************************************************* |
| * DllCanUnloadNow [DDRAWEX.@] Determines whether the DLL is in use. |
| */ |
| HRESULT WINAPI DllCanUnloadNow(void) |
| { |
| return S_FALSE; |
| } |
| |
| |
| /******************************************************************************* |
| * DllGetClassObject [DDRAWEX.@] |
| */ |
| HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) |
| { |
| IClassFactoryImpl *factory; |
| |
| TRACE("ddrawex (%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); |
| |
| if (!IsEqualGUID( &IID_IClassFactory, riid) |
| && !IsEqualGUID( &IID_IUnknown, riid)) |
| return E_NOINTERFACE; |
| |
| if (!IsEqualGUID(&CLSID_DirectDrawFactory, rclsid)) |
| { |
| FIXME("%s: no class found.\n", debugstr_guid(rclsid)); |
| return CLASS_E_CLASSNOTAVAILABLE; |
| } |
| |
| factory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*factory)); |
| if (factory == NULL) return E_OUTOFMEMORY; |
| |
| factory->lpVtbl = &IClassFactory_Vtbl; |
| factory->ref = 1; |
| |
| factory->pfnCreateInstance = CreateDirectDrawFactory; |
| |
| *ppv = factory; |
| |
| return S_OK; |
| } |
| |
| |
| /*********************************************************************** |
| * DllMain (DDRAWEX.0) |
| * |
| ***********************************************************************/ |
| BOOL WINAPI |
| DllMain(HINSTANCE hInstDLL, |
| DWORD Reason, |
| LPVOID lpv) |
| { |
| TRACE("(%p,%x,%p)\n", hInstDLL, Reason, lpv); |
| return TRUE; |
| } |