buffet: Move WebServClient out of libweave

libweave now relies on platform specific implementation of
weave::HttpServer.

BUG=brillo:1252
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I8f2c2f119699ff5096a74dc05948db0eaf108ea3
Reviewed-on: https://chromium-review.googlesource.com/290142
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index c72b4d8..400bf44 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -35,6 +35,7 @@
         'manager.cc',
         'peerd_client.cc',
         'shill_client.cc',
+        'webserv_client.cc',
         '../libweave/src/base_api_handler.cc',
         '../libweave/src/buffet_config.cc',
         '../libweave/src/commands/cloud_command_proxy.cc',
@@ -67,7 +68,6 @@
         '../libweave/src/privet/privet_types.cc',
         '../libweave/src/privet/publisher.cc',
         '../libweave/src/privet/security_manager.cc',
-        '../libweave/src/privet/webserv_client.cc',
         '../libweave/src/privet/wifi_bootstrap_manager.cc',
         '../libweave/src/privet/wifi_ssid_generator.cc',
         '../libweave/src/registration_status.cc',
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 9df8caa..047c121 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -27,6 +27,7 @@
 #include "buffet/dbus_conversion.h"
 #include "buffet/peerd_client.h"
 #include "buffet/shill_client.h"
+#include "buffet/webserv_client.h"
 #include "weave/enum_to_string.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
@@ -57,12 +58,15 @@
 void Manager::Start(const weave::Device::Options& options,
                     const std::set<std::string>& device_whitelist,
                     AsyncEventSequencer* sequencer) {
-  peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()});
   shill_client_.reset(new ShillClient{dbus_object_.GetBus(), device_whitelist});
+  if (!options.disable_privet) {
+    peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()});
+    web_serv_client_.reset(new WebServClient{dbus_object_.GetBus(), sequencer});
+  }
 
   device_ = weave::Device::Create();
-  device_->Start(options, peerd_client_.get(), shill_client_.get(),
-                 &dbus_object_, sequencer);
+  device_->Start(options, shill_client_.get(), peerd_client_.get(),
+                 web_serv_client_.get(), &dbus_object_, sequencer);
 
   command_dispatcher_.reset(new DBusCommandDispacher{
       dbus_object_.GetObjectManager(), device_->GetCommands()});
diff --git a/buffet/manager.h b/buffet/manager.h
index c0037e9..880d753 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -33,6 +33,7 @@
 class DBusCommandDispacher;
 class PeerdClient;
 class ShillClient;
+class WebServClient;
 
 template<typename... Types>
 using DBusMethodResponsePtr =
@@ -117,8 +118,9 @@
   org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this};
   chromeos::dbus_utils::DBusObject dbus_object_;
 
-  std::unique_ptr<PeerdClient> peerd_client_;
   std::unique_ptr<ShillClient> shill_client_;
+  std::unique_ptr<PeerdClient> peerd_client_;
+  std::unique_ptr<WebServClient> web_serv_client_;
   std::unique_ptr<weave::Device> device_;
   std::unique_ptr<DBusCommandDispacher> command_dispatcher_;
 
diff --git a/libweave/src/privet/webserv_client.cc b/buffet/webserv_client.cc
similarity index 92%
rename from libweave/src/privet/webserv_client.cc
rename to buffet/webserv_client.cc
index b8ba74d..2ae5910 100644
--- a/libweave/src/privet/webserv_client.cc
+++ b/buffet/webserv_client.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "libweave/src/privet/webserv_client.h"
-//
+#include "buffet/webserv_client.h"
+
 #include <memory>
 #include <string>
 
@@ -14,12 +14,11 @@
 
 #include "buffet/dbus_constants.h"
 
