/** Return true on success, false on error. */ bool FacebookProto::NegotiateConnection() { debugLogA("*** Negotiating connection with Facebook"); ptrA username(getStringA(FACEBOOK_KEY_LOGIN)); if (!username || !mir_strlen(username)) { NotifyEvent(m_tszUserName, TranslateT("Please enter a username."), NULL, FACEBOOK_EVENT_CLIENT); return false; } ptrA password(getStringA(FACEBOOK_KEY_PASS)); if (!password || !*password) { NotifyEvent(m_tszUserName, TranslateT("Please enter a password."), NULL, FACEBOOK_EVENT_CLIENT); return false; } password = mir_utf8encode(password); // Refresh last time of feeds update facy.last_feeds_update_ = ::time(NULL); // Generate random clientid for this connection facy.chat_clientid_ = utils::text::rand_string(8, "0123456789abcdef", &facy.random_); // Create default group for new contacts if (m_tszDefaultGroup) Clist_CreateGroup(0, m_tszDefaultGroup); return facy.login(username, password); }
INT_PTR CreateGroupHelper(WPARAM, LPARAM) { SendMessage((HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0), CLM_SETHIDEEMPTYGROUPS, 0, 0); SendMessage((HWND)CallService(MS_CLUI_GETHWNDTREE, 0, 0), CLM_SETUSEGROUPS, 1, 0); Clist_CreateGroup(0, 0); return 0; };
INT_PTR CreateGroupHelper(WPARAM, LPARAM) { SendMessage(cli.hwndContactTree, CLM_SETHIDEEMPTYGROUPS, 0, 0); SendMessage(cli.hwndContactTree, CLM_SETUSEGROUPS, 1, 0); Clist_CreateGroup(0, 0); return 0; }
/** * name: toDB * class: CExImContactBase * desc: searches the database for a contact representing the one * identified by this class or creates a new one if it was not found * param: hMetaContact - a meta contact to add this contact to * return: handle of the contact if successful **/ HANDLE CExImContactBase::toDB() { // create new contact if none exists if (_hContact == INVALID_HANDLE_VALUE && _pszProto && _pszUIDKey && _dbvUID.type != DBVT_DELETED) { PROTOACCOUNT* pszAccount = 0; if (NULL == (pszAccount = ProtoGetAccount( _pszProto ))) { //account does not exist _hContact = INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE; } if (!IsAccountEnabled(pszAccount)) { ; } // create new contact _hContact = DB::Contact::Add(); if (!_hContact) { _hContact = INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE; } // Add the protocol to the new contact if (CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)_hContact, (LPARAM)_pszProto)) { DB::Contact::Delete(_hContact); _hContact = INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE; } // write uid to protocol module if (db_set(_hContact, _pszProto, _pszUIDKey, &_dbvUID)) { DB::Contact::Delete(_hContact); _hContact = INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE; } // write nick and display name if (_pszNick) db_set_utf(_hContact, _pszProto, SET_CONTACT_NICK, _pszNick); if (_pszDisp) db_set_utf(_hContact, MOD_CLIST, SET_CONTACT_MYHANDLE, _pszDisp); // add group if (_pszGroup) { ptrT ptszGroup( mir_utf8decodeT(_pszGroup)); db_set_ts(_hContact, MOD_CLIST, "Group", ptszGroup); if ( Clist_GroupExists(ptszGroup) == NULL) { HANDLE hGroup = Clist_CreateGroup(NULL, NULL); if (hGroup) { // renaming twice is stupid but the only way to avoid error dialog telling shit like // a group with that name does exist CallService(MS_CLIST_GROUPRENAME, (WPARAM)hGroup, (LPARAM)ptszGroup); } } } } return _hContact; }
void CSkypeOptionsMain::OnApply() { ptrA szNewSkypename(m_skypename.GetTextA()), szOldSkypename(m_proto->getStringA(SKYPE_SETTINGS_ID)); pass_ptrA szNewPassword(m_password.GetTextA()), szOldPassword(m_proto->getStringA("Password")); if (mir_strcmpi(szNewSkypename, szOldSkypename) || mir_strcmp(szNewPassword, szOldPassword)) m_proto->delSetting("TokenExpiresIn"); m_proto->setString(SKYPE_SETTINGS_ID, szNewSkypename); m_proto->setString("Password", szNewPassword); ptrT group(m_group.GetText()); if (mir_tstrlen(group) > 0 && !Clist_GroupExists(group)) Clist_CreateGroup(0, group); }
void CToxOptionsMain::OnApply() { ptrT group(m_group.GetText()); if (mir_tstrlen(group) > 0 && Clist_GroupExists(group)) Clist_CreateGroup(0, group); if (m_proto->IsOnline()) { CallProtoService(m_proto->m_szModuleName, PS_SETMYNICKNAME, SMNN_TCHAR, (LPARAM)ptrT(m_nickname.GetText())); // todo: add checkbox m_proto->setTString("Password", pass_ptrT(m_password.GetText())); m_proto->SaveToxProfile(); } }
WhatsAppProto::WhatsAppProto(const char *proto_name, const TCHAR *username) : PROTO<WhatsAppProto>(proto_name, username), m_tszDefaultGroup(getTStringA(WHATSAPP_KEY_DEF_GROUP)) { update_loop_lock_ = CreateEvent(NULL, false, false, NULL); db_set_resident(m_szModuleName, "StatusMsg"); CreateProtoService(PS_CREATEACCMGRUI, &WhatsAppProto::SvcCreateAccMgrUI); CreateProtoService(PS_GETAVATARINFO, &WhatsAppProto::GetAvatarInfo); CreateProtoService(PS_GETAVATARCAPS, &WhatsAppProto::GetAvatarCaps); CreateProtoService(PS_GETMYAVATAR, &WhatsAppProto::GetMyAvatar); CreateProtoService(PS_SETMYAVATAR, &WhatsAppProto::SetMyAvatar); HookProtoEvent(ME_DB_CONTACT_DELETED, &WhatsAppProto::OnDeleteChat); HookProtoEvent(ME_OPT_INITIALISE, &WhatsAppProto::OnOptionsInit); HookProtoEvent(ME_CLIST_PREBUILDSTATUSMENU, &WhatsAppProto::OnBuildStatusMenu); // Create standard network connection TCHAR descr[512]; mir_sntprintf(descr, TranslateT("%s server connection"), m_tszUserName); NETLIBUSER nlu = { sizeof(nlu) }; nlu.flags = NUF_INCOMING | NUF_OUTGOING | NUF_HTTPCONNS | NUF_TCHAR; nlu.szSettingsModule = m_szModuleName; nlu.ptszDescriptiveName = descr; m_hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu); if (m_hNetlibUser == NULL) { TCHAR error[200]; mir_sntprintf(error, TranslateT("Unable to initialize Netlib for %s."), m_tszUserName); MessageBox(NULL, error, _T("Miranda NG"), MB_OK | MB_ICONERROR); } WASocketConnection::initNetwork(m_hNetlibUser); m_tszAvatarFolder = std::tstring(VARST(_T("%miranda_avatarcache%"))) + _T("\\") + m_tszUserName; DWORD dwAttributes = GetFileAttributes(m_tszAvatarFolder.c_str()); if (dwAttributes == 0xffffffff || (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) CreateDirectoryTreeT(m_tszAvatarFolder.c_str()); if (m_tszDefaultGroup == NULL) m_tszDefaultGroup = mir_tstrdup(_T("WhatsApp")); Clist_CreateGroup(0, m_tszDefaultGroup); SetAllContactStatuses(ID_STATUS_OFFLINE, true); }
void CSametimeProto::AddGroup(const char* name, bool expanded) { if (name && mir_strcmp(name, "MetaContacts Hidden Group") == 0) return; if (name && mir_strcmp(name, Translate("None")) == 0) return; ptrT ptszGroup(mir_utf8decodeT(name)); HANDLE hGroup = Clist_GroupExists(ptszGroup); if (hGroup == NULL) { hGroup = Clist_CreateGroup(NULL, ptszGroup); if (hGroup) { CallService(MS_CLUI_GROUPADDED, (WPARAM)hGroup, 0); CallService(MS_CLIST_GROUPSETEXPANDED, (WPARAM)hGroup, expanded ? 1 : 0); } } }
void CSteamOptionsMain::OnApply() { TCHAR *group = m_group.GetText(); if (mir_tstrlen(group) > 0 && !Clist_GroupExists(group)) Clist_CreateGroup(0, group); if (m_proto->IsOnline()) { // may be we should show message box with warning? m_proto->SetStatus(ID_STATUS_OFFLINE); } if (m_username.IsChanged()) { m_proto->delSetting("SteamID"); m_proto->delSetting("TokenSecret"); } if (m_password.IsChanged()) { m_proto->delSetting("TokenSecret"); } mir_free(group); }
CVkProto::CVkProto(const char *szModuleName, const TCHAR *ptszUserName) : PROTO<CVkProto>(szModuleName, ptszUserName), m_arRequestsQueue(10), m_sendIds(3, PtrKeySortT), m_cookies(5), m_msgId(1), m_chats(1, NumericKeySortT) { InitQueue(); CreateProtoService(PS_CREATEACCMGRUI, &CVkProto::SvcCreateAccMgrUI); CreateProtoService(PS_GETAVATARINFOT, &CVkProto::SvcGetAvatarInfo); CreateProtoService(PS_GETAVATARCAPS, &CVkProto::SvcGetAvatarCaps); HookProtoEvent(ME_OPT_INITIALISE, &CVkProto::OnOptionsInit); TCHAR descr[512]; mir_sntprintf(descr, SIZEOF(descr), TranslateT("%s server connection"), m_tszUserName); NETLIBUSER nlu = {sizeof(nlu)}; nlu.flags = NUF_INCOMING | NUF_OUTGOING | NUF_HTTPCONNS | NUF_TCHAR; nlu.szSettingsModule = m_szModuleName; nlu.szSettingsModule = m_szModuleName; nlu.ptszDescriptiveName = descr; m_hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu); m_defaultGroup = getTStringA("ProtoGroup"); if (m_defaultGroup == NULL) m_defaultGroup = mir_tstrdup(_T("VKontakte")); Clist_CreateGroup(NULL, m_defaultGroup); db_set_resident(m_szModuleName, "Status"); m_bServerDelivery = getBool("ServerDelivery", true); m_bHideChats = getBool("HideChats", true); // Set all contacts offline -- in case we crashed SetAllContactStatuses(ID_STATUS_OFFLINE); }
void CToxOptionsMain::ProfileCreate_OnClick(CCtrlButton*) { CToxThread toxThread; ptrT profilePath(m_proto->GetToxProfilePath()); if (!m_proto->IsFileExists(profilePath)) { HANDLE hProfile = CreateFile(profilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (hProfile == NULL) { m_proto->logger->Log(__FUNCTION__": failed to create tox profile"); return; } CloseHandle(hProfile); } if (m_proto->InitToxCore(&toxThread)) { ptrT group(m_group.GetText()); if (mir_tstrlen(group) > 0 && Clist_GroupExists(group)) Clist_CreateGroup(0, group); m_proto->UninitToxCore(&toxThread); m_toxAddress.Enable(); m_toxAddress.SetTextA(ptrA(m_proto->getStringA(TOX_SETTINGS_ID))); m_nickname.SetText(ptrT(m_proto->getTStringA("Nick"))); m_password.SetText(ptrT(m_proto->getTStringA("Password"))); m_group.SetText(ptrT(m_proto->getTStringA(TOX_SETTINGS_GROUP))); ShowWindow(m_profileCreate.GetHwnd(), FALSE); ShowWindow(m_profileImport.GetHwnd(), FALSE); ShowWindow(m_toxAddressCopy.GetHwnd(), TRUE); ShowWindow(m_profileExport.GetHwnd(), TRUE); } }
void TlenIqResultRoster(TlenProtocol *proto, XmlNode *iqNode) { XmlNode *queryNode; char *type; char *str; // RECVED: roster information // ACTION: populate LIST_ROSTER and create contact for any new rosters if ((type=TlenXmlGetAttrValue(iqNode, "type")) == NULL) return; if ((queryNode=TlenXmlGetChild(iqNode, "query")) == NULL) return; if (!strcmp(type, "result")) { str = TlenXmlGetAttrValue(queryNode, "xmlns"); if (str != NULL && !strcmp(str, "jabber:iq:roster")) { DBVARIANT dbv; XmlNode *itemNode, *groupNode; TLEN_SUBSCRIPTION sub; TLEN_LIST_ITEM *item; char *jid, *name, *nick; int i, oldStatus; for (i=0; i<queryNode->numChild; i++) { itemNode = queryNode->child[i]; if (!strcmp(itemNode->name, "item")) { str = TlenXmlGetAttrValue(itemNode, "subscription"); if (str == NULL) sub = SUB_NONE; else if (!strcmp(str, "both")) sub = SUB_BOTH; else if (!strcmp(str, "to")) sub = SUB_TO; else if (!strcmp(str, "from")) sub = SUB_FROM; else sub = SUB_NONE; //if (str != NULL && (!strcmp(str, "to") || !strcmp(str, "both"))) { if ((jid=TlenXmlGetAttrValue(itemNode, "jid")) != NULL) { if ((name=TlenXmlGetAttrValue(itemNode, "name")) != NULL) nick = TlenTextDecode(name); else nick = TlenLocalNickFromJID(jid); if (nick != NULL) { MCONTACT hContact; item = TlenListAdd(proto, LIST_ROSTER, jid); if (item->nick) mir_free(item->nick); item->nick = nick; item->subscription = sub; if ((hContact=TlenHContactFromJID(proto, jid)) == NULL) { // Received roster has a new JID. // Add the jid (with empty resource) to Miranda contact list. hContact = TlenDBCreateContact(proto, jid, nick, FALSE); } db_set_s(hContact, "CList", "MyHandle", nick); if (item->group) mir_free(item->group); if ((groupNode=TlenXmlGetChild(itemNode, "group")) != NULL && groupNode->text != NULL) { item->group = TlenGroupDecode(groupNode->text); Clist_CreateGroup(0, _A2T(item->group)); // Don't set group again if already correct, or Miranda may show wrong group count in some case if (!db_get(hContact, "CList", "Group", &dbv)) { if (strcmp(dbv.pszVal, item->group)) db_set_s(hContact, "CList", "Group", item->group); db_free(&dbv); } else db_set_s(hContact, "CList", "Group", item->group); } else { item->group = NULL; db_unset(hContact, "CList", "Group"); } if (!db_get(hContact, proto->m_szModuleName, "AvatarHash", &dbv)) { if (item->avatarHash) mir_free(item->avatarHash); item->avatarHash = mir_strdup(dbv.pszVal); proto->debugLogA("Setting hash [%s] = %s", nick, item->avatarHash); db_free(&dbv); } item->avatarFormat = db_get_dw(hContact, proto->m_szModuleName, "AvatarFormat", PA_FORMAT_UNKNOWN); } } } } // Delete orphaned contacts (if roster sync is enabled) if (db_get_b(NULL, proto->m_szModuleName, "RosterSync", FALSE) == TRUE) { for (MCONTACT hContact = db_find_first(proto->m_szModuleName); hContact; ) { MCONTACT hNext = hContact = db_find_next(hContact, proto->m_szModuleName); ptrA jid( db_get_sa(hContact, proto->m_szModuleName, "jid")); if (jid != NULL) { if (!TlenListExist(proto, LIST_ROSTER, jid)) { proto->debugLogA("Syncing roster: deleting 0x%x", hContact); CallService(MS_DB_CONTACT_DELETE, hContact, 0); } } hContact = hNext; } } CLISTMENUITEM mi = { sizeof(mi) }; mi.flags = CMIM_FLAGS; Menu_ModifyItem(proto->hMenuMUC, &mi); if (proto->hMenuChats != NULL) Menu_ModifyItem(proto->hMenuChats, &mi); proto->isOnline = TRUE; proto->debugLogA("Status changed via THREADSTART"); oldStatus = proto->m_iStatus; TlenSendPresence(proto, proto->m_iDesiredStatus); ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, proto->m_iStatus); } } }
INT_PTR CALLBACK FBOptionsProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { FacebookProto *proto = reinterpret_cast<FacebookProto*>(GetWindowLongPtr(hwnd, GWLP_USERDATA)); switch (message) { case WM_INITDIALOG: { TranslateDialogDefault(hwnd); proto = reinterpret_cast<FacebookProto*>(lparam); SetWindowLongPtr(hwnd, GWLP_USERDATA, lparam); ptrA login(db_get_sa(NULL, proto->ModuleName(), FACEBOOK_KEY_LOGIN)); if (login != NULL) SetDlgItemTextA(hwnd, IDC_UN, login); ptrA password(db_get_sa(NULL, proto->ModuleName(), FACEBOOK_KEY_PASS)); if (password != NULL) SetDlgItemTextA(hwnd, IDC_PW, password); if (!proto->isOffline()) { SendDlgItemMessage(hwnd, IDC_UN, EM_SETREADONLY, TRUE, 0); SendDlgItemMessage(hwnd, IDC_PW, EM_SETREADONLY, TRUE, 0); } SendDlgItemMessage(hwnd, IDC_GROUP, EM_LIMITTEXT, FACEBOOK_GROUP_NAME_LIMIT, 0); if (proto->m_tszDefaultGroup != NULL) SetDlgItemText(hwnd, IDC_GROUP, proto->m_tszDefaultGroup); LoadDBCheckState(proto, hwnd, IDC_SET_IGNORE_STATUS, FACEBOOK_KEY_DISABLE_STATUS_NOTIFY, DEFAULT_DISABLE_STATUS_NOTIFY); LoadDBCheckState(proto, hwnd, IDC_BIGGER_AVATARS, FACEBOOK_KEY_BIG_AVATARS, DEFAULT_BIG_AVATARS); LoadDBCheckState(proto, hwnd, IDC_NAME_AS_NICK, FACEBOOK_KEY_NAME_AS_NICK, DEFAULT_NAME_AS_NICK); } return TRUE; case WM_COMMAND: { switch (LOWORD(wparam)) { case IDC_NEWACCOUNTLINK: proto->OpenUrl(std::string(FACEBOOK_URL_HOMEPAGE)); return TRUE; case IDC_UN: case IDC_PW: case IDC_GROUP: if (HIWORD(wparam) == EN_CHANGE && (HWND)lparam == GetFocus()) SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; default: SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; case WM_NOTIFY: if (reinterpret_cast<NMHDR*>(lparam)->code == PSN_APPLY) { char str[128]; TCHAR tstr[128]; GetDlgItemTextA(hwnd, IDC_UN, str, _countof(str)); db_set_s(0, proto->ModuleName(), FACEBOOK_KEY_LOGIN, str); GetDlgItemTextA(hwnd, IDC_PW, str, _countof(str)); proto->setString(FACEBOOK_KEY_PASS, str); GetDlgItemText(hwnd, IDC_GROUP, tstr, _countof(tstr)); if (tstr[0] != '\0') { proto->m_tszDefaultGroup = mir_tstrdup(tstr); proto->setTString(FACEBOOK_KEY_DEF_GROUP, tstr); Clist_CreateGroup(0, tstr); } else { proto->delSetting(FACEBOOK_KEY_DEF_GROUP); proto->m_tszDefaultGroup = NULL; } StoreDBCheckState(proto, hwnd, IDC_SET_IGNORE_STATUS, FACEBOOK_KEY_DISABLE_STATUS_NOTIFY); StoreDBCheckState(proto, hwnd, IDC_BIGGER_AVATARS, FACEBOOK_KEY_BIG_AVATARS); StoreDBCheckState(proto, hwnd, IDC_NAME_AS_NICK, FACEBOOK_KEY_NAME_AS_NICK); return TRUE; } break; } return FALSE; }
BOOL CJabberProto::OnRosterPushRequest(HXML, CJabberIqInfo *pInfo) { HXML queryNode = pInfo->GetChildNode(); // RFC 3921 #7.2 Business Rules if (pInfo->GetFrom()) { TCHAR *szFrom = JabberPrepareJid(pInfo->GetFrom()); if (!szFrom) return TRUE; TCHAR *szTo = JabberPrepareJid(m_ThreadInfo->fullJID); if (!szTo) { mir_free(szFrom); return TRUE; } TCHAR *pDelimiter = _tcschr(szFrom, _T('/')); if (pDelimiter) *pDelimiter = 0; pDelimiter = _tcschr(szTo, _T('/')); if (pDelimiter) *pDelimiter = 0; BOOL bRetVal = mir_tstrcmp(szFrom, szTo) == 0; mir_free(szFrom); mir_free(szTo); // invalid JID if (!bRetVal) { debugLog(_T("<iq/> attempt to hack via roster push from %s"), pInfo->GetFrom()); return TRUE; } } JABBER_LIST_ITEM *item; MCONTACT hContact = NULL; const TCHAR *jid, *str; debugLogA("<iq/> Got roster push, query has %d children", XmlGetChildCount(queryNode)); for (int i = 0;; i++) { HXML itemNode = XmlGetChild(queryNode, i); if (!itemNode) break; if (mir_tstrcmp(XmlGetName(itemNode), _T("item")) != 0) continue; if ((jid = XmlGetAttrValue(itemNode, _T("jid"))) == NULL) continue; if ((str = XmlGetAttrValue(itemNode, _T("subscription"))) == NULL) continue; // we will not add new account when subscription=remove if (!mir_tstrcmp(str, _T("to")) || !mir_tstrcmp(str, _T("both")) || !mir_tstrcmp(str, _T("from")) || !mir_tstrcmp(str, _T("none"))) { const TCHAR *name = XmlGetAttrValue(itemNode, _T("name")); ptrT nick((name != NULL) ? mir_tstrdup(name) : JabberNickFromJID(jid)); if (nick != NULL) { if ((item = ListAdd(LIST_ROSTER, jid)) != NULL) { replaceStrT(item->nick, nick); HXML groupNode = XmlGetChild(itemNode, "group"); replaceStrT(item->group, XmlGetText(groupNode)); if ((hContact = HContactFromJID(jid, 0)) == NULL) { // Received roster has a new JID. // Add the jid (with empty resource) to Miranda contact list. hContact = DBCreateContact(jid, nick, FALSE, FALSE); } else setTString(hContact, "jid", jid); if (name != NULL) { ptrT tszNick(getTStringA(hContact, "Nick")); if (tszNick != NULL) { if (mir_tstrcmp(nick, tszNick) != 0) db_set_ts(hContact, "CList", "MyHandle", nick); else db_unset(hContact, "CList", "MyHandle"); } else db_set_ts(hContact, "CList", "MyHandle", nick); } else db_unset(hContact, "CList", "MyHandle"); if (!m_options.IgnoreRosterGroups) { if (item->group != NULL) { Clist_CreateGroup(0, item->group); db_set_ts(hContact, "CList", "Group", item->group); } else db_unset(hContact, "CList", "Group"); } } } } if ((item = ListGetItemPtr(LIST_ROSTER, jid)) != NULL) { if (!mir_tstrcmp(str, _T("both"))) item->subscription = SUB_BOTH; else if (!mir_tstrcmp(str, _T("to"))) item->subscription = SUB_TO; else if (!mir_tstrcmp(str, _T("from"))) item->subscription = SUB_FROM; else item->subscription = SUB_NONE; debugLog(_T("Roster push for jid=%s, set subscription to %s"), jid, str); // subscription = remove is to remove from roster list // but we will just set the contact to offline and not actually // remove, so that history will be retained. if (!mir_tstrcmp(str, _T("remove"))) { if ((hContact = HContactFromJID(jid)) != NULL) { SetContactOfflineStatus(hContact); ListRemove(LIST_ROSTER, jid); } } else if (isChatRoom(hContact)) db_unset(hContact, "CList", "Hidden"); else UpdateSubscriptionInfo(hContact, item); } } UI_SAFE_NOTIFY(m_pDlgServiceDiscovery, WM_JABBER_TRANSPORT_REFRESH); RebuildInfoFrame(); return TRUE; }
INT_PTR CALLBACK DlgProcOtherStuff(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwnd); { MCONTACT hContact = (MCONTACT)((PROPSHEETPAGE*)lParam)->lParam; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)hContact); if (!hContact) break; /* link*/ DBVARIANT dbv; if (!db_get_ts(hContact, MODNAME, "ProgramString", &dbv)) { SetDlgItemText(hwnd, IDC_LINK, dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, MODNAME, "ProgramParamsString", &dbv)) { SetDlgItemText(hwnd, IDC_PARAMS, dbv.ptszVal); db_free(&dbv); } /* group*/ TCHAR *szGroup; for (int i = 1; (szGroup = pcli->pfnGetGroupName(i, NULL)) != NULL; i++) SendDlgItemMessage(hwnd, IDC_GROUP, CB_INSERTSTRING, 0, LPARAM(szGroup)); if (!db_get_ts(hContact, "CList", "Group", &dbv)) { SetDlgItemText(hwnd, IDC_GROUP, dbv.ptszVal); db_free(&dbv); } /* icons */ CheckRadioButton(hwnd, 40072, 40080, db_get_w(hContact, MODNAME, "Icon", ID_STATUS_ONLINE)); SetWindowLongPtr(GetDlgItem(hwnd, CHK_ONLINE), GWLP_USERDATA, (LONG_PTR)Skin_LoadProtoIcon(MODNAME, ID_STATUS_ONLINE)); g_PrevBtnWndProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwnd, CHK_ONLINE), GWLP_WNDPROC, (LONG_PTR)ButtWndProc); for (int i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { SetWindowLongPtr(GetDlgItem(hwnd, i), GWLP_USERDATA, (LONG_PTR)Skin_LoadProtoIcon(MODNAME, i)); SetWindowLongPtr(GetDlgItem(hwnd, i), GWLP_WNDPROC, (LONG_PTR)ButtWndProc); } db_free(&dbv); /* timer */ CheckDlgButton(hwnd, CHK_USE_TIMER, db_get_b(hContact, MODNAME, "UseTimer", 0) ? BST_CHECKED : BST_UNCHECKED); if (db_get_w(hContact, MODNAME, "Timer", 15)) { CheckDlgButton(hwnd, CHK_USE_TIMER, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_TIMER), 1); TCHAR string[512]; SetDlgItemText(hwnd, IDC_TIMER, _itot(db_get_w(hContact, MODNAME, "Timer", 15), string, 10)); if (!db_get_w(NULL, MODNAME, "Timer", 1)) SetDlgItemText(hwnd, IDC_TIMER_INTERVAL_MSG, TranslateT("Non-IM Contact protocol timer is Disabled")); else { mir_sntprintf(string, TranslateT("Timer intervals... Non-IM Contact Protocol timer is %d seconds"), db_get_w(NULL, MODNAME, "Timer", 1)); SetDlgItemText(hwnd, IDC_TIMER_INTERVAL_MSG, string); } } /* always visible */ if (db_get_b(hContact, MODNAME, "AlwaysVisible", 0)) { CheckDlgButton(hwnd, IDC_ALWAYS_VISIBLE, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_VISIBLE_UNLESS_OFFLINE), 1); CheckDlgButton(hwnd, IDC_VISIBLE_UNLESS_OFFLINE, db_get_b(hContact, MODNAME, "VisibleUnlessOffline", 1) ? BST_CHECKED : BST_UNCHECKED); } } return TRUE; case WM_COMMAND: SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); switch (LOWORD(wParam)) { case IDC_ALWAYS_VISIBLE: if (IsDlgButtonChecked(hwnd, IDC_ALWAYS_VISIBLE)) { MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwnd, GWLP_USERDATA); EnableWindow(GetDlgItem(hwnd, IDC_VISIBLE_UNLESS_OFFLINE), 1); CheckDlgButton(hwnd, IDC_VISIBLE_UNLESS_OFFLINE, db_get_b(hContact, MODNAME, "VisibleUnlessOffline", 1) ? BST_CHECKED : BST_UNCHECKED); } else EnableWindow(GetDlgItem(hwnd, IDC_VISIBLE_UNLESS_OFFLINE), 0); break; case CHK_USE_TIMER: if (IsDlgButtonChecked(hwnd, CHK_USE_TIMER)) { MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwnd, GWLP_USERDATA); char string[4]; EnableWindow(GetDlgItem(hwnd, IDC_TIMER), 1); SetDlgItemTextA(hwnd, IDC_TIMER, _itoa(db_get_w(hContact, MODNAME, "Timer", 15), string, 10)); } else EnableWindow(GetDlgItem(hwnd, IDC_TIMER), 0); break; case IDC_OPEN_FILE: char szFileName[512]; if (Openfile(szFileName, 1)) SetDlgItemTextA(hwnd, IDC_LINK, szFileName); break; case IDC_OPEN_FOLDER: if (BrowseForFolder(hwnd, szFileName)) { mir_snprintf(szFileName, "%s ,/e", szFileName); SetDlgItemTextA(hwnd, IDC_LINK, "explorer.exe"); SetDlgItemTextA(hwnd, IDC_PARAMS, szFileName); } } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: int status = GetLCStatus(0, 0); MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (GetWindowTextLength(GetDlgItem(hwnd, IDC_LINK))) { char text[512]; GetDlgItemTextA(hwnd, IDC_LINK, text, _countof(text)); db_set_s(hContact, MODNAME, "ProgramString", text); WriteSetting(hContact, MODNAME, "ProgramString", MODNAME, "Program"); } else db_unset(hContact, MODNAME, "ProgramString"); if (GetWindowTextLength(GetDlgItem(hwnd, IDC_PARAMS))) { char text[512]; GetDlgItemTextA(hwnd, IDC_PARAMS, text, _countof(text)); db_set_s(hContact, MODNAME, "ProgramParamsString", text); WriteSetting(hContact, MODNAME, "ProgramParamsString", MODNAME, "ProgramParams"); } else db_unset(hContact, MODNAME, "ProgramParamsString"); if (GetWindowTextLength(GetDlgItem(hwnd, IDC_GROUP))) { TCHAR text[512]; GetDlgItemText(hwnd, IDC_GROUP, text, _countof(text)); Clist_CreateGroup(NULL, text); db_set_ts(hContact, "CList", "Group", text); } else db_unset(hContact, "CList", "Group"); for (int i = ID_STATUS_ONLINE; i <= ID_STATUS_OUTTOLUNCH; i++) if (IsDlgButtonChecked(hwnd, i)) db_set_w(hContact, MODNAME, "Icon", (WORD)i); /* set correct status */ if (status == ID_STATUS_ONLINE || status == ID_STATUS_AWAY || (status == db_get_w(hContact, MODNAME, "Icon", ID_STATUS_ONLINE))) db_set_w(hContact, MODNAME, "Status", (WORD)db_get_w(hContact, MODNAME, "Icon", ID_STATUS_ONLINE)); else db_set_w(hContact, MODNAME, "Status", ID_STATUS_OFFLINE); if (IsDlgButtonChecked(hwnd, CHK_USE_TIMER)) { if (GetWindowTextLength(GetDlgItem(hwnd, IDC_TIMER))) { TCHAR text[512]; GetDlgItemText(hwnd, IDC_TIMER, text, _countof(text)); db_set_w(hContact, MODNAME, "Timer", (WORD)_ttoi(text)); } else db_set_w(hContact, MODNAME, "Timer", 15); } else db_set_w(hContact, MODNAME, "Timer", 0); // always visible db_set_b(hContact, MODNAME, "AlwaysVisible", (BYTE)IsDlgButtonChecked(hwnd, IDC_ALWAYS_VISIBLE)); db_set_b(hContact, MODNAME, "VisibleUnlessOffline", (BYTE)IsDlgButtonChecked(hwnd, IDC_VISIBLE_UNLESS_OFFLINE)); } return TRUE; } break; } return FALSE; }
CVkProto::CVkProto(const char *szModuleName, const TCHAR *ptszUserName) : PROTO<CVkProto>(szModuleName, ptszUserName), m_arRequestsQueue(10, sttCompareAsyncHttpRequest), m_sendIds(3, PtrKeySortT), m_incIds(3, PtrKeySortT), m_cookies(5), m_msgId(1), m_chats(1, NumericKeySortT) { InitQueue(); CreateProtoService(PS_CREATEACCMGRUI, &CVkProto::SvcCreateAccMgrUI); CreateProtoService(PS_GETAVATARINFO, &CVkProto::SvcGetAvatarInfo); CreateProtoService(PS_GETAVATARCAPS, &CVkProto::SvcGetAvatarCaps); CreateProtoService(PS_GETMYAVATAR, &CVkProto::SvcGetMyAvatar); CreateProtoService(PS_SET_LISTENINGTO, &CVkProto::SvcSetListeningTo); HookProtoEvent(ME_OPT_INITIALISE, &CVkProto::OnOptionsInit); TCHAR descr[512]; mir_sntprintf(descr, TranslateT("%s server connection"), m_tszUserName); NETLIBUSER nlu = {sizeof(nlu)}; nlu.flags = NUF_INCOMING | NUF_OUTGOING | NUF_HTTPCONNS | NUF_TCHAR; nlu.szSettingsModule = m_szModuleName; nlu.ptszDescriptiveName = descr; m_hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu); m_defaultGroup = getTStringA("ProtoGroup"); if (m_defaultGroup == NULL) m_defaultGroup = mir_tstrdup(_T("VKontakte")); Clist_CreateGroup(NULL, m_defaultGroup); m_bServerDelivery = getBool("ServerDelivery", true); m_bHideChats = getBool("HideChats", true); m_bMesAsUnread = getBool("MesAsUnread"); m_bUseLocalTime = getBool("UseLocalTime"); m_bReportAbuse = getBool("ReportAbuseOnBanUser"); m_bClearServerHistory = getBool("ClearServerHistoryOnBanUser"); m_bRemoveFromFrendlist = getBool("RemoveFromFrendlistOnBanUser"); m_bRemoveFromClist = getBool("RemoveFromClistOnBanUser"); m_bPopUpSyncHistory = getBool("PopUpSyncHistory"); m_iMarkMessageReadOn = (MarkMsgReadOn)getByte("MarkMessageReadOn", markOnRead); m_bStikersAsSmyles = getBool("StikersAsSmyles"); m_bUserForceOnlineOnActivity = getBool("UserForceOnlineOnActivity"); m_iMusicSendMetod = (MusicSendMetod)getByte("MusicSendMetod", sendBroadcastOnly); m_iSyncHistoryMetod = (SyncHistoryMetod)getByte("SyncHistoryMetod", syncOff); CMStringA szListeningTo(m_szModuleName); szListeningTo += "Enabled"; db_set_b(NULL, "ListeningTo", szListeningTo, m_iMusicSendMetod == 0 ? 0 : 1); m_bNewsEnabled = getBool("NewsEnabled"); m_iMaxLoadNewsPhoto = getByte("MaxLoadNewsPhoto", 5); m_bNotificationsEnabled = getBool("NotificationsEnabled"); m_bNotificationsMarkAsViewed = getBool("NotificationsMarkAsViewed", true); m_bSpecialContactAlwaysEnabled = getBool("SpecialContactAlwaysEnabled"); m_iNewsInterval = getDword("NewsInterval", 15); m_iNotificationsInterval = getDword("NotificationsInterval", 1); m_iIMGBBCSupport = (IMGBBCSypport)getByte("IMGBBCSupport", imgNo); m_iBBCForNews = (BBCSupport)getByte("BBCForNews", bbcBasic); m_iBBCForAttachments = (BBCSupport)getByte("BBCForAttachments", bbcBasic); m_bUseBBCOnAttacmentsAsNews = getBool("UseBBCOnAttacmentsAsNews", true); m_bNewsAutoClearHistory = getBool("NewsAutoClearHistory"); m_iNewsAutoClearHistoryInterval = getDword("NewsAutoClearHistoryInterval", 60*60*24*3); m_bNewsFilterPosts = getBool("NewsFilterPosts", true); m_bNewsFilterPhotos = getBool("NewsFilterPhotos", true); m_bNewsFilterTags = getBool("NewsFilterTags", true); m_bNewsFilterWallPhotos = getBool("NewsFilterWallPhotos", true); m_bNewsSourceFriends = getBool("NewsSourceFriends", true); m_bNewsSourceGroups = getBool("NewsSourceGroups", true); m_bNewsSourcePages = getBool("NewsSourcePages", true); m_bNewsSourceFollowing = getBool("NewsSourceFollowing", true); m_bNewsSourceIncludeBanned = getBool("NewsSourceIncludeBanned"); m_bNewsSourceNoReposts = getBool("NewsSourceNoReposts"); m_bNotificationFilterComments = getBool("NotificationFilterComments", true); m_bNotificationFilterLikes = getBool("NotificationFilterLikes", true); m_bNotificationFilterReposts = getBool("NotificationFilterReposts", true); m_bNotificationFilterMentions = getBool("NotificationFilterMentions", true); m_bNotificationFilterInvites = getBool("NotificationFilterInvites", true); m_bUseNonStandardUrlEncode = getBool("UseNonStandardUrlEncode", true); m_iInvisibleInterval = getDword("InvisibleInterval", 10); m_bShortenLinksForAudio = getBool("ShortenLinksForAudio", true); m_bSplitFormatFwdMsg = getBool("SplitFormatFwdMsg", true); m_bSetBroadcast = false; m_bNeedSendOnline = false; delSetting("InviteGroupIds"); // Set all contacts offline -- in case we crashed SetAllContactStatuses(ID_STATUS_OFFLINE); { mir_cslock lck(csInstances); vk_Instances.insert(this); } }
void TlenResultSetRoster(TlenProtocol *proto, XmlNode *queryNode) { DBVARIANT dbv; XmlNode *itemNode, *groupNode; TLEN_LIST_ITEM *item; MCONTACT hContact; char *jid, *name, *nick; int i; char *str; for (i=0; i<queryNode->numChild; i++) { itemNode = queryNode->child[i]; if (!strcmp(itemNode->name, "item")) { if ((jid=TlenXmlGetAttrValue(itemNode, "jid")) != NULL) { str = TlenXmlGetAttrValue(itemNode, "subscription"); if (!strcmp(str, "remove")) { if ((hContact = TlenHContactFromJID(proto, jid)) != NULL) { if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) db_set_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE); } TlenListRemove(proto, LIST_ROSTER, jid); } else { item = TlenListAdd(proto, LIST_ROSTER, jid); if (item != NULL) { if (str == NULL) item->subscription = SUB_NONE; else if (!strcmp(str, "both")) item->subscription = SUB_BOTH; else if (!strcmp(str, "to")) item->subscription = SUB_TO; else if (!strcmp(str, "from")) item->subscription = SUB_FROM; else item->subscription = SUB_NONE; if ((name=TlenXmlGetAttrValue(itemNode, "name")) != NULL) { nick = TlenTextDecode(name); } else { nick = TlenLocalNickFromJID(jid); } if (nick != NULL) { if (item->nick) mir_free(item->nick); item->nick = nick; if ((hContact=TlenHContactFromJID(proto, jid)) == NULL) { // Received roster has a new JID. // Add the jid (with empty resource) to Miranda contact list. hContact = TlenDBCreateContact(proto, jid, nick, FALSE); } db_set_s(hContact, "CList", "MyHandle", nick); if (item->group) mir_free(item->group); if ((groupNode=TlenXmlGetChild(itemNode, "group")) != NULL && groupNode->text != NULL) { item->group = TlenGroupDecode(groupNode->text); Clist_CreateGroup(0, _A2T(item->group)); // Don't set group again if already correct, or Miranda may show wrong group count in some case if (!db_get(hContact, "CList", "Group", &dbv)) { if (strcmp(dbv.pszVal, item->group)) db_set_s(hContact, "CList", "Group", item->group); db_free(&dbv); } else db_set_s(hContact, "CList", "Group", item->group); } else { item->group = NULL; db_unset(hContact, "CList", "Group"); } } } } } } } }