* Sync up to trunk head (r64829).
[reactos.git] / dll / win32 / avifil32 / factory.c
index d1246e8..d0eb1ef 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <stdarg.h>
-
-#define COBJMACROS
-
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "winerror.h"
-#include "ole2.h"
-
-#include "initguid.h"
-#include "vfw.h"
 #include "avifile_private.h"
 
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(avifile);
+#include <rpcproxy.h>
 
 HMODULE AVIFILE_hModule   = NULL;
 
@@ -57,12 +42,17 @@ static const IClassFactoryVtbl iclassfact = {
 typedef struct
 {
   /* IUnknown fields */
-  const IClassFactoryVtbl *lpVtbl;
+  IClassFactory IClassFactory_iface;
   DWORD         dwRef;
 
   CLSID  clsid;
 } IClassFactoryImpl;
 
+static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
+{
+  return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
+}
+
 static HRESULT AVIFILE_CreateClassFactory(const CLSID *pclsid, const IID *riid,
                                          LPVOID *ppv)
 {
@@ -75,11 +65,11 @@ static HRESULT AVIFILE_CreateClassFactory(const CLSID *pclsid, const IID *riid,
   if (pClassFactory == NULL)
     return E_OUTOFMEMORY;
 
-  pClassFactory->lpVtbl    = &iclassfact;
+  pClassFactory->IClassFactory_iface.lpVtbl = &iclassfact;
   pClassFactory->dwRef     = 0;
   pClassFactory->clsid     = *pclsid;
 
-  hr = IClassFactory_QueryInterface((IClassFactory*)pClassFactory, riid, ppv);
+  hr = IClassFactory_QueryInterface(&pClassFactory->IClassFactory_iface, riid, ppv);
   if (FAILED(hr)) {
     HeapFree(GetProcessHeap(), 0, pClassFactory);
     *ppv = NULL;
@@ -105,7 +95,7 @@ static HRESULT WINAPI IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,
 
 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
 {
-  IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+  IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 
   TRACE("(%p)\n", iface);
 
@@ -114,7 +104,7 @@ static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
 
 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
 {
-  IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+  IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 
   TRACE("(%p)\n", iface);
   if ((--(This->dwRef)) > 0)
@@ -129,21 +119,28 @@ static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,
                                                     LPUNKNOWN pOuter,
                                                     REFIID riid,LPVOID *ppobj)
 {
-  IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+  IClassFactoryImpl *This = impl_from_IClassFactory(iface);
 
   TRACE("(%p,%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid),
        ppobj);
 
-  if (ppobj == NULL || pOuter != NULL)
-    return E_FAIL;
+  if (!ppobj)
+    return E_INVALIDARG;
   *ppobj = NULL;
 
+  if (pOuter && !IsEqualGUID(&IID_IUnknown, riid))
+    return E_INVALIDARG;
+
   if (IsEqualGUID(&CLSID_AVIFile, &This->clsid))
-    return AVIFILE_CreateAVIFile(riid,ppobj);
+    return AVIFILE_CreateAVIFile(pOuter, riid, ppobj);
+  if (IsEqualGUID(&CLSID_WAVFile, &This->clsid))
+    return AVIFILE_CreateWAVFile(pOuter, riid, ppobj);
+
+  if (pOuter)
+    return CLASS_E_NOAGGREGATION;
+
   if (IsEqualGUID(&CLSID_ICMStream, &This->clsid))
     return AVIFILE_CreateICMStream(riid,ppobj);
-  if (IsEqualGUID(&CLSID_WAVFile, &This->clsid))
-    return AVIFILE_CreateWAVFile(riid,ppobj);
   if (IsEqualGUID(&CLSID_ACMStream, &This->clsid))
     return AVIFILE_CreateACMStream(riid,ppobj);
 
@@ -210,9 +207,23 @@ BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
     DisableThreadLibraryCalls(hInstDll);
     AVIFILE_hModule = hInstDll;
     break;
-  case DLL_PROCESS_DETACH:
-    break;
   };
 
   return TRUE;
 }
+
+/***********************************************************************
+ *             DllRegisterServer (AVIFIL32.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    return __wine_register_resources( AVIFILE_hModule );
+}
+
+/***********************************************************************
+ *             DllUnregisterServer (AVIFIL32.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    return __wine_unregister_resources( AVIFILE_hModule );
+}