Beispiel #1
0
void ResourceManager::setResource(const Presence &stanza) {
	std::string resource = stanza.from().resource();
	if (resource.empty())
		return;
	Tag *stanzaTag = stanza.tag();
	Tag *c = stanzaTag->findChildWithAttrib("xmlns", "http://jabber.org/protocol/caps");
	int caps = -1;
	// presence has caps
	if (c != NULL) {
		caps = Transport::instance()->getCapabilities(c->findAttribute("ver"));
	}
	setResource(resource, stanza.priority(), caps, (int) stanza.presence(), stanza.status());
	delete stanzaTag;
}
Beispiel #2
0
  void Client::sendPresence( Presence& pres )
  {
    if( state() < StateConnected )
      return;

    StanzaExtensionList::const_iterator it = m_presenceExtensions.begin();
    for( ; it != m_presenceExtensions.end(); ++it )
      pres.addExtension( (*it)->clone() );

    send( pres );
  }
Beispiel #3
0
 virtual void handleNonrosterPresence( const Presence& presence )
 {
   printf( "received presence from entity not in the roster: %s\n", presence.from().full().c_str() );
 }
void jConference::handlePresence (const Presence &presence)
{
	if(presence.subtype()==Presence::Error)
		return;
  const MUCRoom::MUCUser* mu = presence.findExtension<MUCRoom::MUCUser>(ExtMUCUser);
	if(!mu)
		return;
	QString conference = utils::fromStd(presence.from().bare());
	Room *room = m_rooms.value(conference);
	if(!room)
		return;
	QString nick = utils::fromStd(presence.from().resource());
	QHash<QString,MucContact> &contacts = room->contacts_list;

	int flags = mu->flags();
	bool send_role=false;
	if( flags & UserNickChanged && mu->newNick() )
	{
		// changed nick to new_nick
		QString new_nick = utils::fromStd(*mu->newNick());
		if(!contacts.contains(nick))
			return;
		MucContact contact = contacts[nick];
		jBuddy::ResourceInfo *info = &contact.m_info;
		info->m_name = new_nick;
		contacts.remove(nick);
		contacts.insert(new_nick, contact);
		emit addSystemMessageToConference("Jabber",conference,m_account_name,tr("%1 is now known as %2").arg(nick).arg(new_nick),QDateTime(),false);
		emit renameConferenceItem("Jabber", conference, m_account_name, nick, new_nick);
		return;
	}

	bool if_join=false;
	if(presence.presence()==Presence::Unavailable && contacts.contains(nick))
	{
		QString reason = "";
		if(mu->reason())
			reason = utils::fromStd(*mu->reason());
		if (utils::fromStd(room->entity->nick()) == nick)
		{
			QString msgtxt;
			if(flags & UserKicked){
				msgtxt += tr("You have been kicked from")+" "+conference+".\n";
				if (!reason.isEmpty()){
					msgtxt += tr("with reason:")+" "+reason+".\n";
				} else {
					msgtxt += tr("without reason")+".\n";
				}
				QMessageBox::warning(0, tr("You have been kicked"), msgtxt, QMessageBox::Ok);
				//				//TODO: autorejoin?
				//				msgtxt += tr("Do you want to rejoin?");
				//				int ret = QMessageBox::warning(0, tr("You have been kicked"), msgtxt, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
				//				if(ret==QMessageBox::Yes) {
				//					JID jid(utils::toStd(conference));
				//					m_room_list[conference]->leave("");
				//					m_room_list[conference]->join(m_presence->presence(), m_presence->status());
				////					createConferenceRoom(utils::fromStd(jid.server()), utils::fromStd(jid.username()), nick, "" );
				//					return;
				//				}
			}
			else if(flags & UserBanned){
				msgtxt += tr("You have been banned from")+" "+conference+".\n";
				if (!reason.isEmpty()){
					msgtxt += tr("with reason:")+" "+reason+".\n";
				} else {
					msgtxt += tr("without reason")+".\n";
				}
				QMessageBox::warning(0, tr("You have been banned"), msgtxt, QMessageBox::Ok);
			}
		}
		//offline
		contacts.remove(nick);
		emit removeConferenceItem("Jabber", conference, m_account_name, nick);
		QString text;
		if(flags & UserKicked)
			text = tr("%1 has been kicked").arg(nick);
		else if(flags & UserBanned)
			text = tr("%1 has been banned").arg(nick);
		else
			text = tr("%1 has left the room").arg(nick);
		if (!reason.isEmpty())
			text += " ("+reason+")";
		emit addSystemMessageToConference("Jabber",conference,m_account_name,text,QDateTime(),false);
		return;
	}
	else if(presence.presence()==Presence::Unavailable)
		return;
	else
	{
		QString status;
		int mass;
		switch(presence.presence())
		{
		case Presence::Chat:
			status="ffc";
			mass=1;
			break;
		case Presence::Away:
			status="away";
			mass=2;
			break;
		case Presence::DND:
			status="dnd";
			mass=3;
			break;
		case Presence::XA:
			status="na";
			mass=4;
			break;
		case Presence::Error:
			return;
		case Presence::Available:
		default:
			status="online";
			mass=0;
			break;
		}
		if(!contacts.contains(nick) || contacts[nick].m_info.m_name.isNull() || contacts[nick].m_info.m_name.isEmpty())
		{
			//online
			if(!contacts.contains(nick))
			{
				MucContact contact;
				jBuddy::ResourceInfo info;
				info.m_name = nick;
				info.m_chat_state = ChatStateActive;
				contact.m_info = info;
				contact.m_affiliation = AffiliationNone;
				contact.m_role = RoleInvalid ;
				contacts.insert(nick,contact);
				emit addConferenceItem("Jabber", conference, m_account_name, nick);
			}
			MucContact *contact = &contacts[nick];
			jBuddy::ResourceInfo *info = &contact->m_info;
			info->m_name = nick;
			info->m_presence = presence.presence();
			if(presence.presence() == Presence::Invalid)
				info->m_presence = Presence::Available;
			info->m_priority = 0;
			if_join=true;
			emit setConferenceItemRole("Jabber", conference, m_account_name, nick, status, mass);
			send_role=true;
			//			JID jid(room->name()+"@"+room->service()+"/"+participant.nick->resource());
			//			jClientIdentification::instance().setClient(&(contacts[nick]),jid,m_client_base,this);
		}
		else
			contacts[nick].m_info.m_presence = presence.presence();
		if(contacts[nick].m_real_jid.isEmpty() && mu->jid())
			contacts[nick].m_real_jid = utils::fromStd(*mu->jid());
		//changed status
		emit setConferenceItemStatus("Jabber", conference, m_account_name, nick, status, mass);
	}
	if(contacts.contains(nick))
	{
		MucContact *contact = &contacts[nick];
		QString message;
		if(!if_join && mu->role()==contact->m_role && mu->affiliation()==contact->m_affiliation)
			return;
		if(if_join && contact->m_real_jid.isEmpty())
		{
			if(mu->role()!=contact->m_role&&mu->affiliation()!=contact->m_affiliation)
				message = tr("%3 has joined the room as %1 and %2");
			else if(mu->role()!=contact->m_role||mu->affiliation()!=contact->m_affiliation)
				message = tr("%2 has joined the room as %1");
			else
				message = tr("%2 has joined the room");
		}
		else if(if_join)
		{
			if(mu->role()!=contact->m_role&&mu->affiliation()!=contact->m_affiliation)
				message = tr("%4 (%3) has joined the room as %1 and %2");
			else if(mu->role()!=contact->m_role||mu->affiliation()!=contact->m_affiliation)
				message = tr("%3 (%2) has joined the room as %1");
			else
				message = tr("%2 (%1) has joined the room");
		}
		else if(contact->m_real_jid.isEmpty())
		{
			if(mu->role()!=contact->m_role&&mu->affiliation()!=contact->m_affiliation)
				message = tr("%3 now is %1 and %2");
			else if(mu->role()!=contact->m_role||mu->affiliation()!=contact->m_affiliation)
				message = tr("%2 now is %1");
		}
		else
		{
			if(mu->role()!=contact->m_role&&mu->affiliation()!=contact->m_affiliation)
				message = tr("%4 (%3) now is %1 and %2");
			else if(mu->role()!=contact->m_role||mu->affiliation()!=contact->m_affiliation)
				message = tr("%3 (%2) now is %1");
		}
		if(mu->role()!=contact->m_role)
		{
			int mass;
			QString role;
			switch(mu->role())
			{
			case RoleModerator:
				role=tr("moderator");
				mass=1;
				break;
			case RoleParticipant:
				role=tr("participant");
				mass=2;
				break;
			default:
			case RoleVisitor:
				role=tr("visitor");
				mass=3;
				break;
			}
			contact->m_role = mu->role();
			contact->m_role_string = role;
			message = message.arg(role);
			contact->m_info.m_priority = mass;
			emit setConferenceItemRole("Jabber", conference, m_account_name, nick, role, mass);
		}
		if(mu->affiliation()!=contact->m_affiliation)
		{
			QString affiliation;
			switch(mu->affiliation())
			{
			case AffiliationOutcast:
				affiliation=tr("banned");
				break;
			case AffiliationMember:
				affiliation=tr("member");
				break;
			case AffiliationOwner:
				affiliation=tr("owner");
				break;
			case AffiliationAdmin:
				affiliation=tr("administrator");
				break;
			default:
				affiliation=tr("guest");
				break;
			}
			contact->m_affiliation = mu->affiliation();
			contact->m_affiliation_string = mu->affiliation()==AffiliationNone?"":affiliation;
			message = message.arg(affiliation);
		}
		if(!contact->m_real_jid.isEmpty())
			message = message.arg(contact->m_real_jid);
		message = message.arg(nick);
		emit addSystemMessageToConference("Jabber",conference,m_account_name,message,QDateTime(),false);
	}
	jBuddy::ResourceInfo *info = &contacts[nick].m_info;
	info->m_status_message = utils::fromStd(presence.status());
	info->m_status_message.replace("\n","<br/>");
	if(info->m_client_name.isEmpty()||info->m_client_name.isNull())
	{
		const Capabilities *caps = presence.capabilities();
		if(caps)
		{
			info->m_caps_ver = utils::fromStd(caps->ver());
			info->m_caps_node = utils::fromStd(caps->node());
		}
		else
		{
			info->m_caps_ver = "";
			info->m_caps_node = "";
		}
		jClientIdentification::instance().setClient(info,presence.from(),m_client_base,this);
		emit conferenceClientVersion("Jabber",conference,m_account_name,nick, info->m_client_name);
	}
	const VCardUpdate *vcard_update = presence.findExtension<VCardUpdate>(ExtVCardUpdate);
	if(vcard_update)
	{
		QString hash = utils::fromStd(vcard_update->hash());
		if(!hash.isEmpty())
		{
			if(QFile(m_jabber_account->getPathToAvatars()+"/"+hash).exists())
			{
				setAvatar(conference,nick,m_jabber_account->getPathToAvatars()+"/"+hash);
			}
			else
			{
				m_real_parent->fetchVCard(conference+"/"+nick,true);
			}
		}
	}
	const XStatusExtension *xstatus = presence.findExtension<XStatusExtension>(SExtXStatus);
	if(xstatus)
	{
		if(xstatus->status_id()<0)
			info->m_x_status="";
		else
			info->m_x_status = QString("icq_xstatus%1").arg(xstatus->status_id());
		emit setConferenceItemIcon("Jabber",conference,m_account_name,nick, info->m_x_status, 5);
	}
}
Beispiel #5
0
  void RosterManager::handlePresence( const Presence& presence )
  {
    if( presence.subtype() == Presence::Error )
      return;

    bool self = false;
    Roster::iterator it = m_roster.find( presence.from().bare() );
    if( it != m_roster.end() || ( self = ( presence.from().bareJID() == m_self->jidJID() ) ) )
    {
      RosterItem* ri = self ? m_self : (*it).second;
      const std::string& resource = presence.from().resource();

      if( presence.presence() == Presence::Unavailable )
        ri->removeResource( resource );
      else
      {
        ri->setPresence( resource, presence.presence() );
        ri->setStatus( resource, presence.status() );
        ri->setPriority( resource, presence.priority() );
        ri->setExtensions( resource, presence.extensions() );
      }

      if( m_rosterListener && !self )
        m_rosterListener->handleRosterPresence( *ri, resource,
                                                presence.presence(), presence.status() );
      else if( m_rosterListener && self )
        m_rosterListener->handleSelfPresence( *ri, resource,
                                              presence.presence(), presence.status() );
    }
    else
    {
      if( m_rosterListener )
        m_rosterListener->handleNonrosterPresence( presence );
    }
  }
