int plat_setvid(int api) { int i; win_log("Initializing VIDAPI: api=%d\n", api); startblit(); video_wait_for_blit(); /* Close the (old) API. */ vid_apis[0][vid_api].close(); vid_api = api; if (vid_apis[0][vid_api].local) ShowWindow(hwndRender, SW_SHOW); else ShowWindow(hwndRender, SW_HIDE); /* Initialize the (new) API. */ i = vid_apis[0][vid_api].init((void *)hwndRender); endblit(); if (! i) return(0); device_force_redraw(); vid_api_inited = 1; return(1); }
void exit_stunnel(int code) { /* used instead of exit() on Win32 */ win_log(""); log(LOG_ERR, "Server is down"); MessageBox(hwnd, "Stunnel server is down due to an error.\n" "You need to exit and correct the problem.\n" "Click OK to see the error log window.", options.win32_service, MB_ICONERROR); error_mode=1; longjmp(jump_buf, 1); }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { char exe_file_name[MAX_PATH], dir[MAX_PATH], *ptr; static struct WSAData wsa_state; ghInst=hInstance; GetModuleFileName(0, exe_file_name, MAX_PATH); /* set current directory */ strcpy(dir, exe_file_name); ptr=strrchr(dir, '\\'); /* last backslash */ if(ptr) ptr[1]='\0'; /* truncate program name */ if(!SetCurrentDirectory(dir)) { MessageBox(hwnd, "Cannot set current directory", options.win32_name, MB_ICONERROR); return 1; } /* setup service_path for CreateService() */ strcpy(service_path, "\""); strcat(service_path, exe_file_name); strcat(service_path, "\" -service"); /* strcat(service_path, lpszCmdLine); */ if(WSAStartup(0x0101, &wsa_state)) { win_log("Failed to initialize winsock"); error_mode=1; } if(!strcmpi(lpszCmdLine, "-service")) { if(!setjmp(jump_buf)) main_initialize(NULL, NULL); return start_service(); /* Always start service with -service option */ } if(!error_mode && !setjmp(jump_buf)) { /* TRY */ if(!strcmpi(lpszCmdLine, "-install")) { main_initialize(NULL, NULL); return install_service(); } else if(!strcmpi(lpszCmdLine, "-uninstall")) { main_initialize(NULL, NULL); return uninstall_service(); } else { /* not -service, -install or -uninstall */ main_initialize(lpszCmdLine[0] ? lpszCmdLine : NULL, NULL); } } /* CATCH */ return win_main(hInstance, hPrevInstance, lpszCmdLine, nCmdShow); }
static LRESULT CALLBACK pass_proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char titlebar[STRLEN]; WORD cchPassword; switch (message) { case WM_INITDIALOG: /* Set the default push button to "Cancel." */ SendMessage(hDlg, DM_SETDEFID, (WPARAM) IDCANCEL, (LPARAM) 0); safecopy(titlebar, "Private key: "); safeconcat(titlebar, "options.key"); SetWindowText(hDlg, titlebar); win_log("init"); return TRUE; case WM_COMMAND: /* Set the default push button to "OK" when the user enters text. */ if(HIWORD (wParam) == EN_CHANGE && LOWORD(wParam) == IDE_PASSWORDEDIT) SendMessage(hDlg, DM_SETDEFID, (WPARAM) IDOK, (LPARAM) 0); switch(wParam) { case IDOK: /* Get number of characters. */ cchPassword = (WORD) SendDlgItemMessage(hDlg, IDE_PASSWORDEDIT, EM_LINELENGTH, (WPARAM) 0, (LPARAM) 0); if(cchPassword==0 || cchPassword>=STRLEN) { EndDialog(hDlg, FALSE); return FALSE; } /* Put the number of characters into first word of buffer. */ *((LPWORD)passphrase) = cchPassword; /* Get the characters. */ SendDlgItemMessage(hDlg, IDE_PASSWORDEDIT, EM_GETLINE, (WPARAM) 0, /* line 0 */ (LPARAM) passphrase); passphrase[cchPassword] = 0; /* Null-terminate the string. */ EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } return 0; } return FALSE; UNREFERENCED_PARAMETER(lParam); }
void debug( const char *fmt, ... ) { char myoutput[256]; char myoutput2[256]; va_list args; memset(myoutput2,0,256); va_start( args, fmt ); sprintf(myoutput2, "> "); vsprintf( myoutput, fmt, args ); va_end( args ); strncat(myoutput2,myoutput,strlen(myoutput)); win_log(myoutput2); }
void log(int level, const char *format, ...) { va_list arglist; char text[STRLEN], timestamped[STRLEN]; FILE *out; time_t gmt; struct tm *timeptr; #ifdef HAVE_LOCALTIME_R struct tm timestruct; #endif if(level>options.debug_level) return; va_start(arglist, format); #ifdef HAVE_VSNPRINTF vsnprintf(text, STRLEN, format, arglist); #else vsprintf(text, format, arglist); #endif va_end(arglist); #if !defined (USE_WIN32) && !defined (__vms) if(!outfile && options.option.syslog) { syslog(level, "%s", text); return; } #endif /* USE_WIN32, __vms */ out=outfile?outfile:stderr; time(&gmt); #ifdef HAVE_LOCALTIME_R timeptr=localtime_r(&gmt, ×truct); #else timeptr=localtime(&gmt); #endif #ifdef HAVE_SNPRINTF snprintf(timestamped, STRLEN, #else sprintf(timestamped, #endif "%04d.%02d.%02d %02d:%02d:%02d LOG%d[%lu:%lu]: %s", timeptr->tm_year+1900, timeptr->tm_mon+1, timeptr->tm_mday, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, level, stunnel_process_id(), stunnel_thread_id(), text); #ifdef USE_WIN32 win_log(timestamped); /* Always log to the GUI window */ if(outfile) /* to the file - only if it exists */ #endif { fprintf(out, "%s\n", timestamped); fflush(out); } }
/* * We do this here since there is platform-specific stuff * going on here, and we do it in a function separate from * main() so we can call it from the UI module as well. */ void do_start(void) { LARGE_INTEGER qpc; /* We have not stopped yet. */ quited = 0; /* Initialize the high-precision timer. */ timeBeginPeriod(1); QueryPerformanceFrequency(&qpc); timer_freq = qpc.QuadPart; win_log("Main timer precision: %llu\n", timer_freq); /* Start the emulator, really. */ thMain = thread_create(pc_thread, &quited); SetThreadPriority(thMain, THREAD_PRIORITY_HIGHEST); }
NOEXPORT void invalid_config() { /* update the main window title */ win32_name=TEXT("stunnel ") TEXT(STUNNEL_VERSION) TEXT(" on ") TEXT(STUNNEL_PLATFORM) TEXT(" (invalid configuration file)"); SetWindowText(hwnd, win32_name); /* log window is hidden by default */ ShowWindow(hwnd, SW_SHOWNORMAL); /* show window */ SetForegroundWindow(hwnd); /* bring on top */ update_tray_icon(-1); /* error icon */ win_log(""); s_log(LOG_ERR, "Server is down"); message_box("Stunnel server is down due to an error.\n" "You need to exit and correct the problem.\n" "Click OK to see the error log window.", MB_ICONERROR); }
void log_raw(const char *format, ...) { va_list arglist; char text[STRLEN]; FILE *out; va_start(arglist, format); #ifdef HAVE_VSNPRINTF vsnprintf(text, STRLEN, format, arglist); #else vsprintf(text, format, arglist); #endif va_end(arglist); out=outfile?outfile:stderr; #ifdef USE_WIN32 win_log(text); #else fprintf(out, "%s\n", text); fflush(out); #endif }
static LRESULT CALLBACK settings_proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char tempchar[25]; switch(message) { case WM_INITDIALOG: //win_log("init settings"); portA=saved_portA; portB=saved_portB; portS=saved_portS; mode2=saved_mode2; mode1=saved_mode1; keepalive=saved_keepalive; ssl_proxy=saved_ssl_proxy; ip_service=saved_ip_service; allow=saved_allow; refuse=saved_refuse; refuse2=saved_refuse2; strcpy(sample1,saved_sample1); strcpy(sample2,saved_sample2); strcpy(sample3,saved_sample3); SetDlgItemText(hDlg, IDC_ACCEPTPORT, _itoa(portA,tempchar,10)); SetDlgItemText(hDlg, IDC_LISTENPORT, _itoa(portB,tempchar,10)); SendDlgItemMessage(hDlg, IDC_ENABLE,BM_SETCHECK,mode2,0); SendDlgItemMessage(hDlg, IDC_ENABLE2,BM_SETCHECK,mode1,0); SendDlgItemMessage(hDlg, IDC_KEEPALIVE,BM_SETCHECK,keepalive,0); SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_SETCHECK,ssl_proxy,0); SendDlgItemMessage(hDlg, IDC_ENABLE4,BM_SETCHECK,ip_service,0); SendDlgItemMessage(hDlg, IDC_ALLOW,BM_SETCHECK,allow,0); SendDlgItemMessage(hDlg, IDC_REFUSE,BM_SETCHECK,refuse,0); SendDlgItemMessage(hDlg, IDC_REFUSE2,BM_SETCHECK,refuse2,0); SetDlgItemText(hDlg, IDC_EDITALLOW, sample1); SetDlgItemText(hDlg, IDC_EDITREFUSE, sample2); SetDlgItemText(hDlg, IDC_EDITREFUSE2, sample3); SetDlgItemText(hDlg, IDC_PORTSERVER, _itoa(portS,tempchar,10)); if (mode2) { EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 1); EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 1); } else { EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 0); EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 0); } if (allow) EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 0); if (refuse) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 0); if (refuse2) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 0); return TRUE; case WM_COMMAND: switch(wParam) { case IDC_ENABLE: if (SendDlgItemMessage(hDlg, IDC_ENABLE,BM_GETCHECK,0,0)== BST_CHECKED) mode2=1; else mode2=0; if (mode2) { EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 1); EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 1); } else { EnableWindow(GetDlgItem(hDlg, IDC_LISTENPORT), 0); EnableWindow(GetDlgItem(hDlg, IDC_BITMAP1), 0); } break; case IDC_ENABLE2: if (SendDlgItemMessage(hDlg, IDC_ENABLE2,BM_GETCHECK,0,0)== BST_CHECKED) mode1=1; else mode1=0; case IDC_KEEPALIVE: if (SendDlgItemMessage(hDlg, IDC_KEEPALIVE,BM_GETCHECK,0,0)== BST_CHECKED) keepalive=1; else keepalive=0; case IDC_ENABLE3: if (SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_GETCHECK,0,0)== BST_CHECKED) ssl_proxy=1; else ssl_proxy=0; case IDC_ENABLE4: if (SendDlgItemMessage(hDlg, IDC_ENABLE3,BM_GETCHECK,0,0)== BST_CHECKED) ip_service=1; else ip_service=0; case IDC_ALLOW: if (SendDlgItemMessage(hDlg, IDC_ALLOW,BM_GETCHECK,0,0)== BST_CHECKED) allow=1; else allow=0; if (allow) EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITALLOW), 0); break; case IDC_REFUSE: if(SendDlgItemMessage(hDlg, IDC_REFUSE,BM_GETCHECK,0,0)== BST_CHECKED) refuse=1; else refuse=0; if (refuse) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE), 0); break; case IDC_REFUSE2: if(SendDlgItemMessage(hDlg, IDC_REFUSE2,BM_GETCHECK,0,0)== BST_CHECKED) refuse2=1; else refuse2=0; if (refuse2) EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 1); else EnableWindow(GetDlgItem(hDlg, IDC_EDITREFUSE2), 0); break; case IDOK: GetDlgItemText(hDlg, IDC_ACCEPTPORT, tempchar, 25); portA=atoi(tempchar); GetDlgItemText(hDlg, IDC_LISTENPORT, tempchar, 25); portB=atoi(tempchar); GetDlgItemText(hDlg, IDC_PORTSERVER, tempchar, 25); portS=atoi(tempchar); GetDlgItemText(hDlg, IDC_EDITALLOW, sample1,1024); GetDlgItemText(hDlg, IDC_EDITREFUSE, sample2,1024); GetDlgItemText(hDlg, IDC_EDITREFUSE2, sample3,1024); saved_portA=portA; saved_portB=portB; saved_portS=portS; saved_mode2=mode2; saved_mode1=mode1; saved_keepalive=keepalive; saved_ssl_proxy=ssl_proxy; saved_ip_service=ip_service; saved_allow=allow; saved_refuse=refuse; saved_refuse2=refuse2; strcpy(saved_sample1,sample1); strcpy(saved_sample2,sample2); strcpy(saved_sample3,sample3); Save_settings(); win_log("Settings Saved: WARNING, new settings become active after restart !"); case IDCANCEL: EndDialog(hDlg, TRUE); return TRUE; } } return FALSE; }
NOEXPORT LRESULT CALLBACK window_proc(HWND main_window_handle, UINT message, WPARAM wParam, LPARAM lParam) { POINT pt; RECT rect; PAINTSTRUCT ps; SERVICE_OPTIONS *section; unsigned section_number; LPTSTR txt; #if 0 switch(message) { case WM_CTLCOLORSTATIC: case WM_TIMER: case WM_LOG: break; default: s_log(LOG_DEBUG, "Window message: 0x%x(0x%hx,0x%lx)", message, wParam, lParam); } #endif switch(message) { case WM_CREATE: #ifdef _WIN32_WCE /* create command bar */ command_bar_handle=CommandBar_Create(ghInst, main_window_handle, 1); if(!command_bar_handle) error_box(TEXT("CommandBar_Create")); if(!CommandBar_InsertMenubar(command_bar_handle, ghInst, IDM_MAINMENU, 0)) error_box(TEXT("CommandBar_InsertMenubar")); if(!CommandBar_AddAdornments(command_bar_handle, 0, 0)) error_box(TEXT("CommandBar_AddAdornments")); #endif /* create child edit window */ edit_handle=CreateWindowEx(WS_EX_STATICEDGE, TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_READONLY, 0, 0, 0, 0, main_window_handle, (HMENU)IDE_EDIT, ghInst, NULL); #ifndef _WIN32_WCE SendMessage(edit_handle, WM_SETFONT, (WPARAM)CreateFont(-12, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, TEXT("Courier")), MAKELPARAM(FALSE, 0)); /* no need to redraw right now */ #endif /* NOTE: there's no return statement here -> proceeding with resize */ case WM_SIZE: GetClientRect(main_window_handle, &rect); #ifdef _WIN32_WCE MoveWindow(edit_handle, 0, CommandBar_Height(command_bar_handle), rect.right, rect.bottom-CommandBar_Height(command_bar_handle), TRUE); SendMessage(command_bar_handle, TB_AUTOSIZE, 0L, 0L); CommandBar_AlignAdornments(command_bar_handle); #else MoveWindow(edit_handle, 0, 0, rect.right, rect.bottom, TRUE); #endif UpdateWindow(edit_handle); /* CommandBar_Show(command_bar_handle, TRUE); */ return 0; case WM_SETFOCUS: SetFocus(edit_handle); return 0; case WM_PAINT: BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); break; case WM_CLOSE: ShowWindow(main_window_handle, SW_HIDE); return 0; #ifdef WM_SHOWWINDOW case WM_SHOWWINDOW: visible=(BOOL)wParam; #else /* this works for Pierre Delaage, but not for me... */ case WM_WINDOWPOSCHANGED: visible=IsWindowVisible(main_window_handle); #endif if(tray_menu_handle) CheckMenuItem(tray_menu_handle, IDM_SHOW_LOG, visible ? MF_CHECKED : MF_UNCHECKED); if(visible) update_logs(); #ifdef WM_SHOWWINDOW return 0; #else break; /* proceed to DefWindowProc() */ #endif case WM_DESTROY: #ifdef _WIN32_WCE CommandBar_Destroy(command_bar_handle); #else if(main_menu_handle) { if(!DestroyMenu(main_menu_handle)) ioerror("DestroyMenu"); main_menu_handle=NULL; } #endif tray_delete(); /* remove the taskbark icon if exists */ PostQuitMessage(0); return 0; case WM_COMMAND: if(wParam>=IDM_PEER_MENU && wParam<IDM_PEER_MENU+number_of_sections) { for(section=service_options.next, section_number=0; section && wParam!=IDM_PEER_MENU+section_number; section=section->next, ++section_number) ; if(!section) return 0; if(save_text_file(section->file, section->chain)) return 0; #ifndef _WIN32_WCE if(main_menu_handle) CheckMenuItem(main_menu_handle, (UINT)wParam, MF_CHECKED); #endif if(tray_menu_handle) CheckMenuItem(tray_menu_handle, (UINT)wParam, MF_CHECKED); message_box(section->help, MB_ICONINFORMATION); return 0; } switch(wParam) { case IDM_ABOUT: DialogBox(ghInst, TEXT("AboutBox"), main_window_handle, (DLGPROC)about_proc); break; case IDM_SHOW_LOG: if(visible) { ShowWindow(main_window_handle, SW_HIDE); /* hide window */ } else { ShowWindow(main_window_handle, SW_SHOWNORMAL); /* show window */ SetForegroundWindow(main_window_handle); /* bring on top */ } break; case IDM_CLOSE: ShowWindow(main_window_handle, SW_HIDE); /* hide window */ break; case IDM_EXIT: if(num_clients>=0) /* signal_pipe is active */ signal_post(SIGNAL_TERMINATE); DestroyWindow(main_window_handle); break; case IDM_SAVE_LOG: if(!cmdline.service) /* security */ save_log(); break; case IDM_EDIT_CONFIG: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ edit_config(main_window_handle); #endif break; case IDM_RELOAD_CONFIG: if(num_clients>=0) /* signal_pipe is active */ signal_post(SIGNAL_RELOAD_CONFIG); else SetEvent(config_ready); /* unlock daemon_thread() */ break; case IDM_REOPEN_LOG: signal_post(SIGNAL_REOPEN_LOG); break; case IDM_MANPAGE: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ ShellExecute(main_window_handle, TEXT("open"), TEXT("..\\doc\\stunnel.html"), NULL, NULL, SW_SHOWNORMAL); #endif break; case IDM_HOMEPAGE: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ ShellExecute(main_window_handle, TEXT("open"), TEXT("http://www.stunnel.org/"), NULL, NULL, SW_SHOWNORMAL); #endif break; } return 0; case WM_SYSTRAY: /* a taskbar event */ switch(lParam) { #ifdef _WIN32_WCE case WM_LBUTTONDOWN: /* no right mouse button on Windows CE */ GetWindowRect(GetDesktopWindow(), &rect); /* no cursor position */ pt.x=rect.right; pt.y=rect.bottom-25; #else case WM_RBUTTONDOWN: GetCursorPos(&pt); #endif SetForegroundWindow(main_window_handle); if(tray_menu_handle) TrackPopupMenuEx(GetSubMenu(tray_menu_handle, 0), TPM_BOTTOMALIGN, pt.x, pt.y, main_window_handle, NULL); PostMessage(main_window_handle, WM_NULL, 0, 0); break; #ifndef _WIN32_WCE case WM_LBUTTONDBLCLK: /* switch log window visibility */ if(visible) { ShowWindow(main_window_handle, SW_HIDE); /* hide window */ } else { ShowWindow(main_window_handle, SW_SHOWNORMAL); /* show window */ SetForegroundWindow(main_window_handle); /* bring on top */ } break; #endif } return 0; case WM_VALID_CONFIG: valid_config(); return 0; case WM_INVALID_CONFIG: invalid_config(); return 0; case WM_LOG: txt=(LPTSTR)wParam; win_log(txt); str_free(txt); return 0; case WM_NEW_CHAIN: #ifndef _WIN32_WCE if(main_menu_handle) EnableMenuItem(main_menu_handle, (UINT)(IDM_PEER_MENU+wParam), MF_ENABLED); #endif if(tray_menu_handle) EnableMenuItem(tray_menu_handle, (UINT)(IDM_PEER_MENU+wParam), MF_ENABLED); return 0; case WM_CLIENTS: tray_update((int)wParam); return 0; } return DefWindowProc(main_window_handle, message, wParam, lParam); }
void take_screenshot(void) { wchar_t path[1024], fn[128]; struct tm *info; time_t now; win_log("Screenshot: video API is: %i\n", vid_api); if ((vid_api < 0) || (vid_api >= RENDERERS_NUM)) return; memset(fn, 0, sizeof(fn)); memset(path, 0, sizeof(path)); (void)time(&now); info = localtime(&now); plat_append_filename(path, usr_path, SCREENSHOT_PATH); if (! plat_dir_check(path)) plat_dir_create(path); wcscat(path, L"\\"); wcsftime(fn, 128, L"%Y%m%d_%H%M%S.png", info); wcscat(path, fn); switch(vid_api) { case 0: /* ddraw */ ddraw_take_screenshot(path); break; #ifdef USE_D2D case 1: /* d2d */ d2d_take_screenshot(path); break; case 2: /* d3d9 */ d3d_take_screenshot(path); break; case 3: /* sdl */ sdl_take_screenshot(path); break; #else case 1: /* d3d9 */ d3d_take_screenshot(path); break; case 2: /* sdl */ sdl_take_screenshot(path); break; #endif #ifdef USE_VNC #ifdef USE_D2D case 4: /* vnc */ #else case 3: /* vnc */ #endif vnc_take_screenshot(path); break; #endif } }
NOEXPORT LRESULT CALLBACK window_proc(HWND main_window_handle, UINT message, WPARAM wParam, LPARAM lParam) { NOTIFYICONDATA nid; POINT pt; RECT rect; SERVICE_OPTIONS *section; unsigned int section_number; #if 0 if(message!=WM_CTLCOLORSTATIC && message!=WM_TIMER) s_log(LOG_DEBUG, "Window message: %d", message); #endif switch(message) { case WM_CREATE: #ifdef _WIN32_WCE /* create command bar */ command_bar_handle=CommandBar_Create(ghInst, main_window_handle, 1); if(!command_bar_handle) error_box("CommandBar_Create"); if(!CommandBar_InsertMenubar(command_bar_handle, ghInst, IDM_MAINMENU, 0)) error_box("CommandBar_InsertMenubar"); if(!CommandBar_AddAdornments(command_bar_handle, 0, 0)) error_box("CommandBar_AddAdornments"); #endif /* create child edit window */ edit_handle=CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_READONLY, 0, 0, 0, 0, main_window_handle, (HMENU)IDE_EDIT, ghInst, NULL); #ifndef _WIN32_WCE SendMessage(edit_handle, WM_SETFONT, (WPARAM)CreateFont(-12, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, TEXT("Courier")), MAKELPARAM(FALSE, 0)); /* no need to redraw right, now */ #endif /* NOTE: there's no return statement here -> proceeding with resize */ case WM_SIZE: GetClientRect(main_window_handle, &rect); #ifdef _WIN32_WCE MoveWindow(edit_handle, 0, CommandBar_Height(command_bar_handle), rect.right, rect.bottom-CommandBar_Height(command_bar_handle), TRUE); #else MoveWindow(edit_handle, 0, 0, rect.right, rect.bottom, TRUE); #endif UpdateWindow(edit_handle); /* CommandBar_Show(command_bar_handle, TRUE); */ return TRUE; case WM_SETFOCUS: SetFocus(edit_handle); return TRUE; case WM_TIMER: if(visible) update_logs(); return TRUE; case WM_CLOSE: ShowWindow(main_window_handle, SW_HIDE); return TRUE; case WM_SHOWWINDOW: visible=wParam; /* setup global variable */ if(tray_menu_handle) CheckMenuItem(tray_menu_handle, IDM_SHOW_LOG, visible ? MF_CHECKED : MF_UNCHECKED); if(visible) update_logs(); return TRUE; case WM_DESTROY: #ifdef _WIN32_WCE CommandBar_Destroy(command_bar_handle); #else if(main_menu_handle) DestroyMenu(main_menu_handle); #endif if(tray_menu_handle) DestroyMenu(tray_menu_handle); ZeroMemory(&nid, sizeof nid); nid.cbSize=sizeof nid; nid.hWnd=main_window_handle; nid.uID=1; nid.uFlags=NIF_TIP; /* not really sure what to put here, but it works */ Shell_NotifyIcon(NIM_DELETE, &nid); /* this removes the icon */ PostQuitMessage(0); KillTimer(main_window_handle, 0x29a); return TRUE; case WM_COMMAND: if(wParam>=IDM_PEER_MENU && wParam<IDM_PEER_MENU+number_of_sections) { for(section=service_options.next, section_number=0; section && wParam!=IDM_PEER_MENU+section_number; section=section->next, ++section_number) ; if(!section) return TRUE; if(save_text_file(section->file, section->chain)) return TRUE; #ifndef _WIN32_WCE if(main_menu_handle) CheckMenuItem(main_menu_handle, wParam, MF_CHECKED); #endif if(tray_menu_handle) CheckMenuItem(tray_menu_handle, wParam, MF_CHECKED); message_box(section->help, MB_ICONINFORMATION); return TRUE; } switch(wParam) { case IDM_ABOUT: DialogBox(ghInst, TEXT("AboutBox"), main_window_handle, (DLGPROC)about_proc); break; case IDM_SHOW_LOG: if(visible) { ShowWindow(main_window_handle, SW_HIDE); /* hide window */ } else { ShowWindow(main_window_handle, SW_SHOWNORMAL); /* show window */ SetForegroundWindow(main_window_handle); /* bring on top */ } break; case IDM_CLOSE: ShowWindow(main_window_handle, SW_HIDE); /* hide window */ break; case IDM_EXIT: if(!error_mode) /* signal_pipe is active */ signal_post(SIGNAL_TERMINATE); DestroyWindow(main_window_handle); break; case IDM_SAVE_LOG: if(!cmdline.service) /* security */ save_log(); break; case IDM_EDIT_CONFIG: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ edit_config(main_window_handle); #endif break; case IDM_RELOAD_CONFIG: if(error_mode) /* unlock daemon_thread */ SetEvent(config_ready); else /* signal_pipe is active */ signal_post(SIGNAL_RELOAD_CONFIG); break; case IDM_REOPEN_LOG: signal_post(SIGNAL_REOPEN_LOG); break; case IDM_MANPAGE: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ ShellExecute(main_window_handle, TEXT("open"), TEXT("stunnel.html"), NULL, NULL, SW_SHOWNORMAL); #endif break; case IDM_HOMEPAGE: #ifndef _WIN32_WCE if(!cmdline.service) /* security */ ShellExecute(main_window_handle, TEXT("open"), TEXT("http://www.stunnel.org/"), NULL, NULL, SW_SHOWNORMAL); #endif break; } return TRUE; case WM_SYSTRAY: /* a taskbar event */ switch(lParam) { #ifdef _WIN32_WCE case WM_LBUTTONDOWN: /* no right mouse button on Windows CE */ GetWindowRect(GetDesktopWindow(), &rect); /* no cursor position */ pt.x=rect.right; pt.y=rect.bottom-25; #else case WM_RBUTTONDOWN: GetCursorPos(&pt); #endif SetForegroundWindow(main_window_handle); TrackPopupMenuEx(GetSubMenu(tray_menu_handle, 0), TPM_BOTTOMALIGN, pt.x, pt.y, main_window_handle, NULL); PostMessage(main_window_handle, WM_NULL, 0, 0); break; #ifndef _WIN32_WCE case WM_LBUTTONDBLCLK: /* switch log window visibility */ if(visible) { ShowWindow(main_window_handle, SW_HIDE); /* hide window */ } else { ShowWindow(main_window_handle, SW_SHOWNORMAL); /* show window */ SetForegroundWindow(main_window_handle); /* bring on top */ } break; #endif } return TRUE; case WM_VALID_CONFIG: valid_config(); return TRUE; case WM_INVALID_CONFIG: invalid_config(); return TRUE; case WM_LOG: win_log((LPSTR)wParam); return TRUE; case WM_NEW_CHAIN: #ifndef _WIN32_WCE if(main_menu_handle) EnableMenuItem(main_menu_handle, IDM_PEER_MENU+wParam, MF_ENABLED); #endif if(tray_menu_handle) EnableMenuItem(tray_menu_handle, IDM_PEER_MENU+wParam, MF_ENABLED); return TRUE; case WM_CLIENTS: update_tray_icon((int)wParam); return TRUE; } return DefWindowProc(main_window_handle, message, wParam, lParam); }