diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-17 01:13:54 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-17 01:13:54 +0000 |
commit | b0fe8b53b67d97a839e3e518882f0c8e839ffd9e (patch) | |
tree | dd741355bd736b14931a5bd878b5bd8d9517b8fd /meta2/proto.cpp | |
parent | ad7c1f95b18a323357ad02cff8609ba55a72d3e3 (diff) |
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
Diffstat (limited to 'meta2/proto.cpp')
-rw-r--r-- | meta2/proto.cpp | 101 |
1 files changed, 46 insertions, 55 deletions
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;
}
|