From 0c2db8f67782848603cdd845713ca70e285c0f49 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@4f64403b-2f21-0410-a795-97e2b3489a10> Date: Sun, 4 Apr 2010 23:41:11 +0000 Subject: Fixed incorrect time after time zone table changes Reduced size plugin size git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@487 4f64403b-2f21-0410-a795-97e2b3489a10 --- worldtime_protocol/common.h | 40 +++++++++----------- worldtime_protocol/options.cpp | 36 +++++++----------- worldtime_protocol/time_display.cpp | 31 +++++++++++++-- worldtime_protocol/time_display.h | 1 - worldtime_protocol/timezone.cpp | 12 +++--- worldtime_protocol/timezone.h | 13 +++---- worldtime_protocol/timezone_list.cpp | 43 +++++++++++---------- worldtime_protocol/timezone_list.h | 4 +- worldtime_protocol/worldtimeproto.cpp | 71 +++++++++++++++++++++++------------ worldtime_protocol/worldtimeproto.h | 2 - 10 files changed, 143 insertions(+), 110 deletions(-) diff --git a/worldtime_protocol/common.h b/worldtime_protocol/common.h index 926cf50..7a5e23a 100644 --- a/worldtime_protocol/common.h +++ b/worldtime_protocol/common.h @@ -5,33 +5,29 @@ #define VC_EXTRALEAN #define _WIN32_WINNT 0x0400 +#define MIRANDA_VER 0x0600 + +#include + #include -#include -#include -#include -#include #include #define PROTO "WorldTime" -#include - -#include "../../../include/newpluginapi.h" -#include "../../../include/statusmodes.h" -#include "../../../include/m_options.h" -#include "../../../include/m_langpack.h" -#include "../../../include/m_popup.h" -#include "../../../include/m_system.h" -#include "../../../include/m_skin.h" -#include "../../../include/m_netlib.h" -#include "../../../include/m_database.h" -#include "../../../include/m_protocols.h" -#include "../../../include/m_protomod.h" -#include "../../../include/m_protosvc.h" -#include "../../../include/m_ignore.h" -#include "../../../include/m_clist.h" -#include "../../../include/m_clui.h" -#include "../../../include/m_utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "m_updater.h" extern HINSTANCE hInst; diff --git a/worldtime_protocol/options.cpp b/worldtime_protocol/options.cpp index 7b04e34..071c88c 100644 --- a/worldtime_protocol/options.cpp +++ b/worldtime_protocol/options.cpp @@ -4,24 +4,23 @@ bool set_format = false, hide_proto = false; TCHAR format_string[512], date_format_string[512], clist_format_string[512]; -ITEMLIST temp_listbox_items; +ITEMLIST temp_listbox_items(10); void fill_timezone_list_control(HWND hwndDlg) { - int index = 0; HWND hw = GetDlgItem(hwndDlg, IDC_LIST_TIMES); SendMessage(hw, LB_RESETCONTENT, 0, 0); if(IsDlgButtonChecked(hwndDlg, IDC_RAD_ALPHA)) { - for(TimeList::iterator i = timezone_list.begin(); i != timezone_list.end(); i++, index++) { - SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)i->tcName); - SendMessage(hw, LB_SETITEMDATA, (WPARAM)index, (LPARAM)i->list_index); + for(int i = 0; i < timezone_list.getCount(); i++) { + SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)timezone_list[i].tcName); + SendMessage(hw, LB_SETITEMDATA, (WPARAM)i, (LPARAM)timezone_list[i].list_index); } } else { - for(TimeList::iterator i = geo_timezone_list.begin(); i != geo_timezone_list.end(); i++, index++) { - SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)i->tcName); - SendMessage(hw, LB_SETITEMDATA, (WPARAM)index, (LPARAM)i->list_index); + for(int i =0; i < geo_timezone_list.getCount(); ++i) { + SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)timezone_list[i].tcName); + SendMessage(hw, LB_SETITEMDATA, (WPARAM)i, (LPARAM)timezone_list[i].list_index); } } } @@ -125,12 +124,11 @@ static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA TranslateDialogDefault( hwndDlg ); load_listbox_items(); - temp_listbox_items = listbox_items; + copy_listbox_items(temp_listbox_items, listbox_items); hw = GetDlgItem(hwndDlg, IDC_LIST_TIMES2); - index = 0; - for(ITEMLIST::iterator ili = temp_listbox_items.begin(); ili != temp_listbox_items.end(); ili++, index++) { - sel = SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)&ili->pszText); + for(index = 0; index < temp_listbox_items.getCount(); index++) { + sel = SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)temp_listbox_items[index].pszText); } bool set_format = (DBGetContactSettingByte(NULL, "WorldTime", "EnableTimeFormat", 0) == 1); @@ -208,7 +206,7 @@ static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA add_edit_item.hContact = 0; if(DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hwndDlg, DlgProcOptsEdit) == IDOK) { - temp_listbox_items.push_back(add_edit_item); + temp_listbox_items.insert(new LISTITEM(add_edit_item)); hw = GetDlgItem(hwndDlg, IDC_LIST_TIMES2); sel = SendMessage(hw, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)add_edit_item.pszText); @@ -229,12 +227,7 @@ static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA if(sel != LB_ERR) { SendMessage(hw, LB_DELETESTRING, (WPARAM)sel, 0); - { - ITEMLIST::iterator i = temp_listbox_items.begin(); - for(int j = 0; j < sel; j++) - i++; - temp_listbox_items.erase(i); - } + temp_listbox_items.remove(sel); hw = GetDlgItem(hwndDlg, IDC_BTN_REM); EnableWindow(hw, FALSE); @@ -277,10 +270,9 @@ static INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA DBWriteContactSettingString(NULL, "WorldTime", "CListFormat", buf); strncpy(clist_format_string, buf, 512); - listbox_items = temp_listbox_items; + copy_listbox_items(listbox_items, temp_listbox_items); save_listbox_items(); - temp_listbox_items = listbox_items; // copy back new hContact values - + copy_listbox_items(temp_listbox_items, listbox_items); // copy back new hContact values return TRUE; } break; diff --git a/worldtime_protocol/time_display.cpp b/worldtime_protocol/time_display.cpp index 2e179ee..f49cde7 100644 --- a/worldtime_protocol/time_display.cpp +++ b/worldtime_protocol/time_display.cpp @@ -204,16 +204,39 @@ void time_windows_cleanup() { void time_windows_init() { LoadFonts(); - char *proto; HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); while ( hContact != NULL ) { - proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); - if (proto && lstrcmp( PROTO, proto) == 0) { - if(DBGetContactSettingByte(hContact, PROTO, "WindowWasOpen", 0) != 0) { + char* proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (proto && lstrcmp( PROTO, proto) == 0) + { + if (DBGetContactSettingByte(hContact, PROTO, "WindowWasOpen", 0) != 0) + { show_time(hContact); DBWriteContactSettingByte(hContact, PROTO, "WindowWasOpen", 0); } + + DBVARIANT dbv; + if (!DBGetContactSetting(hContact, PROTO, "TZName", &dbv)) + { + int list_index = DBGetContactSettingDword(hContact, PROTO, "TimezoneListIndex", -1); + if (list_index < 0 || list_index >= timezone_list.getCount()) + list_index = 0; + + if (strcmp(timezone_list[list_index].tcName, dbv.pszVal)) + { + for (int j = 0; j < timezone_list.getCount(); ++j) + { + if (!strcmp(timezone_list[j].tcName, dbv.pszVal)) + { + list_index = j; + break; + } + } + DBWriteContactSettingDword(hContact, PROTO, "TimezoneListIndex", list_index); + } + DBFreeVariant(&dbv); + } } hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); diff --git a/worldtime_protocol/time_display.h b/worldtime_protocol/time_display.h index f671065..63c6671 100644 --- a/worldtime_protocol/time_display.h +++ b/worldtime_protocol/time_display.h @@ -1,7 +1,6 @@ #ifndef _TIME_DISPLAY_INC #define _TIME_DISPLAY_INC -#include #include "resource.h" #include "timezone_list.h" diff --git a/worldtime_protocol/timezone.cpp b/worldtime_protocol/timezone.cpp index 5b2c31b..41a84c0 100644 --- a/worldtime_protocol/timezone.cpp +++ b/worldtime_protocol/timezone.cpp @@ -1,11 +1,11 @@ #include "common.h" #include "timezone.h" -TimeList timezone_list, geo_timezone_list; +TimeList timezone_list(10), geo_timezone_list(10, LS_TZREG::compare); -bool LS_TZREG::operator<(const LS_TZREG &other) { +int LS_TZREG::compare(const LS_TZREG *p1, const LS_TZREG *p2) { //return Index < other.Index; - return TZI.Bias < other.TZI.Bias; + return p1->TZI.Bias - p2->TZI.Bias; } bool build_timezone_list() { @@ -53,7 +53,8 @@ bool build_timezone_list() { RegCloseKey(KKtz); Temp.list_index = dwIndex; - timezone_list.push_back(Temp); + timezone_list.insert(new LS_TZREG(Temp)); + geo_timezone_list.insert(new LS_TZREG(Temp)); dwcbName = MAX_SIZE; dwIndex++; @@ -61,9 +62,6 @@ bool build_timezone_list() { RegCloseKey(HKlmtz); - geo_timezone_list = timezone_list; - std::sort(geo_timezone_list.begin(), geo_timezone_list.end()); - return true; } diff --git a/worldtime_protocol/timezone.h b/worldtime_protocol/timezone.h index ddb9a52..ba0f878 100644 --- a/worldtime_protocol/timezone.h +++ b/worldtime_protocol/timezone.h @@ -6,13 +6,12 @@ //#define TZREG2 "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation" #define MAX_SIZE 512 -#include -#include +#include "common.h" struct REG_TZI { - DWORD Bias; - DWORD StandardBias; - DWORD DaylightBias; + LONG Bias; + LONG StandardBias; + LONG DaylightBias; SYSTEMTIME StandardDate; SYSTEMTIME DaylightDate; }; @@ -31,10 +30,10 @@ struct LS_TZREG { unsigned int list_index; - bool operator<(const LS_TZREG &other); + static int compare(const LS_TZREG *p1, const LS_TZREG *p2); }; -typedef std::vector< LS_TZREG > TimeList; +typedef OBJLIST< LS_TZREG > TimeList; extern TimeList timezone_list, geo_timezone_list; bool build_timezone_list(); diff --git a/worldtime_protocol/timezone_list.cpp b/worldtime_protocol/timezone_list.cpp index d70455e..2e28bc1 100644 --- a/worldtime_protocol/timezone_list.cpp +++ b/worldtime_protocol/timezone_list.cpp @@ -1,9 +1,7 @@ #include "common.h" #include "timezone_list.h" -#include - -ITEMLIST listbox_items; +ITEMLIST listbox_items(5); void load_listbox_items() { @@ -12,15 +10,15 @@ void load_listbox_items() { DBVARIANT dbv; char *proto; - listbox_items.clear(); + listbox_items.destroy(); while ( hContact != NULL ) { proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); if ( proto && !lstrcmp( PROTO, proto)) { pa.hContact = hContact; if(!DBGetContactSetting(pa.hContact, PROTO, "TZName", &dbv)) { - for(TimeList::iterator j = timezone_list.begin(); j != timezone_list.end(); j++) { - if(!strcmp(j->tcName, dbv.pszVal)) { - pa.timezone_list_index = j->list_index; + for (int j = 0; j < timezone_list.getCount(); ++j) { + if(!strcmp(timezone_list[j].tcName, dbv.pszVal)) { + pa.timezone_list_index = timezone_list[j].list_index; break; } } @@ -32,7 +30,7 @@ void load_listbox_items() { DBFreeVariant(&dbv); } - listbox_items.push_back(pa); + listbox_items.insert(new LISTITEM(pa)); } hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); @@ -43,19 +41,19 @@ void save_listbox_items() { bool is_contact; - for(ITEMLIST::iterator i = listbox_items.begin(); i != listbox_items.end(); i++) { - is_contact = (int)CallService(MS_DB_CONTACT_IS, (WPARAM)i->hContact, 0) == 1; + for(int i = 0; i < listbox_items.getCount(); ++i) { + is_contact = (int)CallService(MS_DB_CONTACT_IS, (WPARAM)listbox_items[i].hContact, 0) == 1; if(!is_contact) { - i->hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); - CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )i->hContact, ( LPARAM )PROTO ); - CallService(MS_IGNORE_IGNORE, (WPARAM)i->hContact, (WPARAM)IGNOREEVENT_USERONLINE); + listbox_items[i].hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); + CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )listbox_items[i].hContact, ( LPARAM )PROTO ); + CallService(MS_IGNORE_IGNORE, (WPARAM)listbox_items[i].hContact, (WPARAM)IGNOREEVENT_USERONLINE); } - DBWriteContactSettingString(i->hContact, PROTO, "Nick", i->pszText); - DBWriteContactSettingDword(i->hContact, PROTO, "TimezoneListIndex", i->timezone_list_index); - DBWriteContactSettingWord(i->hContact, PROTO, "Status", ID_STATUS_ONLINE); - DBWriteContactSettingString(i->hContact, PROTO, "TZName", timezone_list[i->timezone_list_index].tcName); + DBWriteContactSettingString(listbox_items[i].hContact, PROTO, "Nick", listbox_items[i].pszText); + DBWriteContactSettingDword(listbox_items[i].hContact, PROTO, "TimezoneListIndex", listbox_items[i].timezone_list_index); + DBWriteContactSettingWord(listbox_items[i].hContact, PROTO, "Status", ID_STATUS_ONLINE); + DBWriteContactSettingString(listbox_items[i].hContact, PROTO, "TZName", timezone_list[listbox_items[i].timezone_list_index].tcName); } DBWriteContactSettingWord(0, PROTO, "DataVersion", 1); @@ -67,8 +65,8 @@ void save_listbox_items() { proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); if ( proto && !lstrcmp( PROTO, proto)) { found = false; - for(ITEMLIST::iterator i = listbox_items.begin(); i != listbox_items.end(); i++) { - if(i->hContact == hContact) { + for(int i = 0; i < listbox_items.getCount(); i++) { + if(listbox_items[i].hContact == hContact) { found = true; } } @@ -87,6 +85,11 @@ void save_listbox_items() { } } - +void copy_listbox_items(ITEMLIST &dest, ITEMLIST &src) +{ + dest.destroy(); + for (int i=0; i < src.getCount(); ++i) + dest.insert(new LISTITEM(src[i])); +} diff --git a/worldtime_protocol/timezone_list.h b/worldtime_protocol/timezone_list.h index 27168d3..e497e2b 100644 --- a/worldtime_protocol/timezone_list.h +++ b/worldtime_protocol/timezone_list.h @@ -13,12 +13,12 @@ typedef struct tagLISTITEM { int timezone_list_index; } LISTITEM; -#include -typedef std::vector ITEMLIST; +typedef OBJLIST ITEMLIST; extern ITEMLIST listbox_items; void load_listbox_items(); void save_listbox_items(); +void copy_listbox_items(ITEMLIST &dest, ITEMLIST &src); #endif diff --git a/worldtime_protocol/worldtimeproto.cpp b/worldtime_protocol/worldtimeproto.cpp index 88bca3a..2c06f53 100644 --- a/worldtime_protocol/worldtimeproto.cpp +++ b/worldtime_protocol/worldtimeproto.cpp @@ -7,6 +7,9 @@ PLUGINLINK *pluginLink; HANDLE hContactDblClick = 0; HANDLE hMenuEdit; +MM_INTERFACE mmi; +LIST_INTERFACE li; + int previousMode, mcStatus = ID_STATUS_OFFLINE; @@ -29,6 +32,9 @@ INT_PTR GetCaps(WPARAM wParam,LPARAM lParam) break; case PFLAGNUM_4: break; + case PFLAGNUM_5: + ret = PF2_ONLINE | PF2_LONGAWAY; + break; case PFLAG_UNIQUEIDTEXT: ret = (INT_PTR) Translate(PROTO); break; @@ -112,7 +118,7 @@ INT_PTR GetStatus(WPARAM wParam,LPARAM lParam) PLUGININFOEX pluginInfo={ sizeof(PLUGININFOEX), "World Time Protocol", - PLUGIN_MAKE_VERSION(0, 1, 1, 0), + PLUGIN_MAKE_VERSION(0, 1, 2, 0), "Adds 'contacts' showing the time at specified locations around the world.", "Scott Ellis", "mail@scottellis.com.au", @@ -237,20 +243,32 @@ void DestroyServiceFunctions() { DestroyServiceFunction(hServices[i]); } + +void replaceStr(TCHAR* str, size_t nchar, TCHAR* rstr) +{ + size_t lenr = _tcslen(rstr) * sizeof(TCHAR); + size_t lenNew = (_tcslen(str) - nchar + 1) * sizeof(TCHAR) + lenr; + + nchar *= sizeof(TCHAR); + + memmove(str + lenr, str + nchar, lenNew - lenr); + memcpy(str, rstr, lenr); +} + + + VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { SYSTEMTIME st, other_st; TCHAR date_buf[512], time_buf[512]; - std::string buf; MyGetSystemTime(&st); - TIME_ZONE_INFORMATION here_tzi, tzi; + TIME_ZONE_INFORMATION here_tzi = {0}, tzi = {0}; LISTITEM pa; DBVARIANT dbv; WORD status; char *proto; - BOOL daylight_here = (GetTimeZoneInformation(&here_tzi) == TIME_ZONE_ID_DAYLIGHT); HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); @@ -281,20 +299,23 @@ VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { GetDateFormat(LOCALE_USER_DEFAULT, 0, &other_st, 0, date_buf, 512); } - std::string::size_type pos; - buf = clist_format_string; - pos = buf.find ("%n"); - if(pos != std::string::npos) - buf.replace(pos, 2, pa.pszText); - pos = buf.find ("%t"); - if(pos != std::string::npos) - buf.replace(pos, 2, time_buf); - pos = buf.find ("%d"); - if(pos != std::string::npos) - buf.replace(pos, 2, date_buf); - - pos = buf.find ("%o"); - if(pos != std::string::npos) { + + TCHAR buf[1024]; + TCHAR* pos; + _tcscpy(buf, clist_format_string); + pos = strstr(buf, "%n"); + if (pos != NULL) + replaceStr(pos, 2, pa.pszText); + pos = strstr(buf, "%t"); + if (pos != NULL) + replaceStr(pos, 2, time_buf); + pos = strstr(buf, "%d"); + if (pos != NULL) + replaceStr(pos, 2, date_buf); + + pos = strstr(buf, "%o"); + if(pos != NULL) + { int other_offset, offset; if(tzi.StandardDate.wMonth) { @@ -329,16 +350,16 @@ VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { //if(offset < -12 * 60) offset += 24 * 60; mir_snprintf(temp_buf, sizeof(temp_buf), "%+g", offset/60.0); - buf.replace(pos, 2, temp_buf); + replaceStr(pos, 2, temp_buf); } if(!DBGetContactSetting(pa.hContact, "CList", "MyHandle", &dbv)) { // only write if times are different - if(strcmp(dbv.pszVal, buf.c_str())) - DBWriteContactSettingString(pa.hContact, "CList", "MyHandle", buf.c_str()); + if(strcmp(dbv.pszVal, buf)) + DBWriteContactSettingString(pa.hContact, "CList", "MyHandle", buf); DBFreeVariant(&dbv); } else - DBWriteContactSettingString(pa.hContact, "CList", "MyHandle", buf.c_str()); + DBWriteContactSettingString(pa.hContact, "CList", "MyHandle", buf); if(!DBGetContactSetting(pa.hContact, PROTO, "FirstName", &dbv)) { // only write if times are different @@ -435,7 +456,7 @@ int OnModulesLoaded(WPARAM wParam, LPARAM lParam) { menu.cbSize=sizeof(menu); menu.flags = CMIM_ALL; - menu.hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_PROTO)); + menu.hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_PROTO), IMAGE_ICON, 0, 0, 0); menu.position = -200000; menu.pszName = (char *)Translate("Edit..."); @@ -443,6 +464,7 @@ int OnModulesLoaded(WPARAM wParam, LPARAM lParam) { menu.pszContactOwner = PROTO; hMenuEdit = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&menu); + DestroyIcon(menu.hIcon); } build_timezone_list(); @@ -458,6 +480,9 @@ extern "C" WORLDTIMEPROTO_API int Load(PLUGINLINK *link) { pluginLink=link; + mir_getMMI(&mmi); + mir_getLI(&li); + previousMode = mcStatus = ID_STATUS_OFFLINE; PROTOCOLDESCRIPTOR pd = {0}; diff --git a/worldtime_protocol/worldtimeproto.h b/worldtime_protocol/worldtimeproto.h index 61a4036..bab1154 100644 --- a/worldtime_protocol/worldtimeproto.h +++ b/worldtime_protocol/worldtimeproto.h @@ -29,8 +29,6 @@ http://miranda-icq.sourceforge.net/ #include "timezone_list.h" #include "time_display.h" -#include - // globals extern PLUGINLINK *pluginLink; extern PLUGININFOEX pluginInfo; -- cgit v1.2.3