Update weaved to reflect the latest changes in libweave

A number of APIs have changed in libweave and weaved is updated to
work with the latest version of the library. Some public D-Bus APIs
have changed as well to reflect the underlying libweave interfaces:

- Command::Done/SetProgress are replaced with Command::Complete
- Command::Abort now takes error code and error messages
- Command::category is removed
- Command::status is renamed to Command::state
- Manager::GetCommand is removed (since weave::Command::ToJson is
  no longer available)

Change-Id: Iebf0565467756e8a21be37163d750ff22c419672
diff --git a/buffet/webserv_client.cc b/buffet/webserv_client.cc
index e79a6a4..4b464c8 100644
--- a/buffet/webserv_client.cc
+++ b/buffet/webserv_client.cc
@@ -23,12 +23,13 @@
 
 class RequestImpl : public HttpServer::Request {
  public:
-  explicit RequestImpl(std::unique_ptr<libwebserv::Request> request)
-      : request_{std::move(request)} {}
+  explicit RequestImpl(std::unique_ptr<libwebserv::Request> request,
+                       std::unique_ptr<libwebserv::Response> response)
+      : request_{std::move(request)}, response_{std::move(response)} {}
   ~RequestImpl() override {}
 
   // HttpServer::Request implementation.
-  const std::string& GetPath() const override { return request_->GetPath(); }
+  std::string GetPath() const override { return request_->GetPath(); }
 
   std::string GetFirstHeader(const std::string& name) const override {
     return request_->GetFirstHeader(name);
@@ -36,27 +37,32 @@
 
   // TODO(avakulenko): Remove this method and rewrite all call sites in libweave
   // to use GetDataStream() instead.
-  const std::vector<uint8_t>& GetData() const override {
+  std::string GetData() override {
     if (request_data_)
       return *request_data_;
 
-    request_data_.reset(new std::vector<uint8_t>);
+    request_data_.reset(new std::string);
     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.
+      std::vector<char> 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);
+        request_data_->append(buffer.data(), buffer.data() + sz);
       }
     }
     return *request_data_;
   }
 
-  std::unique_ptr<weave::Stream> GetDataStream() const override {
+  void SendReply(int status_code,
+                 const std::string& data,
+                 const std::string& mime_type) override {
+    response_->ReplyWithText(status_code, data, mime_type);
+  }
+
+  std::unique_ptr<weave::Stream> GetDataStream() const {
     auto stream = std::unique_ptr<weave::Stream>{
         new SocketStream{request_->GetDataStream()}};
     return stream;
@@ -64,48 +70,19 @@
 
  private:
   std::unique_ptr<libwebserv::Request> request_;
-  mutable std::unique_ptr<std::vector<uint8_t>> request_data_;
+  std::unique_ptr<libwebserv::Response> response_;
+  mutable std::unique_ptr<std::string> request_data_;
 
   DISALLOW_COPY_AND_ASSIGN(RequestImpl);
 };
 
 }  // namespace
 
-WebServClient::~WebServClient() {
-  web_server_->Disconnect();
-}
-
-void WebServClient::AddOnStateChangedCallback(
-    const OnStateChangedCallback& callback) {
-  on_state_changed_callbacks_.push_back(callback);
-  callback.Run(*this);
-}
-
-void WebServClient::AddRequestHandler(const std::string& path_prefix,
-                                      const OnRequestCallback& callback) {
-  web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
-      path_prefix, "", base::Bind(&WebServClient::OnRequest,
-                                  weak_ptr_factory_.GetWeakPtr(), callback));
-  web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
-      path_prefix, "", base::Bind(&WebServClient::OnRequest,
-                                  weak_ptr_factory_.GetWeakPtr(), callback));
-}
-
-uint16_t WebServClient::GetHttpPort() const {
-  return http_port_;
-}
-
-uint16_t WebServClient::GetHttpsPort() const {
-  return https_port_;
-}
-
-const chromeos::Blob& WebServClient::GetHttpsCertificateFingerprint() const {
-  return certificate_;
-}
-
 WebServClient::WebServClient(
     const scoped_refptr<dbus::Bus>& bus,
-    chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
+    chromeos::dbus_utils::AsyncEventSequencer* sequencer,
+    const base::Closure& server_available_callback)
+    : server_available_callback_{server_available_callback} {
   web_server_.reset(new libwebserv::Server);
   web_server_->OnProtocolHandlerConnected(
       base::Bind(&WebServClient::OnProtocolHandlerConnected,
@@ -120,20 +97,44 @@
                        base::Bind(&base::DoNothing));
 }
 
-void WebServClient::OnRequest(const OnRequestCallback& callback,
-                              std::unique_ptr<libwebserv::Request> request,
-                              std::unique_ptr<libwebserv::Response> response) {
-  callback.Run(
-      RequestImpl{std::move(request)},
-      base::Bind(&WebServClient::OnResponse, weak_ptr_factory_.GetWeakPtr(),
-                 base::Passed(&response)));
+WebServClient::~WebServClient() {
+  web_server_->Disconnect();
 }
 
-void WebServClient::OnResponse(std::unique_ptr<libwebserv::Response> response,
-                               int status_code,
-                               const std::string& data,
-                               const std::string& mime_type) {
-  response->ReplyWithText(status_code, data, mime_type);
+void WebServClient::AddHttpRequestHandler(
+    const std::string& path,
+    const RequestHandlerCallback& callback) {
+  web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
+      path, "", base::Bind(&WebServClient::OnRequest,
+                           weak_ptr_factory_.GetWeakPtr(), callback));
+}
+
+void WebServClient::AddHttpsRequestHandler(
+    const std::string& path,
+    const RequestHandlerCallback& callback) {
+  web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
+      path, "", base::Bind(&WebServClient::OnRequest,
+                           weak_ptr_factory_.GetWeakPtr(), callback));
+}
+
+uint16_t WebServClient::GetHttpPort() const {
+  return http_port_;
+}
+
+uint16_t WebServClient::GetHttpsPort() const {
+  return https_port_;
+}
+
+chromeos::Blob WebServClient::GetHttpsCertificateFingerprint() const {
+  return certificate_;
+}
+
+void WebServClient::OnRequest(const RequestHandlerCallback& callback,
+                              std::unique_ptr<libwebserv::Request> request,
+                              std::unique_ptr<libwebserv::Response> response) {
+  std::unique_ptr<Request> weave_request{
+      new RequestImpl{std::move(request), std::move(response)}};
+  callback.Run(std::move(weave_request));
 }
 
 void WebServClient::OnProtocolHandlerConnected(
@@ -145,8 +146,8 @@
     https_port_ = *protocol_handler->GetPorts().begin();
     certificate_ = protocol_handler->GetCertificateFingerprint();
   }
-  for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run(*this);
+  if (https_port_ && https_port_)
+    server_available_callback_.Run();
 }
 
 void WebServClient::OnProtocolHandlerDisconnected(
@@ -158,8 +159,6 @@
     https_port_ = 0;
     certificate_.clear();
   }
-  for (const auto& cb : on_state_changed_callbacks_)
-    cb.Run(*this);
 }
 
 }  // namespace buffet