1 /* 2 * Copyright 2008 Jacek Caban for CodeWeavers 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #include "initguid.h" 20 21 #include "jscript.h" 22 23 #include "winreg.h" 24 #include "advpub.h" 25 #include "activaut.h" 26 #include "objsafe.h" 27 #include "mshtmhst.h" 28 #include "rpcproxy.h" 29 #include "jscript_classes.h" 30 31 #include "wine/debug.h" 32 33 WINE_DEFAULT_DEBUG_CHANNEL(jscript); 34 35 LONG module_ref = 0; 36 37 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); 38 39 HINSTANCE jscript_hinstance; 40 41 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 42 { 43 *ppv = NULL; 44 45 if(IsEqualGUID(&IID_IUnknown, riid)) { 46 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); 47 *ppv = iface; 48 }else if(IsEqualGUID(&IID_IClassFactory, riid)) { 49 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); 50 *ppv = iface; 51 } 52 53 if(*ppv) { 54 IUnknown_AddRef((IUnknown*)*ppv); 55 return S_OK; 56 } 57 58 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 59 return E_NOINTERFACE; 60 } 61 62 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) 63 { 64 TRACE("(%p)\n", iface); 65 return 2; 66 } 67 68 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) 69 { 70 TRACE("(%p)\n", iface); 71 return 1; 72 } 73 74 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) 75 { 76 TRACE("(%p)->(%x)\n", iface, fLock); 77 78 if(fLock) 79 lock_module(); 80 else 81 unlock_module(); 82 83 return S_OK; 84 } 85 86 static HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, 87 REFIID riid, void **ppv) 88 { 89 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); 90 91 if(outer) { 92 *ppv = NULL; 93 return CLASS_E_NOAGGREGATION; 94 } 95 96 return create_jscript_object(FALSE, riid, ppv); 97 } 98 99 static const IClassFactoryVtbl JScriptFactoryVtbl = { 100 ClassFactory_QueryInterface, 101 ClassFactory_AddRef, 102 ClassFactory_Release, 103 JScriptFactory_CreateInstance, 104 ClassFactory_LockServer 105 }; 106 107 static IClassFactory JScriptFactory = { &JScriptFactoryVtbl }; 108 109 static HRESULT WINAPI JScriptEncodeFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, 110 REFIID riid, void **ppv) 111 { 112 TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); 113 114 if(outer) { 115 *ppv = NULL; 116 return CLASS_E_NOAGGREGATION; 117 } 118 119 return create_jscript_object(TRUE, riid, ppv); 120 } 121 122 static const IClassFactoryVtbl JScriptEncodeFactoryVtbl = { 123 ClassFactory_QueryInterface, 124 ClassFactory_AddRef, 125 ClassFactory_Release, 126 JScriptEncodeFactory_CreateInstance, 127 ClassFactory_LockServer 128 }; 129 130 static IClassFactory JScriptEncodeFactory = { &JScriptEncodeFactoryVtbl }; 131 132 /****************************************************************** 133 * DllMain (jscript.@) 134 */ 135 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) 136 { 137 TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv); 138 139 switch(fdwReason) { 140 case DLL_PROCESS_ATTACH: 141 DisableThreadLibraryCalls(hInstDLL); 142 jscript_hinstance = hInstDLL; 143 if(!init_strings()) 144 return FALSE; 145 break; 146 case DLL_PROCESS_DETACH: 147 if (lpv) break; 148 free_strings(); 149 } 150 151 return TRUE; 152 } 153 154 /*********************************************************************** 155 * DllGetClassObject (jscript.@) 156 */ 157 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 158 { 159 if(IsEqualGUID(&CLSID_JScript, rclsid)) { 160 TRACE("(CLSID_JScript %s %p)\n", debugstr_guid(riid), ppv); 161 return IClassFactory_QueryInterface(&JScriptFactory, riid, ppv); 162 } 163 164 if(IsEqualGUID(&CLSID_JScriptEncode, rclsid)) { 165 TRACE("(CLSID_JScriptEncode %s %p)\n", debugstr_guid(riid), ppv); 166 return IClassFactory_QueryInterface(&JScriptEncodeFactory, riid, ppv); 167 } 168 169 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 170 return CLASS_E_CLASSNOTAVAILABLE; 171 } 172 173 /*********************************************************************** 174 * DllCanUnloadNow (jscript.@) 175 */ 176 HRESULT WINAPI DllCanUnloadNow(void) 177 { 178 TRACE("() ref=%d\n", module_ref); 179 180 return module_ref ? S_FALSE : S_OK; 181 } 182 183 /*********************************************************************** 184 * DllRegisterServer (jscript.@) 185 */ 186 HRESULT WINAPI DllRegisterServer(void) 187 { 188 TRACE("()\n"); 189 return __wine_register_resources(jscript_hinstance); 190 } 191 192 /*********************************************************************** 193 * DllUnregisterServer (jscript.@) 194 */ 195 HRESULT WINAPI DllUnregisterServer(void) 196 { 197 TRACE("()\n"); 198 return __wine_unregister_resources(jscript_hinstance); 199 } 200