From 2858844b5063f5f2a753f162d0fa475bae4a48b0 Mon Sep 17 00:00:00 2001 From: sje Date: Thu, 11 Oct 2007 08:34:15 +0000 Subject: only added meta events if the subcontact event is definately added (hook event added) git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@364 4f64403b-2f21-0410-a795-97e2b3489a10 --- meta2/proto.cpp | 58 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 25 deletions(-) (limited to 'meta2/proto.cpp') diff --git a/meta2/proto.cpp b/meta2/proto.cpp index e8c460e..e42b598 100644 --- a/meta2/proto.cpp +++ b/meta2/proto.cpp @@ -416,18 +416,28 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) { // 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; +} - HANDLE hMeta; +int EventAdded(WPARAM wParam, LPARAM lParam) { + HANDLE hContact = (HANDLE)wParam, hMeta; if((hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) { - if(dbei->eventType < EVENTTYPE_ADDED || dbei->eventType == EVENTTYPE_STATUSCHANGE) { + 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; + dbeiMeta = dbei; - if(dbei->eventType == EVENTTYPE_MESSAGE) { + if(dbei.eventType == EVENTTYPE_MESSAGE) { if(!(dbeiMeta.flags & DBEF_SENT)) { if(MetaEnabled() == false || (DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 1 @@ -437,9 +447,6 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) { } else { DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hContact); } - if(MetaEnabled() && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) { - dbei->flags |= DBEF_READ; - } } // set default @@ -462,18 +469,24 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) { return 0; } +#define NUM_HOOKS_INTERNAL 11 +int hookIndex = 0; +HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0}; + HANDLE hEventMessageWindow = 0; int ModulesLoadedProto(WPARAM wParam, LPARAM lParam) { - hEventMessageWindow = (HANDLE)HookEvent(ME_MSG_WINDOWEVENT, WindowEvent); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MSG_WINDOWEVENT, WindowEvent); Meta_Hide(DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 0); + + // 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; } #define NUM_SERVICES 14 -HANDLE hServices[NUM_SERVICES] = {0}, hEventContactDeleted = 0, hEventSettingChanged = 0; -#define NUM_HOOKS_INTERNAL 7 -HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0}; +HANDLE hServices[NUM_SERVICES] = {0}; void InitProto() { RegisterProto(); @@ -503,23 +516,18 @@ void InitProto() { hServices[i++] = CreateProtoServiceFunction(MODULE, "/SendNudge", SendNudge); - hEventContactDeleted = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted); - hEventSettingChanged = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingChanged); - - i = 0; - hHooksInternal[i++] = (HANDLE)HookEvent(ME_MC_DEFAULTTCHANGED, MetaChanged ); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_MC_FORCESEND, MetaChanged ); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_MC_UNFORCESEND, MetaChanged ); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_PROTO_ACK, RedirectACKs); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoadedProto); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_DB_EVENT_FILTER_ADD, EventFilterAdd); - hHooksInternal[i++] = (HANDLE)HookEvent(ME_PROTO_CONTACTISTYPING, EventContactIsTyping); + hHooksInternal[hookIndex++] = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted); + hHooksInternal[hookIndex++] = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingChanged); + + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_DEFAULTTCHANGED, MetaChanged ); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_FORCESEND, MetaChanged ); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_UNFORCESEND, MetaChanged ); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_PROTO_ACK, RedirectACKs); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoadedProto); + hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_PROTO_CONTACTISTYPING, EventContactIsTyping); } void DeinitProto() { - UnhookEvent(hEventMessageWindow); - UnhookEvent(hEventSettingChanged); - UnhookEvent(hEventContactDeleted); for(int i = 0; i < NUM_SERVICES; i++) DestroyServiceFunction(hServices[i]); for(int i = 0; i < NUM_HOOKS_INTERNAL; i++) -- cgit v1.2.3