From 9814933f4bc5a7a4320819de54e313d8fc0ceffe Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 3 Oct 2007 05:26:48 +0000 Subject: initial revision of new metacontacts git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@338 4f64403b-2f21-0410-a795-97e2b3489a10 --- meta2/core_functions.cpp | 138 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 meta2/core_functions.cpp (limited to 'meta2/core_functions.cpp') 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 -- cgit v1.2.3