void __cdecl CJabberProto::OnRenameGroup(DBCONTACTWRITESETTING *cws, HANDLE hContact) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, ptrT(getTStringA(hContact, "jid"))); if (item == NULL) return; ptrT tszNick(db_get_tsa(hContact, "CList", "MyHandle")); if (tszNick == NULL) tszNick = getTStringA(hContact, "Nick"); if (tszNick == NULL) tszNick = JabberNickFromJID(item->jid); if (tszNick == NULL) return; if (cws->value.type == DBVT_DELETED) { if (item->group != NULL) { debugLogA("Group set to nothing"); AddContactToRoster(item->jid, tszNick, NULL); } } else { TCHAR *p = sttSettingToTchar(cws); if (cws->value.pszVal != NULL && lstrcmp(p, item->group)) { debugLogA("Group set to %S", p); if (p) AddContactToRoster(item->jid, tszNick, p); } mir_free(p); } }
void CJabberDlgBookmarks::OpenBookmark() { int iItem = m_lvBookmarks.GetNextItem(-1, LVNI_SELECTED); if (iItem < 0) return; TCHAR *address = (TCHAR *)m_lvBookmarks.GetItemData(iItem); if (address == NULL) return; JABBER_LIST_ITEM *item = m_proto->ListGetItemPtr(LIST_BOOKMARK, address); if (item == NULL) return; if (!mir_tstrcmpi(item->type, _T("conference"))) { m_lvBookmarks.SetItemState(iItem, 0, LVIS_SELECTED); // Unselect the item /* some hack for using bookmark to transport not under XEP-0048 */ if (!_tcschr(item->jid, _T('@'))) //the room name is not provided let consider that it is transport and send request to registration m_proto->RegisterAgent(NULL, item->jid); else { TCHAR *room = NEWTSTR_ALLOCA(item->jid); TCHAR *server = _tcschr(room, _T('@')); *(server++) = 0; if (item->nick && *item->nick) m_proto->GroupchatJoinRoom(server, room, item->nick, item->password); else m_proto->GroupchatJoinRoom(server, room, ptrT(JabberNickFromJID(m_proto->m_szJabberJID)), item->password); } } else Utils_OpenUrlT(item->jid); }
void __cdecl CJabberProto::OnAddContactForever(DBCONTACTWRITESETTING *cws, HANDLE hContact) { if (cws->value.type != DBVT_DELETED && !(cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) return; ptrT jid(getTStringA(hContact, "jid")); if (jid == NULL) return; debugLogA("Add %S permanently to list", jid); ptrT nick(db_get_tsa(hContact, "CList", "MyHandle")); if (nick == NULL) nick = getTStringA(hContact, "Nick"); if (nick == NULL) nick = JabberNickFromJID(jid); if (nick == NULL) return; AddContactToRoster(jid, nick, ptrT(db_get_tsa(hContact, "CList", "Group"))); XmlNode xPresence(_T("presence")); xPresence << XATTR(_T("to"), LPCTSTR(jid)) << XATTR(_T("type"), _T("subscribe")); ptrT myNick(getTStringA(NULL, "Nick")); if (myNick != NULL) xPresence << XCHILD(_T("nick"), LPCTSTR(myNick)) << XATTR(_T("xmlns"), JABBER_FEAT_NICK); m_ThreadInfo->send(xPresence); SendGetVcard(jid); db_unset(hContact, "CList", "Hidden"); }
char *JabberLocalNickFromJID(const char *jid) { char *p; char *localNick; p = JabberNickFromJID(jid); localNick = JabberTextDecode(p); free(p); return localNick; }
int JabberGcInit( WPARAM wParam, LPARAM lParam ) { JABBER_LIST_ITEM* item = ( JABBER_LIST_ITEM* )wParam; GCSESSION gcw = {0}; GCEVENT gce = {0}; TCHAR* szNick = JabberNickFromJID( item->jid ); gcw.cbSize = sizeof(GCSESSION); gcw.iType = GCW_CHATROOM; gcw.pszModule = jabberProtoName; gcw.ptszName = szNick; gcw.ptszID = item->jid; gcw.dwFlags = GC_TCHAR; JCallService( MS_GC_NEWSESSION, NULL, (LPARAM)&gcw ); HANDLE hContact = JabberHContactFromJID( item->jid ); if ( hContact != NULL ) { DBVARIANT dbv; if ( !DBGetContactSettingTString( hContact, jabberProtoName, "MyNick", &dbv )) { if ( !lstrcmp( dbv.ptszVal, szNick )) JDeleteSetting( hContact, "MyNick" ); else JSetStringT( hContact, "MyNick", item->nick ); JFreeVariant( &dbv ); } else JSetStringT( hContact, "MyNick", item->nick ); } mir_free( szNick ); item->bChatActive = TRUE; GCDEST gcd = { jabberProtoName, NULL, GC_EVENT_ADDGROUP }; gcd.ptszID = item->jid; gce.cbSize = sizeof(GCEVENT); gce.pDest = &gcd; gce.dwFlags = GC_TCHAR; for ( int i = SIZEOF(sttRoles)-1; i >= 0; i-- ) { gce.ptszStatus = TranslateTS( sttRoles[i] ); JCallService(MS_GC_EVENT, NULL, ( LPARAM )&gce ); } gce.cbSize = sizeof(GCEVENT); gce.pDest = &gcd; gcd.iType = GC_EVENT_CONTROL; JCallService(MS_GC_EVENT, SESSION_INITDONE, (LPARAM)&gce); JCallService(MS_GC_EVENT, SESSION_ONLINE, (LPARAM)&gce); return 0; }
static BOOL CALLBACK JabberGroupchatInviteAcceptDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { switch ( msg ) { case WM_INITDIALOG: { JABBER_GROUPCHAT_INVITE_INFO *inviteInfo = ( JABBER_GROUPCHAT_INVITE_INFO * ) lParam; TranslateDialogDefault( hwndDlg ); SetWindowLong( hwndDlg, GWL_USERDATA, ( LONG ) inviteInfo ); SetDlgItemText( hwndDlg, IDC_FROM, inviteInfo->from ); SetDlgItemText( hwndDlg, IDC_ROOM, inviteInfo->roomJid ); if ( inviteInfo->reason != NULL ) SetDlgItemText( hwndDlg, IDC_REASON, inviteInfo->reason ); TCHAR* myNick = JabberNickFromJID( jabberJID ); SetDlgItemText( hwndDlg, IDC_NICK, myNick ); mir_free( myNick ); SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )iconBigList[0] ); } return TRUE; case WM_COMMAND: switch ( LOWORD( wParam )) { case IDC_ACCEPT: { JABBER_GROUPCHAT_INVITE_INFO *inviteInfo = ( JABBER_GROUPCHAT_INVITE_INFO * ) GetWindowLong( hwndDlg, GWL_USERDATA ); TCHAR text[128]; GetDlgItemText( hwndDlg, IDC_NICK, text, SIZEOF( text )); JabberAcceptGroupchatInvite( inviteInfo->roomJid, text, inviteInfo->password ); } // Fall through case IDCANCEL: case IDCLOSE: EndDialog( hwndDlg, 0 ); return TRUE; } break; case WM_CLOSE: EndDialog( hwndDlg, 0 ); break; } return FALSE; }
void JabberGroupchatProcessInvite( TCHAR* roomJid, TCHAR* from, TCHAR* reason, TCHAR* password ) { if ( roomJid == NULL ) return; if ( JGetByte( "AutoAcceptMUC", FALSE ) == FALSE ) { JABBER_GROUPCHAT_INVITE_INFO* inviteInfo = ( JABBER_GROUPCHAT_INVITE_INFO * ) mir_alloc( sizeof( JABBER_GROUPCHAT_INVITE_INFO )); inviteInfo->roomJid = mir_tstrdup( roomJid ); inviteInfo->from = mir_tstrdup( from ); inviteInfo->reason = mir_tstrdup( reason ); inviteInfo->password = mir_tstrdup( password ); mir_forkthread(( pThreadFunc )JabberGroupchatInviteAcceptThread, inviteInfo ); } else { TCHAR* myNick = JabberNickFromJID( jabberJID ); JabberAcceptGroupchatInvite( roomJid, myNick, password ); mir_free( myNick ); } }
void __cdecl CJabberProto::OnRenameGroup( DBCONTACTWRITESETTING* cws, HANDLE hContact ) { DBVARIANT jid, dbv; if ( JGetStringT( hContact, "jid", &jid )) return; JABBER_LIST_ITEM* item = ListGetItemPtr( LIST_ROSTER, jid.ptszVal ); JFreeVariant( &jid ); if ( item == NULL ) return; TCHAR* nick; if ( !DBGetContactSettingTString( hContact, "CList", "MyHandle", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else if ( !JGetStringT( hContact, "Nick", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else nick = JabberNickFromJID( item->jid ); if ( nick == NULL ) return; if ( cws->value.type == DBVT_DELETED ) { if ( item->group != NULL ) { Log( "Group set to nothing" ); AddContactToRoster( item->jid, nick, NULL ); } } else { TCHAR* p = sttSettingToTchar( cws ); if ( cws->value.pszVal != NULL && lstrcmp( p, item->group )) { Log( "Group set to " TCHAR_STR_PARAM, p ); if ( p ) AddContactToRoster( item->jid, nick, p ); } mir_free( p ); } mir_free( nick ); }
void __cdecl CJabberProto::OnAddContactForever( DBCONTACTWRITESETTING* cws, HANDLE hContact ) { if ( cws->value.type != DBVT_DELETED && !( cws->value.type==DBVT_BYTE && cws->value.bVal==0 )) return; DBVARIANT jid, dbv; if ( JGetStringT( hContact, "jid", &jid )) return; TCHAR *nick; Log( "Add " TCHAR_STR_PARAM " permanently to list", jid.pszVal ); if ( !DBGetContactSettingTString( hContact, "CList", "MyHandle", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else if ( !JGetStringT( hContact, "Nick", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else nick = JabberNickFromJID( jid.ptszVal ); if ( nick == NULL ) { JFreeVariant( &jid ); return; } if ( !DBGetContactSettingTString( hContact, "CList", "Group", &dbv )) { AddContactToRoster( jid.ptszVal, nick, dbv.ptszVal ); JFreeVariant( &dbv ); } else AddContactToRoster( jid.ptszVal, nick, NULL ); m_ThreadInfo->send( XmlNode( _T("presence")) << XATTR( _T("to"), jid.ptszVal ) << XATTR( _T("type"), _T("subscribe"))); SendGetVcard( jid.ptszVal ); mir_free( nick ); DBDeleteContactSetting( hContact, "CList", "Hidden" ); JFreeVariant( &jid ); }
void JabberGcQuit( JABBER_LIST_ITEM* item, int code, XmlNode* reason ) { TCHAR* szReason = NULL; if ( reason != NULL && reason->text != NULL ) szReason = reason->text; GCDEST gcd = { jabberProtoName, NULL, GC_EVENT_CONTROL }; gcd.ptszID = item->jid; GCEVENT gce = {0}; gce.cbSize = sizeof(GCEVENT); gce.ptszUID = item->jid; gce.ptszText = szReason; gce.dwFlags = GC_TCHAR; gce.pDest = &gcd; if ( code != 307 ) { JCallService( MS_GC_EVENT, SESSION_TERMINATE, ( LPARAM )&gce ); JCallService( MS_GC_EVENT, WINDOW_CLEARLOG, ( LPARAM )&gce ); } else { TCHAR* myNick = JabberNickFromJID( jabberJID ); JabberGcLogUpdateMemberStatus( item, myNick, NULL, GC_EVENT_KICK, reason ); mir_free( myNick ); JCallService( MS_GC_EVENT, SESSION_OFFLINE, ( LPARAM )&gce ); } DBDeleteContactSetting( JabberHContactFromJID( item->jid ), "CList", "Hidden" ); item->bChatActive = FALSE; if ( jabberOnline ) { TCHAR text[ 1024 ]; mir_sntprintf( text, SIZEOF( text ), _T("%s/%s"), item->jid, item->nick ); XmlNode p( "presence" ); p.addAttr( "to", text ); p.addAttr( "type", "unavailable" ); JabberSend( jabberThreadInfo->s, p ); JabberListRemove( LIST_CHATROOM, item->jid ); } }
void CJabberDlgGcJoin::OnInitDialog() { CSuper::OnInitDialog(); WindowSetIcon( m_hwnd, m_proto, "group" ); JabberGcRecentInfo *info = NULL; if ( m_jid ) info = new JabberGcRecentInfo( m_proto, m_jid ); else { OpenClipboard(m_hwnd); #ifdef UNICODE HANDLE hData = GetClipboardData(CF_UNICODETEXT); #else HANDLE hData = GetClipboardData(CF_TEXT); #endif if (hData) { TCHAR *buf = (TCHAR *)GlobalLock(hData); if (buf && _tcschr(buf, _T('@')) && !_tcschr(buf, _T(' '))) info = new JabberGcRecentInfo( m_proto, buf ); GlobalUnlock(hData); } CloseClipboard(); } if (info) { info->fillForm(m_hwnd); delete info; } DBVARIANT dbv; if ( !m_proto->JGetStringT( NULL, "Nick", &dbv )) { SetDlgItemText( m_hwnd, IDC_NICK, dbv.ptszVal ); JFreeVariant( &dbv ); } else { TCHAR* nick = JabberNickFromJID( m_proto->m_szJabberJID ); SetDlgItemText( m_hwnd, IDC_NICK, nick ); mir_free( nick ); } { TEXTMETRIC tm = {0}; HDC hdc = GetDC(m_hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(m_hwnd, hdc); sttTextLineHeight = tm.tmHeight; SendDlgItemMessage(m_hwnd, IDC_ROOM, CB_SETITEMHEIGHT, -1, sttTextLineHeight-1); } { LOGFONT lf = {0}; HFONT hfnt = (HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_GETFONT, 0, 0); GetObject(hfnt, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); } SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BM_SETIMAGE, IMAGE_ICON, (LPARAM)m_proto->LoadIconEx("bookmarks")); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONADDTOOLTIP, (WPARAM)"Bookmarks", 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASPUSHBTN, 0, 0); m_proto->ComboLoadRecentStrings(m_hwnd, IDC_SERVER, "joinWnd_rcSvr"); int i = 0; for ( ; i < 5; ++i) { TCHAR jid[JABBER_MAX_JID_LEN]; JabberGcRecentInfo info( m_proto ); if (info.loadRecent(i)) { mir_sntprintf(jid, SIZEOF(jid), _T("%s@%s (%s)"), info.room, info.server, info.nick ? info.nick : TranslateT("<no nick>") ); SetDlgItemText(m_hwnd, IDC_RECENT1+i, jid); } else { break; } } sttJoinDlgShowRecentItems(m_hwnd, i); }
void JabberGcLogUpdateMemberStatus( JABBER_LIST_ITEM* item, TCHAR* nick, TCHAR* jid, int action, XmlNode* reason ) { int statusToSet = 0; TCHAR* szReason = NULL; if ( reason != NULL && reason->text != NULL ) szReason = reason->text; TCHAR* myNick = (item->nick == NULL) ? NULL : mir_tstrdup( item->nick ); if ( myNick == NULL ) myNick = JabberNickFromJID( jabberJID ); GCDEST gcd = { jabberProtoName, 0, 0 }; gcd.ptszID = item->jid; GCEVENT gce = {0}; gce.cbSize = sizeof(GCEVENT); gce.ptszNick = nick; gce.ptszUID = nick; if (jid != NULL) gce.ptszUserInfo = jid; gce.ptszText = szReason; gce.dwFlags = GC_TCHAR; gce.pDest = &gcd; if ( item->bChatActive == 2 ) { gce.dwFlags |= GCEF_ADDTOLOG; gce.time = time(0); } switch( gcd.iType = action ) { case GC_EVENT_PART: break; case GC_EVENT_KICK: gce.ptszStatus = TranslateT( "Moderator" ); break; default: for ( int i=0; i < item->resourceCount; i++ ) { JABBER_RESOURCE_STATUS& JS = item->resource[i]; if ( !lstrcmp( nick, JS.resourceName )) { if ( action != GC_EVENT_JOIN ) { switch( action ) { case 0: gcd.iType = GC_EVENT_ADDSTATUS; case GC_EVENT_REMOVESTATUS: gce.dwFlags &= ~GCEF_ADDTOLOG; } gce.ptszText = TranslateT( "Moderator" ); } gce.ptszStatus = TranslateTS( sttRoles[ JS.role ] ); gce.bIsMe = ( lstrcmp( nick, myNick ) == 0 ); statusToSet = JS.status; break; } } } JCallService( MS_GC_EVENT, NULL, ( LPARAM )&gce ); if ( statusToSet != 0 ) { gce.ptszText = nick; if ( statusToSet == ID_STATUS_AWAY || statusToSet == ID_STATUS_NA || statusToSet == ID_STATUS_DND ) gce.dwItemData = 3; else gce.dwItemData = 1; gcd.iType = GC_EVENT_SETSTATUSEX; JCallService( MS_GC_EVENT, NULL, ( LPARAM )&gce ); } mir_free( myNick ); }
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; }
void CJabberDlgGcJoin::OnInitDialog() { CSuper::OnInitDialog(); Window_SetIcon_IcoLib(m_hwnd, g_GetIconHandle(IDI_GROUP)); JabberGcRecentInfo *pInfo = NULL; if (m_jid) pInfo = new JabberGcRecentInfo(m_proto, m_jid); else if (OpenClipboard(m_hwnd)) { HANDLE hData = GetClipboardData(CF_UNICODETEXT); if (hData) { TCHAR *buf = (TCHAR *)GlobalLock(hData); if (buf && _tcschr(buf, _T('@')) && !_tcschr(buf, _T(' '))) pInfo = new JabberGcRecentInfo(m_proto, buf); GlobalUnlock(hData); } CloseClipboard(); } if (pInfo) { pInfo->fillForm(m_hwnd); delete pInfo; } ptrT tszNick(m_proto->getTStringA("Nick")); if (tszNick == NULL) tszNick = JabberNickFromJID(m_proto->m_szJabberJID); SetDlgItemText(m_hwnd, IDC_NICK, tszNick); TEXTMETRIC tm = { 0 }; HDC hdc = GetDC(m_hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(m_hwnd, hdc); sttTextLineHeight = tm.tmHeight; SendDlgItemMessage(m_hwnd, IDC_ROOM, CB_SETITEMHEIGHT, -1, sttTextLineHeight - 1); LOGFONT lf = { 0 }; HFONT hfnt = (HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_GETFONT, 0, 0); GetObject(hfnt, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BM_SETIMAGE, IMAGE_ICON, (LPARAM)m_proto->LoadIconEx("bookmarks")); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASFLATBTN, TRUE, 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONADDTOOLTIP, (WPARAM)"Bookmarks", 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASPUSHBTN, TRUE, 0); m_proto->ComboLoadRecentStrings(m_hwnd, IDC_SERVER, "joinWnd_rcSvr"); int i; for (i = 0; i < 5; i++) { TCHAR jid[JABBER_MAX_JID_LEN]; JabberGcRecentInfo info(m_proto); if (!info.loadRecent(i)) break; mir_sntprintf(jid, _T("%s@%s (%s)"), info.m_room, info.m_server, info.m_nick ? info.m_nick : TranslateT("<no nick>")); SetDlgItemText(m_hwnd, IDC_RECENT1 + i, jid); } sttJoinDlgShowRecentItems(m_hwnd, i); }
void TlenProcessPresence(XmlNode *node, TlenProtocol *proto) { HANDLE hContact; XmlNode *showNode, *statusNode; JABBER_LIST_ITEM *item; char *from, *type, *nick, *show; int status, laststatus = ID_STATUS_OFFLINE; char *p; if ((from=JabberXmlGetAttrValue(node, "from")) != NULL) { if (JabberListExist(proto, LIST_CHATROOM, from)); //JabberGroupchatProcessPresence(node, userdata); else { type = JabberXmlGetAttrValue(node, "type"); item = JabberListGetItemPtr(proto, LIST_ROSTER, from); if (item != NULL) { if (proto->tlenOptions.enableAvatars) { TlenProcessPresenceAvatar(proto, node, item); } } if (type==NULL || (!strcmp(type, "available"))) { if ((nick=JabberLocalNickFromJID(from)) != NULL) { if ((hContact=JabberHContactFromJID(proto, from)) == NULL) hContact = JabberDBCreateContact(proto, from, nick, FALSE); if (!JabberListExist(proto, LIST_ROSTER, from)) { JabberLog(proto, "Receive presence online from %s (who is not in my roster)", from); JabberListAdd(proto, LIST_ROSTER, from); } status = ID_STATUS_ONLINE; if ((showNode=JabberXmlGetChild(node, "show")) != NULL) { if ((show=showNode->text) != NULL) { if (!strcmp(show, "away")) status = ID_STATUS_AWAY; else if (!strcmp(show, "xa")) status = ID_STATUS_NA; else if (!strcmp(show, "dnd")) status = ID_STATUS_DND; else if (!strcmp(show, "chat")) status = ID_STATUS_FREECHAT; else if (!strcmp(show, "unavailable")) { // Always show invisible (on old Tlen client) as invisible (not offline) status = ID_STATUS_OFFLINE; } } } statusNode = JabberXmlGetChild(node, "status"); if (statusNode) p = JabberTextDecode(statusNode->text); else p = NULL; JabberListAddResource(proto, LIST_ROSTER, from, status, statusNode?p:NULL); if (p) { DBWriteContactSettingString(hContact, "CList", "StatusMsg", p); mir_free(p); } else { DBDeleteContactSetting(hContact, "CList", "StatusMsg"); } // Determine status to show for the contact and request version information if (item != NULL) { laststatus = item->status; item->status = status; } if (strchr(from, '@')!=NULL || DBGetContactSettingByte(NULL, proto->iface.m_szModuleName, "ShowTransport", TRUE)==TRUE) { if (DBGetContactSettingWord(hContact, proto->iface.m_szModuleName, "Status", ID_STATUS_OFFLINE) != status) DBWriteContactSettingWord(hContact, proto->iface.m_szModuleName, "Status", (WORD) status); } if (item != NULL) { if (!item->infoRequested) { int iqId = JabberSerialNext(proto); item->infoRequested = TRUE; JabberSend( proto, "<iq type='get' id='"JABBER_IQID"%d'><query xmlns='jabber:iq:info' to='%s'></query></iq>", iqId, from); } if (proto->tlenOptions.enableVersion && !item->versionRequested) { item->versionRequested = TRUE; if (proto->iface.m_iStatus != ID_STATUS_INVISIBLE) { JabberSend( proto, "<message to='%s' type='iq'><iq type='get'><query xmlns='jabber:iq:version'/></iq></message>", from ); } } } JabberLog(proto, "%s (%s) online, set contact status to %d", nick, from, status); mir_free(nick); } } else if (!strcmp(type, "unavailable")) { if (!JabberListExist(proto, LIST_ROSTER, from)) { JabberLog(proto, "Receive presence offline from %s (who is not in my roster)", from); JabberListAdd(proto, LIST_ROSTER, from); } else { JabberListRemoveResource(proto, LIST_ROSTER, from); } status = ID_STATUS_OFFLINE; statusNode = JabberXmlGetChild(node, "status"); if (statusNode) { if (proto->tlenOptions.offlineAsInvisible) { status = ID_STATUS_INVISIBLE; } p = JabberTextDecode(statusNode->text); JabberListAddResource(proto, LIST_ROSTER, from, status, p); if ((hContact=JabberHContactFromJID(proto, from)) != NULL) { if (p) { DBWriteContactSettingString(hContact, "CList", "StatusMsg", p); } else { DBDeleteContactSetting(hContact, "CList", "StatusMsg"); } } if (p) mir_free(p); } if ((item=JabberListGetItemPtr(proto, LIST_ROSTER, from)) != NULL) { // Determine status to show for the contact based on the remaining resources item->status = status; item->versionRequested = FALSE; item->infoRequested = FALSE; } if ((hContact=JabberHContactFromJID(proto, from)) != NULL) { if (strchr(from, '@')!=NULL || DBGetContactSettingByte(NULL, proto->iface.m_szModuleName, "ShowTransport", TRUE)==TRUE) { if (DBGetContactSettingWord(hContact, proto->iface.m_szModuleName, "Status", ID_STATUS_OFFLINE) != status) DBWriteContactSettingWord(hContact, proto->iface.m_szModuleName, "Status", (WORD) status); } if (item != NULL && item->isTyping) { item->isTyping = FALSE; CallService(MS_PROTO_CONTACTISTYPING, (WPARAM) hContact, PROTOTYPE_CONTACTTYPING_OFF); } JabberLog(proto, "%s offline, set contact status to %d", from, status); } } else if (!strcmp(type, "subscribe")) { if (strchr(from, '@') == NULL) { // automatically send authorization allowed to agent/transport JabberSend(proto, "<presence to='%s' type='subscribed'/>", from); } else if ((nick=JabberNickFromJID(from)) != NULL) { JabberLog(proto, "%s (%s) requests authorization", nick, from); JabberDBAddAuthRequest(proto, from, nick); mir_free(nick); } } else if (!strcmp(type, "subscribed")) { if ((item=JabberListGetItemPtr(proto, LIST_ROSTER, from)) != NULL) { if (item->subscription == SUB_FROM) item->subscription = SUB_BOTH; else if (item->subscription == SUB_NONE) { item->subscription = SUB_TO; } } } } } }
static void TlenGetAvatarThread(HANDLE hContact) { JABBER_LIST_ITEM *item = NULL; NETLIBHTTPREQUEST req; NETLIBHTTPREQUEST *resp; char *request; char *login = NULL; if (hContact != NULL) { char *jid = JabberJIDFromHContact(hContact); login = JabberNickFromJID(jid); item = JabberListGetItemPtr(LIST_ROSTER, jid); mir_free(jid); } else { login = mir_strdup(jabberThreadInfo->username); } if ((jabberThreadInfo != NULL && hContact == NULL) || item != NULL) { DWORD format = PA_FORMAT_UNKNOWN; if (item!= NULL) { item->newAvatarDownloading = TRUE; } request = replaceTokens(jabberThreadInfo->tlenConfig.mailBase, jabberThreadInfo->tlenConfig.avatarGet, login, jabberThreadInfo->avatarToken, 0, 0); ZeroMemory(&req, sizeof(req)); req.cbSize = sizeof(req); req.requestType = jabberThreadInfo->tlenConfig.avatarGetMthd; req.flags = 0; req.headersCount = 0; req.headers = NULL; req.dataLength = 0; req.szUrl = request; resp = (NETLIBHTTPREQUEST *)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hNetlibUser, (LPARAM)&req); if (item!= NULL) { item->newAvatarDownloading = FALSE; } if (resp != NULL) { if (resp->resultCode/100==2) { if (resp->dataLength > 0) { int i; for (i=0; i<resp->headersCount; i++ ) { if (strcmpi(resp->headers[i].szName, "Content-Type")==0) { if (strcmpi(resp->headers[i].szValue, "image/png")==0) { format = PA_FORMAT_PNG; } else if (strcmpi(resp->headers[i].szValue, "image/x-png")==0) { format = PA_FORMAT_PNG; } else if (strcmpi(resp->headers[i].szValue, "image/jpeg")==0) { format = PA_FORMAT_JPEG; } else if (strcmpi(resp->headers[i].szValue, "image/jpg")==0) { format = PA_FORMAT_JPEG; } else if (strcmpi(resp->headers[i].szValue, "image/gif")==0) { format = PA_FORMAT_GIF; } else if (strcmpi(resp->headers[i].szValue, "image/bmp")==0) { format = PA_FORMAT_BMP; } break; } } SetAvatar(hContact, item, resp->pData, resp->dataLength, format); } else { RemoveAvatar(hContact); } } CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)resp); } mir_free(request); mir_free(login); } if (hContact == NULL) { getAvatarMutex = 0; } }
void JabberGroupchatProcessPresence( XmlNode *node, void *userdata ) { ThreadData* info; XmlNode *showNode, *statusNode, *errorNode, *itemNode, *n; TCHAR* from; int status, newRes; int i; BOOL roomCreated; if ( !node || !node->name || strcmp( node->name, "presence" )) return; if (( info=( ThreadData* ) userdata ) == NULL ) return; if (( from=JabberXmlGetAttrValue( node, "from" )) == NULL ) return; TCHAR* nick = _tcschr( from, '/' ); if ( nick == NULL || nick[1] == '\0' ) return; nick++; JABBER_LIST_ITEM* item = JabberListGetItemPtr( LIST_CHATROOM, from ); if ( item == NULL ) return; XmlNode* xNode = JabberXmlGetChildWithGivenAttrValue( node, "x", "xmlns", _T("http://jabber.org/protocol/muc#user")); TCHAR* type = JabberXmlGetAttrValue( node, "type" ); if ( type == NULL || !_tcscmp( type, _T("available"))) { TCHAR* room = JabberNickFromJID( from ); if ( room == NULL ) return; JabberGcLogCreate( item ); // Update status of room participant status = ID_STATUS_ONLINE; if (( showNode=JabberXmlGetChild( node, "show" )) != NULL ) { if ( showNode->text != NULL ) { if ( !_tcscmp( showNode->text , _T("away"))) status = ID_STATUS_AWAY; else if ( !_tcscmp( showNode->text , _T("xa"))) status = ID_STATUS_NA; else if ( !_tcscmp( showNode->text , _T("dnd"))) status = ID_STATUS_DND; else if ( !_tcscmp( showNode->text , _T("chat"))) status = ID_STATUS_FREECHAT; } } TCHAR* str; if (( statusNode=JabberXmlGetChild( node, "status" ))!=NULL && statusNode->text!=NULL ) str = statusNode->text; else str = NULL; newRes = ( JabberListAddResource( LIST_CHATROOM, from, status, str ) == 0 ) ? 0 : GC_EVENT_JOIN; roomCreated = FALSE; // Check additional MUC info for this user if ( xNode != NULL ) { if (( itemNode=JabberXmlGetChild( xNode, "item" )) != NULL ) { JABBER_RESOURCE_STATUS* r = item->resource; for ( i=0; i<item->resourceCount && _tcscmp( r->resourceName, nick ); i++, r++ ); if ( i < item->resourceCount ) { if (( str=JabberXmlGetAttrValue( itemNode, "affiliation" )) != NULL ) { if ( !_tcscmp( str, _T("owner"))) r->affiliation = AFFILIATION_OWNER; else if ( !_tcscmp( str, _T("admin"))) r->affiliation = AFFILIATION_ADMIN; else if ( !_tcscmp( str, _T("member"))) r->affiliation = AFFILIATION_MEMBER; else if ( !_tcscmp( str, _T("outcast"))) r->affiliation = AFFILIATION_OUTCAST; } if (( str=JabberXmlGetAttrValue( itemNode, "role" )) != NULL ) { JABBER_GC_ROLE newRole = r->role; if ( !_tcscmp( str, _T("moderator"))) newRole = ROLE_MODERATOR; else if ( !_tcscmp( str, _T("participant"))) newRole = ROLE_PARTICIPANT; else if ( !_tcscmp( str, _T("visitor"))) newRole = ROLE_VISITOR; else newRole = ROLE_NONE; if ( newRole != r->role && r->role != ROLE_NONE ) { JabberGcLogUpdateMemberStatus( item, nick, NULL, GC_EVENT_REMOVESTATUS, NULL ); newRes = GC_EVENT_ADDSTATUS; } r->role = newRole; } str = JabberXmlGetAttrValue( itemNode, "jid" ); } } if ( sttGetStatusCode( xNode ) == 201 ) roomCreated = TRUE; } // Update groupchat log window JabberGcLogUpdateMemberStatus( item, nick, str, newRes, NULL ); HANDLE hContact = JabberHContactFromJID( from ); if ( hContact != NULL ) JSetWord( hContact, "Status", status ); // Update room status //if ( item->status != ID_STATUS_ONLINE ) { // item->status = ID_STATUS_ONLINE; // JSetWord( hContact, "Status", ( WORD )ID_STATUS_ONLINE ); // JabberLog( "Room %s online", from ); //} // Check <created/> if ( roomCreated || (( n=JabberXmlGetChild( node, "created" ))!=NULL && ( str=JabberXmlGetAttrValue( n, "xmlns" ))!=NULL && !_tcscmp( str, _T("http://jabber.org/protocol/muc#owner"))) ) { // A new room just created by me // Request room config int iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultGetMuc ); XmlNodeIq iq( "get", iqId, item->jid ); XmlNode* query = iq.addQuery( xmlnsOwner ); JabberSend( jabberThreadInfo->s, iq ); } mir_free( room ); } else if ( !lstrcmp( type, _T("unavailable"))) { TCHAR* str = 0; if ( xNode != NULL && item->nick != NULL ) { itemNode = JabberXmlGetChild( xNode, "item" ); XmlNode* reasonNode = JabberXmlGetChild( itemNode, "reason" ); str = JabberXmlGetAttrValue( itemNode, "jid" ); if ( !lstrcmp( nick, item->nick )) { int iStatus = sttGetStatusCode( xNode ); switch( iStatus ) { case 301: case 307: JabberGcQuit( item, iStatus, reasonNode ); break; case 303: sttRenameParticipantNick( item, nick, itemNode ); return; } } else { switch( sttGetStatusCode( xNode )) { case 303: sttRenameParticipantNick( item, nick, itemNode ); return; case 301: case 307: JabberListRemoveResource( LIST_CHATROOM, from ); JabberGcLogUpdateMemberStatus( item, nick, str, GC_EVENT_KICK, reasonNode ); return; } } } JabberListRemoveResource( LIST_CHATROOM, from ); JabberGcLogUpdateMemberStatus( item, nick, str, GC_EVENT_PART, NULL ); HANDLE hContact = JabberHContactFromJID( from ); if ( hContact != NULL ) JSetWord( hContact, "Status", ID_STATUS_OFFLINE ); } else if ( !lstrcmp( type, _T("error"))) { errorNode = JabberXmlGetChild( node, "error" ); TCHAR* str = JabberErrorMsg( errorNode ); MessagePopup( NULL, str, TranslateT( "Jabber Error Message" ), MB_OK|MB_SETFOREGROUND ); //JabberListRemoveResource( LIST_CHATROOM, from ); JabberListRemove( LIST_CHATROOM, from ); mir_free( str ); } }
static BOOL CALLBACK JabberGroupchatJoinDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { TCHAR text[128]; TCHAR* p; switch ( msg ) { case WM_INITDIALOG: { // lParam is the room JID ( room@server ) in UTF-8 hwndJabberJoinGroupchat = hwndDlg; TranslateDialogDefault( hwndDlg ); if ( lParam ){ _tcsncpy( text, ( TCHAR* )lParam, SIZEOF( text )); if (( p = _tcschr( text, '@' )) != NULL ) { *p = '\0'; // Need to save room name in UTF-8 in case the room codepage is different // from the local code page TCHAR* room = mir_tstrdup( text ); SetWindowLong( hwndDlg, GWL_USERDATA, ( LONG ) room ); SetDlgItemText( hwndDlg, IDC_ROOM, room ); SetDlgItemText( hwndDlg, IDC_SERVER, p+1 ); } else SetDlgItemText( hwndDlg, IDC_SERVER, text ); } DBVARIANT dbv; if ( !JGetStringT( NULL, "Nick", &dbv )) { SetDlgItemText( hwndDlg, IDC_NICK, dbv.ptszVal ); JFreeVariant( &dbv ); } else { TCHAR* nick = JabberNickFromJID( jabberJID ); SetDlgItemText( hwndDlg, IDC_NICK, nick ); mir_free( nick ); } } return TRUE; case WM_COMMAND: switch ( LOWORD( wParam )) { case IDC_ROOM: if (( HWND )lParam==GetFocus() && HIWORD( wParam )==EN_CHANGE ) { // Change in IDC_ROOM field is detected, // invalidate the saved UTF-8 room name if any char* str = ( char* )GetWindowLong( hwndDlg, GWL_USERDATA ); if ( str != NULL ) { mir_free( str ); SetWindowLong( hwndDlg, GWL_USERDATA, ( LONG ) NULL ); } } break; case IDOK: { GetDlgItemText( hwndDlg, IDC_SERVER, text, SIZEOF( text )); TCHAR* server = NEWTSTR_ALLOCA( text ), *room; if (( room=( TCHAR* )GetWindowLong( hwndDlg, GWL_USERDATA )) != NULL ) room = NEWTSTR_ALLOCA( room ); else { GetDlgItemText( hwndDlg, IDC_ROOM, text, SIZEOF( text )); room = NEWTSTR_ALLOCA( text ); } GetDlgItemText( hwndDlg, IDC_NICK, text, SIZEOF( text )); TCHAR* nick = NEWTSTR_ALLOCA( text ); GetDlgItemText( hwndDlg, IDC_PASSWORD, text, SIZEOF( text )); TCHAR* password = NEWTSTR_ALLOCA( text ); JabberGroupchatJoinRoom( server, room, nick, password ); } // fall through case IDCANCEL: EndDialog( hwndDlg, 0 ); break; } break; case WM_JABBER_CHECK_ONLINE: if ( !jabberOnline ) EndDialog( hwndDlg, 0 ); break; case WM_DESTROY: { char* str = ( char* )GetWindowLong( hwndDlg, GWL_USERDATA ); if ( str != NULL ) mir_free( str ); hwndJabberJoinGroupchat = NULL; } break; } return FALSE; }