Beispiel #1
0
qint64 ConnectionBOSH::writeData(const char *payloaddata, qint64 payloadlen)
{
	jreenDebug() << Q_FUNC_INFO;
	Q_D(ConnectionBOSH);
	jreenDebug() << d->dataRequest << d->emptyRequest;
	if (d->dataRequest && payloadlen > 0) {
		d->payloads.append(payloaddata, payloadlen);
		return payloadlen;
	}
	bool isEmpty = payloadlen == 0;
	d->writer.writeStartElement(QLatin1String("body"));
	d->writer.writeAttribute(QLatin1String("rid"), QString::number(d->rid++));
	d->writer.writeAttribute(QLatin1String("sid"), d->sessionId);
	d->writer.writeAttribute(QLatin1String("key"), QLatin1String(d->nextKey()));
	if (d->keys.size() == 1)
		d->writer.writeAttribute(QLatin1String("newkey"), QLatin1String(d->generateKey()));
	d->writer.writeDefaultNamespace(QLatin1String("http://jabber.org/protocol/httpbind"));
	if (isEmpty)  {
	} else {
		d->writer.writeCharacters(QLatin1String(""));
		d->resultXml.append(payloaddata, payloadlen);
		d->resultBuffer.seek(d->resultXml.size());
	}
	d->writer.writeEndElement();
	d->send(isEmpty);
	return payloadlen;
}
Beispiel #2
0
MessageSession *MessageSessionManager::session(const JID &jid, Message::Type type, bool create)
{
	Q_D(MessageSessionManager);
	QList<QPointer<MessageSession> > sessions = d->fullSessions.values(jid.full());
	jreenDebug() << "d->full_sessions" << d->fullSessions;
	foreach(MessageSession *session, sessions)
		jreenDebug() << "MessageSession" << (session ? session->jid() : JID());
	for(int i = 0; i < sessions.size(); i++)
	{
		if(sessions[i].isNull())
		{
			d->fullSessions.remove(jid.full(), sessions[i]);
			continue;
		}
		return sessions[i];
	}
	if(!create)
		return 0;
	MessageSessionHandler *handler = d->sessionHandlers.value(type);
	if(!handler)
		return 0;
	MessageSession *session = new MessageSession(this, jid.full(), false, QString());
	handler->handleMessageSession(session);
	return session;
}
Beispiel #3
0
void BookmarkStorage::onResultReady(const Payload::Ptr &node,
									PrivateXml::Result result, const Error::Ptr &error)
{
	Q_UNUSED(error);
	jreenDebug() << "onResultReady";
	if(result == PrivateXml::RequestOk) {
		Bookmark *bookmark = se_cast<Bookmark*>(node.data());
		jreenDebug() << "received bookmarks" << bookmark << node.data();
		if (bookmark)
			emit bookmarksReceived(node.staticCast<Bookmark>());
		else
			emit bookmarksReceived(Bookmark::Ptr::create());
	}
}
Beispiel #4
0
void DirectConnectionPrivate::doLookup()
{
	jreenDebug() << "doLookup";
	emit stateChanged(QAbstractSocket::HostLookupState);

	QDnsLookup *dns = new QDnsLookup(this);
	connect(dns, SIGNAL(finished()), this, SLOT(lookupResultsReady()));

	dns->setType(QDnsLookup::SRV);
	dns->setName(QString::fromLatin1("_xmpp-client._tcp." + QUrl::toAce(host_name)));
	dns->lookup();
}
Beispiel #5
0
void ConnectionBOSH::onRequestFinished(QNetworkReply *reply)
{
	Q_D(ConnectionBOSH);
	reply->deleteLater();
	jreenDebug() << Q_FUNC_INFO << reply->error() << reply->errorString();
	if (reply->error() != QNetworkReply::NoError) {
		// TODO: Implement
		return;
	}
	bool header = reply->property("header").toBool();
	QByteArray data = reply->readAll();
	jreenDebug() << Q_FUNC_INFO << header << data;
	d->reader.addData(data);
	// Hook for parsers invoked in eventloops, which are run inside parser
	if (d->depth != 0)
		return;
	while (d->reader.readNext() > QXmlStreamReader::Invalid) {
		switch(d->reader.tokenType()) {
		case QXmlStreamReader::StartElement:
			d->depth++;
			if (d->depth > 1) {
				d->streamParser->handleStartElement(d->reader.name(), d->reader.namespaceUri(),
													d->reader.attributes());
			} else {
				Q_ASSERT(d->reader.name() == QLatin1String("body"));
				const QXmlStreamAttributes attributes = d->reader.attributes();
				if (d->streamInitiation) {
					d->streamInitiation = false;
					d->sessionId = attributes.value(QLatin1String("sid")).toString();
					emit connected();
				}
				if (header)
					d->streamParser->handleStartElement(QStringRef(), QStringRef(),
														QXmlStreamAttributes());
			}
			break;
		case QXmlStreamReader::EndElement:
			if (d->depth > 1)
				d->streamParser->handleEndElement(d->reader.name(), d->reader.namespaceUri());
			d->depth--;
			break;
		case QXmlStreamReader::Characters:
			if (d->depth > 1)
				d->streamParser->handleCharacterData(d->reader.text());
			break;
		default:
			break;
		}
	}
	Q_ASSERT(d->depth == 0);
	if (!d->payloads.isEmpty() && reply == d->dataRequest) {
		d->dataRequest = 0;
		writeData(d->payloads.constData(), d->payloads.size());
		d->payloads.clear();
		return;
	} else if (reply == d->dataRequest) {
		d->dataRequest = 0;
	}
	if (reply == d->emptyRequest)
		d->emptyRequest = 0;
	if (d->authorized && !d->emptyRequest) {
		char c;
		writeData(&c, 0);
	}
}