ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

factory.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.