/*
 *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_LIBJINGLE_XMPP_XMPPPUMP_H_
#define WEBRTC_LIBJINGLE_XMPP_XMPPPUMP_H_

#include "webrtc/libjingle/xmpp/xmppclient.h"
#include "webrtc/libjingle/xmpp/xmppengine.h"
#include "webrtc/libjingle/xmpp/xmpptask.h"
#include "webrtc/base/messagequeue.h"
#include "webrtc/base/taskrunner.h"
#include "webrtc/base/thread.h"
#include "webrtc/base/timeutils.h"

namespace buzz {

// Simple xmpp pump

class XmppPumpNotify {
public:
  virtual ~XmppPumpNotify() {}
  virtual void OnStateChange(buzz::XmppEngine::State state) = 0;
};

class XmppPump : public rtc::MessageHandler, public rtc::TaskRunner {
public:
  XmppPump(buzz::XmppPumpNotify * notify = NULL);

  buzz::XmppClient *client() { return client_; }

  void DoLogin(const buzz::XmppClientSettings & xcs,
               buzz::AsyncSocket* socket,
               buzz::PreXmppAuth* auth);
  void DoDisconnect();

  void OnStateChange(buzz::XmppEngine::State state);

  void WakeTasks();

  int64 CurrentTime();

  void OnMessage(rtc::Message *pmsg);

  buzz::XmppReturnStatus SendStanza(const buzz::XmlElement *stanza);

private:
  buzz::XmppClient *client_;
  buzz::XmppEngine::State state_;
  buzz::XmppPumpNotify *notify_;
};

}  // namespace buzz

#endif // WEBRTC_LIBJINGLE_XMPP_XMPPPUMP_H_

