summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meta2/api.cpp14
-rw-r--r--meta2/common.h6
-rw-r--r--meta2/core_functions.cpp32
-rw-r--r--meta2/edit_meta.cpp4
-rw-r--r--meta2/menu.cpp8
-rw-r--r--meta2/meta2.cpp1
-rw-r--r--meta2/priorities.h1
-rw-r--r--meta2/proto.cpp102
-rw-r--r--meta2/select_meta.cpp2
-rw-r--r--meta2/version.h2
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