-namespace weave {
-namespace privet {
+namespace buffet {
 
 namespace {
 
-class RequestImpl : public HttpServer::Request {
+class RequestImpl : public weave::HttpServer::Request {
  public:
   explicit RequestImpl(std::unique_ptr<libwebserv::Request> request)
       : request_{std::move(request)} {}
@@ -46,9 +45,10 @@
   web_server_->Disconnect();
 }
 
-void WebServClient::AddOnStateChangedCallback(const base::Closure& callback) {
+void WebServClient::AddOnStateChangedCallback(
+    const OnStateChangedCallback& callback) {
   on_state_changed_callbacks_.push_back(callback);
-  callback.Run();
+  callback.Run(*this);
 }
 
 void WebServClient::AddRequestHandler(const std::string& path_prefix,
@@ -116,7 +116,7 @@
     certificate_ = protocol_handler->GetCertificateFingerprint();
   }
   for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run();
+    cb.Run(*this);
 }
 
 void WebServClient::OnProtocolHandlerDisconnected(
@@ -129,8 +129,7 @@
     certificate_.clear();
   }
   for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run();
+    cb.Run(*this);
 }
 
-}  // namespace privet
-}  // namespace weave
+}  // namespace buffet
diff --git a/libweave/src/privet/webserv_client.h b/buffet/webserv_client.h
similarity index 82%
rename from libweave/src/privet/webserv_client.h
rename to buffet/webserv_client.h
index 43eb859..cbfbf23 100644
--- a/libweave/src/privet/webserv_client.h
+++ b/buffet/webserv_client.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_
-#define LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_
+#ifndef BUFFET_WEBSERV_CLIENT_H_
+#define BUFFET_WEBSERV_CLIENT_H_
 
 #include <memory>
 #include <string>
@@ -30,18 +30,18 @@
 class Server;
 }
 
-namespace weave {
-namespace privet {
+namespace buffet {
 
 // Wrapper around libwebserv that implements HttpServer interface.
-class WebServClient : public HttpServer {
+class WebServClient : public weave::HttpServer {
  public:
   WebServClient(const scoped_refptr<dbus::Bus>& bus,
                 chromeos::dbus_utils::AsyncEventSequencer* sequencer);
   ~WebServClient() override;
 
   // HttpServer implementation.
-  void AddOnStateChangedCallback(const base::Closure& callback) override;
+  void AddOnStateChangedCallback(
+      const OnStateChangedCallback& callback) override;
   void AddRequestHandler(const std::string& path_prefix,
                          const OnRequestCallback& callback) override;
   uint16_t GetHttpPort() const override;
@@ -68,7 +68,7 @@
   uint16_t https_port_{0};
   chromeos::Blob certificate_;
 
-  std::vector<base::Closure> on_state_changed_callbacks_;
+  std::vector<OnStateChangedCallback> on_state_changed_callbacks_;
 
   std::unique_ptr<libwebserv::Server> web_server_;
 
@@ -76,7 +76,6 @@
   DISALLOW_COPY_AND_ASSIGN(WebServClient);
 };
 
-}  // namespace privet
-}  // namespace weave
+}  // namespace buffet
 
-#endif  // LIBWEAVE_SRC_PRIVET_WEBSERV_CLIENT_H_
+#endif  // BUFFET_WEBSERV_CLIENT_H_
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index e7d9d7d..019bc74 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -15,6 +15,7 @@
 #include "weave/cloud.h"
 #include "weave/commands.h"
 #include "weave/config.h"
+#include "weave/http_server.h"
 #include "weave/mdns.h"
 #include "weave/network.h"
 #include "weave/privet.h"
@@ -46,8 +47,9 @@
   virtual ~Device() = default;
 
   virtual void Start(const Options& options,
-                     Mdns* mdns,
                      Network* network,
+                     Mdns* mdns,
+                     HttpServer* http_server,
                      chromeos::dbus_utils::DBusObject* dbus_object,
                      chromeos::dbus_utils::AsyncEventSequencer* sequencer) = 0;
 
diff --git a/libweave/include/weave/http_server.h b/libweave/include/weave/http_server.h
index db30252..59e7542 100644
--- a/libweave/include/weave/http_server.h
+++ b/libweave/include/weave/http_server.h
@@ -26,6 +26,8 @@
     virtual ~Request() = default;
   };
 
+  using OnStateChangedCallback = base::Callback<void(const HttpServer& server)>;
+
   using OnReplyCallback = base::Callback<void(int status_code,
                                               const std::string& data,
                                               const std::string& mime_type)>;
