CMString ExpandPath(const TCHAR *format) { CMString res; if (ServiceExists(MS_VARS_FORMATSTRING)) res = VARST(ptrT(variables_parse((TCHAR*)format, NULL, NULL))); else res = VARST(format); res.Replace(PROFILE_PATHT, szCurrentProfilePath); res.Replace(CURRENT_PROFILET, szCurrentProfile); res.Replace(MIRANDA_PATHT, szMirandaPath); res.Replace(MIRANDA_USERDATAT, szUserDataPath); res.Trim(); // also remove the trailing slash if (!res.IsEmpty()) { int iNewSize = res.GetLength() - 1; switch (res[iNewSize]) { case '\\': case '/': res.Truncate(iNewSize); } } return res; }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, wParam, lParam) { UNREFERENCED_PARAMETER(wParam); MEVENT hDbEvent = (MEVENT)lParam; DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (-1 == dbei.cbBlob) return 0; mir_ptr<BYTE> blob((LPBYTE)mir_alloc(dbei.cbBlob)); dbei.pBlob = blob; db_event_get(hDbEvent, &dbei); // if event is in protocol that is not despammed if (plSets->ProtoDisabled(dbei.szModule)) return 0; // event is an auth request if (!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) { MCONTACT hcntct = DbGetAuthEventContact(&dbei); // if request is from unknown or not marked Answered contact //and if I don't sent message to this contact if (db_get_b(hcntct, "CList", "NotOnList", 0) && !db_get_b(hcntct, pluginName, answeredSetting, 0) && !IsExistMyMessage(hcntct)) { if (!plSets->HandleAuthReq.Get()) { char *buf = mir_utf8encodeW(variables_parse(plSets->AuthRepl.Get(), hcntct).c_str()); CallContactService(hcntct, PSS_MESSAGE, 0, (LPARAM)buf); mir_free(buf); } // ...send message char *AuthRepl = mir_u2a(variables_parse(plSets->AuthRepl.Get(), hcntct).c_str()); CallProtoService(dbei.szModule, PS_AUTHDENY, hDbEvent, (LPARAM)AuthRepl); mir_free(AuthRepl); db_set_b(hcntct, "CList", "NotOnList", 1); db_set_b(hcntct, "CList", "Hidden", 1); if (!plSets->HistLog.Get()) db_event_delete(0, hDbEvent); return 1; } } return 0; }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, hContact, hDbEvent) { DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (dbei.cbBlob == -1) return 0; dbei.pBlob = (BYTE*)alloca(dbei.cbBlob); db_event_get(hDbEvent, &dbei); // if event is in protocol that is not despammed if (!ProtoInList(dbei.szModule)) return 0; // event is an auth request if (gbHandleAuthReq) { if (!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) { MCONTACT hcntct = DbGetAuthEventContact(&dbei); // if request is from unknown or not marked Answered contact int a = db_get_b(hcntct, "CList", "NotOnList", 0); int b = !db_get_b(hcntct, pluginName, "Answered", 0); if (a && b) { // ...send message if (gbHideContacts) db_set_b(hcntct, "CList", "Hidden", 1); if (gbSpecialGroup) db_set_ws(hcntct, "CList", "Group", gbSpammersGroup.c_str()); BYTE msg = 1; if (gbIgnoreURL) { TCHAR* EventText = ReqGetText(&dbei); //else return NULL msg = !IsUrlContains(EventText); mir_free(EventText); } if (gbInvisDisable) { if (CallProtoService(dbei.szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE) msg = 0; else if (db_get_w(hContact, dbei.szModule, "ApparentMode", 0) == ID_STATUS_OFFLINE) msg = 0; //is it useful ? } if (msg) { ptrA buff(mir_utf8encodeW(variables_parse(gbAuthRepl, hcntct).c_str())); CallContactService(hcntct, PSS_MESSAGE, 0, (LPARAM)buff); } return 1; } } } return 0; }
TCString GetDynamicStatMsg(MCONTACT hContact, char *szProto, DWORD UIN, int iStatus) { // hContact is the contact that requests the status message if (hContact != INVALID_CONTACT_ID) VarParseData.Message = CContactSettings(iStatus, hContact).GetMsgFormat(GMF_ANYCURRENT, NULL, szProto); else // contact is unknown VarParseData.Message = CProtoSettings(szProto, iStatus).GetMsgFormat(iStatus ? GMF_LASTORDEFAULT : GMF_ANYCURRENT); TCString sTime; VarParseData.szProto = szProto ? szProto : ((hContact && hContact != INVALID_CONTACT_ID) ? GetContactProto(hContact) : NULL); VarParseData.UIN = UIN; VarParseData.Flags = 0; if (ServiceExists(MS_VARS_FORMATSTRING) && !g_SetAwayMsgPage.GetDBValueCopy(IDS_SAWAYMSG_DISABLEVARIABLES)) { TCHAR *szResult = variables_parse(VarParseData.Message, 0, hContact); if (szResult) { VarParseData.Message = szResult; mir_free(szResult); } } return VarParseData.Message = VarParseData.Message.Left(AWAY_MSGDATA_MAX); }
// Get the text based on the settings for a especific line void Cache_GetLineText(struct ClcContact *contact, int type, LPTSTR text, int text_size, TCHAR *variable_text, BOOL xstatus_has_priority, BOOL show_status_if_no_away, BOOL use_name_and_message_for_xstatus, BOOL contact_time_show_only_if_different) { text[0] = '\0'; switch(type) { case TEXT_STATUS: { if (GetStatusName(text, text_size, contact, xstatus_has_priority) == -1 && use_name_and_message_for_xstatus) { DBVARIANT dbv; // Try to get XStatusMsg if (!DBGetContactSettingTString(contact->hContact, contact->proto, "XStatusMsg", &dbv)) { if (dbv.ptszVal != NULL && dbv.ptszVal[0] != 0) { TCHAR *tmp = mir_strdupT(text); mir_sntprintf(text, text_size, TEXT("%s: %s"), tmp, dbv.pszVal); mir_free(tmp); } DBFreeVariant(&dbv); } } break; } case TEXT_NICKNAME: { if (contact->hContact && contact->proto) { DBVARIANT dbv; if (!DBGetContactSettingTString(contact->hContact, contact->proto, "Nick", &dbv)) { lstrcpyn(text, dbv.ptszVal, text_size); DBFreeVariant(&dbv); } } break; } case TEXT_STATUS_MESSAGE: { if (GetStatusMessage(text, text_size, contact, xstatus_has_priority) == -1 && use_name_and_message_for_xstatus) { DBVARIANT dbv; // Try to get XStatusName if (!DBGetContactSettingTString(contact->hContact, contact->proto, "XStatusName", &dbv)) { if (dbv.pszVal != NULL && dbv.pszVal[0] != 0) { TCHAR *tmp = mir_strdupT(text); mir_sntprintf(text, text_size, TEXT("%s: %s"), dbv.pszVal, tmp); mir_free(tmp); } DBFreeVariant(&dbv); } } break; } case TEXT_TEXT: { #ifndef UNICODE if (!ServiceExists(MS_VARS_FORMATSTRING)) { lstrcpyn(text, variable_text, text_size); } else { char *tmp = variables_parse(variable_text, contact->szText, contact->hContact); lstrcpyn(text, tmp, text_size); variables_free(tmp); } #else lstrcpyn(text, variable_text, text_size); #endif break; } case TEXT_CONTACT_TIME: { if (contact->timezone != -1 && (!contact_time_show_only_if_different || contact->timediff != 0)) { // Get contact time DBTIMETOSTRINGT dbtts; time_t contact_time; contact_time = time(NULL) - contact->timediff; text[0] = '\0'; dbtts.szDest = text; dbtts.cbDest = 70; dbtts.szFormat = TEXT("t"); CallService(MS_DB_TIME_TIMESTAMPTOSTRINGT, contact_time, (LPARAM) & dbtts); } break; } } if (type==TEXT_STATUS_MESSAGE && show_status_if_no_away && text[0] == '\0') { //re-request status if no away Cache_GetLineText(contact, TEXT_STATUS, text, text_size, variable_text, xstatus_has_priority,0, use_name_and_message_for_xstatus, contact_time_show_only_if_different); } }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l) { MCONTACT hContact = (MCONTACT)w; if (!l) //fix potential DEP crash return 0; DBEVENTINFO * dbei = (DBEVENTINFO*)l; // if event is in protocol that is not despammed if (!ProtoInList(dbei->szModule)) { // ...let the event go its way return 0; } //do not check excluded contact if (db_get_b(hContact, pluginName, "Answered", 0)) return 0; if (db_get_b(hContact, pluginName, "Excluded", 0)) { if (!db_get_b(hContact, "CList", "NotOnList", 0)) db_unset(hContact, pluginName, "Excluded"); return 0; } //we want block not only messages, i seen many types other eventtype flood if (dbei->flags & DBEF_READ) // ...let the event go its way return 0; //mark contact which we trying to contact for exclude from check if ((dbei->flags & DBEF_SENT) && db_get_b(hContact, "CList", "NotOnList", 0) && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount) && gbExclude) { db_set_b(hContact, pluginName, "Excluded", 1); return 0; } // if message is from known or marked Answered contact if (!db_get_b(hContact, "CList", "NotOnList", 0)) // ...let the event go its way return 0; // if message is corrupted or empty it cannot be an answer. if (!dbei->cbBlob || !dbei->pBlob) // reject processing of the event return 1; tstring message; if (dbei->flags & DBEF_UTF) { wchar_t* msg_u; char* msg_a = mir_strdup((char*)dbei->pBlob); mir_utf8decode(msg_a, &msg_u); message = msg_u; } else message = mir_a2u((char*)(dbei->pBlob)); // if message contains right answer... boost::algorithm::erase_all(message, "\r"); boost::algorithm::erase_all(message, "\n"); bool bSendMsg = true; if (gbInvisDisable) { if (CallProtoService(dbei->szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE) bSendMsg = false; else if (db_get_w(hContact, dbei->szModule, "ApparentMode", 0) == ID_STATUS_OFFLINE) bSendMsg = false; //is it useful ? } bool answered = false; if (gbMathExpression) { if (boost::algorithm::all(message, boost::is_digit())) { int num = _ttoi(message.c_str()); int math_answer = db_get_dw(hContact, pluginName, "MathAnswer", 0); if (num && math_answer) answered = (num == math_answer); } } else if (!gbRegexMatch) answered = gbCaseInsensitive ? (!Stricmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str()))) : (!mir_tstrcmp(message.c_str(), (variables_parse(gbAnswer, hContact).c_str()))); else { if (gbCaseInsensitive) { std::string check(toUTF8(variables_parse(gbAnswer, hContact))), msg(toUTF8(message)); boost::algorithm::to_upper(check); boost::algorithm::to_upper(msg); boost::regex expr(check); answered = boost::regex_search(msg.begin(), msg.end(), expr); } else { std::string check(toUTF8(variables_parse(gbAnswer, hContact))), msg(toUTF8(message)); boost::regex expr(check); answered = boost::regex_search(msg.begin(), msg.end(), expr); } } if (answered) { // unhide contact db_unset(hContact, "CList", "Hidden"); db_unset(hContact, pluginName, "MathAnswer"); // mark contact as Answered db_set_b(hContact, pluginName, "Answered", 1); //add contact permanently if (gbAddPermanent) //do not use this ) db_unset(hContact, "CList", "NotOnList"); // send congratulation if (bSendMsg) { tstring prot = DBGetContactSettingStringPAN(NULL, dbei->szModule, "AM_BaseProto", _T("")); // for notICQ protocols or disable auto auth. reqwest if ((Stricmp(_T("ICQ"), prot.c_str())) || (!gbAutoReqAuth)) { char * buf = mir_utf8encodeW(variables_parse(gbCongratulation, hContact).c_str()); CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)buf); mir_free(buf); } // Note: For ANSI can be not work if (!Stricmp(_T("ICQ"), prot.c_str())) { // grand auth. if (gbAutoAuth) CallProtoService(dbei->szModule, "/GrantAuth", w, 0); // add contact to server list and local group if (gbAutoAddToServerList) { db_set_ws(hContact, "CList", "Group", gbAutoAuthGroup.c_str()); CallProtoService(dbei->szModule, "/AddServerContact", w, 0); db_unset(hContact, "CList", "NotOnList"); }; // auto auth. reqwest with send congratulation if (gbAutoReqAuth) CallContactService(hContact, PSS_AUTHREQUEST, 0, (LPARAM)variables_parse(gbCongratulation, hContact).c_str()); } } return 0; } // URL contains check bSendMsg = (bSendMsg && gbIgnoreURL) ? (!IsUrlContains((TCHAR *)message.c_str())) : bSendMsg; // if message message does not contain infintite talk protection prefix // and question count for this contact is less then maximum if (bSendMsg) { if ((!gbInfTalkProtection || tstring::npos == message.find(_T("StopSpam automatic message:\r\n"))) && (!gbMaxQuestCount || db_get_dw(hContact, pluginName, "QuestionCount", 0) < gbMaxQuestCount)) { // send question tstring q; if (gbInfTalkProtection) q += _T("StopSpam automatic message:\r\n"); if (gbMathExpression) { //parse math expression in question tstring tmp_question = gbQuestion; std::list<int> args; std::list<TCHAR> actions; tstring::size_type p1 = gbQuestion.find(_T("X")), p2 = 0; const tstring expr_chars = _T("X+-/*"), expr_acts = _T("+-/*"); while (p1 < gbQuestion.length() && p1 != tstring::npos && expr_chars.find(gbQuestion[p1]) != tstring::npos) { std::string arg; p2 = p1; for (p1 = gbQuestion.find(_T("X"), p1); (p1 < gbQuestion.length()) && (gbQuestion[p1] == L'X'); ++p1) arg += get_random_num(1); tmp_question.replace(p2, arg.size(), toUTF16(arg)); args.push_back(atoi(arg.c_str())); if ((p1 < gbQuestion.length()) && (p1 != tstring::npos) && (expr_acts.find(gbQuestion[p1]) != tstring::npos)) actions.push_back(gbQuestion[p1]); ++p1; } int math_answer = 0; math_answer = args.front(); args.pop_front(); while (!args.empty()) { if (!actions.empty()) { switch (actions.front()) { case _T('+'): { math_answer += args.front(); args.pop_front(); } break; case _T('-'): { math_answer -= args.front(); args.pop_front(); } break; case _T('/'): { math_answer /= args.front(); args.pop_front(); } break; case _T('*'): { math_answer *= args.front(); args.pop_front(); } break; } actions.pop_front(); } else break; } db_set_dw(hContact, pluginName, "MathAnswer", math_answer); q += variables_parse(tmp_question, hContact); } else q += variables_parse(gbQuestion, hContact); CallContactService(hContact, PSS_MESSAGE, 0, ptrA(mir_utf8encodeW(q.c_str()))); // increment question count DWORD questCount = db_get_dw(hContact, pluginName, "QuestionCount", 0); db_set_dw(hContact, pluginName, "QuestionCount", questCount + 1); } else { if (gbIgnoreContacts) db_set_dw(hContact, "Ignore", "Mask1", 0x0000007F); } } if (gbHideContacts) db_set_b(hContact, "CList", "Hidden", 1); if (gbSpecialGroup) db_set_ws(hContact, "CList", "Group", gbSpammersGroup.c_str()); db_set_b(hContact, "CList", "NotOnList", 1); // save first message from contact if (db_get_dw(hContact, pluginName, "QuestionCount", 0) < 2) { dbei->flags |= DBEF_READ; db_event_add(hContact, dbei); }; // reject processing of the event LogSpamToFile(hContact, message); return 1; }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_FILTER_ADD, w, l) { MCONTACT hContact = (MCONTACT)w; DBEVENTINFO *dbei = (DBEVENTINFO*)l; if (dbei == NULL) //fix potential DEP crash return 0; // if event is in protocol that is not despammed if (plSets->ProtoDisabled(dbei->szModule)) // ...let the event go its way return 0; // if event is not a message, or if the message has been read or sent... if (dbei->flags & DBEF_SENT || dbei->flags & DBEF_READ || dbei->eventType != EVENTTYPE_MESSAGE) // ...let the event go its way return 0; // if message is from known or marked Answered contact if (db_get_b(hContact, pluginName, answeredSetting, 0)) // ...let the event go its way return 0; // checking if message from self-added contact //Contact in Not in list icq group if (!db_get_b(hContact, "CList", "NotOnList", 0) && db_get_w(hContact, dbei->szModule, "SrvGroupId", -1) != 1) return 0; //if I sent message to this contact if (IsExistMyMessage(hContact)) return 0; // if message is corrupted or empty it cannot be an answer. if (!dbei->cbBlob || !dbei->pBlob) // reject processing of the event return 1; tstring message; if (dbei->flags & DBEF_UTF){ WCHAR* msg_u = mir_utf8decodeW((char*)dbei->pBlob); message = msg_u; mir_free(msg_u); } else { WCHAR* msg_u = mir_a2u((char*)(dbei->pBlob)); message = msg_u; mir_free(msg_u); } // if message equal right answer... tstring answers = variables_parse(plSets->Answer.Get(), hContact); answers.append(plSets->AnswSplitString.Get()); tstring::size_type pos = 0; tstring::size_type prev_pos = 0; while ((pos = answers.find(plSets->AnswSplitString.Get(), pos)) != tstring::npos) { // get one of answers and trim witespace chars tstring answer = trim(answers.substr(prev_pos, pos - prev_pos)); // if answer not empty if (answer.length() > 0) { // if message equal right answer... if (plSets->AnswNotCaseSens.Get() ? !mir_tstrcmpi(message.c_str(), answer.c_str()) : !mir_tstrcmp(message.c_str(), answer.c_str())) { // unhide contact db_unset(hContact, "CList", "Hidden"); // mark contact as Answered db_set_b(hContact, pluginName, answeredSetting, 1); //add contact permanently if (plSets->AddPermanent.Get()) db_unset(hContact, "CList", "NotOnList"); // send congratulation char * buf = mir_utf8encodeW(variables_parse(plSets->Congratulation.Get(), hContact).c_str()); CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)buf); mir_free(buf); // process the event return 1; } } prev_pos = ++pos; } // if message message does not contain infintite talk protection prefix // and question count for this contact is less then maximum if ((!plSets->InfTalkProtection.Get() || tstring::npos == message.find(infTalkProtPrefix)) && (!plSets->MaxQuestCount.Get() || db_get_dw(hContact, pluginName, questCountSetting, 0) < plSets->MaxQuestCount.Get())) { // send question tstring q = infTalkProtPrefix + variables_parse((tstring)(plSets->Question), hContact); char * buf = mir_utf8encodeW(q.c_str()); CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)buf); mir_free(buf); // increment question count DWORD questCount = db_get_dw(hContact, pluginName, questCountSetting, 0); db_set_dw(hContact, pluginName, questCountSetting, questCount + 1); } // hide contact from contact list db_set_b(hContact, "CList", "NotOnList", 1); db_set_b(hContact, "CList", "Hidden", 1); // save message from contact dbei->flags |= DBEF_READ; db_event_add(hContact, dbei); // reject processing of the event return 1; }
INT addEvent(WPARAM hContact, LPARAM hDBEvent) { BOOL fEnabled = db_get_b(NULL, protocolname, KEY_ENABLED, 1); if (!fEnabled || !hContact || !hDBEvent) return FALSE; /// unspecifyed error char* pszProto = GetContactProto(hContact); int status = CallProtoService(pszProto, PS_GETSTATUS, 0, 0); if (status == ID_STATUS_ONLINE || status == ID_STATUS_FREECHAT || status == ID_STATUS_INVISIBLE) return FALSE; // detect size of msg DBEVENTINFO dbei = { sizeof(dbei) }; if (db_event_get(hDBEvent, &dbei)) return 0; if ((dbei.eventType != EVENTTYPE_MESSAGE) || (dbei.flags == DBEF_READ)) { // we need EVENTTYPE_MESSAGE event.. return FALSE; } else { // needed event has occured.. if (!dbei.cbBlob) /// invalid size return FALSE; TCHAR *ptszVal = db_get_tsa(hContact, "Protocol", "p"); if (ptszVal == NULL) // Contact with no protocol ?!! return FALSE; mir_free(ptszVal); if (db_get_b(hContact, "CList", "NotOnList", 0)) return FALSE; if (db_get_b(hContact, protocolname, "TurnedOn", 0)) return FALSE; if (!(dbei.flags & DBEF_SENT)) { int timeBetween = time(NULL) - db_get_dw(hContact, protocolname, "LastReplyTS", 0); if (timeBetween > interval || db_get_w(hContact, protocolname, "LastStatus", 0) != status) { size_t msgLen = 1; int isQun = db_get_b(hContact, pszProto, "IsQun", 0); if (isQun) return FALSE; char szStatus[6] = { 0 }; mir_snprintf(szStatus, "%d", status); ptszVal = db_get_tsa(NULL, protocolname, szStatus); if (ptszVal) { if (*ptszVal) { CMString ptszTemp; TCHAR *ptszNick = db_get_tsa(hContact, pszProto, "Nick"); if (ptszNick == 0) { mir_free(ptszVal); return FALSE; } msgLen += mir_tstrlen(ptszVal); TCHAR *ptszHead = db_get_tsa(NULL, protocolname, KEY_HEADING); if (ptszHead != NULL) { ptszTemp = ptszHead; ptszTemp.Replace(_T("%user%"), ptszNick); msgLen += mir_tstrlen(ptszTemp); mir_free(ptszHead); } TCHAR *ptszTemp2 = (TCHAR*)mir_alloc(sizeof(TCHAR) * (msgLen + 5)); mir_sntprintf(ptszTemp2, msgLen + 5, _T("%s\r\n\r\n%s"), ptszTemp.c_str(), ptszVal); if (ServiceExists(MS_VARS_FORMATSTRING)) { ptszTemp = variables_parse(ptszTemp2, 0, hContact); } else ptszTemp = Utils_ReplaceVarsT(ptszTemp2); T2Utf pszUtf(ptszTemp); CallContactService(hContact, PSS_MESSAGE, 0, pszUtf); dbei.cbSize = sizeof(dbei); dbei.eventType = EVENTTYPE_MESSAGE; dbei.flags = DBEF_UTF | DBEF_SENT; //DBEF_READ; dbei.szModule = pszProto; dbei.timestamp = time(NULL); dbei.cbBlob = (int)mir_strlen(pszUtf) + 1; dbei.pBlob = (PBYTE)pszUtf; db_event_add(hContact, &dbei); mir_free(ptszTemp2); mir_free(ptszNick); } mir_free(ptszVal); } } } db_set_dw(hContact, protocolname, "LastReplyTS", time(NULL)); db_set_w(hContact, protocolname, "LastStatus", status); } return 0; }
void Protocol::GetStatusMsg(int aStatus, char *msg, size_t msg_size) { if (!CanGetStatusMsg()) { lstrcpyn(msg, "", msg_size); return; } bool isCurrentStatus = (aStatus == GetStatus()); if (isCurrentStatus && CanCall(PS_GETMYAWAYMSG)) { char *tmp = (char *) Call(PS_GETMYAWAYMSG); lstrcpyn(msg, tmp == NULL ? "" : tmp, msg_size); } else if (isCurrentStatus && ServiceExists(MS_SA_ISSARUNNING) && CallService(MS_SA_ISSARUNNING, 0, 0)) { char *tmp = (char *) CallService(MS_AWAYMSG_GETSTATUSMSG, (WPARAM) ID_STATUS_CURRENT, (LPARAM) name.c_str()); if (tmp != NULL) { lstrcpyn(msg, tmp, msg_size); mir_free(tmp); } else lstrcpyn(msg, "", msg_size); } else if (ServiceExists(MS_NAS_GETSTATE)) { NAS_PROTOINFO pi; ZeroMemory(&pi, sizeof(pi)); pi.cbSize = sizeof(NAS_PROTOINFO); pi.szProto = (char *) name.c_str(); pi.status = (isCurrentStatus ? 0 : aStatus); pi.szMsg = NULL; if (CallService(MS_NAS_GETSTATE, (WPARAM) &pi, 1) == 0) { if (pi.szMsg == NULL) { pi.szProto = NULL; if (CallService(MS_NAS_GETSTATE, (WPARAM) &pi, 1) == 0) { if (pi.szMsg != NULL) { lstrcpyn(msg, pi.szMsg, msg_size); mir_free(pi.szMsg); } else lstrcpyn(msg, "", msg_size); } else lstrcpyn(msg, "", msg_size); } else // if (pi.szMsg != NULL) { lstrcpyn(msg, pi.szMsg, msg_size); mir_free(pi.szMsg); } } else lstrcpyn(msg, "", msg_size); if (ServiceExists(MS_VARS_FORMATSTRING)) { char *tmp = variables_parse(msg, NULL, NULL); lstrcpyn(msg, tmp, msg_size); variables_free(tmp); } } // TODO: Remove when removing old NAS services support else if (ServiceExists("NewAwaySystem/GetState")) { NAS_PROTOINFO pi, *pii; ZeroMemory(&pi, sizeof(pi)); pi.cbSize = sizeof(NAS_PROTOINFO); pi.szProto = (char *) name.c_str(); pi.status = (isCurrentStatus ? 0 : aStatus); pi.szMsg = NULL; pii = π if (CallService("NewAwaySystem/GetState", (WPARAM) &pii, 1) == 0) { if (pi.szMsg == NULL) { pi.szProto = NULL; if (CallService("NewAwaySystem/GetState", (WPARAM) &pii, 1) == 0) { if (pi.szMsg != NULL) { lstrcpyn(msg, pi.szMsg, msg_size); mir_free(pi.szMsg); } else lstrcpyn(msg, "", msg_size); } else lstrcpyn(msg, "", msg_size); } else // if (pi.szMsg != NULL) { lstrcpyn(msg, pi.szMsg, msg_size); mir_free(pi.szMsg); } } else lstrcpyn(msg, "", msg_size); if (ServiceExists(MS_VARS_FORMATSTRING)) { char *tmp = variables_parse(msg, NULL, NULL); lstrcpyn(msg, tmp, msg_size); variables_free(tmp); } } else if (ServiceExists(MS_AWAYMSG_GETSTATUSMSG)) { char *tmp = (char *) CallService(MS_AWAYMSG_GETSTATUSMSG, (WPARAM)aStatus, 0); if (tmp != NULL) { lstrcpyn(msg, tmp, msg_size); mir_free(tmp); } else lstrcpyn(msg, "", msg_size); } }
LRESULT CALLBACK ListenWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg){ case WM_WTSSESSION_CHANGE: if (wParam == WTS_SESSION_LOCK && g_wMaskAdv & OPT_HIDEIFLOCK && !g_bWindowHidden) // Windows locked PostMessage(hWnd,WM_USER + 40, 0, 0); return 0; case WM_USER + 24: if (lParam == WM_LBUTTONDBLCLK) PostMessage(hWnd,WM_USER + 52, 0, 0); return 0; case WM_USER+40: // hide { if (g_bWindowHidden || g_fOptionsOpen) // already hidden or in options, no hiding break; DWORD dwWndPID; // remember foreground window HWND hForegroundWnd = GetForegroundWindow(); GetWindowThreadProcessId(hForegroundWnd,&dwWndPID); if (g_dwMirandaPID == dwWndPID) hOldForegroundWindow = hForegroundWnd; EnumWindows(EnumWindowsProc, 0); if (g_wMask & OPT_CHANGESTATUS) // is this even needed? { BYTE bReqMode = db_get_b(NULL, MOD_NAME, "stattype", 2); unsigned uMode = (STATUS_ARR_TO_ID[bReqMode]); DBVARIANT dbVar; if (g_wMask & OPT_USEDEFMSG || db_get_ts(NULL,MOD_NAME,"statmsg",&dbVar)) { TCHAR *ptszDefMsg = GetDefStatusMsg(uMode, 0); ChangeAllProtoStatuses(uMode, ptszDefMsg); mir_free(ptszDefMsg); } else { if (ServiceExists(MS_VARS_FORMATSTRING)) { TCHAR *ptszParsed = variables_parse(dbVar.ptszVal, 0, 0); ChangeAllProtoStatuses(uMode, ptszParsed); mir_free(ptszParsed); } else ChangeAllProtoStatuses(uMode, dbVar.ptszVal); db_free(&dbVar); } } pcli->pfnTrayIconDestroy (pcli->hwndContactList); pcli->pfnUninitTray(); if (g_wMask & OPT_TRAYICON) CreateTrayIcon(true); // disable popups if (CallService(MS_POPUP_QUERY, PUQS_GETSTATUS, 0) == 1) { // save current g_bOldSetting |= OLD_POPUP; CallService(MS_POPUP_QUERY, PUQS_DISABLEPOPUPS, 0); } // disable sounds if ((g_wMask & OPT_DISABLESNDS) && db_get_b(NULL,"Skin","UseSound",1)) { // save current g_bOldSetting |= OLD_SOUND; db_set_b(NULL,"Skin","UseSound",0); } g_bWindowHidden = true; g_bOldSetting |= OLD_WASHIDDEN; db_set_b(NULL, MOD_NAME, "OldSetting", g_bOldSetting); } return 0; case WM_USER+52: // back { if (!g_bWindowHidden || g_fPassRequested) break; if (g_wMask & OPT_REQPASS){ //password request DBVARIANT dbVar; if (!db_get_s(NULL,MOD_NAME, "password", &dbVar)) { g_fPassRequested = true; strncpy(g_password, dbVar.pszVal, MAXPASSLEN); db_free(&dbVar); int res = DialogBox(g_hInstance,(MAKEINTRESOURCE(IDD_PASSDIALOGNEW)),GetForegroundWindow(), DlgStdInProc); g_fPassRequested = false; if(res != IDOK) return 0; } } if (g_wMask & OPT_CHANGESTATUS && g_wMask & OPT_SETONLINEBACK) // set back to some status BackAllProtoStatuses(); HWND_ITEM *pCurWnd = g_pMirWnds; while (pCurWnd != NULL) { HWND_ITEM *pNextWnd = pCurWnd->next; TCHAR szTemp[32]; GetClassName(pCurWnd->hWnd,szTemp,32); if (IsWindow(pCurWnd->hWnd) && lstrcmp(szTemp,_T("SysShadow")) != 0) // precaution ShowWindow(pCurWnd->hWnd, SW_SHOW); delete pCurWnd; // bye-bye pCurWnd = pNextWnd; // traverse to next item } g_pMirWnds = NULL; if (hOldForegroundWindow) { SetForegroundWindow(hOldForegroundWindow); hOldForegroundWindow = NULL; } RestoreOldSettings(); if (g_TrayIcon) CreateTrayIcon(false); pcli->pfnInitTray(); pcli->pfnTrayIconInit(pcli->hwndContactList); // force a redraw // should prevent drawing problems InvalidateRect(pcli->hwndContactList,NULL,true); UpdateWindow(pcli->hwndContactList); PostMessage(hWnd, WM_MOUSEMOVE, 0, (LPARAM)MAKELONG(2, 2)); // reset core's IDLE g_bWindowHidden = false; db_set_b(NULL, MOD_NAME, "OldSetting", 0); } return 0; } return(DefWindowProc(hWnd, uMsg, wParam, lParam)); }