diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-03 05:26:48 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-10-03 05:26:48 +0000 |
commit | 9814933f4bc5a7a4320819de54e313d8fc0ceffe (patch) | |
tree | ad1b95ce79312a3e88bc0e5c47d2f11c43f2e58f /meta2/core_functions.cpp | |
parent | 812d72d8d92f24e1989a56d1180d1435ee27b5f6 (diff) |
initial revision of new metacontacts
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@338 4f64403b-2f21-0410-a795-97e2b3489a10
Diffstat (limited to 'meta2/core_functions.cpp')
-rw-r--r-- | meta2/core_functions.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/meta2/core_functions.cpp b/meta2/core_functions.cpp new file mode 100644 index 0000000..aba22c0 --- /dev/null +++ b/meta2/core_functions.cpp @@ -0,0 +1,138 @@ +#include "common.h"
+#include "core_functions.h"
+#include "proto.h"
+#include "api.h"
+#include "priorities.h"
+
+MetaMap metaMap;
+
+HANDLE GetMetaHandle(DWORD id) {
+ HANDLE hContact = (HANDLE)CallService( MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char *proto;
+ while(hContact) {
+ proto = ContactProto(hContact);
+ if(proto && !strcmp(proto, MODULE)) {
+ DWORD mid = DBGetContactSettingDword(hContact, MODULE, META_ID, (DWORD)-1);
+ if(mid == id) return hContact;
+ }
+
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
+ }
+ return 0;
+}
+
+void Meta_Hide(bool hide) {
+ HANDLE hContact = (HANDLE)CallService( MS_DB_CONTACT_FINDFIRST, 0, 0);
+ char *proto;
+ HANDLE hMeta;
+ while(hContact != NULL) {
+ if(IsMetacontact(hContact)) {
+ DBWriteContactSettingByte(hContact, "CList", "Hidden", hide ? 1 : 0);
+ } else if(IsSubcontact(hContact) && !meta_group_hack_disabled) {
+ DBWriteContactSettingByte(hContact, "CList", "Hidden", hide ? 0 : 1);
+ }
+
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 );
+ }
+}
+
+HANDLE Meta_GetMostOnline(HANDLE hMeta) {
+ return Meta_GetMostOnlineSupporting(hMeta, PFLAGNUM_1, PF1_IM);
+}
+
+HANDLE Meta_GetMostOnlineSupporting(HANDLE hMeta, int flag, int cap) {
+ if(!metaMap.exists(hMeta)) return 0;
+
+ 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);
+
+ 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;
+ }
+ }
+ i.next();
+ }
+
+ return most_online;
+}
+
+void Meta_CalcStatus(HANDLE hMeta) {
+ HANDLE hSub = Meta_GetMostOnline(hMeta);
+ char *proto = ContactProto(hSub);
+ DBWriteContactSettingWord(hMeta, MODULE, "Status", ContactStatus(hSub, proto));
+}
+
+HANDLE Meta_Convert(HANDLE hSub) {
+ HANDLE hMeta = NewMetaContact();
+
+ DBWriteContactSettingByte(hMeta, MODULE, "Default", 0);
+ Meta_Assign(hSub, hMeta);
+
+ DBVARIANT dbv;
+ if(!DBGetContactSettingUTF8String(hSub, "CList", "Group", &dbv)) {
+ DBWriteContactSettingUTF8String(hMeta, "CList", "Group", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSettingUTF8String(hSub, "CList", "MyHandle", &dbv)) {
+ DBWriteContactSettingUTF8String(hMeta, "CList", "MyHandle", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ char *subProto = ContactProto(hSub);
+ if(subProto) {
+ if(!DBGetContactSettingUTF8String(hSub, subProto, "Nick", &dbv)) {
+ DBWriteContactSettingUTF8String(hMeta, MODULE, "Nick", dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ Meta_CalcStatus(hMeta);
+ return hMeta;
+}
+
+void Meta_Assign(HANDLE hSub, HANDLE hMeta) {
+ metaMap[hMeta].add(hSub);
+ DBWriteContactSettingDword(hSub, MODULE, "ParentMetaID", DBGetContactSettingDword(hMeta, MODULE, META_ID, -1));
+ DBWriteContactSettingDword(hSub, MODULE, "Handle", (DWORD)hMeta);
+ DBWriteContactSettingByte(hSub, MODULE, "IsSubcontact", 1);
+ if(MetaEnabled()) {
+ if(!meta_group_hack_disabled)
+ DBWriteContactSettingByte(hSub, "CList", "Hidden", 1);
+ } else // shouldn't happen, as the menu option is hidden when metas are disabled...
+ DBWriteContactSettingByte(hMeta, "CList", "Hidden", 1);
+
+ FireSubcontactsChanged(hMeta);
+}
+
+void Meta_Remove(HANDLE hSub) {
+ HANDLE hMeta = (HANDLE)DBGetContactSettingDword(hSub, MODULE, "Handle", 0);
+ if(hMeta) {
+ DBDeleteContactSetting(hSub, MODULE, "ParentMetaID");
+ // deleting these (resident) settings doesn't work :( [25/9/07]
+ DBWriteContactSettingDword(hSub, MODULE, "Handle", 0);
+ DBWriteContactSettingByte(hSub, MODULE, "IsSubcontact", 0);
+ if(!meta_group_hack_disabled) DBWriteContactSettingByte(hSub, "CList", "Hidden", 0);
+
+ metaMap[hMeta].remove(hSub);
+ if(metaMap[hMeta].size() == 0) {
+ CallService(MS_DB_CONTACT_DELETE, (WPARAM)hMeta, 0);
+ } else {
+ int def = DBGetContactSettingByte(hMeta, MODULE, "Default", -1);
+ if(def < 0 || def >= metaMap[hMeta].size())
+ DBWriteContactSettingByte(hMeta, MODULE, "Default", 0);
+ }
+ FireSubcontactsChanged(hMeta);
+ }
+}
\ No newline at end of file |