void Client::requestICQAwayMessage( const QString& contact, ICQStatus contactStatus ) { kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "requesting away message for " << contact << endl; Oscar::Message msg; msg.setType( 2 ); msg.setReceiver( contact ); msg.addProperty( Oscar::Message::StatusMessageRequest ); switch ( contactStatus ) { case ICQAway: msg.setMessageType( 0xE8 ); // away break; case ICQOccupied: msg.setMessageType( 0xE9 ); // occupied break; case ICQNotAvailable: msg.setMessageType( 0xEA ); // not awailable break; case ICQDoNotDisturb: msg.setMessageType( 0xEB ); // do not disturb break; case ICQFreeForChat: msg.setMessageType( 0xEC ); // free for chat break; default: // may be a good way to deal with possible error and lack of online status message? emit receivedAwayMessage( contact, "Sorry, this protocol does not support this type of status message" ); return; } sendMessage( msg ); }
bool UserInfoTask::take( Transfer * transfer ) { if ( forMe( transfer ) ) { setTransfer( transfer ); Oscar::DWORD seq = 0; SnacTransfer* st = dynamic_cast<SnacTransfer*>( transfer ); if ( st ) seq = st->snacRequest(); if ( seq != 0 ) { //AFAIK location info packets always have user info Buffer* b = transfer->buffer(); UserDetails ud; ud.fill( b ); m_sequenceInfoMap[seq] = ud; emit gotInfo( seq ); QList<TLV> list = b->getTLVList(); QList<TLV>::iterator it = list.begin(), itEnd = list.end(); QString profile; QString away; for ( ; it != itEnd; ++it ) { switch( ( *it ).type ) { case 0x0001: //profile text encoding kDebug(OSCAR_RAW_DEBUG) << "text encoding is " << QString( ( *it ).data ); break; case 0x0002: //profile text kDebug(OSCAR_RAW_DEBUG) << "The profile is '" << QString( ( *it ).data ) << "'"; profile = QString( ( *it ).data ); // aim always seems to use us-ascii encoding emit receivedProfile( m_contactSequenceMap[seq], profile ); break; case 0x0003: //away message encoding kDebug(OSCAR_RAW_DEBUG) << "Away message encoding is " << QString( ( *it ).data ); break; case 0x0004: //away message kDebug(OSCAR_RAW_DEBUG) << "Away message is '" << QString( ( *it ).data ) << "'"; away = QString( (*it ).data ); // aim always seems to use us-ascii encoding emit receivedAwayMessage( m_contactSequenceMap[seq], away ); break; case 0x0005: //capabilities break; default: //unknown kDebug(14151) << "Unknown user info type " << ( *it ).type; break; }; } list.clear(); } setTransfer( 0 ); return true; } return false; }
void Client::receivedMessage( const Oscar::Message& msg ) { if ( msg.type() == 2 && !msg.hasProperty( Oscar::Message::AutoResponse ) ) { // type 2 message needs an autoresponse, regardless of type Connection* c = d->connections.connectionForFamily( 0x0004 ); if ( !c ) return; Oscar::Message response ( msg ); if ( msg.hasProperty( Oscar::Message::StatusMessageRequest ) ) { QTextCodec* codec = d->codecProvider->codecForContact( msg.sender() ); response.setText( Oscar::Message::UserDefined, statusMessage(), codec ); } else { response.setEncoding( Oscar::Message::UserDefined ); response.setTextArray( QByteArray() ); } response.setReceiver( msg.sender() ); response.addProperty( Oscar::Message::AutoResponse ); SendMessageTask *sendMsgTask = new SendMessageTask( c->rootTask() ); sendMsgTask->setMessage( response ); sendMsgTask->go( true ); } if ( msg.hasProperty( Oscar::Message::StatusMessageRequest ) ) { if ( msg.hasProperty( Oscar::Message::AutoResponse ) ) { // we got a response to a status message request. QString awayMessage( msg.text( d->codecProvider->codecForContact( msg.sender() ) ) ); kdDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "Received an away message: " << awayMessage << endl; emit receivedAwayMessage( msg.sender(), awayMessage ); } } else if ( ! msg.hasProperty( Oscar::Message::AutoResponse ) ) { // Filter out miranda's invisible check if ( msg.messageType() == 0x0004 && msg.textArray().isEmpty() ) return; // let application handle it kdDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "Emitting receivedMessage" << endl; emit messageReceived( msg ); } }