From 8501b9e4faa15257535e71b766f06f16b7971e39 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 25 Jun 2015 14:04:38 +0000 Subject: - warning fix - code cleaning git-svn-id: http://svn.miranda-ng.org/main/trunk@14381 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TrafficCounter/src/TrafficCounter.cpp | 843 ++++++++++++-------------- plugins/TrafficCounter/src/misc.cpp | 154 ++--- plugins/TrafficCounter/src/misc.h | 2 +- plugins/TrafficCounter/src/statistics.cpp | 812 ++++++++++++------------- 4 files changed, 833 insertions(+), 978 deletions(-) (limited to 'plugins/TrafficCounter') diff --git a/plugins/TrafficCounter/src/TrafficCounter.cpp b/plugins/TrafficCounter/src/TrafficCounter.cpp index e464d888c2..03c63386d2 100644 --- a/plugins/TrafficCounter/src/TrafficCounter.cpp +++ b/plugins/TrafficCounter/src/TrafficCounter.cpp @@ -33,6 +33,13 @@ HINSTANCE hInst; int hLangpack = 0; // Поддержка плагинозависимого перевода. BOOL bPopupExists = FALSE, bVariablesExists = FALSE, bTooltipExists = FALSE; +static TCHAR tszFormat[] = +_T("{I4}\x0D\x0A\x0A\ +{R65}?tc_GetTraffic(%extratext%,now,sent,d)\x0D\x0A\x0A\ +{R115}?tc_GetTraffic(%extratext%,now,received,d)\x0D\x0A\x0A\ +{R165}?tc_GetTraffic(%extratext%,total,both,d)\x0D\x0A\x0A\ +{L180}?if3(?tc_GetTime(%extratext%,now,hh:mm:ss),)\x0D\x0A\x0A\ +{L230}?if3(?tc_GetTime(%extratext%,total,d hh:mm),)"); TCHAR* TRAFFIC_COUNTER_WINDOW_CLASS = _T("TrafficCounterWnd"); @@ -123,15 +130,15 @@ extern "C" int __declspec(dllexport) Load(void) { // Получаем дескриптор языкового пакета. mir_getLP(&pluginInfoEx); - - HookEvent(ME_OPT_INITIALISE,TrafficCounterOptInitialise); - HookEvent(ME_SYSTEM_MODULESLOADED,TrafficCounterModulesLoaded); - HookEvent(ME_PROTO_ACK,ProtocolAckHook); + + HookEvent(ME_OPT_INITIALISE, TrafficCounterOptInitialise); + HookEvent(ME_SYSTEM_MODULESLOADED, TrafficCounterModulesLoaded); + HookEvent(ME_PROTO_ACK, ProtocolAckHook); HookEvent(ME_PROTO_ACCLISTCHANGED, OnAccountsListChange); HookEvent(ME_SYSTEM_PRESHUTDOWN, TrafficCounterShutdown); HookEvent(ME_SYSTEM_MODULELOAD, ModuleLoad); HookEvent(ME_SYSTEM_MODULEUNLOAD, ModuleLoad); - + return 0; } @@ -156,14 +163,12 @@ int TrafficCounterShutdown(WPARAM wParam, LPARAM lParam) SaveSettings(0); // Удаляем пункт главного меню. - if (hTrafficMainMenuItem) - { + if (hTrafficMainMenuItem) { Menu_RemoveItem(hTrafficMainMenuItem); hTrafficMainMenuItem = NULL; } // Удаляем контекстное меню. - if (TrafficPopupMenu) - { + if (TrafficPopupMenu) { DestroyMenu(TrafficPopupMenu); TrafficPopupMenu = NULL; } @@ -171,8 +176,7 @@ int TrafficCounterShutdown(WPARAM wParam, LPARAM lParam) CallService(MS_SKINENG_REGISTERPAINTSUB, (WPARAM)TrafficHwnd, (LPARAM)NULL); // Удаляем фрейм. - if( (ServiceExists(MS_CLIST_FRAMES_REMOVEFRAME)) && Traffic_FrameID ) - { + if ((ServiceExists(MS_CLIST_FRAMES_REMOVEFRAME)) && Traffic_FrameID) { CallService(MS_CLIST_FRAMES_REMOVEFRAME, (WPARAM)Traffic_FrameID, 0); Traffic_FrameID = NULL; } @@ -198,40 +202,31 @@ int TrafficCounterModulesLoaded(WPARAM wParam, LPARAM lParam) unOptions.Flags = db_get_dw(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_WHAT_DRAW, 0x0882); Stat_SelAcc = db_get_w(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_STAT_ACC_OPT, 0x01); - //settings for notification - Traffic_PopupBkColor = db_get_dw(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_BKCOLOR,RGB(200,255,200)); - Traffic_PopupFontColor = db_get_dw(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_FONTCOLOR,RGB(0,0,0)); - // - Traffic_Notify_time_value = db_get_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_NOTIFY_TIME_VALUE,10); - // - Traffic_Notify_size_value = db_get_w(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_NOTIFY_SIZE_VALUE,100); - // - //popup timeout - Traffic_PopupTimeoutDefault = db_get_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_TIMEOUT_DEFAULT,1); - Traffic_PopupTimeoutValue = db_get_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_TIMEOUT_VALUE,5); - + // settings for notification + Traffic_PopupBkColor = db_get_dw(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_BKCOLOR, RGB(200, 255, 200)); + Traffic_PopupFontColor = db_get_dw(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_FONTCOLOR, RGB(0, 0, 0)); + Traffic_Notify_time_value = db_get_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_NOTIFY_TIME_VALUE, 10); + Traffic_Notify_size_value = db_get_w(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_NOTIFY_SIZE_VALUE, 100); + + // popup timeout + Traffic_PopupTimeoutDefault = db_get_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_TIMEOUT_DEFAULT, 1); + Traffic_PopupTimeoutValue = db_get_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_TIMEOUT_VALUE, 5); + // Формат счётчика для каждого активного протокола - if (db_get_ts(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_COUNTER_FORMAT, &dbv) == 0) - { - if(mir_tstrlen(dbv.ptszVal) > 0) + if (db_get_ts(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_COUNTER_FORMAT, &dbv) == 0) { + if (mir_tstrlen(dbv.ptszVal) > 0) mir_tstrncpy(Traffic_CounterFormat, dbv.ptszVal, _countof(Traffic_CounterFormat)); // db_free(&dbv); } else //defaults here { - mir_tstrcpy(Traffic_CounterFormat, _T("{I4}\x0D\x0A\x0A\ -{R65}?tc_GetTraffic(%extratext%,now,sent,d)\x0D\x0A\x0A\ -{R115}?tc_GetTraffic(%extratext%,now,received,d)\x0D\x0A\x0A\ -{R165}?tc_GetTraffic(%extratext%,total,both,d)\x0D\x0A\x0A\ -{L180}?if3(?tc_GetTime(%extratext%,now,hh:mm:ss),)\x0D\x0A\x0A\ -{L230}?if3(?tc_GetTime(%extratext%,total,d hh:mm),)")); + mir_tstrcpy(Traffic_CounterFormat, tszFormat); } // Формат всплывающих подсказок - if (db_get_ts(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_TOOLTIP_FORMAT, &dbv) == 0) - { - if(mir_tstrlen(dbv.ptszVal) > 0) + if (db_get_ts(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_TOOLTIP_FORMAT, &dbv) == 0) { + if (mir_tstrlen(dbv.ptszVal) > 0) mir_tstrncpy(Traffic_TooltipFormat, dbv.ptszVal, _countof(Traffic_TooltipFormat)); // db_free(&dbv); @@ -278,25 +273,24 @@ int TrafficCounterModulesLoaded(WPARAM wParam, LPARAM lParam) CreateServiceFunction("TrafficCounter/ShowHide", MenuCommand_TrafficShowHide); // Регистрируем горячую клавишу для показа/скрытия фрейма { - HOTKEYDESC hkd = {0}; + HOTKEYDESC hkd = { 0 }; hkd.cbSize = sizeof(hkd); - hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL|HOTKEYF_SHIFT,'T'); + hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL | HOTKEYF_SHIFT, 'T'); hkd.pszSection = "Traffic Counter"; hkd.pszDescription = LPGEN("Show/Hide frame"); hkd.pszName = "TC_Show_Hide"; hkd.pszService = "TrafficCounter/ShowHide"; Hotkey_Register(&hkd); } - + // Добавляем пункт в главное меню. if (unOptions.ShowMainMenuItem) Traffic_AddMainMenuItem(); // Создаём контекстное меню. - if (TrafficPopupMenu = CreatePopupMenu()) - { - AppendMenu(TrafficPopupMenu,MF_STRING,POPUPMENU_HIDE,TranslateT("Hide traffic window")); - AppendMenu(TrafficPopupMenu,MF_STRING,POPUPMENU_CLEAR_NOW,TranslateT("Clear the current (Now:) value")); + if (TrafficPopupMenu = CreatePopupMenu()) { + AppendMenu(TrafficPopupMenu, MF_STRING, POPUPMENU_HIDE, TranslateT("Hide traffic window")); + AppendMenu(TrafficPopupMenu, MF_STRING, POPUPMENU_CLEAR_NOW, TranslateT("Clear the current (Now:) value")); } // Регистрируем обработчики событий Netlib @@ -319,23 +313,22 @@ void SaveSettings(BYTE OnlyCnt) if (OnlyCnt) return; // Для каждого протокола сохраняем флаги - for (i = 0; i < NumberOfAccounts; i++) - { + for (i = 0; i < NumberOfAccounts; i++) { if (!ProtoList[i].name) continue; db_set_b(NULL, ProtoList[i].name, SETTINGS_PROTO_FLAGS, ProtoList[i].Flags); } //settings for notification - db_set_dw(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_BKCOLOR,Traffic_PopupBkColor); - db_set_dw(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_FONTCOLOR,Traffic_PopupFontColor); + db_set_dw(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_BKCOLOR, Traffic_PopupBkColor); + db_set_dw(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_FONTCOLOR, Traffic_PopupFontColor); // - db_set_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_NOTIFY_TIME_VALUE,Traffic_Notify_time_value); + db_set_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_NOTIFY_TIME_VALUE, Traffic_Notify_time_value); // - db_set_w(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_NOTIFY_SIZE_VALUE,Traffic_Notify_size_value); + db_set_w(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_NOTIFY_SIZE_VALUE, Traffic_Notify_size_value); // //popup timeout - db_set_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_TIMEOUT_DEFAULT,Traffic_PopupTimeoutDefault); - db_set_b(NULL,TRAFFIC_SETTINGS_GROUP,SETTINGS_POPUP_TIMEOUT_VALUE,Traffic_PopupTimeoutValue); + db_set_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_TIMEOUT_DEFAULT, Traffic_PopupTimeoutDefault); + db_set_b(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_POPUP_TIMEOUT_VALUE, Traffic_PopupTimeoutValue); // // Формат счётчиков db_set_ts(NULL, TRAFFIC_SETTINGS_GROUP, SETTINGS_COUNTER_FORMAT, Traffic_CounterFormat); @@ -349,63 +342,63 @@ void SaveSettings(BYTE OnlyCnt) } /*--------------------------------------------------------------------------------------------*/ -int TrafficRecv(WPARAM wParam,LPARAM lParam) -{ +int TrafficRecv(WPARAM wParam, LPARAM lParam) +{ NETLIBNOTIFY *nln = (NETLIBNOTIFY*)wParam; NETLIBUSER *nlu = (NETLIBUSER*)lParam; int i; - + if (nln->result > 0) for (i = 0; i < NumberOfAccounts; i++) - if (!mir_strcmp(ProtoList[i].name, nlu->szSettingsModule)) - InterlockedExchangeAdd(&ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords-1].Incoming, nln->result); + if (!mir_strcmp(ProtoList[i].name, nlu->szSettingsModule)) + InterlockedExchangeAdd(&ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Incoming, nln->result); return 0; } -int TrafficSend(WPARAM wParam,LPARAM lParam) -{ +int TrafficSend(WPARAM wParam, LPARAM lParam) +{ NETLIBNOTIFY *nln = (NETLIBNOTIFY*)wParam; NETLIBUSER *nlu = (NETLIBUSER*)lParam; int i; - + if (nln->result > 0) for (i = 0; i < NumberOfAccounts; i++) if (!mir_strcmp(ProtoList[i].name, nlu->szSettingsModule)) - InterlockedExchangeAdd(&ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords-1].Outgoing, nln->result); + InterlockedExchangeAdd(&ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Outgoing, nln->result); return 0; } int TrafficCounter_PaintCallbackProc(HWND hWnd, HDC hDC, RECT * rcPaint, HRGN rgn, DWORD dFlags, void * CallBackData) { - return TrafficCounter_Draw(hWnd,hDC); + return TrafficCounter_Draw(hWnd, hDC); } int TrafficCounter_Draw(HWND hwnd, HDC hDC) { - if (hwnd==(HWND)-1) return 0; - if (GetParent(hwnd) == (HWND)CallService(MS_CLUI_GETHWND, 0, 0)) - return PaintTrafficCounterWindow(hwnd, hDC); - else - InvalidateRect(hwnd,NULL,FALSE); - return 0; + if (hwnd == (HWND)-1) return 0; + if (GetParent(hwnd) == (HWND)CallService(MS_CLUI_GETHWND, 0, 0)) + return PaintTrafficCounterWindow(hwnd, hDC); + else + InvalidateRect(hwnd, NULL, FALSE); + return 0; } static void TC_AlphaText(HDC hDC, LPCTSTR lpString, RECT* lpRect, UINT format, BYTE ClistModernPresent) { - int nCount = (int)mir_tstrlen( lpString ); + int nCount = (int)mir_tstrlen(lpString); if (ClistModernPresent) AlphaText(hDC, lpString, nCount, lpRect, format, Traffic_FontColor); - else - DrawText( hDC, lpString, nCount, lpRect, format ); + else + DrawText(hDC, lpString, nCount, lpRect, format); } -static void TC_DrawIconEx( HDC hdc,int xLeft,int yTop,HICON hIcon, HBRUSH hbrFlickerFreeDraw, BYTE ClistModernPresent) +static void TC_DrawIconEx(HDC hdc, int xLeft, int yTop, HICON hIcon, HBRUSH hbrFlickerFreeDraw, BYTE ClistModernPresent) { if (ClistModernPresent) - mod_DrawIconEx_helper( hdc, xLeft, yTop, hIcon, 16, 16, 0, hbrFlickerFreeDraw, DI_NORMAL ); - else - DrawIconEx( hdc, xLeft, yTop, hIcon, 16, 16, 0, hbrFlickerFreeDraw, DI_NORMAL ); + mod_DrawIconEx_helper(hdc, xLeft, yTop, hIcon, 16, 16, 0, hbrFlickerFreeDraw, DI_NORMAL); + else + DrawIconEx(hdc, xLeft, yTop, hIcon, 16, 16, 0, hbrFlickerFreeDraw, DI_NORMAL); } int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) @@ -416,15 +409,15 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) HBRUSH b, t; HDC hdc; HBITMAP hbmp, oldbmp; - BITMAPINFO RGB32BitsBITMAPINFO = {0}; - BLENDFUNCTION aga = {AC_SRC_OVER, 0, 0xFF, AC_SRC_ALPHA}; + BITMAPINFO RGB32BitsBITMAPINFO = { 0 }; + BLENDFUNCTION aga = { AC_SRC_OVER, 0, 0xFF, AC_SRC_ALPHA }; DWORD SummarySession, SummaryTotal; BYTE ClistModernPresent = (GetModuleHandleA("clist_modern.dll") || GetModuleHandleA("clist_modern_dora.dll")) - && !db_get_b(NULL, "ModernData", "DisableEngine", 0) - && db_get_b(NULL, "ModernData", "EnableLayering", 1); + && !db_get_b(NULL, "ModernData", "DisableEngine", 0) + && db_get_b(NULL, "ModernData", "EnableLayering", 1); - GetClientRect (hwnd, &rect); + GetClientRect(hwnd, &rect); height = rect.bottom - rect.top; width = rect.right - rect.left; @@ -437,8 +430,8 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1; RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32; RGB32BitsBITMAPINFO.bmiHeader.biCompression = BI_RGB; - hbmp = CreateDIBSection(NULL, - &RGB32BitsBITMAPINFO, + hbmp = CreateDIBSection(NULL, + &RGB32BitsBITMAPINFO, DIB_RGB_COLORS, NULL, NULL, 0); @@ -446,24 +439,21 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) b = CreateSolidBrush(Traffic_BkColor); t = CreateSolidBrush(KeyColor); - - if ( ClistModernPresent - && unOptions.DrawFrmAsSkin) - { + + if (ClistModernPresent + && unOptions.DrawFrmAsSkin) { SKINDRAWREQUEST rq; rq.hDC = hdc; rq.rcDestRect = rect; - rq.rcClipRect = rect; + rq.rcClipRect = rect; strncpy(rq.szObjectID, "Main,ID=EventArea", sizeof(rq.szObjectID)); - if (CallService(MS_SKIN_DRAWGLYPH, (WPARAM)&rq, 0)) - { + if (CallService(MS_SKIN_DRAWGLYPH, (WPARAM)&rq, 0)) { strncpy(rq.szObjectID, "Main,ID=StatusBar", sizeof(rq.szObjectID)); CallService(MS_SKIN_DRAWGLYPH, (WPARAM)&rq, 0); } } - else - { + else { SetTextColor(hdc, Traffic_FontColor); SetBkColor(hdc, Traffic_BkColor); FillRect(hdc, &rect, b); @@ -478,45 +468,38 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) rect.bottom -= 2; rect.right -= 3; -//------------------- -// Если нет плагина Variables, рисуем упрощённо. -//------------------- - if (!bVariablesExists) - { + //------------------- + // Если нет плагина Variables, рисуем упрощённо. + //------------------- + if (!bVariablesExists) { SummarySession = SummaryTotal = 0; // Для каждого аккаунта - for (i = 0; i < NumberOfAccounts; i++) - { + for (i = 0; i < NumberOfAccounts; i++) { // Только если разрешено его отображение. - if (ProtoList[i].Visible && ProtoList[i].Enabled) - { + if (ProtoList[i].Visible && ProtoList[i].Enabled) { dx = 0; // Изображаем иконку аккаунта. - if (unOptions.DrawProtoIcon) - { + if (unOptions.DrawProtoIcon) { TC_DrawIconEx(hdc, rect.left, rect.top, - Skin_LoadProtoIcon(ProtoList[i].name, CallProtoService(ProtoList[i].name,PS_GETSTATUS,0,0)), b, ClistModernPresent); + Skin_LoadProtoIcon(ProtoList[i].name, CallProtoService(ProtoList[i].name, PS_GETSTATUS, 0, 0)), b, ClistModernPresent); dx = 19; } // Изображаем имя аккаунта - if (unOptions.DrawProtoName) - { + if (unOptions.DrawProtoName) { rect.left += dx; TC_AlphaText(hdc, ProtoList[i].tszAccountName, &rect, DT_SINGLELINE | DT_LEFT | DT_TOP, ClistModernPresent); rect.left -= dx; } // Следующие позиции строятся от правого края. // Общее время. - if (unOptions.DrawTotalTimeCounter) - { + if (unOptions.DrawTotalTimeCounter) { TCHAR bu[32]; - + GetDurationFormatM(ProtoList[i].Total.Timer, _T("h:mm:ss"), bu, 32); TC_AlphaText(hdc, bu, &rect, DT_SINGLELINE | DT_RIGHT | DT_TOP, ClistModernPresent); } // Текущее время. - if (unOptions.DrawCurrentTimeCounter) - { + if (unOptions.DrawCurrentTimeCounter) { TCHAR bu[32]; GetDurationFormatM(ProtoList[i].Session.Timer, _T("h:mm:ss"), bu, 32); @@ -525,8 +508,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) rect.right += 50; } // Изображаем общий трафик. - if (unOptions.DrawTotalTraffic) - { + if (unOptions.DrawTotalTraffic) { TCHAR bu[32]; GetFormattedTraffic(ProtoList[i].TotalSentTraffic + ProtoList[i].TotalRecvTraffic, 3, bu, 32); @@ -538,8 +520,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) SummaryTotal += ProtoList[i].TotalRecvTraffic + ProtoList[i].TotalSentTraffic; } // Изображаем текущий трафик. - if (unOptions.DrawCurrentTraffic) - { + if (unOptions.DrawCurrentTraffic) { TCHAR bu[32]; GetFormattedTraffic(ProtoList[i].CurrentRecvTraffic + ProtoList[i].CurrentSentTraffic, 3, bu, 32); @@ -555,20 +536,17 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } } // Рисуем суммарный трафик выбранных аккаунтов. - if (unOptions.ShowSummary) - { + if (unOptions.ShowSummary) { // Изображаем иконку. dx = 0; - if (unOptions.DrawProtoIcon) - { + if (unOptions.DrawProtoIcon) { TC_DrawIconEx(hdc, rect.left, rect.top, Skin_LoadIcon(SKINICON_OTHER_MIRANDA), b, ClistModernPresent); dx = 19; } // Выводим текст // Изображаем имя - if (unOptions.DrawProtoName) - { + if (unOptions.DrawProtoName) { TCHAR *bu = mir_a2t("Summary"); rect.left += dx; @@ -577,16 +555,14 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) mir_free(bu); } // Общее время. - if (unOptions.DrawTotalTimeCounter) - { + if (unOptions.DrawTotalTimeCounter) { TCHAR bu[32]; - + GetDurationFormatM(OverallInfo.Total.Timer, _T("h:mm:ss"), bu, 32); TC_AlphaText(hdc, bu, &rect, DT_SINGLELINE | DT_RIGHT | DT_TOP, ClistModernPresent); } // Текущее время. - if (unOptions.DrawCurrentTimeCounter) - { + if (unOptions.DrawCurrentTimeCounter) { TCHAR bu[32]; GetDurationFormatM(OverallInfo.Session.Timer, _T("h:mm:ss"), bu, 32); @@ -595,8 +571,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) rect.right += 50; } // Изображаем общий трафик. - if (unOptions.DrawTotalTraffic) - { + if (unOptions.DrawTotalTraffic) { TCHAR bu[32]; GetFormattedTraffic(SummaryTotal, 3, bu, 32); @@ -605,8 +580,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) rect.right += 100; } // Изображаем текущий трафик. - if (unOptions.DrawCurrentTraffic) - { + if (unOptions.DrawCurrentTraffic) { TCHAR bu[32]; GetFormattedTraffic(SummarySession, 3, bu, 32); @@ -617,20 +591,17 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } rect.top += Traffic_LineHeight + Traffic_AdditionSpace; // Рисуем всеобщий трафик. - if (unOptions.ShowOverall) - { + if (unOptions.ShowOverall) { // Изображаем иконку. dx = 0; - if (unOptions.DrawProtoIcon) - { + if (unOptions.DrawProtoIcon) { TC_DrawIconEx(hdc, rect.left, rect.top, Skin_LoadIcon(SKINICON_OTHER_MIRANDA), b, ClistModernPresent); dx = 19; } // Выводим текст // Изображаем имя - if (unOptions.DrawProtoName) - { + if (unOptions.DrawProtoName) { TCHAR *bu = mir_a2t("Overall"); rect.left += dx; @@ -640,8 +611,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } // Следующие позиции строятся от правого края. // Изображаем общий трафик. - if (unOptions.DrawTotalTraffic) - { + if (unOptions.DrawTotalTraffic) { TCHAR bu[32]; GetFormattedTraffic(OverallInfo.TotalSentTraffic + OverallInfo.TotalRecvTraffic, 3, bu, 32); @@ -650,8 +620,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) rect.right += 100; } // Изображаем текущий трафик. - if (unOptions.DrawCurrentTraffic) - { + if (unOptions.DrawCurrentTraffic) { TCHAR bu[32]; GetFormattedTraffic(OverallInfo.CurrentRecvTraffic + OverallInfo.CurrentSentTraffic, 3, bu, 32); @@ -662,9 +631,9 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } } else -//------------- -// Если есть Variables - рисуем по-новому -//------------- + //------------- + // Если есть Variables - рисуем по-новому + //------------- { RowItemInfo *ItemsList; WORD ItemsNumber, RowsNumber; @@ -674,10 +643,8 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) HICON *ahIcon = (HICON*)mir_alloc(sizeof(HICON)); RowsNumber = 0; // Цикл по аккаунтам. - for (i = 0; i < NumberOfAccounts; i++) - { - if (ProtoList[i].Visible && ProtoList[i].Enabled) - { + for (i = 0; i < NumberOfAccounts; i++) { + if (ProtoList[i].Visible && ProtoList[i].Enabled) { ExtraText = (TCHAR**)mir_realloc(ExtraText, sizeof(TCHAR*) * (RowsNumber + 1)); ahIcon = (HICON*)mir_realloc(ahIcon, sizeof(HICON) * (RowsNumber + 1)); @@ -686,16 +653,14 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } } // Ещё 2 особых элемента. - if (unOptions.ShowSummary) - { + if (unOptions.ShowSummary) { ExtraText = (TCHAR**)mir_realloc(ExtraText, sizeof(TCHAR*) * (RowsNumber + 1)); ahIcon = (HICON*)mir_realloc(ahIcon, sizeof(HICON) * (RowsNumber + 1)); ExtraText[RowsNumber] = mir_a2t("summary"); ahIcon[RowsNumber++] = Skin_LoadIcon(SKINICON_OTHER_MIRANDA); } - if (unOptions.ShowOverall) - { + if (unOptions.ShowOverall) { ExtraText = (TCHAR**)mir_realloc(ExtraText, sizeof(TCHAR*) * (RowsNumber + 1)); ahIcon = (HICON*)mir_realloc(ahIcon, sizeof(HICON) * (RowsNumber + 1)); @@ -704,45 +669,39 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } // Рисуем свой счётчик для каждого из выбранных протоколов - for (i = 0; i < RowsNumber; i++) - { + for (i = 0; i < RowsNumber; i++) { TCHAR *buf = variables_parse(Traffic_CounterFormat, ExtraText[i], NULL); - if (ItemsNumber = GetRowItems(buf, &ItemsList)) - { + if (ItemsNumber = GetRowItems(buf, &ItemsList)) { // Рисуем текст. - for (dx = 0; dx < ItemsNumber; dx++) - { + for (dx = 0; dx < ItemsNumber; dx++) { // Делаем копию прямоугольника для рисования. memcpy(&rect2, &rect, sizeof(RECT)); rect2.bottom = rect2.top + Traffic_LineHeight; // Что за тег? - switch (ItemsList[dx].Alignment) - { - case 'I': - TC_DrawIconEx(hdc, ItemsList[dx].Interval, rect2.top, ahIcon[i], b, ClistModernPresent); - break; - case 'i': - TC_DrawIconEx(hdc, width - 16 - ItemsList[dx].Interval, rect2.top, ahIcon[i], b, ClistModernPresent); - break; - case 'L': - rect2.left = ItemsList[dx].Interval; - TC_AlphaText(hdc, ItemsList[dx].String, &rect2, DT_SINGLELINE | DT_LEFT | DT_VCENTER, ClistModernPresent); - break; - case 'R': - rect2.right = width - ItemsList[dx].Interval; - TC_AlphaText(hdc, ItemsList[dx].String, &rect2, DT_SINGLELINE | DT_RIGHT | DT_VCENTER, ClistModernPresent); - break; - default: - continue; + switch (ItemsList[dx].Alignment) { + case 'I': + TC_DrawIconEx(hdc, ItemsList[dx].Interval, rect2.top, ahIcon[i], b, ClistModernPresent); + break; + case 'i': + TC_DrawIconEx(hdc, width - 16 - ItemsList[dx].Interval, rect2.top, ahIcon[i], b, ClistModernPresent); + break; + case 'L': + rect2.left = ItemsList[dx].Interval; + TC_AlphaText(hdc, ItemsList[dx].String, &rect2, DT_SINGLELINE | DT_LEFT | DT_VCENTER, ClistModernPresent); + break; + case 'R': + rect2.right = width - ItemsList[dx].Interval; + TC_AlphaText(hdc, ItemsList[dx].String, &rect2, DT_SINGLELINE | DT_RIGHT | DT_VCENTER, ClistModernPresent); + break; + default: + continue; } - } // Нужно освободить память. - for (; ItemsNumber--; ) - { + for (; ItemsNumber--;) mir_free(ItemsList[ItemsNumber].String); - } + mir_free(ItemsList); } mir_free(buf); @@ -750,7 +709,7 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) } // Удаляем список строк. - for (; RowsNumber--; ) + for (; RowsNumber--;) mir_free(ExtraText[RowsNumber]); mir_free(ExtraText); } @@ -760,13 +719,9 @@ int PaintTrafficCounterWindow(HWND hwnd, HDC hDC) SelectObject(hdc, old_font); if (ClistModernPresent) - { AlphaBlend(hDC, 0, 0, width, height, hdc, 0, 0, width, height, aga); - } else - { BitBlt(hDC, 0, 0, width, height, hdc, 0, 0, SRCCOPY); - } SelectObject(hdc, oldbmp); DeleteObject(hbmp); @@ -805,288 +760,270 @@ void ProtocolIsOffLine(int num) ProtoList[num].State = 0; } -static POINT ptMouse = {0}; +static POINT ptMouse = { 0 }; LRESULT CALLBACK TrafficCounterWndProc_MW(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { POINT p; int i; // - switch (msg) - { - case (WM_USER+697): - if (lParam == 666) - DestroyWindow(hwnd); - break; + switch (msg) { + case (WM_USER + 697) : + if (lParam == 666) + DestroyWindow(hwnd); + break; - case WM_PAINT: - { - if ( !db_get_b(NULL, "ModernData", "DisableEngine", 0) - && db_get_b(NULL, "ModernData", "EnableLayering", 1) - && ServiceExists(MS_SKINENG_INVALIDATEFRAMEIMAGE)) - CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE, (WPARAM)TrafficHwnd, 0); - else - { - HDC hdc = GetDC(hwnd); - PaintTrafficCounterWindow(hwnd, hdc); - ReleaseDC(hwnd, hdc); - } + case WM_PAINT: + { + if (!db_get_b(NULL, "ModernData", "DisableEngine", 0) + && db_get_b(NULL, "ModernData", "EnableLayering", 1) + && ServiceExists(MS_SKINENG_INVALIDATEFRAMEIMAGE)) + CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE, (WPARAM)TrafficHwnd, 0); + else { + HDC hdc = GetDC(hwnd); + PaintTrafficCounterWindow(hwnd, hdc); + ReleaseDC(hwnd, hdc); } + } + break; + + case WM_ERASEBKGND: + return 1; + + case WM_LBUTTONDOWN: + if (db_get_b(NULL, "CLUI", "ClientAreaDrag", SETTING_CLIENTDRAG_DEFAULT)) { + ClientToScreen(GetParent(hwnd), &p); + return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE | HTCAPTION, MAKELPARAM(p.x, p.y)); + } + break; + + case WM_RBUTTONDOWN: + p.x = GET_X_LPARAM(lParam); + p.y = GET_Y_LPARAM(lParam); + ClientToScreen(hwnd, &p); + TrackPopupMenu(TrafficPopupMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, p.x, p.y, 0, hwnd, NULL); + break; + + case WM_COMMAND: + switch (wParam) { + case POPUPMENU_HIDE: + MenuCommand_TrafficShowHide(0, 0); break; - case WM_ERASEBKGND: - return 1; + case POPUPMENU_CLEAR_NOW: + for (i = 0; i < NumberOfAccounts; i++) { + ProtoList[i].StartIncoming = + ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Incoming; + ProtoList[i].StartOutgoing = + ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Outgoing; + ProtoList[i].Session.TimeAtStart = GetTickCount(); + } + OverallInfo.CurrentRecvTraffic = OverallInfo.CurrentSentTraffic = 0; + } + break; - case WM_LBUTTONDOWN : - if (db_get_b(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) - { - ClientToScreen(GetParent(hwnd),&p); - return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(p.x,p.y)); + case WM_SETCURSOR: + { + POINT pt; + + GetCursorPos(&pt); + if ((abs(pt.x - ptMouse.x) < 20) + && (abs(pt.y - ptMouse.y) < 20)) + return 1; + + if (TooltipShowing) { + KillTimer(TrafficHwnd, TIMER_TOOLTIP); + CallService("mToolTip/HideTip", 0, 0); + TooltipShowing = FALSE; } + KillTimer(TrafficHwnd, TIMER_TOOLTIP); + SetTimer(TrafficHwnd, TIMER_TOOLTIP, CallService(MS_CLC_GETINFOTIPHOVERTIME, 0, 0), 0); break; + } - case WM_RBUTTONDOWN : - p.x = GET_X_LPARAM(lParam); - p.y = GET_Y_LPARAM(lParam); - ClientToScreen(hwnd,&p); - TrackPopupMenu(TrafficPopupMenu,TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,p.x,p.y,0,hwnd,NULL); + case WM_TIMER: + switch (wParam) { + case TIMER_NOTIFY_TICK: + NotifyOnRecv(); + NotifyOnSend(); break; - case WM_COMMAND : - switch (wParam) + case TIMER_REDRAW: // Перерисовка раз в полсекунды. { - case POPUPMENU_HIDE: - MenuCommand_TrafficShowHide(0, 0); - break; - - case POPUPMENU_CLEAR_NOW: - for (i = 0; i < NumberOfAccounts; i++) - { - ProtoList[i].StartIncoming = - ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Incoming; - ProtoList[i].StartOutgoing = - ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Outgoing; - ProtoList[i].Session.TimeAtStart = GetTickCount(); + DWORD CurrentTimeMs; + SYSTEMTIME stNow; + + SaveSettings(1); + // Перед подсчётом суммарного трафика обнуляем счётчики. + OverallInfo.CurrentRecvTraffic = + OverallInfo.CurrentSentTraffic = + OverallInfo.TotalRecvTraffic = + OverallInfo.TotalSentTraffic = 0; + + CurrentTimeMs = GetTickCount(); + + for (i = 0; i < NumberOfAccounts; i++) { + if (ProtoList[i].State) { + ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords - 1].Time = + (CurrentTimeMs - ProtoList[i].Total.TimeAtStart) / 1000; + ProtoList[i].Session.Timer = + (CurrentTimeMs - ProtoList[i].Session.TimeAtStart) / 1000; } - OverallInfo.CurrentRecvTraffic = OverallInfo.CurrentSentTraffic = 0; - } - break; - case WM_SETCURSOR: - { - POINT pt; + Stat_CheckStatistics(i); - GetCursorPos(&pt); - if ( (abs(pt.x - ptMouse.x) < 20) - && (abs(pt.y - ptMouse.y) < 20) ) - return 1; + { // Здесь на основании статистики вычисляются значения всех трафиков и времени. + DWORD Sum1, Sum2; + unsigned long int j; - if (TooltipShowing) - { - KillTimer(TrafficHwnd, TIMER_TOOLTIP); - CallService("mToolTip/HideTip", 0, 0); - TooltipShowing = FALSE; + // Значения для текущей сессии. + for (Sum1 = Sum2 = 0, j = ProtoList[i].StartIndex; j < ProtoList[i].NumberOfRecords; j++) { + Sum1 += ProtoList[i].AllStatistics[j].Incoming; + Sum2 += ProtoList[i].AllStatistics[j].Outgoing; + } + ProtoList[i].CurrentRecvTraffic = Sum1 - ProtoList[i].StartIncoming; + ProtoList[i].CurrentSentTraffic = Sum2 - ProtoList[i].StartOutgoing; + OverallInfo.CurrentRecvTraffic += ProtoList[i].CurrentRecvTraffic; + OverallInfo.CurrentSentTraffic += ProtoList[i].CurrentSentTraffic; + // Значения для выбранного периода. + ProtoList[i].TotalRecvTraffic = + Stat_GetItemValue(1 << i, + unOptions.PeriodForShow + 1, + Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, 1); + ProtoList[i].TotalSentTraffic = + Stat_GetItemValue(1 << i, + unOptions.PeriodForShow + 1, + Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, 2); + ProtoList[i].Total.Timer = + Stat_GetItemValue(1 << i, + unOptions.PeriodForShow + 1, + Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, 4); + OverallInfo.TotalRecvTraffic += ProtoList[i].TotalRecvTraffic; + OverallInfo.TotalSentTraffic += ProtoList[i].TotalSentTraffic; + } + } + // Не пора ли уведомить? + if (unOptions.NotifyBySize && Traffic_Notify_size_value) { + if (!((OverallInfo.CurrentRecvTraffic >> 10) % Traffic_Notify_size_value) + && notify_recv_size != OverallInfo.CurrentRecvTraffic >> 10) + NotifyOnRecv(); + + if (!((OverallInfo.CurrentSentTraffic >> 10) % Traffic_Notify_size_value) + && notify_send_size != OverallInfo.CurrentSentTraffic >> 10) + NotifyOnSend(); } - KillTimer(TrafficHwnd, TIMER_TOOLTIP); - SetTimer(TrafficHwnd, TIMER_TOOLTIP, CallService(MS_CLC_GETINFOTIPHOVERTIME, 0, 0), 0); - break; - } - - case WM_TIMER : - switch(wParam) - { - case TIMER_NOTIFY_TICK: - NotifyOnRecv(); - NotifyOnSend(); - break; - case TIMER_REDRAW: // Перерисовка раз в полсекунды. - { - DWORD CurrentTimeMs; - SYSTEMTIME stNow; - - SaveSettings(1); - // Перед подсчётом суммарного трафика обнуляем счётчики. - OverallInfo.CurrentRecvTraffic = - OverallInfo.CurrentSentTraffic = - OverallInfo.TotalRecvTraffic = - OverallInfo.TotalSentTraffic = 0; - - CurrentTimeMs = GetTickCount(); - - for (i = 0; i < NumberOfAccounts; i++) - { - if (ProtoList[i].State) - { - ProtoList[i].AllStatistics[ProtoList[i].NumberOfRecords-1].Time = - (CurrentTimeMs - ProtoList[i].Total.TimeAtStart) / 1000; - ProtoList[i].Session.Timer = - (CurrentTimeMs - ProtoList[i].Session.TimeAtStart) / 1000; - } - - Stat_CheckStatistics(i); - - { // Здесь на основании статистики вычисляются значения всех трафиков и времени. - DWORD Sum1, Sum2; - unsigned long int j; - - // Значения для текущей сессии. - for (Sum1 = Sum2 = 0, j = ProtoList[i].StartIndex; j < ProtoList[i].NumberOfRecords; j++) - { - Sum1 += ProtoList[i].AllStatistics[j].Incoming; - Sum2 += ProtoList[i].AllStatistics[j].Outgoing; - } - ProtoList[i].CurrentRecvTraffic = Sum1 - ProtoList[i].StartIncoming; - ProtoList[i].CurrentSentTraffic = Sum2 - ProtoList[i].StartOutgoing; - OverallInfo.CurrentRecvTraffic += ProtoList[i].CurrentRecvTraffic; - OverallInfo.CurrentSentTraffic += ProtoList[i].CurrentSentTraffic; - // Значения для выбранного периода. - ProtoList[i].TotalRecvTraffic = - Stat_GetItemValue(1 << i, - unOptions.PeriodForShow + 1, - Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, - 1); - ProtoList[i].TotalSentTraffic = - Stat_GetItemValue(1 << i, - unOptions.PeriodForShow + 1, - Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, - 2); - ProtoList[i].Total.Timer = - Stat_GetItemValue(1 << i, - unOptions.PeriodForShow + 1, - Stat_GetRecordsNumber(i, unOptions.PeriodForShow + 1) - 1, - 4); - OverallInfo.TotalRecvTraffic += ProtoList[i].TotalRecvTraffic; - OverallInfo.TotalSentTraffic += ProtoList[i].TotalSentTraffic; - } - } - // Не пора ли уведомить? - if (unOptions.NotifyBySize && Traffic_Notify_size_value) - { - if (!((OverallInfo.CurrentRecvTraffic >> 10) % Traffic_Notify_size_value) - && notify_recv_size != OverallInfo.CurrentRecvTraffic >> 10 ) - NotifyOnRecv(); - - if (!((OverallInfo.CurrentSentTraffic >> 10) % Traffic_Notify_size_value) - && notify_send_size != OverallInfo.CurrentSentTraffic >> 10) - NotifyOnSend(); - } + // Счётчики суммарного времени. + GetLocalTime(&stNow); + + // Не пора ли сбросить общий счётчик? + if ((unOptions.PeriodForShow == 0 + && stNow.wHour == 0 + && stNow.wMinute == 0 + && stNow.wSecond == 0) + || (unOptions.PeriodForShow == 1 + && DayOfWeek(stNow.wDay, stNow.wMonth, stNow.wYear) == 1 + && stNow.wHour == 0 + && stNow.wMinute == 0 + && stNow.wSecond == 0) + || (unOptions.PeriodForShow == 2 + && stNow.wDay == 1 + && stNow.wHour == 0 + && stNow.wMinute == 0 + && stNow.wSecond == 0) + || (unOptions.PeriodForShow == 3 + && stNow.wMonth == 1 + && stNow.wDay == 1 + && stNow.wHour == 0 + && stNow.wMinute == 0 + && stNow.wSecond == 0)) + OverallInfo.Total.TimeAtStart = CurrentTimeMs; + + if (online_count > 0) { + OverallInfo.Session.Timer = + (CurrentTimeMs - OverallInfo.Session.TimeAtStart) / 1000; + OverallInfo.Total.Timer = + (CurrentTimeMs - OverallInfo.Total.TimeAtStart) / 1000; + } - // Счётчики суммарного времени. - GetLocalTime(&stNow); - - // Не пора ли сбросить общий счётчик? - if ( (unOptions.PeriodForShow == 0 - && stNow.wHour == 0 - && stNow.wMinute == 0 - && stNow.wSecond == 0) - || (unOptions.PeriodForShow == 1 - && DayOfWeek(stNow.wDay, stNow.wMonth, stNow.wYear) == 1 - && stNow.wHour == 0 - && stNow.wMinute == 0 - && stNow.wSecond == 0) - || (unOptions.PeriodForShow == 2 - && stNow.wDay == 1 - && stNow.wHour == 0 - && stNow.wMinute == 0 - && stNow.wSecond == 0) - || (unOptions.PeriodForShow == 3 - && stNow.wMonth == 1 - && stNow.wDay == 1 - && stNow.wHour == 0 - && stNow.wMinute == 0 - && stNow.wSecond == 0) ) - OverallInfo.Total.TimeAtStart = CurrentTimeMs; - - if (online_count > 0) - { - OverallInfo.Session.Timer = - (CurrentTimeMs - OverallInfo.Session.TimeAtStart) / 1000; - OverallInfo.Total.Timer = - (CurrentTimeMs - OverallInfo.Total.TimeAtStart) / 1000; - } + CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)Traffic_FrameID, FU_FMREDRAW); + } + break; - CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)Traffic_FrameID, FU_FMREDRAW); - } - break; + case TIMER_TOOLTIP: + { + TCHAR *TooltipText; + CLCINFOTIP ti = { 0 }; + RECT rt; - case TIMER_TOOLTIP: - { - TCHAR *TooltipText; - CLCINFOTIP ti = {0}; - RECT rt; - - GetCursorPos(&TooltipPosition); - if (!TooltipShowing && unOptions.ShowTooltip ) - { - KillTimer(TrafficHwnd, TIMER_TOOLTIP); - ScreenToClient(TrafficHwnd, &TooltipPosition); - GetClientRect(TrafficHwnd, &rt); - if (PtInRect(&rt, TooltipPosition)) - { - GetCursorPos(&ptMouse); - ti.rcItem.left = TooltipPosition.x - 10; - ti.rcItem.right = TooltipPosition.x + 10; - ti.rcItem.top = TooltipPosition.y - 10; - ti.rcItem.bottom = TooltipPosition.y + 10; - ti.cbSize = sizeof( ti ); - TooltipText = variables_parsedup(Traffic_TooltipFormat, NULL, NULL); - - CallService(MS_TIPPER_SHOWTIPW, (WPARAM)TooltipText, (LPARAM)&ti); - - TooltipShowing = TRUE; - mir_free(TooltipText); - } - } + GetCursorPos(&TooltipPosition); + if (!TooltipShowing && unOptions.ShowTooltip) { + KillTimer(TrafficHwnd, TIMER_TOOLTIP); + ScreenToClient(TrafficHwnd, &TooltipPosition); + GetClientRect(TrafficHwnd, &rt); + if (PtInRect(&rt, TooltipPosition)) { + GetCursorPos(&ptMouse); + ti.rcItem.left = TooltipPosition.x - 10; + ti.rcItem.right = TooltipPosition.x + 10; + ti.rcItem.top = TooltipPosition.y - 10; + ti.rcItem.bottom = TooltipPosition.y + 10; + ti.cbSize = sizeof(ti); + TooltipText = variables_parsedup(Traffic_TooltipFormat, NULL, NULL); + + CallService(MS_TIPPER_SHOWTIPW, (WPARAM)TooltipText, (LPARAM)&ti); + + TooltipShowing = TRUE; + mir_free(TooltipText); } - break; + } } break; + } + break; - default: - return DefWindowProc(hwnd,msg,wParam,lParam); + default: + return DefWindowProc(hwnd, msg, wParam, lParam); } // - return DefWindowProc(hwnd,msg,wParam,lParam); + return DefWindowProc(hwnd, msg, wParam, lParam); } void CreateTrafficWindow(HWND hCluiWnd) { - WNDCLASSEX wcx = {0}; + WNDCLASSEX wcx = { 0 }; CLISTFrame f; - wcx.cbSize = sizeof( WNDCLASSEX ); - wcx.style = 0; - wcx.lpfnWndProc = TrafficCounterWndProc_MW; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = 0; - wcx.hInstance = hInst; - wcx.hIcon = NULL; - wcx.hCursor = LoadCursor(hInst,IDC_ARROW); - wcx.hbrBackground = 0; - wcx.lpszMenuName = NULL; - wcx.lpszClassName = TRAFFIC_COUNTER_WINDOW_CLASS; - wcx.hIconSm = NULL; - RegisterClassEx( &wcx ); + wcx.cbSize = sizeof(WNDCLASSEX); + wcx.style = 0; + wcx.lpfnWndProc = TrafficCounterWndProc_MW; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = 0; + wcx.hInstance = hInst; + wcx.hIcon = NULL; + wcx.hCursor = LoadCursor(hInst, IDC_ARROW); + wcx.hbrBackground = 0; + wcx.lpszMenuName = NULL; + wcx.lpszClassName = TRAFFIC_COUNTER_WINDOW_CLASS; + wcx.hIconSm = NULL; + RegisterClassEx(&wcx); TrafficHwnd = CreateWindowEx(WS_EX_TOOLWINDOW, TRAFFIC_COUNTER_WINDOW_CLASS, - TRAFFIC_COUNTER_WINDOW_CLASS, - WS_CHILDWINDOW | WS_CLIPCHILDREN, - 0, 0, 0, 0, hCluiWnd, NULL, hInst, NULL); + TRAFFIC_COUNTER_WINDOW_CLASS, + WS_CHILDWINDOW | WS_CLIPCHILDREN, + 0, 0, 0, 0, hCluiWnd, NULL, hInst, NULL); - if ( ServiceExists(MS_CLIST_FRAMES_ADDFRAME) ) - { + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { // Готовимся создавать фрейм memset(&f, 0, sizeof(CLISTFrame)); f.align = alBottom; f.cbSize = sizeof(CLISTFrame); f.height = TrafficWindowHeight(); - f.Flags= unOptions.FrameIsVisible | F_LOCKED | F_NOBORDER | F_NO_SUBCONTAINER; + f.Flags = unOptions.FrameIsVisible | F_LOCKED | F_NOBORDER | F_NO_SUBCONTAINER; f.hWnd = TrafficHwnd; f.TBname = ("Traffic counter"); f.name = ("Traffic counter"); // Создаём фрейм - Traffic_FrameID = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&f,0); - CallService(MS_SKINENG_REGISTERPAINTSUB,(WPARAM)f.hWnd,(LPARAM)TrafficCounter_PaintCallbackProc); + Traffic_FrameID = (HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME, (WPARAM)&f, 0); + CallService(MS_SKINENG_REGISTERPAINTSUB, (WPARAM)f.hWnd, (LPARAM)TrafficCounter_PaintCallbackProc); } // Создаём таймеры. @@ -1094,7 +1031,7 @@ void CreateTrafficWindow(HWND hCluiWnd) UpdateNotifyTimer(); } -INT_PTR MenuCommand_TrafficShowHide(WPARAM wParam,LPARAM lParam) +INT_PTR MenuCommand_TrafficShowHide(WPARAM wParam, LPARAM lParam) { unOptions.FrameIsVisible = !unOptions.FrameIsVisible; if (Traffic_FrameID == NULL) @@ -1113,7 +1050,7 @@ void Traffic_AddMainMenuItem(void) mi.flags = 0; mi.hIcon = NULL; mi.pszName = LPGEN("Toggle traffic counter"); - mi.pszService="TrafficCounter/ShowHide"; + mi.pszService = "TrafficCounter/ShowHide"; hTrafficMainMenuItem = Menu_AddMainMenuItem(&mi); } @@ -1155,7 +1092,7 @@ void NotifyOnRecv(void) memset(&ppd, 0, sizeof(ppd)); ppd.lchContact = NULL; ppd.lchIcon = Skin_LoadIcon(SKINICON_EVENT_MESSAGE); - _tcsncpy(ppd.lptzContactName, TranslateT("Traffic counter notification"),MAX_CONTACTNAME); + _tcsncpy(ppd.lptzContactName, TranslateT("Traffic counter notification"), MAX_CONTACTNAME); // mir_sntprintf(ppd.lptzText, _countof(ppd.lptzText), TranslateT("%d kilobytes received"), notify_recv_size = OverallInfo.CurrentRecvTraffic >> 10); @@ -1164,7 +1101,7 @@ void NotifyOnRecv(void) ppd.colorText = Traffic_PopupFontColor; ppd.PluginWindowProc = NULL; ppd.iSeconds = (Traffic_PopupTimeoutDefault ? 0 : Traffic_PopupTimeoutValue); - PUAddPopupT(&ppd); + PUAddPopupT(&ppd); } void CreateProtocolList(void) @@ -1172,20 +1109,19 @@ void CreateProtocolList(void) int i; PROTOACCOUNT **acc; // - Proto_EnumAccounts(&NumberOfAccounts,&acc); + Proto_EnumAccounts(&NumberOfAccounts, &acc); // ProtoList = (PROTOLIST*)mir_alloc(sizeof(PROTOLIST)*(NumberOfAccounts)); // - for (i = 0; i < NumberOfAccounts; i++) - { + for (i = 0; i < NumberOfAccounts; i++) { ProtoList[i].name = (char*)mir_alloc(mir_strlen(acc[i]->szModuleName) + 1); mir_strcpy(ProtoList[i].name, acc[i]->szModuleName); ProtoList[i].tszAccountName = (TCHAR*)mir_alloc(sizeof(TCHAR) * (1 + mir_tstrlen(acc[i]->tszAccountName))); mir_tstrcpy(ProtoList[i].tszAccountName, acc[i]->tszAccountName); // ProtoList[i].Flags = db_get_b(NULL, ProtoList[i].name, SETTINGS_PROTO_FLAGS, 3); - ProtoList[i].CurrentRecvTraffic = - ProtoList[i].CurrentSentTraffic = + ProtoList[i].CurrentRecvTraffic = + ProtoList[i].CurrentSentTraffic = ProtoList[i].Session.Timer = 0; // ProtoList[i].Enabled = acc[i]->bIsEnabled; @@ -1197,7 +1133,7 @@ void CreateProtocolList(void) ProtoList[i].StartOutgoing = ProtoList[i].AllStatistics[ProtoList[i].StartIndex].Outgoing; } // цикл по аккаунтам // Начальные значения для суммарной информации. - OverallInfo.Session.Timer = OverallInfo.Total.Timer = 0; + OverallInfo.Session.Timer = OverallInfo.Total.Timer = 0; } void DestroyProtocolList(void) @@ -1213,32 +1149,25 @@ void DestroyProtocolList(void) mir_free(ProtoList); } -int ProtocolAckHook(WPARAM wParam,LPARAM lParam) +int ProtocolAckHook(WPARAM wParam, LPARAM lParam) { - ACKDATA* pAck=(ACKDATA*)lParam; + ACKDATA* pAck = (ACKDATA*)lParam; WORD i; - if (ACKTYPE_STATUS == pAck->type) - { - if(ID_STATUS_OFFLINE == pAck->lParam) - { - for (i = 0; i < NumberOfAccounts; i++) - { + if (ACKTYPE_STATUS == pAck->type) { + if (ID_STATUS_OFFLINE == pAck->lParam) { + for (i = 0; i < NumberOfAccounts; i++) { if (!ProtoList[i].name) continue; - if (!mir_strcmp(ProtoList[i].name, pAck->szModule)) - { + if (!mir_strcmp(ProtoList[i].name, pAck->szModule)) { ProtocolIsOffLine(i); break; } } } - else - { - if ((pAck->lParam >= ID_STATUS_ONLINE) && (pAck->lParam <= ID_STATUS_OUTTOLUNCH)) - { + else { + if ((pAck->lParam >= ID_STATUS_ONLINE) && (pAck->lParam <= ID_STATUS_OUTTOLUNCH)) { for (i = 0; i < NumberOfAccounts; i++) - if (!mir_strcmp(ProtoList[i].name, pAck->szModule)) - { + if (!mir_strcmp(ProtoList[i].name, pAck->szModule)) { ProtocolIsOnLine(i); break; } @@ -1271,8 +1200,7 @@ int UpdateFonts(WPARAM wParam, LPARAM lParam) void UpdateTrafficWindowSize(void) { - if (Traffic_FrameID != NULL) - { + if (Traffic_FrameID != NULL) { CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS, MAKEWPARAM(FO_HEIGHT, Traffic_FrameID), TrafficWindowHeight()); } } @@ -1280,14 +1208,14 @@ void UpdateTrafficWindowSize(void) unsigned short int TrafficWindowHeight(void) { BYTE HeightLineTime = (unOptions.DrawProtoIcon) ? 16 : TrafficFontHeight, - i, ActProto; + i, ActProto; WORD MaxWndHeight; for (i = 0, ActProto = unOptions.ShowOverall + unOptions.ShowSummary; i < NumberOfAccounts; i++) ActProto += ProtoList[i].Visible && ProtoList[i].Enabled; // Высота строки минимум 16 пикселей (для иконки). - Traffic_LineHeight = TrafficFontHeight > 16 ? TrafficFontHeight: 16; + Traffic_LineHeight = TrafficFontHeight > 16 ? TrafficFontHeight : 16; // Высота фрейма равна количеству строк. MaxWndHeight = ActProto * Traffic_LineHeight @@ -1302,20 +1230,19 @@ int OnAccountsListChange(WPARAM wParam, LPARAM lParam) { BYTE i; PROTOACCOUNT *acc = (PROTOACCOUNT*)lParam; - - switch (wParam) - { - case PRAC_ADDED: - case PRAC_REMOVED: - DestroyProtocolList(); - CreateProtocolList(); - break; - case PRAC_CHANGED: - case PRAC_CHECKED: - for (i = 0; i < NumberOfAccounts; i++) - if (!mir_strcmp(acc->szModuleName, ProtoList[i].name)) - ProtoList[i].Enabled = acc->bIsEnabled; - break; + + switch (wParam) { + case PRAC_ADDED: + case PRAC_REMOVED: + DestroyProtocolList(); + CreateProtocolList(); + break; + case PRAC_CHANGED: + case PRAC_CHECKED: + for (i = 0; i < NumberOfAccounts; i++) + if (!mir_strcmp(acc->szModuleName, ProtoList[i].name)) + ProtoList[i].Enabled = acc->bIsEnabled; + break; } UpdateTrafficWindowSize(); return 0; diff --git a/plugins/TrafficCounter/src/misc.cpp b/plugins/TrafficCounter/src/misc.cpp index 2febe16560..ebc9c515f6 100644 --- a/plugins/TrafficCounter/src/misc.cpp +++ b/plugins/TrafficCounter/src/misc.cpp @@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. InputString - строка для разбора; RowItemsList - список найденных элементов. Возвращаемое значение - количество элементов в списках. */ + WORD GetRowItems(TCHAR *InputString, RowItemInfo **RowItemsList) { TCHAR *begin, *end; @@ -32,15 +33,13 @@ WORD GetRowItems(TCHAR *InputString, RowItemInfo **RowItemsList) // Ищем слева открывающую скобку. begin = _tcschr(InputString, '{'); // Если скобка найдена... - if (begin) - { + if (begin) { // Выделяем память под указатели *RowItemsList = (RowItemInfo*)mir_alloc(sizeof(RowItemInfo)); } else return 0; - do - { + do { // Сразу вслед за ней ищем закрывающую. end = _tcschr(begin, '}'); @@ -49,22 +48,20 @@ WORD GetRowItems(TCHAR *InputString, RowItemInfo **RowItemsList) // Разбираем тег. _stscanf(begin + 1, _T("%c%d"), - &((*RowItemsList)[c].Alignment), - &((*RowItemsList)[c].Interval)); + &((*RowItemsList)[c].Alignment), + &((*RowItemsList)[c].Interval)); // Ищем далее открывающую скобку - это конец строки, соответствующей тегу. begin = _tcschr(end, '{'); - if (begin) - { + if (begin) { // Выделяем память под строку. (*RowItemsList)[c].String = (TCHAR*)mir_alloc(sizeof(TCHAR) * (begin - end)); // Копируем строку. _tcsncpy((*RowItemsList)[c].String, end + 1, begin - end - 1); (*RowItemsList)[c].String[begin - end - 1] = 0; } - else - { + else { // Выделяем память под строку. (*RowItemsList)[c].String = (TCHAR*)mir_alloc(sizeof(TCHAR) * mir_tstrlen(end)); // Копируем строку. @@ -80,20 +77,19 @@ WORD GetRowItems(TCHAR *InputString, RowItemInfo **RowItemsList) /* Функция возвращает количество дней в указанном месяце указанного года. */ BYTE DaysInMonth(BYTE Month, WORD Year) { - switch (Month) - { - case 1: - case 3: - case 5: - case 7: - case 8: - case 10: - case 12: return 31; - case 4: - case 6: - case 9: - case 11: return 30; - case 2: return 28 + (BYTE)!((Year % 4) && ( (Year % 100) || !(Year % 400) )); + switch (Month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: return 31; + case 4: + case 6: + case 9: + case 11: return 30; + case 2: return 28 + (BYTE)!((Year % 4) && ((Year % 100) || !(Year % 400))); } return 0; } @@ -116,41 +112,40 @@ BYTE DayOfWeek(BYTE Day, BYTE Month, WORD Year) /* Аргументы: - Value - количество байт; - Unit - единицы измерения (0 - байты, 1 - килобайты, 2 - мегабайты, 3 - автоматически); - Buffer - адрес строки для записи результата; - Size - размер буфера. +Value - количество байт; +Unit - единицы измерения (0 - байты, 1 - килобайты, 2 - мегабайты, 3 - автоматически); +Buffer - адрес строки для записи результата; +Size - размер буфера. Возвращаемое значение: требуемый размер буфера. */ size_t GetFormattedTraffic(DWORD Value, BYTE Unit, TCHAR *Buffer, size_t Size) { - TCHAR Str1[32], szUnit[4] = {' ', 0}; + TCHAR Str1[32], szUnit[4] = { ' ', 0 }; DWORD Divider; - NUMBERFMT nf = {0, 1, 3, _T(","), _T(" "), 0}; + NUMBERFMT nf = { 0, 1, 3, _T(","), _T(" "), 0 }; TCHAR *Res; // Промежуточный результат. - switch (Unit) - { - case 0: //bytes - Divider = 1; - nf.NumDigits = 0; - szUnit[0] = 0; - break; - case 1: // KB - Divider = 0x400; - nf.NumDigits = 2; - break; - case 2: // MB - Divider = 0x100000; - nf.NumDigits = 2; - break; - case 3: // Adaptive - nf.NumDigits = 2; - if (Value < 0x100000) { Divider = 0x400; szUnit[1] = 'K'; szUnit[2] = 'B'; } - else { Divider = 0x100000; szUnit[1] = 'M'; szUnit[2] = 'B'; } - break; - default: - return 0; + switch (Unit) { + case 0: //bytes + Divider = 1; + nf.NumDigits = 0; + szUnit[0] = 0; + break; + case 1: // KB + Divider = 0x400; + nf.NumDigits = 2; + break; + case 2: // MB + Divider = 0x100000; + nf.NumDigits = 2; + break; + case 3: // Adaptive + nf.NumDigits = 2; + if (Value < 0x100000) { Divider = 0x400; szUnit[1] = 'K'; szUnit[2] = 'B'; } + else { Divider = 0x100000; szUnit[1] = 'M'; szUnit[2] = 'B'; } + break; + default: + return 0; } mir_sntprintf(Str1, _countof(Str1), _T("%d.%d"), Value / Divider, Value % Divider); @@ -162,15 +157,11 @@ size_t GetFormattedTraffic(DWORD Value, BYTE Unit, TCHAR *Buffer, size_t Size) GetNumberFormat(LOCALE_USER_DEFAULT, 0, Str1, &nf, Res, (int)l); mir_tstrcat(Res, szUnit); - if (Size && Buffer) - { + if (Size && Buffer) { mir_tstrcpy(Buffer, Res); l = mir_tstrlen(Buffer); } - else - { - l = mir_tstrlen(Res) + 1; - } + else l = mir_tstrlen(Res) + 1; free(Res); return l; @@ -182,7 +173,8 @@ Duration: Format: строка формата; Buffer: адрес буфера, куда функция помещает результат. Size - размер буфера. */ -size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Size) + +size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, size_t Size) { size_t Length; DWORD q; @@ -194,63 +186,48 @@ size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Siz //SecureZeroMemory(Res, sizeof(TCHAR)); Res[0] = 0; - for (FormatIndex = 0; Format[FormatIndex];) - { + for (FormatIndex = 0; Format[FormatIndex];) { // Ищем токены. Считается, что токен - только буквы. TokenIndex = 0; q = _istalpha(Format[FormatIndex]); // Копируем символы в аккумулятор до смены флага. - do - { + do { Token[TokenIndex++] = Format[FormatIndex++]; } while (q == _istalpha(Format[FormatIndex])); Token[TokenIndex] = 0; // Что получили в аккумуляторе? - if (!mir_tstrcmp(Token, _T("d"))) - { + if (!mir_tstrcmp(Token, _T("d"))) { q = Duration / (60 * 60 * 24); mir_sntprintf(Token, _countof(Token), _T("%d"), q); Duration -= q * 60 * 60 * 24; } - else - if (!mir_tstrcmp(Token, _T("h"))) - { + else if (!mir_tstrcmp(Token, _T("h"))) { q = Duration / (60 * 60); mir_sntprintf(Token, _countof(Token), _T("%d"), q); Duration -= q * 60 * 60; } - else - if (!mir_tstrcmp(Token, _T("hh"))) - { + else if (!mir_tstrcmp(Token, _T("hh"))) { q = Duration / (60 * 60); mir_sntprintf(Token, _countof(Token), _T("%02d"), q); Duration -= q * 60 * 60; } - else - if (!mir_tstrcmp(Token, _T("m"))) - { + else if (!mir_tstrcmp(Token, _T("m"))) { q = Duration / 60; mir_sntprintf(Token, _countof(Token), _T("%d"), q); Duration -= q * 60; } - else - if (!mir_tstrcmp(Token, _T("mm"))) - { + else if (!mir_tstrcmp(Token, _T("mm"))) { q = Duration / 60; mir_sntprintf(Token, _countof(Token), _T("%02d"), q); Duration -= q * 60; } - else - if (!mir_tstrcmp(Token, _T("s"))) - { + else if (!mir_tstrcmp(Token, _T("s"))) { q = Duration; mir_sntprintf(Token, _countof(Token), _T("%d"), q); Duration -= q; } - else - if (!mir_tstrcmp(Token, _T("ss"))) - { + else if (!mir_tstrcmp(Token, _T("ss"))) { q = Duration; mir_sntprintf(Token, _countof(Token), _T("%02d"), q); Duration -= q; @@ -262,15 +239,11 @@ size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Siz mir_tstrcat(Res, Token); } - if (Size && Buffer) - { + if (Size && Buffer) { _tcsncpy(Buffer, Res, Size); Length = mir_tstrlen(Buffer); } - else - { - Length = mir_tstrlen(Res) + 1; - } + else Length = mir_tstrlen(Res) + 1; free(Res); return Length; @@ -278,7 +251,7 @@ size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Siz /* Результат: -1 - st1 < st2 - 0 - st1 = st2 +0 - st1 = st2 +1 - st1 > st2 */ signed short int TimeCompare(SYSTEMTIME st1, SYSTEMTIME st2) @@ -301,6 +274,5 @@ signed short int TimeCompare(SYSTEMTIME st1, SYSTEMTIME st2) if (d < 0) return -1; if (d > 0) return +1; - return 0; } diff --git a/plugins/TrafficCounter/src/misc.h b/plugins/TrafficCounter/src/misc.h index 0a6aa9131c..0f4b418bdc 100644 --- a/plugins/TrafficCounter/src/misc.h +++ b/plugins/TrafficCounter/src/misc.h @@ -27,6 +27,6 @@ BYTE DayOfWeek(BYTE Day, BYTE Month, WORD Year); Возвращаемое значение: требуемый размер буфера. */ size_t GetFormattedTraffic(DWORD Value, BYTE Unit, TCHAR *Buffer, size_t Size); -size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Size); +size_t GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, size_t Size); signed short int TimeCompare(SYSTEMTIME st1, SYSTEMTIME st2); \ No newline at end of file diff --git a/plugins/TrafficCounter/src/statistics.cpp b/plugins/TrafficCounter/src/statistics.cpp index bd5a5ff6d2..511560baa3 100644 --- a/plugins/TrafficCounter/src/statistics.cpp +++ b/plugins/TrafficCounter/src/statistics.cpp @@ -30,279 +30,262 @@ HWND hListAccs; INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WORD i; - - switch (msg) - { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - // Создаём ListBox c перечнем аккаунтов. - hListAccs = CreateWindowEx(WS_EX_CLIENTEDGE, - _T("ListBox"), - NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | LBS_NOTIFY, - 2, 20, 246, 112, - hwndDlg, NULL, NULL, NULL); - SendMessage(hListAccs, WM_SETFONT, (WPARAM)(HFONT)GetStockObject(DEFAULT_GUI_FONT), 0); - for (i = 0 ; i < NumberOfAccounts; i++) - { - // Готовим список аккаунтов - if (ProtoList[i].tszAccountName) - SendMessage(hListAccs, LB_ADDSTRING, 0, (LPARAM)ProtoList[i].tszAccountName); - } - for (i = NumberOfAccounts; i--; ) - SendMessage(hListAccs, LB_SETSEL, (WPARAM)0x01&(Stat_SelAcc>>i), (LPARAM)i); - // Готовим список единиц измерения - SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Bytes")); - SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("KB")); - SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("MB")); - SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Adaptive")); - SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_SETCURSEL, unOptions.Stat_Units, 0); - // Готовим закладки - { - TCITEM tci; - tci.mask = TCIF_TEXT; - tci.pszText = TranslateT("Hourly"); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 0, (LPARAM)&tci); - tci.pszText = TranslateT("Daily"); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 1, (LPARAM)&tci); - tci.pszText = TranslateT("Weekly"); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 2, (LPARAM)&tci); - tci.pszText = TranslateT("Monthly"); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 3, (LPARAM)&tci); - tci.pszText = TranslateT("Yearly"); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 4, (LPARAM)&tci); - SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_SETCURSEL, unOptions.Stat_Tab, 0); - } - // Готовим ListView - колонки и стили - { - LVCOLUMN lvc ={0}; - - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); - - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETUNICODEFORMAT, 1, 0); - - - lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvc.fmt = LVCFMT_LEFT; - lvc.pszText = TranslateT("Period"); - lvc.cx = 135; - lvc.iSubItem = 0; - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc); - lvc.fmt = LVCFMT_RIGHT; - lvc.pszText = TranslateT("Incoming"); - lvc.iSubItem = 1; - lvc.cx = 72; - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc); - lvc.pszText = TranslateT("Outgoing"); - lvc.iSubItem = 2; - lvc.cx = 72; - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 2, (LPARAM)&lvc); - lvc.pszText = TranslateT("Sum"); - lvc.iSubItem = 3; - lvc.cx = 72; - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 3, (LPARAM)&lvc); - lvc.pszText = TranslateT("Online"); - lvc.iSubItem = 4; - lvc.cx = 72; - SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 4, (LPARAM)&lvc); + + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + // Создаём ListBox c перечнем аккаунтов. + hListAccs = CreateWindowEx(WS_EX_CLIENTEDGE, + _T("ListBox"), + NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | LBS_NOTIFY, + 2, 20, 246, 112, + hwndDlg, NULL, NULL, NULL); + SendMessage(hListAccs, WM_SETFONT, (WPARAM)(HFONT)GetStockObject(DEFAULT_GUI_FONT), 0); + for (i = 0; i < NumberOfAccounts; i++) { + // Готовим список аккаунтов + if (ProtoList[i].tszAccountName) + SendMessage(hListAccs, LB_ADDSTRING, 0, (LPARAM)ProtoList[i].tszAccountName); + } + for (i = NumberOfAccounts; i--;) + SendMessage(hListAccs, LB_SETSEL, (WPARAM)0x01 & (Stat_SelAcc >> i), (LPARAM)i); + // Готовим список единиц измерения + SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Bytes")); + SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("KB")); + SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("MB")); + SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Adaptive")); + SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_SETCURSEL, unOptions.Stat_Units, 0); + // Готовим закладки + { + TCITEM tci; + tci.mask = TCIF_TEXT; + tci.pszText = TranslateT("Hourly"); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 0, (LPARAM)&tci); + tci.pszText = TranslateT("Daily"); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 1, (LPARAM)&tci); + tci.pszText = TranslateT("Weekly"); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 2, (LPARAM)&tci); + tci.pszText = TranslateT("Monthly"); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 3, (LPARAM)&tci); + tci.pszText = TranslateT("Yearly"); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 4, (LPARAM)&tci); + SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_SETCURSEL, unOptions.Stat_Tab, 0); + } + // Готовим ListView - колонки и стили + { + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETUNICODEFORMAT, 1, 0); + + LVCOLUMN lvc = { 0 }; + lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + lvc.fmt = LVCFMT_LEFT; + lvc.pszText = TranslateT("Period"); + lvc.cx = 135; + lvc.iSubItem = 0; + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc); + lvc.fmt = LVCFMT_RIGHT; + lvc.pszText = TranslateT("Incoming"); + lvc.iSubItem = 1; + lvc.cx = 72; + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc); + lvc.pszText = TranslateT("Outgoing"); + lvc.iSubItem = 2; + lvc.cx = 72; + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 2, (LPARAM)&lvc); + lvc.pszText = TranslateT("Sum"); + lvc.iSubItem = 3; + lvc.cx = 72; + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 3, (LPARAM)&lvc); + lvc.pszText = TranslateT("Online"); + lvc.iSubItem = 4; + lvc.cx = 72; + SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_INSERTCOLUMN, 4, (LPARAM)&lvc); + } + Stat_Show(hwndDlg); + break; // WM_INITDIALOG + case WM_COMMAND: + if ((HWND)lParam == hListAccs) { + DWORD SelItems[16]; + BYTE SelItemsCount; + if (HIWORD(wParam) == LBN_SELCHANGE) { + SelItemsCount = SendMessage(hListAccs, LB_GETSELCOUNT, 0, 0); + SendMessage(hListAccs, + LB_GETSELITEMS, + SelItemsCount, + (LPARAM)SelItems); + for (Stat_SelAcc = i = 0; i < SelItemsCount; i++) + Stat_SelAcc |= 1 << SelItems[i]; + Stat_Show(hwndDlg); } + } + switch (LOWORD(wParam)) { + case IDC_COMBO_UNITS: + if (HIWORD(wParam) != CBN_SELCHANGE) break; + unOptions.Stat_Units = SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_GETCURSEL, 0, 0); Stat_Show(hwndDlg); - break; // WM_INITDIALOG - case WM_COMMAND: - if ((HWND)lParam == hListAccs) - { - DWORD SelItems[16]; - BYTE SelItemsCount; - if (HIWORD(wParam) == LBN_SELCHANGE) - { - SelItemsCount = SendMessage(hListAccs, LB_GETSELCOUNT, 0, 0); - SendMessage(hListAccs, - LB_GETSELITEMS, - SelItemsCount, - (LPARAM)SelItems); - for (Stat_SelAcc = i = 0; i < SelItemsCount; i++) - Stat_SelAcc |= 1 << SelItems[i]; - Stat_Show(hwndDlg); - } - } - switch (LOWORD(wParam)) + break; + case IDC_BUTTON_CLEAR: { - case IDC_COMBO_UNITS: - if (HIWORD(wParam) != CBN_SELCHANGE) break; - unOptions.Stat_Units = SendDlgItemMessage(hwndDlg, IDC_COMBO_UNITS, CB_GETCURSEL, 0, 0); - Stat_Show(hwndDlg); + SYSTEMTIME stNow; + + if (IDOK != MessageBox(hwndDlg, + TranslateT("Now traffic statistics for selected accounts will be cleared.\nContinue?"), + TranslateT("Traffic counter"), + MB_OKCANCEL | MB_ICONWARNING)) break; - case IDC_BUTTON_CLEAR: + GetLocalTime(&stNow); + for (i = NumberOfAccounts; i--;) + if (0x01 & (Stat_SelAcc >> i)) { + SetFilePointer(ProtoList[i].hFile, sizeof(HOURLYSTATS), NULL, FILE_BEGIN); + SetEndOfFile(ProtoList[i].hFile); // Усекаем файл до одной записи. + ProtoList[i].NumberOfRecords = 1; + ProtoList[i].AllStatistics = (HOURLYSTATS*)mir_realloc(ProtoList[i].AllStatistics, sizeof(HOURLYSTATS)); + ProtoList[i].AllStatistics[0].Hour = stNow.wHour; + ProtoList[i].AllStatistics[0].Day = stNow.wDay; + ProtoList[i].AllStatistics[0].Month = stNow.wMonth; + ProtoList[i].AllStatistics[0].Year = stNow.wYear; + ProtoList[i].AllStatistics[0].Incoming = 0; + ProtoList[i].AllStatistics[0].Outgoing = 0; + ProtoList[i].StartIncoming = 0; + ProtoList[i].StartOutgoing = 0; + ProtoList[i].AllStatistics[0].Time = 0; + ProtoList[i].Total.TimeAtStart = GetTickCount(); + Stat_CheckStatistics(i); + } + Stat_Show(hwndDlg); + } + break; + } + break; // WM_COMMAND + case WM_NOTIFY: + { + LPNMHDR lpnmhdr = (LPNMHDR)lParam; + + switch (lpnmhdr->idFrom) { + case IDC_TAB_STATS: + if (lpnmhdr->code != TCN_SELCHANGE) break; + unOptions.Stat_Tab = SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_GETCURSEL, 0, 0); + Stat_Show(hwndDlg); + break; + case IDC_LIST_DATA: + switch (lpnmhdr->code) { + case LVN_GETDISPINFO: { - SYSTEMTIME stNow; + NMLVDISPINFO* pdi = (NMLVDISPINFO*)lParam; + SYSTEMTIME st = { 0 }; + DWORD Index, Value; + double vartime; + TCHAR szBufW[64]; + BYTE EldestAcc; + + if (!(pdi->item.mask & LVIF_TEXT)) return 0; + + // Если нужна надпись. + if (!pdi->item.iSubItem) { + EldestAcc = Stat_GetEldestAcc(Stat_SelAcc); + // Индекс применим только для самого старого аккаунта! + Index = Stat_GetStartIndex(EldestAcc, unOptions.Stat_Tab, pdi->item.iItem, &st); + switch (unOptions.Stat_Tab) { + case 0: // Hourly + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szBufW, 32); + mir_sntprintf(pdi->item.pszText, 32, _T("%s %02d:00 - %02d:59"), + szBufW, + ProtoList[EldestAcc].AllStatistics[Index].Hour, + ProtoList[EldestAcc].AllStatistics[Index].Hour); + break; + case 1: // Dayly + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pdi->item.pszText, 32); + break; + case 2: // Weekly + // Уходим к первому понедельнику слева. + SystemTimeToVariantTime(&st, &vartime); + vartime -= DayOfWeek(st.wDay, st.wMonth, st.wYear) - 1; + VariantTimeToSystemTime(vartime, &st); + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pdi->item.pszText, 32); + // Теперь к воскресенью. + SystemTimeToVariantTime(&st, &vartime); + vartime += 6; + VariantTimeToSystemTime(vartime, &st); + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szBufW, 32); + mir_sntprintf(pdi->item.pszText, 32, _T("%s - %s"), pdi->item.pszText, szBufW); + break; + case 3: // Monthly + GetDateFormat(LOCALE_USER_DEFAULT, DATE_YEARMONTH, &st, NULL, pdi->item.pszText, 32); + break; + case 4: // Yearly + mir_sntprintf(pdi->item.pszText, 32, _T("%d"), st.wYear); + break; + } + return 0; + } + + Value = Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, pdi->item.iItem, pdi->item.iSubItem); - if (IDOK != MessageBox(hwndDlg, - TranslateT("Now traffic statistics for selected accounts will be cleared.\nContinue?"), - TranslateT("Traffic counter"), - MB_OKCANCEL | MB_ICONWARNING)) + // Теперь можно записать в ListView циферки. + switch (pdi->item.iSubItem) { + case 1: // Входящий + case 2: // Исходящий + case 3: // Сумма + GetFormattedTraffic(Value, unOptions.Stat_Units, pdi->item.pszText, 32); break; - GetLocalTime(&stNow); - for (i = NumberOfAccounts; i--;) - if (0x01&(Stat_SelAcc>>i)) + case 4: // Время { - SetFilePointer(ProtoList[i].hFile, sizeof(HOURLYSTATS), NULL, FILE_BEGIN); - SetEndOfFile(ProtoList[i].hFile); // Усекаем файл до одной записи. - ProtoList[i].NumberOfRecords = 1; - ProtoList[i].AllStatistics = (HOURLYSTATS*)mir_realloc(ProtoList[i].AllStatistics, sizeof(HOURLYSTATS)); - ProtoList[i].AllStatistics[0].Hour = stNow.wHour; - ProtoList[i].AllStatistics[0].Day = stNow.wDay; - ProtoList[i].AllStatistics[0].Month = stNow.wMonth; - ProtoList[i].AllStatistics[0].Year = stNow.wYear; - ProtoList[i].AllStatistics[0].Incoming = 0; - ProtoList[i].AllStatistics[0].Outgoing = 0; - ProtoList[i].StartIncoming = 0; - ProtoList[i].StartOutgoing = 0; - ProtoList[i].AllStatistics[0].Time = 0; - ProtoList[i].Total.TimeAtStart = GetTickCount(); - Stat_CheckStatistics(i); + TCHAR *Fmt[5] = { _T("m:ss"), _T("h:mm:ss"), _T("h:mm:ss"), _T("d hh:mm:ss"), _T("d hh:mm:ss") }; + GetDurationFormatM(Value, Fmt[unOptions.Stat_Tab], pdi->item.pszText, 32); } - Stat_Show(hwndDlg); + break; + } } break; - } - break; // WM_COMMAND - case WM_NOTIFY: - { - LPNMHDR lpnmhdr = (LPNMHDR)lParam; - - switch(lpnmhdr->idFrom) - { - case IDC_TAB_STATS: - if (lpnmhdr->code != TCN_SELCHANGE) break; - unOptions.Stat_Tab = SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_GETCURSEL, 0, 0); - Stat_Show(hwndDlg); - break; - case IDC_LIST_DATA: - switch (lpnmhdr->code) - { - case LVN_GETDISPINFO: - { - NMLVDISPINFO* pdi = (NMLVDISPINFO*)lParam; - SYSTEMTIME st = {0}; - DWORD Index, Value; - double vartime; - TCHAR szBufW[64]; - BYTE EldestAcc; - - if (!(pdi->item.mask & LVIF_TEXT)) return 0; - - // Если нужна надпись. - if (!pdi->item.iSubItem) - { - EldestAcc = Stat_GetEldestAcc(Stat_SelAcc); - // Индекс применим только для самого старого аккаунта! - Index = Stat_GetStartIndex(EldestAcc, unOptions.Stat_Tab, pdi->item.iItem, &st); - switch (unOptions.Stat_Tab) - { - case 0: // Hourly - GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szBufW, 32); - mir_sntprintf(pdi->item.pszText, 32, _T("%s %02d:00 - %02d:59"), - szBufW, - ProtoList[EldestAcc].AllStatistics[Index].Hour, - ProtoList[EldestAcc].AllStatistics[Index].Hour); - break; - case 1: // Dayly - GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pdi->item.pszText, 32); - break; - case 2: // Weekly - // Уходим к первому понедельнику слева. - SystemTimeToVariantTime(&st, &vartime); - vartime -= DayOfWeek(st.wDay, st.wMonth, st.wYear) - 1; - VariantTimeToSystemTime(vartime, &st); - GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, pdi->item.pszText, 32); - // Теперь к воскресенью. - SystemTimeToVariantTime(&st, &vartime); - vartime += 6; - VariantTimeToSystemTime(vartime, &st); - GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szBufW, 32); - mir_sntprintf(pdi->item.pszText, 32, _T("%s - %s"), pdi->item.pszText, szBufW); - break; - case 3: // Monthly - GetDateFormat(LOCALE_USER_DEFAULT, DATE_YEARMONTH, &st, NULL, pdi->item.pszText, 32); - break; - case 4: // Yearly - mir_sntprintf(pdi->item.pszText, 32, _T("%d"), st.wYear); - break; - } - return 0; - } - - Value = Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, pdi->item.iItem, pdi->item.iSubItem); - - // Теперь можно записать в ListView циферки. - switch (pdi->item.iSubItem) - { - case 1: // Входящий - case 2: // Исходящий - case 3: // Сумма - GetFormattedTraffic(Value, unOptions.Stat_Units, pdi->item.pszText, 32); - break; - case 4: // Время - { - TCHAR *Fmt[5] = {_T("m:ss"), _T("h:mm:ss"), _T("h:mm:ss"), _T("d hh:mm:ss"), _T("d hh:mm:ss")}; - GetDurationFormatM(Value, Fmt[unOptions.Stat_Tab], pdi->item.pszText, 32); - } - break; - } - } - break; - - case NM_CLICK: - case LVN_ITEMCHANGED: - { - DWORD i, j = -1, dwTotalIncoming = 0, dwTotalOutgoing = 0; - - i = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETSELECTEDCOUNT, 0, 0); - for ( ; i--;) - { - j = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETNEXTITEM, j, LVNI_SELECTED); - dwTotalIncoming += Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, j, 1); - dwTotalOutgoing += Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, j, 2); - } - Stat_UpdateTotalTraffic(hwndDlg, dwTotalIncoming, dwTotalOutgoing); - } - break; - case NM_CUSTOMDRAW: - { - LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; - - switch (lplvcd->nmcd.dwDrawStage) - { - case CDDS_PREPAINT: // Перед началом рисования всего ListView. - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); - return TRUE; - case CDDS_ITEMPREPAINT: // Перед началом рисования строки. - { - COLORREF Color; - BYTE r, g, b; - - if (lplvcd->nmcd.dwItemSpec & 0x01) - { - Color = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETBKCOLOR, 0, 0); - r = GetRValue(Color); - g = GetGValue(Color); - b = GetBValue(Color); - r += r > 0x80 ? -40 : 40; - g += g > 0x80 ? -40 : 40; - b += b > 0x80 ? -40 : 40; - lplvcd->clrTextBk = RGB(r, g, b); - } - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NEWFONT); - return TRUE; - } - } + case NM_CLICK: + case LVN_ITEMCHANGED: + { + DWORD i, j = -1, dwTotalIncoming = 0, dwTotalOutgoing = 0; + + i = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETSELECTEDCOUNT, 0, 0); + for (; i--;) { + j = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETNEXTITEM, j, LVNI_SELECTED); + dwTotalIncoming += Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, j, 1); + dwTotalOutgoing += Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, j, 2); + } + Stat_UpdateTotalTraffic(hwndDlg, dwTotalIncoming, dwTotalOutgoing); + } + break; + + case NM_CUSTOMDRAW: + { + LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + + switch (lplvcd->nmcd.dwDrawStage) { + case CDDS_PREPAINT: // Перед началом рисования всего ListView. + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); + return TRUE; + case CDDS_ITEMPREPAINT: // Перед началом рисования строки. + { + COLORREF Color; + BYTE r, g, b; + + if (lplvcd->nmcd.dwItemSpec & 0x01) { + Color = SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_GETBKCOLOR, 0, 0); + r = GetRValue(Color); + g = GetGValue(Color); + b = GetBValue(Color); + r += r > 0x80 ? -40 : 40; + g += g > 0x80 ? -40 : 40; + b += b > 0x80 ? -40 : 40; + lplvcd->clrTextBk = RGB(r, g, b); } - break; + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NEWFONT); + return TRUE; + } } - break; + } + break; } + break; } - break; // WM_NOTIFY + } + break; // WM_NOTIFY } return 0; } @@ -315,8 +298,8 @@ void Stat_ReadFile(BYTE n) LARGE_INTEGER Size; DWORD BytesRead; TCHAR FileName[MAX_PATH], *pszPath; - SYSTEMTIME stNow, stLast = {0}; - + SYSTEMTIME stNow, stLast = { 0 }; + pszPath = Utils_ReplaceVarsT(_T("%miranda_userdata%\\statistics")); CreateDirectoryTreeT(pszPath); mir_sntprintf(FileName, _countof(FileName), _T("%s\\%S.stat"), pszPath, ProtoList[n].name); @@ -328,17 +311,15 @@ void Stat_ReadFile(BYTE n) if (Size.QuadPart != 0) // Если файл со статистикой существует и имеет ненулевой размер... { // ...то читаем статистику из файла - ProtoList[n].NumberOfRecords = DWORD(Size.QuadPart/sizeof(HOURLYSTATS)); + ProtoList[n].NumberOfRecords = DWORD(Size.QuadPart / sizeof(HOURLYSTATS)); ProtoList[n].AllStatistics = (HOURLYSTATS*)mir_alloc(sizeof(HOURLYSTATS)*ProtoList[n].NumberOfRecords); ReadFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[0], sizeof(HOURLYSTATS)*ProtoList[n].NumberOfRecords, &BytesRead, NULL); - if (!BytesRead) - { + if (!BytesRead) { MessageBox(TrafficHwnd, TranslateT("Couldn't read statistics file"), TranslateT("Traffic Counter"), MB_OK); return; } } - else - { + else { // Необходимо создать новый файл. ProtoList[n].NumberOfRecords = 1; ProtoList[n].AllStatistics = (HOURLYSTATS*)mir_alloc(sizeof(HOURLYSTATS)); @@ -347,8 +328,8 @@ void Stat_ReadFile(BYTE n) ProtoList[n].AllStatistics[0].Month = stNow.wMonth; ProtoList[n].AllStatistics[0].Year = stNow.wYear; ProtoList[n].AllStatistics[0].Incoming = - ProtoList[n].AllStatistics[0].Outgoing = - ProtoList[n].AllStatistics[0].Time = 0; + ProtoList[n].AllStatistics[0].Outgoing = + ProtoList[n].AllStatistics[0].Time = 0; } Stat_CheckStatistics(n); } @@ -382,47 +363,41 @@ void Stat_UpdateTotalTraffic(HWND hwndDialog, DWORD Incoming, DWORD Outgoing) /* Функция сравнивает с текущим время последней записи в статистике для аккаунта с номером n. Если они совпадают, ничего не происходит. -Если текущее время меньше времени последней записи (часы перевели назад), - количество записей уменьшается на соответствующее количество часов. +Если текущее время меньше времени последней записи (часы перевели назад), +количество записей уменьшается на соответствующее количество часов. Если текущее время больше, в статистику включается необходимое количество пустых записей. */ void Stat_CheckStatistics(BYTE n) { - SYSTEMTIME stNow, stLast = {0}; - HOURLYSTATS htTmp = {0}; + SYSTEMTIME stNow, stLast = { 0 }; + HOURLYSTATS htTmp = { 0 }; signed short int d;//, i; DWORD q; - stLast.wHour = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1].Hour; - stLast.wDay = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1].Day; - stLast.wMonth = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1].Month; - stLast.wYear = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1].Year; - + stLast.wHour = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1].Hour; + stLast.wDay = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1].Day; + stLast.wMonth = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1].Month; + stLast.wYear = ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1].Year; + GetLocalTime(&stNow); d = TimeCompare(stNow, stLast); // Если текущее время совпадает со временем последней записи... - if (!d) - { + if (!d) { // ...сохраняем запись в файл и уходим. - SetFilePointer(ProtoList[n].hFile, 0-sizeof(HOURLYSTATS), NULL, FILE_END); - WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1], sizeof(HOURLYSTATS), &q, NULL); - return; + SetFilePointer(ProtoList[n].hFile, -LONG(sizeof(HOURLYSTATS)), NULL, FILE_END); + WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], sizeof(HOURLYSTATS), &q, NULL); + return; } // Если часы перевели назад. - if (d < 0) - { - do - { + if (d < 0) { + do { stLast.wHour--; - if (stLast.wHour == 0xFFFF) - { + if (stLast.wHour == 0xFFFF) { stLast.wDay--; - if (!stLast.wDay) - { + if (!stLast.wDay) { stLast.wMonth--; - if (!stLast.wMonth) - { + if (!stLast.wMonth) { stLast.wMonth = 12; stLast.wYear--; } @@ -432,35 +407,30 @@ void Stat_CheckStatistics(BYTE n) ProtoList[n].NumberOfRecords--; } while (TimeCompare(stNow, stLast)); - return; + return; } - if (d > 0) - { + if (d > 0) { // Сохраняем. - SetFilePointer(ProtoList[n].hFile, 0-sizeof(HOURLYSTATS), NULL, FILE_END); - WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords-1], sizeof(HOURLYSTATS), &q, NULL); + SetFilePointer(ProtoList[n].hFile, -LONG(sizeof(HOURLYSTATS)), NULL, FILE_END); + WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], sizeof(HOURLYSTATS), &q, NULL); // Последняя запись из статистики понадобится для вычисления новых записей, поэтому копируем её (кроме трафика и времени). memcpy(&htTmp, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], - sizeof(HOURLYSTATS) - 2 * sizeof(DWORD) - sizeof(WORD)); + sizeof(HOURLYSTATS) - 2 * sizeof(DWORD) - sizeof(WORD)); // Счётчик времени каждый час должен начинать считать с нуля. ProtoList[n].Total.TimeAtStart = GetTickCount() - stNow.wMilliseconds; - do - { + do { ProtoList[n].AllStatistics = (HOURLYSTATS*)mir_realloc(ProtoList[n].AllStatistics, sizeof(HOURLYSTATS) * ++ProtoList[n].NumberOfRecords); htTmp.Hour++; - if (htTmp.Hour > 23) - { + if (htTmp.Hour > 23) { htTmp.Hour = 0; htTmp.Day++; - if (htTmp.Day > DaysInMonth(htTmp.Month, htTmp.Year)) - { + if (htTmp.Day > DaysInMonth(htTmp.Month, htTmp.Year)) { htTmp.Day = 1; htTmp.Month++; - if (htTmp.Month > 12) - { + if (htTmp.Month > 12) { htTmp.Month = 1; htTmp.Year++; } } @@ -488,11 +458,10 @@ stReq - DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIME *stReq) { DWORD Left, Right, Probe; // Границы интервала для поиска (индексы статистики). - SYSTEMTIME stProbe = {0}; // Время тыка. + SYSTEMTIME stProbe = { 0 }; // Время тыка. signed short int d = 1; - if (!ItemNumber) - { + if (!ItemNumber) { stReq->wHour = ProtoList[AccNum].AllStatistics[0].Hour; stReq->wDay = ProtoList[AccNum].AllStatistics[0].Day; stReq->wMonth = ProtoList[AccNum].AllStatistics[0].Month; @@ -501,36 +470,34 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM } // Вычисляем время, соответствующее началу интервала. - for (Probe = 0, Left = 1; Left < ProtoList[AccNum].NumberOfRecords; Left++) - { - switch(Interval) - { - case STAT_INTERVAL_HOUR: - stReq->wHour = ProtoList[AccNum].AllStatistics[ItemNumber].Hour; - stReq->wDay = ProtoList[AccNum].AllStatistics[ItemNumber].Day; - stReq->wMonth = ProtoList[AccNum].AllStatistics[ItemNumber].Month; - stReq->wYear = ProtoList[AccNum].AllStatistics[ItemNumber].Year; - return ItemNumber; - break; - case STAT_INTERVAL_DAY: - if (ProtoList[AccNum].AllStatistics[Left].Day != ProtoList[AccNum].AllStatistics[Left - 1].Day) - Probe++; - break; - case STAT_INTERVAL_WEEK: - if ( !ProtoList[AccNum].AllStatistics[Left].Hour - && DayOfWeek(ProtoList[AccNum].AllStatistics[Left].Day, - ProtoList[AccNum].AllStatistics[Left].Month, - ProtoList[AccNum].AllStatistics[Left].Year) == 1) - Probe++; - break; - case STAT_INTERVAL_MONTH: - if (ProtoList[AccNum].AllStatistics[Left].Month != ProtoList[AccNum].AllStatistics[Left - 1].Month) - Probe++; - break; - case STAT_INTERVAL_YEAR: - if (ProtoList[AccNum].AllStatistics[Left].Year != ProtoList[AccNum].AllStatistics[Left - 1].Year) - Probe++; - break; + for (Probe = 0, Left = 1; Left < ProtoList[AccNum].NumberOfRecords; Left++) { + switch (Interval) { + case STAT_INTERVAL_HOUR: + stReq->wHour = ProtoList[AccNum].AllStatistics[ItemNumber].Hour; + stReq->wDay = ProtoList[AccNum].AllStatistics[ItemNumber].Day; + stReq->wMonth = ProtoList[AccNum].AllStatistics[ItemNumber].Month; + stReq->wYear = ProtoList[AccNum].AllStatistics[ItemNumber].Year; + return ItemNumber; + break; + case STAT_INTERVAL_DAY: + if (ProtoList[AccNum].AllStatistics[Left].Day != ProtoList[AccNum].AllStatistics[Left - 1].Day) + Probe++; + break; + case STAT_INTERVAL_WEEK: + if (!ProtoList[AccNum].AllStatistics[Left].Hour + && DayOfWeek(ProtoList[AccNum].AllStatistics[Left].Day, + ProtoList[AccNum].AllStatistics[Left].Month, + ProtoList[AccNum].AllStatistics[Left].Year) == 1) + Probe++; + break; + case STAT_INTERVAL_MONTH: + if (ProtoList[AccNum].AllStatistics[Left].Month != ProtoList[AccNum].AllStatistics[Left - 1].Month) + Probe++; + break; + case STAT_INTERVAL_YEAR: + if (ProtoList[AccNum].AllStatistics[Left].Year != ProtoList[AccNum].AllStatistics[Left - 1].Year) + Probe++; + break; } if (Probe == ItemNumber) break; } @@ -543,8 +510,7 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM Left = 0; Right = ProtoList[AccNum].NumberOfRecords - 1; // Вычисляем индекс начала интервала. - while (TRUE) - { + while (TRUE) { if (Right - Left == 1) return Right; Probe = (Left + Right) >> 1; stProbe.wYear = ProtoList[AccNum].AllStatistics[Probe].Year; @@ -565,11 +531,10 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM void Stat_SetAccShift(BYTE AccNum, BYTE EldestAccount) { DWORD Left, Right, Probe = 0; // Границы интервала для поиска (индексы статистики). - SYSTEMTIME stReq = {0}, stProbe; + SYSTEMTIME stReq = { 0 }, stProbe; signed short int d = 1; - if (AccNum == EldestAccount) - { + if (AccNum == EldestAccount) { ProtoList[AccNum].Shift = 0; return; } @@ -581,10 +546,8 @@ void Stat_SetAccShift(BYTE AccNum, BYTE EldestAccount) // Вычисляем индекс начала интервала. Left = 0; Right = ProtoList[EldestAccount].NumberOfRecords - 1; - while (TRUE) - { - if (Right - Left == 1) - { + while (TRUE) { + if (Right - Left == 1) { ProtoList[AccNum].Shift = Probe + d; return; } @@ -608,10 +571,11 @@ SelectedAccs - Interval - выбранный интервал; ItemNum - номер строки в ListVew; SubitemNum - номер колонки, определяет вид информации. */ + DWORD Stat_GetItemValue(WORD SelectedAccs, BYTE Interval, DWORD ItemNum, BYTE SubItemNum) { DWORD Result = 0; - SYSTEMTIME st = {0}; + SYSTEMTIME st = { 0 }; DWORD Index, IndexP, i; signed long int IndexM; BYTE a, EldestAcc; @@ -619,62 +583,58 @@ DWORD Stat_GetItemValue(WORD SelectedAccs, BYTE Interval, DWORD ItemNum, BYTE Su EldestAcc = Stat_GetEldestAcc(SelectedAccs); Index = Stat_GetStartIndex(EldestAcc, Interval, ItemNum, &st); - for (a = NumberOfAccounts; a--; ) - { + for (a = NumberOfAccounts; a--;) { if (!((1 << a) & SelectedAccs)) continue; Stat_SetAccShift(a, EldestAcc); IndexM = Index - ProtoList[a].Shift; IndexP = Index; - for (i = 0; ; ) - { + for (i = 0;;) { if (IndexM >= 0) - switch (SubItemNum) - { - case 1: // Входящий - Result += ProtoList[a].AllStatistics[IndexM].Incoming; - break; - case 2: // Исходящий - Result += ProtoList[a].AllStatistics[IndexM].Outgoing; - break; - case 3: // Сумма - Result += ProtoList[a].AllStatistics[IndexM].Incoming - + ProtoList[a].AllStatistics[IndexM].Outgoing; - break; - case 4: // Время - Result += ProtoList[a].AllStatistics[IndexM].Time; - break; - } - - IndexM++; IndexP++; // Переходим к следующей записи. - if (IndexM == ProtoList[a].NumberOfRecords) break; - - // Когда остановиться? - switch (Interval) - { - case STAT_INTERVAL_HOUR: - i = 1; // Новый час начинается каждый час. + switch (SubItemNum) { + case 1: // Входящий + Result += ProtoList[a].AllStatistics[IndexM].Incoming; break; - case STAT_INTERVAL_DAY: - i = (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + case 2: // Исходящий + Result += ProtoList[a].AllStatistics[IndexM].Outgoing; break; - case STAT_INTERVAL_WEEK: - i = (1 == DayOfWeek(ProtoList[EldestAcc].AllStatistics[IndexP].Day, - ProtoList[EldestAcc].AllStatistics[IndexP].Month, - ProtoList[EldestAcc].AllStatistics[IndexP].Year)) - && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + case 3: // Сумма + Result += ProtoList[a].AllStatistics[IndexM].Incoming + + ProtoList[a].AllStatistics[IndexM].Outgoing; break; - case STAT_INTERVAL_MONTH: - i = (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Day) - && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); - break; - case STAT_INTERVAL_YEAR: - i = (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Month) - && (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Day) - && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + case 4: // Время + Result += ProtoList[a].AllStatistics[IndexM].Time; break; } + IndexM++; IndexP++; // Переходим к следующей записи. + if (IndexM == ProtoList[a].NumberOfRecords) break; + + // Когда остановиться? + switch (Interval) { + case STAT_INTERVAL_HOUR: + i = 1; // Новый час начинается каждый час. + break; + case STAT_INTERVAL_DAY: + i = (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + break; + case STAT_INTERVAL_WEEK: + i = (1 == DayOfWeek(ProtoList[EldestAcc].AllStatistics[IndexP].Day, + ProtoList[EldestAcc].AllStatistics[IndexP].Month, + ProtoList[EldestAcc].AllStatistics[IndexP].Year)) + && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + break; + case STAT_INTERVAL_MONTH: + i = (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Day) + && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + break; + case STAT_INTERVAL_YEAR: + i = (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Month) + && (1 == ProtoList[EldestAcc].AllStatistics[IndexP].Day) + && (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour); + break; + } + if (i) break; } } @@ -689,36 +649,35 @@ DWORD Stat_GetRecordsNumber(BYTE AccNum, BYTE Interval) DWORD Result, i; // Нужно узнать количество записей. - switch (Interval) - { - case STAT_INTERVAL_HOUR: - Result = ProtoList[AccNum].NumberOfRecords; // Для почасовой статистики совпадает. - break; - case STAT_INTERVAL_DAY: - for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--; ) - if (ProtoList[AccNum].AllStatistics[i].Day != ProtoList[AccNum].AllStatistics[i+1].Day) - Result++; - break; - case STAT_INTERVAL_WEEK: - for (Result = 1, i = ProtoList[AccNum].NumberOfRecords; i--; ) - if ( ProtoList[AccNum].AllStatistics[i].Hour == 23 - && DayOfWeek(ProtoList[AccNum].AllStatistics[i].Day, - ProtoList[AccNum].AllStatistics[i].Month, - ProtoList[AccNum].AllStatistics[i].Year) == 7) - Result++; - break; - case STAT_INTERVAL_MONTH: - for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--; ) - if (ProtoList[AccNum].AllStatistics[i].Month != ProtoList[AccNum].AllStatistics[i+1].Month) - Result++; - break; - case STAT_INTERVAL_YEAR: - for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--; ) - if (ProtoList[AccNum].AllStatistics[i].Year != ProtoList[AccNum].AllStatistics[i+1].Year) - Result++; - break; - default: - return 0; + switch (Interval) { + case STAT_INTERVAL_HOUR: + Result = ProtoList[AccNum].NumberOfRecords; // Для почасовой статистики совпадает. + break; + case STAT_INTERVAL_DAY: + for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--;) + if (ProtoList[AccNum].AllStatistics[i].Day != ProtoList[AccNum].AllStatistics[i + 1].Day) + Result++; + break; + case STAT_INTERVAL_WEEK: + for (Result = 1, i = ProtoList[AccNum].NumberOfRecords; i--;) + if (ProtoList[AccNum].AllStatistics[i].Hour == 23 + && DayOfWeek(ProtoList[AccNum].AllStatistics[i].Day, + ProtoList[AccNum].AllStatistics[i].Month, + ProtoList[AccNum].AllStatistics[i].Year) == 7) + Result++; + break; + case STAT_INTERVAL_MONTH: + for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--;) + if (ProtoList[AccNum].AllStatistics[i].Month != ProtoList[AccNum].AllStatistics[i + 1].Month) + Result++; + break; + case STAT_INTERVAL_YEAR: + for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--;) + if (ProtoList[AccNum].AllStatistics[i].Year != ProtoList[AccNum].AllStatistics[i + 1].Year) + Result++; + break; + default: + return 0; } return Result; @@ -730,19 +689,16 @@ BYTE Stat_GetEldestAcc(WORD SelectedAccs) // Узнаём номер аккаунта из числа выбранных, имеющего самую старую первую запись. // (Это аккаунт с максимальным количеством записей.) - for (Result = i = 0; i < NumberOfAccounts; i++) - { + for (Result = i = 0; i < NumberOfAccounts; i++) { // Надо с чего-то начать поиск. - if ( 0x01 & (SelectedAccs >> i)) - { + if (0x01 & (SelectedAccs >> i)) { Result = i; break; } } // Продолжаем поиск. - for (; ++i < NumberOfAccounts; ) - { - if ( 0x01 & (SelectedAccs >> i) && (ProtoList[i].NumberOfRecords > ProtoList[Result].NumberOfRecords) ) + for (; ++i < NumberOfAccounts;) { + if (0x01 & (SelectedAccs >> i) && (ProtoList[i].NumberOfRecords > ProtoList[Result].NumberOfRecords)) Result = i; } -- cgit v1.2.3