1 /* 2 * DirectX Files Functions (D3DXOF.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 "winreg.h" 30 #include "winerror.h" 31 32 #include "ole2.h" 33 #include "rpcproxy.h" 34 #include "uuids.h" 35 36 #include "d3dxof_private.h" 37 #include "dxfile.h" 38 39 #include "wine/debug.h" 40 41 WINE_DEFAULT_DEBUG_CHANNEL(d3dxof); 42 43 static HINSTANCE instance; 44 45 /* For the moment, do nothing here. */ 46 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) 47 { 48 switch(fdwReason) { 49 case DLL_PROCESS_ATTACH: 50 instance = hInstDLL; 51 DisableThreadLibraryCalls(hInstDLL); 52 break; 53 } 54 return TRUE; 55 } 56 57 /****************************************************************************** 58 * DirectX File ClassFactory 59 */ 60 typedef struct { 61 IClassFactory IClassFactory_iface; 62 63 LONG ref; 64 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj); 65 } IClassFactoryImpl; 66 67 static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) 68 { 69 return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface); 70 } 71 72 struct object_creation_info 73 { 74 const CLSID *clsid; 75 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj); 76 }; 77 78 static const struct object_creation_info object_creation[] = 79 { 80 { &CLSID_CDirectXFile, IDirectXFileImpl_Create }, 81 }; 82 83 static HRESULT WINAPI XFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid, LPVOID *ppobj) 84 { 85 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 86 87 if (IsEqualGUID(riid, &IID_IUnknown) 88 || IsEqualGUID(riid, &IID_IClassFactory)) 89 { 90 IClassFactory_AddRef(iface); 91 *ppobj = &This->IClassFactory_iface; 92 return S_OK; 93 } 94 95 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj); 96 return E_NOINTERFACE; 97 } 98 99 static ULONG WINAPI XFCF_AddRef(LPCLASSFACTORY iface) 100 { 101 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 102 return InterlockedIncrement(&This->ref); 103 } 104 105 static ULONG WINAPI XFCF_Release(LPCLASSFACTORY iface) 106 { 107 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 108 109 ULONG ref = InterlockedDecrement(&This->ref); 110 111 if (ref == 0) 112 HeapFree(GetProcessHeap(), 0, This); 113 114 return ref; 115 } 116 117 static HRESULT WINAPI XFCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) 118 { 119 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 120 HRESULT hres; 121 LPUNKNOWN punk; 122 123 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); 124 125 *ppobj = NULL; 126 hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk); 127 if (SUCCEEDED(hres)) { 128 hres = IUnknown_QueryInterface(punk, riid, ppobj); 129 IUnknown_Release(punk); 130 } 131 return hres; 132 } 133 134 static HRESULT WINAPI XFCF_LockServer(LPCLASSFACTORY iface, BOOL dolock) 135 { 136 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 137 FIXME("(%p)->(%d), stub!\n",This,dolock); 138 return S_OK; 139 } 140 141 static const IClassFactoryVtbl XFCF_Vtbl = 142 { 143 XFCF_QueryInterface, 144 XFCF_AddRef, 145 XFCF_Release, 146 XFCF_CreateInstance, 147 XFCF_LockServer 148 }; 149 150 /*********************************************************************** 151 * DirectXFileCreate (D3DXOF.@) 152 */ 153 HRESULT WINAPI DirectXFileCreate(LPDIRECTXFILE* lplpDirectXFile) 154 { 155 HRESULT hr; 156 157 TRACE("(%p)\n", lplpDirectXFile); 158 159 if (!lplpDirectXFile) 160 return DXFILEERR_BADVALUE; 161 162 hr = IDirectXFileImpl_Create(NULL, (LPVOID)lplpDirectXFile); 163 164 if (FAILED(hr)) 165 return DXFILEERR_BADALLOC; 166 167 return S_OK; 168 } 169 170 /******************************************************************************* 171 * DllGetClassObject [D3DXOF.@] 172 * Retrieves class object from a DLL object 173 * 174 * NOTES 175 * Docs say returns STDAPI 176 * 177 * PARAMS 178 * rclsid [I] CLSID for the class object 179 * riid [I] Reference to identifier of interface for class object 180 * ppv [O] Address of variable to receive interface pointer for riid 181 * 182 * RETURNS 183 * Success: S_OK 184 * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, 185 * E_UNEXPECTED 186 */ 187 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 188 { 189 unsigned int i; 190 IClassFactoryImpl *factory; 191 192 TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 193 194 if ( !IsEqualGUID( &IID_IClassFactory, riid ) 195 && ! IsEqualGUID( &IID_IUnknown, riid) ) 196 return E_NOINTERFACE; 197 198 for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) 199 { 200 if (IsEqualGUID(object_creation[i].clsid, rclsid)) 201 break; 202 } 203 204 if (i == sizeof(object_creation)/sizeof(object_creation[0])) 205 { 206 FIXME("%s: no class found.\n", debugstr_guid(rclsid)); 207 return CLASS_E_CLASSNOTAVAILABLE; 208 } 209 210 factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory)); 211 if (factory == NULL) return E_OUTOFMEMORY; 212 213 factory->IClassFactory_iface.lpVtbl = &XFCF_Vtbl; 214 factory->ref = 1; 215 216 factory->pfnCreateInstance = object_creation[i].pfnCreateInstance; 217 218 *ppv = &(factory->IClassFactory_iface); 219 return S_OK; 220 } 221 222 /*********************************************************************** 223 * DllCanUnloadNow (D3DXOF.@) 224 */ 225 HRESULT WINAPI DllCanUnloadNow(void) 226 { 227 return S_FALSE; 228 } 229 230 /*********************************************************************** 231 * DllRegisterServer (D3DXOF.@) 232 */ 233 HRESULT WINAPI DllRegisterServer(void) 234 { 235 return __wine_register_resources( instance ); 236 } 237 238 /*********************************************************************** 239 * DllUnregisterServer (D3DXOF.@) 240 */ 241 HRESULT WINAPI DllUnregisterServer(void) 242 { 243 return __wine_unregister_resources( instance ); 244 } 245