1 /* 2 * WUAPI implementation 3 * 4 * Copyright 2008 Hans Leidekker 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 #define COBJMACROS 22 23 #include <stdarg.h> 24 25 #include "windef.h" 26 #include "winbase.h" 27 #include "winuser.h" 28 #include "ole2.h" 29 #include "rpcproxy.h" 30 #include "wuapi.h" 31 32 #include "wine/debug.h" 33 #include "wuapi_private.h" 34 35 WINE_DEFAULT_DEBUG_CHANNEL(wuapi); 36 37 typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj ); 38 39 typedef struct _wucf 40 { 41 IClassFactory IClassFactory_iface; 42 fnCreateInstance pfnCreateInstance; 43 } wucf; 44 45 static inline wucf *impl_from_IClassFactory( IClassFactory *iface ) 46 { 47 return CONTAINING_RECORD(iface, wucf, IClassFactory_iface); 48 } 49 50 static HRESULT WINAPI wucf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) 51 { 52 if (IsEqualGUID(riid, &IID_IUnknown) || 53 IsEqualGUID(riid, &IID_IClassFactory)) 54 { 55 IClassFactory_AddRef( iface ); 56 *ppobj = iface; 57 return S_OK; 58 } 59 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 60 return E_NOINTERFACE; 61 } 62 63 static ULONG WINAPI wucf_AddRef( IClassFactory *iface ) 64 { 65 return 2; 66 } 67 68 static ULONG WINAPI wucf_Release( IClassFactory *iface ) 69 { 70 return 1; 71 } 72 73 static HRESULT WINAPI wucf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, 74 REFIID riid, LPVOID *ppobj ) 75 { 76 wucf *This = impl_from_IClassFactory( iface ); 77 HRESULT r; 78 IUnknown *punk; 79 80 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); 81 82 *ppobj = NULL; 83 84 if (pOuter) 85 return CLASS_E_NOAGGREGATION; 86 87 r = This->pfnCreateInstance( (LPVOID *)&punk ); 88 if (FAILED(r)) 89 return r; 90 91 r = IUnknown_QueryInterface( punk, riid, ppobj ); 92 IUnknown_Release( punk ); 93 return r; 94 } 95 96 static HRESULT WINAPI wucf_LockServer( IClassFactory *iface, BOOL dolock ) 97 { 98 FIXME("(%p)->(%d)\n", iface, dolock); 99 return S_OK; 100 } 101 102 static const struct IClassFactoryVtbl wucf_vtbl = 103 { 104 wucf_QueryInterface, 105 wucf_AddRef, 106 wucf_Release, 107 wucf_CreateInstance, 108 wucf_LockServer 109 }; 110 111 static wucf sessioncf = { { &wucf_vtbl }, UpdateSession_create }; 112 static wucf updatescf = { { &wucf_vtbl }, AutomaticUpdates_create }; 113 static wucf sysinfocf = { { &wucf_vtbl }, SystemInformation_create }; 114 115 static HINSTANCE instance; 116 117 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) 118 { 119 switch(reason) 120 { 121 case DLL_WINE_PREATTACH: 122 return FALSE; /* prefer native version */ 123 case DLL_PROCESS_ATTACH: 124 instance = hinst; 125 DisableThreadLibraryCalls( hinst ); 126 break; 127 } 128 return TRUE; 129 } 130 131 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) 132 { 133 IClassFactory *cf = NULL; 134 135 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); 136 137 if (IsEqualGUID( rclsid, &CLSID_UpdateSession )) 138 { 139 cf = &sessioncf.IClassFactory_iface; 140 } 141 else if (IsEqualGUID( rclsid, &CLSID_AutomaticUpdates )) 142 { 143 cf = &updatescf.IClassFactory_iface; 144 } 145 else if (IsEqualGUID( rclsid, &CLSID_SystemInformation )) 146 { 147 cf = &sysinfocf.IClassFactory_iface; 148 } 149 if (!cf) return CLASS_E_CLASSNOTAVAILABLE; 150 return IClassFactory_QueryInterface( cf, iid, ppv ); 151 } 152 153 HRESULT WINAPI DllCanUnloadNow( void ) 154 { 155 return S_FALSE; 156 } 157 158 /*********************************************************************** 159 * DllRegisterServer (WUAPI.@) 160 */ 161 HRESULT WINAPI DllRegisterServer(void) 162 { 163 return __wine_register_resources( instance ); 164 } 165 166 /*********************************************************************** 167 * DllUnregisterServer (WUAPI.@) 168 */ 169 HRESULT WINAPI DllUnregisterServer(void) 170 { 171 return __wine_unregister_resources( instance ); 172 } 173