From 6e7708ae1760c85840f2e30e9af7221d2b149905 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Wed, 28 Nov 2012 17:40:59 +0000 Subject: - Ping: folder rename git-svn-id: http://svn.miranda-ng.org/main/trunk@2541 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Ping/pinglist.cpp | 230 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 plugins/Ping/pinglist.cpp (limited to 'plugins/Ping/pinglist.cpp') diff --git a/plugins/Ping/pinglist.cpp b/plugins/Ping/pinglist.cpp new file mode 100644 index 0000000000..91d00f97af --- /dev/null +++ b/plugins/Ping/pinglist.cpp @@ -0,0 +1,230 @@ +#include "common.h" +#include "pinglist.h" + +#include "options.h" + +PINGLIST list_items; +CRITICAL_SECTION list_cs; +HANDLE reload_event_handle; + +DWORD NextID = 1; + +BOOL clist_handle_changing = FALSE; + +BOOL changing_clist_handle() { + return clist_handle_changing; +} + +void set_changing_clist_handle(BOOL flag) { + clist_handle_changing = flag; +} + +const bool PINGADDRESS::operator==(const PINGADDRESS &b) const { + return index == b.index; +} + +const bool PINGADDRESS::operator<(const PINGADDRESS &b) const { + return index < b.index; +} + +// lParam is address of pointer to a std::list +// copies data into this structure +INT_PTR GetPingList(WPARAM wParam,LPARAM lParam) +{ + PINGLIST *pa = (PINGLIST *)lParam; + + EnterCriticalSection(&list_cs); + *pa = list_items; + LeaveCriticalSection(&list_cs); + + return 0; +} + +INT_PTR GetListSize(WPARAM wParam, LPARAM lParam) { + INT_PTR ret = 0; + EnterCriticalSection(&list_cs); + ret = list_items.size(); + LeaveCriticalSection(&list_cs); + return ret; +} + +void write_ping_address(PINGADDRESS *i) { + char buff[16]; + sprintf(buff, "PING_DEST_%d", i->index); + + if(i->item_id == 0) { + i->item_id = NextID++; + DBWriteContactSettingDword(0, PLUG, "NextID", NextID); + } + + DBWriteContactSettingDword(0, buff, "Id", i->item_id); + DBWriteContactSettingString(0, buff, "Address", i->pszName); + DBWriteContactSettingString(0, buff, "Label", i->pszLabel); + DBWriteContactSettingWord(0, buff, "Status", i->status); + DBWriteContactSettingDword(0, buff, "Port", i->port); + DBWriteContactSettingString(0, buff, "Proto", i->pszProto); + if(strlen(i->pszCommand)) + DBWriteContactSettingString(0, buff, "Command", i->pszCommand); + else + DBDeleteContactSetting(0, buff, "Command"); + if(strlen(i->pszParams)) + DBWriteContactSettingString(0, buff, "CommandParams", i->pszParams); + else + DBDeleteContactSetting(0, buff, "CommandParams"); + DBWriteContactSettingWord(0, buff, "SetStatus", i->set_status); + DBWriteContactSettingWord(0, buff, "GetStatus", i->get_status); + DBWriteContactSettingWord(0, buff, "Index", i->index); +} + +// call with list_cs locked +void write_ping_addresses() { + int index = 0; + for(PINGLIST::Iterator i = list_items.start(); i.has_val(); i.next(), index++) { + i.val().index = index; + write_ping_address(&i.val()); + } + + // mark further destinations in the DB as invalid + char buff[16]; + bool found; + + do { + found = false; + sprintf(buff, "PING_DEST_%d", index++); + if(DBGetContactSettingDword(0, buff, "Id", 0) != 0) { + found = true; + DBWriteContactSettingDword(0, buff, "Id", 0); + } + } while(found); +} + +bool read_ping_address(PINGADDRESS &pa) { + int index = pa.index; + + char buff[16]; + sprintf(buff, "PING_DEST_%d", index); + + // return if not more contacts, or only deleted contacts remaining + if((pa.item_id = DBGetContactSettingDword(0, buff, "Id", 0)) == 0) return false; + + DBVARIANT dbv; + if(!DBGetContactSetting(0, buff, "Address", &dbv)) { + strncpy(pa.pszName, dbv.pszVal, MAX_PINGADDRESS_STRING_LENGTH); + DBFreeVariant(&dbv); + } else return false; + + if(!DBGetContactSetting(0, buff, "Label", &dbv)) { + strncpy(pa.pszLabel, dbv.pszVal, MAX_PINGADDRESS_STRING_LENGTH); + DBFreeVariant(&dbv); + } else return false; + + pa.status = DBGetContactSettingWord(0, buff, "Status", PS_NOTRESPONDING); + if(pa.status != PS_DISABLED) pa.status = PS_NOTRESPONDING; + + pa.port = (int)DBGetContactSettingDword(0, buff, "Port", -1); + + if(!DBGetContactSetting(0, buff, "Proto", &dbv)) { + strncpy(pa.pszProto, dbv.pszVal, MAX_PINGADDRESS_STRING_LENGTH); + DBFreeVariant(&dbv); + } else pa.pszProto[0] = '\0'; + + if(!DBGetContactSetting(0, buff, "Command", &dbv)) { + strncpy(pa.pszCommand, dbv.pszVal, MAX_PATH); + DBFreeVariant(&dbv); + } else + pa.pszCommand[0] = '\0'; + if(!DBGetContactSetting(0, buff, "CommandParams", &dbv)) { + strncpy(pa.pszParams, dbv.pszVal, MAX_PATH); + DBFreeVariant(&dbv); + } else + pa.pszParams[0] = '\0'; + + pa.set_status = DBGetContactSettingWord(0, buff, "SetStatus", ID_STATUS_ONLINE); + pa.get_status = DBGetContactSettingWord(0, buff, "GetStatus", ID_STATUS_OFFLINE); + + pa.responding = false; + pa.round_trip_time = 0; + pa.miss_count = 0; + pa.index = DBGetContactSettingWord(0, buff, "Index", 0); + + pa.index = index; + if(pa.item_id >= NextID) { + NextID = pa.item_id + 1; + DBWriteContactSettingDword(0, PLUG, "NextID", NextID); + } + + return true; +} + +// call with list_cs locked +void read_ping_addresses() { + PINGADDRESS pa; + + pa.index = 0; + + + list_items.clear(); + while(read_ping_address(pa)) { + list_items.add(pa); + pa.index++; + } +} + +INT_PTR LoadPingList(WPARAM wParam, LPARAM lParam) { + EnterCriticalSection(&list_cs); + read_ping_addresses(); + LeaveCriticalSection(&list_cs); + NotifyEventHooks(reload_event_handle, 0, 0); + return 0; +} + +// wParam is zero +// lParam is zero +INT_PTR SavePingList(WPARAM wParam, LPARAM lParam) { + EnterCriticalSection(&list_cs); + write_ping_addresses(); + LeaveCriticalSection(&list_cs); + //NotifyEventHooks(reload_event_handle, 0, 0); + + return 0; +} + +// wParam is address of a PINGLIST structure to replace the current one +// lParam is zero +INT_PTR SetPingList(WPARAM wParam, LPARAM lParam) { + PINGLIST *pli = (PINGLIST *)wParam; + + EnterCriticalSection(&list_cs); + list_items = *pli; + LeaveCriticalSection(&list_cs); + NotifyEventHooks(reload_event_handle, 0, 0); + + return 0; +} + +// wParam is address of a PINGLIST structure to replace the current one +// lParam is zero +INT_PTR SetAndSavePingList(WPARAM wParam, LPARAM lParam) { + PINGLIST *pli = (PINGLIST *)wParam; + + EnterCriticalSection(&list_cs); + + // set new list + list_items = *pli; + write_ping_addresses(); + LeaveCriticalSection(&list_cs); + + NotifyEventHooks(reload_event_handle, 0, 0); + + return 0; +} + +INT_PTR ClearPingList(WPARAM wParam, LPARAM lParam) { + EnterCriticalSection(&list_cs); + list_items.clear(); + LeaveCriticalSection(&list_cs); + + NotifyEventHooks(reload_event_handle, 0, 0); + return 0; +} + -- cgit v1.2.3