summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meta2/api.cpp26
-rw-r--r--meta2/api.h1
-rw-r--r--meta2/proto.cpp32
-rw-r--r--meta2/resource.h11
4 files changed, 49 insertions, 21 deletions
diff --git a/meta2/api.cpp b/meta2/api.cpp
index 73f5adc..467a1e8 100644
--- a/meta2/api.cpp
+++ b/meta2/api.cpp
@@ -52,6 +52,29 @@ int MetaAPI_GetMostOnline(WPARAM wParam, LPARAM lParam) {
return (int)Meta_GetMostOnline((HANDLE)wParam);
}
+//gets the handle for the 'active' messaging contact (the one new messages will be sent to,
+//taking into account temporary conversation settings and 'force state' below)
+//wParam=(HANDLE)hMetaContact
+//lParam=0
+//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;
+}
+
//gets the number of subcontacts for a metacontact
//wParam=(HANDLE)hMetaContact
//lParam=0
@@ -275,7 +298,7 @@ int ModulesLoadedAPI(WPARAM wParam, LPARAM lParam) {
return 0;
}
-#define NUM_API_SERVICES 17
+#define NUM_API_SERVICES 18
HANDLE hServicesAPI[NUM_API_SERVICES] = {0};
HANDLE hEventModulesLoadedAPI = 0;
void InitAPI() {
@@ -284,6 +307,7 @@ void InitAPI() {
hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETDEFAULTCONTACT, MetaAPI_GetDefault);
hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETDEFAULTCONTACTNUM, MetaAPI_GetDefaultNum);
hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETMOSTONLINECONTACT, MetaAPI_GetMostOnline);
+ hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETACTIVECONTACT, MetaAPI_GetActiveContact);
hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETNUMCONTACTS, MetaAPI_GetNumContacts);
hServicesAPI[i++] = CreateServiceFunction(MS_MC_GETSUBCONTACT, MetaAPI_GetContact);
hServicesAPI[i++] = CreateServiceFunction(MS_MC_SETDEFAULTCONTACTNUM, MetaAPI_SetDefaultContactNum);
diff --git a/meta2/api.h b/meta2/api.h
index e1aa8f5..cfcf5e5 100644
--- a/meta2/api.h
+++ b/meta2/api.h
@@ -4,6 +4,7 @@ int MetaAPI_GetMeta(WPARAM wParam, LPARAM lParam);
int MetaAPI_GetDefault(WPARAM wParam, LPARAM lParam);
int MetaAPI_GetDefaultNum(WPARAM wParam, LPARAM lParam);
int MetaAPI_GetMostOnline(WPARAM wParam, LPARAM lParam);
+int MetaAPI_GetActiveContact(WPARAM wParam, LPARAM lParam);
int MetaAPI_GetNumContacts(WPARAM wParam, LPARAM lParam);
int MetaAPI_GetContact(WPARAM wParam, LPARAM lParam);
int MetaAPI_SetDefaultContactNum(WPARAM wParam, LPARAM lParam);
diff --git a/meta2/proto.cpp b/meta2/proto.cpp
index e507ca5..e8c460e 100644
--- a/meta2/proto.cpp
+++ b/meta2/proto.cpp
@@ -153,14 +153,12 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) {
CCSDATA *ccs = (CCSDATA *) lParam;
char *message = (char *)ccs->lParam;
int flags = ccs->wParam;
- char *buff = 0;
+ char *buff = 0, *proto = 0;
+ HANDLE hMeta = ccs->hContact;
- HANDLE most_online = Meta_GetMostOnline(ccs->hContact);
- char *proto = ContactProto(most_online);
- if(ContactStatus(most_online, proto) == ID_STATUS_OFFLINE) {
- most_online = Meta_GetMostOnlineSupporting(ccs->hContact, PFLAGNUM_4, PF4_IMSENDOFFLINE);
- proto = ContactProto(most_online);
- }
+ HANDLE hSendTo = (HANDLE)MetaAPI_GetActiveContact((WPARAM)hMeta, 0);
+ proto = ContactProto(hSendTo);
+ //DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hSendTo);
char szServiceName[256];
mir_snprintf(szServiceName, 256, "%s", PSS_MESSAGE);
@@ -171,7 +169,7 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) {
strncpy(szServiceName, PSS_MESSAGE "W", sizeof(szServiceName));
}
// subcontact does not support utf - convert to old ascii/wide format
- if((flags & PREF_UTF) && !(CallContactService(most_online, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_IMSENDUTF)) {
+ if((flags & PREF_UTF) && !(CallContactService(hSendTo, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_IMSENDUTF)) {
ccs->wParam &= ~PREF_UTF;
ccs->wParam |= PREF_UNICODE;
wchar_t *unicode = mir_utf8decodeW(message);
@@ -185,8 +183,8 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) {
ccs->lParam = (LPARAM)buff;
}
- int ret = (int)CallContactService(most_online, szServiceName, ccs->wParam, ccs->lParam);
- if(buff) {
+ int ret = (int)CallContactService(hSendTo, szServiceName, ccs->wParam, ccs->lParam);
+ if(buff) { // undo our utf8 conversion changes
ccs->lParam = (LPARAM)message;
delete[] buff;
}
@@ -383,13 +381,19 @@ int MetaChanged(WPARAM wParam, LPARAM lParam) {
int WindowEvent(WPARAM wParam, LPARAM lParam) {
MessageWindowEventData *mwed = (MessageWindowEventData *)lParam;
- if(IsMetacontact(mwed->hContact) || IsSubcontact(mwed->hContact)) {
+ bool sub = IsSubcontact(mwed->hContact), meta = IsMetacontact(mwed->hContact);
+ if(sub || meta) {
if(mwed->uType == MSG_WINDOW_EVT_OPEN || mwed->uType == MSG_WINDOW_EVT_OPENING) {
DBWriteContactSettingByte(mwed->hContact, MODULE, "WindowOpen", 1);
- if(IsMetacontact(mwed->hContact))
+ if(meta)
CallService(MS_CLIST_REMOVEEVENT, (WPARAM)mwed->hContact, (LPARAM)EVENTTYPE_MESSAGE);
- } else if(mwed->uType == MSG_WINDOW_EVT_CLOSE || mwed->uType == MSG_WINDOW_EVT_CLOSING)
+ } else if(mwed->uType == MSG_WINDOW_EVT_CLOSE || mwed->uType == MSG_WINDOW_EVT_CLOSING) {
DBWriteContactSettingByte(mwed->hContact, MODULE, "WindowOpen", 0);
+ if(meta) {
+ DBWriteContactSettingDword(mwed->hContact, MODULE, "TempDefault", 0);
+ DBWriteContactSettingDword(mwed->hContact, MODULE, "ForceSend", 0);
+ }
+ }
}
return 0;
@@ -430,6 +434,8 @@ int EventFilterAdd(WPARAM wParam, LPARAM lParam) {
&& DBGetContactSettingByte(hMeta, MODULE, "WindowOpen", 0) == 0))
{
dbeiMeta.flags |= DBEF_READ;
+ } else {
+ DBWriteContactSettingDword(hMeta, MODULE, "TempDefault", (DWORD)hContact);
}
if(MetaEnabled() && DBGetContactSettingByte(hContact, MODULE, "WindowOpen", 0) == 0) {
dbei->flags |= DBEF_READ;
diff --git a/meta2/resource.h b/meta2/resource.h
index 7462749..eca2737 100644
--- a/meta2/resource.h
+++ b/meta2/resource.h
@@ -11,26 +11,23 @@
#define IDI_MCCONVERT 125
#define IDI_MCEDIT 126
#define IDI_MCREMOVE 127
-
#define IDD_PRIORITIES 128
+#define IDD_METASELECT 129
+#define IDD_METAEDIT 130
#define IDC_ED_PRIORITY 1001
#define IDC_SP_PRIORITY 1002
#define IDC_CMB_STATUS 1003
#define IDC_CMB_PROTOCOL 1004
#define IDC_BTN_RESET 1005
#define IDC_CHK_DEFAULT 1006
-
-#define IDD_METASELECT 129
#define IDC_METALIST 1007
#define IDC_CHK_SRT 1008
-
-#define IDD_METAEDIT 130
#define IDC_VALIDATE 1009
#define IDC_BTN_REM 1010
#define IDC_BTN_SETDEFAULT 1011
#define IDC_ED_NAME 1012
#define IDC_LST_CONTACTS 1013
-
+#define IDC_CHECK1 1014
#define IDC_STATIC -1
// Next default values for new objects
@@ -39,7 +36,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 131
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1014
+#define _APS_NEXT_CONTROL_VALUE 1015
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif