Beispiel #1
0
bool MultiUserChat::setNickName(const QString &ANick)
{
	if (!ANick.isEmpty())
	{
		if (isConnected())
		{
			if (FNickName != ANick)
			{
				Jid userJid(FRoomJid.node(),FRoomJid.domain(),ANick);
				Stanza presence("presence");
				presence.setTo(userJid.full());
				if (FStanzaProcessor->sendStanzaOut(FStreamJid,presence))
				{
					LOG_STRM_INFO(FStreamJid,QString("Change conference nick request sent, room=%1, old=%2, new=%3").arg(FRoomJid.bare(),FNickName,ANick));
					return true;
				}
				LOG_STRM_WARNING(FStreamJid,QString("Failed to send change conference nick request, room=%1").arg(FRoomJid.bare()));
			}
		}
		else
		{
			FNickName = ANick;
			return true;
		}
	}
	else
	{
		REPORT_ERROR("Failed to change conference nick: Nick is empty");
	}
	return false;
}
Beispiel #2
0
bool MultiUserChat::inviteContact(const Jid &AContactJid, const QString &AReason)
{
	if (FStanzaProcessor && isOpen())
	{
		Message message;
		message.setTo(FRoomJid.bare());

		Stanza &mstanza = message.stanza();
		QDomElement invElem = mstanza.addElement("x",NS_MUC_USER).appendChild(mstanza.createElement("invite")).toElement();
		invElem.setAttribute("to",AContactJid.full());
		if (!AReason.isEmpty())
			invElem.appendChild(mstanza.createElement("reason")).appendChild(mstanza.createTextNode(AReason));

		if (FStanzaProcessor->sendStanzaOut(FStreamJid, mstanza))
		{
			LOG_STRM_INFO(FStreamJid,QString("Conference invite request sent, room=%1, contact=%2").arg(FRoomJid.bare(),AContactJid.full()));
			return true;
		}
		else
		{
			LOG_STRM_WARNING(FStreamJid,QString("Failed to send conference invite request, room=%1, contact=%2").arg(FRoomJid.bare(),AContactJid.full()));
		}
	}
	return false;
}
bool RosterItemExchange::stanzaReadWrite(int AHandleId, const Jid &AStreamJid, Stanza &AStanza, bool &AAccept)
{
	if (FSHIExchangeRequest==AHandleId && !AStanza.isError())
	{
		QDomElement xElem = AStanza.firstElement("x",NS_ROSTERX);
		if (!xElem.isNull() && !xElem.firstChildElement("item").isNull())
		{
			AAccept = true;

			LOG_STRM_INFO(AStreamJid,QString("Roster exchange request received, from=%1, kind=%2, id=%3").arg(AStanza.from(),AStanza.kind(),AStanza.id()));

			IRosterExchangeRequest request;
			request.streamJid = AStreamJid;
			request.contactJid = AStanza.from();
			request.id = AStanza.kind()==STANZA_KIND_IQ ? AStanza.id() : QString::null;
			request.message = AStanza.kind()==STANZA_KIND_MESSAGE ? Message(AStanza).body() : QString::null;

			QList<Jid> existItems;
			QDomElement itemElem = xElem.firstChildElement("item");

			bool isItemsValid = true;
			while (isItemsValid && !itemElem.isNull())
			{
				IRosterExchangeItem item;
				item.itemJid = Jid(itemElem.attribute("jid")).bare();
				item.name = itemElem.attribute("name");
				item.action = itemElem.attribute("action",ROSTEREXCHANGE_ACTION_ADD);

				QDomElement groupElem = itemElem.firstChildElement("group");
				while(!groupElem.isNull())
				{
					item.groups += groupElem.text();
					groupElem = groupElem.nextSiblingElement("group");
				}

				if (item.itemJid.isValid() && !existItems.contains(item.itemJid) && 
					(item.action==ROSTEREXCHANGE_ACTION_ADD || item.action==ROSTEREXCHANGE_ACTION_DELETE || item.action==ROSTEREXCHANGE_ACTION_MODIFY))
				{
					request.items.append(item);
					existItems.append(item.itemJid);
				}
				else
				{
					isItemsValid = false;
					LOG_STRM_WARNING(AStreamJid,QString("Failed to append roster exchange item, jid=%1, action=%2: Invalid item").arg(item.itemJid.bare(),item.action));
				}

				itemElem = itemElem.nextSiblingElement("item");
			}

			if (isItemsValid && !request.items.isEmpty())
				processRequest(request);
			else
				replyRequestError(request,XmppStanzaError::EC_BAD_REQUEST);

			return true;
		}
	}
	return false;
}
Beispiel #4
0
void Gateways::resolveNickName(const Jid &AStreamJid, const Jid &AContactJid)
{
	IRoster *roster = FRosterManager!=NULL ? FRosterManager->findRoster(AStreamJid) : NULL;
	IRosterItem ritem = roster!=NULL ? roster->findItem(AContactJid) : IRosterItem();
	if (!ritem.isNull() && roster->isOpen())
	{
		if (FVCardManager->hasVCard(ritem.itemJid))
		{
			static const QList<QString> nickFields = QList<QString>() << VVN_NICKNAME << VVN_FULL_NAME << VVN_GIVEN_NAME << VVN_FAMILY_NAME;
			LOG_STRM_INFO(AStreamJid,QString("Resolving contact nick name from vCard, jid=%1").arg(AContactJid.bare()));

			IVCard *vcard = FVCardManager->getVCard(ritem.itemJid);
			foreach(const QString &field, nickFields)
			{
				QString nick = vcard->value(field);
				if (!nick.isEmpty())
				{
					if (ritem.name != nick)
						roster->renameItem(ritem.itemJid,nick);
					break;
				}
			}
			vcard->unlock();
		}
		else
		{
Beispiel #5
0
bool MultiUserChat::requestVoice()
{
	if (FStanzaProcessor && isOpen() && FMainUser->data(MUDR_ROLE).toString()==MUC_ROLE_VISITOR)
	{
		Message message;
		message.setTo(FRoomJid.bare());

		Stanza &mstanza = message.stanza();
		QDomElement formElem = mstanza.addElement("x",NS_JABBER_DATA);
		formElem.setAttribute("type",DATAFORM_TYPE_SUBMIT);

		QDomElement fieldElem =  formElem.appendChild(mstanza.createElement("field")).toElement();
		fieldElem.setAttribute("var","FORM_TYPE");
		fieldElem.setAttribute("type",DATAFIELD_TYPE_HIDDEN);
		fieldElem.appendChild(mstanza.createElement("value")).appendChild(mstanza.createTextNode(MUC_FT_REQUEST));

		fieldElem = formElem.appendChild(mstanza.createElement("field")).toElement();
		fieldElem.setAttribute("var",MUC_FV_ROLE);
		fieldElem.setAttribute("type",DATAFIELD_TYPE_TEXTSINGLE);
		fieldElem.setAttribute("label","Requested role");
		fieldElem.appendChild(mstanza.createElement("value")).appendChild(mstanza.createTextNode(MUC_ROLE_PARTICIPANT));

		if (FStanzaProcessor->sendStanzaOut(FStreamJid, mstanza))
		{
			LOG_STRM_INFO(FStreamJid,QString("Voice request sent to conference, room=%1").arg(FRoomJid.bare()));
			return true;
		}
		else
		{
			LOG_STRM_WARNING(FStreamJid,QString("Failed to send voice request to conference, room=%1").arg(FRoomJid.bare()));
		}
	}
	return false;
}
void IqAuthFeatureFactory::onFeatureDestroyed()
{
	IXmppFeature *feature = qobject_cast<IXmppFeature *>(sender());
	if (feature)
	{
		LOG_STRM_INFO(feature->xmppStream()->streamJid(),"Iq-Auth XMPP stream feature destroyed");
		emit featureDestroyed(feature);
	}
}
Beispiel #7
0
bool InBandStream::open(QIODevice::OpenMode AMode)
{
	if (FStanzaProcessor && streamState()==IDataStreamSocket::Closed)
	{
		setStreamError(XmppError::null);
		if (streamKind() == IDataStream::Initiator)
		{
			Stanza openRequest(STANZA_KIND_IQ);
			openRequest.setType(STANZA_TYPE_SET).setTo(FContactJid.full()).setUniqueId();
			QDomElement elem = openRequest.addElement("open",NS_INBAND_BYTESTREAMS);
			elem.setAttribute("sid",FStreamId);
			elem.setAttribute("block-size",FBlockSize);
			elem.setAttribute("stanza",FStanzaType==StanzaMessage ? STANZA_KIND_MESSAGE : STANZA_KIND_IQ);
			if (FStanzaProcessor->sendStanzaRequest(this,FStreamJid,openRequest,OPEN_TIMEOUT))
			{
				LOG_STRM_INFO(FStreamJid,QString("Open stream request sent, sid=%1").arg(FStreamId));
				FOpenRequestId = openRequest.id();
				setOpenMode(AMode);
				setStreamState(IDataStreamSocket::Opening);
				return true;
			}
			else
			{
				LOG_STRM_WARNING(FStreamJid,QString("Failed to send open stream request, sid=%1").arg(FStreamId));
			}
		}
		else
		{
			FSHIOpen = insertStanzaHandle(SHC_INBAND_OPEN);
			if (FSHIOpen != -1)
			{
				LOG_STRM_INFO(FStreamJid,QString("Open stanza handler inserted, sid=%1").arg(FStreamId));
				setOpenMode(AMode);
				setStreamState(IDataStreamSocket::Opening);
				return true;
			}
			else
			{
				LOG_STRM_WARNING(FStreamJid,QString("Failed to insert open stanza handler, sid=%1").arg(FStreamId));
			}
		}
	}
	return false;
}
Beispiel #8
0
void InBandStream::setStreamState(int AState)
{
	if (streamState() != AState)
	{
		if (AState == IDataStreamSocket::Opened)
		{
			FSeqIn = 0;
			FSeqOut = 0;
			FDataIqRequestId.clear();
			FThreadLock.lockForWrite();
			QIODevice::open(openMode());
			FThreadLock.unlock();
			LOG_STRM_INFO(FStreamJid,QString("In-band stream opened, sid=%1, stanzaType=%2").arg(FStreamId).arg(FStanzaType));
		}
		else if (AState == IDataStreamSocket::Closed)
		{
			removeStanzaHandle(FSHIOpen);
			removeStanzaHandle(FSHIClose);
			removeStanzaHandle(FSHIData);
			emit readChannelFinished();

			FThreadLock.lockForWrite();
			FStreamState = AState;
			QString saveError = QIODevice::errorString();
			QIODevice::close();
			QIODevice::setErrorString(saveError);
			FReadBuffer.clear();
			FWriteBuffer.clear();
			FThreadLock.unlock();

			FReadyReadCondition.wakeAll();
			FBytesWrittenCondition.wakeAll();
			LOG_STRM_INFO(FStreamJid,QString("In-band stream closed, sid=%1").arg(FStreamId));
		}

		FThreadLock.lockForWrite();
		FStreamState = AState;
		FThreadLock.unlock();

		emit stateChanged(AState);
	}
}
Beispiel #9
0
void IqAuthFeature::sendAuthRequest()
{
	Stanza request("iq");
	request.setType("get").setId("getIqAuth");
	request.addElement("query",NS_JABBER_IQ_AUTH).appendChild(request.createElement("username")).appendChild(request.createTextNode(FXmppStream->streamJid().pNode()));

	FXmppStream->insertXmppStanzaHandler(XSHO_XMPP_FEATURE,this);
	FXmppStream->sendStanza(request);

	LOG_STRM_INFO(FXmppStream->streamJid(),"Authentication initialization request sent");
}
bool SASLSessionFeature::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder)
{
	if (AXmppStream==FXmppStream && AOrder==XSHO_XMPP_FEATURE && AStanza.id()=="session")
	{
		if (AStanza.isResult())
		{
			LOG_STRM_INFO(FXmppStream->streamJid(),"Session started");
			deleteLater();
			emit finished(false);
		}
		else
		{
			XmppStanzaError err(AStanza);
			LOG_STRM_INFO(FXmppStream->streamJid(),QString("Failed to start session: %1").arg(err.condition()));
			emit error(err);
		}
		return true;
	}
	return false;
}
IXmppFeature *IqAuthFeatureFactory::newXmppFeature(const QString &AFeatureNS, IXmppStream *AXmppStream)
{
	if (AFeatureNS == NS_FEATURE_IQAUTH)
	{
		LOG_STRM_INFO(AXmppStream->streamJid(),"Iq-Auth XMPP stream feature created");
		IXmppFeature *feature = new IqAuthFeature(AXmppStream);
		connect(feature->instance(),SIGNAL(featureDestroyed()),SLOT(onFeatureDestroyed()));
		emit featureCreated(feature);
		return feature;
	}
	return NULL;
}
Beispiel #12
0
bool Roster::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder)
{
	if (!FVerSupported && !isOpen() && FXmppStream==AXmppStream && AOrder==XSHO_XMPP_FEATURE)
	{
		if (AStanza.element().nodeName()=="stream:features" && !AStanza.firstElement("ver",NS_FEATURE_ROSTER_VER).isNull())
		{
			FVerSupported = true;
			LOG_STRM_INFO(streamJid(),"Roster versioning is supported by server");
		}
	}
	return false;
}
void SocksStreams::onDiscoItemsReceived(const IDiscoItems &AItems)
{
	if (AItems.contactJid==AItems.streamJid.domain() && AItems.node.isEmpty())
	{
		FStreamProxy.remove(AItems.streamJid);
		foreach(const IDiscoItem &item, AItems.items)
		{
			QString itemBareJid = item.itemJid.pBare();
			if (itemBareJid.startsWith("proxy.") || itemBareJid.startsWith("proxy65."))
			{
				LOG_STRM_INFO(AItems.streamJid,QString("Found socks proxy on server, jid=%1").arg(itemBareJid));
				FStreamProxy.insert(AItems.streamJid,itemBareJid);
				break;
			}
		}
	}
Beispiel #14
0
bool PrivateStorage::stanzaReadWrite(int AHandleId, const Jid &AStreamJid, Stanza &AStanza, bool &AAccept)
{
	if (AHandleId == FSHINotifyDataChanged)
	{
		AAccept = true;
		QDomElement dataElem = AStanza.firstElement("x",NS_VACUUM_PRIVATESTORAGE_UPDATE).firstChildElement();
		while (!dataElem.isNull())
		{
			LOG_STRM_INFO(AStreamJid,QString("Private data update notify received, ns=%1").arg(dataElem.namespaceURI()));
			emit dataChanged(AStreamJid,dataElem.tagName(),dataElem.namespaceURI());
			dataElem = dataElem.nextSiblingElement();
		}
		return true;
	}
	return false;
}
Beispiel #15
0
bool XmppUriQueries::openXmppUri(const Jid &AStreamJid, const QUrl &AUrl) const
{
	Jid contactJid;
	QString action;
	QMultiMap<QString, QString> params;
	if (parseXmppUri(AUrl,contactJid,action,params))
	{
		LOG_STRM_INFO(AStreamJid,QString("Opening XMPP URI, url=%1").arg(AUrl.toString()));
		foreach (IXmppUriHandler *handler, FHandlers)
		{
			if (handler->xmppUriOpen(AStreamJid, contactJid, action, params))
				return true;
		}
		LOG_STRM_WARNING(AStreamJid,QString("Failed to open XMPP URI, url=%1").arg(AUrl.toString()));
	}
	return false;
}
Beispiel #16
0
bool Annotations::loadAnnotations(const Jid &AStreamJid)
{
	if (FPrivateStorage)
	{
		QString id = FPrivateStorage->loadData(AStreamJid,PST_ANNOTATIONS,PSN_ANNOTATIONS);
		if (!id.isEmpty())
		{
			LOG_STRM_INFO(AStreamJid,QString("Annotations load request sent, id=%1").arg(id));
			FLoadRequests.insert(id,AStreamJid);
			return true;
		}
		else
		{
			LOG_STRM_WARNING(AStreamJid,"Failed to send load annotations request");
		}
	}
	return false;
}
Beispiel #17
0
bool MultiUserChat::sendSubject(const QString &ASubject)
{
	if (FStanzaProcessor && isOpen())
	{
		Message message;
		message.setTo(FRoomJid.bare()).setType(Message::GroupChat).setSubject(ASubject);
		if (FStanzaProcessor->sendStanzaOut(FStreamJid,message.stanza()))
		{
			LOG_STRM_INFO(FStreamJid,QString("Conference subject change message sent, room=%1").arg(FRoomJid.bare()));
			return true;
		}
		else
		{
			LOG_STRM_WARNING(FStreamJid,QString("Failed to send conference subject change message, room=%1").arg(FRoomJid.bare()));
		}
	}
	return false;
}
void RosterItemExchange::stanzaRequestResult(const Jid &AStreamJid, const Stanza &AStanza)
{
	Q_UNUSED(AStreamJid);
	if (FSentRequests.contains(AStanza.id()))
	{
		IRosterExchangeRequest request = FSentRequests.take(AStanza.id());
		if (AStanza.isResult())
		{
			LOG_STRM_INFO(AStreamJid,QString("Roster exchange request accepted by=%1, id=%2").arg(AStanza.from(),AStanza.id()));
			emit exchangeRequestApproved(request);
		}
		else
		{
			XmppStanzaError err(AStanza);
			LOG_STRM_WARNING(AStreamJid,QString("Roster exchange request rejected by=%1, id=%2: %3").arg(AStanza.from(),AStanza.id(),err.condition()));
			emit exchangeRequestFailed(request,err);
		}
	}
}
bool SASLSessionFeature::start(const QDomElement &AElem)
{
	if (AElem.tagName() == "session")
	{
		Stanza session(STANZA_KIND_IQ);
		session.setType(STANZA_TYPE_SET).setId("session");
		session.addElement("session",NS_FEATURE_SESSION);
		FXmppStream->insertXmppStanzaHandler(XSHO_XMPP_FEATURE,this);
		FXmppStream->sendStanza(session);
		LOG_STRM_INFO(FXmppStream->streamJid(),"Session start request sent");
		return true;
	}
	else
	{
		LOG_STRM_WARNING(FXmppStream->streamJid(),QString("Failed to start session: Invalid element=%1").arg(AElem.tagName()));
	}
	deleteLater();
	return false;
}
void RegisterStream::onRegisterDialogAccepred()
{
	FXmppStream->setKeepAliveTimerActive(true);
	if (FDialog)
	{
		Stanza submit("iq");
		submit.setType("set").setId("setReg");
		QDomElement query = submit.addElement("query",NS_JABBER_REGISTER);
		FDataForms->xmlForm(FDataForms->dataSubmit(FDialog->formWidget()->userDataForm()),query);
		FXmppStream->sendStanza(submit);

		LOG_STRM_INFO(FXmppStream->streamJid(),"Account registration submit request sent");
	}
	else
	{
		LOG_STRM_WARNING(FXmppStream->streamJid(),"Account registration form dialog destroyed");
		emit error(XmppError(IERR_REGISTER_INVALID_DIALOG));
	}
	FDialog = NULL;
}
Beispiel #21
0
QString JabberSearch::sendRequest(const Jid &AStreamJid, const Jid &AServiceJid)
{
    if (FStanzaProcessor)
    {
        Stanza request("iq");
        request.setTo(AServiceJid.full()).setType("get").setId(FStanzaProcessor->newId());
        request.addElement("query",NS_JABBER_SEARCH);
        if (FStanzaProcessor->sendStanzaRequest(this,AStreamJid,request,SEARCH_TIMEOUT))
        {
            LOG_STRM_INFO(AStreamJid,QString("Search request sent to=%1, id=%2").arg(AServiceJid.full(),request.id()));
            FRequests.append(request.id());
            return request.id();
        }
        else
        {
            LOG_STRM_WARNING(AStreamJid,QString("Failed to send search request to=%1").arg(AServiceJid.full()));
        }
    }
    return QString::null;
}
Beispiel #22
0
bool MultiUserChat::sendDataFormMessage(const IDataForm &AForm)
{
	if (FStanzaProcessor && FDataForms && isOpen())
	{
		Message message;
		message.setTo(FRoomJid.bare());
		QDomElement elem = message.stanza().element();
		FDataForms->xmlForm(AForm,elem);
		if (FStanzaProcessor->sendStanzaRequest(this,FStreamJid,message.stanza(),0))
		{
			LOG_STRM_INFO(FStreamJid,QString("Conference data form message sent, room=%1, title=%2").arg(FRoomJid.bare(),AForm.title));
			emit dataFormMessageSent(AForm);
			return true;
		}
		else
		{
			LOG_STRM_WARNING(FStreamJid,QString("Failed to send conference data form message, room=%1, title=%2").arg(FRoomJid.bare(),AForm.title));
		}
	}
	return false;
}
bool ClientInfo::requestLastActivity(const Jid &AStreamJid, const Jid &AContactJid)
{
	bool sent = FActivityId.values().contains(AContactJid);
	if (!sent && AStreamJid.isValid() && AContactJid.isValid())
	{
		Stanza iq(STANZA_KIND_IQ);
		iq.setType(STANZA_TYPE_GET).setTo(AContactJid.full()).setUniqueId();
		iq.addElement("query",NS_JABBER_LAST);
		sent = FStanzaProcessor->sendStanzaRequest(this,AStreamJid,iq,LAST_ACTIVITY_TIMEOUT);
		if (sent)
		{
			FActivityId.insert(iq.id(),AContactJid);
			LOG_STRM_INFO(AStreamJid,QString("Last activity request sent to=%1").arg(AContactJid.full()));
		}
		else
		{
			LOG_STRM_WARNING(AStreamJid,QString("Failed to send last activity request to=%1").arg(AContactJid.full()));
		}
	}
	return sent;
}
Beispiel #24
0
bool CompressFeature::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder)
{
	if (AXmppStream==FXmppStream && AOrder==XSHO_XMPP_FEATURE)
	{
		FXmppStream->removeXmppStanzaHandler(XSHO_XMPP_FEATURE,this);
		if (AStanza.tagName() == "compressed")
		{
			LOG_STRM_INFO(AXmppStream->streamJid(),"Stream compression started");
			FXmppStream->insertXmppDataHandler(XDHO_FEATURE_COMPRESS,this);
			emit finished(true);
		}
		else
		{
			LOG_STRM_WARNING(AXmppStream->streamJid(),QString("Failed to start stream compression: %1").arg(AStanza.tagName()));
			deleteLater();
			emit finished(false);
		}
		return true;
	}
	return false;
}
Beispiel #25
0
InBandStream::InBandStream(IStanzaProcessor *AProcessor, const QString &AStreamId, const Jid &AStreamJid, const Jid &AContactJid, int AKind, QObject *AParent)
		: QIODevice(AParent), FReadBuffer(BUFFER_INCREMENT_SIZE), FWriteBuffer(BUFFER_INCREMENT_SIZE,MAX_BUFFER_SIZE)
{
	FStanzaProcessor = AProcessor;

	FStreamId = AStreamId;
	FStreamJid = AStreamJid;
	FContactJid = AContactJid;
	FStreamKind = AKind;

	FSHIOpen = -1;
	FSHIClose = -1;
	FSHIData = -1;

	FBlockSize = DEFAULT_BLOCK_SIZE;
	FMaxBlockSize = DEFAULT_MAX_BLOCK_SIZE;
	FStanzaType = DEFAULT_DATA_STANZA_TYPE;
	FStreamState = IDataStreamSocket::Closed;

	LOG_STRM_INFO(AStreamJid,QString("In-band stream created, sid=%1, kind=%2").arg(FStreamId).arg(FStreamKind));
}
bool ClientInfo::requestSoftwareInfo(const Jid &AStreamJid, const Jid &AContactJid)
{
	bool sent = FSoftwareId.values().contains(AContactJid);
	if (!sent && AStreamJid.isValid() && AContactJid.isValid())
	{
		Stanza iq(STANZA_KIND_IQ);
		iq.setType(STANZA_TYPE_GET).setTo(AContactJid.full()).setUniqueId();
		iq.addElement("query",NS_JABBER_VERSION);
		sent = FStanzaProcessor->sendStanzaRequest(this,AStreamJid,iq,SOFTWARE_INFO_TIMEOUT);
		if (sent)
		{
			FSoftwareId.insert(iq.id(),AContactJid);
			FSoftwareItems[AContactJid].status = SoftwareLoading;
			LOG_STRM_INFO(AStreamJid,QString("Software version request sent to=%1").arg(AContactJid.full()));
		}
		else
		{
			LOG_STRM_WARNING(AStreamJid,QString("Failed to sent software request to=%1").arg(AContactJid.full()));
		}
	}
	return sent;
}
Beispiel #27
0
bool XmppUriQueries::openXmppUri(const Jid &AStreamJid, const QUrl &AUrl) const
{
	if (AUrl.isValid() && AUrl.scheme()=="xmpp")
	{
		QUrl url =  QUrl::fromEncoded(AUrl.toEncoded().replace(';','&'), QUrl::StrictMode);
		Jid contactJid = url.path();
		QList< QPair<QString, QString> > keyValues = url.queryItems();
		if (keyValues.count() > 0)
		{
			QString action = keyValues.takeAt(0).first;
			if (contactJid.isValid() && !action.isEmpty())
			{
				QMultiMap<QString, QString> params;
				for (int i=0; i<keyValues.count(); i++)
					params.insertMulti(keyValues.at(i).first, keyValues.at(i).second);

				LOG_STRM_INFO(AStreamJid,QString("Opening XMPP URI, url=%1").arg(AUrl.toString()));
				foreach (IXmppUriHandler *handler, FHandlers)
				{
					if (handler->xmppUriOpen(AStreamJid, contactJid, action, params))
						return true;
				}
			}
Beispiel #28
0
bool Annotations::saveAnnotations(const Jid &AStreamJid)
{
	if (isEnabled(AStreamJid))
	{
		QDomDocument doc;
		QDomElement storage = doc.appendChild(doc.createElementNS(PSN_ANNOTATIONS,PST_ANNOTATIONS)).toElement();

		const QMap<Jid, Annotation> &items = FAnnotations.value(AStreamJid);
		QMap<Jid, Annotation>::const_iterator it = items.constBegin();
		while (it != items.constEnd())
		{
			QDomElement elem = storage.appendChild(doc.createElement("note")).toElement();
			elem.setAttribute("jid",it.key().bare());
			elem.setAttribute("cdate",it.value().created.toX85UTC());
			elem.setAttribute("mdate",it.value().modified.toX85UTC());
			elem.appendChild(doc.createTextNode(it.value().note));
			++it;
		}

		QString id = FPrivateStorage->saveData(AStreamJid,doc.documentElement());
		if (!id.isEmpty())
		{
			LOG_STRM_INFO(AStreamJid,QString("Save annotations request sent, id=%1").arg(id));
			FSaveRequests.insert(id,AStreamJid);
			return true;
		}
		else
		{
			LOG_STRM_WARNING(AStreamJid,"Failed to send save annotations request");
		}
	}
	else
	{
		LOG_STRM_WARNING(AStreamJid,"Failed to save annotations: Annotations is not ready");
	}
	return false;
}
Beispiel #29
0
bool CompressFeature::start(const QDomElement &AElem)
{
	if (AElem.tagName() == "compression")
	{
		QDomElement elem = AElem.firstChildElement("method");
		while (!elem.isNull())
		{
			if (elem.text() == "zlib")
			{
				if (startZlib())
				{
					LOG_STRM_INFO(FXmppStream->streamJid(),QString("Starting stream compression with ZLib=%1").arg(ZLIB_VERSION));
					Stanza compress("compress");
					compress.setAttribute("xmlns",NS_PROTOCOL_COMPRESS);
					compress.addElement("method").appendChild(compress.createTextNode("zlib"));
					FXmppStream->insertXmppStanzaHandler(XSHO_XMPP_FEATURE,this);
					FXmppStream->sendStanza(compress);
					return true;
				}
				else
				{
					LOG_STRM_ERROR(FXmppStream->streamJid(),"Failed to initialize ZLib");
				}
				break;
			}
			elem = elem.nextSiblingElement("method");
		}
		if (elem.isNull())
			LOG_STRM_WARNING(FXmppStream->streamJid(),"Failed to start stream compression: Method not supported");
	}
	else
	{
		LOG_STRM_ERROR(FXmppStream->streamJid(),QString("Failed to start stream compression: Invalid element name %1").arg(AElem.tagName()));
	}
	deleteLater();
	return false;
}
Beispiel #30
0
QString JabberSearch::sendSubmit(const Jid &AStreamJid, const ISearchSubmit &ASubmit)
{
    if (FStanzaProcessor)
    {
        Stanza submit("iq");
        submit.setTo(ASubmit.serviceJid.full()).setType("set").setId(FStanzaProcessor->newId());

        QDomElement query = submit.addElement("query",NS_JABBER_SEARCH);
        if (FDataForms && !ASubmit.form.type.isEmpty())
        {
            FDataForms->xmlForm(ASubmit.form,query);
        }
        else
        {
            if (!ASubmit.item.firstName.isEmpty())
                query.appendChild(submit.createElement("first")).appendChild(submit.createTextNode(ASubmit.item.firstName));
            if (!ASubmit.item.lastName.isEmpty())
                query.appendChild(submit.createElement("last")).appendChild(submit.createTextNode(ASubmit.item.lastName));
            if (!ASubmit.item.nick.isEmpty())
                query.appendChild(submit.createElement("nick")).appendChild(submit.createTextNode(ASubmit.item.nick));
            if (!ASubmit.item.email.isEmpty())
                query.appendChild(submit.createElement("email")).appendChild(submit.createTextNode(ASubmit.item.email));
        }

        if (FStanzaProcessor->sendStanzaRequest(this,AStreamJid,submit,SEARCH_TIMEOUT))
        {
            LOG_STRM_INFO(AStreamJid,QString("Search submit sent to=%1, id=%2").arg(ASubmit.serviceJid.full(),submit.id()));
            FSubmits.append(submit.id());
            return submit.id();
        }
        else
        {
            LOG_STRM_WARNING(AStreamJid,QString("Failed to send search submit to=%1").arg(ASubmit.serviceJid.full()));
        }
    }
    return QString::null;
}