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

shdocvw_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 doxygen 1.7.6.1

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