diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-03 08:03:17 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-03 08:03:17 +0000 |
commit | f99d18dd83625a753a7171e807b404345b11de4d (patch) | |
tree | 3e05a5a78611fb447951ed800355bd335c1b2b2c | |
parent | e52098965bc45872cff2d99147b0c27769c146f0 (diff) |
fix major bug in 'get most online supporting cap' function
notify of subcontact change on any subcontact status change
calculate subcontacts and meta status after modules loaded
use meta map for contact count
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@342 4f64403b-2f21-0410-a795-97e2b3489a10
-rw-r--r-- | meta2/api.cpp | 14 | ||||
-rw-r--r-- | meta2/common.h | 6 | ||||
-rw-r--r-- | meta2/core_functions.cpp | 32 | ||||
-rw-r--r-- | meta2/edit_meta.cpp | 4 | ||||
-rw-r--r-- | meta2/menu.cpp | 8 | ||||
-rw-r--r-- | meta2/meta2.cpp | 1 | ||||
-rw-r--r-- | meta2/priorities.h | 1 | ||||
-rw-r--r-- | meta2/proto.cpp | 102 | ||||
-rw-r--r-- | meta2/select_meta.cpp | 2 | ||||
-rw-r--r-- | meta2/version.h | 2 |
10 files changed, 84 insertions, 88 deletions
diff --git a/meta2/api.cpp b/meta2/api.cpp index 03e3c71..73f5adc 100644 --- a/meta2/api.cpp +++ b/meta2/api.cpp @@ -260,14 +260,18 @@ int ModulesLoadedAPI(WPARAM wParam, LPARAM lParam) { DBWriteContactSettingByte(hContact, MODULE, "IsSubcontact", 1);
} else
DBDeleteContactSetting(hContact, MODULE, "ParentMetaID");
- } else if(IsMetacontact(hContact)) {
- meta_count++;
- DBWriteContactSettingWord(hContact, MODULE, "Status", ID_STATUS_OFFLINE);
}
hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
}
+ hContact = (HANDLE)CallService( MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while(hContact != NULL) {
+ if(IsMetacontact(hContact))
+ Meta_CalcStatus(hContact);
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
+ }
+
return 0;
}
@@ -301,8 +305,8 @@ void InitAPI() { hEventUnforceSend = CreateHookableEvent(ME_MC_UNFORCESEND);
hSubcontactsChanged = CreateHookableEvent(ME_MC_SUBCONTACTSCHANGED);
- //hEventModulesLoadedAPI = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoadedAPI);
- ModulesLoadedAPI(0, 0);
+ hEventModulesLoadedAPI = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoadedAPI);
+ //ModulesLoadedAPI(0, 0);
}
void DeinitAPI() {
diff --git a/meta2/common.h b/meta2/common.h index 67f3a50..35a0aca 100644 --- a/meta2/common.h +++ b/meta2/common.h @@ -74,8 +74,6 @@ extern UTF8_INTERFACE utfi; extern HANDLE metaMainThread;
extern DWORD next_meta_id;
-extern int meta_count;
-
#ifndef MIID_META2
#define MIID_META2 { 0x4415A85D, 0xD6DA, 0x4551, { 0xB2, 0xB8, 0x9B, 0xDD, 0x82, 0xE2, 0x4B, 0x50 } }
#endif
@@ -98,6 +96,10 @@ inline char *ContactProto(HANDLE hContact) { return (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
}
+inline TCHAR *ContactName(HANDLE hContact) {
+ return (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR);
+}
+
inline WORD ContactStatus(HANDLE hContact, char *proto) {
if(!proto) return ID_STATUS_OFFLINE;
return DBGetContactSettingWord(hContact, proto, "Status", ID_STATUS_OFFLINE);
diff --git a/meta2/core_functions.cpp b/meta2/core_functions.cpp index aba22c0..748fddc 100644 --- a/meta2/core_functions.cpp +++ b/meta2/core_functions.cpp @@ -45,21 +45,33 @@ HANDLE Meta_GetMostOnlineSupporting(HANDLE hMeta, int flag, int cap) { HANDLE most_online = (HANDLE)MetaAPI_GetDefault((WPARAM)hMeta, 0);
char *most_online_proto = ContactProto(most_online);
- int most_online_status = ContactStatus(most_online, most_online_proto);
- int most_online_prio = GetRealPriority(most_online_proto, most_online_status);
+ int most_online_status = ID_STATUS_OFFLINE,
+ most_online_prio = MAX_PRIORITY;
+ if(most_online_proto) {
+ char szService[256];
+ mir_snprintf(szService, sizeof(szService), "%s%s", most_online_proto, PS_GETCAPS);
+ if(CallService(szService, (WPARAM)flag, (LPARAM)0) & cap) {
+ most_online_status = ContactStatus(most_online, most_online_proto);
+ most_online_prio = GetRealPriority(most_online_proto, most_online_status);
+ }
+ }
char *proto;
int status, prio;
SubcontactList::Iterator i = metaMap[hMeta].start();
while(i.has_val()) {
proto = ContactProto(i.val().handle());
- if(proto && (CallContactService(i.val().handle(), PS_GETCAPS, flag, 0) & cap)) {
- status = ContactStatus(i.val().handle(), proto);
- if((prio = GetRealPriority(proto, status)) < most_online_prio) {
- most_online_status = status;
- most_online = i.val().handle();
- most_online_proto = proto;
- most_online_prio = prio;
+ if(proto) {
+ char szService[256];
+ mir_snprintf(szService, sizeof(szService), "%s%s", proto, PS_GETCAPS);
+ if(CallService(szService, (WPARAM)flag, 0) & cap) {
+ status = ContactStatus(i.val().handle(), proto);
+ if((prio = GetRealPriority(proto, status)) < most_online_prio) {
+ most_online_status = status;
+ most_online = i.val().handle();
+ most_online_proto = proto;
+ most_online_prio = prio;
+ }
}
}
i.next();
@@ -72,6 +84,7 @@ void Meta_CalcStatus(HANDLE hMeta) { HANDLE hSub = Meta_GetMostOnline(hMeta);
char *proto = ContactProto(hSub);
DBWriteContactSettingWord(hMeta, MODULE, "Status", ContactStatus(hSub, proto));
+ FireSubcontactsChanged(hMeta);
}
HANDLE Meta_Convert(HANDLE hSub) {
@@ -128,6 +141,7 @@ void Meta_Remove(HANDLE hSub) { metaMap[hMeta].remove(hSub);
if(metaMap[hMeta].size() == 0) {
CallService(MS_DB_CONTACT_DELETE, (WPARAM)hMeta, 0);
+ metaMap.remove(hMeta);
} else {
int def = DBGetContactSettingByte(hMeta, MODULE, "Default", -1);
if(def < 0 || def >= metaMap[hMeta].size())
diff --git a/meta2/edit_meta.cpp b/meta2/edit_meta.cpp index a43bec1..983770d 100644 --- a/meta2/edit_meta.cpp +++ b/meta2/edit_meta.cpp @@ -65,7 +65,7 @@ void FillList(HWND hwndLst) { LvItem.iItem = row;
LvItem.iSubItem = 0; // clist display name
- LvItem.pszText = (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)i.val().handle(), GCDNF_TCHAR);
+ LvItem.pszText = ContactName(i.val().handle());
SendMessage(hwndLst, LVM_INSERTITEM, (WPARAM)0, (LPARAM)&LvItem);
proto = ContactProto(i.val().handle());
@@ -129,7 +129,7 @@ BOOL CALLBACK Meta_EditDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM TranslateDialogDefault( hwndDlg );
SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx(I_EDIT));
- SetDlgItemText(hwndDlg, IDC_ED_NAME, (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hMeta, GCDNF_TCHAR));
+ SetDlgItemText(hwndDlg, IDC_ED_NAME, ContactName(hMeta));
{
HWND hwndLst = GetDlgItem(hwndDlg, IDC_LST_CONTACTS);
diff --git a/meta2/menu.cpp b/meta2/menu.cpp index 68c3674..2ff4e62 100644 --- a/meta2/menu.cpp +++ b/meta2/menu.cpp @@ -37,7 +37,7 @@ int ContactMenuConvert(WPARAM wParam, LPARAM lParam) { int ContactMenuAdd(WPARAM wParam, LPARAM lParam) {
HANDLE hContact = (HANDLE)wParam;
TCHAR buff[256];
- mir_sntprintf(buff, 256, TranslateT("Adding %s..."), (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR));
+ mir_sntprintf(buff, 256, TranslateT("Adding %s..."), ContactName(hContact));
HANDLE hMeta = SelectMeta(buff);
if(hMeta)
Meta_Assign(hContact, hMeta);
@@ -133,7 +133,7 @@ int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) { SubcontactList::Iterator i = metaMap[hContact].start();
int count = 0;
while(i.has_val()) {
- mi.ptszName = (TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)i.val().handle(), GCDNF_TCHAR);
+ mi.ptszName = ContactName(i.val().handle());
mi.hIcon = ImageList_GetIcon(il, (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)i.val().handle(), 0), 0);
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuContact[count], (LPARAM)&mi);
@@ -158,10 +158,10 @@ int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) { } else {
mi.flags = CMIM_FLAGS;
- if(meta_count) CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuAdd, (LPARAM)&mi);
+ if(metaMap.size()) CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuAdd, (LPARAM)&mi);
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuConvert, (LPARAM)&mi);
mi.flags = CMIM_FLAGS | CMIF_HIDDEN;
- if(!meta_count) CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuAdd, (LPARAM)&mi);
+ if(!metaMap.size()) CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuAdd, (LPARAM)&mi);
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuRemove, (LPARAM)&mi);
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuDefault, (LPARAM)&mi);
}
diff --git a/meta2/meta2.cpp b/meta2/meta2.cpp index f5442cf..520183e 100644 --- a/meta2/meta2.cpp +++ b/meta2/meta2.cpp @@ -92,7 +92,6 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) { DBWriteContactSettingByte(0, MODULE, "FirstRun", 0);
}
-
return 0;
}
diff --git a/meta2/priorities.h b/meta2/priorities.h index 3036360..055fac6 100644 --- a/meta2/priorities.h +++ b/meta2/priorities.h @@ -1,5 +1,6 @@ +#define MAX_PRIORITY 0x7fffffff
int GetRealPriority(char *proto, int status);
void InitPriorities();
diff --git a/meta2/proto.cpp b/meta2/proto.cpp index 61ff69d..e0760b7 100644 --- a/meta2/proto.cpp +++ b/meta2/proto.cpp @@ -10,16 +10,13 @@ DWORD status = ID_STATUS_OFFLINE; DWORD setStatusTimerId = 0;
DWORD next_meta_id = 1;
-int meta_count = 0;
-// a 'fake' module name for copied subcontact events - used to prevent infinite recursion when creating event copies
-#define META_COPY_MODULE "MetaCopy"
+#define EVENTTYPE_STATUSCHANGE 25368
HANDLE NewMetaContact() {
HANDLE hMeta = (HANDLE) CallService(MS_DB_CONTACT_ADD, 0, 0);
DBWriteContactSettingDword(hMeta, MODULE, META_ID, next_meta_id++);
CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hMeta, ( LPARAM )MODULE);
- meta_count++;
return hMeta;
}
@@ -286,13 +283,12 @@ int ProtoFileSend(WPARAM wParam, LPARAM lParam) { // find the most online contact supporting file send, according to priorities
HANDLE most_online = (HANDLE)Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_1, PF1_FILESEND);
- char *most_online_proto = ContactProto(most_online);
+ TCHAR msg[1024], *proto;
+ mir_sntprintf(msg, 1024, _T("Diverting file send to subcontact: %s/%s"), ContactName(most_online), proto = mir_a2t(ContactProto(most_online)));
+ mir_free(proto);
+ PUShowMessageT(msg, SM_NOTIFY);
- ccs->hContact = most_online;
- char szServiceName[100];
- mir_snprintf(szServiceName, sizeof(szServiceName), "%s%s", most_online_proto, PSS_FILE);
- int result = CallService(szServiceName, wParam, lParam);
- ccs->hContact = hMeta;
+ int result = CallContactService(most_online, PSS_FILE, ccs->wParam, ccs->lParam);
if(result != CALLSERVICE_NOTFOUND) return result;
return 0; // fail
@@ -300,11 +296,13 @@ int ProtoFileSend(WPARAM wParam, LPARAM lParam) { int ProtoUserIsTyping(WPARAM wParam, LPARAM lParam) {
HANDLE hMeta = (HANDLE)wParam;
- // find the most online contact supporting file send, according to priorities
+ // find the most online contact supporting typing notifications, according to priorities
HANDLE most_online = (HANDLE)Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_4, PF4_SUPPORTTYPING);
char *most_online_proto = ContactProto(most_online);
- CallContactService(most_online, PSS_USERISTYPING, (WPARAM)most_online, lParam);
+ char szServiceName[256];
+ mir_snprintf(szServiceName, sizeof(szServiceName), "%s%s", most_online_proto, PSS_USERISTYPING);
+ CallService(szServiceName, (WPARAM)most_online, lParam);
return 0;
}
@@ -356,7 +354,6 @@ int ContactDeleted(WPARAM wParam, LPARAM lParam) { i.next();
}
metaMap.remove(hContact);
- meta_count--;
}
return 0;
}
@@ -419,62 +416,42 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) { CallService(MS_DB_EVENT_ADD, (WPARAM)most_online, (LPARAM)dbei);
return 1; // don't add original event
}
- if(IsSubcontact(hContact)) {
- if(dbei->eventType == EVENTTYPE_MESSAGE && !(dbei->flags & DBEF_SENT) && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) {
- dbei->flags |= DBEF_READ;
- }
- }
- return 0;
-}
-
-// add subcontact events to metacontacts
-int EventAdded(WPARAM wParam, LPARAM lParam) {
- HANDLE hContact = (HANDLE)wParam,
- hDbEvent = (HANDLE)lParam,
- hMeta;
-
- if(MetaEnabled() && (hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) {
- DBEVENTINFO dbei = {0};
- dbei.cbSize = sizeof(dbei);
- dbei.cbBlob = (int)CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0);
- dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob);
- if(CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei) == 0) {
- if(dbei.eventType < EVENTTYPE_ADDED) {
- DBEVENTINFO dbeiMeta = {0};
- dbeiMeta.cbSize = sizeof(dbeiMeta);
- dbeiMeta.eventType = dbei.eventType;
- dbeiMeta.flags = dbei.flags & ~DBEF_READ;
- dbeiMeta.cbBlob = dbei.cbBlob;
- dbeiMeta.pBlob = dbei.pBlob;
- dbeiMeta.szModule = dbei.szModule;
- dbeiMeta.timestamp = dbei.timestamp;
-
- if(dbei.eventType == EVENTTYPE_MESSAGE) {
- if(!(dbeiMeta.flags & DBEF_SENT)
- && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 1
- && DBGetContactSettingByte(hMeta, MODULE, "WindowOpen", 0) == 0)
+ HANDLE hMeta;
+ if((hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) {
+ if(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;
}
-
- // 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);
+ if(MetaEnabled() && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) {
+ dbei->flags |= DBEF_READ;
}
}
- CallService(MS_DB_EVENT_ADD, (WPARAM)hMeta, (LPARAM)&dbeiMeta);
+
+ // 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);
}
- mir_free(dbei.pBlob);
}
return 0;
@@ -490,7 +467,7 @@ int ModulesLoadedProto(WPARAM wParam, LPARAM lParam) { #define NUM_SERVICES 14
HANDLE hServices[NUM_SERVICES] = {0}, hEventContactDeleted = 0, hEventSettingChanged = 0;
-#define NUM_HOOKS_INTERNAL 8
+#define NUM_HOOKS_INTERNAL 7
HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0};
void InitProto() {
@@ -530,7 +507,6 @@ void InitProto() { 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_ADDED, EventAdded);
hHooksInternal[i++] = (HANDLE)HookEvent(ME_DB_EVENT_FILTER_ADD, EventFilterAdd);
hHooksInternal[i++] = (HANDLE)HookEvent(ME_PROTO_CONTACTISTYPING, EventContactIsTyping);
}
diff --git a/meta2/select_meta.cpp b/meta2/select_meta.cpp index 74df9c5..0e71cb1 100644 --- a/meta2/select_meta.cpp +++ b/meta2/select_meta.cpp @@ -17,7 +17,7 @@ void FillList(HWND list, bool sort) }
// get contact display name from clist
- TCHAR *szCDN = (TCHAR *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR);
+ TCHAR *szCDN = ContactName(hContact);
int index;
if(sort) {
int j;
diff --git a/meta2/version.h b/meta2/version.h index 380985b..7e87bdd 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 2
+#define __BUILD_NUM 4
#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM
#define __FILEVERSION_STRING_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM
|