1 const char win32_rcs[] = "$Id: win32.c,v 2.1 2002/06/04 16:37:48 jongfoster Exp $";
2 /*********************************************************************
4 * File : $Source: /cvsroot/ijbswa//current/src/win32.c,v $
6 * Purpose : Win32 User Interface initialization and message loop
8 * Copyright : Written by and Copyright (C) 2001-2002 members of
9 * the Privoxy team. http://www.privoxy.org/
11 * Written by and Copyright (C) 1999 Adam Lock
14 * This program is free software; you can redistribute it
15 * and/or modify it under the terms of the GNU General
16 * Public License as published by the Free Software
17 * Foundation; either version 2 of the License, or (at
18 * your option) any later version.
20 * This program is distributed in the hope that it will
21 * be useful, but WITHOUT ANY WARRANTY; without even the
22 * implied warranty of MERCHANTABILITY or FITNESS FOR A
23 * PARTICULAR PURPOSE. See the GNU General Public
24 * License for more details.
26 * The GNU General Public License should be included with
27 * this file. If not, you can view it at
28 * http://www.gnu.org/copyleft/gpl.html
29 * or write to the Free Software Foundation, Inc., 59
30 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
34 * Revision 2.1 2002/06/04 16:37:48 jongfoster
35 * Adding Doxygen-style comments to variables
37 * Revision 2.0 2002/06/04 14:34:21 jongfoster
38 * Moving source files to src/
40 * Revision 1.9 2002/03/31 17:19:00 jongfoster
41 * Win32 only: Enabling STRICT to fix a VC++ compile warning.
43 * Revision 1.8 2002/03/26 22:57:10 jongfoster
44 * Web server name should begin www.
46 * Revision 1.7 2002/03/24 12:03:47 jongfoster
49 * Revision 1.6 2002/03/16 21:53:28 jongfoster
50 * VC++ Heap debug option
52 * Revision 1.5 2002/03/04 23:47:30 jongfoster
53 * - Rewritten, simpler command-line pre-parser
54 * - not using raise(SIGINT) any more
56 * Revision 1.4 2001/11/30 21:29:33 jongfoster
59 * Revision 1.3 2001/11/16 00:46:31 jongfoster
60 * Fixing compiler warnings
62 * Revision 1.2 2001/07/29 19:32:00 jongfoster
63 * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
65 * Revision 1.1.1.1 2001/05/15 13:59:08 oes
66 * Initial import of version 2.9.3 source tree
69 *********************************************************************/
82 /* Uncomment this if you want to build Win32 as a console app */
83 /* #define _WIN_CONSOLE */
93 #if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
94 /* Visual C++ Heap debugging */
96 #endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
100 const char win32_h_rcs[] = WIN32_H_VERSION;
103 * A short introductory text about Privoxy. Used for the "About" box
104 * or the console startup message.
106 const char win32_blurb[] =
107 "Privoxy version " VERSION " for Windows\n"
108 "Copyright (C) 2000-2002 the Privoxy Team (" HOME_PAGE_URL ")\n"
109 "Based on the Internet Junkbuster by Junkbusters Corp.\n"
110 "This is free software; it may be used and copied under the\n"
111 "GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
112 "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n";
119 * Hide the console. If set, the program will disconnect from the
120 * console and run in the background. This allows the command-prompt
126 #else /* ndef _WIN_CONSOLE */
130 * The application instance handle.
132 HINSTANCE g_hInstance;
136 * The command to show the window that was specified at startup.
141 static void __cdecl UserInterfaceThread(void *);
144 #endif /* ndef _WIN_CONSOLE */
148 /*********************************************************************
152 * Description : M$ Windows "main" routine:
153 * parse the `lpCmdLine' param into main's argc and argv variables,
154 * start the user interface thread (for the systray window), and
155 * call main (i.e. patch execution into normal startup).
158 * 1 : hInstance = instance handle of this execution
159 * 2 : hPrevInstance = instance handle of previous execution
160 * 3 : lpCmdLine = command line string which started us
161 * 4 : nCmdShow = window show value (MIN, MAX, NORMAL, etc...)
163 * Returns : `main' never returns, so WinMain will also never return.
165 *********************************************************************/
166 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
172 char szModule[MAX_PATH+1];
174 HANDLE hInitCompleteEvent = NULL;
178 #if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
180 /* Visual C++ Heap debugging */
182 /* Get current flag*/
183 int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
185 /* Turn on leak-checking bit */
186 tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
188 /* Turn off CRT block checking bit */
189 tmpFlag &= ~(_CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF);
191 /* Set flag to the new value */
192 _CrtSetDbgFlag( tmpFlag );
194 #endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
197 * Cheat in parsing the command line. We only ever have at most one
198 * paramater, which may optionally be specified inside double quotes.
201 if (lpCmdLine != NULL)
203 /* Make writable copy */
204 lpCmdLine = strdup(lpCmdLine);
206 if (lpCmdLine != NULL)
209 i = strlen(lpCmdLine);
210 if ((i >= 2) && (lpCmdLine[0] == '\"') && (lpCmdLine[i - 1] == '\"'))
212 lpCmdLine[i - 1] = '\0';
215 if (lpCmdLine[0] == '\0')
221 GetModuleFileName(hInstance, szModule, MAX_PATH);
225 argc = ((lpCmdLine != NULL) ? 2 : 1);
228 /* Create a user-interface thread and wait for it to initialise */
229 hInitCompleteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
230 g_hInstance = hInstance;
231 g_nCmdShow = nCmdShow;
232 _beginthread(UserInterfaceThread, 0, &hInitCompleteEvent);
233 WaitForSingleObject(hInitCompleteEvent, INFINITE);
234 DeleteObject(hInitCompleteEvent);
238 res = real_main( argc, argv );
240 res = main( argc, argv );
249 /*********************************************************************
251 * Function : InitWin32
253 * Description : Initialise windows, setting up the console or windows as appropriate.
259 *********************************************************************/
262 WORD wVersionRequested;
266 SetProcessShutdownParameters(0x100, SHUTDOWN_NORETRY);
272 wVersionRequested = MAKEWORD(2, 0);
273 if (WSAStartup(wVersionRequested, &wsaData) != 0)
276 MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error",
277 MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);
293 /*********************************************************************
295 * Function : UserInterfaceThread
297 * Description : User interface thread. WinMain will wait for us to set
298 * the hInitCompleteEvent before patching over to `main'.
299 * This ensures the systray window is active before beginning
303 * 1 : pData = pointer to `hInitCompleteEvent'.
307 *********************************************************************/
308 static void __cdecl UserInterfaceThread(void *pData)
311 HANDLE hInitCompleteEvent = *((HANDLE *) pData);
315 SetEvent(hInitCompleteEvent);
317 /* Enter a message processing loop */
318 while (GetMessage(&msg, (HWND) NULL, 0, 0))
320 TranslateMessage(&msg);
321 DispatchMessage(&msg);