summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2007-10-17 01:13:54 +0000
committersje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2007-10-17 01:13:54 +0000
commitb0fe8b53b67d97a839e3e518882f0c8e839ffd9e (patch)
treedd741355bd736b14931a5bd878b5bd8d9517b8fd
parentad7c1f95b18a323357ad02cff8609ba55a72d3e3 (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
-rw-r--r--meta2/api.cpp19
-rw-r--r--meta2/core_functions.cpp19
-rw-r--r--meta2/core_functions.h1
-rw-r--r--meta2/menu.cpp2
-rw-r--r--meta2/proto.cpp101
-rw-r--r--meta2/settings.cpp8
-rw-r--r--meta2/version.h2
7 files changed, 76 insertions, 76 deletions
diff --git a/meta2/api.cpp b/meta2/api.cpp
index 281f671..6988215 100644
--- a/meta2/api.cpp
+++ b/meta2/api.cpp
@@ -59,20 +59,7 @@ int MetaAPI_GetMostOnline(WPARAM wParam, LPARAM lParam) {
//returns a handle to the 'most online' contact
//added with meta2 (2007/10/4)
int MetaAPI_GetActiveContact(WPARAM wParam, LPARAM lParam) {
- HANDLE hMeta = (HANDLE)wParam, hActive = 0;
- if(DBGetContactSettingByte(hMeta, MODULE, "ForceDefault", 0))
- hActive = (HANDLE)MetaAPI_GetDefault((WPARAM)hMeta, 0);
- if(!hActive) {
- if((hActive = (HANDLE)DBGetContactSettingDword(hMeta, MODULE, "ForceSend", 0)) == 0) {
- if((hActive = (HANDLE)DBGetContactSettingDword(hMeta, MODULE, "TempDefault", 0)) == 0) {
- hActive = Meta_GetMostOnline(hMeta);
- if(ContactStatus(hActive, ContactProto(hActive)) == ID_STATUS_OFFLINE) {
- hActive = Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_4, PF4_IMSENDOFFLINE);
- }
- }
- }
- }
- return (int)hActive;
+ return (int)Meta_GetActive((HANDLE)wParam);
}
//gets the number of subcontacts for a metacontact
@@ -109,7 +96,7 @@ int MetaAPI_SetDefaultContactNum(WPARAM wParam, LPARAM lParam) {
if(DBWriteContactSettingByte((HANDLE)wParam, MODULE, "Default", (DWORD)lParam))
return 1;
- DBWriteContactSettingByte(hMeta, MODULE, "TempDefault", 0);
+ DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", 0);
NotifyEventHooks(hEventDefaultChanged, wParam, (LPARAM)metaMap[hMeta][(int)lParam].handle());
return 0;
@@ -131,7 +118,7 @@ int MetaAPI_SetDefaultContact(WPARAM wParam, LPARAM lParam) {
if(DBWriteContactSettingByte(hMeta, MODULE, "Default", contact_num))
return 1;
- DBWriteContactSettingByte(hMeta, MODULE, "TempDefault", 0);
+ DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", 0);
NotifyEventHooks(hEventDefaultChanged, wParam, lParam);
return 0;
diff --git a/meta2/core_functions.cpp b/meta2/core_functions.cpp
index 6715c8e..8b27bbf 100644
--- a/meta2/core_functions.cpp
+++ b/meta2/core_functions.cpp
@@ -36,6 +36,23 @@ void Meta_Hide(bool hide) {
}
}
+HANDLE Meta_GetActive(HANDLE hMeta) {
+ HANDLE hActive = 0;
+ if(DBGetContactSettingByte(hMeta, MODULE, "ForceDefault", 0))
+ hActive = (HANDLE)MetaAPI_GetDefault((WPARAM)hMeta, 0);
+ if(!hActive) {
+ if((hActive = (HANDLE)DBGetContactSettingDword(hMeta, MODULE, "ForceSend", 0)) == 0) {
+ if((hActive = (HANDLE)DBGetContactSettingDword(hMeta, MODULE, "TempDefault", 0)) == 0) {
+ hActive = Meta_GetMostOnline(hMeta);
+ if(ContactStatus(hActive, ContactProto(hActive)) == ID_STATUS_OFFLINE) {
+ hActive = Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_4, PF4_IMSENDOFFLINE);
+ }
+ }
+ }
+ }
+ return hActive;
+}
+
HANDLE Meta_GetMostOnline(HANDLE hMeta) {
return Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_1, PF1_IM);
}
@@ -81,7 +98,7 @@ HANDLE Meta_GetMostOnlineSupporting(HANDLE hMeta, int flag, int cap) {
}
void Meta_CalcStatus(HANDLE hMeta) {
- HANDLE hSub = Meta_GetMostOnline(hMeta);
+ HANDLE hSub = Meta_GetActive(hMeta);
char *proto = ContactProto(hSub);
DBWriteContactSettingWord(hMeta, MODULE, "Status", ContactStatus(hSub, proto));
FireSubcontactsChanged(hMeta);
diff --git a/meta2/core_functions.h b/meta2/core_functions.h
index 8f6a6ee..f2cee0f 100644
--- a/meta2/core_functions.h
+++ b/meta2/core_functions.h
@@ -17,6 +17,7 @@ extern MetaMap metaMap;
HANDLE GetMetaHandle(DWORD id);
void Meta_Hide(bool hide);
+HANDLE Meta_GetActive(HANDLE hMeta);
HANDLE Meta_GetMostOnline(HANDLE hMeta);
HANDLE Meta_GetMostOnlineSupporting(HANDLE hMeta, int flag, int cap);
HANDLE Meta_Convert(HANDLE hSub);
diff --git a/meta2/menu.cpp b/meta2/menu.cpp
index ab4a46c..758f5dc 100644
--- a/meta2/menu.cpp
+++ b/meta2/menu.cpp
@@ -154,7 +154,7 @@ int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) {
#define MS_NUDGE_SHOWMENU "NudgeShowMenu"
{
char serviceFunc[256];
- hContact = Meta_GetMostOnline((HANDLE)wParam);
+ hContact = Meta_GetActive((HANDLE)wParam);
mir_snprintf(serviceFunc, 256, "%s/SendNudge", ContactProto(hContact));
CallService(MS_NUDGE_SHOWMENU, (WPARAM)MODULE, (LPARAM)ServiceExists(serviceFunc));
}
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;
}
diff --git a/meta2/settings.cpp b/meta2/settings.cpp
index 06c9b9f..b646d0b 100644
--- a/meta2/settings.cpp
+++ b/meta2/settings.cpp
@@ -23,7 +23,7 @@ int ServiceFuncRedirect(const char *service,WPARAM wParam, LPARAM lParam, Servic
if(strcmp(MS_DB_CONTACT_ENUMSETTINGS, service) == 0) {
DBCONTACTENUMSETTINGS *ces = (DBCONTACTENUMSETTINGS *)lParam;
if(IsMetacontact(hContact) && strcmp(ces->szModule, MODULE) != 0) {
- HANDLE hSub = Meta_GetMostOnline(hContact);
+ HANDLE hSub = Meta_GetActive(hContact);
return coreServiceFunc(service, (WPARAM)hSub, lParam);
} else
return coreServiceFunc(service, wParam, lParam);
@@ -53,6 +53,10 @@ int ServiceFuncRedirect(const char *service,WPARAM wParam, LPARAM lParam, Servic
|| strcmp(szSetting, "Handle") == 0
|| strcmp(szSetting, "WindowOpen") == 0
|| strcmp(szSetting, "ParentMetaID") == 0
+ || strcmp(szSetting, "Default") == 0
+ || strcmp(szSetting, "ForceDefault") == 0
+ || strcmp(szSetting, "ForceSend") == 0
+ || strcmp(szSetting, "TempDefault") == 0
|| strcmp(szSetting, "Status") == 0))
|| !IsMetacontact(hContact))
{
@@ -63,7 +67,7 @@ int ServiceFuncRedirect(const char *service,WPARAM wParam, LPARAM lParam, Servic
int ret;
if((ret = coreServiceFunc(service, (WPARAM)hMeta, lParam)) != 0) {
// if the setting does not exist in the metacontact, get it from the most online subcontact
- HANDLE hSub = Meta_GetMostOnline(hMeta);
+ HANDLE hSub = Meta_GetActive(hMeta);
if(!hSub) return ret; // no most online - fail
if((ret = coreServiceFunc(service, (WPARAM)hSub, lParam)) != 0) {
// if it does not exist in the subcontact and we're using the meta proto module, try changing the module to the subcontact proto module
diff --git a/meta2/version.h b/meta2/version.h
index a97bbbf..7caeead 100644
--- a/meta2/version.h
+++ b/meta2/version.h
@@ -5,7 +5,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 0
#define __RELEASE_NUM 0
-#define __BUILD_NUM 10
+#define __BUILD_NUM 13
#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM
#define __FILEVERSION_STRING_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM