diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/TrafficCounter/src/TrafficCounter.cpp | 843 | ||||
| -rw-r--r-- | plugins/TrafficCounter/src/misc.cpp | 154 | ||||
| -rw-r--r-- | plugins/TrafficCounter/src/misc.h | 2 | ||||
| -rw-r--r-- | plugins/TrafficCounter/src/statistics.cpp | 812 | ||||
| -rw-r--r-- | plugins/UserInfoEx/src/ex_import/svc_ExImport.cpp | 2 | 
5 files changed, 834 insertions, 979 deletions
| 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;
  	}
 diff --git a/plugins/UserInfoEx/src/ex_import/svc_ExImport.cpp b/plugins/UserInfoEx/src/ex_import/svc_ExImport.cpp index e9898a9e50..f8047def59 100644 --- a/plugins/UserInfoEx/src/ex_import/svc_ExImport.cpp +++ b/plugins/UserInfoEx/src/ex_import/svc_ExImport.cpp @@ -331,7 +331,7 @@ INT_PTR svcExIm_Account_Service(WPARAM wParam, LPARAM lParam)  	ExImParam ExIm;
  	memset(&ExIm, 0, sizeof(ExIm));
  	HWND hClist = (HWND)CallService(MS_CLUI_GETHWNDTREE,0,0);
 -	lpStatusMenuExecParam smep = (lpStatusMenuExecParam) CallService(MO_MENUITEMGETOWNERDATA, (WPARAM) lParam, NULL);
 +	lpStatusMenuExecParam smep = (lpStatusMenuExecParam)Menu_GetUserData((HGENMENU)lParam);
  	ExIm.pszName = mir_strdup(smep->proto);
  	ExIm.Typ = EXIM_ACCOUNT;
 | 
