Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshdocvw_main.c
Go to the documentation of this file.
00001 /* 00002 * SHDOCVW - Internet Explorer Web Control 00003 * 00004 * Copyright 2001 John R. Sheets (for CodeWeavers) 00005 * Copyright 2004 Mike McCormack (for CodeWeavers) 00006 * Copyright 2008 Detlef Riekenberg 00007 * 00008 * This library is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * This library is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00021 */ 00022 00023 #include "config.h" 00024 00025 #include <stdarg.h> 00026 #include <stdio.h> 00027 00028 #include "wine/unicode.h" 00029 #include "wine/debug.h" 00030 00031 #include "shdocvw.h" 00032 00033 #include "winreg.h" 00034 #include "shlwapi.h" 00035 #include "wininet.h" 00036 00037 #include "initguid.h" 00038 00039 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); 00040 00041 LONG SHDOCVW_refCount = 0; 00042 00043 HINSTANCE shdocvw_hinstance = 0; 00044 static HMODULE SHDOCVW_hshell32 = 0; 00045 static ITypeInfo *wb_typeinfo = NULL; 00046 00047 HRESULT get_typeinfo(ITypeInfo **typeinfo) 00048 { 00049 ITypeLib *typelib; 00050 HRESULT hres; 00051 00052 if(wb_typeinfo) { 00053 *typeinfo = wb_typeinfo; 00054 return S_OK; 00055 } 00056 00057 hres = LoadRegTypeLib(&LIBID_SHDocVw, 1, 1, LOCALE_SYSTEM_DEFAULT, &typelib); 00058 if(FAILED(hres)) { 00059 ERR("LoadRegTypeLib failed: %08x\n", hres); 00060 return hres; 00061 } 00062 00063 hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IWebBrowser2, &wb_typeinfo); 00064 ITypeLib_Release(typelib); 00065 00066 *typeinfo = wb_typeinfo; 00067 return hres; 00068 } 00069 00070 const char *debugstr_variant(const VARIANT *v) 00071 { 00072 if(!v) 00073 return "(null)"; 00074 00075 switch(V_VT(v)) { 00076 case VT_EMPTY: 00077 return "{VT_EMPTY}"; 00078 case VT_NULL: 00079 return "{VT_NULL}"; 00080 case VT_I4: 00081 return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v)); 00082 case VT_R8: 00083 return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v)); 00084 case VT_BSTR: 00085 return wine_dbg_sprintf("{VT_BSTR: %s}", debugstr_w(V_BSTR(v))); 00086 case VT_DISPATCH: 00087 return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v)); 00088 case VT_BOOL: 00089 return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v)); 00090 default: 00091 return wine_dbg_sprintf("{vt %d}", V_VT(v)); 00092 } 00093 } 00094 00095 /************************************************************************* 00096 * SHDOCVW DllMain 00097 */ 00098 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) 00099 { 00100 TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad); 00101 switch (fdwReason) 00102 { 00103 case DLL_PROCESS_ATTACH: 00104 shdocvw_hinstance = hinst; 00105 register_iewindow_class(); 00106 break; 00107 case DLL_PROCESS_DETACH: 00108 if (SHDOCVW_hshell32) FreeLibrary(SHDOCVW_hshell32); 00109 unregister_iewindow_class(); 00110 if(wb_typeinfo) 00111 ITypeInfo_Release(wb_typeinfo); 00112 break; 00113 } 00114 return TRUE; 00115 } 00116 00117 /************************************************************************* 00118 * DllCanUnloadNow (SHDOCVW.@) 00119 */ 00120 HRESULT WINAPI DllCanUnloadNow(void) 00121 { 00122 return SHDOCVW_refCount ? S_FALSE : S_OK; 00123 } 00124 00125 /*********************************************************************** 00126 * DllGetVersion (SHDOCVW.@) 00127 */ 00128 HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) 00129 { 00130 if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n"); 00131 00132 /* this is what IE6 on Windows 98 reports */ 00133 info->dwMajorVersion = 6; 00134 info->dwMinorVersion = 0; 00135 info->dwBuildNumber = 2600; 00136 info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; 00137 00138 return NOERROR; 00139 } 00140 00141 /************************************************************************* 00142 * DllInstall (SHDOCVW.@) 00143 */ 00144 HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline) 00145 { 00146 FIXME("(%s, %s): stub!\n", bInstall ? "TRUE":"FALSE", debugstr_w(cmdline)); 00147 00148 return S_OK; 00149 } 00150 00151 /************************************************************************* 00152 * SHDOCVW_LoadShell32 00153 * 00154 * makes sure the handle to shell32 is valid 00155 */ 00156 static BOOL SHDOCVW_LoadShell32(void) 00157 { 00158 if (SHDOCVW_hshell32) 00159 return TRUE; 00160 return ((SHDOCVW_hshell32 = LoadLibraryA("shell32.dll")) != NULL); 00161 } 00162 00163 /*********************************************************************** 00164 * @ (SHDOCVW.110) 00165 * 00166 * Called by Win98 explorer.exe main binary, definitely has 0 00167 * parameters. 00168 */ 00169 DWORD WINAPI WinList_Init(void) 00170 { 00171 FIXME("(), stub!\n"); 00172 return 0x0deadfeed; 00173 } 00174 00175 /*********************************************************************** 00176 * @ (SHDOCVW.118) 00177 * 00178 * Called by Win98 explorer.exe main binary, definitely has only one 00179 * parameter. 00180 */ 00181 static BOOL (WINAPI *pShellDDEInit)(BOOL start) = NULL; 00182 00183 BOOL WINAPI ShellDDEInit(BOOL start) 00184 { 00185 TRACE("(%d)\n", start); 00186 00187 if (!pShellDDEInit) 00188 { 00189 if (!SHDOCVW_LoadShell32()) 00190 return FALSE; 00191 pShellDDEInit = (void *)GetProcAddress(SHDOCVW_hshell32, (LPCSTR)188); 00192 } 00193 00194 if (pShellDDEInit) 00195 return pShellDDEInit(start); 00196 else 00197 return FALSE; 00198 } 00199 00200 /*********************************************************************** 00201 * @ (SHDOCVW.125) 00202 * 00203 * Called by Win98 explorer.exe main binary, definitely has 0 00204 * parameters. 00205 */ 00206 DWORD WINAPI RunInstallUninstallStubs(void) 00207 { 00208 FIXME("(), stub!\n"); 00209 return 0x0deadbee; 00210 } 00211 00212 /*********************************************************************** 00213 * SetQueryNetSessionCount (SHDOCVW.@) 00214 */ 00215 DWORD WINAPI SetQueryNetSessionCount(DWORD arg) 00216 { 00217 FIXME("(%u), stub!\n", arg); 00218 return 0; 00219 } 00220 00221 /********************************************************************** 00222 * Some forwards (by ordinal) to SHLWAPI 00223 */ 00224 00225 static void* fetch_shlwapi_ordinal(UINT_PTR ord) 00226 { 00227 static const WCHAR shlwapiW[] = {'s','h','l','w','a','p','i','.','d','l','l','\0'}; 00228 static HANDLE h; 00229 00230 if (!h && !(h = GetModuleHandleW(shlwapiW))) return NULL; 00231 return (void*)GetProcAddress(h, (const char*)ord); 00232 } 00233 00234 /****************************************************************** 00235 * WhichPlatformFORWARD (SHDOCVW.@) 00236 */ 00237 DWORD WINAPI WhichPlatformFORWARD(void) 00238 { 00239 static DWORD (WINAPI *p)(void); 00240 00241 if (p || (p = fetch_shlwapi_ordinal(276))) return p(); 00242 return 1; /* not integrated, see shlwapi.WhichPlatform */ 00243 } 00244 00245 /****************************************************************** 00246 * StopWatchModeFORWARD (SHDOCVW.@) 00247 */ 00248 void WINAPI StopWatchModeFORWARD(void) 00249 { 00250 static void (WINAPI *p)(void); 00251 00252 if (p || (p = fetch_shlwapi_ordinal(241))) p(); 00253 } 00254 00255 /****************************************************************** 00256 * StopWatchFlushFORWARD (SHDOCVW.@) 00257 */ 00258 void WINAPI StopWatchFlushFORWARD(void) 00259 { 00260 static void (WINAPI *p)(void); 00261 00262 if (p || (p = fetch_shlwapi_ordinal(242))) p(); 00263 } 00264 00265 /****************************************************************** 00266 * StopWatchWFORWARD (SHDOCVW.@) 00267 */ 00268 DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown, 00269 DWORD dwMode, DWORD dwTimeStamp) 00270 { 00271 static DWORD (WINAPI *p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD); 00272 00273 if (p || (p = fetch_shlwapi_ordinal(243))) 00274 return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp); 00275 return ERROR_CALL_NOT_IMPLEMENTED; 00276 } 00277 00278 /****************************************************************** 00279 * StopWatchAFORWARD (SHDOCVW.@) 00280 */ 00281 DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown, 00282 DWORD dwMode, DWORD dwTimeStamp) 00283 { 00284 static DWORD (WINAPI *p)(DWORD, LPCSTR, DWORD, DWORD, DWORD); 00285 00286 if (p || (p = fetch_shlwapi_ordinal(244))) 00287 return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp); 00288 return ERROR_CALL_NOT_IMPLEMENTED; 00289 } 00290 00291 /****************************************************************** 00292 * URLSubRegQueryA (SHDOCVW.151) 00293 */ 00294 HRESULT WINAPI URLSubRegQueryA(LPCSTR regpath, LPCSTR name, DWORD type, 00295 LPSTR out, DWORD outlen, DWORD unknown) 00296 { 00297 CHAR buffer[INTERNET_MAX_URL_LENGTH]; 00298 DWORD len; 00299 LONG res; 00300 00301 TRACE("(%s, %s, %d, %p, %d, %d)\n", debugstr_a(regpath), debugstr_a(name), 00302 type, out, outlen, unknown); 00303 00304 if (!out) return S_OK; 00305 00306 len = sizeof(buffer); 00307 res = SHRegGetUSValueA(regpath, name, NULL, buffer, &len, FALSE, NULL, 0); 00308 if (!res) { 00309 lstrcpynA(out, buffer, outlen); 00310 return S_OK; 00311 } 00312 00313 return E_FAIL; 00314 } 00315 00316 /****************************************************************** 00317 * ParseURLFromOutsideSourceW (SHDOCVW.170) 00318 */ 00319 DWORD WINAPI ParseURLFromOutsideSourceW(LPCWSTR url, LPWSTR out, LPDWORD plen, LPDWORD unknown) 00320 { 00321 WCHAR buffer_in[INTERNET_MAX_URL_LENGTH]; 00322 WCHAR buffer_out[INTERNET_MAX_URL_LENGTH]; 00323 LPCWSTR ptr = url; 00324 HRESULT hr; 00325 DWORD needed; 00326 DWORD len; 00327 DWORD res = 0; 00328 00329 00330 TRACE("(%s, %p, %p, %p) len: %d, unknown: 0x%x\n", debugstr_w(url), out, plen, unknown, 00331 plen ? *plen : 0, unknown ? *unknown : 0); 00332 00333 if (!PathIsURLW(ptr)) { 00334 len = sizeof(buffer_in) / sizeof(buffer_in[0]); 00335 buffer_in[0] = 0; 00336 hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME); 00337 TRACE("got 0x%x with %s\n", hr, debugstr_w(buffer_in)); 00338 if (hr != S_OK) { 00339 /* when we can't guess the scheme, use the default scheme */ 00340 len = sizeof(buffer_in) / sizeof(buffer_in[0]); 00341 hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_DEFAULT); 00342 } 00343 00344 if (hr == S_OK) { 00345 /* we parsed the url to buffer_in */ 00346 ptr = buffer_in; 00347 } 00348 else 00349 { 00350 FIXME("call search hook for %s\n", debugstr_w(ptr)); 00351 } 00352 } 00353 00354 len = sizeof(buffer_out) / sizeof(buffer_out[0]); 00355 buffer_out[0] = '\0'; 00356 hr = UrlCanonicalizeW(ptr, buffer_out, &len, URL_ESCAPE_SPACES_ONLY); 00357 needed = lstrlenW(buffer_out)+1; 00358 TRACE("got 0x%x with %s (need %d)\n", hr, debugstr_w(buffer_out), needed); 00359 00360 if (*plen >= needed) { 00361 if (out != NULL) { 00362 lstrcpyW(out, buffer_out); 00363 res++; 00364 } 00365 needed--; 00366 } 00367 00368 *plen = needed; 00369 00370 TRACE("=> %d\n", res); 00371 return res; 00372 } 00373 00374 /****************************************************************** 00375 * ParseURLFromOutsideSourceA (SHDOCVW.169) 00376 * 00377 * See ParseURLFromOutsideSourceW 00378 */ 00379 DWORD WINAPI ParseURLFromOutsideSourceA(LPCSTR url, LPSTR out, LPDWORD plen, LPDWORD unknown) 00380 { 00381 WCHAR buffer[INTERNET_MAX_URL_LENGTH]; 00382 LPWSTR urlW = NULL; 00383 DWORD needed; 00384 DWORD res; 00385 DWORD len; 00386 00387 TRACE("(%s, %p, %p, %p) len: %d, unknown: 0x%x\n", debugstr_a(url), out, plen, unknown, 00388 plen ? *plen : 0, unknown ? *unknown : 0); 00389 00390 if (url) { 00391 len = MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0); 00392 urlW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 00393 MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, len); 00394 } 00395 00396 len = sizeof(buffer) / sizeof(buffer[0]); 00397 res = ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown); 00398 HeapFree(GetProcessHeap(), 0, urlW); 00399 00400 needed = WideCharToMultiByte(CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL); 00401 00402 res = 0; 00403 if (*plen >= needed) { 00404 if (out != NULL) { 00405 WideCharToMultiByte(CP_ACP, 0, buffer, -1, out, *plen, NULL, NULL); 00406 res = needed; 00407 } 00408 needed--; 00409 } 00410 00411 *plen = needed; 00412 00413 TRACE("=> %d\n", res); 00414 return res; 00415 } 00416 00417 /****************************************************************** 00418 * IEParseDisplayNameWithBCW (SHDOCVW.218) 00419 */ 00420 HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl) 00421 { 00422 /* Guessing at parameter 3 based on IShellFolder's ParseDisplayName */ 00423 FIXME("stub: 0x%x %s %p %p\n",codepage,debugstr_w(lpszDisplayName),pbc,ppidl); 00424 return E_FAIL; 00425 } 00426 00427 /****************************************************************** 00428 * SHRestricted2W (SHDOCVW.159) 00429 */ 00430 DWORD WINAPI SHRestricted2W(DWORD res, LPCWSTR url, DWORD reserved) 00431 { 00432 FIXME("(%d %s %d) stub\n", res, debugstr_w(url), reserved); 00433 return 0; 00434 } 00435 00436 /****************************************************************** 00437 * SHRestricted2A (SHDOCVW.158) 00438 * 00439 * See SHRestricted2W 00440 */ 00441 DWORD WINAPI SHRestricted2A(DWORD restriction, LPCSTR url, DWORD reserved) 00442 { 00443 LPWSTR urlW = NULL; 00444 DWORD res; 00445 00446 TRACE("(%d, %s, %d)\n", restriction, debugstr_a(url), reserved); 00447 if (url) { 00448 DWORD len = MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0); 00449 urlW = heap_alloc(len * sizeof(WCHAR)); 00450 MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, len); 00451 } 00452 res = SHRestricted2W(restriction, urlW, reserved); 00453 heap_free(urlW); 00454 return res; 00455 } 00456 00457 /****************************************************************** 00458 * ImportPrivacySettings (SHDOCVW.@) 00459 * 00460 * Import global and/or per site privacy preferences from an xml file 00461 * 00462 * PARAMS 00463 * filename [I] XML file to use 00464 * pGlobalPrefs [IO] PTR to a usage flag for the global privacy preferences 00465 * pPerSitePrefs [IO] PTR to a usage flag for the per site privacy preferences 00466 * 00467 * RETURNS 00468 * Success: TRUE (the privacy preferences where updated) 00469 * Failure: FALSE (the privacy preferences are unchanged) 00470 * 00471 * NOTES 00472 * Set the flag to TRUE, when the related privacy preferences in the xml file 00473 * should be used (parsed and overwrite the current settings). 00474 * On return, the flag is TRUE, when the related privacy settings where used 00475 * 00476 */ 00477 BOOL WINAPI ImportPrivacySettings(LPCWSTR filename, BOOL *pGlobalPrefs, BOOL * pPerSitePrefs) 00478 { 00479 FIXME("(%s, %p->%d, %p->%d): stub\n", debugstr_w(filename), 00480 pGlobalPrefs, pGlobalPrefs ? *pGlobalPrefs : 0, 00481 pPerSitePrefs, pPerSitePrefs ? *pPerSitePrefs : 0); 00482 00483 if (pGlobalPrefs) *pGlobalPrefs = FALSE; 00484 if (pPerSitePrefs) *pPerSitePrefs = FALSE; 00485 00486 return TRUE; 00487 } Generated on Sat May 26 2012 04:24:52 for ReactOS by
1.7.6.1
|