1/*
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_LOGINTASK_H_
12#define WEBRTC_LIBJINGLE_XMPP_LOGINTASK_H_
13
14#include <string>
15#include <vector>
16
17#include "webrtc/libjingle/xmpp/jid.h"
18#include "webrtc/libjingle/xmpp/xmppengine.h"
19#include "webrtc/base/logging.h"
20#include "webrtc/base/scoped_ptr.h"
21
22namespace buzz {
23
24class XmlElement;
25class XmppEngineImpl;
26class SaslMechanism;
27
28
29// TODO: Rename to LoginTask.
30class XmppLoginTask {
31
32public:
33  XmppLoginTask(XmppEngineImpl *pctx);
34  ~XmppLoginTask();
35
36  bool IsDone()
37    { return state_ == LOGINSTATE_DONE; }
38  void IncomingStanza(const XmlElement * element, bool isStart);
39  void OutgoingStanza(const XmlElement *element);
40  void set_allow_non_google_login(bool b)
41    { allowNonGoogleLogin_ = b; }
42
43private:
44  enum LoginTaskState {
45    LOGINSTATE_INIT = 0,
46    LOGINSTATE_STREAMSTART_SENT,
47    LOGINSTATE_STARTED_XMPP,
48    LOGINSTATE_TLS_INIT,
49    LOGINSTATE_AUTH_INIT,
50    LOGINSTATE_BIND_INIT,
51    LOGINSTATE_TLS_REQUESTED,
52    LOGINSTATE_SASL_RUNNING,
53    LOGINSTATE_BIND_REQUESTED,
54    LOGINSTATE_SESSION_REQUESTED,
55    LOGINSTATE_DONE,
56  };
57
58  const XmlElement * NextStanza();
59  bool Advance();
60  bool HandleStartStream(const XmlElement * element);
61  bool HandleFeatures(const XmlElement * element);
62  const XmlElement * GetFeature(const QName & name);
63  bool Failure(XmppEngine::Error reason);
64  void FlushQueuedStanzas();
65
66  XmppEngineImpl * pctx_;
67  bool authNeeded_;
68  bool allowNonGoogleLogin_;
69  LoginTaskState state_;
70  const XmlElement * pelStanza_;
71  bool isStart_;
72  std::string iqId_;
73  rtc::scoped_ptr<XmlElement> pelFeatures_;
74  Jid fullJid_;
75  std::string streamId_;
76  rtc::scoped_ptr<std::vector<XmlElement *> > pvecQueuedStanzas_;
77
78  rtc::scoped_ptr<SaslMechanism> sasl_mech_;
79
80#if !defined(NDEBUG)
81  static const rtc::ConstantLabel LOGINTASK_STATES[];
82#endif
83};
84
85}
86
87#endif  //  WEBRTC_LIBJINGLE_XMPP_LOGINTASK_H_
88