void GatewayTask::slotRegister(const XMPP::IQ& iq)
{
    QString tag = iq.childElement().tagName();
    QString ns = iq.childElement().namespaceURI();

    if ( tag == "query" && ns == NS_IQ_REGISTER && iq.type() == "get" ) {
        Registration form(d->reg);
        form.setTo(iq.from());
        form.setFrom(iq.to());
        form.setId(iq.id());
        form.setType(IQ::Result);

        d->stream->sendStanza(form);
        return;
    }
    if ( tag == "query" && ns == NS_IQ_REGISTER && iq.type() == "set" ) {
        Registration request(iq);

        if ( request.from().isEmpty() ) {
            Registration err = IQ::createReply(request);
            err.setError( Stanza::Error(Stanza::Error::UnexpectedRequest) );
            d->stream->sendStanza(err);
            return;
        }

        if ( request.hasField(Registration::Remove) ) {
            Registration reply = IQ::createReply(iq);
            reply.clearChild();
            reply.setType(IQ::Result);
            d->stream->sendStanza(reply);

            Presence removeSubscription;
            removeSubscription.setTo( iq.from().bare() );
            removeSubscription.setType(Presence::Unsubscribe);
            d->stream->sendStanza(removeSubscription);

            Presence removeAuth;
            removeAuth.setTo( iq.from().bare() );
            removeAuth.setType(Presence::Unsubscribed);
            d->stream->sendStanza(removeAuth);

            Presence logout;
            logout.setTo( iq.from() );
            logout.setType(Presence::Unavailable);
            d->stream->sendStanza(logout);

            emit userUnregister(iq.from());
            return;
        }

        if ( request.getField(Registration::Username).isEmpty() || request.getField(Registration::Password).isEmpty() ) {
            Registration err(request);
            err.swapFromTo();
            err.setError( Stanza::Error(Stanza::Error::NotAcceptable) );
            d->stream->sendStanza(err);
            return;
        }

        /* registration success */
        IQ reply = IQ::createReply(iq);
        reply.clearChild();
        d->stream->sendStanza(reply);

        /* subscribe for user presence */
        Presence subscribe;
        subscribe.setFrom(iq.to());
        subscribe.setTo( iq.from().bare() );
        subscribe.setType(Presence::Subscribe);
        d->stream->sendStanza(subscribe);

        emit userRegister( request.from(), request.getField(Registration::Username), request.getField(Registration::Password) );

        Presence presence;
        presence.setFrom(iq.to());
        presence.setTo( iq.from().bare() );
        d->stream->sendStanza(presence);

        /* execute log-in case */
        emit userLogIn(iq.from(), Presence::None);
        return;
    }
}