int initTriggerModule() { CONDITIONREGISTER cr; TRIGGERREGISTER tr; ACTIONREGISTER ar; int res; DWORD triggerID; log_debugA("Variables: initTriggerModule"); if (!ServiceExists(MS_TRIGGER_REGISTERTRIGGER)) { log_debugA("Variables: %s does not exist", MS_TRIGGER_REGISTERTRIGGER); return -1; } ZeroMemory(&tr, sizeof(tr)); tr.cbSize = sizeof(tr); tr.pszName = TRIGGERNAME; tr.hInstance = hInst; tr.pfnDlgProc = DlgProcOptsStringChange; tr.pszTemplate = MAKEINTRESOURCEA(IDD_TRG_STRINGCHANGE); tr.dFlags = DF_TEXT|DF_TCHAR; res = CallService(MS_TRIGGER_REGISTERTRIGGER, 0, (LPARAM)&tr); log_debugA("Variables: %s registered (%d)", TRIGGERNAME, res); ZeroMemory(&ar, sizeof(ACTIONREGISTER)); ar.cbSize = sizeof(ACTIONREGISTER); ar.pszName = "Variables: Parse string"; ar.hInstance = hInst; ar.pfnDlgProc = DlgProcOptsParseString; ar.pszTemplate = MAKEINTRESOURCEA(IDD_ACT_PARSESTRING); ar.actionFunction = ParseStringAction; ar.flags = ARF_FUNCTION|ARF_TCHAR; CallService(MS_TRIGGER_REGISTERACTION, 0, (LPARAM)&ar); ZeroMemory(&cr, sizeof(CONDITIONREGISTER)); cr.cbSize = sizeof(CONDITIONREGISTER); cr.pszName = "Variables: Condition"; cr.hInstance = hInst; cr.pfnDlgProc = DlgProcOptsCondition; cr.pszTemplate = MAKEINTRESOURCEA(IDD_CND_PARSESTRING); cr.conditionFunction = ParseStringCondition; cr.flags = CRF_FUNCTION|CRF_TCHAR; CallService(MS_TRIGGER_REGISTERCONDITION, 0, (LPARAM)&cr); // fill cache triggerID = 0; do { triggerID = (DWORD)CallService(MS_TRIGGER_FINDNEXTTRIGGERID, triggerID, (LPARAM)TRIGGERNAME); if (triggerID == 0) { continue; } addToCache(triggerID); } while (triggerID != 0); stringChangeTimerID = SetTimer(NULL, 0, CHECKSTRINGDELAY, checkStringsTimer); return res; }
int LoadVarModule() { if (initTokenRegister() != 0 || initContactModule() != 0) return -1; setParseOptions(NULL); hFormatStringService = CreateServiceFunction(MS_VARS_FORMATSTRING, formatStringService); hRegisterVariableService = CreateServiceFunction(MS_VARS_REGISTERTOKEN, registerToken); // help dialog hCurSplitNS = LoadCursor(NULL, IDC_SIZENS); hShowHelpService = CreateServiceFunction(MS_VARS_SHOWHELP, showHelpService); hShowHelpExService = CreateServiceFunction(MS_VARS_SHOWHELPEX, showHelpExService); Icon_Register(hInst, LPGEN("Variables"), &icon, 1); hIconsChangedHook = HookEvent(ME_SKIN2_ICONSCHANGED, iconsChanged); hGetIconService = CreateServiceFunction(MS_VARS_GETSKINITEM, getSkinItemService); hOptionsHook = HookEvent(ME_OPT_INITIALISE, OptionsInit); // register internal tokens registerExternalTokens(); registerLogicTokens(); registerMathTokens(); registerMirandaTokens(); registerStrTokens(); registerSystemTokens(); registerVariablesTokens(); registerRegExpTokens(); registerInetTokens(); registerAliasTokens(); registerMetaContactsTokens(); log_debugA("Variables: Internal tokens registered"); if (db_get_b(NULL, MODULENAME, SETTING_PARSEATSTARTUP, 0)) { FORMATINFO fi = { 0 }; fi.cbSize = sizeof(fi); fi.tszFormat = db_get_tsa(NULL, MODULENAME, SETTING_STARTUPTEXT); if (fi.tszFormat != NULL) { mir_free(formatString(&fi)); mir_free(fi.tszFormat); } } log_debugA("Variables: Init done"); return 0; }
/* Window proc for poweroff event */ static DWORD CALLBACK MessageWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_ENDSESSION: log_debugA("WM_ENDSESSION"); if (wParam) { log_debugA("WM_ENDSESSION: calling exit"); OnShutdown(0, 0); log_debugA("WM_ENDSESSION: exit called"); } break; } return TRUE; }
static int CSStatusChangeEx(WPARAM wParam, LPARAM lParam) { // another status plugin made the change if (!db_get_b(NULL, MODULENAME, SETTING_OVERRIDE, 1) || startupSettings.getCount() == 0) return 0; if (wParam != 0) { PROTOCOLSETTINGEX** ps = *(PROTOCOLSETTINGEX***)wParam; if (ps == NULL) return -1; for (int i = 0; i < startupSettings.getCount(); i++) { for (int j = 0; j < startupSettings.getCount(); j++) { if (ps[i]->szName == NULL || startupSettings[j].szName == NULL) continue; if (!mir_strcmp(ps[i]->szName, startupSettings[j].szName)) { log_debugA("StartupStatus: %s overridden by MS_CS_SETSTATUSEX, status will not be set", ps[i]->szName); // use a hack to disable this proto startupSettings[j].szName = ""; } } } } return 0; }
static TCHAR* parseContact(ARGUMENTSINFO *ai) { if (ai->argc < 3 || ai->argc > 4) return NULL; int n = 0; if (ai->argc == 4 && *ai->targv[3] != 'r') n = ttoi(ai->targv[3]) - 1; CONTACTSINFO ci = { 0 }; ci.cbSize = sizeof(ci); ci.tszContact = ai->targv[1]; ci.flags = getContactInfoFlags(ai->targv[2]); int count = getContactFromString(&ci); if (count == 0 || ci.hContacts == NULL) return NULL; if (ai->argc == 4 && *ai->targv[3] == 'r') n = rand() % count; if (count != 1 && ai->argc != 4) { mir_free(ci.hContacts); return NULL; } MCONTACT hContact = ci.hContacts[n]; log_debugA("contact: %x", hContact); mir_free(ci.hContacts); return encodeContactToString(hContact); }
static int OnOkToExit(WPARAM, LPARAM) { // save last protocolstatus int count; PROTOACCOUNT** protos; Proto_EnumAccounts(&count, &protos); for (int i = 0; i < count; i++) { PROTOACCOUNT *pa = protos[i]; if (!IsSuitableProto(pa)) continue; if (!Proto_GetAccount(pa->szModuleName)) continue; char lastName[128], lastMsg[128]; mir_snprintf(lastName, "%s%s", PREFIX_LAST, pa->szModuleName); db_set_w(NULL, MODULENAME, lastName, (WORD)CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0)); mir_snprintf(lastMsg, "%s%s", PREFIX_LASTMSG, pa->szModuleName); db_unset(NULL, MODULENAME, lastMsg); if (!(CallProtoService(pa->szModuleName, PS_GETCAPS, (WPARAM)PFLAGNUM_1, 0) & PF1_MODEMSGSEND & ~PF1_INDIVMODEMSG)) continue; int status = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0); if (!(CallProtoService(pa->szModuleName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0) & Proto_Status2Flag(status))) continue; // NewAwaySys if (ServiceExists(MS_NAS_GETSTATE)) { NAS_PROTOINFO npi = { sizeof(npi) }; npi.szProto = pa->szModuleName; CallService(MS_NAS_GETSTATE, (WPARAM)&npi, 1); if (npi.szMsg == NULL) { npi.status = 0; npi.szProto = NULL; CallService(MS_NAS_GETSTATE, (WPARAM)&npi, 1); } if (npi.szMsg != NULL) { db_set_ts(NULL, MODULENAME, lastMsg, npi.tszMsg); mir_free(npi.tszMsg); } } } if (db_get_b(NULL, MODULENAME, SETTING_SETPROFILE, 1) || db_get_b(NULL, MODULENAME, SETTING_OFFLINECLOSE, 0)) { if (ServiceExists(MS_CLIST_SETSTATUSMODE)) CallService(MS_CLIST_SETSTATUSMODE, (WPARAM)ID_STATUS_OFFLINE, 0); else log_debugA("StartupStatus: MS_CLIST_SETSTATUSMODE not available!"); } return 0; }
static int StatusChange(WPARAM wParam, LPARAM lParam) { // change by menu if (!db_get_b(NULL, MODULENAME, SETTING_OVERRIDE, 1) || startupSettings.getCount() == 0) return 0; char *szProto = (char *)lParam; if (szProto == NULL) { // global status change for (int i = 0; i < startupSettings.getCount(); i++) { startupSettings[i].szName = ""; log_debugA("StartupStatus: all protos overridden by ME_CLIST_STATUSMODECHANGE, status will not be set"); } } else { for (int i = 0; i < startupSettings.getCount(); i++) { if (!mir_strcmp(startupSettings[i].szName, szProto)) { startupSettings[i].szName = ""; log_debugA("StartupStatus: %s overridden by ME_CLIST_STATUSMODECHANGE, status will not be set", szProto); } } } return 0; }
INT_PTR registerToken(WPARAM wParam, LPARAM lParam) { DWORD hash; int idx; TOKENREGISTEREX *newVr = (TOKENREGISTEREX*)lParam; if (newVr == NULL || newVr->szTokenString == NULL || newVr->cbSize <= 0) return -1; if (newVr->flags & TRF_TCHAR) { deRegisterToken(newVr->tszTokenString); hash = NameHashFunction(newVr->tszTokenString); } else { WCHAR *wtoken = mir_a2t(newVr->szTokenString); deRegisterToken(wtoken); hash = NameHashFunction(wtoken); mir_free(wtoken); } TokenRegisterEntry *tre = (TokenRegisterEntry*)mir_alloc(sizeof(TokenRegisterEntry)); if (tre == NULL) return -1; memcpy(&tre->tr, newVr, newVr->cbSize); tre->nameHash = hash; if (!mir_tstrcmp(newVr->tszTokenString, _T("alias"))) log_debugA("alias"); if (!(newVr->flags & TRF_PARSEFUNC) && newVr->szService != NULL) tre->tr.szService = mir_strdup(newVr->szService); if (newVr->flags & TRF_TCHAR) tre->tr.tszTokenString = mir_tstrdup(newVr->tszTokenString); else tre->tr.tszTokenString = mir_a2t(newVr->szTokenString); if (newVr->szHelpText != NULL) tre->tr.szHelpText = mir_strdup(newVr->szHelpText); if ((newVr->flags & TRF_CLEANUP) && !(newVr->flags & TRF_CLEANUPFUNC) && newVr->szCleanupService != NULL) tre->tr.szCleanupService = mir_strdup(newVr->szCleanupService); mir_cslock lck(csRegister); List_GetIndex((SortedList*)&tokens, tre, &idx); List_Insert((SortedList*)&tokens, tre, idx); return 0; }
// 'allow override' static int ProcessProtoAck(WPARAM wParam, LPARAM lParam) { // 'something' made a status change ACKDATA *ack = (ACKDATA*)lParam; if (ack->type != ACKTYPE_STATUS && ack->result != ACKRESULT_FAILED) return 0; if (!db_get_b(NULL, MODULENAME, SETTING_OVERRIDE, 1) || startupSettings.getCount() == 0) return 0; for (int i = 0; i < startupSettings.getCount(); i++) { if (!mir_strcmp(ack->szModule, startupSettings[i].szName)) { startupSettings[i].szName = ""; log_debugA("StartupStatus: %s overridden by ME_PROTO_ACK, status will not be set", ack->szModule); } } return 0; }
TCHAR *formatString(FORMATINFO *fi) { if (fi == NULL) return NULL; /* the service to format a given string */ if ((fi->eCount + fi->pCount) > 5000) { fi->eCount++; fi->pCount++; log_debugA("Variables: Overflow protection; %d parses", (fi->eCount + fi->pCount)); return NULL; } if (fi->tszFormat == NULL) return NULL; ptrT string( mir_tstrdup(fi->tszFormat)); if (string == NULL) return NULL; return replaceDynVars(string, fi); }
int ParseStringCondition(DWORD conditionID, REPORTINFO *ri) { int res; res = CRV_TRUE; if (ri->flags&CND_PERFORM) { DBVARIANT dbv; if (!DBGetConditionSettingTString(conditionID, NULL, MODULENAME, SETTING_PARSESTRING, &dbv)) { FORMATINFO fi; ZeroMemory(&fi, sizeof(FORMATINFO)); fi.cbSize = sizeof(FORMATINFO); fi.tszFormat = dbv.ptszVal; fi.tszExtraText = ((ri->td!=NULL)&&(ri->td->dFlags&DF_TEXT))?ri->td->tszText:NULL; fi.hContact = ((ri->td!=NULL)&&(ri->td->dFlags&DF_CONTACT))?ri->td->hContact:NULL; fi.flags |= FIF_TCHAR; free((TCHAR *)CallService(MS_VARS_FORMATSTRING, (WPARAM)&fi, 0)); log_debugA("err: %d", fi.eCount); res = fi.eCount==0?CRV_TRUE:CRV_FALSE; DBFreeVariant(&dbv); } } if (ri->flags&CND_CLEANUP) { REMOVETRIGGERSETTINGS ras; ras.cbSize = sizeof(REMOVETRIGGERSETTINGS); ras.prefix = PREFIX_CONDITIONID; ras.id = conditionID; ras.szModule = MODULENAME; ras.hContact = NULL; CallService(MS_TRIGGER_REMOVESETTINGS, 0, (LPARAM)&ras); } return res; }
static INT_PTR CALLBACK clistDlgProc(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE, (GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CLIST), GWL_STYLE) | (CLS_SHOWHIDDEN) | (CLS_NOHIDEOFFLINE)) & ~CLS_CHECKBOXES & ~CLS_USEGROUPS ); ResetCList(hwndDlg); CheckRadioButton(hwndDlg, IDC_NULL, IDC_CONTACT, IDC_NULL); EnableWindow(GetDlgItem(hwndDlg, IDC_CLIST), IsDlgButtonChecked(hwndDlg, IDC_CONTACT)); break; case VARM_SETSUBJECT: { LPARAM res = 0; MCONTACT hItem, hContact = wParam; log_debugA("VARM_SETSUBJECT: %u", hContact); if (hContact == INVALID_CONTACT_ID) { TCHAR *tszContact = db_get_tsa(NULL, MODULENAME, SETTING_SUBJECT); log_debugA("VARM_SETSUBJECT: %s", tszContact); if (tszContact != NULL) { hContact = decodeContactFromString(tszContact); log_debugA("VARM_SETSUBJECT decoded: %u", hContact); mir_free(tszContact); } } if ((hContact != INVALID_CONTACT_ID) && (hContact != NULL)) hItem = (MCONTACT)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_FINDCONTACT, hContact, 0); else hItem = NULL; if (hItem != NULL) res = (LPARAM)SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_SELECTITEM, (WPARAM)hItem, 0); CheckRadioButton(hwndDlg, IDC_NULL, IDC_CONTACT, hItem==NULL?IDC_NULL:IDC_CONTACT); EnableWindow(GetDlgItem(hwndDlg, IDC_CLIST), IsDlgButtonChecked(hwndDlg, IDC_CONTACT)); SetFocus(GetDlgItem(hwndDlg, IDC_CLIST)); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)res); } return TRUE; case VARM_GETSUBJECT: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (IsDlgButtonChecked(hwndDlg, IDC_CONTACT) ? SendDlgItemMessage(hwndDlg, IDC_CLIST, CLM_GETSELECTION, 0, 0) : 0)); return TRUE; case WM_SIZE: if (!IsIconic(hwndDlg)) { UTILRESIZEDIALOG urd = { sizeof(urd) }; urd.hInstance = hInst; urd.hwndDlg = hwndDlg; urd.lParam = 0; /* ! uses ANSI version ! */ urd.lpTemplate = MAKEINTRESOURCEA(IDD_CLIST_DIALOG); urd.pfnResizer = clistDialogResize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); SendMessage(hwndDlg, WM_MOVE, 0, 0); } break; case WM_SHOWWINDOW: if ((wParam) && (IsDlgButtonChecked(hwndDlg, IDC_CONTACT))) SetFocus(GetDlgItem(hwndDlg, IDC_CLIST)); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_NULL: case IDC_CONTACT: CheckRadioButton(hwndDlg, IDC_NULL, IDC_CONTACT, LOWORD(wParam)); EnableWindow(GetDlgItem(hwndDlg, IDC_CLIST), IsDlgButtonChecked(hwndDlg, IDC_CONTACT)); if (IsDlgButtonChecked(hwndDlg, IDC_CONTACT)) SetFocus(GetDlgItem(hwndDlg, IDC_CLIST)); break; } break; case WM_NOTIFY: switch (((NMHDR *) lParam)->idFrom) { case IDC_CLIST: switch (((NMHDR *) lParam)->code) { case CLN_OPTIONSCHANGED: ResetCList(hwndDlg); break; } break; } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: db_unset(NULL, MODULENAME, SETTING_SUBJECT); MCONTACT hContact = (MCONTACT)SendMessage(hwndDlg, VARM_GETSUBJECT, 0, 0); if (hContact != NULL) { TCHAR *tszContact = encodeContactToString(hContact); if (tszContact != NULL) { db_set_ts(NULL, MODULENAME, SETTING_SUBJECT, tszContact); mir_free(tszContact); } } break; } return FALSE; }
/* MS_VARS_FORMATSTRING */ static INT_PTR formatStringService(WPARAM wParam, LPARAM lParam) { INT_PTR res; int i; BOOL copied; FORMATINFO *fi, tempFi; TCHAR *tszFormat, *orgFormat, *tszSource, *orgSource, *tRes; if (((FORMATINFO *)wParam)->cbSize >= sizeof(FORMATINFO)) { memset(&tempFi, 0, sizeof(FORMATINFO)); memcpy(&tempFi, (FORMATINFO *)wParam, sizeof(FORMATINFO)); fi = &tempFi; } else if (((FORMATINFO *)wParam)->cbSize == FORMATINFOV2_SIZE) { memset(&tempFi, 0, sizeof(FORMATINFO)); memcpy(&tempFi, (FORMATINFO *)wParam, FORMATINFOV2_SIZE); fi = &tempFi; } else { // old struct, must be ANSI FORMATINFOV1 *fiv1 = (FORMATINFOV1 *)wParam; memset(&tempFi, 0, sizeof(FORMATINFO)); tempFi.cbSize = sizeof(FORMATINFO); tempFi.hContact = fiv1->hContact; tempFi.szFormat = fiv1->szFormat; tempFi.szExtraText = fiv1->szSource; fi = &tempFi; } orgFormat = fi->tszFormat; orgSource = fi->tszExtraText; if (!(fi->flags&FIF_TCHAR)) { copied = TRUE; log_debugA("mir_a2t (%s)", fi->szExtraText); tszFormat = fi->szFormat!=NULL?mir_a2t(fi->szFormat):NULL; tszSource = fi->szExtraText!=NULL?mir_a2t(fi->szExtraText):NULL; for(i = 0; i < fi->cbTemporaryVarsSize; i++) { fi->tszaTemporaryVars[i] = fi->szaTemporaryVars[i]!=NULL?mir_a2t(fi->szaTemporaryVars[i]):NULL; } } else { copied = FALSE; tszFormat = fi->tszFormat; tszSource = fi->tszExtraText; } fi->tszFormat = tszFormat; fi->tszExtraText = tszSource; tRes = formatString(fi); if (!(fi->flags&FIF_TCHAR)) { res = (INT_PTR)mir_u2a(tRes); mir_free(tRes); } else res = (INT_PTR)tRes; if (copied) { mir_free(tszFormat); mir_free(tszSource); for(i = 0; i < fi->cbTemporaryVarsSize; i++) mir_free(fi->tszaTemporaryVars); } if (((FORMATINFO *)wParam)->cbSize == sizeof(FORMATINFOV1)) { ((FORMATINFOV1 *)wParam)->eCount = fi->eCount; ((FORMATINFOV1 *)wParam)->pCount = fi->pCount; } else { ((FORMATINFO *)wParam)->eCount = fi->eCount; ((FORMATINFO *)wParam)->pCount = fi->pCount; } return res; }