1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/* 2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * 4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */ 10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_ 12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_ 13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <string> 15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/asyncsocket.h" 16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmppclientsettings.h" 17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmppengine.h" 18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/xmpptask.h" 19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/sigslot.h" 20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/task.h" 21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz { 23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass PreXmppAuth; 25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass CaptchaChallenge; 26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// Just some non-colliding number. Could have picked "1". 28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define XMPP_CLIENT_TASK_CODE 0x366c1e47 29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org///////////////////////////////////////////////////////////////////// 31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// XMPPCLIENT 33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org///////////////////////////////////////////////////////////////////// 35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// See Task first. XmppClient is a parent task for XmppTasks. 37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// XmppClient is a task which is designed to be the parent task for 39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// all tasks that depend on a single Xmpp connection. If you want to, 40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// for example, listen for subscription requests forever, then your 41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// listener should be a task that is a child of the XmppClient that owns 42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// the connection you are using. XmppClient has all the utility methods 43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// that basically drill through to XmppEngine. 44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// XmppClient is just a wrapper for XmppEngine, and if I were writing it 46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// all over again, I would make XmppClient == XmppEngine. Why? 47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// XmppEngine needs tasks too, for example it has an XmppLoginTask which 48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// should just be the same kind of Task instead of an XmppEngine specific 49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// thing. It would help do certain things like GAIA auth cleaner. 50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// 51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org///////////////////////////////////////////////////////////////////// 52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass XmppClient : public XmppTaskParentInterface, 54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public XmppClientInterface, 55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public sigslot::has_slots<> 56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org{ 57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgpublic: 58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org explicit XmppClient(rtc::TaskParent * parent); 59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual ~XmppClient(); 60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppReturnStatus Connect(const XmppClientSettings & settings, 62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string & lang, 63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org AsyncSocket * socket, 64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org PreXmppAuth * preauth); 65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int ProcessStart(); 67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual int ProcessResponse(); 68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppReturnStatus Disconnect(); 69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org sigslot::signal1<XmppEngine::State> SignalStateChange; 71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngine::Error GetError(int *subcode); 72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // When there is a <stream:error> stanza, return the stanza 74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // so that they can be handled. 75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const XmlElement *GetStreamError(); 76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // When there is an authentication error, we may have captcha info 78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // that the user can use to unlock their account 79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org CaptchaChallenge GetCaptchaChallenge(); 80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // When authentication is successful, this returns the service token 82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // (if we used GAIA authentication) 83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string GetAuthMechanism(); 84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string GetAuthToken(); 85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppReturnStatus SendRaw(const std::string & text); 87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppEngine* engine(); 89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org sigslot::signal2<const char *, int> SignalLogInput; 91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org sigslot::signal2<const char *, int> SignalLogOutput; 92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // As XmppTaskParentIntreface 94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppClientInterface* GetClient() { return this; } 95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // As XmppClientInterface 97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppEngine::State GetState() const; 98269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual const Jid& jid() const; 99269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual std::string NextId(); 100269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendStanza(const XmlElement *stanza); 101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual XmppReturnStatus SendStanzaError(const XmlElement * pelOriginal, 102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org XmppStanzaError code, 103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org const std::string & text); 104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void AddXmppTask(XmppTask *, XmppEngine::HandlerLevel); 105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org virtual void RemoveXmppTask(XmppTask *); 106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private: 108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class XmppTask; 109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 110269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void OnAuthDone(); 111269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 112269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org // Internal state management 113269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org enum { 114269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org STATE_PRE_XMPP_LOGIN = STATE_NEXT, 115269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org STATE_START_XMPP_LOGIN = STATE_NEXT + 1, 116269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org }; 117269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int Process(int state) { 118269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org switch (state) { 119269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org case STATE_PRE_XMPP_LOGIN: return ProcessTokenLogin(); 120269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org case STATE_START_XMPP_LOGIN: return ProcessStartXmppLogin(); 121269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org default: return Task::Process(state); 122269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 123269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 124269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 125269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org std::string GetStateName(int state) const { 126269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org switch (state) { 127269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org case STATE_PRE_XMPP_LOGIN: return "PRE_XMPP_LOGIN"; 128269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org case STATE_START_XMPP_LOGIN: return "START_XMPP_LOGIN"; 129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org default: return Task::GetStateName(state); 130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org } 132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int ProcessTokenLogin(); 134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org int ProcessStartXmppLogin(); 135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org void EnsureClosed(); 136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org class Private; 138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org friend class Private; 139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org rtc::scoped_ptr<Private> d_; 140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool delivering_signal_; 142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org bool valid_; 143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}; 144269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 145269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org} 146269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org 147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif // WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_ 148