From b0fe8b53b67d97a839e3e518882f0c8e839ffd9e Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 17 Oct 2007 01:13:54 +0000 Subject: use 'GetActive', bug fixes for TempDefault db datatype git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@369 4f64403b-2f21-0410-a795-97e2b3489a10 --- meta2/proto.cpp | 101 ++++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 55 deletions(-) (limited to 'meta2/proto.cpp') diff --git a/meta2/proto.cpp b/meta2/proto.cpp index e42b598..ad6571c 100644 --- a/meta2/proto.cpp +++ b/meta2/proto.cpp @@ -91,7 +91,7 @@ int LoadIcon(WPARAM wParam,LPARAM lParam) { int ProtoGetInfo(WPARAM wParam,LPARAM lParam) { CCSDATA *ccs = ( CCSDATA* )lParam; - ccs->hContact = Meta_GetMostOnline(ccs->hContact); + ccs->hContact = Meta_GetActive(ccs->hContact); char *proto = ContactProto(ccs->hContact); if(!proto) return 1; @@ -204,7 +204,7 @@ int ProtoRecvMessage(WPARAM wParam, LPARAM lParam) { PROTORECVEVENT *pre = (PROTORECVEVENT *) ccs->lParam; // use the subcontact's protocol to add to the db (AIMOSCAR removes HTML here!) - HANDLE most_online = Meta_GetMostOnline(ccs->hContact); + HANDLE most_online = Meta_GetActive(ccs->hContact); char *proto = ContactProto(most_online); if(proto) { char service[256]; @@ -322,7 +322,7 @@ int EventContactIsTyping(WPARAM wParam, LPARAM lParam) { int SendNudge(WPARAM wParam,LPARAM lParam) { HANDLE hMeta = (HANDLE)wParam, - hSubContact = Meta_GetMostOnline(hMeta); + hSubContact = Meta_GetActive(hMeta); char servicefunction[256]; char *protoName = ContactProto(hSubContact); @@ -407,69 +407,61 @@ void RegisterProto() { CallService(MS_PROTO_REGISTERMODULE,0,(LPARAM)&pd); } -// redirect events to subcontact (except the ones we add in the EventAdded handler below - i.e. dbei->szModule == META_COPY_MODULE) +// redirect events - works if the contact is both a sub and a meta :) +#define DBEF_META 0x2000 int EventFilterAdd(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; DBEVENTINFO *dbei = (DBEVENTINFO *)lParam; - if(IsMetacontact(hContact) && strcmp(dbei->szModule, MODULE) == 0) { - // add the event to the subcontact instead - HANDLE most_online = Meta_GetMostOnline(hContact); - dbei->szModule = ContactProto(most_online); - if(dbei->eventType == EVENTTYPE_MESSAGE && !(dbei->flags & DBEF_SENT) && MetaEnabled() && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) - dbei->flags |= DBEF_READ; - CallService(MS_DB_EVENT_ADD, (WPARAM)most_online, (LPARAM)dbei); - return 1; // don't add original event - } - return 0; -} + // prevent recursion + if(dbei->flags & DBEF_META) return 0; + dbei->flags |= DBEF_META; -int EventAdded(WPARAM wParam, LPARAM lParam) { - HANDLE hContact = (HANDLE)wParam, hMeta; - if((hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) { - HANDLE hDbEvent = (HANDLE)lParam; - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); - dbei.pBlob = (PBYTE)malloc(dbei.cbBlob); - if(CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei) == 0 && dbei.eventType < EVENTTYPE_ADDED || dbei.eventType == EVENTTYPE_STATUSCHANGE) { - DBEVENTINFO dbeiMeta = {0}; - dbeiMeta.cbSize = sizeof(dbeiMeta); - dbeiMeta = dbei; - - if(dbei.eventType == EVENTTYPE_MESSAGE) { - if(!(dbeiMeta.flags & DBEF_SENT)) { - if(MetaEnabled() == false - || (DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 1 - && DBGetContactSettingByte(hMeta, MODULE, "WindowOpen", 0) == 0)) - { - dbeiMeta.flags |= DBEF_READ; - } else { - DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hContact); - } - } - - // set default - int num = metaMap[hMeta].index_of(hContact); - if(num != -1 && num != DBGetContactSettingByte(hMeta, MODULE, "Default", -1)) - MetaAPI_SetDefaultContactNum((WPARAM)hMeta, (LPARAM)num); - - // set meta nick - char *proto = ContactProto(hContact); - DBVARIANT dbv; - if(proto && !DBGetContactSettingUTF8String(0, proto, "Nick", &dbv)) { - DBWriteContactSettingUTF8String(0, MODULE, "Nick", dbv.pszVal); - DBFreeVariant(&dbv); - } + HANDLE hMeta; + //events passed up to parent + while((hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) { + // subcontact event being added (e.g. by subcontact proto) - add to meta + CallService(MS_DB_EVENT_ADD, (WPARAM)hMeta, (LPARAM)dbei); + + if(dbei->eventType == EVENTTYPE_MESSAGE) { + // set default + int num = metaMap[hMeta].index_of(hContact); + if(num != -1 && num != DBGetContactSettingByte(hMeta, MODULE, "Default", -1)) + MetaAPI_SetDefaultContactNum((WPARAM)hMeta, (LPARAM)num); + + // set meta nick + char *proto = ContactProto(hContact); + DBVARIANT dbv; + if(proto && !DBGetContactSettingUTF8String(0, proto, "Nick", &dbv)) { + DBWriteContactSettingUTF8String(0, MODULE, "Nick", dbv.pszVal); + DBFreeVariant(&dbv); } - CallService(MS_DB_EVENT_ADD, (WPARAM)hMeta, (LPARAM)&dbeiMeta); + + // set temp default + DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hContact); } + + // mark as read if subcontact window not open + if((dbei->flags & DBEF_READ) == 0 && (dbei->flags & DBEF_SENT) == 0 && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) { + dbei->flags |= DBEF_READ; + } + + hContact = hMeta; + } + + // events passed down to children + hContact = (HANDLE)wParam; // reset to the source event's contact + HANDLE hSub; + while((hSub = Meta_GetActive(hContact)) != 0) { + CallService(MS_DB_EVENT_ADD, (WPARAM)hSub, (LPARAM)dbei); + hContact = hSub; } + // let original event through return 0; } -#define NUM_HOOKS_INTERNAL 11 +#define NUM_HOOKS_INTERNAL 10 int hookIndex = 0; HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0}; @@ -481,7 +473,6 @@ int ModulesLoadedProto(WPARAM wParam, LPARAM lParam) { // hooked here so we get it later (than e.g. OTR) hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_DB_EVENT_FILTER_ADD, EventFilterAdd); - hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_DB_EVENT_ADDED, EventAdded); return 0; } -- cgit v1.2.3