// Copyright 2015 The Weave Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_
#define LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_
#include <weave/provider/network.h>
#include <base/memory/weak_ptr.h>
struct evdns_base;
struct bufferevent;
namespace weave {
namespace examples {
class EventTaskRunner;
class EventNetworkImpl : public weave::provider::Network {
class Deleter {
public:
void operator()(evdns_base* dns_base);
void operator()(bufferevent* bev);
};
public:
explicit EventNetworkImpl(EventTaskRunner* task_runner_);
void AddConnectionChangedCallback(
const ConnectionChangedCallback& callback) override;
State GetConnectionState() const override;
void OpenSslSocket(const std::string& host,
uint16_t port,
const OpenSslSocketCallback& callback) override;
void SetSimulateOffline(bool value) {
simulate_offline_ = value;
UpdateNetworkState();
}
private:
void UpdateNetworkState();
void UpdateNetworkStateCallback(provider::Network::State state);
bool simulate_offline_{false};
EventTaskRunner* task_runner_{nullptr};
std::unique_ptr<evdns_base, Deleter> dns_base_;
std::vector<ConnectionChangedCallback> callbacks_;
provider::Network::State network_state_{provider::Network::State::kOffline};
std::unique_ptr<bufferevent, Deleter> connectivity_probe_;
base::WeakPtrFactory<EventNetworkImpl> weak_ptr_factory_{this};
};
} // namespace examples
} // namespace weave
#endif // LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_