libs: Merged libwine_unicode into libwine.
[wine] / dlls / shdocvw / shdocvw_main.c
1 /*
2  * SHDOCVW - Internet Explorer Web Control
3  *
4  * Copyright 2001 John R. Sheets (for CodeWeavers)
5  * Copyright 2004 Mike McCormack (for CodeWeavers)
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include "config.h"
23
24 #include <stdarg.h>
25 #include <stdio.h>
26
27 #include "wine/unicode.h"
28 #include "wine/debug.h"
29
30 #include "shdocvw.h"
31
32 #include "winreg.h"
33 #include "shlwapi.h"
34
35 #include "initguid.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
38
39 LONG SHDOCVW_refCount = 0;
40
41 HINSTANCE shdocvw_hinstance = 0;
42 static HMODULE SHDOCVW_hshell32 = 0;
43
44 /*************************************************************************
45  * SHDOCVW DllMain
46  */
47 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
48 {
49     TRACE("%p 0x%lx %p\n", hinst, fdwReason, fImpLoad);
50     switch (fdwReason)
51     {
52         case DLL_PROCESS_ATTACH:
53         shdocvw_hinstance = hinst;
54         register_iewindow_class();
55         break;
56     case DLL_PROCESS_DETACH:
57         if (SHDOCVW_hshell32) FreeLibrary(SHDOCVW_hshell32);
58         unregister_iewindow_class();
59         break;
60     }
61     return TRUE;
62 }
63
64 /*************************************************************************
65  *              DllCanUnloadNow (SHDOCVW.@)
66  */
67 HRESULT WINAPI DllCanUnloadNow(void)
68 {
69     return SHDOCVW_refCount ? S_FALSE : S_OK;
70 }
71
72 /***********************************************************************
73  *              DllGetVersion (SHDOCVW.@)
74  */
75 HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info)
76 {
77     if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n");
78
79     /* this is what IE6 on Windows 98 reports */
80     info->dwMajorVersion = 6;
81     info->dwMinorVersion = 0;
82     info->dwBuildNumber = 2600;
83     info->dwPlatformID = DLLVER_PLATFORM_WINDOWS;
84
85     return NOERROR;
86 }
87
88 /*************************************************************************
89  *              DllInstall (SHDOCVW.@)
90  */
91 HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
92 {
93    FIXME("(%s, %s): stub!\n", bInstall ? "TRUE":"FALSE", debugstr_w(cmdline));
94
95    return S_OK;
96 }
97
98 /*************************************************************************
99  * SHDOCVW_LoadShell32
100  *
101  * makes sure the handle to shell32 is valid
102  */
103  BOOL SHDOCVW_LoadShell32(void)
104 {
105      if (SHDOCVW_hshell32)
106        return TRUE;
107      return ((SHDOCVW_hshell32 = LoadLibraryA("shell32.dll")) != NULL);
108 }
109
110 /***********************************************************************
111  *              @ (SHDOCVW.110)
112  *
113  * Called by Win98 explorer.exe main binary, definitely has 0
114  * parameters.
115  */
116 DWORD WINAPI WinList_Init(void)
117 {
118     FIXME("(), stub!\n");
119     return 0x0deadfeed;
120 }
121
122 /***********************************************************************
123  *              @ (SHDOCVW.118)
124  *
125  * Called by Win98 explorer.exe main binary, definitely has only one
126  * parameter.
127  */
128 static BOOL (WINAPI *pShellDDEInit)(BOOL start) = NULL;
129
130 BOOL WINAPI ShellDDEInit(BOOL start)
131 {
132     TRACE("(%d)\n", start);
133
134     if (!pShellDDEInit)
135     {
136       if (!SHDOCVW_LoadShell32())
137         return FALSE;
138       pShellDDEInit = GetProcAddress(SHDOCVW_hshell32, (LPCSTR)188);
139     }
140
141     if (pShellDDEInit)
142       return pShellDDEInit(start);
143     else
144       return FALSE;
145 }
146
147 /***********************************************************************
148  *              @ (SHDOCVW.125)
149  *
150  * Called by Win98 explorer.exe main binary, definitely has 0
151  * parameters.
152  */
153 DWORD WINAPI RunInstallUninstallStubs(void)
154 {
155     FIXME("(), stub!\n");
156     return 0x0deadbee;
157 }
158
159 /***********************************************************************
160  *              SetQueryNetSessionCount (SHDOCVW.@)
161  */
162 DWORD WINAPI SetQueryNetSessionCount(DWORD arg)
163 {
164     FIXME("(%lu), stub!\n", arg);
165     return 0;
166 }
167
168 /**********************************************************************
169  * OpenURL  (SHDOCVW.@)
170  */
171 void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd)
172 {
173     FIXME("%p %p %s %d\n", hWnd, hInst, debugstr_a(lpcstrUrl), nShowCmd);
174 }
175
176 /**********************************************************************
177  * Some forwards (by ordinal) to SHLWAPI
178  */
179
180 static void* fetch_shlwapi_ordinal(unsigned ord)
181 {
182     static const WCHAR shlwapiW[] = {'s','h','l','w','a','p','i','.','d','l','l','\0'};
183     static HANDLE h;
184
185     if (!h && !(h = GetModuleHandleW(shlwapiW))) return NULL;
186     return (void*)GetProcAddress(h, (const char*)ord);
187 }
188
189 /******************************************************************
190  *              WhichPlatformFORWARD            (SHDOCVW.@)
191  */
192 DWORD WINAPI WhichPlatformFORWARD(void)
193 {
194     static DWORD (*WINAPI p)(void);
195
196     if (p || (p = fetch_shlwapi_ordinal(276))) return p();
197     return 1; /* not integrated, see shlwapi.WhichPlatform */
198 }
199
200 /******************************************************************
201  *              StopWatchModeFORWARD            (SHDOCVW.@)
202  */
203 void WINAPI StopWatchModeFORWARD(void)
204 {
205     static void (*WINAPI p)(void);
206
207     if (p || (p = fetch_shlwapi_ordinal(241))) p();
208 }
209
210 /******************************************************************
211  *              StopWatchFlushFORWARD            (SHDOCVW.@)
212  */
213 void WINAPI StopWatchFlushFORWARD(void)
214 {
215     static void (*WINAPI p)(void);
216
217     if (p || (p = fetch_shlwapi_ordinal(242))) p();
218 }
219
220 /******************************************************************
221  *              StopWatchWFORWARD            (SHDOCVW.@)
222  */
223 DWORD WINAPI StopWatchWFORWARD(DWORD dwClass, LPCWSTR lpszStr, DWORD dwUnknown,
224                                DWORD dwMode, DWORD dwTimeStamp)
225 {
226     static DWORD (*WINAPI p)(DWORD, LPCWSTR, DWORD, DWORD, DWORD);
227
228     if (p || (p = fetch_shlwapi_ordinal(243)))
229         return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
230     return ERROR_CALL_NOT_IMPLEMENTED;
231 }
232
233 /******************************************************************
234  *              StopWatchAFORWARD            (SHDOCVW.@)
235  */
236 DWORD WINAPI StopWatchAFORWARD(DWORD dwClass, LPCSTR lpszStr, DWORD dwUnknown,
237                                DWORD dwMode, DWORD dwTimeStamp)
238 {
239     static DWORD (*WINAPI p)(DWORD, LPCSTR, DWORD, DWORD, DWORD);
240
241     if (p || (p = fetch_shlwapi_ordinal(244)))
242         return p(dwClass, lpszStr, dwUnknown, dwMode, dwTimeStamp);
243     return ERROR_CALL_NOT_IMPLEMENTED;
244 }