X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=w32log.c;h=9a69cb8cc1ad8a8466d5d5d43dc727939bdfc7a9;hp=7cb41ffc1ee81aed1c5e4eacd801b7f77cb13767;hb=52feb95cca9309b54829313054d8f4befabbd028;hpb=8d7cdd184298be68f6864c828ae592656ba6b43c diff --git a/w32log.c b/w32log.c index 7cb41ffc..9a69cb8c 100644 --- a/w32log.c +++ b/w32log.c @@ -1,4 +1,4 @@ -const char w32log_rcs[] = "$Id: w32log.c,v 1.23 2002/03/26 22:57:10 jongfoster Exp $"; +const char w32log_rcs[] = "$Id: w32log.c,v 1.35 2009/07/21 16:29:57 ler762 Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32log.c,v $ @@ -6,7 +6,7 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.23 2002/03/26 22:57:10 jongfoster E * Purpose : Functions for creating and destroying the log window, * ouputting strings, processing messages and so on. * - * Copyright : Written by and Copyright (C) 2001-2002 members of + * Copyright : Written by and Copyright (C) 2001-2009 members of * the Privoxy team. http://www.privoxy.org/ * * Written by and Copyright (C) 1999 Adam Lock @@ -30,123 +30,8 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.23 2002/03/26 22:57:10 jongfoster E * or write to the Free Software Foundation, Inc., 59 * Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Revisions : - * $Log: w32log.c,v $ - * Revision 1.23 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * Revision 1.22 2002/03/24 12:48:23 jongfoster - * Fixing doc links - * - * Revision 1.21 2002/03/24 12:07:35 jongfoster - * Consistern name for filters file - * - * Revision 1.20 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.19 2002/01/17 21:04:17 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.18 2001/11/30 23:37:24 jongfoster - * Renaming the Win32 config file to config.txt - this is almost the - * same as the corresponding UNIX name "config" - * - * Revision 1.17 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.16 2001/08/01 19:58:12 jongfoster - * Fixing documentation filenames in help menu, and making status - * option work without needing the "Junkbuster Status.URL" file. - * - * Revision 1.15 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.14 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.13 2001/07/19 19:15:14 haroon - * - Added a FIXME for EditFile but didn't fix :-) - * - * Revision 1.12 2001/07/13 14:04:59 oes - * Removed all #ifdef PCRS - * - * Revision 1.11 2001/06/07 23:08:12 jongfoster - * Forward and ACL edit options removed. - * - * Revision 1.10 2001/05/31 21:37:11 jongfoster - * GUI changes to rename "permissions file" to "actions file". - * - * Revision 1.9 2001/05/31 17:33:13 oes - * - * CRLF -> LF - * - * Revision 1.8 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/permissionslist. - * File format is still under discussion, but the internal changes - * are (mostly) done. - * - * Also modified interceptor behaviour: - * - We now intercept all URLs beginning with one of the following - * prefixes (and *only* these prefixes): - * * http://i.j.b/ - * * http://ijbswa.sf.net/config/ - * * http://ijbswa.sourceforge.net/config/ - * - New interceptors "home page" - go to http://i.j.b/ to see it. - * - Internal changes so that intercepted and fast redirect pages - * are not replaced with an image. - * - Interceptors now have the option to send a binary page direct - * to the client. (i.e. ijb-send-banner uses this) - * - Implemented show-url-info interceptor. (Which is why I needed - * the above interceptors changes - a typical URL is - * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". - * The previous mechanism would not have intercepted that, and - * if it had been intercepted then it then it would have replaced - * it with an image.) - * - * Revision 1.7 2001/05/26 01:26:34 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * - * Revision 1.6 2001/05/26 00:31:30 jongfoster - * Fixing compiler warning about comparing signed/unsigned. - * - * Revision 1.5 2001/05/26 00:28:36 jongfoster - * Automatic reloading of config file. - * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). - * Most of the global variables have been moved to a new - * struct configuration_spec, accessed through csp->config->globalname - * Most of the globals remaining are used by the Win32 GUI. - * - * Revision 1.4 2001/05/22 18:56:28 oes - * CRLF -> LF - * - * Revision 1.3 2001/05/20 15:07:54 jongfoster - * File is now ignored if _WIN_CONSOLE is defined. - * - * Revision 1.2 2001/05/20 01:21:20 jongfoster - * Version 2.9.4 checkin. - * - Merged popupfile and cookiefile, and added control over PCRS - * filtering, in new "permissionsfile". - * - Implemented LOG_LEVEL_FATAL, so that if there is a configuration - * file error you now get a message box (in the Win32 GUI) rather - * than the program exiting with no explanation. - * - Made killpopup use the PCRS MIME-type checking and HTTP-header - * skipping. - * - Removed tabs from "config" - * - Moved duplicated url parsing code in "loaders.c" to a new funcition. - * - Bumped up version number. - * - * Revision 1.1.1.1 2001/05/15 13:59:07 oes - * Initial import of version 2.9.3 source tree - * - * *********************************************************************/ - + #include "config.h" @@ -218,6 +103,9 @@ const char w32log_h_rcs[] = W32LOG_H_VERSION; /* Indicates whether task bar shows activity animation */ BOOL g_bShowActivityAnimation = 1; +/* Indicates whether the log window is shown */ +BOOL g_bShowLogWindow = 1; + /* Indicates if the log window appears on the task bar */ BOOL g_bShowOnTaskBar = 0; @@ -237,7 +125,7 @@ BOOL g_bLimitBufferSize = 1; int g_nMaxBufferLines = DEFAULT_MAX_BUFFER_LINES; /* Font to use */ -char g_szFontFaceName[255] = DEFAULT_LOG_FONT_NAME; +char g_szFontFaceName[32] = DEFAULT_LOG_FONT_NAME; /* Size of font to use */ int g_nFontSize = DEFAULT_LOG_FONT_SIZE; @@ -245,7 +133,8 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE; /* FIXME: this is a kludge */ -const char * g_actions_file = NULL; +const char * g_default_actions_file = NULL; +const char * g_user_actions_file = NULL; const char * g_re_filterfile = NULL; #ifdef FEATURE_TRUST const char * g_trustfile = NULL; @@ -253,8 +142,6 @@ const char * g_trustfile = NULL; /* FIXME: end kludge */ - -#ifdef REGEX /* Regular expression for detected URLs */ #define RE_URL "http:[^ \n\r]*" @@ -272,7 +159,21 @@ static struct _Pattern { RE_URL, STYLE_LINK }, /* { "[a-zA-Z0-9]+\\.[a-zA-Z0-9]+\\.[a-zA-Z0-9]+\\.[^ \n\r]*", STYLE_LINK }, */ /* interesting text to highlight */ - { "crunch!", STYLE_HIGHLIGHT }, + /* see jcc.c crunch_reason for the full list */ + { "Crunch: Blocked:", STYLE_HIGHLIGHT }, + { "Crunch: Untrusted", STYLE_HIGHLIGHT }, + { "Crunch: Redirected:", STYLE_HIGHLIGHT }, + { "Crunch: DNS failure", STYLE_HIGHLIGHT }, + { "Crunch: Forwarding failed", STYLE_HIGHLIGHT }, + { "Crunch: Connection failure", STYLE_HIGHLIGHT }, + { "Crunch: Out of memory", STYLE_HIGHLIGHT }, + { "Connect: Found reusable socket", STYLE_HIGHLIGHT }, + { "Connect: Reusing server socket", STYLE_HIGHLIGHT }, + { "Connect: Created new connection to", STYLE_HIGHLIGHT }, + { "hung up on us", STYLE_HIGHLIGHT }, + { "Crunching Referer:", STYLE_HIGHLIGHT }, + /* what are all the possible error strings?? */ + { "Error:", STYLE_HIGHLIGHT }, /* http headers */ { "referer:", STYLE_HEADER }, { "proxy-connection:", STYLE_HEADER }, @@ -300,13 +201,12 @@ static struct _Pattern /* this is the terminator statement - do not delete! */ { NULL, STYLE_NONE } }; -#endif /* def REGEX */ - /* * Public variables */ HWND g_hwndLogFrame; +HICON g_hiconApp; /* * Private variables @@ -317,7 +217,7 @@ static HWND g_hwndLogBox; static WNDPROC g_fnLogBox; static HICON g_hiconAnim[ANIM_FRAMES]; static HICON g_hiconIdle; -static HICON g_hiconApp; +static HICON g_hiconOff; static int g_nAnimFrame; static BOOL g_bClipPending = FALSE; static int g_nRichEditVersion = 0; @@ -335,6 +235,7 @@ static void LogClipBuffer(void); static void LogCreatePatternMatchingBuffers(void); static void LogDestroyPatternMatchingBuffers(void); static int LogPutStringNoMatch(const char *pszText, int style); +static void SetIdleIcon(void); /********************************************************************* @@ -354,6 +255,7 @@ BOOL InitLogWindow(void) /* Load the icons */ g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE)); + g_hiconOff = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_OFF)); for (i = 0; i < ANIM_FRAMES; i++) { g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i)); @@ -396,6 +298,7 @@ void TermLogWindow(void) TrayDeleteIcon(g_hwndTray, 1); DeleteObject(g_hiconApp); DeleteObject(g_hiconIdle); + DeleteObject(g_hiconOff); for (i = 0; i < ANIM_FRAMES; i++) { DeleteObject(g_hiconAnim[i]); @@ -417,14 +320,11 @@ void TermLogWindow(void) *********************************************************************/ void LogCreatePatternMatchingBuffers(void) { -#ifdef REGEX int i; for (i = 0; patterns_to_highlight[i].str != NULL; i++) { regcomp(&patterns_to_highlight[i].buffer, patterns_to_highlight[i].str, REG_ICASE); } -#endif - } @@ -441,14 +341,11 @@ void LogCreatePatternMatchingBuffers(void) *********************************************************************/ void LogDestroyPatternMatchingBuffers(void) { -#ifdef REGEX int i; for (i = 0; patterns_to_highlight[i].str != NULL; i++) { regfree(&patterns_to_highlight[i].buffer); } -#endif - } @@ -466,7 +363,6 @@ void LogDestroyPatternMatchingBuffers(void) char *LogGetURLUnderCursor(void) { char *szResult = NULL; -#ifdef REGEX regex_t re; POINT ptCursor; POINTL ptl; @@ -509,7 +405,6 @@ char *LogGetURLUnderCursor(void) regfree(&re); } -#endif return szResult; } @@ -520,7 +415,7 @@ char *LogGetURLUnderCursor(void) * Function : LogPutString * * Description : Inserts text into the logging window. This is really - * a REGEXP aware wrapper function to `LogPutStringNoMatch'. + * a regexp aware wrapper function to `LogPutStringNoMatch'. * * Parameters : * 1 : pszText = pointer to string going to the log window @@ -532,9 +427,7 @@ char *LogGetURLUnderCursor(void) *********************************************************************/ int LogPutString(const char *pszText) { -#ifdef REGEX int i; -#endif int result = 0; if (pszText == NULL || strlen(pszText) == 0) @@ -552,7 +445,6 @@ int LogPutString(const char *pszText) */ EnterCriticalSection(&g_criticalsection); -#ifdef REGEX if (g_bHighlightMessages) { regmatch_t match; @@ -607,13 +499,10 @@ int LogPutString(const char *pszText) } } } -#endif result = LogPutStringNoMatch(pszText, STYLE_NONE); -#ifdef REGEX end: -#endif LeaveCriticalSection(&g_criticalsection); return result; @@ -659,9 +548,11 @@ int LogPutStringNoMatch(const char *pszText, int style) /* Apply a formatting style */ memset(&format, 0, sizeof(format)); format.cbSize = sizeof(format); - format.dwMask = CFM_BOLD | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_ITALIC | CFM_COLOR | CFM_FACE | CFM_SIZE; + format.dwMask = CFM_BOLD | CFM_UNDERLINE | CFM_STRIKEOUT | + CFM_ITALIC | CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_CHARSET; + format.bCharSet = DEFAULT_CHARSET; format.yHeight = (g_nFontSize * 1440) / 72; - strcpy(format.szFaceName, g_szFontFaceName); + strlcpy(format.szFaceName, g_szFontFaceName, sizeof(format.szFaceName)); if (style == STYLE_NONE) { /* DO NOTHING */ @@ -763,10 +654,17 @@ void LogClipBuffer(void) SendMessage(g_hwndLogBox, EM_REPLACESEL, FALSE, (LPARAM) ""); SendMessage(g_hwndLogBox, EM_SETOPTIONS, ECOOP_XOR, ECO_AUTOVSCROLL); - /* Restore old selection */ + /* reposition (back to) the end of the log content */ + range.cpMin = SendMessage (g_hwndLogBox, WM_GETTEXTLENGTH, 0, 0); + range.cpMax = -1; + SendMessage(g_hwndLogBox, EM_EXSETSEL, 0, (LPARAM) &range); + + /* restore vertical ScrollBar stuff (messed up by AUTOVSCROLL) */ + SendMessage (g_hwndLogBox, EM_SCROLL, SB_LINEDOWN, 0); + } -} +} /********************************************************************* @@ -793,7 +691,7 @@ HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; - wc.hIcon = 0; + wc.hIcon = g_hiconApp; wc.hCursor = 0; wc.hbrBackground = 0; wc.lpszMenuName = 0; @@ -895,12 +793,14 @@ HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow) nCmdShow == SW_MINIMIZE || nCmdShow == SW_SHOWMINNOACTIVE)) { + g_bShowLogWindow = FALSE; nCmdShow = SW_HIDE; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); + GetClientRect(g_hwndLogFrame, &rcClient); SetWindowPos(g_hwndLogBox, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_NOZORDER); @@ -966,6 +866,7 @@ void ShowLogWindow(BOOL bShow) { SetForegroundWindow(g_hwndLogFrame); SetWindowPos(g_hwndLogFrame, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); + } else if (g_bShowOnTaskBar) { @@ -975,7 +876,6 @@ void ShowLogWindow(BOOL bShow) { ShowWindow(g_hwndLogFrame, SW_HIDE); } - } @@ -1065,8 +965,10 @@ void OnLogCommand(int nCommand) { switch (nCommand) { - case ID_SHOWWINDOW: - ShowLogWindow(TRUE); + case ID_TOGGLE_SHOWWINDOW: + g_bShowLogWindow = !g_bShowLogWindow; + + ShowLogWindow(g_bShowLogWindow); break; case ID_FILE_EXIT: @@ -1104,8 +1006,8 @@ void OnLogCommand(int nCommand) #ifdef FEATURE_TOGGLE /* by haroon - change toggle to its opposite value */ case ID_TOGGLE_ENABLED: - g_bToggleIJB = !g_bToggleIJB; - if (g_bToggleIJB) + global_toggle_state = !global_toggle_state; + if (global_toggle_state) { log_error(LOG_LEVEL_INFO, "Now toggled ON."); } @@ -1113,6 +1015,7 @@ void OnLogCommand(int nCommand) { log_error(LOG_LEVEL_INFO, "Now toggled OFF."); } + SetIdleIcon(); break; #endif /* def FEATURE_TOGGLE */ @@ -1120,8 +1023,12 @@ void OnLogCommand(int nCommand) EditFile(configfile); break; - case ID_TOOLS_EDITACTIONS: - EditFile(g_actions_file); + case ID_TOOLS_EDITDEFAULTACTIONS: + EditFile(g_default_actions_file); + break; + + case ID_TOOLS_EDITUSERACTIONS: + EditFile(g_user_actions_file); break; case ID_TOOLS_EDITFILTERS: @@ -1178,7 +1085,8 @@ void OnLogCommand(int nCommand) void OnLogInitMenu(HMENU hmenu) { /* Only enable editors if there is a file to edit */ - EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED)); + EnableMenuItem(hmenu, ID_TOOLS_EDITDEFAULTACTIONS, MF_BYCOMMAND | (g_default_actions_file ? MF_ENABLED : MF_GRAYED)); + EnableMenuItem(hmenu, ID_TOOLS_EDITUSERACTIONS, MF_BYCOMMAND | (g_user_actions_file ? MF_ENABLED : MF_GRAYED)); EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED)); #ifdef FEATURE_TRUST EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED)); @@ -1191,8 +1099,9 @@ void OnLogInitMenu(HMENU hmenu) CheckMenuItem(hmenu, ID_VIEW_ACTIVITYANIMATION, MF_BYCOMMAND | (g_bShowActivityAnimation ? MF_CHECKED : MF_UNCHECKED)); #ifdef FEATURE_TOGGLE /* by haroon - menu item for Enable toggle on/off */ - CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (global_toggle_state ? MF_CHECKED : MF_UNCHECKED)); #endif /* def FEATURE_TOGGLE */ + CheckMenuItem(hmenu, ID_TOGGLE_SHOWWINDOW, MF_BYCOMMAND | (g_bShowLogWindow ? MF_CHECKED : MF_UNCHECKED)); } @@ -1219,7 +1128,7 @@ void OnLogTimer(int nTimer) case TIMER_ANIMSTOP_ID: g_nAnimFrame = 0; - TraySetIcon(g_hwndTray, 1, g_hiconIdle); + SetIdleIcon(); KillTimer(g_hwndLogFrame, TIMER_ANIM_ID); KillTimer(g_hwndLogFrame, TIMER_ANIMSTOP_ID); break; @@ -1240,6 +1149,31 @@ void OnLogTimer(int nTimer) } +/********************************************************************* + * + * Function : SetIdleIcon + * + * Description : Sets the tray icon to either idle or off + * + * Parameters : none + * + * Returns : N/A + * + *********************************************************************/ +void SetIdleIcon() +{ +#ifdef FEATURE_TOGGLE + if (!global_toggle_state) + { + TraySetIcon(g_hwndTray, 1, g_hiconOff); + /* log_error(LOG_LEVEL_INFO, "Privoxy OFF icon selected."); */ + } + else +#endif /* def FEATURE_TOGGLE */ + TraySetIcon(g_hwndTray, 1, g_hiconIdle); +} + + /********************************************************************* * * Function : LogRichEditProc @@ -1266,8 +1200,16 @@ LRESULT CALLBACK LogRichEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa pt.y = HIWORD(lParam); ClientToScreen(hwnd, &pt); OnLogRButtonUp(wParam, pt.x, pt.y); + return 0; + } + case WM_CHAR: + { + if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */ + { + OnLogCommand(ID_VIEW_CLEARLOG); + return 0; + } } - return 0; } return CallWindowProc(g_fnLogBox, hwnd, uMsg, wParam, lParam); @@ -1307,6 +1249,7 @@ LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara return 0; case WM_SHOWWINDOW: + g_bShowLogWindow = wParam; case WM_SIZE: /* Resize the logging window to fit the new frame */ if (g_hwndLogBox) @@ -1344,6 +1287,14 @@ LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara return 0; } break; + + case WM_CHAR: + if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */ + { + OnLogCommand(ID_VIEW_CLEARLOG); + return 0; + } + break; } return DefWindowProc(hwnd, uMsg, wParam, lParam);