Fixing compiler warnings
[privoxy.git] / win32.c
1 const char win32_rcs[] = "$Id: win32.c,v 1.2 2001/07/29 19:32:00 jongfoster Exp $";
2 /*********************************************************************
3  *
4  * File        :  $Source: /cvsroot/ijbswa/current/win32.c,v $
5  *
6  * Purpose     :  Win32 User Interface initialization and message loop
7  *
8  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
9  *                IJBSWA team.  http://ijbswa.sourceforge.net
10  *
11  *                Written by and Copyright (C) 1999 Adam Lock
12  *                <locka@iol.ie>
13  *
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.
19  *
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.
25  *
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.
31  *
32  * Revisions   :
33  *    $Log: win32.c,v $
34  *    Revision 1.2  2001/07/29 19:32:00  jongfoster
35  *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
36  *
37  *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
38  *    Initial import of version 2.9.3 source tree
39  *
40  *
41  *********************************************************************/
42 \f
43
44 #include "config.h"
45
46 #ifdef _WIN32
47
48 #include <stdio.h>
49
50 #include "project.h"
51 #include "jcc.h"
52
53 /* Uncomment this if you want to build Win32 as a console app */
54 /* #define _WIN_CONSOLE */
55
56 #include <windows.h>
57
58 #include <stdarg.h>
59 #include <process.h>
60
61 #include "win32.h"
62
63 const char win32_h_rcs[] = WIN32_H_VERSION;
64
65 const char win32_blurb[] =
66 "Internet Junkbuster Proxy(TM) Version " VERSION " for Windows is Copyright (C) 1997-8\n"
67 "by Junkbusters Corp.  This is free software; it may be used and copied under\n"
68 "the GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
69 "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n"
70 "\n"
71 "For information about how to to configure the proxy and your browser, see\n"
72 "        " REDIRECT_URL "win\n"
73 "\n"
74 "The Internet Junkbuster Proxy(TM) is running and ready to serve!\n"
75 "";
76
77 #ifdef _WIN_CONSOLE
78
79 int hideConsole     = 0;
80
81 #else
82
83 HINSTANCE g_hInstance;
84 int g_nCmdShow;
85
86 static void  __cdecl UserInterfaceThread(void *);
87
88 #endif
89
90
91 /*********************************************************************
92  *
93  * Function    :  WinMain
94  *
95  * Description :  M$ Windows "main" routine:
96  *                parse the `lpCmdLine' param into main's argc and argv variables,
97  *                start the user interface thread (for the systray window), and
98  *                call main (i.e. patch execution into normal IJB startup).
99  *
100  * Parameters  :
101  *          1  :  hInstance = instance handle of this IJB execution
102  *          2  :  hPrevInstance = instance handle of previous IJB execution
103  *          3  :  lpCmdLine = command line string which started IJB
104  *          4  :  nCmdShow = window show value (MIN, MAX, NORMAL, etc...)
105  *
106  * Returns     :  `main' never returns, so WinMain will also never return.
107  *
108  *********************************************************************/
109 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
110 {
111    int argc = 0;
112    int i;
113    int res;
114    const char **argv = NULL;
115    char *pszArgs = NULL;
116    char *pszLastTok;
117    char szModule[MAX_PATH+1];
118 #ifndef _WIN_CONSOLE
119    HANDLE hInitCompleteEvent = NULL;
120 #endif
121
122    /* Split command line into arguments */
123    pszArgs = (char *)malloc(strlen(lpCmdLine) + 1);
124    strcpy(pszArgs, lpCmdLine);
125
126    GetModuleFileName(hInstance, szModule, MAX_PATH);
127
128    /* Count number of spaces */
129    argc = 1;
130    if (strlen(pszArgs) > 0)
131    {
132       pszLastTok = pszArgs;
133       do
134       {
135          argc++;
136          pszLastTok = strchr(pszLastTok+1, ' ');
137       } while (pszLastTok);
138    }
139
140    /* Allocate array of strings */
141    argv = (char **)malloc(sizeof(char *) * argc);
142
143    /* step through command line replacing spaces with zeros, initialise array */
144    argv[0] = szModule;
145    i = 1;
146    pszLastTok = pszArgs;
147    do
148    {
149       argv[i] = pszLastTok;
150       pszLastTok = strchr(pszLastTok+1, ' ');
151       if (pszLastTok)
152       {
153          while (*pszLastTok != '\0' && *pszLastTok == ' ')
154          {
155             *pszLastTok = '\0';
156             pszLastTok++;
157          }
158       }
159       i++;
160    } while (pszLastTok && *pszLastTok != '\0');
161
162 #ifndef _WIN_CONSOLE
163    /* Create a user-interface thread and wait for it to initialise */
164    hInitCompleteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
165    g_hInstance = hInstance;
166    g_nCmdShow = nCmdShow;
167    _beginthread(UserInterfaceThread, 0, &hInitCompleteEvent);
168    WaitForSingleObject(hInitCompleteEvent, INFINITE);
169    DeleteObject(hInitCompleteEvent);
170 #endif
171
172 #ifdef __MINGW32__
173    res = real_main( argc, argv );
174 #else
175    res = main( argc, argv );
176 #endif
177
178    /* Cleanup */
179    free(argv);
180    free(pszArgs);
181
182    return res;
183
184 }
185
186 #endif
187
188 /*********************************************************************
189  *
190  * Function    :  InitWin32
191  *
192  * Description :  Initialise windows, setting up the console or windows as appropriate.
193  *
194  * Parameters  :  None
195  *
196  * Returns     :  N/A
197  *
198  *********************************************************************/
199 void InitWin32(void)
200 {
201    WORD wVersionRequested;
202    WSADATA wsaData;
203
204 #ifdef _WIN_CONSOLE
205    SetProcessShutdownParameters(0x100, SHUTDOWN_NORETRY);
206    if (hideConsole)
207    {
208       FreeConsole();
209    }
210 #endif
211    wVersionRequested = MAKEWORD(2, 0);
212    if (WSAStartup(wVersionRequested, &wsaData) != 0)
213    {
214 #ifndef _WIN_CONSOLE
215       MessageBox(NULL, "Cannot initialize WinSock library", "Internet JunkBuster Error", 
216          MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);  
217 #endif
218       exit(1);
219    }
220
221 }
222
223
224 #ifndef _WIN_CONSOLE
225 #include <signal.h>
226 #include <assert.h>
227
228 #include "win32.h"
229 #include "w32log.h"
230
231
232 /*********************************************************************
233  *
234  * Function    :  UserInterfaceThread
235  *
236  * Description :  User interface thread.  WinMain will wait for us to set
237  *                the hInitCompleteEvent before patching over to `main'.
238  *                This ensures the systray window is active before beginning
239  *                IJB operations.
240  *
241  * Parameters  :
242  *          1  :  pData = pointer to `hInitCompleteEvent'.
243  *
244  * Returns     :  N/A
245  *
246  *********************************************************************/
247 static void __cdecl UserInterfaceThread(void *pData)
248 {
249    MSG msg;
250    HANDLE hInitCompleteEvent = *((HANDLE *) pData);
251
252    /* Initialise */
253    InitLogWindow();
254    SetEvent(hInitCompleteEvent);
255
256    /* Enter a message processing loop */
257    while (GetMessage(&msg, (HWND) NULL, 0, 0))
258    {
259       TranslateMessage(&msg);
260       DispatchMessage(&msg);
261    }
262
263    /* Cleanup */
264    TermLogWindow();
265
266    /* Time to die... */
267    raise(SIGINT);
268
269 }
270
271
272 #endif
273
274
275 /*
276   Local Variables:
277   tab-width: 3
278   end:
279 */