Merge "Initial add of flouride "domain socket" bluetooth client"
diff --git a/buffet/avahi_mdns_client.h b/buffet/avahi_mdns_client.h
index 7784218..2488dd4 100644
--- a/buffet/avahi_mdns_client.h
+++ b/buffet/avahi_mdns_client.h
@@ -22,7 +22,7 @@
 
 #include <base/memory/weak_ptr.h>
 #include <dbus/bus.h>
-#include <weave/mdns.h>
+#include <weave/dns_service_discovery_provider.h>
 
 #include "buffet/mdns_client.h"
 
@@ -34,7 +34,7 @@
   explicit AvahiMdnsClient(const scoped_refptr<dbus::Bus>& bus);
   ~AvahiMdnsClient() override;
 
-  // weave::Mdns implementation.
+  // weave::DnsServiceDiscoveryProvider implementation.
   void PublishService(const std::string& service_type, uint16_t port,
                       const std::vector<std::string>& txt) override;
   void StopPublishing(const std::string& service_type) override;
diff --git a/buffet/brillo_network_client.cc b/buffet/brillo_network_client.cc
index e611177..c467418 100644
--- a/buffet/brillo_network_client.cc
+++ b/buffet/brillo_network_client.cc
@@ -21,7 +21,7 @@
 namespace buffet {
 
 namespace {
-const char kErrorCommandFailed[] = "commandFailed";
+const char kErrorDomain[] = "brillo_network";
 const int kConnectionTimeoutSeconds = 30;
 const int kConnectionActivePollSeconds = 3;
 const int kConnectionInactivePollSeconds = 10;
@@ -36,18 +36,22 @@
 BrilloNetworkClient::~BrilloNetworkClient() {
 }
 
-void BrilloNetworkClient::AddOnConnectionChangedCallback(
-    const OnConnectionChangedCallback& listener) {
+void BrilloNetworkClient::AddConnectionChangedCallback(
+    const ConnectionChangedCallback& listener) {
   connection_listeners_.push_back(listener);
 }
 
-bool BrilloNetworkClient::ConnectToService(const std::string& ssid,
-                                           const std::string& passphrase,
-                                           const base::Closure& on_success,
-                                           weave::ErrorPtr* error) {
+void BrilloNetworkClient::Connect(const std::string& ssid,
+                                  const std::string& passphrase,
+                                  const weave::SuccessCallback& on_success,
+                                  const weave::ErrorCallback& on_error) {
   if (!connectivity_client_.ConnectToAccessPoint(ssid, passphrase)) {
-    weave::Error::AddTo(error, FROM_HERE, kErrorCommandFailed, "", "");
-    return false;
+    weave::ErrorPtr error;
+    weave::Error::AddTo(&error, FROM_HERE, kErrorDomain, "network_failure",
+                        "Failed to connect to service");
+    base::MessageLoop::current()->PostDelayedTask(
+        FROM_HERE, base::Bind(on_error, base::Owned(error.release())), {});
+    return;
   }
 
   connection_success_closure_ = on_success;
@@ -62,20 +66,18 @@
       base::TimeDelta::FromSeconds(kConnectionTimeoutSeconds));
 
   ScheduleNextStatePoll();
-
-  return true;
 }
 
 weave::NetworkState BrilloNetworkClient::GetConnectionState() const {
   return state_;
 }
 
-void BrilloNetworkClient::EnableAccessPoint(const std::string& ssid) {
+void BrilloNetworkClient::StartAccessPoint(const std::string& ssid) {
   connectivity_client_.EnableAccessPoint(ssid);
   state_ = weave::NetworkState::kOffline;
 }
 
-void BrilloNetworkClient::DisableAccessPoint() {
+void BrilloNetworkClient::StopAccessPoint() {
   connectivity_client_.DisableAccessPoint();
 }
 
@@ -112,7 +114,7 @@
   }
   if (is_connected != was_connected) {
     for (const auto& listener : connection_listeners_) {
-      listener.Run(is_connected);
+      listener.Run();
     }
   }
   ScheduleNextStatePoll();
diff --git a/buffet/brillo_network_client.h b/buffet/brillo_network_client.h
index 6a00ac8..f05bd97 100644
--- a/buffet/brillo_network_client.h
+++ b/buffet/brillo_network_client.h
@@ -21,7 +21,7 @@
 #include <vector>
 
 #include <base/cancelable_callback.h>
-#include <weave/network.h>
+#include <weave/network_provider.h>
 
 #include "connectivity_client.h"
 
@@ -35,15 +35,16 @@
   ~BrilloNetworkClient() override;
 
   // Implements the Network interface.
-  void AddOnConnectionChangedCallback(
-      const OnConnectionChangedCallback& listener) override;
-  bool ConnectToService(const std::string& ssid,
-                        const std::string& passphrase,
-                        const base::Closure& on_success,
-                        weave::ErrorPtr* error) override;
+  void AddConnectionChangedCallback(
+      const ConnectionChangedCallback& listener) override;
+  void Connect(
+      const std::string& ssid,
+      const std::string& passphrase,
+      const weave::SuccessCallback& on_success,
+      const base::Callback<void(const weave::Error*)>& on_error) override;
   weave::NetworkState GetConnectionState() const override;
-  void EnableAccessPoint(const std::string& ssid) override;
-  void DisableAccessPoint() override;
+  void StartAccessPoint(const std::string& ssid) override;
+  void StopAccessPoint() override;
 
  private:
   enum class ConnectionState {
@@ -57,7 +58,7 @@
   void UpdateConnectionState();
 
   ConnectivityClient connectivity_client_;
-  std::vector<OnConnectionChangedCallback> connection_listeners_;
+  std::vector<ConnectionChangedCallback> connection_listeners_;
   base::CancelableClosure connection_timeout_closure_;
   base::CancelableClosure periodic_connection_state_closure_;
   base::Closure connection_success_closure_;
diff --git a/buffet/manager.cc b/buffet/manager.cc
index ef2fc96..787036c 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -91,7 +91,8 @@
 
   device_->Start(options, config_.get(), task_runner_.get(), http_client_.get(),
                  network_client_.get(), mdns_client_.get(),
-                 web_serv_client_.get(), bluetooth_client_.get());
+                 web_serv_client_.get(), network_client_.get(),
+                 bluetooth_client_.get());
 
   command_dispatcher_.reset(new DBusCommandDispacher{
       dbus_object_.GetObjectManager(), device_->GetCommands()});
diff --git a/buffet/mdns_client.h b/buffet/mdns_client.h
index 374deba..3743b79 100644
--- a/buffet/mdns_client.h
+++ b/buffet/mdns_client.h
@@ -24,12 +24,12 @@
 #include <base/guid.h>
 #include <base/memory/ref_counted.h>
 #include <dbus/bus.h>
-#include <weave/mdns.h>
+#include <weave/dns_service_discovery_provider.h>
 
 namespace buffet {
 
 // Stub MDNS implementation that does nothing on platform without MDNS support.
-class MdnsClient : public weave::Mdns {
+class MdnsClient : public weave::DnsServiceDiscoveryProvider {
  public:
   MdnsClient() : device_id_{base::GenerateGUID()} {}
   ~MdnsClient() override = default;
diff --git a/buffet/network_client.h b/buffet/network_client.h
index d43e825..81d1e77 100644
--- a/buffet/network_client.h
+++ b/buffet/network_client.h
@@ -23,14 +23,16 @@
 
 #include <base/cancelable_callback.h>
 #include <chromeos/errors/error_codes.h>
-#include <weave/network.h>
+#include <weave/network_provider.h>
+#include <weave/wifi_provider.h>
 
 #include "buffet/socket_stream.h"
 #include "buffet/weave_error_conversion.h"
 
 namespace buffet {
 
-class NetworkClient : public weave::Network {
+class NetworkClient : public weave::NetworkProvider,
+                      public weave::WifiProvider {
  public:
   explicit NetworkClient(const std::set<std::string>& device_whitelist)
       : device_whitelist_{device_whitelist} {
@@ -38,33 +40,19 @@
 
   ~NetworkClient() override = default;
 
-  // Implements the Network interface.
-  void AddOnConnectionChangedCallback(
-      const OnConnectionChangedCallback& listener) override {
-  }
-
-  bool ConnectToService(const std::string& ssid,
-                        const std::string& passphrase,
-                        const base::Closure& on_success,
-                        weave::ErrorPtr* error) override {
-    return true;
-  }
+  // NetworkProvider implementation.
+  void AddConnectionChangedCallback(
+      const ConnectionChangedCallback& listener) override {}
 
   weave::NetworkState GetConnectionState() const override {
     return weave::NetworkState::kOffline;
   }
 
-  void EnableAccessPoint(const std::string& ssid) override {
-  }
-
-  void DisableAccessPoint() override {
-  }
-
   void OpenSslSocket(
       const std::string& host,
       uint16_t port,
       const base::Callback<void(std::unique_ptr<weave::Stream>)>& on_success,
-      const base::Callback<void(const weave::Error*)>& on_error) override {
+      const weave::ErrorCallback& on_error) override {
     auto socket = SocketStream::ConnectBlocking(host, port);
     if (socket) {
       SocketStream::TlsConnect(std::move(socket), host, on_success, on_error);
@@ -77,6 +65,16 @@
     on_error.Run(weave_error.get());
   }
 
+  // WifiProvider implementation.
+  void Connect(const std::string& ssid,
+               const std::string& passphrase,
+               const weave::SuccessCallback& on_success,
+               const weave::ErrorCallback& on_error) override {}
+
+  void StartAccessPoint(const std::string& ssid) override {}
+
+  void StopAccessPoint() override {}
+
   static std::unique_ptr<NetworkClient> CreateInstance(
       const std::set<std::string>& device_whitelist);
 
diff --git a/buffet/socket_stream.cc b/buffet/socket_stream.cc
index 9ce56bf..8ee9c60 100644
--- a/buffet/socket_stream.cc
+++ b/buffet/socket_stream.cc
@@ -69,11 +69,10 @@
 
 }  // namespace
 
-void SocketStream::ReadAsync(
-    void* buffer,
-    size_t size_to_read,
-    const base::Callback<void(size_t)>& success_callback,
-    const base::Callback<void(const weave::Error*)>& error_callback) {
+void SocketStream::Read(void* buffer,
+                        size_t size_to_read,
+                        const ReadSuccessCallback& success_callback,
+                        const weave::ErrorCallback& error_callback) {
   chromeos::ErrorPtr chromeos_error;
   if (!ptr_->ReadAsync(buffer, size_to_read, success_callback,
                        base::Bind(&OnError, error_callback), &chromeos_error)) {
@@ -84,11 +83,10 @@
   }
 }
 
-void SocketStream::WriteAllAsync(
-    const void* buffer,
-    size_t size_to_write,
-    const base::Closure& success_callback,
-    const base::Callback<void(const weave::Error*)>& error_callback) {
+void SocketStream::Write(const void* buffer,
+                         size_t size_to_write,
+                         const weave::SuccessCallback& success_callback,
+                         const weave::ErrorCallback& error_callback) {
   chromeos::ErrorPtr chromeos_error;
   if (!ptr_->WriteAllAsync(buffer, size_to_write, success_callback,
                            base::Bind(&OnError, error_callback),
@@ -100,7 +98,7 @@
   }
 }
 
-void SocketStream::CancelPendingAsyncOperations() {
+void SocketStream::CancelPendingOperations() {
   ptr_->CancelPendingAsyncOperations();
 }
 
@@ -124,7 +122,7 @@
     std::unique_ptr<Stream> socket,
     const std::string& host,
     const base::Callback<void(std::unique_ptr<Stream>)>& success_callback,
-    const base::Callback<void(const weave::Error*)>& error_callback) {
+    const weave::ErrorCallback& error_callback) {
   SocketStream* stream = static_cast<SocketStream*>(socket.get());
   chromeos::TlsStream::Connect(std::move(stream->ptr_), host,
                                base::Bind(&OnSuccess, success_callback),
diff --git a/buffet/socket_stream.h b/buffet/socket_stream.h
index 757190c..968acb9 100644
--- a/buffet/socket_stream.h
+++ b/buffet/socket_stream.h
@@ -20,29 +20,26 @@
 
   ~SocketStream() override = default;
 
-  void ReadAsync(
-      void* buffer,
-      size_t size_to_read,
-      const base::Callback<void(size_t)>& success_callback,
-      const base::Callback<void(const weave::Error*)>& error_callback) override;
+  void Read(void* buffer,
+            size_t size_to_read,
+            const ReadSuccessCallback& success_callback,
+            const weave::ErrorCallback& error_callback) override;
 
-  void WriteAllAsync(
-      const void* buffer,
-      size_t size_to_write,
-      const base::Closure& success_callback,
-      const base::Callback<void(const weave::Error*)>& error_callback) override;
+  void Write(const void* buffer,
+             size_t size_to_write,
+             const weave::SuccessCallback& success_callback,
+             const weave::ErrorCallback& error_callback) override;
 
-  void CancelPendingAsyncOperations() override;
+  void CancelPendingOperations() override;
 
   static std::unique_ptr<weave::Stream> ConnectBlocking(const std::string& host,
                                                         uint16_t port);
 
-  static void TlsConnect(
-      std::unique_ptr<weave::Stream> socket,
-      const std::string& host,
-      const base::Callback<void(std::unique_ptr<weave::Stream>)>&
-          success_callback,
-      const base::Callback<void(const weave::Error*)>& error_callback);
+  static void TlsConnect(std::unique_ptr<weave::Stream> socket,
+                         const std::string& host,
+                         const base::Callback<void(
+                             std::unique_ptr<weave::Stream>)>& success_callback,
+                         const weave::ErrorCallback& error_callback);
 
  private:
   chromeos::StreamPtr ptr_;
diff --git a/buffet/webserv_client.cc b/buffet/webserv_client.cc
index 37c9716..31122ab 100644
--- a/buffet/webserv_client.cc
+++ b/buffet/webserv_client.cc
@@ -13,6 +13,7 @@
 #include <libwebserv/server.h>
 
 #include "buffet/dbus_constants.h"
+#include "buffet/socket_stream.h"
 
 namespace buffet {
 
@@ -29,12 +30,38 @@
   std::string GetFirstHeader(const std::string& name) const override {
     return request_->GetFirstHeader(name);
   }
+
+  // TODO(avakulenko): Remove this method and rewrite all call sites in libweave
+  // to use GetDataStream() instead.
   const std::vector<uint8_t>& GetData() const override {
-    return request_->GetData();
+    if (!request_data_)
+      return *request_data_;
+
+    request_data_.reset(new std::vector<uint8_t>);
+    auto stream = request_->GetDataStream();
+    if (stream) {
+      if (stream->CanGetSize())
+        request_data_->reserve(stream->GetRemainingSize());
+      std::vector<uint8_t> buffer(16 * 1024);  // 16K seems to be good enough.
+      size_t sz = 0;
+      while (stream->ReadBlocking(buffer.data(), buffer.size(), &sz, nullptr) &&
+             sz > 0) {
+        request_data_->insert(request_data_->end(),
+                              buffer.data(), buffer.data() + sz);
+      }
+    }
+    return *request_data_;
+  }
+
+  std::unique_ptr<weave::Stream> GetDataStream() const override {
+    auto stream = std::unique_ptr<weave::Stream>{
+        new SocketStream{request_->GetDataStream()}};
+    return stream;
   }
 
  private:
   std::unique_ptr<libwebserv::Request> request_;
+  mutable std::unique_ptr<std::vector<uint8_t>> request_data_;
 
   DISALLOW_COPY_AND_ASSIGN(RequestImpl);
 };
@@ -103,7 +130,7 @@
                                int status_code,
                                const std::string& data,
                                const std::string& mime_type) {
-  response->Reply(status_code, data.data(), data.size(), mime_type);
+  response->ReplyWithText(status_code, data, mime_type);
 }
 
 void WebServClient::OnProtocolHandlerConnected(