Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfactory.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2002 Michael Günnewig 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include <stdarg.h> 00020 00021 #define COBJMACROS 00022 00023 #include "windef.h" 00024 #include "winbase.h" 00025 #include "wingdi.h" 00026 #include "winuser.h" 00027 #include "winerror.h" 00028 #include "ole2.h" 00029 #include "rpcproxy.h" 00030 00031 #include "initguid.h" 00032 #include "vfw.h" 00033 #include "avifile_private.h" 00034 00035 #include "wine/debug.h" 00036 00037 WINE_DEFAULT_DEBUG_CHANNEL(avifile); 00038 00039 HMODULE AVIFILE_hModule = NULL; 00040 00041 static BOOL AVIFILE_bLocked; 00042 static UINT AVIFILE_uUseCount; 00043 00044 static HRESULT WINAPI IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj); 00045 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface); 00046 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface); 00047 static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj); 00048 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock); 00049 00050 static const IClassFactoryVtbl iclassfact = { 00051 IClassFactory_fnQueryInterface, 00052 IClassFactory_fnAddRef, 00053 IClassFactory_fnRelease, 00054 IClassFactory_fnCreateInstance, 00055 IClassFactory_fnLockServer 00056 }; 00057 00058 typedef struct 00059 { 00060 /* IUnknown fields */ 00061 IClassFactory IClassFactory_iface; 00062 DWORD dwRef; 00063 00064 CLSID clsid; 00065 } IClassFactoryImpl; 00066 00067 static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) 00068 { 00069 return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface); 00070 } 00071 00072 static HRESULT AVIFILE_CreateClassFactory(const CLSID *pclsid, const IID *riid, 00073 LPVOID *ppv) 00074 { 00075 IClassFactoryImpl *pClassFactory = NULL; 00076 HRESULT hr; 00077 00078 *ppv = NULL; 00079 00080 pClassFactory = HeapAlloc(GetProcessHeap(), 0, sizeof(*pClassFactory)); 00081 if (pClassFactory == NULL) 00082 return E_OUTOFMEMORY; 00083 00084 pClassFactory->IClassFactory_iface.lpVtbl = &iclassfact; 00085 pClassFactory->dwRef = 0; 00086 pClassFactory->clsid = *pclsid; 00087 00088 hr = IClassFactory_QueryInterface(&pClassFactory->IClassFactory_iface, riid, ppv); 00089 if (FAILED(hr)) { 00090 HeapFree(GetProcessHeap(), 0, pClassFactory); 00091 *ppv = NULL; 00092 } 00093 00094 return hr; 00095 } 00096 00097 static HRESULT WINAPI IClassFactory_fnQueryInterface(LPCLASSFACTORY iface, 00098 REFIID riid,LPVOID *ppobj) 00099 { 00100 TRACE("(%p,%p,%p)\n", iface, riid, ppobj); 00101 00102 if ((IsEqualGUID(&IID_IUnknown, riid)) || 00103 (IsEqualGUID(&IID_IClassFactory, riid))) { 00104 *ppobj = iface; 00105 IClassFactory_AddRef(iface); 00106 return S_OK; 00107 } 00108 00109 return E_NOINTERFACE; 00110 } 00111 00112 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface) 00113 { 00114 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 00115 00116 TRACE("(%p)\n", iface); 00117 00118 return ++(This->dwRef); 00119 } 00120 00121 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface) 00122 { 00123 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 00124 00125 TRACE("(%p)\n", iface); 00126 if ((--(This->dwRef)) > 0) 00127 return This->dwRef; 00128 00129 HeapFree(GetProcessHeap(), 0, This); 00130 00131 return 0; 00132 } 00133 00134 static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface, 00135 LPUNKNOWN pOuter, 00136 REFIID riid,LPVOID *ppobj) 00137 { 00138 IClassFactoryImpl *This = impl_from_IClassFactory(iface); 00139 00140 TRACE("(%p,%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid), 00141 ppobj); 00142 00143 if (ppobj == NULL || pOuter != NULL) 00144 return E_FAIL; 00145 *ppobj = NULL; 00146 00147 if (IsEqualGUID(&CLSID_AVIFile, &This->clsid)) 00148 return AVIFILE_CreateAVIFile(riid,ppobj); 00149 if (IsEqualGUID(&CLSID_ICMStream, &This->clsid)) 00150 return AVIFILE_CreateICMStream(riid,ppobj); 00151 if (IsEqualGUID(&CLSID_WAVFile, &This->clsid)) 00152 return AVIFILE_CreateWAVFile(riid,ppobj); 00153 if (IsEqualGUID(&CLSID_ACMStream, &This->clsid)) 00154 return AVIFILE_CreateACMStream(riid,ppobj); 00155 00156 return E_NOINTERFACE; 00157 } 00158 00159 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock) 00160 { 00161 TRACE("(%p,%d)\n",iface,dolock); 00162 00163 AVIFILE_bLocked = dolock; 00164 00165 return S_OK; 00166 } 00167 00168 LPCWSTR AVIFILE_BasenameW(LPCWSTR szPath) 00169 { 00170 #define SLASH(w) ((w) == '/' || (w) == '\\') 00171 00172 LPCWSTR szCur; 00173 00174 for (szCur = szPath + lstrlenW(szPath); 00175 szCur > szPath && !SLASH(*szCur) && *szCur != ':';) 00176 szCur--; 00177 00178 if (szCur == szPath) 00179 return szCur; 00180 else 00181 return szCur + 1; 00182 00183 #undef SLASH 00184 } 00185 00186 /*********************************************************************** 00187 * DllGetClassObject (AVIFIL32.@) 00188 */ 00189 HRESULT WINAPI DllGetClassObject(REFCLSID pclsid, REFIID piid, LPVOID *ppv) 00190 { 00191 TRACE("(%s,%s,%p)\n", debugstr_guid(pclsid), debugstr_guid(piid), ppv); 00192 00193 if (pclsid == NULL || piid == NULL || ppv == NULL) 00194 return E_FAIL; 00195 00196 return AVIFILE_CreateClassFactory(pclsid,piid,ppv); 00197 } 00198 00199 /***************************************************************************** 00200 * DllCanUnloadNow (AVIFIL32.@) 00201 */ 00202 HRESULT WINAPI DllCanUnloadNow(void) 00203 { 00204 return ((AVIFILE_bLocked || AVIFILE_uUseCount) ? S_FALSE : S_OK); 00205 } 00206 00207 /***************************************************************************** 00208 * DllMain [AVIFIL32.init] 00209 */ 00210 BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved) 00211 { 00212 TRACE("(%p,%d,%p)\n", hInstDll, fdwReason, lpvReserved); 00213 00214 switch (fdwReason) { 00215 case DLL_PROCESS_ATTACH: 00216 DisableThreadLibraryCalls(hInstDll); 00217 AVIFILE_hModule = hInstDll; 00218 break; 00219 case DLL_PROCESS_DETACH: 00220 break; 00221 }; 00222 00223 return TRUE; 00224 } 00225 00226 /*********************************************************************** 00227 * DllRegisterServer (AVIFIL32.@) 00228 */ 00229 HRESULT WINAPI DllRegisterServer(void) 00230 { 00231 return __wine_register_resources( AVIFILE_hModule ); 00232 } 00233 00234 /*********************************************************************** 00235 * DllUnregisterServer (AVIFIL32.@) 00236 */ 00237 HRESULT WINAPI DllUnregisterServer(void) 00238 { 00239 return __wine_unregister_resources( AVIFILE_hModule ); 00240 } Generated on Sun May 27 2012 04:21:27 for ReactOS by
1.7.6.1
|