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/settings.cpp | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 meta2/settings.cpp (limited to 'meta2/settings.cpp') diff --git a/meta2/settings.cpp b/meta2/settings.cpp new file mode 100644 index 0000000..06c9b9f --- /dev/null +++ b/meta2/settings.cpp @@ -0,0 +1,110 @@ +#include "common.h" +#include "settings.h" +#include "core_functions.h" + +PLUGINLINK *core_link = 0; +typedef int (*ServiceFunc)(const char *,WPARAM,LPARAM); +ServiceFunc coreCallService, coreCallServiceSync; + +int ServiceFuncRedirect(const char *service,WPARAM wParam, LPARAM lParam, ServiceFunc coreServiceFunc) { + if(wParam ==0 + || strncmp(service, "DB/Contact/", 11) != 0 + || (strcmp(MS_DB_CONTACT_GETSETTING, service) != 0 + && strcmp(MS_DB_CONTACT_GETSETTING_STR, service) != 0 + && strcmp(MS_DB_CONTACT_GETSETTINGSTATIC, service) != 0 + && strcmp(MS_DB_CONTACT_WRITESETTING, service) != 0 + && strcmp(MS_DB_CONTACT_DELETESETTING, service) != 0 + && strcmp(MS_DB_CONTACT_ENUMSETTINGS, service) != 0)) + { + return coreServiceFunc(service, wParam, lParam); + } + + HANDLE hContact = (HANDLE)wParam; + if(strcmp(MS_DB_CONTACT_ENUMSETTINGS, service) == 0) { + DBCONTACTENUMSETTINGS *ces = (DBCONTACTENUMSETTINGS *)lParam; + if(IsMetacontact(hContact) && strcmp(ces->szModule, MODULE) != 0) { + HANDLE hSub = Meta_GetMostOnline(hContact); + return coreServiceFunc(service, (WPARAM)hSub, lParam); + } else + return coreServiceFunc(service, wParam, lParam); + } + + const char *szSetting = 0, *szModule = 0; + bool read; // true for get setting, false for write setting + if(strcmp(MS_DB_CONTACT_WRITESETTING, service) == 0 || strcmp(MS_DB_CONTACT_DELETESETTING, service)) { + read = false; + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *)lParam; + szSetting = cws->szSetting; + szModule = cws->szModule; + } else { // get setting + read = true; + DBCONTACTGETSETTING *cgs = (DBCONTACTGETSETTING *)lParam; + szSetting = cgs->szSetting; + szModule = cgs->szModule; + } + + if(szModule == 0 || szSetting == 0 + || strcmp(szModule, "Protocol") == 0 + || strcmp(szModule, "_Filter") == 0 + || (strcmp(szModule, MODULE) == 0 + && (strcmp(szSetting, "MetaID") == 0 + || strcmp(szSetting, "IsSubcontact") == 0 + || strcmp(szSetting, "Default") == 0 + || strcmp(szSetting, "Handle") == 0 + || strcmp(szSetting, "WindowOpen") == 0 + || strcmp(szSetting, "ParentMetaID") == 0 + || strcmp(szSetting, "Status") == 0)) + || !IsMetacontact(hContact)) + { + return coreServiceFunc(service, wParam, lParam); + } + + HANDLE hMeta = hContact; + int ret; + if((ret = coreServiceFunc(service, (WPARAM)hMeta, lParam)) != 0) { + // if the setting does not exist in the metacontact, get it from the most online subcontact + HANDLE hSub = Meta_GetMostOnline(hMeta); + if(!hSub) return ret; // no most online - fail + if((ret = coreServiceFunc(service, (WPARAM)hSub, lParam)) != 0) { + // if it does not exist in the subcontact and we're using the meta proto module, try changing the module to the subcontact proto module + if(strcmp(szModule, MODULE) == 0) { + char *subProto = ContactProto(hSub); + if(subProto) { + if(read) { + DBCONTACTGETSETTING *cgs = (DBCONTACTGETSETTING *)lParam; + cgs->szModule = MODULE; + } else { + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *)lParam; + cws->szModule = MODULE; + } + return coreServiceFunc(service, (WPARAM)hSub, lParam); + } else + return ret; // no subcontact proto - fail + } else + return ret; // not reading from meta proto module - fail + } else + return 0; // got from subcontact + } else + return 0; // got from metacontact +} + +int CallServiceRedirect(const char *service,WPARAM wParam, LPARAM lParam) { + return ServiceFuncRedirect(service, wParam, lParam, coreCallService); +} + +int CallServiceSyncRedirect(const char *service,WPARAM wParam, LPARAM lParam) { + return ServiceFuncRedirect(service, wParam, lParam, coreCallServiceSync); +} + +void InitSettings(PLUGINLINK *link) { + core_link = link; + coreCallService = core_link->CallService; + coreCallServiceSync = core_link->CallServiceSync; + core_link->CallService = CallServiceRedirect; + core_link->CallServiceSync = CallServiceSyncRedirect; +} + +void DeinitSettings() { + core_link->CallService = coreCallService; + core_link->CallServiceSync = coreCallServiceSync; +} \ No newline at end of file -- cgit v1.2.3