15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector> 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <algorithm> 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppengineimpl.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/constants.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace buzz { 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass XmppIqEntry { 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqEntry(const std::string & id, const std::string & to, 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppEngine * pxce, XmppIqHandler * iq_handler) : 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org id_(id), 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org to_(to), 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_(pxce), 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_handler_(iq_handler) { 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgprivate: 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org friend class XmppEngineImpl; 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string id_; 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string to_; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppEngine * const engine_; 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqHandler * const iq_handler_; 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppReturnStatus 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppEngineImpl::SendIq(const XmlElement * element, XmppIqHandler * iq_handler, 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqCookie* cookie) { 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (state_ == STATE_CLOSED) 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADSTATE; 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (NULL == iq_handler) 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADARGUMENT; 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!element || element->Name() != QN_IQ) 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADARGUMENT; 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& type = element->Attr(QN_TYPE); 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (type != "get" && type != "set") 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADARGUMENT; 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!element->HasAttr(QN_ID)) 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADARGUMENT; 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& id = element->Attr(QN_ID); 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqEntry * iq_entry = new XmppIqEntry(id, 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org element->Attr(QN_TO), 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org this, iq_handler); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entries_->push_back(iq_entry); 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SendStanza(element); 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (cookie) 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *cookie = iq_entry; 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_OK; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppReturnStatus 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppEngineImpl::RemoveIqHandler(XmppIqCookie cookie, 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqHandler ** iq_handler) { 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<XmppIqEntry*, std::allocator<XmppIqEntry*> >::iterator pos; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pos = std::find(iq_entries_->begin(), 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entries_->end(), 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org reinterpret_cast<XmppIqEntry*>(cookie)); 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (pos == iq_entries_->end()) 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADARGUMENT; 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqEntry* entry = *pos; 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entries_->erase(pos); 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (iq_handler) 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *iq_handler = entry->iq_handler_; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete entry; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_OK; 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppEngineImpl::DeleteIqCookies() { 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < iq_entries_->size(); i += 1) { 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqEntry * iq_entry_ = (*iq_entries_)[i]; 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (*iq_entries_)[i] = NULL; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete iq_entry_; 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entries_->clear(); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic void 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgAecImpl(XmlElement * error_element, const QName & name, 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const char * type, const char * code) { 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element->AddElement(new XmlElement(QN_ERROR)); 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element->AddAttr(QN_CODE, code, 1); 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element->AddAttr(QN_TYPE, type, 1); 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element->AddElement(new XmlElement(name, true), 1); 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic void 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgAddErrorCode(XmlElement * error_element, XmppStanzaError code) { 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org switch (code) { 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_BAD_REQUEST: 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_BAD_REQUEST, "modify", "400"); 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_CONFLICT: 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_CONFLICT, "cancel", "409"); 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_FEATURE_NOT_IMPLEMENTED: 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_FEATURE_NOT_IMPLEMENTED, 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "cancel", "501"); 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_FORBIDDEN: 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_FORBIDDEN, "auth", "403"); 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_GONE: 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_GONE, "modify", "302"); 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_INTERNAL_SERVER_ERROR: 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_INTERNAL_SERVER_ERROR, "wait", "500"); 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_ITEM_NOT_FOUND: 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_ITEM_NOT_FOUND, "cancel", "404"); 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_JID_MALFORMED: 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_JID_MALFORMED, "modify", "400"); 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_NOT_ACCEPTABLE: 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_NOT_ACCEPTABLE, "cancel", "406"); 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_NOT_ALLOWED: 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_NOT_ALLOWED, "cancel", "405"); 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_PAYMENT_REQUIRED: 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_PAYMENT_REQUIRED, "auth", "402"); 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_RECIPIENT_UNAVAILABLE: 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_RECIPIENT_UNAVAILABLE, "wait", "404"); 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_REDIRECT: 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_REDIRECT, "modify", "302"); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_REGISTRATION_REQUIRED: 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_REGISTRATION_REQUIRED, "auth", "407"); 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_SERVER_NOT_FOUND: 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_REMOTE_SERVER_NOT_FOUND, 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "cancel", "404"); 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_SERVER_TIMEOUT: 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_REMOTE_SERVER_TIMEOUT, "wait", "502"); 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_RESOURCE_CONSTRAINT: 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_RESOURCE_CONSTRAINT, "wait", "500"); 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_SERVICE_UNAVAILABLE: 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_SERVICE_UNAVAILABLE, "cancel", "503"); 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_SUBSCRIPTION_REQUIRED: 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_SUBSCRIPTION_REQUIRED, "auth", "407"); 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_UNDEFINED_CONDITION: 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_UNDEFINED_CONDITION, "wait", "500"); 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case XSE_UNEXPECTED_REQUEST: 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AecImpl(error_element, QN_STANZA_UNEXPECTED_REQUEST, "wait", "400"); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppReturnStatus 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppEngineImpl::SendStanzaError(const XmlElement * element_original, 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppStanzaError code, 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string & text) { 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (state_ == STATE_CLOSED) 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_BADSTATE; 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmlElement error_element(element_original->Name()); 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element.AddAttr(QN_TYPE, "error"); 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // copy attrs, copy 'from' to 'to' and strip 'from' 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (const XmlAttr * attribute = element_original->FirstAttr(); 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org attribute; attribute = attribute->NextAttr()) { 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org QName name = attribute->Name(); 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (name == QN_TO) 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org continue; // no need to put a from attr. Server will stamp stanza 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org else if (name == QN_FROM) 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org name = QN_TO; 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org else if (name == QN_TYPE) 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org continue; 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element.AddAttr(name, attribute->Value()); 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // copy children 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (const XmlChild * child = element_original->FirstChild(); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org child; 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org child = child->NextChild()) { 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (child->IsText()) { 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element.AddText(child->AsText()->Text()); 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element.AddElement(new XmlElement(*(child->AsElement()))); 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // add error information 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddErrorCode(&error_element, code); 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (text != STR_EMPTY) { 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmlElement * text_element = new XmlElement(QN_STANZA_TEXT, true); 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org text_element->AddText(text); 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_element.AddElement(text_element); 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SendStanza(&error_element); 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return XMPP_RETURN_OK; 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgXmppEngineImpl::HandleIqResponse(const XmlElement * element) { 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (iq_entries_->empty()) 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (element->Name() != QN_IQ) 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string type = element->Attr(QN_TYPE); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (type != "result" && type != "error") 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!element->HasAttr(QN_ID)) 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string id = element->Attr(QN_ID); 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string from = element->Attr(QN_FROM); 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (std::vector<XmppIqEntry *>::iterator it = iq_entries_->begin(); 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org it != iq_entries_->end(); it += 1) { 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqEntry * iq_entry = *it; 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (iq_entry->id_ == id && iq_entry->to_ == from) { 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entries_->erase(it); 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org iq_entry->iq_handler_->IqResponse(iq_entry, element); 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete iq_entry; 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 278