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; }
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; }
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 {
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); } }
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; }
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); } }
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; }
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; } } }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; } }
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; }
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; }
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; }