/************************************************************************ * IRC - Internet Relay Chat, Win32GUI.c * Copyright (C) 2000 David Flynn (DrBin) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define APPNAME "wIRCD" #define wTITLEBAR "UnrealIRCd" #define OEMRESOURCE //#define _WIN32_IE 0x0500 /* debug stuff*/ #define WINDEBUGLEVEL_0 0x01 #define WINDEBUGLEVEL_1 0x02 #define WINDEBUGLEVEL_2 0x04 #define WINDEBUGLEVEL_3 0x08 #define WINDEBUGLEVEL_FLUSH 0x10 #define WINDEBUG_FORCE 0x20 #define WINNOTIFY_0 0x0100 #define WINNOTIFY_1 0x0200 #define WINNOTIFY_2 0x0400 #define WINNOTIFY_3 0x0800 /*end*/ #ifndef IRCDTOTALVERSION #define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9 #endif #include #include "resource.h" #include "version.h" #include "setup.h" #include /* These came from ircd.c*/ #include "struct.h" #include "common.h" #include "sys.h" #include "numeric.h" #include "userload.h" #include #include #include #include #include #include #include #include "h.h" #include "Win32New.h" #include /* end */ /* Service Stuff */ /*SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE ServiceStatusHandle; VOID SvcDebugOut(LPSTR String, DWORD Status); _stdcall void StartUnrealService (DWORD argc, LPTSTR *argv); VOID ServiceCtrlHandler (DWORD opcode); DWORD ServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); /* end */ extern ircstats IRCstats; int SetDebugLevel(HWND hWnd, int NewLevel); void SetupPopups(HWND hDlg); HWND CreateATreeView(HWND hwndParent/*, LPSTR lpszFileName*/,RECT rcClient); HTREEITEM AddItemToTree(HWND hWnd, LPSTR lpszItem, int nLevel); void win_map(cptr, server, mask, prompt_length, length,hwTreeView); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MainDLG(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK wStatusDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK Dlg_IRCDRULES(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK Dlg_IRCDMOTD(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK Dlg_IRCDCONF(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK Credits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK Dreamforge(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK IRCDLicense(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); extern void SocketLoop(void *dummy), s_rehash(), do_dns_async(HANDLE id); void windebug(level, form, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); void GetOSVersion(void); extern struct /*current_load_struct */current_load_data; LRESULT CALLBACK GraphCtlProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); void NiceQuit(void); extern int max_client_count; HINSTANCE hInst; HWND hStatsWnd,hgraphwnd; BOOL gbIsWinNT; int windebuglevel = 0 ; //| WINDEBUGLEVEL_0 | WINDEBUGLEVEL_1 | WINDEBUGLEVEL_2 | WINDEBUGLEVEL_3 | WINDEBUGLEVEL_FLUSH ; int usernumhistory[530], usernumpointer; char String[2048]; #include "version.h" FILE *debugfile; aConfiguration iConf; char *version, *creation; char shortversion[] = BASE_VERSION PATCH1; char szAppName[] = APPNAME; // The name of this application char szTitle[] = wTITLEBAR; // The title bar text HWND hwIRCDWnd=NULL/* hwnd=NULL*/; INFRICHLINE AllLines; NOTIFYICONDATA SysTray; HANDLE hMainThread = 0; HMENU ConfPopup, AboutPopup, DebugPopup; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HANDLE hAccelTable; int argc=0, yy; char *s, *argv[20], String[128]; HWND hWnd; WSADATA WSAData; char meep[MAX_PATH]; /*First ... Start Debuger !!!*/ InitStackTraceLibrary(); GetOSVersion(); if ((debugfile = fopen("debugout.log","ac"))==NULL) MessageBox(NULL, "UnrealIRCD/32 Initalization Error", "Unable to create debugout.log",MB_OK); fprintf(debugfile,"\n\n"); windebug(WINDEBUG_FORCE,"Initializing Unreal wIRCd"); windebug(WINDEBUG_FORCE,"%s compiled on %s %s",version,__DATE__,__TIME__); windebug(WINDEBUG_FORCE,"%s Last modifed %s",__FILE__,__TIMESTAMP__); /* if(gbIsWinNT) { SERVICE_TABLE_ENTRY DispatchTable[] = { { "Unreal wIRCd", StartUnrealService}, { NULL, NULL } }; if (!StartServiceCtrlDispatcher( DispatchTable)) { SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); } } /* Create a new instance */ if ( WSAStartup(MAKEWORD(1, 1), &WSAData) != 0 ) { MessageBox(NULL, "UnrealIRCD/32 Initalization Error", "Unable to initialize WinSock", MB_OK); return FALSE; } /* Store instance handle in our global variable */ hInst = hInstance; hWnd = CreateDialog(hInstance, "wIRCD", 0, MainDLG); if ( !hWnd ) return (FALSE); hwIRCDWnd = hWnd; { HICON hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(sysicondisabled), IMAGE_ICON,16, 16, 0); SysTray.cbSize = sizeof (NOTIFYICONDATA); SysTray.hIcon = hIcon; SysTray.hWnd = hwIRCDWnd; lstrcpyn(SysTray.szTip, shortversion, sizeof(shortversion));; SysTray.uCallbackMessage = WM_USER; SysTray.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE; SysTray.uID = 0; Shell_NotifyIcon(NIM_ADD ,&SysTray); if (hIcon) { DestroyIcon(hIcon); } } /* ** We have initialised, start doing something usefull ! */ /* Parse the command line */ /*argv[0] = "WIRCD.EXE";*/ if ( (s = /*lpCmdLine*/ GetCommandLine()) ) { argv[argc++] = s; /*while ( (s = strchr(s, ' ')) != NULL ) {*/ // while ( *s == ' ' ) *s++ = 0; // argv[argc++] = s; // } } argv[argc] = NULL; if ( InitwIRCD(argc, argv) != 1 ) { MessageBox(NULL,"Unreal IRCd for Windows has failed to initialise in InitwIRCD()","Error:",MB_OK); return FALSE; } /*Make sure we have the common controlls loaded ... *And the Rich edit controll */ InitCommonControls(); LoadLibrary("RichEd20.Dll"); { /* Setup WNDCLASS for graphy control*/ WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); wc.style = CS_DBLCLKS ; wc.lpfnWndProc = GraphCtlProc; wc.cbWndExtra = 4; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "Graph"; wc.lpszMenuName = NULL; wc.hCursor = LoadCursor(NULL,IDC_ARROW); if (!RegisterClass (&wc)) { MessageBox (NULL,"Error Initializing RegisterClass() for class Graphy", (LPCTSTR) "UnrealIRCD/32 Initalization Error", MB_OK | MB_ICONEXCLAMATION); } } wsprintf(String, "UnrealIRCd/32 - %s", me.name); SetWindowText(hwIRCDWnd, String); SetDebugLevel(hwIRCDWnd, debuglevel); hMainThread = (HANDLE) _beginthread(SocketLoop, 0, NULL); hAccelTable = LoadAccelerators (hInstance, szAppName); { HICON hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(sysicon), IMAGE_ICON,16, 16, 0); SysTray.hIcon = hIcon; Shell_NotifyIcon(NIM_MODIFY ,&SysTray); if (hIcon) { DestroyIcon(hIcon); } } atexit(NiceQuit); /* Main message loop */ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } windebug(WINDEBUG_FORCE,"Unreal Terminating ...."); Shell_NotifyIcon(NIM_DELETE ,&SysTray); fclose(debugfile); return msg.wParam; } void NiceQuit(void) { windebug(WINDEBUG_FORCE,"Unreal Terminating ...."); Shell_NotifyIcon(NIM_DELETE ,&SysTray); fclose(debugfile); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE : return 0; /* case WM_USER: windebug(WINDEBUGLEVEL_2,"entering WM_USER"); switch(lParam) { case WM_LBUTTONDOWN: /* We want to first ... get a pasword if required, then show the window*/ /* if (hwIRCDWnd) { ShowWindow (hwIRCDWnd, SW_SHOW); ShowWindow (hwIRCDWnd,SW_RESTORE); SetForegroundWindow(hwIRCDWnd); }else{ hwIRCDWnd = CreateDialog(hInst, "wIRCD", 0, MainDLG); ShowWindow (hwIRCDWnd, SW_SHOW); } break; } return 1;*/ } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; static HMENU hMenu, hSystemSubMenu, hHelpSubMenu; switch (message) { case WM_INITDIALOG: { /* ToDo :: ReWrite whole menu routine .. to actually work properly ... and use MF_(UN)CHECKED ! ** -- David Flynn 15-02-2000 **/ /* Done ! Now uses windebuglevel -- David Flynn 16-02-2000 **/ hMenu = LoadMenu(hInst, "Menu_PopUp"); hSystemSubMenu = GetSubMenu(hMenu, 2); hHelpSubMenu = GetSubMenu(hMenu, 3); SetMenuDefaultItem(hSystemSubMenu,IDM_IRCDCONF, MF_BYCOMMAND); SetTimer (hDlg, UPDATE_TIMER, UPDATE_INTERVAL, NULL); } return 1; case WM_SIZE : windebug(WINDEBUGLEVEL_2,"recieved WM_SIZE"); if (wParam & SIZE_MINIMIZED) { ShowWindow(hDlg,SW_HIDE); return 0; } case WM_USER: windebug(WINDEBUGLEVEL_2,"entering WM_USER"); switch(lParam) { case WM_LBUTTONDOWN: /* We want to first ... get a pasword if required, then show the window*/ /* if (hwIRCDWnd) {*/ ShowWindow (hDlg, SW_SHOW); ShowWindow (hDlg,SW_RESTORE); SetForegroundWindow(hDlg); // }else{ // hwIRCDWnd = CreateDialog(hInst, "wIRCD", 0, MainDLG); // ShowWindow (hwIRCDWnd, SW_SHOW); // } break; } return 1; case WM_TIMER : switch(wParam) { case UPDATE_TIMER: usernumhistory[usernumpointer] = IRCstats.me_clients ; usernumpointer++; usernumpointer %= 370; if (hStatsWnd != NULL) PostMessage(hgraphwnd,(WM_USER +1), 0,0); return 1; } break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch(LOWORD(wParam)) { case MM_WINDEBUGLEVEL_0 : /*Standard Level Debug ... not much stuff*/ windebug(WINDEBUGLEVEL_1,"Recieved MM_WINDEBUGLEVEL_0, windebuglevel = %X", windebuglevel); if ((windebuglevel & WINDEBUGLEVEL_0) != 0) { windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_0) != 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_0,MF_UNCHECKED); windebuglevel &= ~WINDEBUGLEVEL_0; }else{ windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_0) = 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_0,MF_CHECKED); windebuglevel |= WINDEBUGLEVEL_0; } windebug(WINDEBUGLEVEL_1,"finished MM_WINDEBUGLEVEL_0, windebuglevel = %X", windebuglevel); return 0; case MM_WINDEBUGLEVEL_1 : /*Higher Level ... Look at when functions are called*/ windebug(WINDEBUGLEVEL_1,"Recieved MM_WINDEBUGLEVEL_1, windebuglevel = %X", windebuglevel); if ((windebuglevel & WINDEBUGLEVEL_1) != 0) { windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_1) != 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_1,MF_UNCHECKED); windebuglevel &= ~WINDEBUGLEVEL_1; }else{ windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_1) = 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_1,MF_CHECKED); windebuglevel |= WINDEBUGLEVEL_1; } windebug(WINDEBUGLEVEL_1,"finished MM_WINDEBUGLEVEL_1, windebuglevel = %X", windebuglevel); return 0; case MM_WINDEBUGLEVEL_2 : /*Higher Still ... Look at what happens in functions*/ windebug(WINDEBUGLEVEL_1,"Recieved MM_WINDEBUGLEVEL_2, windebuglevel = %X", windebuglevel); if ((windebuglevel & WINDEBUGLEVEL_2) != 0) { windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_2) != 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_2,MF_UNCHECKED); windebuglevel &= ~WINDEBUGLEVEL_2; }else{ windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_2) = 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_2,MF_CHECKED); windebuglevel |= WINDEBUGLEVEL_2; } windebug(WINDEBUGLEVEL_1,"finished MM_WINDEBUGLEVEL_2, windebuglevel = %X", windebuglevel); return 0; case MM_WINDEBUGLEVEL_FLUSH : /*Make fflush happen on windebug()*/ windebug(WINDEBUGLEVEL_1,"Recieved MM_WINDEBUGLEVEL_FLUSH, windebuglevel = %X", windebuglevel); if ((windebuglevel & WINDEBUGLEVEL_FLUSH) != 0) { windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_FLUSH) != 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_FLUSH,MF_UNCHECKED); windebuglevel &= ~WINDEBUGLEVEL_FLUSH; }else{ windebug(WINDEBUGLEVEL_1,"(windebuglevel & WINDEBUGLEVEL_FLUSH) = 0"); CheckMenuItem(hSystemSubMenu,MM_WINDEBUGLEVEL_FLUSH,MF_CHECKED); windebuglevel |= WINDEBUGLEVEL_FLUSH; } windebug(WINDEBUGLEVEL_1,"finished MM_WINDEBUGLEVEL_FLUSH, windebuglevel = %X", windebuglevel); return 0; case IDM_ABOUT: DialogBox(hInst, "AboutBox", hDlg, (DLGPROC)About); return 0; case IDM_CREDITS: DialogBox(hInst, "AboutBox", hDlg, (DLGPROC)Credits); return 0; case IDM_DF: DialogBox(hInst, "AboutBox", hDlg, (DLGPROC)Dreamforge); return 0; case IDM_LICENSE: DialogBox(hInst, "AboutBox", hDlg, (DLGPROC)IRCDLicense); return 0; case IDM_IRCDCONF: DialogBox(hInst, "Dlg_IRCDCONF", hDlg, (DLGPROC)Dlg_IRCDCONF); return 0; case IDM_IRCDMOTD: DialogBox(hInst, "DLG_IRCDMOTD", hDlg, (DLGPROC)Dlg_IRCDMOTD); return 0; case IDM_IRCDRULES: DialogBox(hInst, "DLG_IRCDRULES", hDlg, (DLGPROC)Dlg_IRCDRULES); return 0; case IDM_REHASH: MessageBox(hDlg,"Server Rehashing ....","Unreal wIRCd3",MB_OK | MB_APPLMODAL); s_rehash(); return 0; case IDM_EXIT: if ( MessageBox(hDlg, "Are you sure?", "Terminate UnrealIRCD/32", MB_ICONQUESTION | MB_YESNO) == IDNO ) return 0; DestroyWindow(hDlg); return 0; } return 0; case WM_RBUTTONDBLCLK: case WM_LBUTTONDBLCLK: // emulate default menu item for double click DialogBox(hInst, "Dlg_IRCDCONF", hDlg, (DLGPROC)Dlg_IRCDCONF); break; case WM_LBUTTONDOWN: { POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); /* Config popup */ if ((p.x >= 149) && (p.x <= 198) && (p.y >= 173) && (p.y <= 186)) { ClientToScreen(hDlg,&p); TrackPopupMenu(hSystemSubMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, p.x,p.y,0,hDlg,NULL); return 0; } /* about popup */ if ((p.x >= 206) && (p.x <= 252) && (p.y >= 173) && (p.y <= 186)) { ClientToScreen(hDlg,&p); TrackPopupMenu(hHelpSubMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, p.x,p.y,0,hDlg,NULL); return 0; } /* rehash button */ if ((p.x >= 31) && (p.x <= 81) && (p.y >= 173) && (p.y <= 186)) { PostMessage(hDlg, WM_COMMAND, IDM_REHASH, 0); return 0; } /* quit button */ if ((p.x >= 264) && (p.x <= 328) && (p.y >= 173) && (p.y <= 186)) { PostMessage(hDlg, WM_COMMAND, IDM_EXIT, 0); return 0; } /* status button */ if ((p.x >= 93) && (p.x <= 138) && (p.y >= 173) && (p.y <= 186)) { if (hStatsWnd == NULL){ DialogBox(hInst, /*"WIRCDSTATUS"*/"DLG_STATS", NULL, (DLGPROC)wStatusDLG); return 0; }else{ if (SetForegroundWindow(hStatsWnd)==0){ windebug(WINDEBUG_FORCE,"Error at BringWindowToTop(), Err=%d",GetLastError()); } return 0; } } break; } case WM_CLOSE: PostMessage(hDlg, WM_COMMAND, IDM_EXIT, 0); return 0; /* Fall through to destroy the window and then send to WM_QUIT to the msg que*/ case WM_DESTROY: KillTimer(hDlg, UPDATE_TIMER); localdie(); /* Never returns *//* i hope it does ... */ /* Ok ... It doesnt ... That _NEEDS_ Fixing !!!!!*/ /* Fixed -- i hope */ PostQuitMessage(0); return 0; case WM_QUIT: if ( MessageBox(hDlg, "WM_QUIT Are you sure?", "Terminate UnrealIRCd/32", MB_ICONQUESTION | MB_YESNO | MB_APPLMODAL) == IDNO ) return 0; return 0; } DefWindowProc(hDlg, message, wParam, lParam); return 0; } LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: #define Ccat strcat(String, String2) { char String[16384], String2[16384], **s = infotext; wsprintf(String, "%s\n%s", version, creation); SetDlgItemText(hDlg, IDC_VERSION, String); String[0] = 0; String2[0] = 0; wsprintf(String2, "-=-=-=-=-=-==-==- %s -=-=-==-==-=-=-=-=-=-\r\n", ircnetwork); Ccat; wsprintf(String2, "|Web Page: | http://www.%s\r\n", netdomain); Ccat; wsprintf(String2, "|FTP Archive: | ftp://ftp.%s\r\n", netdomain); Ccat; wsprintf(String2, "|Help channel: | %s\r\n", helpchan); Ccat; wsprintf(String2, "|=-=-=-=-=-==-==|-=-=-=-=-=-=-==-==-=-=-=-=-=-=-=\r\n"); Ccat; wsprintf(String2, "|IRCd version: | %s\r\n", IRCDTOTALVERSION); Ccat; wsprintf(String2, "| Programmer: | Stskeeps \r\n"); Ccat; wsprintf(String2, "| Win32 Coders: | DrBin \r\n"); Ccat; wsprintf(String2, "| | codemastr \r\n"); Ccat; wsprintf(String2, "| | {X} \r\n"); Ccat; #if defined(_WIN32) && defined(WIN32_SPECIFY) wsprintf(String2, "| Win32 Porter: | %s\r\n", WIN32_PORTER); Ccat; wsprintf(String2, "| >>URL: | %s\r\n", WIN32_URL); Ccat; #endif wsprintf(String2, "|Credits: | Type /Credits\r\n"); Ccat; wsprintf(String2, "|DALnet Credits:| Type /DALinfo\r\n"); Ccat; wsprintf(String2, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); Ccat; wsprintf(String2, "| Unreal IRCd can be downloaded at http://unreal.tspre.org\r\n"); Ccat; wsprintf(String2, "| This notice may not be removed from the IRCd package\r\n"); Ccat; wsprintf(String2, "| It will be a violation of copyright. This program must always\r\n"); Ccat; wsprintf(String2, "| stay free of charge being sold commercially or privately\r\n"); Ccat; wsprintf(String2, "| Only charge may be for the transport medium like on CD-ROM, floppy\r\n"); Ccat; wsprintf(String2, "| or other kinds (-Stskeeps'1999)\r\n"); Ccat; wsprintf(String2, "--------------------------------------------\r\n"); Ccat; SetDlgItemText(hDlg, IDC_INFOTEXT, String); #undef Ccat ShowWindow (hDlg, SW_SHOW); return (TRUE); } case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return FALSE; } /* * FUNCTION: Credits(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "Credits" dialog box * This version allows greater flexibility over the contents of the 'Credits' box, * by pulling out values from the 'Version' resource. * * MESSAGES: * * WM_INITDIALOG - initialize dialog box * WM_COMMAND - Input received * */ LRESULT CALLBACK Credits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char String[16384], **s = unrealcredits; wsprintf(String, "%s\n%s", version, creation); SetDlgItemText(hDlg, IDC_VERSION, String); String[0] = 0; while ( *s ) { strcat(String, *s++); if ( *s ) strcat(String, "\r\n"); } SetDlgItemText(hDlg, IDC_INFOTEXT, String); ShowWindow (hDlg, SW_SHOW); return (TRUE); } case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return FALSE; } /* * FUNCTION: Dreamforge(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "Dreamforge" dialog box * This version allows greater flexibility over the contents of the 'Dreamforge' box, * by pulling out values from the 'Version' resource. * * MESSAGES: * * WM_INITDIALOG - initialize dialog box * WM_COMMAND - Input received * */ LRESULT CALLBACK Dreamforge(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char String[16384], **s = dalinfotext; wsprintf(String, "%s\n%s", version, creation); SetDlgItemText(hDlg, IDC_VERSION, String); String[0] = 0; while ( *s ) { strcat(String, *s++); if ( *s ) strcat(String, "\r\n"); } SetDlgItemText(hDlg, IDC_INFOTEXT, String); ShowWindow (hDlg, SW_SHOW); return (TRUE); } case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return FALSE; } /* * FUNCTION: IRCDLicense(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "IRCDLicense" dialog box * This version allows greater flexibility over the contents of the 'IRCDLicense' box, * by pulling out values from the 'Version' resource. * * MESSAGES: * * WM_INITDIALOG - initialize dialog box * WM_COMMAND - Input received * */ LRESULT CALLBACK IRCDLicense(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char String[16384], **s = gnulicense; wsprintf(String, "%s\n%s", version, creation); SetDlgItemText(hDlg, IDC_VERSION, String); String[0] = 0; while ( *s ) { strcat(String, *s++); if ( *s ) strcat(String, "\r\n"); } SetDlgItemText(hDlg, IDC_INFOTEXT, String); ShowWindow (hDlg, SW_SHOW); return (TRUE); } case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return FALSE; } /* * FUNCTION: Dlg_IrcdConf(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box * */ LRESULT CALLBACK Dlg_IRCDCONF(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char *Buffer = MyMalloc(65535); /* Should be big enough */ int fd, Len; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCd/32 Setup", MB_OK); EndDialog(hDlg, FALSE); return FALSE; } /* Open the ircd.conf file */ fd = open(CONFIGFILE, _O_RDONLY | _O_BINARY); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open configuration file", "UnrealIRCd/32 Setup", MB_OK); MyFree(Buffer); EndDialog(hDlg, FALSE); return FALSE; } Buffer[0] = 0; /* Incase read() fails */ Len = read(fd, Buffer, 65535); Buffer[Len] = 0; /* Set the text for the edit control to what was in the file */ SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)Buffer); close(fd); MyFree(Buffer); } return (TRUE); case WM_COMMAND: if ( LOWORD(wParam) == IDOK ) { char *Buffer = MyMalloc(65535); /* Should be big enough */ DWORD Len; int fd; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCD/32 Setup", MB_OK); return TRUE; } /* Open the ircd.conf file */ fd = open(CONFIGFILE, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY, S_IREAD|S_IWRITE); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open configuration file", "UnrealIRCD/32 Setup", MB_OK); MyFree(Buffer); return TRUE; } /* Get the text from the edit control and save it to disk. */ Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535, (LPARAM)(LPCTSTR)Buffer); write(fd, Buffer, Len); close(fd); MyFree(Buffer); EndDialog(hDlg, TRUE); return TRUE; } if ( LOWORD(wParam) == IDCANCEL ) { EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } /* * FUNCTION: Dlg_Dlg_IRCdMotd(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box * */ LRESULT CALLBACK Dlg_IRCDMOTD(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char *Buffer = MyMalloc(65535*2); /* Should be big enough */ int fd, Len; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCd/32 Setup", MB_OK); EndDialog(hDlg, FALSE); return FALSE; } /* Open the ircd.motd file */ fd = open(MPATH, _O_RDONLY | _O_BINARY); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open MOTD file", "UnrealIRCd/32 Setup", MB_OK); MyFree(Buffer); EndDialog(hDlg, FALSE); return FALSE; } Buffer[0] = 0; /* Incase read() fails */ Len = read(fd, Buffer, 65535); Buffer[Len] = 0; /* Set the text for the edit control to what was in the file */ SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)Buffer); close(fd); MyFree(Buffer); } return (TRUE); case WM_COMMAND: if ( LOWORD(wParam) == IDOK ) { char *Buffer = MyMalloc(65535); /* Should be big enough */ DWORD Len; int fd; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCD/32 Setup", MB_OK); return TRUE; } /* Open the ircd.motd file */ fd = open(MPATH, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY, S_IREAD|S_IWRITE); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open motd file", "UnrealIRCD/32 Setup", MB_OK); MyFree(Buffer); return TRUE; } /* Get the text from the edit control and save it to disk. */ Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535, (LPARAM)(LPCTSTR)Buffer); write(fd, Buffer, Len); close(fd); MyFree(Buffer); EndDialog(hDlg, TRUE); return TRUE; } if ( LOWORD(wParam) == IDCANCEL ) { EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } /* * FUNCTION: Dlg_IRCdRules(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box * */ LRESULT CALLBACK Dlg_IRCDRULES(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { char *Buffer = MyMalloc(65535*2); /* Should be big enough */ int fd, Len; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCd/32 Setup", MB_OK); EndDialog(hDlg, FALSE); return FALSE; } /* Open the ircd.rules file */ fd = open(RPATH, _O_RDONLY | _O_BINARY); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open rules file", "UnrealIRCd/32 Setup", MB_OK); MyFree(Buffer); EndDialog(hDlg, FALSE); return FALSE; } Buffer[0] = 0; /* Incase read() fails */ Len = read(fd, Buffer, 65535); Buffer[Len] = 0; /* Set the text for the edit control to what was in the file */ SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)Buffer); close(fd); MyFree(Buffer); } return (TRUE); case WM_COMMAND: if ( LOWORD(wParam) == IDOK ) { char *Buffer = MyMalloc(65535); /* Should be big enough */ DWORD Len; int fd; if ( !Buffer ) { MessageBox(hDlg, "Error: Could not allocate temporary buffer", "UnrealIRCD/32 Setup", MB_OK); return TRUE; } /* Open the ircd.rules file */ fd = open(RPATH, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY, S_IREAD|S_IWRITE); if ( fd == -1 ) { MessageBox(hDlg, "Error: Could not open rules file", "UnrealIRCD/32 Setup", MB_OK); MyFree(Buffer); return TRUE; } /* Get the text from the edit control and save it to disk. */ Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535, (LPARAM)(LPCTSTR)Buffer); write(fd, Buffer, Len); close(fd); MyFree(Buffer); EndDialog(hDlg, TRUE); return TRUE; } if ( LOWORD(wParam) == IDCANCEL ) { EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } /* * FUNCTION: wStatusDLG(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box * */ HWND hreditwnd; LRESULT CALLBACK wStatusDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwTreeView/*hreditwnd*/; POINT p; char string[1024]; const int i=0; LPNMTREEVIEW lpnmtv; static HWND hgraph; RECT TV; switch (message) { case WM_INITDIALOG: { CHARFORMAT2 FontFormat; WINSTATS pWSTATS /*= (pWINSTATS) LocalAlloc (LPTR, sizeof(pWINSTATS))*/; windebug(WINDEBUGLEVEL_1,"wStatusDLG recieved WM_INITDIALOG"); hStatsWnd = hDlg; TV.left=14; TV.right=140; TV.top=14; TV.bottom=240; SetLastError(0); if ((hreditwnd=CreateWindowEx(WS_EX_CLIENTEDGE,RICHEDIT_CLASS ,"Unreal wIRCd 3", WS_VISIBLE | WS_CHILD | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY , 0, 245, 535, 185, hDlg, NULL, hInst, NULL))==NULL) MessageBox(NULL,"garhle","grargle", MB_OK); if (GetLastError()!=0) windebug(WINDEBUG_FORCE,"error %d",GetLastError()); FontFormat.cbSize = sizeof(CHARFORMAT2); FontFormat.yHeight = 8 * 20 /* We measure it in twips (1/20th of a point !)*/; FontFormat.crTextColor = RGB(0,150,0); lstrcpyn(FontFormat.szFaceName, "Lucida Console", sizeof("Lucida Console"));;; FontFormat.dwMask = CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_BOLD | CFM_PROTECTED; SendMessage(hreditwnd,EM_SETCHARFORMAT,SCF_ALL,&FontFormat); hwTreeView = CreateATreeView(hDlg,TV); win_map(NULL, &me, "*", 0, 60,hwTreeView); windebug(WINDEBUGLEVEL_2,"hDlg = %d",hDlg); windebug(WINDEBUGLEVEL_2,"win_map completed"); // for (i=0;i LastError = %u",GetLastError()); }else{ } }*/ } return (TRUE); case WM_DESTROY: // MessageBox(NULL,"destroying ....","WM_DESTROY",MB_OK); // windebug(WINDEBUG_FORCE,"hreditwnd = %d , TreeViewCount = %d",hreditwnd,TreeView_GetCount(hwTreeView)); // for (i=0;icode) { case TVN_SELCHANGED : lpnmtv = ((LPNMTREEVIEW) lParam); wsprintf(string, "%d",lpnmtv->itemNew.hItem); SetDlgItemText(hDlg,EDIT_CHANNELS,string); break; // Handle other notifications here. } break; case WM_RBUTTONDOWN: { p.x = LOWORD(lParam); p.y = HIWORD(lParam); wsprintf(String, "Clicked at (%li, %li)", p.x, p.y); SetWindowText(hDlg, String); } return TRUE; case WM_COMMAND: if ( LOWORD(wParam) == IDOK ) { EndDialog(hDlg, TRUE); return TRUE; } if ( LOWORD(wParam) == IDCANCEL ) { EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } HTREEITEM AddItemToTree (HWND hWnd, LPSTR lpszItem, int nLevel) { TVITEM tvi; TVINSERTSTRUCT tvins; static HTREEITEM hPrev = (HTREEITEM) TVI_FIRST; static HTREEITEM hPrevRootItem = NULL; static HTREEITEM hPrevLev2Item = NULL; HTREEITEM hti; tvi.mask = TVIF_TEXT | TVIF_PARAM; // Set the text of the item. tvi.pszText = lpszItem; tvi.cchTextMax = lstrlen(lpszItem); // Assume the item is not a parent item, so give it a // document image. // tvi.iImage = g_nDocument; // tvi.iSelectedImage = g_nDocument; // Save the heading level in the item's application-defined // data area. tvi.lParam = (LPARAM) nLevel; tvins.item = tvi; tvins.hInsertAfter = hPrev; // Set the parent item based on the specified level. if (nLevel == 1) tvins.hParent = TVI_ROOT; else if (nLevel == 2) tvins.hParent = hPrevRootItem; else tvins.hParent = hPrevLev2Item; // Add the item to the tree view control. hPrev = (HTREEITEM) SendMessage(hWnd, TVM_INSERTITEM, 0, (LPARAM) (LPTVINSERTSTRUCT) &tvins); // Save the handle to the item. if (nLevel == 1) hPrevRootItem = hPrev; else if (nLevel == 2) { hPrevLev2Item = hPrev; TreeView_EnsureVisible(hWnd,hPrev); } // The new item is a child item. Give the parent item a // closed folder bitmap to indicate it now has child items. if (nLevel > 1) { hti = TreeView_GetParent(hWnd, hPrev); tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = hti; // tvi.iImage = g_nClosed; // tvi.iSelectedImage = g_nClosed; TreeView_SetItem(hWnd, &tvi); } return hPrev; } // CreateATreeView - creates a tree view control. // Returns the handle to the new control if successful, // or NULL otherwise. // hwndParent - handle to the control's parent window. // lpszFileName - name of the file to parse for tree view items. HWND CreateATreeView(HWND hwndParent/*, LPSTR lpszFileName*/,RECT rcClient) { // RECT rcClient; // dimensions of client area HWND hwndTV; // handle to tree view control // Ensure that the common control DLL is loaded. InitCommonControls(); // Get the dimensions of the parent window's client area, and create // the tree view control. //GetClientRect(hwndParent, &rcClient); hwndTV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "Tree View", WS_VISIBLE | WS_CHILD /*| WS_BORDER | */| TVS_HASBUTTONS /*| TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS */ | TVS_HASLINES, 0, 0, rcClient.right, rcClient.bottom, hwndParent, NULL/*(HMENU) ID_TREEVIEW*/, hInst, NULL); // Initialize the image list, and add items to the control. // InitTreeViewImageLists and InitTreeViewItems are application- // defined functions. /* if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV, lpszFileName)) { DestroyWindow(hwndTV); return FALSE; }*/ return hwndTV; } /* * Based on the New /MAP format [dump_map()] -Potvin * Now used to create list of servers for server list tree view -- David Flynn */ void win_map(cptr, server, mask, prompt_length, length, hwTreeView) aClient *cptr, *server; char *mask; register int prompt_length; int length; HWND hwTreeView; { static char prompt[64]; register char *p = &prompt[prompt_length]; register int cnt = 0, local = 0; aClient *acptr; for (acptr = client; acptr; acptr = acptr->next) { if (IsPerson(acptr)) { ++cnt; /* == */ if (!strcmp(acptr->user->server, server->name)) ++local; } } // sendto_one(cptr, rpl_str(RPL_MAP), me.name, cptr->name, prompt, length, server->name, // local, (local*100)/cnt ); AddItemToTree (hwTreeView,server->name,1+prompt_length); cnt = 0; /* if (prompt_length > 0) { p[-1] = ' '; if (p[-2] == '`') p[-2] = ' '; }*/ // if (prompt_length > 60) return; strcpy(p, "|-"); for (acptr = client; acptr ; acptr = acptr->next) { if ( !IsServer (acptr) || strcmp(acptr->serv->up, server->name)) continue; if ( match(mask, acptr->name) ) acptr->flags &= ~FLAGS_MAP; else { acptr->flags |= FLAGS_MAP; cnt++; } } for (acptr = client; acptr ; acptr = acptr->next) { if ( ! (acptr->flags & FLAGS_MAP) || /* != */ !IsServer (acptr) || strcmp(acptr->serv->up, server->name)) continue; if (--cnt == 0) *p = '`'; win_map (cptr, acptr, mask, prompt_length+1, length-2,hwTreeView); } if (prompt_length > 0) p[-1] = '-'; } /**************************************************************** ********** Graphy !!!! (C) David Flynn 2000 *****************/ LRESULT CALLBACK GraphCtlProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { HDC mem; PAINTSTRUCT ps; RECT r; switch (msg) { case WM_CREATE: { RECT temprect; HDC hdc; LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam; PGRAPHINFO pSCI = (PGRAPHINFO) LocalAlloc (LPTR, sizeof(GRAPHINFO)); if (!pSCI) { MessageBox (NULL, "It Seems that you have a potential problem ... \n This function dont want to do a LocallAlloc() ... Report this at once !!!!", (LPCTSTR) "GRAPHCNT.DLL", MB_OK | MB_ICONEXCLAMATION); return -1; } hgraphwnd=hwnd; /* ** I am initialising the "constants" now ... as they could be a root to my problems */ pSCI->Grid = 0x00008000; pSCI->BackColor = 0x00000000; pSCI->GridColor = 0x00008000; pSCI->CPUColor = 0x00000000; GetClientRect(hwnd,&temprect); pSCI->WindowSize.cx = temprect.right; pSCI->WindowSize.cy = temprect.bottom; windebug(WINDEBUGLEVEL_2,"memset(pSCI->cpuhistory, -1, 2048)"); memset(pSCI->cpuhistory, -1, 2048); windebug(WINDEBUGLEVEL_2,"memset completed"); windebug(WINDEBUGLEVEL_2,"hwnd = %d",hwnd); /* ** Alloc the compatible DC for this control. */ pSCI->DCBack = GetDC (hwnd); windebug(WINDEBUGLEVEL_2,"got hdc"); pSCI->DCDblBuff = CreateCompatibleDC (pSCI->DCBack); if (pSCI->DCDblBuff == NULL) { windebug(WINDEBUG_FORCE,"Damn Bloody Errors ... pSCI->DCDblBuff == NULL ... GAH !"); }else{ windebug(WINDEBUGLEVEL_2,"[((pSCI->DCDblBuff (=%d) = CreateCompatibleDC (hdc)) != NULL)] ~> GOOD!!!",pSCI->DCDblBuff); } /* ** Baa ... What is going on here, i ask myself ... referencing things before i have initialised them .. ** -- fixed !!!! */ pSCI->BMDblBuff = CreateCompatibleBitmap(pSCI->DCBack, pSCI->WindowSize.cx, pSCI->WindowSize.cy); if ((pSCI->BMDblBuff == NULL)) { windebug(WINDEBUG_FORCE,"According to my calculations ... pSCI->BMDblBuff = NULL --Ooops"); }else{ windebug(WINDEBUGLEVEL_2,"Created Compatable Bitmap (pSCI->BMDblBuff) from (pSCI->DCBack)"); } pSCI->OldDblBuff = (HBITMAP)SelectObject(pSCI->DCDblBuff, pSCI->BMDblBuff); windebug(WINDEBUGLEVEL_2,"Selected (pSCI->BMDblBuff) into (pSCI->DCDblBuff) -- old value saved to (pSCI->OldDblBuff)"); ReleaseDC (hwnd, pSCI->DCBack); windebug(WINDEBUGLEVEL_2,"Released (hdc)"); SetLastError(0); SetWindowLong (hwnd, GWL_GRAPHDATA, (LONG) pSCI); // windebug(WINDEBUGLEVEL_2,"Saved (pSCI) into (hwnd) offset = GWL_GRAPHDATA, Last error =%u",GetLastError()); // SetTimer (hwnd, GRAPH_EVENT, UPDATE_INTERVAL, NULL); // windebug(WINDEBUGLEVEL_2,"SetTimer"); return 1; } case WM_ERASEBKGND: { windebug(WINDEBUGLEVEL_2,"recieved WM_ERASEBKGND"); } return 1; case WM_PAINT: windebug(WINDEBUGLEVEL_2,"recieved WM_PAINT"); SetLastError(0); { PGRAPHINFO pSCI = (PGRAPHINFO) GetWindowLong (hwnd, GWL_GRAPHDATA); if (pSCI==NULL) { windebug(WINDEBUGLEVEL_2,"Error from GetWindowLong ~> %u",GetLastError); return FALSE; } windebug(WINDEBUGLEVEL_2,"got pSCI from GetWindowLong()"); windebug(WINDEBUGLEVEL_2,"Testing pSCI .... pSCI->BMDblBuff=%d",pSCI->BMDblBuff); GetClientRect(hwnd, &r); windebug(WINDEBUGLEVEL_2,"got GetClientRect()=&r= r.bottom->%d, r.left->%d, r.right->%d, r.top->%d",r.bottom ,r.left,r.right,r.top); DrawMonitor(pSCI->DCDblBuff, r,hwnd); windebug(WINDEBUGLEVEL_2,"DrawMonitor returned"); mem = BeginPaint(hwnd, &ps); BitBlt(mem, 0, 0, pSCI->WindowSize.cx, pSCI->WindowSize.cy, pSCI->DCDblBuff, 0, 0, SRCCOPY); EndPaint(hwnd, &ps); DeleteDC(mem); return 0; } case (WM_USER + 1): GetClientRect(hwnd, &r); InvalidateRect(hwnd, &r, FALSE); case WM_TIMER: windebug(WINDEBUGLEVEL_2,"recieved WM_TIMER"); switch (wParam) { case GRAPH_EVENT: { windebug(WINDEBUGLEVEL_2," -> Specifically GRAPH_EVENT"); {PGRAPHINFO pSCI = (PGRAPHINFO) GetWindowLong (hwnd, GWL_GRAPHDATA); if (pSCI == NULL) windebug(WINDEBUGLEVEL_2,"Failed retreval of pSCI"); pSCI->cpuhistory[pSCI->cpupointer] = (rand()%100)/1.5+20/**data*/; pSCI->cpupointer++; pSCI->cpupointer %= pSCI->width; SetWindowLong (hwnd, GWL_GRAPHDATA, (LONG) pSCI); // Invalidate client. This causes a WM_PAINT message to be sent to our window GetClientRect(hwnd, &r); InvalidateRect(hwnd, &r, FALSE); break; } } } break; case WM_DESTROY: { PGRAPHINFO pSCI = (PGRAPHINFO) GetWindowLong (hwnd, GWL_GRAPHDATA); // KillTimer(hwnd, GRAPH_EVENT); hStatsWnd = NULL; //New DoubleBuffer Code //SelectObject(DCBack, OldBack); if(pSCI->DCBack) DeleteDC(pSCI->DCBack); if(pSCI->BMBack) DeleteObject(pSCI->BMBack); //Free our DoubleBuffer Handles if(pSCI->DCDblBuff) { SelectObject(pSCI->DCDblBuff, pSCI->OldDblBuff); DeleteDC(pSCI->DCDblBuff); } pSCI->DCDblBuff = NULL; if(pSCI->BMDblBuff) { DeleteObject(pSCI->BMDblBuff); } pSCI->BMDblBuff = NULL; LocalFree (LocalHandle ((LPVOID) pSCI)); } break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; } void DrawMonitor(HDC hdc, RECT r,HWND hwnd) { { windebug(WINDEBUGLEVEL_2,"Entering DrawMonitor"); } { PGRAPHINFO pSCI = (PGRAPHINFO) GetWindowLong (hwnd, GWL_GRAPHDATA); int i, j; HBRUSH brush; HPEN pen, oldpen, dotpen; HBITMAP graphmask; HDC image, mask; int height; int BorderTop = 0, BorderBottom = 0, BorderLeft= 0,BorderRight=0; windebug(WINDEBUGLEVEL_2,"Got pSCI from hwnd (=%d)",hwnd); windebug(WINDEBUGLEVEL_2,"initialised vars"); // Set border r.top += BorderTop; r.bottom -= BorderBottom; r.left += BorderLeft; r.right -= BorderRight; windebug(WINDEBUGLEVEL_2,"initialised vars -- 1"); pSCI->width = (r.right - r.left); // Width of graph height = (r.bottom - r.top); // Height of graph windebug(WINDEBUGLEVEL_2,"initialised vars -- 2"); windebug(WINDEBUGLEVEL_2,"pSCI->Background=%d,pSCI->BMBack=%d,pSCI->BMDblBuff=%d,pSCI->BackColor=%d,pSCI->GridColor=%d,pSCI->WindowSize.cx=%d,pSCI->WindowSize.cy=%d,pSCI->cpupointer=%d",pSCI->Background,pSCI->BMBack,pSCI->BMDblBuff,pSCI->BackColor,pSCI->GridColor,pSCI->WindowSize.cx,pSCI->WindowSize.cy,pSCI->cpupointer); // Draw Background /*if (Background) { HDC src = CreateCompatibleDC(NULL); SelectObject(src, Background); BitBlt(hdc, 0, 0, WindowSize.cx, WindowSize.cy, src, 0, 0, SRCCOPY); DeleteObject(src); } else*/ { brush = CreateSolidBrush(pSCI->BackColor); FillRect(hdc, &r, brush); DeleteObject(brush); } // Draw Grid if (pSCI->Grid) { pen = CreatePen(PS_SOLID, 1, pSCI->GridColor); oldpen = SelectObject(hdc, pen); for (i=1; i<((r.bottom - r.top)%10 + 1); i++) { MoveToEx(hdc, r.left, r.top +/* ((r.bottom - r.top) / 10)*/ 10 * i, NULL); LineTo(hdc, r.right/*-1*/, r.top + /*((r.bottom - r.top) / 10)*/ 10 * i); windebug(WINDEBUGLEVEL_2,"i =%d, pen = %d , oldpen = %d , pSCI->Grid = %d", i,pen,oldpen,pSCI->Grid); } for (i=1; i<((r.right-r.left)/10+/*pSCI->cpupointer*/usernumpointer); i++) { MoveToEx(hdc, r.left + ((/*(r.right-r.left) / */ 10)*i-(/*pSCI->cpupointer*/usernumpointer)), r.top, NULL); LineTo(hdc, r.left + ((/*(r.right-r.left)/ */ 10)*i-(/*pSCI->cpupointer*/usernumpointer)), r.bottom/*-1*/); } SelectObject(hdc, oldpen); DeleteObject(pen); } windebug(WINDEBUGLEVEL_2,"Drawn Grid"); /* mask = CreateCompatibleDC(NULL); graphmask = CreateCompatibleBitmap(mask, pSCI->WindowSize.cx, pSCI->WindowSize.cy); SelectObject(mask, graphmask); brush = CreateSolidBrush(0x0FFFFFF); FillRect(mask, &r, brush); DeleteObject(brush); pen = CreatePen(PS_SOLID, 1, 0x0FFFFF); SelectObject(mask, pen); oldpen = SelectObject(mask, pen);*/ j = (/*pSCI->cpupointer*/ usernumpointer + pSCI->width) % pSCI->width; if (usernumhistory/*pSCI->cpuhistory*/[j-1]!= -1){ //MoveToEx(mask, r.left, r.bottom-(height * pSCI->cpuhistory[j]/100), NULL); for (i=0; iwidth; i++) { j++; j %= pSCI->width; // MoveToEx(mask, r.left+i, r.bottom-(height * pSCI->cpuhistory[j]/100), NULL); // LineTo(mask, r.left+i, r.bottom); //windebug(WINDEBUGLEVEL_2,"j = %d pSCI->width= %d , i= %d , pSCI->cpuhistory[j]=%d pSCI->cpuhistory[j+1]= %d pSCI->cpuhistory[j-1]= %d",j,pSCI->width,i,pSCI->cpuhistory[j],pSCI->cpuhistory[j+1],pSCI->cpuhistory[j-1]); if (i==0) MoveToEx(hdc, r.left-1, r.bottom-(pSCI->width * usernumhistory/*pSCI->cpuhistory*/[j]/ MAXCLIENTS /*(1+lu_mlu+(lu_mlu*(75/100)))*/), NULL); dotpen = CreatePen(PS_SOLID, 0, 0x0000FF00); oldpen = SelectObject(hdc, dotpen); LineTo(hdc, r.left+i, r.bottom-(pSCI->width * usernumhistory/*pSCI->cpuhistory*/[j]/ MAXCLIENTS/*(1+lu_mlu+(lu_mlu*(75/100)))*/)); SelectObject(hdc, oldpen); DeleteObject(dotpen); } } // SelectObject(mask, oldpen); // DeleteObject(pen); // image = CreateCompatibleDC(NULL); // SelectObject(image, CPUMap); // BitBlt(hdc, BorderLeft, BorderTop,pSCI->width, height, image, BorderLeft, BorderTop, SRCINVERT); //BitBlt(hdc, BorderLeft, BorderTop,width, height, mask, BorderLeft, BorderTop, SRCAND); // BitBlt(hdc, BorderLeft, BorderTop,pSCI->width, height, image, BorderLeft, BorderTop, SRCINVERT); DeleteObject(graphmask); // DeleteObject(CPUMap); DeleteDC(mask); // DeleteDC(image); SetWindowLong (hwnd, GWL_GRAPHDATA, (LONG) pSCI); } } /*************************************************************** ***************** Debug Code Added 14-02 ********************* ***************** Modified 16-02 ********************/ void windebug(level, form, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) int level; char *form, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10; { static char windebugbuf[1024]; static char windebugbuf2[1024]; char tmpbuf[128]; char tmpbuf2[128]; /* 0x0000001 = General Debug 0x0000002 = Graphy Specific Debug 0x0000004 = [undefined] 0x0000008 = [undefined] 0x0000010 = [undefined] */ if (((windebuglevel & level) != 0)||(level & WINDEBUG_FORCE)) { int err = WSAGetLastError(); (void)sprintf(windebugbuf, form, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); _strdate( tmpbuf ); _strtime( tmpbuf2 ); (void)sprintf(windebugbuf2, "%s %s::%s", tmpbuf,tmpbuf2,windebugbuf ); strcat(windebugbuf2, "\n"); fprintf(debugfile,windebugbuf2); if (((windebuglevel & WINDEBUGLEVEL_FLUSH) != 0)||(level & WINDEBUG_FORCE)) fflush(debugfile); WSASetLastError(err); } if (0) { SETTEXTEX TextEx; TextEx.codepage = CP_ACP; SendMessage(hreditwnd,EM_SETTEXTEX,&TextEx,form); } } int SetDebugLevel(HWND hWnd, int NewLevel) { HMENU hMenu = GetMenu(hWnd); if ( !hMenu || !(hMenu = GetSubMenu(hMenu, 1)) || !(hMenu = GetSubMenu(hMenu, 4)) ) return -1; CheckMenuItem(hMenu, IDM_DBGFATAL+debuglevel, MF_BYCOMMAND | MF_UNCHECKED); debuglevel = NewLevel; CheckMenuItem(hMenu,IDM_DBGFATAL+debuglevel, MF_BYCOMMAND | MF_CHECKED); return debuglevel; } /**************************************************************/ int GUI_TextWaiting(char *szInBuf,int iLength) { return 0; } /* ** GetOSVersion() ** ** Use :: Gets os version .. sets gbIsWinNT to True if OS= WinNT ** */ void GetOSVersion(void) { OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(GetVersionEx(&osvi)==FALSE) { MessageBox( NULL,"Unable to get version info", "GetOSVersion()", MB_OK ); } if(osvi.dwPlatformId==VER_PLATFORM_WIN32s) { MessageBox( NULL,"This application does not run under WIN32s!", "Error", MB_OK ); } if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) gbIsWinNT = 1; else gbIsWinNT = 0; } /* VOID SvcDebugOut(LPSTR String, DWORD Status) { CHAR Buffer[1024]; if (strlen(String) < 1000) { sprintf(Buffer, String, Status); OutputDebugStringA(Buffer); } } /* Write Service Start stuff ... *//* VOID StartUnrealService (DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; ServiceStatusHandle = RegisterServiceCtrlHandler( "Unreal wIRCd", ServiceCtrlHandler); if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); return; } // Initialization code goes here. status = ServiceInitialization(argc,argv, &specificError); // Handle error condition if (status != NO_ERROR) { ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; ServiceStatus.dwWin32ExitCode = status; ServiceStatus.dwServiceSpecificExitCode = specificError; SetServiceStatus (ServiceStatusHandle, &ServiceStatus); return; } // Initialization complete - report running status. ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); } // This is where the service does its work. SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0); return; } // Stub initialization function. DWORD ServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) { argv; argc; specificError; return(0); } VOID ServiceCtrlHandler (DWORD Opcode) { DWORD status; switch(Opcode) { // case SERVICE_CONTROL_PAUSE: // Do whatever it takes to pause here. // ServiceStatus.dwCurrentState = SERVICE_PAUSED; // break; //case SERVICE_CONTROL_CONTINUE: // Do whatever it takes to continue here. // ServiceStatus.dwCurrentState = SERVICE_RUNNING; // break; case SERVICE_CONTROL_STOP: // Do whatever it takes to stop here. ServiceStatus.dwWin32ExitCode = 0; // ServiceStatus.dwCurrentState = SERVICE_STOPPED_PENDING; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); } SvcDebugOut(" [MY_SERVICE] Leaving Service \n",0); return; case SERVICE_CONTROL_INTERROGATE: // Fall through to send current status. break; default: SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n", Opcode); } // Send current status. if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); } return; } */