/[LeafOK_CVS]/pvpgn-1.7.4/src/win32/d2cs_winmain.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/win32/d2cs_winmain.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (vendor branch)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 sysadm 1.1 /*
2     * Copyright (C) 2004 CreepLord (creeplord@pvpgn.org)
3     *
4     * This program is free software; you can redistribute it and/or
5     * modify it under the terms of the GNU General Public License
6     * as published by the Free Software Foundation; either version 2
7     * of the License, or (at your option) any later version.
8     *
9     * This program is distributed in the hope that it will be useful,
10     * but WITHOUT ANY WARRANTY; without even the implied warranty of
11     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     * GNU General Public License for more details.
13     *
14     * You should have received a copy of the GNU General Public License
15     * along with this program; if not, write to the Free Software
16     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17     */
18    
19     #ifdef WIN32_GUI
20    
21     #include "common/setup_before.h"
22     #include <windows.h>
23     #include <windowsx.h>
24     #include <richedit.h>
25     #include "d2cs_resource.h"
26     #include "common/eventlog.h"
27     #include "d2cs/version.h"
28     #include "common/setup_after.h"
29    
30     #define WM_SHELLNOTIFY (WM_USER+1)
31    
32     extern int server_main(int argc, char *argv[]); /* d2cs main function in d2cs/main.c */
33    
34     static void d2cs(void * dummy); /* thread function for d2cs */
35    
36     static void guiAddText(const char *str, COLORREF clr);
37     static void KillTrayIcon(HWND hwnd);
38     static int OnShellNotify(HWND hwnd, int uID, int uMessage);
39     static void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
40     static BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
41     static void OnClose(HWND hwnd);
42     static void OnSize(HWND hwnd, UINT state, int cx, int cy);
43    
44     LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
45     BOOL CALLBACK DlgProcAbout(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
46    
47     HWND ghwndConsole; /* hwnd for eventlog output */
48    
49     static int gui_run = TRUE; /* default state: run gui */
50     static int d2cs_run = TRUE; /* default state: run d2cs */
51     static int d2cs_running = FALSE; /* currect state: not running */
52    
53     static void KillTrayIcon(HWND hwnd)
54     {
55     NOTIFYICONDATA dta;
56    
57     dta.cbSize = sizeof(NOTIFYICONDATA);
58     dta.hWnd = hwnd;
59     dta.uID = ID_TRAY;
60     dta.uFlags = 0;
61     Shell_NotifyIcon(NIM_DELETE, &dta);
62     }
63    
64     int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
65     LPSTR lpszCmdLine, int nCmdShow)
66     {
67     WNDCLASSEX wc;
68     HWND hwnd;
69     MSG msg;
70    
71     /* if running as a service skip starting the GUI and go straight to starting d2cs */
72     if (__argc==2 && strcmp(__argv[1],"--service")==0)
73     {
74     Win32_ServiceRun();
75     return 1;
76     }
77    
78     LoadLibrary("RichEd20.dll");
79    
80     wc.cbSize = sizeof(WNDCLASSEX);
81     wc.style = 0;
82     wc.lpfnWndProc = WndProc;
83     wc.cbClsExtra = 0;
84     wc.cbWndExtra = sizeof(LPVOID);
85     wc.hInstance = hInstance;
86     wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON1));
87     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
88     wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
89     wc.lpszMenuName = MAKEINTRESOURCE(ID_MENU);
90     wc.lpszClassName = "BnetWndClass";
91    
92     if(!RegisterClassEx( &wc ))
93     RegisterClass((LPWNDCLASS)&wc.style);
94    
95     hwnd = CreateWindow(TEXT("BnetWndClass"),"Diablo II Character Server",
96     WS_OVERLAPPEDWINDOW,
97     CW_USEDEFAULT, CW_USEDEFAULT,
98     CW_USEDEFAULT, CW_USEDEFAULT,
99     NULL,
100     LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU)),
101     hInstance,NULL);
102    
103     if(hwnd) {
104     ShowWindow(hwnd, nCmdShow);
105     UpdateWindow(hwnd);
106     }
107    
108     while(GetMessage(&msg, NULL, 0, 0)) {
109     TranslateMessage( &msg );
110     DispatchMessage( &msg );
111    
112     if(!d2cs_running && d2cs_run && gui_run) {
113     d2cs_running = TRUE;
114     _beginthread(d2cs, 0, NULL);
115     }
116    
117     if(!gui_run && !d2cs_running) {
118     KillTrayIcon(hwnd);
119     exit(0);
120     }
121     }
122     return ((int) msg.wParam);
123     }
124    
125     LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
126     {
127     switch(uMsg) {
128     HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
129     HANDLE_MSG(hwnd, WM_SIZE, OnSize);
130     HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
131     HANDLE_MSG(hwnd, WM_CLOSE, OnClose);
132     case WM_SHELLNOTIFY:
133     return OnShellNotify(hwnd, wParam, lParam);
134     }
135     return DefWindowProc(hwnd, uMsg, wParam, lParam);
136     }
137    
138     static BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
139     {
140     ghwndConsole = CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT_CLASS, NULL,
141     WS_CHILD|WS_VISIBLE|ES_READONLY|ES_MULTILINE|
142     WS_VSCROLL|WS_HSCROLL|ES_NOHIDESEL,
143     0, 0,
144     0, 0, hwnd, 0,
145     0, NULL);
146    
147     if(!ghwndConsole)
148     return FALSE;
149    
150     return TRUE;
151     }
152    
153     static void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
154     {
155     switch (id) {
156     case ID_RESTORE:
157     OnShellNotify(hwnd, ID_TRAY, WM_LBUTTONDBLCLK);
158     break;
159     case ID_START_D2CS:
160     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Start Signal to d2cs");
161     d2cs_run = TRUE;
162     break;
163     case ID_SHUTDOWN_D2CS:
164     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Shutdown Signal to d2cs");
165     d2cs_run = FALSE;
166     signal_quit_wrapper();
167     break;
168     case ID_RESTART_D2CS:
169     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Restart Signal To d2cs");
170     signal_quit_wrapper();
171     break;
172     case ID_EDITCONFIG_D2CS:
173     ShellExecute(NULL, "open", "notepad.exe", "conf\\d2cs.conf", NULL, SW_SHOW );
174     break;
175     case ID_LOADCONFIG_D2CS:
176     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Reload Config Signal To d2cs");
177     signal_reload_config_wrapper();
178     break;
179     case ID_LADDER_LOAD:
180     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Reload Ladder Signal To d2cs");
181     signal_load_ladder_wrapper();
182     break;
183     case ID_RESTART_D2GS:
184     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Restart d2gs Signal To d2cs");
185     signal_restart_d2gs_wrapper();
186     break;
187     case ID_EXIT:
188     OnClose(hwnd);
189     break;
190     case ID_CLEAR:
191     SendMessage(ghwndConsole, WM_SETTEXT, 0, 0);
192     break;
193     case ID_ABOUT:
194     DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ABOUT_BOX), hwnd, (DLGPROC)DlgProcAbout);
195     break;
196     }
197     }
198    
199     static int OnShellNotify(HWND hwnd, int uID, int uMessage)
200     {
201     if(uID == ID_TRAY) {
202     if(uMessage == WM_LBUTTONDBLCLK) {
203     if(!IsWindowVisible(hwnd))
204     ShowWindow(hwnd, SW_RESTORE);
205    
206     SetForegroundWindow(hwnd);
207     }
208     }
209     return 0;
210     }
211    
212     static void OnClose(HWND hwnd)
213     {
214     eventlog(eventlog_level_warn,__FUNCTION__,"Sending Exit Signal");
215     gui_run = FALSE;
216     d2cs_run = FALSE;
217     signal_exit_wrapper();
218     }
219    
220     static void OnSize(HWND hwnd, UINT state, int cx, int cy)
221     {
222     NOTIFYICONDATA dta;
223    
224     if( state == SIZE_MINIMIZED ) {
225     dta.cbSize = sizeof(NOTIFYICONDATA);
226     dta.hWnd = hwnd;
227     dta.uID = ID_TRAY;
228     dta.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
229     dta.uCallbackMessage = WM_SHELLNOTIFY;
230     dta.hIcon = LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(ID_ICON1));
231     strcpy(dta.szTip, "D2CS Version");
232     strcat(dta.szTip, " ");
233     strcat(dta.szTip, D2CS_VERSION_STRING);
234    
235     Shell_NotifyIcon(NIM_ADD, &dta);
236     ShowWindow(hwnd, SW_HIDE);
237     return;
238     }
239    
240     MoveWindow(ghwndConsole, 0, 0, cx, cy, TRUE);
241     }
242    
243     BOOL CALLBACK DlgProcAbout(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
244     {
245     switch (uMsg) {
246     case WM_CLOSE:
247     EndDialog(hwnd, TRUE);
248     return TRUE;
249     case WM_INITDIALOG:
250     return TRUE;
251     case WM_COMMAND:
252     switch ((int)wParam) {
253     case IDOK:
254     EndDialog(hwnd, TRUE);
255     return TRUE;
256     }
257     }
258     return FALSE;
259     }
260    
261     extern int gui_lprintf(t_eventlog_level l, const char *format, ...)
262     {
263     va_list arglist;
264     va_start(arglist, format);
265    
266     return gui_lvprintf(l, format, arglist);
267     }
268    
269     extern int gui_lvprintf(t_eventlog_level l, const char *format, va_list arglist)
270     {
271     char buff[4096];
272     int result;
273     COLORREF clr;
274    
275     result = vsprintf(buff, format, arglist);
276    
277     switch(l)
278     {
279     case eventlog_level_none:
280     clr = RGB(0, 0, 0);
281     break;
282     case eventlog_level_trace:
283     clr = RGB(255, 0, 255);
284     break;
285     case eventlog_level_debug:
286     clr = RGB(0, 0, 255);
287     break;
288     case eventlog_level_info:
289     clr = RGB(0, 0, 0);
290     break;
291     case eventlog_level_warn:
292     clr = RGB(255, 128, 64);
293     break;
294     case eventlog_level_error:
295     clr = RGB(255, 0, 0);
296     break;
297     case eventlog_level_fatal:
298     clr = RGB(255, 0, 0);
299     break;
300     default:
301     clr = RGB(0, 0, 0);
302     }
303     guiAddText(buff, clr);
304     return result;
305     }
306    
307     static void guiAddText(const char *str, COLORREF clr)
308     {
309     int start_lines, text_length, end_lines;
310     CHARRANGE cr;
311     CHARRANGE ds;
312     CHARFORMAT fmt;
313    
314     text_length = SendMessage(ghwndConsole, WM_GETTEXTLENGTH, 0, 0);
315    
316     if (text_length > 30000)
317     {
318     ds.cpMin = 0;
319     ds.cpMax = text_length - 30000;
320     SendMessage(ghwndConsole, EM_EXSETSEL, 0, (LPARAM)&ds);
321     SendMessage(ghwndConsole, EM_REPLACESEL, FALSE, 0);
322     }
323    
324     cr.cpMin = text_length;
325     cr.cpMax = text_length;
326     SendMessage(ghwndConsole, EM_EXSETSEL, 0, (LPARAM)&cr);
327    
328     fmt.cbSize = sizeof(CHARFORMAT);
329     fmt.dwMask = CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD|CFM_ITALIC|CFM_STRIKEOUT|CFM_UNDERLINE;
330     fmt.yHeight = 160;
331     fmt.dwEffects = 0;
332     fmt.crTextColor = clr;
333     strcpy(fmt.szFaceName,"Courier New");
334    
335     SendMessage(ghwndConsole, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt);
336     SendMessage(ghwndConsole, EM_REPLACESEL, FALSE, (LPARAM)str);
337     }
338    
339     #define EXIT_ERROR -1
340     #define EXIT_OK 0
341     #define EXIT_SERVICE 1
342    
343     static void d2cs(void * dummy)
344     {
345     switch (server_main(__argc, __argv))
346     {
347     case EXIT_SERVICE:
348     gui_run = FALSE; /* close gui */
349     case EXIT_ERROR:
350     d2cs_run = FALSE; /* don't restart */
351     case EXIT_OK:
352     ; /* do nothing */
353     }
354    
355     eventlog(eventlog_level_warn,__FUNCTION__,"Server Stopped");
356     d2cs_running = FALSE;
357     }
358    
359     #endif

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1