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