diff options
Diffstat (limited to 'meta2/proto.cpp')
-rw-r--r-- | meta2/proto.cpp | 102 |
1 files changed, 39 insertions, 63 deletions
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);
}
|