@@ -35,7 +37,8 @@
                           const OnReplyCallback& callback)>;
 
   // Adds notification callback for server started/stopped serving requests.
-  virtual void AddOnStateChangedCallback(const base::Closure& callback) = 0;
+  virtual void AddOnStateChangedCallback(
+      const OnStateChangedCallback& callback) = 0;
 
   // Adds callback called on new http/https requests with the given path prefix.
   virtual void AddRequestHandler(const std::string& path_prefix,
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index cd79a02..28d3c97 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -31,15 +31,13 @@
 
 DeviceManager::DeviceManager() {}
 
-DeviceManager::~DeviceManager() {
-  if (privet_)
-    privet_->Shutdown();
-}
+DeviceManager::~DeviceManager() {}
 
 void DeviceManager::Start(
     const Options& options,
-    Mdns* mdns,
     Network* network,
+    Mdns* mdns,
+    HttpServer* http_server,
     chromeos::dbus_utils::DBusObject* dbus_object,
     chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
   command_manager_ = std::make_shared<CommandManager>();
@@ -67,8 +65,12 @@
 
   device_info_->Start();
 
-  if (!options.disable_privet)
-    StartPrivet(options, mdns, network, dbus_object, sequencer);
+  if (!options.disable_privet) {
+    StartPrivet(options, network, mdns, http_server, dbus_object, sequencer);
+  } else {
+    CHECK(!http_server);
+    CHECK(!mdns);
+  }
 }
 
 Commands* DeviceManager::GetCommands() {
@@ -93,13 +95,15 @@
 
 void DeviceManager::StartPrivet(
     const Options& options,
-    Mdns* mdns,
     Network* network,
+    Mdns* mdns,
+    HttpServer* http_server,
     chromeos::dbus_utils::DBusObject* dbus_object,
     chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
   privet_.reset(new privet::Manager{});
-  privet_->Start(options, dbus_object->GetBus(), network, device_info_.get(),
-                 command_manager_.get(), state_manager_.get(), mdns, sequencer);
+  privet_->Start(options, dbus_object->GetBus(), network, mdns, http_server,
+                 device_info_.get(), command_manager_.get(),
+                 state_manager_.get(), sequencer);
 
   privet_->AddOnWifiSetupChangedCallback(
       base::Bind(&DeviceManager::OnWiFiBootstrapStateChanged,
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index 2e0f00a..6f22fac 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -34,8 +34,9 @@
   ~DeviceManager() override;
 
   void Start(const Options& options,
-             Mdns* mdns,
              Network* network,
+             Mdns* mdns,
+             HttpServer* http_server,
              chromeos::dbus_utils::DBusObject* dbus_object,
              chromeos::dbus_utils::AsyncEventSequencer* sequencer) override;
 
@@ -47,8 +48,9 @@
 
  private:
   void StartPrivet(const Options& options,
-                   Mdns* mdns,
                    Network* network,
+                   Mdns* mdns,
+                   HttpServer* http_server,
                    chromeos::dbus_utils::DBusObject* dbus_object,
                    chromeos::dbus_utils::AsyncEventSequencer* sequencer);
 
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index 3e9f604..c49eec3 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -35,9 +35,7 @@
 #include "libweave/src/privet/device_delegate.h"
 #include "libweave/src/privet/privet_handler.h"
 #include "libweave/src/privet/publisher.h"
-#include "libweave/src/privet/webserv_client.h"
 #include "weave/network.h"
-#include "weave/http_server.h"
 
 namespace weave {
 namespace privet {
@@ -57,10 +55,11 @@
 void Manager::Start(const Device::Options& options,
                     const scoped_refptr<dbus::Bus>& bus,
                     Network* network,
+                    Mdns* mdns,
+                    HttpServer* http_server,
                     DeviceRegistrationInfo* device,
                     CommandManager* command_manager,
                     StateManager* state_manager,
-                    Mdns* mdns,
                     AsyncEventSequencer* sequencer) {
   disable_security_ = options.disable_security;
 
@@ -88,14 +87,13 @@
       new PrivetHandler(cloud_.get(), device_.get(), security_.get(),
                         wifi_bootstrap_manager_.get(), publisher_.get()));
 
-  web_server_.reset(new WebServClient{bus, sequencer});
-  web_server_->AddOnStateChangedCallback(base::Bind(
+  http_server->AddOnStateChangedCallback(base::Bind(
       &Manager::OnHttpServerStatusChanged, weak_ptr_factory_.GetWeakPtr()));
-  web_server_->AddRequestHandler("/privet/",
+  http_server->AddRequestHandler("/privet/",
                                  base::Bind(&Manager::PrivetRequestHandler,
                                             weak_ptr_factory_.GetWeakPtr()));
   if (options.enable_ping) {
-    web_server_->AddRequestHandler("/privet/ping",
+    http_server->AddRequestHandler("/privet/ping",
                                    base::Bind(&Manager::HelloWorldHandler,
                                               weak_ptr_factory_.GetWeakPtr()));
   }
@@ -121,10 +119,6 @@
   security_->RegisterPairingListeners(on_start, on_end);
 }
 
-void Manager::Shutdown() {
-  web_server_.reset();
-}
-
 void Manager::OnDeviceInfoChanged() {
   OnChanged();
 }
@@ -182,15 +176,14 @@
   OnChanged();
 }
 
-void Manager::OnHttpServerStatusChanged() {
-  if (device_->GetHttpEnpoint().first != web_server_->GetHttpPort()) {
-    device_->SetHttpPort(web_server_->GetHttpPort());
-    if (publisher_)
+void Manager::OnHttpServerStatusChanged(const HttpServer& server) {
+  if (device_->GetHttpEnpoint().first != server.GetHttpPort()) {
+    device_->SetHttpPort(server.GetHttpPort());
+    if (publisher_)  // Only HTTP port is published
       publisher_->Update();
   }
-  device_->SetHttpsPort(web_server_->GetHttpsPort());
-  security_->SetCertificateFingerprint(
-      web_server_->GetHttpsCertificateFingerprint());
+  device_->SetHttpsPort(server.GetHttpsPort());
+  security_->SetCertificateFingerprint(server.GetHttpsCertificateFingerprint());
 }
 
 }  // namespace privet
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 29b803d..c6e6dd9 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -17,7 +17,6 @@
 #include "libweave/src/privet/security_manager.h"
 #include "libweave/src/privet/wifi_bootstrap_manager.h"
 #include "weave/device.h"
-#include "weave/http_server.h"
 
 namespace chromeos {
 namespace dbus_utils {
@@ -48,7 +47,6 @@
 class PrivetHandler;
 class Publisher;
 class SecurityManager;
-class WebServClient;
 
 class Manager : public Privet, public CloudDelegate::Observer {
  public:
@@ -58,10 +56,11 @@
   void Start(const weave::Device::Options& options,
              const scoped_refptr<dbus::Bus>& bus,
              Network* network,
+             Mdns* mdns,
+             HttpServer* http_server,
              DeviceRegistrationInfo* device,
              CommandManager* command_manager,
              StateManager* state_manager,
-             Mdns* mdns,
              chromeos::dbus_utils::AsyncEventSequencer* sequencer);
 
   std::string GetCurrentlyConnectedSsid() const;
@@ -73,8 +72,6 @@
       const OnPairingStartedCallback& on_start,
       const OnPairingEndedCallback& on_end) override;
 
-  void Shutdown();
-
  private:
   // CloudDelegate::Observer
   void OnDeviceInfoChanged() override;
@@ -92,7 +89,7 @@
   void OnChanged();
   void OnConnectivityChanged(bool online);
 
-  void OnHttpServerStatusChanged();
+  void OnHttpServerStatusChanged(const HttpServer& server);
 
   bool disable_security_{false};
   std::unique_ptr<CloudDelegate> cloud_;
@@ -102,8 +99,6 @@
   std::unique_ptr<Publisher> publisher_;
   std::unique_ptr<PrivetHandler> privet_handler_;
 
-  std::unique_ptr<WebServClient> web_server_;
-
   ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};
 
   base::WeakPtrFactory<Manager> weak_ptr_factory_{this};