void JabberSetServerStatus( int iNewStatus ) { if ( !jabberConnected ) return; // change status int oldStatus = jabberStatus; switch ( iNewStatus ) { case ID_STATUS_ONLINE: case ID_STATUS_NA: case ID_STATUS_FREECHAT: case ID_STATUS_INVISIBLE: jabberStatus = iNewStatus; break; case ID_STATUS_AWAY: case ID_STATUS_ONTHEPHONE: case ID_STATUS_OUTTOLUNCH: jabberStatus = ID_STATUS_AWAY; break; case ID_STATUS_DND: case ID_STATUS_OCCUPIED: jabberStatus = ID_STATUS_DND; break; default: return; } // send presence update JabberSendPresence( jabberStatus, true ); JSendBroadcast( NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, ( HANDLE ) oldStatus, jabberStatus ); }
void JabberIqResultGetRoster(XmlNode *iqNode, void *userdata) { //struct ThreadData *info = (struct ThreadData *) userdata; XmlNode *queryNode; char *type; char *str; // RECVED: roster information // ACTION: populate LIST_ROSTER and create contact for any new rosters JabberLog("<iq/> iqIdGetRoster"); if ((type=JabberXmlGetAttrValue(iqNode, "type")) == NULL) return; if ((queryNode=JabberXmlGetChild(iqNode, "query")) == NULL) return; if (!strcmp(type, "result")) { str = JabberXmlGetAttrValue(queryNode, "xmlns"); if (str!=NULL && !strcmp(str, "jabber:iq:roster")) { DBVARIANT dbv; XmlNode *itemNode, *groupNode; JABBER_SUBSCRIPTION sub; JABBER_LIST_ITEM *item; HANDLE hContact; char *jid, *name, *nick; int i, oldStatus; for (i=0; i<queryNode->numChild; i++) { itemNode = queryNode->child[i]; if (!strcmp(itemNode->name, "item")) { str = JabberXmlGetAttrValue(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=JabberXmlGetAttrValue(itemNode, "jid")) != NULL) { if ((name=JabberXmlGetAttrValue(itemNode, "name")) != NULL) { nick = JabberTextDecode(name); } else { nick = JabberLocalNickFromJID(jid); } if (nick != NULL) { item = JabberListAdd(LIST_ROSTER, jid); if (item->nick) free(item->nick); item->nick = nick; item->subscription = sub; if ((hContact=JabberHContactFromJID(jid)) == NULL) { // Received roster has a new JID. // Add the jid (with empty resource) to Miranda contact list. hContact = JabberDBCreateContact(jid, nick, FALSE, TRUE); } DBWriteContactSettingString(hContact, "CList", "MyHandle", nick); if (item->group) free(item->group); if ((groupNode=JabberXmlGetChild(itemNode, "group"))!=NULL && groupNode->text!=NULL) { item->group = JabberTextDecode(groupNode->text); JabberContactListCreateGroup(item->group); // Don't set group again if already correct, or Miranda may show wrong group count in some case if (!DBGetContactSetting(hContact, "CList", "Group", &dbv)) { if (strcmp(dbv.pszVal, item->group)) DBWriteContactSettingString(hContact, "CList", "Group", item->group); DBFreeVariant(&dbv); } else DBWriteContactSettingString(hContact, "CList", "Group", item->group); } else { item->group = NULL; DBDeleteContactSetting(hContact, "CList", "Group"); } } } } } // Delete orphaned contacts (if roster sync is enabled) if (DBGetContactSettingByte(NULL, jabberProtoName, "RosterSync", FALSE) == TRUE) { HANDLE *list; int listSize, listAllocSize; listSize = listAllocSize = 0; list = NULL; hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); while (hContact != NULL) { str = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0); if(str!=NULL && !strcmp(str, jabberProtoName)) { if (!DBGetContactSetting(hContact, jabberProtoName, "jid", &dbv)) { if (!JabberListExist(LIST_ROSTER, dbv.pszVal)) { JabberLog("Syncing roster: preparing to delete %s (hContact=0x%x)", dbv.pszVal, hContact); if (listSize >= listAllocSize) { listAllocSize = listSize + 100; if ((list=(HANDLE *) realloc(list, listAllocSize)) == NULL) { listSize = 0; break; } } list[listSize++] = hContact; } DBFreeVariant(&dbv); } } hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0); } for (i=0; i<listSize; i++) { JabberLog("Syncing roster: deleting 0x%x", list[i]); CallService(MS_DB_CONTACT_DELETE, (WPARAM) list[i], 0); } if (list != NULL) free(list); } /////////////////////////////////////// { CLISTMENUITEM clmi; memset(&clmi, 0, sizeof(CLISTMENUITEM)); clmi.cbSize = sizeof(CLISTMENUITEM); clmi.flags = CMIM_FLAGS; CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM) hMenuMUC, (LPARAM) &clmi); CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM) hMenuChats, (LPARAM) &clmi); } jabberOnline = TRUE; JabberLog("Status changed via THREADSTART"); oldStatus = jabberStatus; switch (jabberDesiredStatus) { case ID_STATUS_ONLINE: case ID_STATUS_NA: case ID_STATUS_FREECHAT: case ID_STATUS_INVISIBLE: jabberStatus = jabberDesiredStatus; break; case ID_STATUS_AWAY: case ID_STATUS_ONTHEPHONE: case ID_STATUS_OUTTOLUNCH: jabberStatus = ID_STATUS_AWAY; break; case ID_STATUS_DND: case ID_STATUS_OCCUPIED: jabberStatus = ID_STATUS_DND; break; } JabberSendPresence(jabberStatus); ProtoBroadcastAck(jabberProtoName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, jabberStatus); ////////////////////////////////// } } }
static BOOL CALLBACK TlenSetAvatarDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { switch ( msg ) { case WM_INITDIALOG: TranslateDialogDefault( hwndDlg ); avatarChanged = 0; hAvatar = NULL; szFileName[0] = 0;/* BOOL tValue = JGetByte( "EnableAvatars", 1 ); CheckDlgButton( hwndDlg, IDC_ENABLE_AVATARS, tValue ); if ( tValue )*/ { char szAvatar[ MAX_PATH ]; TlenGetAvatarFileName( NULL, szAvatar, sizeof szAvatar ); hAvatar = (HBITMAP)CallService(MS_UTILS_LOADBITMAP, 0, (WPARAM)szAvatar ); if (hAvatar) SendDlgItemMessage(hwndDlg, IDC_AVATAR, STM_SETIMAGE, IMAGE_BITMAP, (WPARAM)hAvatar ); } return TRUE; case WM_COMMAND: if ( HIWORD( wParam ) == BN_CLICKED ) switch( LOWORD( wParam )) { case IDC_SETAVATAR: if ( TlenEnterBitmapName( szFileName ) == ERROR_SUCCESS ) { if (!sttSaveAvatar()) { HBITMAP hBitmap = (HBITMAP)CallService(MS_UTILS_LOADBITMAP, 0, (WPARAM)szFileName ); if ( hBitmap != NULL ) { hAvatar = hBitmap; hBitmap = ( HBITMAP )SendDlgItemMessage(hwndDlg, IDC_AVATAR, STM_SETIMAGE, IMAGE_BITMAP, (WPARAM)hBitmap ); if ( hBitmap ) DeleteObject( hBitmap ); RedrawWindow(GetDlgItem(hwndDlg, IDC_AVATAR), NULL, NULL, RDW_INVALIDATE); } avatarChanged = 1; } } break; case IDC_DELETEAVATAR: { char tFileName[ MAX_PATH ]; HBITMAP hBitmap; TlenGetAvatarFileName( NULL, tFileName, sizeof tFileName ); DeleteFileA( tFileName ); if (userAvatarHash != NULL) { free (userAvatarHash); userAvatarHash = NULL; } DBDeleteContactSetting(NULL, jabberProtoName, "AvatarHash"); DBDeleteContactSetting(NULL, jabberProtoName, "AvatarFormat"); DeleteObject( hAvatar ); hAvatar = NULL; hBitmap = (HBITMAP)SendDlgItemMessage(hwndDlg, IDC_AVATAR, STM_SETIMAGE, IMAGE_BITMAP, (WPARAM)NULL ); if ( hBitmap ) DeleteObject( hBitmap ); InvalidateRect( hwndDlg, NULL, TRUE ); avatarChanged = 1; break; } } break; case WM_DESTROY: if ( hAvatar ) DeleteObject( hAvatar ); if (tlenOptions.enableAvatars && avatarChanged && jabberConnected && jabberDesiredStatus != ID_STATUS_INVISIBLE) JabberSendPresence(jabberDesiredStatus); break; } return 0; }