summaryrefslogtreecommitdiff
path: root/plugins/TrafficCounter/src/statistics.cpp
diff options
context:
space:
mode:
authorKirill Volinsky <mataes2007@gmail.com>2017-11-28 22:12:43 +0300
committerKirill Volinsky <mataes2007@gmail.com>2017-11-28 22:12:43 +0300
commit80221d816eeb98f0df38e0243390033c614952f3 (patch)
tree7618176108093921b6934343bc2f76a66ea97730 /plugins/TrafficCounter/src/statistics.cpp
parent25df99ba7462958f2cb9075020ec1c9a5a7c9f50 (diff)
Source files converted to utf-8
Diffstat (limited to 'plugins/TrafficCounter/src/statistics.cpp')
-rw-r--r--plugins/TrafficCounter/src/statistics.cpp154
1 files changed, 77 insertions, 77 deletions
diff --git a/plugins/TrafficCounter/src/statistics.cpp b/plugins/TrafficCounter/src/statistics.cpp
index 342b1d8fa2..5451e7158e 100644
--- a/plugins/TrafficCounter/src/statistics.cpp
+++ b/plugins/TrafficCounter/src/statistics.cpp
@@ -17,13 +17,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* ======================================================================================
-
-: Mironych
+Здесь содержатся переменные и функции для работы со статистикой
+Автор: Mironych
=======================================================================================*/
#include "stdafx.h"
-WORD Stat_SelAcc; //
+WORD Stat_SelAcc; // Выбранные аккаунты в окне статистики
HWND hListAccs;
@@ -34,7 +34,7 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
switch (msg) {
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
- // ListBox c .
+ // Создаём ListBox c перечнем аккаунтов.
hListAccs = CreateWindowEx(WS_EX_CLIENTEDGE,
L"ListBox",
nullptr, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | LBS_NOTIFY,
@@ -42,19 +42,19 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
hwndDlg, nullptr, nullptr, nullptr);
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;
@@ -70,7 +70,7 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_INSERTITEM, 4, (LPARAM)&tci);
SendDlgItemMessage(hwndDlg, IDC_TAB_STATS, TCM_SETCURSEL, unOptions.Stat_Tab, 0);
}
- // ListView -
+ // Готовим ListView - колонки и стили
{
SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
SendDlgItemMessage(hwndDlg, IDC_LIST_DATA, LVM_SETUNICODEFORMAT, 1, 0);
@@ -136,7 +136,7 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
for (i = NumberOfAccounts; i--;)
if (0x01 & (Stat_SelAcc >> i)) {
SetFilePointer(ProtoList[i].hFile, sizeof(HOURLYSTATS), nullptr, FILE_BEGIN);
- SetEndOfFile(ProtoList[i].hFile); // .
+ 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;
@@ -179,10 +179,10 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
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
@@ -196,12 +196,12 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, nullptr, 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, nullptr, pdi->item.pszText, 32);
- // .
+ // Теперь к воскресенью.
SystemTimeToVariantTime(&st, &vartime);
vartime += 6;
VariantTimeToSystemTime(vartime, &st);
@@ -220,14 +220,14 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
Value = Stat_GetItemValue(Stat_SelAcc, unOptions.Stat_Tab, pdi->item.iItem, pdi->item.iSubItem);
- // ListView .
+ // Теперь можно записать в ListView циферки.
switch (pdi->item.iSubItem) {
- case 1: //
- case 2: //
- case 3: //
+ case 1: // Входящий
+ case 2: // Исходящий
+ case 3: // Сумма
GetFormattedTraffic(Value, unOptions.Stat_Units, pdi->item.pszText, 32);
break;
- case 4: //
+ case 4: // Время
{
wchar_t *Fmt[5] = { L"m:ss", L"h:mm:ss", L"h:mm:ss", L"d hh:mm:ss", L"d hh:mm:ss" };
GetDurationFormatM(Value, Fmt[unOptions.Stat_Tab], pdi->item.pszText, 32);
@@ -257,10 +257,10 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch (lplvcd->nmcd.dwDrawStage) {
- case CDDS_PREPAINT: // ListView.
+ case CDDS_PREPAINT: // Перед началом рисования всего ListView.
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW);
return TRUE;
- case CDDS_ITEMPREPAINT: // .
+ case CDDS_ITEMPREPAINT: // Перед началом рисования строки.
{
COLORREF Color;
BYTE r, g, b;
@@ -291,7 +291,7 @@ INT_PTR CALLBACK DlgProcOptStatistics(HWND hwndDlg, UINT msg, WPARAM wParam, LPA
}
/*
- n.
+Функция читает статистику из файла для аккаунта с номером n.
*/
void Stat_ReadFile(BYTE n)
{
@@ -308,9 +308,9 @@ void Stat_ReadFile(BYTE n)
ProtoList[n].hFile = CreateFile(FileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
GetFileSizeEx(ProtoList[n].hFile, &Size);
- if (Size.QuadPart != 0) // ...
+ if (Size.QuadPart != 0) // Если файл со статистикой существует и имеет ненулевой размер...
{
- // ...
+ // ...то читаем статистику из файла
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, nullptr);
@@ -320,7 +320,7 @@ void Stat_ReadFile(BYTE n)
}
}
else {
- // .
+ // Необходимо создать новый файл.
ProtoList[n].NumberOfRecords = 1;
ProtoList[n].AllStatistics = (HOURLYSTATS*)mir_alloc(sizeof(HOURLYSTATS));
ProtoList[n].AllStatistics[0].Hour = stNow.wHour;
@@ -334,17 +334,17 @@ void Stat_ReadFile(BYTE n)
Stat_CheckStatistics(n);
}
-/* ListView .
-: hwndDialog - . */
+/* Функция готовит вывод в ListView статистики.
+Аргументы: hwndDialog - хэндл окна диалога. */
void Stat_Show(HWND hwndDialog)
{
DWORD MaxRecords;
- // .
+ // Нужно узнать количество записей.
MaxRecords = Stat_GetRecordsNumber(Stat_GetEldestAcc(Stat_SelAcc), unOptions.Stat_Tab);
- // ListView.
+ // Установим такое же количество строк в ListView.
SendDlgItemMessage(hwndDialog, IDC_LIST_DATA, LVM_SETITEMCOUNT, MaxRecords, 0);
- // .
+ // Надо показать самые свежие записи.
SendDlgItemMessage(hwndDialog, IDC_LIST_DATA, LVM_ENSUREVISIBLE, (WPARAM)(MaxRecords - 1), 0);
}
@@ -361,11 +361,11 @@ void Stat_UpdateTotalTraffic(HWND hwndDialog, DWORD Incoming, DWORD Outgoing)
}
/*
- n.
- , .
- ( ),
- .
- , .
+Функция сравнивает с текущим время последней записи в статистике для аккаунта с номером n.
+Если они совпадают, ничего не происходит.
+Если текущее время меньше времени последней записи (часы перевели назад),
+количество записей уменьшается на соответствующее количество часов.
+Если текущее время больше, в статистику включается необходимое количество пустых записей.
*/
void Stat_CheckStatistics(BYTE n)
{
@@ -381,15 +381,15 @@ void Stat_CheckStatistics(BYTE n)
GetLocalTime(&stNow);
d = TimeCompare(stNow, stLast);
- // ...
+ // Если текущее время совпадает со временем последней записи...
if (!d) {
- // ... .
+ // ...сохраняем запись в файл и уходим.
SetFilePointer(ProtoList[n].hFile, -LONG(sizeof(HOURLYSTATS)), nullptr, FILE_END);
WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], sizeof(HOURLYSTATS), &q, nullptr);
return;
}
- // .
+ // Если часы перевели назад.
if (d < 0) {
do {
stLast.wHour--;
@@ -411,14 +411,14 @@ void Stat_CheckStatistics(BYTE n)
}
if (d > 0) {
- // .
+ // Сохраняем.
SetFilePointer(ProtoList[n].hFile, -LONG(sizeof(HOURLYSTATS)), nullptr, FILE_END);
WriteFile(ProtoList[n].hFile, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], sizeof(HOURLYSTATS), &q, nullptr);
- // , ( ).
+ // Последняя запись из статистики понадобится для вычисления новых записей, поэтому копируем её (кроме трафика и времени).
memcpy(&htTmp, &ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1],
sizeof(HOURLYSTATS) - 2 * sizeof(DWORD) - sizeof(WORD));
- // .
+ // Счётчик времени каждый час должен начинать считать с нуля.
ProtoList[n].Total.TimeAtStart = GetTickCount() - stNow.wMilliseconds;
do {
@@ -441,7 +441,7 @@ void Stat_CheckStatistics(BYTE n)
stLast.wMonth = htTmp.Month;
stLast.wYear = htTmp.Year;
- // .
+ // Добавляем записи одновременно в ОЗУ и в файл.
WriteFile(ProtoList[n].hFile, &htTmp, sizeof(HOURLYSTATS), &q, nullptr);
memcpy(&ProtoList[n].AllStatistics[ProtoList[n].NumberOfRecords - 1], &htTmp, sizeof(HOURLYSTATS));
@@ -449,16 +449,16 @@ void Stat_CheckStatistics(BYTE n)
}
}
-/* , .
- .
-:
-ItemNumber - ListView ( ).
-stReq - , .
+/* Функция возращает индекс первой записи в статистике, относящейся к выбранному интервалу.
+При вычислении учитывается выбранный интервал и аккаунты.
+Аргументы:
+ItemNumber - номер строки в ListView (номер периода).
+stReq - дата, соответствующая вычисленному индексу.
*/
DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIME *stReq)
{
- DWORD Left, Right, Probe; // ( ).
- SYSTEMTIME stProbe = { 0 }; // .
+ DWORD Left, Right, Probe; // Границы интервала для поиска (индексы статистики).
+ SYSTEMTIME stProbe = { 0 }; // Время тыка.
signed short int d = 1;
if (!ItemNumber) {
@@ -469,7 +469,7 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM
return 0;
}
- // , .
+ // Вычисляем время, соответствующее началу интервала.
for (Probe = 0, Left = 1; Left < ProtoList[AccNum].NumberOfRecords; Left++) {
switch (Interval) {
case STAT_INTERVAL_HOUR:
@@ -509,7 +509,7 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM
Left = 0; Right = ProtoList[AccNum].NumberOfRecords - 1;
- // .
+ // Вычисляем индекс начала интервала.
while (TRUE) {
if (Right - Left == 1) return Right;
Probe = (Left + Right) >> 1;
@@ -525,12 +525,12 @@ DWORD Stat_GetStartIndex(BYTE AccNum, BYTE Interval, DWORD ItemNumber, SYSTEMTIM
return Probe;
}
-/* ,
- ,
- . */
+/* Функция устанавливает величину сдвига для заданного аккаунта,
+то есть номер записи в статистике старейшего из выбранных аккаунтов,
+дата которой соответствует началу статистики указанного аккаунта. */
void Stat_SetAccShift(BYTE AccNum, BYTE EldestAccount)
{
- DWORD Left, Right, Probe = 0; // ( ).
+ DWORD Left, Right, Probe = 0; // Границы интервала для поиска (индексы статистики).
SYSTEMTIME stReq = { 0 }, stProbe;
signed short int d = 1;
@@ -544,7 +544,7 @@ void Stat_SetAccShift(BYTE AccNum, BYTE EldestAccount)
stReq.wMonth = ProtoList[AccNum].AllStatistics[0].Month;
stReq.wYear = ProtoList[AccNum].AllStatistics[0].Year;
- // .
+ // Вычисляем индекс начала интервала.
Left = 0; Right = ProtoList[EldestAccount].NumberOfRecords - 1;
while (TRUE) {
if (Right - Left == 1) {
@@ -564,13 +564,13 @@ void Stat_SetAccShift(BYTE AccNum, BYTE EldestAccount)
ProtoList[AccNum].Shift = Probe;
}
-/* ,
- ListView.
-:
-SelectedAccs - , ;
-Interval - ;
-ItemNum - ListVew;
-SubitemNum - , . */
+/* Функция вычисляет значение, соответствующее указанному подэлементу
+указанной строки ListView.
+Аргументы:
+SelectedAccs - слово, в котором единичные биты соответствуют выбранным аккаунтам;
+Interval - выбранный интервал;
+ItemNum - номер строки в ListVew;
+SubitemNum - номер колонки, определяет вид информации. */
DWORD Stat_GetItemValue(WORD SelectedAccs, BYTE Interval, DWORD ItemNum, BYTE SubItemNum)
{
@@ -592,29 +592,29 @@ DWORD Stat_GetItemValue(WORD SelectedAccs, BYTE Interval, DWORD ItemNum, BYTE Su
for (i = 0;;) {
if (IndexM >= 0)
switch (SubItemNum) {
- case 1: //
+ case 1: // Входящий
Result += ProtoList[a].AllStatistics[IndexM].Incoming;
break;
- case 2: //
+ case 2: // Исходящий
Result += ProtoList[a].AllStatistics[IndexM].Outgoing;
break;
- case 3: //
+ case 3: // Сумма
Result += ProtoList[a].AllStatistics[IndexM].Incoming
+ ProtoList[a].AllStatistics[IndexM].Outgoing;
break;
- case 4: //
+ case 4: // Время
Result += ProtoList[a].AllStatistics[IndexM].Time;
break;
}
- IndexM++; IndexP++; // .
+ IndexM++; IndexP++; // Переходим к следующей записи.
if (IndexM == ProtoList[a].NumberOfRecords)
break;
- // ?
+ // Когда остановиться?
switch (Interval) {
case STAT_INTERVAL_HOUR:
- i = 1; // .
+ i = 1; // Новый час начинается каждый час.
break;
case STAT_INTERVAL_DAY:
i = (0 == ProtoList[EldestAcc].AllStatistics[IndexP].Hour);
@@ -643,16 +643,16 @@ DWORD Stat_GetItemValue(WORD SelectedAccs, BYTE Interval, DWORD ItemNum, BYTE Su
return Result;
}
-/*
- . */
+/* Функция возвращает количество записей в статистике для
+заданного аккаунта и заданного интервала. */
DWORD Stat_GetRecordsNumber(BYTE AccNum, BYTE Interval)
{
DWORD Result, i;
- // .
+ // Нужно узнать количество записей.
switch (Interval) {
case STAT_INTERVAL_HOUR:
- Result = ProtoList[AccNum].NumberOfRecords; // .
+ Result = ProtoList[AccNum].NumberOfRecords; // Для почасовой статистики совпадает.
break;
case STAT_INTERVAL_DAY:
for (Result = 1, i = ProtoList[AccNum].NumberOfRecords - 1; i--;)
@@ -688,16 +688,16 @@ BYTE Stat_GetEldestAcc(WORD SelectedAccs)
{
BYTE Result, i;
- // , .
- // ( .)
+ // Узнаём номер аккаунта из числа выбранных, имеющего самую старую первую запись.
+ // (Это аккаунт с максимальным количеством записей.)
for (Result = i = 0; i < NumberOfAccounts; i++) {
- // - .
+ // Надо с чего-то начать поиск.
if (0x01 & (SelectedAccs >> i)) {
Result = i;
break;
}
}
- // .
+ // Продолжаем поиск.
for (; ++i < NumberOfAccounts;) {
if (0x01 & (SelectedAccs >> i) && (ProtoList[i].NumberOfRecords > ProtoList[Result].NumberOfRecords))
Result = i;