blob: dba591cb44a4769e08794ca63379cf031d31e6d0 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_
12#define WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_
13
kwiberg322c4a02016-04-30 02:40:22 -070014#include <memory>
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000015#include <string>
kwiberg322c4a02016-04-30 02:40:22 -070016
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000017#include "webrtc/libjingle/xmpp/asyncsocket.h"
18#include "webrtc/libjingle/xmpp/xmppclientsettings.h"
19#include "webrtc/libjingle/xmpp/xmppengine.h"
20#include "webrtc/libjingle/xmpp/xmpptask.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000021#include "webrtc/base/sigslot.h"
22#include "webrtc/base/task.h"
23
24namespace buzz {
25
26class PreXmppAuth;
27class CaptchaChallenge;
28
29// Just some non-colliding number. Could have picked "1".
30#define XMPP_CLIENT_TASK_CODE 0x366c1e47
31
32/////////////////////////////////////////////////////////////////////
33//
34// XMPPCLIENT
35//
36/////////////////////////////////////////////////////////////////////
37//
38// See Task first. XmppClient is a parent task for XmppTasks.
39//
40// XmppClient is a task which is designed to be the parent task for
41// all tasks that depend on a single Xmpp connection. If you want to,
42// for example, listen for subscription requests forever, then your
43// listener should be a task that is a child of the XmppClient that owns
44// the connection you are using. XmppClient has all the utility methods
45// that basically drill through to XmppEngine.
46//
47// XmppClient is just a wrapper for XmppEngine, and if I were writing it
48// all over again, I would make XmppClient == XmppEngine. Why?
49// XmppEngine needs tasks too, for example it has an XmppLoginTask which
50// should just be the same kind of Task instead of an XmppEngine specific
51// thing. It would help do certain things like GAIA auth cleaner.
52//
53/////////////////////////////////////////////////////////////////////
54
55class XmppClient : public XmppTaskParentInterface,
56 public XmppClientInterface,
57 public sigslot::has_slots<>
58{
59public:
60 explicit XmppClient(rtc::TaskParent * parent);
61 virtual ~XmppClient();
62
63 XmppReturnStatus Connect(const XmppClientSettings & settings,
64 const std::string & lang,
65 AsyncSocket * socket,
66 PreXmppAuth * preauth);
67
68 virtual int ProcessStart();
69 virtual int ProcessResponse();
70 XmppReturnStatus Disconnect();
71
72 sigslot::signal1<XmppEngine::State> SignalStateChange;
73 XmppEngine::Error GetError(int *subcode);
74
75 // When there is a <stream:error> stanza, return the stanza
76 // so that they can be handled.
77 const XmlElement *GetStreamError();
78
79 // When there is an authentication error, we may have captcha info
80 // that the user can use to unlock their account
81 CaptchaChallenge GetCaptchaChallenge();
82
83 // When authentication is successful, this returns the service token
84 // (if we used GAIA authentication)
85 std::string GetAuthMechanism();
86 std::string GetAuthToken();
87
88 XmppReturnStatus SendRaw(const std::string & text);
89
90 XmppEngine* engine();
91
92 sigslot::signal2<const char *, int> SignalLogInput;
93 sigslot::signal2<const char *, int> SignalLogOutput;
94
95 // As XmppTaskParentIntreface
96 virtual XmppClientInterface* GetClient() { return this; }
97
98 // As XmppClientInterface
99 virtual XmppEngine::State GetState() const;
100 virtual const Jid& jid() const;
101 virtual std::string NextId();
102 virtual XmppReturnStatus SendStanza(const XmlElement *stanza);
103 virtual XmppReturnStatus SendStanzaError(const XmlElement * pelOriginal,
104 XmppStanzaError code,
105 const std::string & text);
106 virtual void AddXmppTask(XmppTask *, XmppEngine::HandlerLevel);
107 virtual void RemoveXmppTask(XmppTask *);
108
109 private:
110 friend class XmppTask;
111
112 void OnAuthDone();
113
114 // Internal state management
115 enum {
116 STATE_PRE_XMPP_LOGIN = STATE_NEXT,
117 STATE_START_XMPP_LOGIN = STATE_NEXT + 1,
118 };
119 int Process(int state) {
120 switch (state) {
121 case STATE_PRE_XMPP_LOGIN: return ProcessTokenLogin();
122 case STATE_START_XMPP_LOGIN: return ProcessStartXmppLogin();
123 default: return Task::Process(state);
124 }
125 }
126
127 std::string GetStateName(int state) const {
128 switch (state) {
129 case STATE_PRE_XMPP_LOGIN: return "PRE_XMPP_LOGIN";
130 case STATE_START_XMPP_LOGIN: return "START_XMPP_LOGIN";
131 default: return Task::GetStateName(state);
132 }
133 }
134
135 int ProcessTokenLogin();
136 int ProcessStartXmppLogin();
137 void EnsureClosed();
138
139 class Private;
140 friend class Private;
kwiberg322c4a02016-04-30 02:40:22 -0700141 std::unique_ptr<Private> d_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000142
143 bool delivering_signal_;
144 bool valid_;
145};
146
147}
148
149#endif // WEBRTC_LIBJINGLE_XMPP_XMPPCLIENT_H_