diff options
Diffstat (limited to 'meta2/settings.cpp')
-rw-r--r-- | meta2/settings.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
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 |