summaryrefslogtreecommitdiff
path: root/meta2/proto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'meta2/proto.cpp')
-rw-r--r--meta2/proto.cpp58
1 files changed, 33 insertions, 25 deletions
diff --git a/meta2/proto.cpp b/meta2/proto.cpp
index e8c460e..e42b598 100644
--- a/meta2/proto.cpp
+++ b/meta2/proto.cpp
@@ -416,18 +416,28 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) {
// 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;
+}
- HANDLE hMeta;
+int EventAdded(WPARAM wParam, LPARAM lParam) {
+ HANDLE hContact = (HANDLE)wParam, hMeta;
if((hMeta = (HANDLE)DBGetContactSettingDword(hContact, MODULE, "Handle", 0)) != 0) {
- if(dbei->eventType < EVENTTYPE_ADDED || dbei->eventType == EVENTTYPE_STATUSCHANGE) {
+ 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;
+ dbeiMeta = dbei;
- if(dbei->eventType == EVENTTYPE_MESSAGE) {
+ if(dbei.eventType == EVENTTYPE_MESSAGE) {
if(!(dbeiMeta.flags & DBEF_SENT)) {
if(MetaEnabled() == false
|| (DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 1
@@ -437,9 +447,6 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) {
} else {
DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hContact);
}
- if(MetaEnabled() && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) {
- dbei->flags |= DBEF_READ;
- }
}
// set default
@@ -462,18 +469,24 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) {
return 0;
}
+#define NUM_HOOKS_INTERNAL 11
+int hookIndex = 0;
+HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0};
+
HANDLE hEventMessageWindow = 0;
int ModulesLoadedProto(WPARAM wParam, LPARAM lParam) {
- hEventMessageWindow = (HANDLE)HookEvent(ME_MSG_WINDOWEVENT, WindowEvent);
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MSG_WINDOWEVENT, WindowEvent);
Meta_Hide(DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 0);
+
+ // 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;
}
#define NUM_SERVICES 14
-HANDLE hServices[NUM_SERVICES] = {0}, hEventContactDeleted = 0, hEventSettingChanged = 0;
-#define NUM_HOOKS_INTERNAL 7
-HANDLE hHooksInternal[NUM_HOOKS_INTERNAL] = {0};
+HANDLE hServices[NUM_SERVICES] = {0};
void InitProto() {
RegisterProto();
@@ -503,23 +516,18 @@ void InitProto() {
hServices[i++] = CreateProtoServiceFunction(MODULE, "/SendNudge", SendNudge);
- hEventContactDeleted = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted);
- hEventSettingChanged = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingChanged);
-
- i = 0;
- hHooksInternal[i++] = (HANDLE)HookEvent(ME_MC_DEFAULTTCHANGED, MetaChanged );
- hHooksInternal[i++] = (HANDLE)HookEvent(ME_MC_FORCESEND, MetaChanged );
- 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_FILTER_ADD, EventFilterAdd);
- hHooksInternal[i++] = (HANDLE)HookEvent(ME_PROTO_CONTACTISTYPING, EventContactIsTyping);
+ hHooksInternal[hookIndex++] = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted);
+ hHooksInternal[hookIndex++] = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingChanged);
+
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_DEFAULTTCHANGED, MetaChanged );
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_FORCESEND, MetaChanged );
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_MC_UNFORCESEND, MetaChanged );
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_PROTO_ACK, RedirectACKs);
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoadedProto);
+ hHooksInternal[hookIndex++] = (HANDLE)HookEvent(ME_PROTO_CONTACTISTYPING, EventContactIsTyping);
}
void DeinitProto() {
- UnhookEvent(hEventMessageWindow);
- UnhookEvent(hEventSettingChanged);
- UnhookEvent(hEventContactDeleted);
for(int i = 0; i < NUM_SERVICES; i++)
DestroyServiceFunction(hServices[i]);
for(int i = 0; i < NUM_HOOKS_INTERNAL; i++)