git merge --no-ff 35fb87b830270adaf3b24b18cb43db8debb62bd8
diff --git a/libweave/AUTHORS b/libweave/AUTHORS
new file mode 100644
index 0000000..e016204
--- /dev/null
+++ b/libweave/AUTHORS
@@ -0,0 +1,7 @@
+# This is the official list of The Weave authors for copyright purposes.
+# This file is distinct from the CONTRIBUTORS files.
+# See the latter for an explanation.
+# Names should be added to this file as:
+# Name or Organization <email address>
+# The email address is not required for organizations.
+Google Inc.
diff --git a/libweave/Android.mk b/libweave/Android.mk
deleted file mode 100644
index 36732d3..0000000
--- a/libweave/Android.mk
+++ /dev/null
@@ -1,230 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-# Common variables
-# ========================================================
-
-libweaveCommonCppExtension := .cc
-libweaveCommonCFlags := -Wall -Werror \
- -Wno-char-subscripts -Wno-missing-field-initializers \
- -Wno-unused-function -Wno-unused-parameter
-
-libweaveCommonCppFlags := \
- -Wno-deprecated-register \
- -Wno-sign-compare \
- -Wno-sign-promo \
- -Wno-non-virtual-dtor \
-
-libweaveCommonCIncludes := \
- $(LOCAL_PATH)/.. \
- $(LOCAL_PATH)/include \
- $(LOCAL_PATH)/third_party/modp_b64/modp_b64 \
- external/gtest/include \
-
-libweaveSharedLibraries := \
- libchrome \
- libexpat \
- libcrypto \
-
-# libweave-external
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libweave-external
-LOCAL_CPP_EXTENSION := $(libweaveCommonCppExtension)
-LOCAL_CFLAGS := $(libweaveCommonCFlags)
-LOCAL_CPPFLAGS := $(libweaveCommonCppFlags)
-LOCAL_C_INCLUDES := $(libweaveCommonCIncludes)
-LOCAL_SHARED_LIBRARIES := $(libweaveSharedLibraries)
-LOCAL_STATIC_LIBRARIES :=
-LOCAL_RTTI_FLAG := -frtti
-LOCAL_CLANG := true
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/external
-
-LOCAL_SRC_FILES := \
- external/crypto/p224.cc \
- external/crypto/p224_spake.cc \
- external/crypto/sha2.cc \
- third_party/modp_b64/modp_b64.cc \
-
-include $(BUILD_STATIC_LIBRARY)
-
-# libweave-common
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libweave-common
-LOCAL_CPP_EXTENSION := $(libweaveCommonCppExtension)
-LOCAL_CFLAGS := $(libweaveCommonCFlags)
-LOCAL_CPPFLAGS := $(libweaveCommonCppFlags)
-LOCAL_C_INCLUDES := $(libweaveCommonCIncludes)
-LOCAL_SHARED_LIBRARIES := $(libweaveSharedLibraries)
-LOCAL_STATIC_LIBRARIES := libweave-external
-LOCAL_RTTI_FLAG := -frtti
-LOCAL_CLANG := true
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
-
-LOCAL_SRC_FILES := \
- src/backoff_entry.cc \
- src/base_api_handler.cc \
- src/commands/cloud_command_proxy.cc \
- src/commands/command_definition.cc \
- src/commands/command_dictionary.cc \
- src/commands/command_instance.cc \
- src/commands/command_manager.cc \
- src/commands/command_queue.cc \
- src/commands/object_schema.cc \
- src/commands/prop_constraints.cc \
- src/commands/prop_types.cc \
- src/commands/prop_values.cc \
- src/commands/schema_constants.cc \
- src/commands/schema_utils.cc \
- src/config.cc \
- src/data_encoding.cc \
- src/device_manager.cc \
- src/device_registration_info.cc \
- src/error.cc \
- src/http_constants.cc \
- src/json_error_codes.cc \
- src/notification/notification_parser.cc \
- src/notification/pull_channel.cc \
- src/notification/xml_node.cc \
- src/notification/xmpp_channel.cc \
- src/notification/xmpp_iq_stanza_handler.cc \
- src/notification/xmpp_stream_parser.cc \
- src/privet/cloud_delegate.cc \
- src/privet/constants.cc \
- src/privet/device_delegate.cc \
- src/privet/openssl_utils.cc \
- src/privet/privet_handler.cc \
- src/privet/privet_manager.cc \
- src/privet/privet_types.cc \
- src/privet/publisher.cc \
- src/privet/security_manager.cc \
- src/privet/wifi_bootstrap_manager.cc \
- src/privet/wifi_ssid_generator.cc \
- src/registration_status.cc \
- src/states/error_codes.cc \
- src/states/state_change_queue.cc \
- src/states/state_manager.cc \
- src/states/state_package.cc \
- src/string_utils.cc \
- src/utils.cc \
-
-include $(BUILD_STATIC_LIBRARY)
-
-# libweave-test
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libweave-test
-LOCAL_CPP_EXTENSION := $(libweaveCommonCppExtension)
-LOCAL_CFLAGS := $(libweaveCommonCFlags)
-LOCAL_CPPFLAGS := $(libweaveCommonCppFlags)
-LOCAL_C_INCLUDES := \
- $(libweaveCommonCIncludes) \
- external/gmock/include \
-
-LOCAL_SHARED_LIBRARIES := $(libweaveSharedLibraries)
-LOCAL_STATIC_LIBRARIES := libgtest libgmock
-LOCAL_CLANG := true
-LOCAL_RTTI_FLAG := -frtti
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
-
-LOCAL_SRC_FILES := \
- src/test/fake_stream.cc \
- src/test/fake_task_runner.cc \
- src/test/mock_command.cc \
- src/test/mock_http_client.cc \
- src/test/unittest_utils.cc \
-
-include $(BUILD_STATIC_LIBRARY)
-
-# libweave
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libweave
-LOCAL_CPP_EXTENSION := $(libweaveCommonCppExtension)
-LOCAL_CFLAGS := $(libweaveCommonCFlags)
-LOCAL_CPPFLAGS := $(libweaveCommonCppFlags)
-LOCAL_C_INCLUDES := $(libweaveCommonCIncludes)
-LOCAL_SHARED_LIBRARIES := $(libweaveSharedLibraries)
-LOCAL_WHOLE_STATIC_LIBRARIES := libweave-external libweave-common
-LOCAL_CLANG := true
-LOCAL_RTTI_FLAG := -frtti
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
-
-LOCAL_SRC_FILES := \
- src/empty.cc
-
-include $(BUILD_SHARED_LIBRARY)
-
-# libweave_testrunner
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libweave_testrunner
-LOCAL_CPP_EXTENSION := $(libweaveCommonCppExtension)
-LOCAL_CFLAGS := $(libweaveCommonCFlags)
-LOCAL_CPPFLAGS := $(libweaveCommonCppFlags)
-LOCAL_C_INCLUDES := \
- $(libweaveCommonCIncludes) \
- external/gmock/include \
-
-LOCAL_SHARED_LIBRARIES := \
- $(libweaveSharedLibraries) \
-
-LOCAL_STATIC_LIBRARIES := \
- libweave-external \
- libweave-common \
- libweave-test \
- libchromeos-test-helpers \
- libgtest libgmock \
- libchrome_test_helpers \
-
-LOCAL_CLANG := true
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
-
-LOCAL_SRC_FILES := \
- external/crypto/p224_spake_unittest.cc \
- external/crypto/p224_unittest.cc \
- external/crypto/sha2_unittest.cc \
- src/backoff_entry_unittest.cc \
- src/base_api_handler_unittest.cc \
- src/commands/cloud_command_proxy_unittest.cc \
- src/commands/command_definition_unittest.cc \
- src/commands/command_dictionary_unittest.cc \
- src/commands/command_instance_unittest.cc \
- src/commands/command_manager_unittest.cc \
- src/commands/command_queue_unittest.cc \
- src/commands/object_schema_unittest.cc \
- src/commands/schema_utils_unittest.cc \
- src/config_unittest.cc \
- src/data_encoding_unittest.cc \
- src/device_registration_info_unittest.cc \
- src/error_unittest.cc \
- src/notification/notification_parser_unittest.cc \
- src/notification/xml_node_unittest.cc \
- src/notification/xmpp_channel_unittest.cc \
- src/notification/xmpp_iq_stanza_handler_unittest.cc \
- src/notification/xmpp_stream_parser_unittest.cc \
- src/privet/privet_handler_unittest.cc \
- src/privet/security_manager_unittest.cc \
- src/privet/wifi_ssid_generator_unittest.cc \
- src/states/state_change_queue_unittest.cc \
- src/states/state_manager_unittest.cc \
- src/states/state_package_unittest.cc \
- src/string_utils_unittest.cc \
- src/test/weave_testrunner.cc \
- src/weave_unittest.cc \
-
-include $(BUILD_NATIVE_TEST)
diff --git a/libweave/CONTRIBUTORS b/libweave/CONTRIBUTORS
new file mode 100644
index 0000000..b45bd87
--- /dev/null
+++ b/libweave/CONTRIBUTORS
@@ -0,0 +1,28 @@
+# People who have agreed to one of the CLAs and can contribute patches.
+# The AUTHORS file lists the copyright holders; this file
+# lists people. For example, Google employees are listed here
+# but not in AUTHORS, because Google holds the copyright.
+#
+# https://developers.google.com/open-source/cla/individual
+# https://developers.google.com/open-source/cla/corporate
+#
+# Names should be added to this file as:
+# Name <email address>
+
+Alex Deymo <deymo@google.com>
+Alex Vakulenko <avakulenko@google.com>
+Anton Muhin <antonm@google.com>
+Bertrand Simonnet <bsimonnet@google.com>
+Chris Sosa <sosa@google.com>
+Christopher Wiley <wiley@google.com>
+Daniel Erat <derat@google.com>
+David Zeuthen <zeuthen@google.com>
+Gene Gutnik <gene@google.com>
+Gerry Fan <gfan@google.com>
+Johan Euphrosine <proppy@google.com>
+Mike Frysinger <vapier@google.com>
+Nathan Bullock <nathanbullock@google.com>
+Robert Ginda <rginda@google.com>
+Stefan Sauer <ensonic@google.com>
+Vitaly Buka <vitalybuka@google.com>
+Yunlian Jiang <yunlian@google.com>
diff --git a/libweave/LICENSE b/libweave/LICENSE
index cc8dd21..474e76e 100644
--- a/libweave/LICENSE
+++ b/libweave/LICENSE
@@ -1,28 +1,26 @@
-Copyright 2015, Google Inc. All Rights Reserved.
+Copyright (c) 2015, The Weave Authors.
+All rights reserved.
Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
+modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Weave Authors nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/libweave/README b/libweave/README
index def7148..7e519b9 100644
--- a/libweave/README
+++ b/libweave/README
@@ -27,23 +27,13 @@
Example of device code:
examples/
-Optional dependencies:
- external/
+Dependencies:
third_party/
Build files:
libweave_standalone.gyp
libweave_common.gypi
-ChromiumOS specific build files:
- libweave-test.pc.in
- libweave.pc.in
- platform2.gyp
- platform2_preinstall.sh
-
-AOSP specific build files:
- Android.mk
-
Quick start on Ubuntu
---------------------
@@ -91,7 +81,7 @@
Generate ninja build files:
- gyp -I libweave_common.gypi --toplevel-dir=. \
+ gyp -I libweave_common.gypi --toplevel-dir=. --depth=. \
-f ninja libweave_standalone.gyp
Build library with tests:
diff --git a/libweave/examples/ubuntu/avahi_client.cc b/libweave/examples/ubuntu/avahi_client.cc
index 7d822fb..3bc1823 100644
--- a/libweave/examples/ubuntu/avahi_client.cc
+++ b/libweave/examples/ubuntu/avahi_client.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/avahi_client.h b/libweave/examples/ubuntu/avahi_client.h
index ba4a02b..64e0eb1 100644
--- a/libweave/examples/ubuntu/avahi_client.h
+++ b/libweave/examples/ubuntu/avahi_client.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/bluez_client.cc b/libweave/examples/ubuntu/bluez_client.cc
index a1f13d3..35defde 100644
--- a/libweave/examples/ubuntu/bluez_client.cc
+++ b/libweave/examples/ubuntu/bluez_client.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/bluez_client.h b/libweave/examples/ubuntu/bluez_client.h
index 23e21ad..e0bc2f2 100644
--- a/libweave/examples/ubuntu/bluez_client.h
+++ b/libweave/examples/ubuntu/bluez_client.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/build.sh b/libweave/examples/ubuntu/build.sh
index ea7499f..cc585cb 100755
--- a/libweave/examples/ubuntu/build.sh
+++ b/libweave/examples/ubuntu/build.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# 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.
@@ -23,6 +23,6 @@
ninja -j $CORES -C out/${BUILD_CONFIG} $BUILD_TARGET || exit 1
if [[ $BUILD_TARGET == *"libweave_testrunner"* ]]; then
- out/${BUILD_CONFIG}/libweave_testrunner || exit 1
- out/${BUILD_CONFIG}/libweave_exports_testrunner || exit 1
+ out/${BUILD_CONFIG}/libweave_testrunner --gtest_break_on_failure || exit 1
+ out/${BUILD_CONFIG}/libweave_exports_testrunner --gtest_break_on_failure || exit 1
fi
diff --git a/libweave/examples/ubuntu/curl_http_client.cc b/libweave/examples/ubuntu/curl_http_client.cc
index 3e996e3..0ddf57a 100644
--- a/libweave/examples/ubuntu/curl_http_client.cc
+++ b/libweave/examples/ubuntu/curl_http_client.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -7,6 +7,7 @@
#include <base/bind.h>
#include <curl/curl.h>
#include <weave/provider/task_runner.h>
+#include <weave/enum_to_string.h>
namespace weave {
namespace examples {
@@ -14,11 +15,11 @@
namespace {
struct ResponseImpl : public provider::HttpClient::Response {
- int GetStatusCode() const { return status; }
- std::string GetContentType() const { return content_type; }
- const std::string& GetData() const { return data; }
+ int GetStatusCode() const override { return status; }
+ std::string GetContentType() const override { return content_type; }
+ std::string GetData() const override { return data; }
- int status;
+ long status{0};
std::string content_type;
std::string data;
};
@@ -34,23 +35,27 @@
CurlHttpClient::CurlHttpClient(provider::TaskRunner* task_runner)
: task_runner_{task_runner} {}
-std::unique_ptr<provider::HttpClient::Response>
-CurlHttpClient::SendRequestAndBlock(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) {
+void CurlHttpClient::SendRequest(Method method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SendRequestCallback& callback) {
std::unique_ptr<CURL, decltype(&curl_easy_cleanup)> curl{curl_easy_init(),
&curl_easy_cleanup};
CHECK(curl);
- if (method == "GET") {
+ switch (method) {
+ case Method::kGet:
CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_HTTPGET, 1L));
- } else if (method == "POST") {
+ break;
+ case Method::kPost:
CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_HTTPPOST, 1L));
- } else {
- CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_CUSTOMREQUEST,
- method.c_str()));
+ break;
+ case Method::kPatch:
+ case Method::kPut:
+ CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_CUSTOMREQUEST,
+ weave::EnumToString(method).c_str()));
+ break;
}
CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str()));
@@ -61,7 +66,7 @@
CHECK_EQ(CURLE_OK, curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER, chunk));
- if (!data.empty() || method == "POST") {
+ if (!data.empty() || method == Method::kPost) {
CHECK_EQ(CURLE_OK,
curl_easy_setopt(curl.get(), CURLOPT_POSTFIELDS, data.c_str()));
}
@@ -80,18 +85,21 @@
if (chunk)
curl_slist_free_all(chunk);
+ ErrorPtr error;
if (res != CURLE_OK) {
- Error::AddTo(error, FROM_HERE, "curl", "curl_easy_perform_error",
+ Error::AddTo(&error, FROM_HERE, "curl", "curl_easy_perform_error",
curl_easy_strerror(res));
- return nullptr;
+ return task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {});
}
const std::string kContentType = "\r\nContent-Type:";
auto pos = response->content_type.find(kContentType);
if (pos == std::string::npos) {
- Error::AddTo(error, FROM_HERE, "curl", "no_content_header",
+ Error::AddTo(&error, FROM_HERE, "curl", "no_content_header",
"Content-Type header is missing");
- return nullptr;
+ return task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {});
}
pos += kContentType.size();
auto pos_end = response->content_type.find("\r\n", pos);
@@ -103,44 +111,9 @@
CHECK_EQ(CURLE_OK, curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE,
&response->status));
- return std::move(response);
-}
-int CurlHttpClient::SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
- ++request_id_;
- ErrorPtr error;
- auto response = SendRequestAndBlock(method, url, headers, data, &error);
- if (response) {
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&CurlHttpClient::RunSuccessCallback,
- weak_ptr_factory_.GetWeakPtr(), success_callback,
- request_id_, base::Passed(&response)),
- {});
- } else {
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&CurlHttpClient::RunErrorCallback,
- weak_ptr_factory_.GetWeakPtr(), error_callback,
- request_id_, base::Passed(&error)),
- {});
- }
- return request_id_;
-}
-
-void CurlHttpClient::RunSuccessCallback(const SuccessCallback& success_callback,
- int id,
- std::unique_ptr<Response> response) {
- success_callback.Run(id, *response);
-}
-
-void CurlHttpClient::RunErrorCallback(const ErrorCallback& error_callback,
- int id,
- ErrorPtr error) {
- error_callback.Run(id, error.get());
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, base::Passed(&response), nullptr), {});
}
} // namespace examples
diff --git a/libweave/examples/ubuntu/curl_http_client.h b/libweave/examples/ubuntu/curl_http_client.h
index 853b797..daf9b0c 100644
--- a/libweave/examples/ubuntu/curl_http_client.h
+++ b/libweave/examples/ubuntu/curl_http_client.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -24,28 +24,14 @@
public:
explicit CurlHttpClient(provider::TaskRunner* task_runner);
- std::unique_ptr<Response> SendRequestAndBlock(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) override;
- int SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ void SendRequest(Method method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SendRequestCallback& callback) override;
private:
- void RunSuccessCallback(const SuccessCallback& success_callback,
- int id,
- std::unique_ptr<Response> response);
- void RunErrorCallback(const ErrorCallback& error_callback,
- int id,
- ErrorPtr error);
-
provider::TaskRunner* task_runner_{nullptr};
- int request_id_ = 0;
base::WeakPtrFactory<CurlHttpClient> weak_ptr_factory_{this};
};
diff --git a/libweave/examples/ubuntu/event_http_client.cc b/libweave/examples/ubuntu/event_http_client.cc
new file mode 100644
index 0000000..22b68f2
--- /dev/null
+++ b/libweave/examples/ubuntu/event_http_client.cc
@@ -0,0 +1,156 @@
+// 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.
+
+#include "examples/ubuntu/event_http_client.h"
+#include "examples/ubuntu/event_task_runner.h"
+
+#include <weave/enum_to_string.h>
+
+#include <string>
+
+#include <base/bind.h>
+
+#include <event2/bufferevent.h>
+#include <event2/buffer.h>
+#include <event2/http.h>
+
+// EventHttpClient based on libevent2 http-client sample
+// TODO(proppy): https
+// TODO(proppy): hostname validation
+namespace weave {
+
+namespace {
+const weave::EnumToStringMap<evhttp_cmd_type>::Map kMapMethod[] = {
+ {EVHTTP_REQ_GET, "GET"}, {EVHTTP_REQ_POST, "POST"},
+ {EVHTTP_REQ_HEAD, "HEAD"}, {EVHTTP_REQ_PUT, "PUT"},
+ {EVHTTP_REQ_PATCH, "PATCH"}, {EVHTTP_REQ_DELETE, "DELETE"},
+ {EVHTTP_REQ_OPTIONS, "OPTIONS"}};
+} // namespace
+
+template <>
+EnumToStringMap<evhttp_cmd_type>::EnumToStringMap()
+ : EnumToStringMap(kMapMethod) {}
+
+using namespace provider;
+
+namespace examples {
+
+namespace {
+
+class EventDeleter {
+ public:
+ void operator()(evhttp_uri* http_uri) { evhttp_uri_free(http_uri); }
+ void operator()(evhttp_connection* conn) { evhttp_connection_free(conn); }
+ void operator()(evhttp_request* req) { evhttp_request_free(req); }
+};
+
+class EventHttpResponse : public weave::provider::HttpClient::Response {
+ public:
+ int GetStatusCode() const override { return status; }
+ std::string GetContentType() const override { return content_type; }
+ std::string GetData() const { return data; }
+
+ int status;
+ std::string content_type;
+ std::string data;
+};
+
+struct EventRequestState {
+ TaskRunner* task_runner_;
+ std::unique_ptr<evhttp_uri, EventDeleter> http_uri_;
+ std::unique_ptr<evhttp_connection, EventDeleter> evcon_;
+ HttpClient::SendRequestCallback callback_;
+};
+
+void RequestDoneCallback(evhttp_request* req, void* ctx) {
+ std::unique_ptr<EventRequestState> state{
+ static_cast<EventRequestState*>(ctx)};
+ if (!req) {
+ ErrorPtr error;
+ auto err = EVUTIL_SOCKET_ERROR();
+ Error::AddToPrintf(&error, FROM_HERE, "http_client", "request_failed",
+ "request failed: %s",
+ evutil_socket_error_to_string(err));
+ state->task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(state->callback_, nullptr, base::Passed(&error)),
+ {});
+ return;
+ }
+ std::unique_ptr<EventHttpResponse> response{new EventHttpResponse()};
+ response->status = evhttp_request_get_response_code(req);
+ auto buffer = evhttp_request_get_input_buffer(req);
+ auto length = evbuffer_get_length(buffer);
+ response->data.resize(length);
+ auto n = evbuffer_remove(buffer, &response->data[0], length);
+ CHECK_EQ(n, int(length));
+ state->task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(state->callback_, base::Passed(&response), nullptr),
+ {});
+}
+
+} // namespace
+
+EventHttpClient::EventHttpClient(EventTaskRunner* task_runner)
+ : task_runner_{task_runner} {}
+
+void EventHttpClient::SendRequest(Method method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SendRequestCallback& callback) {
+ evhttp_cmd_type method_id;
+ CHECK(weave::StringToEnum(weave::EnumToString(method), &method_id));
+ std::unique_ptr<evhttp_uri, EventDeleter> http_uri{
+ evhttp_uri_parse(url.c_str())};
+ CHECK(http_uri);
+ auto host = evhttp_uri_get_host(http_uri.get());
+ CHECK(host);
+ auto port = evhttp_uri_get_port(http_uri.get());
+ if (port == -1)
+ port = 80;
+ std::string path{evhttp_uri_get_path(http_uri.get())};
+ if (path.length() == 0) {
+ path = "/";
+ }
+ std::string uri{path};
+ auto query = evhttp_uri_get_query(http_uri.get());
+ if (query) {
+ uri = path + "?" + query;
+ }
+ auto bev = bufferevent_socket_new(task_runner_->GetEventBase(), -1,
+ BEV_OPT_CLOSE_ON_FREE);
+ CHECK(bev);
+ std::unique_ptr<evhttp_connection, EventDeleter> conn{
+ evhttp_connection_base_bufferevent_new(task_runner_->GetEventBase(), NULL,
+ bev, host, port)};
+ CHECK(conn);
+ std::unique_ptr<evhttp_request, EventDeleter> req{evhttp_request_new(
+ &RequestDoneCallback,
+ new EventRequestState{task_runner_, std::move(http_uri), std::move(conn),
+ callback})};
+ CHECK(req);
+ auto output_headers = evhttp_request_get_output_headers(req.get());
+ evhttp_add_header(output_headers, "Host", host);
+ for (auto& kv : headers)
+ evhttp_add_header(output_headers, kv.first.c_str(), kv.second.c_str());
+ if (!data.empty()) {
+ auto output_buffer = evhttp_request_get_output_buffer(req.get());
+ evbuffer_add(output_buffer, data.c_str(), data.length());
+ evhttp_add_header(output_headers, "Content-Length",
+ std::to_string(data.length()).c_str());
+ }
+ auto res =
+ evhttp_make_request(conn.get(), req.release(), method_id, uri.c_str());
+ if (res >= 0)
+ return;
+ ErrorPtr error;
+ Error::AddToPrintf(&error, FROM_HERE, "http_client", "request_failed",
+ "request failed: %s %s", EnumToString(method).c_str(),
+ url.c_str());
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {});
+}
+
+} // namespace examples
+} // namespace weave
diff --git a/libweave/examples/ubuntu/event_http_client.h b/libweave/examples/ubuntu/event_http_client.h
new file mode 100644
index 0000000..6ec2db6
--- /dev/null
+++ b/libweave/examples/ubuntu/event_http_client.h
@@ -0,0 +1,38 @@
+// 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_HTTP_CLIENT_H_
+#define LIBWEAVE_EXAMPLES_UBUNTU_EVENT_HTTP_CLIENT_H_
+
+#include <string>
+
+#include <base/memory/weak_ptr.h>
+#include <weave/provider/http_client.h>
+
+namespace weave {
+namespace examples {
+
+class EventTaskRunner;
+
+// Basic implementation of weave::HttpClient using libevent.
+class EventHttpClient : public provider::HttpClient {
+ public:
+ explicit EventHttpClient(EventTaskRunner* task_runner);
+
+ void SendRequest(Method method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SendRequestCallback& callback) override;
+
+ private:
+ EventTaskRunner* task_runner_{nullptr};
+
+ base::WeakPtrFactory<EventHttpClient> weak_ptr_factory_{this};
+};
+
+} // namespace examples
+} // namespace weave
+
+#endif // LIBWEAVE_EXAMPLES_UBUNTU_EVENT_HTTP_CLIENT_H_
diff --git a/libweave/examples/ubuntu/event_http_server.cc b/libweave/examples/ubuntu/event_http_server.cc
index 9c0dc78..95fea21 100644
--- a/libweave/examples/ubuntu/event_http_server.cc
+++ b/libweave/examples/ubuntu/event_http_server.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -30,75 +30,49 @@
base, -1, SSL_new(ctx), BUFFEREVENT_SSL_ACCEPTING, BEV_OPT_CLOSE_ON_FREE);
}
-class MemoryReadStream : public Stream {
- public:
- MemoryReadStream(const std::vector<uint8_t>& data,
- provider::TaskRunner* task_runner)
- : data_{data}, task_runner_{task_runner} {}
-
- void Read(void* buffer,
- size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
- CHECK_LE(read_position_, data_.size());
- size_t size_read = std::min(size_to_read, data_.size() - read_position_);
- if (size_read > 0)
- memcpy(buffer, data_.data() + read_position_, size_read);
- read_position_ += size_read;
- success_callback.Run(size_read);
- }
-
- void Write(const void* buffer,
- size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
- LOG(FATAL) << "Unsupported";
- }
-
- void CancelPendingOperations() override {}
-
- private:
- std::vector<uint8_t> data_;
- provider::TaskRunner* task_runner_;
- size_t read_position_{0};
-};
-
} // namespace
class HttpServerImpl::RequestImpl : public Request {
public:
- explicit RequestImpl(evhttp_request* req, provider::TaskRunner* task_runner)
- : path_{evhttp_request_uri(req)}, task_runner_{task_runner} {
- path_ = path_.substr(0, path_.find("?"));
- path_ = path_.substr(0, path_.find("#"));
+ RequestImpl(evhttp_request* req, provider::TaskRunner* task_runner)
+ : task_runner_{task_runner} {
req_.reset(req);
+ uri_ = evhttp_request_get_evhttp_uri(req_.get());
data_.resize(evbuffer_get_length(req_->input_buffer));
- evbuffer_remove(req_->input_buffer, data_.data(), data_.size());
+ evbuffer_remove(req_->input_buffer, &data_[0], data_.size());
}
~RequestImpl() {}
- const std::string& GetPath() const override { return path_; }
+ std::string GetPath() const override {
+ const char* path = evhttp_uri_get_path(uri_);
+ return path ? path : "";
+ }
std::string GetFirstHeader(const std::string& name) const override {
const char* header = evhttp_find_header(req_->input_headers, name.c_str());
if (!header)
return {};
return header;
}
- const std::vector<uint8_t>& GetData() const override { return data_; }
- std::unique_ptr<Stream> GetDataStream() const override {
- return std::unique_ptr<Stream>{new MemoryReadStream{data_, task_runner_}};
+ std::string GetData() { return data_; }
+
+ void SendReply(int status_code,
+ const std::string& data,
+ const std::string& mime_type) override {
+ std::unique_ptr<evbuffer, decltype(&evbuffer_free)> buf{evbuffer_new(),
+ &evbuffer_free};
+ evbuffer_add(buf.get(), data.data(), data.size());
+ evhttp_add_header(req_->output_headers, "Content-Type", mime_type.c_str());
+ evhttp_send_reply(req_.release(), status_code, "None", buf.get());
}
- evhttp_request* ReleaseHandler() { return req_.release(); }
-
private:
- std::vector<uint8_t> data_;
std::unique_ptr<evhttp_request, decltype(&evhttp_cancel_request)> req_{
nullptr, &evhttp_cancel_request};
- std::string path_;
- provider::TaskRunner* task_runner_;
+ provider::TaskRunner* task_runner_{nullptr};
+ std::string data_;
+ const evhttp_uri* uri_{nullptr};
};
HttpServerImpl::HttpServerImpl(EventTaskRunner* task_runner)
@@ -127,8 +101,6 @@
CHECK(httpsd_);
evhttp_set_bevcb(httpsd_.get(), BuffetEventCallback, ctx_.get());
- evhttp_set_gencb(httpd_.get(), ProcessRequestCallback, this);
- evhttp_set_gencb(httpsd_.get(), ProcessRequestCallback, this);
CHECK_EQ(0, evhttp_bind_socket(httpd_.get(), "0.0.0.0", GetHttpPort()));
CHECK_EQ(0, evhttp_bind_socket(httpsd_.get(), "0.0.0.0", GetHttpsPort()));
@@ -175,38 +147,34 @@
}
void HttpServerImpl::ProcessRequest(evhttp_request* req) {
- std::string path = evhttp_request_uri(req);
- for (auto i = handlers_.rbegin(); i != handlers_.rend(); ++i) {
- if (path.compare(0, i->first.size(), i->first) == 0) {
- auto request = std::make_shared<RequestImpl>(req, task_runner_);
- i->second.Run(*request,
- base::Bind(&HttpServerImpl::ProcessReply,
- weak_ptr_factory_.GetWeakPtr(), request));
- return;
- }
+ std::unique_ptr<RequestImpl> request{new RequestImpl{req, task_runner_}};
+ std::string path = request->GetPath();
+ auto it = handlers_.find(path);
+ if (it != handlers_.end()) {
+ return it->second.Run(std::move(request));
}
NotFound(req);
}
+
void HttpServerImpl::ProcessReply(std::shared_ptr<RequestImpl> request,
int status_code,
const std::string& data,
const std::string& mime_type) {
- std::unique_ptr<evbuffer, decltype(&evbuffer_free)> buf{evbuffer_new(),
- &evbuffer_free};
- evbuffer_add(buf.get(), data.data(), data.size());
- evhttp_request* req = request->ReleaseHandler();
- evhttp_add_header(req->output_headers, "Content-Type", mime_type.c_str());
- evhttp_send_reply(req, status_code, "None", buf.get());
+
}
-void HttpServerImpl::AddOnStateChangedCallback(
- const OnStateChangedCallback& callback) {
- callback.Run(*this);
+void HttpServerImpl::AddHttpRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) {
+ handlers_.emplace(path, callback);
+ evhttp_set_cb(httpd_.get(), path.c_str(), &ProcessRequestCallback, this);
}
-void HttpServerImpl::AddRequestHandler(const std::string& path_prefix,
- const OnRequestCallback& callback) {
- handlers_.emplace(path_prefix, callback);
+void HttpServerImpl::AddHttpsRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) {
+ handlers_.emplace(path, callback);
+ evhttp_set_cb(httpsd_.get(), path.c_str(), &ProcessRequestCallback, this);
}
uint16_t HttpServerImpl::GetHttpPort() const {
@@ -217,8 +185,7 @@
return 7781;
}
-const std::vector<uint8_t>& HttpServerImpl::GetHttpsCertificateFingerprint()
- const {
+std::vector<uint8_t> HttpServerImpl::GetHttpsCertificateFingerprint() const {
return cert_fingerprint_;
}
diff --git a/libweave/examples/ubuntu/event_http_server.h b/libweave/examples/ubuntu/event_http_server.h
index 1005edc..4828b72 100644
--- a/libweave/examples/ubuntu/event_http_server.h
+++ b/libweave/examples/ubuntu/event_http_server.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -28,13 +28,13 @@
explicit HttpServerImpl(EventTaskRunner* task_runner);
- void AddOnStateChangedCallback(
- const OnStateChangedCallback& callback) override;
- void AddRequestHandler(const std::string& path_prefix,
- const OnRequestCallback& callback) override;
+ void AddHttpRequestHandler(const std::string& path_prefix,
+ const RequestHandlerCallback& callback) override;
+ void AddHttpsRequestHandler(const std::string& path_prefix,
+ const RequestHandlerCallback& callback) override;
uint16_t GetHttpPort() const override;
uint16_t GetHttpsPort() const override;
- const std::vector<uint8_t>& GetHttpsCertificateFingerprint() const override;
+ std::vector<uint8_t> GetHttpsCertificateFingerprint() const override;
private:
void GenerateX509();
@@ -46,7 +46,7 @@
const std::string& mime_type);
void NotFound(evhttp_request* req);
- std::map<std::string, OnRequestCallback> handlers_;
+ std::map<std::string, RequestHandlerCallback> handlers_;
std::unique_ptr<EC_KEY, decltype(&EC_KEY_free)> ec_key_{nullptr,
&EC_KEY_free};
diff --git a/libweave/examples/ubuntu/event_network.cc b/libweave/examples/ubuntu/event_network.cc
new file mode 100644
index 0000000..b411f80
--- /dev/null
+++ b/libweave/examples/ubuntu/event_network.cc
@@ -0,0 +1,115 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "examples/ubuntu/event_network.h"
+
+#include <weave/enum_to_string.h>
+
+#include <base/bind.h>
+#include <event2/dns.h>
+#include <event2/bufferevent.h>
+
+#include "examples/ubuntu/event_task_runner.h"
+#include "examples/ubuntu/ssl_stream.h"
+
+namespace weave {
+namespace examples {
+
+namespace {
+const char kNetworkProbeHostname[] = "talk.google.com";
+const int kNetworkProbePort = 5223;
+} // namespace
+
+void EventNetworkImpl::Deleter::operator()(evdns_base* dns_base) {
+ evdns_base_free(dns_base, 0);
+}
+
+void EventNetworkImpl::Deleter::operator()(bufferevent* bev) {
+ bufferevent_free(bev);
+}
+
+EventNetworkImpl::EventNetworkImpl(EventTaskRunner* task_runner)
+ : task_runner_(task_runner) {
+ UpdateNetworkState();
+}
+
+void EventNetworkImpl::AddConnectionChangedCallback(
+ const ConnectionChangedCallback& callback) {
+ callbacks_.push_back(callback);
+}
+
+void EventNetworkImpl::UpdateNetworkState() {
+ std::unique_ptr<bufferevent, Deleter> bev{
+ bufferevent_socket_new(task_runner_->GetEventBase(), -1,
+ BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS)};
+ bufferevent_setcb(
+ bev.get(), nullptr, nullptr,
+ [](struct bufferevent* buf, short events, void* ctx) {
+ EventNetworkImpl* network = static_cast<EventNetworkImpl*>(ctx);
+ std::unique_ptr<bufferevent, Deleter> bev{buf};
+ if (events & BEV_EVENT_CONNECTED) {
+ network->UpdateNetworkStateCallback(State::kOnline);
+ return;
+ }
+ if (events & (BEV_EVENT_ERROR | BEV_EVENT_EOF | BEV_EVENT_TIMEOUT)) {
+ int err = bufferevent_socket_get_dns_error(bev.get());
+ if (err) {
+ LOG(ERROR) << "network connect dns error: "
+ << evutil_gai_strerror(err);
+ }
+ network->UpdateNetworkStateCallback(State::kOffline);
+ return;
+ }
+ },
+ this);
+ int err = bufferevent_socket_connect_hostname(bev.get(), dns_base_.get(),
+ AF_INET, kNetworkProbeHostname,
+ kNetworkProbePort);
+ if (err) {
+ LOG(ERROR) << " network connect socket error: " << evutil_gai_strerror(err);
+ UpdateNetworkStateCallback(State::kOffline);
+ return;
+ }
+ // release the bufferevent, so that the eventcallback can free it.
+ bev.release();
+}
+
+void EventNetworkImpl::UpdateNetworkStateCallback(
+ provider::Network::State state) {
+ network_state_ = state;
+ LOG(INFO) << "network state updated: " << weave::EnumToString(state);
+ for (const auto& cb : callbacks_)
+ cb.Run();
+ // TODO(proppy): use netlink interface event instead of polling
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&EventNetworkImpl::UpdateNetworkState,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::TimeDelta::FromSeconds(10));
+}
+
+weave::provider::Network::State EventNetworkImpl::GetConnectionState() const {
+ return network_state_;
+}
+
+void EventNetworkImpl::OpenSslSocket(const std::string& host,
+ uint16_t port,
+ const OpenSslSocketCallback& callback) {
+ // Connect to SSL port instead of upgrading to TLS.
+ std::unique_ptr<SSLStream> tls_stream{new SSLStream{task_runner_}};
+
+ if (tls_stream->Init(host, port)) {
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, base::Passed(&tls_stream), nullptr),
+ {});
+ } else {
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "tls", "tls_init_failed",
+ "Failed to initialize TLS stream.");
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {});
+ }
+}
+
+} // namespace examples
+} // namespace weave
diff --git a/libweave/examples/ubuntu/event_network.h b/libweave/examples/ubuntu/event_network.h
new file mode 100644
index 0000000..79c458c
--- /dev/null
+++ b/libweave/examples/ubuntu/event_network.h
@@ -0,0 +1,49 @@
+// 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;
+
+ private:
+ void UpdateNetworkState();
+ void UpdateNetworkStateCallback(provider::Network::State state);
+ 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};
+ base::WeakPtrFactory<EventNetworkImpl> weak_ptr_factory_{this};
+};
+
+} // namespace examples
+} // namespace weave
+
+#endif // LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_
diff --git a/libweave/examples/ubuntu/event_task_runner.cc b/libweave/examples/ubuntu/event_task_runner.cc
index 7365fb3..b781ff4 100644
--- a/libweave/examples/ubuntu/event_task_runner.cc
+++ b/libweave/examples/ubuntu/event_task_runner.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/event_task_runner.h b/libweave/examples/ubuntu/event_task_runner.h
index 3f04995..77d7e72 100644
--- a/libweave/examples/ubuntu/event_task_runner.h
+++ b/libweave/examples/ubuntu/event_task_runner.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/examples/ubuntu/file_config_store.cc b/libweave/examples/ubuntu/file_config_store.cc
index c59de56..d3f10ef 100644
--- a/libweave/examples/ubuntu/file_config_store.cc
+++ b/libweave/examples/ubuntu/file_config_store.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -60,48 +60,5 @@
str << settings;
}
-std::vector<std::string> FileConfigStore::LoadCommandDefs() {
- return {R"({
- "base": {
- "updateBaseConfiguration": {},
- "identify": {},
- "updateDeviceInfo": {}
- },
- "_greeter": {
- "_greet": {
- "minimalRole": "user",
- "parameters": { "_name": "string"},
- "results": { "_greeting": "string" }
- }
- },
- "_ledflasher": {
- "_set":{
- "parameters": {
- "_led": {"minimum": 1, "maximum": 3},
- "_on": "boolean"
- }
- },
- "_toggle":{
- "parameters": {
- "_led": {"minimum": 1, "maximum": 3}
- }
- }
- }
- })"};
-}
-std::vector<std::string> FileConfigStore::LoadStateDefs() {
- return {R"({
- "_greeter": {"_greetings_counter":"integer"},
- "_ledflasher": {"_leds": {"items": "boolean"}}
- })"};
-}
-
-std::vector<std::string> FileConfigStore::LoadStateDefaults() {
- return {R"({
- "_greeter": {"_greetings_counter": 0},
- "_ledflasher":{"_leds": [false, false, false]}
- })"};
-}
-
} // namespace examples
} // namespace weave
diff --git a/libweave/examples/ubuntu/file_config_store.h b/libweave/examples/ubuntu/file_config_store.h
index 926576f..1f3d181 100644
--- a/libweave/examples/ubuntu/file_config_store.h
+++ b/libweave/examples/ubuntu/file_config_store.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -21,9 +21,6 @@
bool LoadDefaults(Settings* settings) override;
std::string LoadSettings() override;
void SaveSettings(const std::string& settings) override;
- std::vector<std::string> LoadCommandDefs() override;
- std::vector<std::string> LoadStateDefs() override;
- std::vector<std::string> LoadStateDefaults() override;
private:
bool disable_security_{false};
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc
index 5c84d9c..cd6dc06 100644
--- a/libweave/examples/ubuntu/main.cc
+++ b/libweave/examples/ubuntu/main.cc
@@ -1,8 +1,9 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
#include <bitset>
+
#include <base/bind.h>
#include <base/values.h>
#include <weave/device.h>
@@ -25,6 +26,7 @@
LOG(ERROR) << "\nUsage: " << name << " <option(s)>"
<< "\nOptions:\n"
<< "\t-h,--help Show this help message\n"
+ << "\t--v=LEVEL Logging level\n"
<< "\t-b,--bootstrapping Force WiFi bootstrapping\n"
<< "\t-d,--disable_security Disable privet security\n"
<< "\t--registration_ticket=TICKET Register device with the "
@@ -33,67 +35,170 @@
class CommandHandler {
public:
- explicit CommandHandler(weave::Device* device) : device_{device} {
- device->AddCommandAddedCallback(base::Bind(&CommandHandler::OnNewCommand,
- weak_ptr_factory_.GetWeakPtr()));
+ CommandHandler(weave::Device* device,
+ weave::provider::TaskRunner* task_runner)
+ : device_{device}, task_runner_(task_runner) {
+ device->AddStateDefinitionsFromJson(R"({
+ "_greeter": {"_greetings_counter":"integer"},
+ "_ledflasher": {"_leds": {"items": "boolean"}}
+ })");
+
+ device->SetStatePropertiesFromJson(R"({
+ "_greeter": {"_greetings_counter": 0},
+ "_ledflasher":{"_leds": [false, false, false]}
+ })",
+ nullptr);
+
+ device->AddCommandDefinitionsFromJson(R"({
+ "_greeter": {
+ "_greet": {
+ "minimalRole": "user",
+ "parameters": {
+ "_name": "string",
+ "_count": {"minimum": 1, "maximum": 100}
+ },
+ "progress": { "_todo": "integer"},
+ "results": { "_greeting": "string" }
+ }
+ },
+ "_ledflasher": {
+ "_set":{
+ "parameters": {
+ "_led": {"minimum": 1, "maximum": 3},
+ "_on": "boolean"
+ }
+ },
+ "_toggle":{
+ "parameters": {
+ "_led": {"minimum": 1, "maximum": 3}
+ }
+ }
+ }
+ })");
+ device->AddCommandHandler(
+ "_ledflasher._toggle",
+ base::Bind(&CommandHandler::OnFlasherToggleCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ device->AddCommandHandler("_greeter._greet",
+ base::Bind(&CommandHandler::OnGreetCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ device->AddCommandHandler("_ledflasher._set",
+ base::Bind(&CommandHandler::OnFlasherSetCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ device->AddCommandHandler("",
+ base::Bind(&CommandHandler::OnUnhandledCommand,
+ weak_ptr_factory_.GetWeakPtr()));
}
private:
- void OnNewCommand(weave::Command* cmd) {
- LOG(INFO) << "received command: " << cmd->GetName();
- if (cmd->GetName() == "_greeter._greet") {
- std::string name;
- if (!cmd->GetParameters()->GetString("_name", &name))
- name = "anonymous";
+ void DoGreet(const std::weak_ptr<weave::Command>& command, int todo) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
- LOG(INFO) << cmd->GetName() << " command in progress";
- cmd->SetProgress(base::DictionaryValue{}, nullptr);
+ std::string name;
+ if (!cmd->GetParameters()->GetString("_name", &name)) {
+ weave::ErrorPtr error;
+ weave::Error::AddTo(&error, FROM_HERE, "example",
+ "invalid_parameter_value", "Name is missing");
+ cmd->Abort(error.get(), nullptr);
+ return;
+ }
- base::DictionaryValue result;
- result.SetString("_greeting", "Hello " + name);
- cmd->SetResults(result, nullptr);
- LOG(INFO) << cmd->GetName() << " command finished: " << result;
+ if (todo-- > 0) {
+ LOG(INFO) << "Hello " << name;
+
+ base::DictionaryValue progress;
+ progress.SetInteger("_todo", todo);
+ cmd->SetProgress(progress, nullptr);
base::DictionaryValue state;
- state.SetIntegerWithoutPathExpansion("_greeter._greetings_counter",
- ++counter_);
+ state.SetInteger("_greeter._greetings_counter", ++counter_);
device_->SetStateProperties(state, nullptr);
+ }
- LOG(INFO) << "New state: " << *device_->GetState();
+ if (todo > 0) {
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&CommandHandler::DoGreet,
+ weak_ptr_factory_.GetWeakPtr(), command, todo),
+ base::TimeDelta::FromSeconds(1));
+ return;
+ }
- cmd->Done();
- } else if (cmd->GetName() == "_ledflasher._set") {
- int32_t led_index;
- bool cmd_value;
- if (cmd->GetParameters()->GetInteger("_led", &led_index) &&
- cmd->GetParameters()->GetBoolean("_on", &cmd_value)) {
- // Display this command in terminal
- LOG(INFO) << cmd->GetName() << " _led: " << led_index
- << ", _on: " << (cmd_value ? "true" : "false");
+ base::DictionaryValue result;
+ result.SetString("_greeting", "Hello " + name);
+ cmd->Complete(result, nullptr);
+ LOG(INFO) << cmd->GetName() << " command finished: " << result;
+ LOG(INFO) << "New state: " << *device_->GetState();
+ }
- led_index--;
- int new_state = cmd_value ? 1 : 0;
- int cur_state = led_status_[led_index];
- led_status_[led_index] = new_state;
+ void OnGreetCommand(const std::weak_ptr<weave::Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
- if (cmd_value != cur_state) {
- UpdateLedState();
- }
- }
- cmd->Done();
- } else if (cmd->GetName() == "_ledflasher._toggle") {
- int32_t led_index;
- if (cmd->GetParameters()->GetInteger("_led", &led_index)) {
- LOG(INFO) << cmd->GetName() << " _led: " << led_index;
- led_index--;
- led_status_[led_index] = ~led_status_[led_index];
+ int todo = 1;
+ cmd->GetParameters()->GetInteger("_count", &todo);
+ DoGreet(command, todo);
+ }
+ void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
+ int32_t led_index = 0;
+ bool cmd_value = false;
+ if (cmd->GetParameters()->GetInteger("_led", &led_index) &&
+ cmd->GetParameters()->GetBoolean("_on", &cmd_value)) {
+ // Display this command in terminal
+ LOG(INFO) << cmd->GetName() << " _led: " << led_index
+ << ", _on: " << (cmd_value ? "true" : "false");
+
+ led_index--;
+ int new_state = cmd_value ? 1 : 0;
+ int cur_state = led_status_[led_index];
+ led_status_[led_index] = new_state;
+
+ if (cmd_value != cur_state) {
UpdateLedState();
}
- cmd->Done();
- } else {
- LOG(INFO) << cmd->GetName() << " unimplemented command: ignored";
+ cmd->Complete({}, nullptr);
+ return;
}
+ weave::ErrorPtr error;
+ weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+ "Invalid parameters");
+ cmd->Abort(error.get(), nullptr);
+ }
+
+ void OnFlasherToggleCommand(const std::weak_ptr<weave::Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
+ int32_t led_index = 0;
+ if (cmd->GetParameters()->GetInteger("_led", &led_index)) {
+ LOG(INFO) << cmd->GetName() << " _led: " << led_index;
+ led_index--;
+ led_status_[led_index] = ~led_status_[led_index];
+
+ UpdateLedState();
+ cmd->Complete({}, nullptr);
+ return;
+ }
+ weave::ErrorPtr error;
+ weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+ "Invalid parameters");
+ cmd->Abort(error.get(), nullptr);
+ }
+
+ void OnUnhandledCommand(const std::weak_ptr<weave::Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << cmd->GetName() << " unimplemented command: ignored";
}
void UpdateLedState(void) {
@@ -105,6 +210,8 @@
}
weave::Device* device_{nullptr};
+ weave::provider::TaskRunner* task_runner_{nullptr};
+
int counter_{0};
// Simulate LED status on this device so client app could explore
@@ -114,6 +221,13 @@
base::WeakPtrFactory<CommandHandler> weak_ptr_factory_{this};
};
+void OnRegisterDeviceDone(weave::Device* device, weave::ErrorPtr error) {
+ if (error)
+ LOG(ERROR) << "Fail to register device: " << error->GetMessage();
+ else
+ LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id;
+}
+
} // namespace
int main(int argc, char** argv) {
@@ -136,6 +250,13 @@
return 1;
}
registration_ticket = arg.substr(pos + 1);
+ } else if (arg.find("--v") != std::string::npos) {
+ auto pos = arg.find("=");
+ if (pos == std::string::npos) {
+ ShowUsage(argv[0]);
+ return 1;
+ }
+ logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1)));
} else {
ShowUsage(argv[0]);
return 1;
@@ -157,16 +278,11 @@
&bluetooth);
if (!registration_ticket.empty()) {
- weave::ErrorPtr error;
- auto device_id = device->Register(registration_ticket, &error);
- if (error != nullptr) {
- LOG(ERROR) << "Fail to register device: " << error->GetMessage();
- } else {
- LOG(INFO) << "Device registered: " << device_id;
- }
+ device->Register(registration_ticket,
+ base::Bind(&OnRegisterDeviceDone, device.get()));
}
- CommandHandler handler(device.get());
+ CommandHandler handler(device.get(), &task_runner);
task_runner.Run();
LOG(INFO) << "exit";
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/network_manager.cc
index 0fdae2d..efc2d5c 100644
--- a/libweave/examples/ubuntu/network_manager.cc
+++ b/libweave/examples/ubuntu/network_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -57,13 +57,11 @@
callbacks_.push_back(callback);
}
-void NetworkImpl::TryToConnect(
- const std::string& ssid,
- const std::string& passphrase,
- int pid,
- base::Time until,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+void NetworkImpl::TryToConnect(const std::string& ssid,
+ const std::string& passphrase,
+ int pid,
+ base::Time until,
+ const DoneCallback& callback) {
if (pid) {
int status = 0;
if (pid == waitpid(pid, &status, WNOWAIT)) {
@@ -80,7 +78,8 @@
close(sockf_d);
if (ssid == essid)
- return task_runner_->PostDelayedTask(FROM_HERE, success_callback, {});
+ return task_runner_->PostDelayedTask(FROM_HERE,
+ base::Bind(callback, nullptr), {});
pid = 0; // Try again.
}
}
@@ -95,36 +94,32 @@
Error::AddTo(&error, FROM_HERE, "wifi", "timeout",
"Timeout connecting to WiFI network.");
task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(error_callback, base::Owned(error.release())),
- {});
+ FROM_HERE, base::Bind(callback, base::Passed(&error)), {});
return;
}
task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&NetworkImpl::TryToConnect,
- weak_ptr_factory_.GetWeakPtr(), ssid, passphrase,
- pid, until, success_callback, error_callback),
+ FROM_HERE,
+ base::Bind(&NetworkImpl::TryToConnect, weak_ptr_factory_.GetWeakPtr(),
+ ssid, passphrase, pid, until, callback),
base::TimeDelta::FromSeconds(1));
}
void NetworkImpl::Connect(const std::string& ssid,
const std::string& passphrase,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const DoneCallback& callback) {
force_bootstrapping_ = false;
CHECK(!hostapd_started_);
if (hostapd_started_) {
ErrorPtr error;
Error::AddTo(&error, FROM_HERE, "wifi", "busy", "Running Access Point.");
task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(error_callback, base::Owned(error.release())),
- {});
+ FROM_HERE, base::Bind(callback, base::Passed(&error)), {});
return;
}
TryToConnect(ssid, passphrase, 0,
- base::Time::Now() + base::TimeDelta::FromMinutes(1),
- success_callback, error_callback);
+ base::Time::Now() + base::TimeDelta::FromMinutes(1), callback);
}
void NetworkImpl::UpdateNetworkState() {
@@ -132,9 +127,9 @@
if (force_bootstrapping_)
return;
if (std::system("ping talk.google.com -c 1") == 0)
- network_state_ = State::kConnected;
+ network_state_ = State::kOnline;
else if (std::system("nmcli dev"))
- network_state_ = State::kFailure;
+ network_state_ = State::kError;
else if (std::system("nmcli dev | grep connecting") == 0)
network_state_ = State::kConnecting;
@@ -203,21 +198,22 @@
return std::system("nmcli dev | grep ^wlan0") == 0;
}
-void NetworkImpl::OpenSslSocket(
- const std::string& host,
- uint16_t port,
- const OpenSslSocketSuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+void NetworkImpl::OpenSslSocket(const std::string& host,
+ uint16_t port,
+ const OpenSslSocketCallback& callback) {
// Connect to SSL port instead of upgrading to TLS.
std::unique_ptr<SSLStream> tls_stream{new SSLStream{task_runner_}};
if (tls_stream->Init(host, port)) {
task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(success_callback, base::Passed(&tls_stream)), {});
+ FROM_HERE, base::Bind(callback, base::Passed(&tls_stream), nullptr),
+ {});
} else {
ErrorPtr error;
Error::AddTo(&error, FROM_HERE, "tls", "tls_init_failed",
"Failed to initialize TLS stream.");
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error)), {});
}
}
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h
index b8e589d..3769ab1 100644
--- a/libweave/examples/ubuntu/network_manager.h
+++ b/libweave/examples/ubuntu/network_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -35,14 +35,12 @@
State GetConnectionState() const override;
void OpenSslSocket(const std::string& host,
uint16_t port,
- const OpenSslSocketSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const OpenSslSocketCallback& callback) override;
// Wifi implementation.
void Connect(const std::string& ssid,
const std::string& passphrase,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const DoneCallback& callback) override;
void StartAccessPoint(const std::string& ssid) override;
void StopAccessPoint() override;
@@ -53,8 +51,7 @@
const std::string& passphrase,
int pid,
base::Time until,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback);
+ const DoneCallback& callback);
void UpdateNetworkState();
bool force_bootstrapping_{false};
diff --git a/libweave/examples/ubuntu/prerequisites.sh b/libweave/examples/ubuntu/prerequisites.sh
index f64f06b..bc70fd3 100755
--- a/libweave/examples/ubuntu/prerequisites.sh
+++ b/libweave/examples/ubuntu/prerequisites.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
+# 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.
@@ -15,6 +15,8 @@
libavahi-client-dev \
libcurl4-openssl-dev \
libexpat1-dev \
+ libnl-3-dev \
+ libnl-route-3-dev \
libtool \
ninja-build \
|| exit 1
diff --git a/libweave/examples/ubuntu/ssl_stream.cc b/libweave/examples/ubuntu/ssl_stream.cc
index 58626cc..fc2d36d 100644
--- a/libweave/examples/ubuntu/ssl_stream.cc
+++ b/libweave/examples/ubuntu/ssl_stream.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -23,14 +23,13 @@
void SSLStream::Read(void* buffer,
size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const ReadCallback& callback) {
int res = SSL_read(ssl_.get(), buffer, size_to_read);
if (res > 0) {
task_runner_->PostDelayedTask(
FROM_HERE,
base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
- base::Bind(success_callback, res)),
+ base::Bind(callback, res, nullptr)),
{});
return;
}
@@ -39,9 +38,8 @@
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&SSLStream::Read, weak_ptr_factory_.GetWeakPtr(), buffer,
- size_to_read, success_callback, error_callback),
+ FROM_HERE, base::Bind(&SSLStream::Read, weak_ptr_factory_.GetWeakPtr(),
+ buffer, size_to_read, callback),
base::TimeDelta::FromSeconds(1));
return;
}
@@ -51,17 +49,15 @@
"SSL error");
task_runner_->PostDelayedTask(
FROM_HERE,
- base::Bind(
- &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
- base::Bind(error_callback, base::Owned(weave_error.release()))),
+ base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+ base::Bind(callback, 0, base::Passed(&weave_error))),
{});
return;
}
void SSLStream::Write(const void* buffer,
size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const WriteCallback& callback) {
int res = SSL_write(ssl_.get(), buffer, size_to_write);
if (res > 0) {
buffer = static_cast<const char*>(buffer) + res;
@@ -70,15 +66,14 @@
task_runner_->PostDelayedTask(
FROM_HERE,
base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
- success_callback),
+ base::Bind(callback, nullptr)),
{});
return;
}
task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&SSLStream::Write, weak_ptr_factory_.GetWeakPtr(), buffer,
- size_to_write, success_callback, error_callback),
+ FROM_HERE, base::Bind(&SSLStream::Write, weak_ptr_factory_.GetWeakPtr(),
+ buffer, size_to_write, callback),
base::TimeDelta::FromSeconds(1));
return;
@@ -88,9 +83,8 @@
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&SSLStream::Write, weak_ptr_factory_.GetWeakPtr(), buffer,
- size_to_write, success_callback, error_callback),
+ FROM_HERE, base::Bind(&SSLStream::Write, weak_ptr_factory_.GetWeakPtr(),
+ buffer, size_to_write, callback),
base::TimeDelta::FromSeconds(1));
return;
}
@@ -100,9 +94,8 @@
"SSL error");
task_runner_->PostDelayedTask(
FROM_HERE,
- base::Bind(
- &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
- base::Bind(error_callback, base::Owned(weave_error.release()))),
+ base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+ base::Bind(callback, base::Passed(&weave_error))),
{});
return;
}
diff --git a/libweave/examples/ubuntu/ssl_stream.h b/libweave/examples/ubuntu/ssl_stream.h
index ac0d76a..ae0e539 100644
--- a/libweave/examples/ubuntu/ssl_stream.h
+++ b/libweave/examples/ubuntu/ssl_stream.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -26,13 +26,11 @@
void Read(void* buffer,
size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const ReadCallback& callback) override;
void Write(const void* buffer,
size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const WriteCallback& callback) override;
void CancelPendingOperations() override;
diff --git a/libweave/examples/ubuntu/weave.gyp b/libweave/examples/ubuntu/weave.gyp
index a4df01d..a561c9d 100644
--- a/libweave/examples/ubuntu/weave.gyp
+++ b/libweave/examples/ubuntu/weave.gyp
@@ -1,17 +1,42 @@
+# 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.
{
'targets': [
{
'target_name': 'weave',
'type': 'executable',
- 'cflags': ['-pthread'],
+ 'variables': {
+ 'deps': [
+ 'avahi-client',
+ 'expat',
+ 'libcurl',
+ 'libcrypto',
+ 'openssl',
+ ]
+ },
+ 'cflags': [
+ '>!@(pkg-config >(deps) --cflags)',
+ '-pthread',
+ ],
+ 'link_settings': {
+ 'ldflags+': [
+ '>!@(pkg-config >(deps) --libs-only-L --libs-only-other)',
+ ],
+ 'libraries+': [
+ '>!(pkg-config >(deps) --libs-only-l)',
+ ],
+ },
'sources': [
'avahi_client.cc',
'bluez_client.cc',
'curl_http_client.cc',
+ 'event_http_client.cc',
'event_http_server.cc',
'event_task_runner.cc',
'file_config_store.cc',
'main.cc',
+ 'event_network.cc',
'network_manager.cc',
'ssl_stream.cc',
],
@@ -20,14 +45,8 @@
],
'libraries': [
'-levent',
- '-lcrypto',
- '-lexpat',
- '-lcurl',
- '-lpthread',
- '-lssl',
- '-lavahi-common',
- '-lavahi-client',
'-levent_openssl',
+ '-lpthread',
]
}
]
diff --git a/libweave/include/weave/command.h b/libweave/include/weave/command.h
index 911da1e..59a9305 100644
--- a/libweave/include/weave/command.h
+++ b/libweave/include/weave/command.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -12,39 +12,20 @@
namespace weave {
-enum class CommandStatus {
- kQueued,
- kInProgress,
- kPaused,
- kError,
- kDone,
- kCancelled,
- kAborted,
- kExpired,
-};
-
-enum class CommandOrigin { kLocal, kCloud };
-
class Command {
public:
- // This interface lets the command to notify clients about changes.
- class Observer {
- public:
- virtual void OnResultsChanged() = 0;
- virtual void OnStatusChanged() = 0;
- virtual void OnProgressChanged() = 0;
- virtual void OnCommandDestroyed() = 0;
-
- protected:
- virtual ~Observer() = default;
+ enum class State {
+ kQueued,
+ kInProgress,
+ kPaused,
+ kError,
+ kDone,
+ kCancelled,
+ kAborted,
+ kExpired,
};
- // Adds an observer for this command. The observer object is not owned by this
- // class.
- virtual void AddObserver(Observer* observer) = 0;
-
- // Removes an observer for this command.
- virtual void RemoveObserver(Observer* observer) = 0;
+ enum class Origin { kLocal, kCloud };
// Returns the full command ID.
virtual const std::string& GetID() const = 0;
@@ -52,11 +33,11 @@
// Returns the full name of the command.
virtual const std::string& GetName() const = 0;
- // Returns the command status.
- virtual CommandStatus GetStatus() const = 0;
+ // Returns the command state.
+ virtual Command::State GetState() const = 0;
// Returns the origin of the command.
- virtual CommandOrigin GetOrigin() const = 0;
+ virtual Command::Origin GetOrigin() const = 0;
// Returns the command parameters.
virtual std::unique_ptr<base::DictionaryValue> GetParameters() const = 0;
@@ -67,27 +48,35 @@
// Returns the command results.
virtual std::unique_ptr<base::DictionaryValue> GetResults() const = 0;
+ // Returns the command error.
+ virtual const Error* GetError() const = 0;
+
// Updates the command progress. The |progress| should match the schema.
// Returns false if |progress| value is incorrect.
virtual bool SetProgress(const base::DictionaryValue& progress,
ErrorPtr* error) = 0;
+ // Sets command into terminal "done" state.
// Updates the command results. The |results| should match the schema.
// Returns false if |results| value is incorrect.
- virtual bool SetResults(const base::DictionaryValue& results,
- ErrorPtr* error) = 0;
+ virtual bool Complete(const base::DictionaryValue& results,
+ ErrorPtr* error) = 0;
+
+ // Sets command into paused state.
+ // This is not terminal state. Command can be resumed with |SetProgress| call.
+ virtual bool Pause(ErrorPtr* error) = 0;
+
+ // Sets command into error state and assign error.
+ // This is not terminal state. Command can be resumed with |SetProgress| call.
+ virtual bool SetError(const Error* command_error, ErrorPtr* error) = 0;
// Aborts command execution.
- virtual void Abort() = 0;
+ // Sets command into terminal "aborted" state.
+ virtual bool Abort(const Error* command_error, ErrorPtr* error) = 0;
// Cancels command execution.
- virtual void Cancel() = 0;
-
- // Marks the command as completed successfully.
- virtual void Done() = 0;
-
- // Returns JSON representation of the command.
- virtual std::unique_ptr<base::DictionaryValue> ToJson() const = 0;
+ // Sets command into terminal "canceled" state.
+ virtual bool Cancel(ErrorPtr* error) = 0;
protected:
virtual ~Command() = default;
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index c81dd04..e761e0c 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -45,14 +45,23 @@
virtual void AddSettingsChangedCallback(
const SettingsChangedCallback& callback) = 0;
- // Callback type for AddCommandAddedCallback and AddCommandRemovedCallback.
- using CommandCallback = base::Callback<void(Command*)>;
+ // Adds provided commands definitions. Can be called multiple times with
+ // condition that definitions do not conflict.
+ // Invalid value is fatal.
+ virtual void AddCommandDefinitionsFromJson(const std::string& json) = 0;
+ virtual void AddCommandDefinitions(const base::DictionaryValue& dict) = 0;
- // Adds notification callback for a new command being added to the queue.
- virtual void AddCommandAddedCallback(const CommandCallback& callback) = 0;
+ // Callback type for AddCommandHandler.
+ using CommandHandlerCallback =
+ base::Callback<void(const std::weak_ptr<Command>& command)>;
- // Adds notification callback for a command being removed from the queue.
- virtual void AddCommandRemovedCallback(const CommandCallback& callback) = 0;
+ // Sets handler for new commands added to the queue.
+ // |command_name| is the full command name of the command to handle. e.g.
+ // "base.reboot". Each command can have no more than one handler.
+ // Empty |command_name| sets default handler for all unhanded commands.
+ // No new command handlers can be set after default handler was set.
+ virtual void AddCommandHandler(const std::string& command_name,
+ const CommandHandlerCallback& callback) = 0;
// Adds a new command to the command queue.
virtual bool AddCommand(const base::DictionaryValue& command,
@@ -67,6 +76,24 @@
// Sets callback which is called when stat is changed.
virtual void AddStateChangedCallback(const base::Closure& callback) = 0;
+ // Adds provided state definitions. Can be called multiple times with
+ // condition that definitions do not conflict.
+ // Invalid value is fatal.
+ virtual void AddStateDefinitionsFromJson(const std::string& json) = 0;
+ virtual void AddStateDefinitions(const base::DictionaryValue& dict) = 0;
+
+ // Sets value of multiple properties of the state.
+ // It's recommended to call this to initialize state defined by
+ // AddStateDefinitions.
+ // Example:
+ // device->SetStatePropertiesFromJson("{'base':{'firmwareVersion':'123'}}")
+ // Method completely replaces properties included |json| or |dict|.
+ // Properties of the state not included |json| or |dict| will stay unchanged.
+ virtual bool SetStatePropertiesFromJson(const std::string& json,
+ ErrorPtr* error) = 0;
+ virtual bool SetStateProperties(const base::DictionaryValue& dict,
+ ErrorPtr* error) = 0;
+
// Returns value of the single property.
// |name| is full property name, including package name. e.g. "base.network".
virtual std::unique_ptr<base::Value> GetStateProperty(
@@ -78,10 +105,6 @@
const base::Value& value,
ErrorPtr* error) = 0;
- // Updates a multiple property values.
- virtual bool SetStateProperties(const base::DictionaryValue& property_set,
- ErrorPtr* error) = 0;
-
// Returns aggregated state properties across all registered packages.
virtual std::unique_ptr<base::DictionaryValue> GetState() const = 0;
@@ -95,10 +118,10 @@
virtual void AddGcdStateChangedCallback(
const GcdStateChangedCallback& callback) = 0;
- // Registers the device. Returns a device ID on success.
+ // Registers the device.
// This is testing method and should not be used by applications.
- virtual std::string Register(const std::string& ticket_id,
- ErrorPtr* error) = 0;
+ virtual void Register(const std::string& ticket_id,
+ const DoneCallback& callback) = 0;
// Handler should display pin code to the user.
using PairingBeginCallback =
diff --git a/libweave/include/weave/enum_to_string.h b/libweave/include/weave/enum_to_string.h
index d6c2b79..67d6154 100644
--- a/libweave/include/weave/enum_to_string.h
+++ b/libweave/include/weave/enum_to_string.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -52,7 +52,7 @@
return m.name;
}
}
- NOTREACHED();
+ NOTREACHED() << static_cast<int>(id);
return std::string();
}
diff --git a/libweave/include/weave/error.h b/libweave/include/weave/error.h
index 67f923f..6687d98 100644
--- a/libweave/include/weave/error.h
+++ b/libweave/include/weave/error.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -126,8 +126,13 @@
DISALLOW_COPY_AND_ASSIGN(Error);
};
-using SuccessCallback = base::Closure;
-using ErrorCallback = base::Callback<void(const Error* error)>;
+// Default callback type for async operations.
+// Function having this callback as argument should call the callback exactly
+// one time.
+// Successfully completed operation should run callback with |error| set to
+// null. Failed operation should run callback with |error| containing error
+// details.
+using DoneCallback = base::Callback<void(ErrorPtr error)>;
} // namespace weave
diff --git a/libweave/include/weave/export.h b/libweave/include/weave/export.h
index 72220a7..1bc27c5 100644
--- a/libweave/include/weave/export.h
+++ b/libweave/include/weave/export.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/provider/bluetooth.h b/libweave/include/weave/provider/bluetooth.h
index d87dcc0..e8f3b3c 100644
--- a/libweave/include/weave/provider/bluetooth.h
+++ b/libweave/include/weave/provider/bluetooth.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/provider/config_store.h b/libweave/include/weave/provider/config_store.h
index aa7c5e5..4107748 100644
--- a/libweave/include/weave/provider/config_store.h
+++ b/libweave/include/weave/provider/config_store.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -35,15 +35,6 @@
// recommended to protect data, e.g. using encryption.
virtual void SaveSettings(const std::string& settings) = 0;
- // Returns command definitions as array of JSONs.
- virtual std::vector<std::string> LoadCommandDefs() = 0;
-
- // Returns device state definitions as array of JSONs.
- virtual std::vector<std::string> LoadStateDefs() = 0;
-
- // Returns device state defaults as array of JSONs.
- virtual std::vector<std::string> LoadStateDefaults() = 0;
-
protected:
virtual ~ConfigStore() = default;
};
diff --git a/libweave/include/weave/provider/dns_service_discovery.h b/libweave/include/weave/provider/dns_service_discovery.h
index a6f2057..d96e22d 100644
--- a/libweave/include/weave/provider/dns_service_discovery.h
+++ b/libweave/include/weave/provider/dns_service_discovery.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/provider/http_client.h b/libweave/include/weave/provider/http_client.h
index 9671f0d..6edf4bf 100644
--- a/libweave/include/weave/provider/http_client.h
+++ b/libweave/include/weave/provider/http_client.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -17,34 +17,31 @@
class HttpClient {
public:
+ enum class Method {
+ kGet,
+ kPatch,
+ kPost,
+ kPut,
+ };
+
class Response {
public:
virtual int GetStatusCode() const = 0;
virtual std::string GetContentType() const = 0;
- virtual const std::string& GetData() const = 0;
+ virtual std::string GetData() const = 0;
- // TODO(vitalybuka): Hide when SendRequestAndBlock is removed.
virtual ~Response() = default;
};
using Headers = std::vector<std::pair<std::string, std::string>>;
- using SuccessCallback = base::Callback<void(int, const Response&)>;
- using ErrorCallback = base::Callback<void(int, const Error*)>;
+ using SendRequestCallback =
+ base::Callback<void(std::unique_ptr<Response> response, ErrorPtr error)>;
- // TODO(vitalybuka): Remove blocking version.
- virtual std::unique_ptr<Response> SendRequestAndBlock(
- const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) = 0;
-
- virtual int SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ virtual void SendRequest(Method method,
+ const std::string& url,
+ const Headers& headers,
+ const std::string& data,
+ const SendRequestCallback& callback) = 0;
protected:
virtual ~HttpClient() = default;
diff --git a/libweave/include/weave/provider/http_server.h b/libweave/include/weave/provider/http_server.h
index 1d4ab1e..da53e1f 100644
--- a/libweave/include/weave/provider/http_server.h
+++ b/libweave/include/weave/provider/http_server.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,37 +18,32 @@
public:
class Request {
public:
- virtual const std::string& GetPath() const = 0;
- virtual std::string GetFirstHeader(const std::string& name) const = 0;
- virtual const std::vector<uint8_t>& GetData() const = 0;
- virtual std::unique_ptr<Stream> GetDataStream() const = 0;
-
- protected:
virtual ~Request() = default;
+
+ virtual std::string GetPath() const = 0;
+ virtual std::string GetFirstHeader(const std::string& name) const = 0;
+ virtual std::string GetData() = 0;
+
+ virtual void SendReply(int status_code,
+ const std::string& data,
+ const std::string& mime_type) = 0;
};
- using OnStateChangedCallback = base::Callback<void(const HttpServer& server)>;
+ // Callback type for AddRequestHandler.
+ using RequestHandlerCallback =
+ base::Callback<void(std::unique_ptr<Request> request)>;
- using OnReplyCallback = base::Callback<void(int status_code,
- const std::string& data,
- const std::string& mime_type)>;
-
- using OnRequestCallback =
- base::Callback<void(const Request& request,
- const OnReplyCallback& callback)>;
-
- // Adds notification callback for server started/stopped serving requests.
- 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,
- const OnRequestCallback& callback) = 0;
+ // Adds callback called on new http/https requests with the given path.
+ virtual void AddHttpRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) = 0;
+ virtual void AddHttpsRequestHandler(
+ const std::string& path,
+ const RequestHandlerCallback& callback) = 0;
virtual uint16_t GetHttpPort() const = 0;
virtual uint16_t GetHttpsPort() const = 0;
- virtual const std::vector<uint8_t>& GetHttpsCertificateFingerprint()
- const = 0;
+ virtual std::vector<uint8_t> GetHttpsCertificateFingerprint() const = 0;
protected:
virtual ~HttpServer() = default;
diff --git a/libweave/include/weave/provider/network.h b/libweave/include/weave/provider/network.h
index 8e22166..651155a 100644
--- a/libweave/include/weave/provider/network.h
+++ b/libweave/include/weave/provider/network.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,17 +20,17 @@
public:
enum class State {
kOffline = 0,
- kFailure,
+ kError,
kConnecting,
- kConnected,
+ kOnline,
};
// Callback type for AddConnectionChangedCallback.
using ConnectionChangedCallback = base::Closure;
// Callback type for OpenSslSocket.
- using OpenSslSocketSuccessCallback =
- base::Callback<void(std::unique_ptr<Stream> stream)>;
+ using OpenSslSocketCallback =
+ base::Callback<void(std::unique_ptr<Stream> stream, ErrorPtr error)>;
// Subscribes to notification about changes in network connectivity. Changes
// may include but not limited: interface up or down, new IP was assigned,
@@ -42,11 +42,9 @@
virtual State GetConnectionState() const = 0;
// Opens bidirectional sockets and returns attached stream.
- virtual void OpenSslSocket(
- const std::string& host,
- uint16_t port,
- const OpenSslSocketSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ virtual void OpenSslSocket(const std::string& host,
+ uint16_t port,
+ const OpenSslSocketCallback& callback) = 0;
protected:
virtual ~Network() = default;
diff --git a/libweave/include/weave/provider/task_runner.h b/libweave/include/weave/provider/task_runner.h
index daabc7e..0804a10 100644
--- a/libweave/include/weave/provider/task_runner.h
+++ b/libweave/include/weave/provider/task_runner.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/provider/test/fake_task_runner.h b/libweave/include/weave/provider/test/fake_task_runner.h
index c0c8e9e..06ccd6b 100644
--- a/libweave/include/weave/provider/test/fake_task_runner.h
+++ b/libweave/include/weave/provider/test/fake_task_runner.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -28,7 +28,7 @@
base::TimeDelta delay) override;
bool RunOnce();
- void Run();
+ void Run(size_t number_of_iterations = 1000);
void Break();
base::Clock* GetClock();
diff --git a/libweave/include/weave/provider/test/mock_bluetooth.h b/libweave/include/weave/provider/test/mock_bluetooth.h
index d572fa4..334f9de 100644
--- a/libweave/include/weave/provider/test/mock_bluetooth.h
+++ b/libweave/include/weave/provider/test/mock_bluetooth.h
@@ -1,18 +1,6 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+// 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_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_BLUETOOTH_H_
#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_BLUETOOTH_H_
diff --git a/libweave/include/weave/provider/test/mock_config_store.h b/libweave/include/weave/provider/test/mock_config_store.h
index 6eab802..01e1ef9 100644
--- a/libweave/include/weave/provider/test/mock_config_store.h
+++ b/libweave/include/weave/provider/test/mock_config_store.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -41,10 +41,6 @@
MOCK_METHOD1(LoadDefaults, bool(Settings*));
MOCK_METHOD0(LoadSettings, std::string());
MOCK_METHOD1(SaveSettings, void(const std::string&));
-
- MOCK_METHOD0(LoadCommandDefs, std::vector<std::string>());
- MOCK_METHOD0(LoadStateDefs, std::vector<std::string>());
- MOCK_METHOD0(LoadStateDefaults, std::vector<std::string>());
};
} // namespace test
diff --git a/libweave/include/weave/provider/test/mock_dns_service_discovery.h b/libweave/include/weave/provider/test/mock_dns_service_discovery.h
index 9c149df..708f3c3 100644
--- a/libweave/include/weave/provider/test/mock_dns_service_discovery.h
+++ b/libweave/include/weave/provider/test/mock_dns_service_discovery.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/provider/test/mock_http_client.h b/libweave/include/weave/provider/test/mock_http_client.h
index 21af699..77b9fd0 100644
--- a/libweave/include/weave/provider/test/mock_http_client.h
+++ b/libweave/include/weave/provider/test/mock_http_client.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,32 +20,19 @@
public:
MOCK_CONST_METHOD0(GetStatusCode, int());
MOCK_CONST_METHOD0(GetContentType, std::string());
- MOCK_CONST_METHOD0(GetData, const std::string&());
+ MOCK_CONST_METHOD0(GetData, std::string());
};
class MockHttpClient : public HttpClient {
public:
~MockHttpClient() override = default;
- MOCK_METHOD5(MockSendRequest,
- Response*(const std::string&,
- const std::string&,
- const Headers&,
- const std::string&,
- ErrorPtr*));
-
- std::unique_ptr<Response> SendRequestAndBlock(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) override;
-
- int SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ MOCK_METHOD5(SendRequest,
+ void(Method,
+ const std::string&,
+ const Headers&,
+ const std::string&,
+ const SendRequestCallback&));
};
} // namespace test
diff --git a/libweave/include/weave/provider/test/mock_http_server.h b/libweave/include/weave/provider/test/mock_http_server.h
index 3beb4ae..f56470b 100644
--- a/libweave/include/weave/provider/test/mock_http_server.h
+++ b/libweave/include/weave/provider/test/mock_http_server.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,13 +18,13 @@
class MockHttpServer : public HttpServer {
public:
- MOCK_METHOD1(AddOnStateChangedCallback, void(const OnStateChangedCallback&));
- MOCK_METHOD2(AddRequestHandler,
- void(const std::string&, const OnRequestCallback&));
-
+ MOCK_METHOD2(AddHttpRequestHandler,
+ void(const std::string&, const RequestHandlerCallback&));
+ MOCK_METHOD2(AddHttpsRequestHandler,
+ void(const std::string&, const RequestHandlerCallback&));
MOCK_CONST_METHOD0(GetHttpPort, uint16_t());
MOCK_CONST_METHOD0(GetHttpsPort, uint16_t());
- MOCK_CONST_METHOD0(GetHttpsCertificateFingerprint, std::vector<uint8_t>&());
+ MOCK_CONST_METHOD0(GetHttpsCertificateFingerprint, std::vector<uint8_t>());
};
} // namespace test
diff --git a/libweave/include/weave/provider/test/mock_network.h b/libweave/include/weave/provider/test/mock_network.h
index e38dde2..f6ab99a 100644
--- a/libweave/include/weave/provider/test/mock_network.h
+++ b/libweave/include/weave/provider/test/mock_network.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,11 +20,10 @@
MOCK_METHOD1(AddConnectionChangedCallback,
void(const ConnectionChangedCallback&));
MOCK_CONST_METHOD0(GetConnectionState, State());
- MOCK_METHOD4(OpenSslSocket,
+ MOCK_METHOD3(OpenSslSocket,
void(const std::string&,
uint16_t,
- const OpenSslSocketSuccessCallback&,
- const ErrorCallback&));
+ const OpenSslSocketCallback&));
};
} // namespace test
diff --git a/libweave/include/weave/provider/test/mock_wifi.h b/libweave/include/weave/provider/test/mock_wifi.h
index 6c53d9a..9fbe10f 100644
--- a/libweave/include/weave/provider/test/mock_wifi.h
+++ b/libweave/include/weave/provider/test/mock_wifi.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -17,11 +17,10 @@
class MockWifi : public Wifi {
public:
- MOCK_METHOD4(Connect,
+ MOCK_METHOD3(Connect,
void(const std::string&,
const std::string&,
- const base::Closure&,
- const ErrorCallback&));
+ const DoneCallback&));
MOCK_METHOD1(StartAccessPoint, void(const std::string&));
MOCK_METHOD0(StopAccessPoint, void());
};
diff --git a/libweave/include/weave/provider/wifi.h b/libweave/include/weave/provider/wifi.h
index 51f370c..111bf3c 100644
--- a/libweave/include/weave/provider/wifi.h
+++ b/libweave/include/weave/provider/wifi.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,8 +20,7 @@
// should post either of callbacks.
virtual void Connect(const std::string& ssid,
const std::string& passphrase,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const DoneCallback& callback) = 0;
// Starts WiFi access point for wifi setup.
virtual void StartAccessPoint(const std::string& ssid) = 0;
diff --git a/libweave/include/weave/settings.h b/libweave/include/weave/settings.h
index a2f3ded..e5d21b0 100644
--- a/libweave/include/weave/settings.h
+++ b/libweave/include/weave/settings.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/include/weave/stream.h b/libweave/include/weave/stream.h
index 9d4d6fd..19d38a0 100644
--- a/libweave/include/weave/stream.h
+++ b/libweave/include/weave/stream.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,15 +18,14 @@
virtual ~InputStream() = default;
// Callback type for Read.
- using ReadSuccessCallback = base::Callback<void(size_t size)>;
+ using ReadCallback = base::Callback<void(size_t size, ErrorPtr error)>;
- // Implementation should return immediately and post either success_callback
- // or error_callback. Caller guarantees that buffet is alive until either of
- // callback is called.
+ // Implementation should return immediately and post callback after
+ // completing operation. Caller guarantees that buffet is alive until callback
+ // is called.
virtual void Read(void* buffer,
size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const ReadCallback& callback) = 0;
};
// Interface for async input streaming.
@@ -34,14 +33,15 @@
public:
virtual ~OutputStream() = default;
- // Implementation should return immediately and post either success_callback
- // or error_callback. Caller guarantees that buffet is alive until either of
- // callback is called.
+ using WriteCallback = base::Callback<void(ErrorPtr error)>;
+
+ // Implementation should return immediately and post callback after
+ // completing operation. Caller guarantees that buffet is alive until either
+ // of callback is called.
// Success callback must be called only after all data is written.
virtual void Write(const void* buffer,
size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const WriteCallback& callback) = 0;
};
// Interface for async bi-directional streaming.
diff --git a/libweave/include/weave/test/fake_stream.h b/libweave/include/weave/test/fake_stream.h
index 8abb491..ea93da8 100644
--- a/libweave/include/weave/test/fake_stream.h
+++ b/libweave/include/weave/test/fake_stream.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -31,12 +31,10 @@
void CancelPendingOperations() override;
void Read(void* buffer,
size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const ReadCallback& callback) override;
void Write(const void* buffer,
size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) override;
+ const WriteCallback& callback) override;
private:
provider::TaskRunner* task_runner_{nullptr};
diff --git a/libweave/include/weave/test/mock_command.h b/libweave/include/weave/test/mock_command.h
index be1b0c3..2b1080e 100644
--- a/libweave/include/weave/test/mock_command.h
+++ b/libweave/include/weave/test/mock_command.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,27 +20,25 @@
public:
~MockCommand() override = default;
- MOCK_METHOD1(AddObserver, void(Observer*));
- MOCK_METHOD1(RemoveObserver, void(Observer*));
MOCK_CONST_METHOD0(GetID, const std::string&());
MOCK_CONST_METHOD0(GetName, const std::string&());
MOCK_CONST_METHOD0(GetCategory, const std::string&());
- MOCK_CONST_METHOD0(GetStatus, CommandStatus());
- MOCK_CONST_METHOD0(GetOrigin, CommandOrigin());
+ MOCK_CONST_METHOD0(GetState, Command::State());
+ MOCK_CONST_METHOD0(GetOrigin, Command::Origin());
MOCK_CONST_METHOD0(MockGetParameters, const std::string&());
MOCK_CONST_METHOD0(MockGetProgress, const std::string&());
MOCK_CONST_METHOD0(MockGetResults, const std::string&());
+ MOCK_CONST_METHOD0(GetError, const Error*());
MOCK_METHOD2(SetProgress, bool(const base::DictionaryValue&, ErrorPtr*));
- MOCK_METHOD2(SetResults, bool(const base::DictionaryValue&, ErrorPtr*));
- MOCK_METHOD0(Abort, void());
- MOCK_METHOD0(Cancel, void());
- MOCK_METHOD0(Done, void());
- MOCK_CONST_METHOD0(MockToJson, const std::string&());
+ MOCK_METHOD2(Complete, bool(const base::DictionaryValue&, ErrorPtr*));
+ MOCK_METHOD1(Pause, bool(ErrorPtr*));
+ MOCK_METHOD2(SetError, bool(const Error*, ErrorPtr*));
+ MOCK_METHOD2(Abort, bool(const Error*, ErrorPtr*));
+ MOCK_METHOD1(Cancel, bool(ErrorPtr*));
std::unique_ptr<base::DictionaryValue> GetParameters() const override;
std::unique_ptr<base::DictionaryValue> GetProgress() const override;
std::unique_ptr<base::DictionaryValue> GetResults() const override;
- std::unique_ptr<base::DictionaryValue> ToJson() const override;
};
} // namespace test
diff --git a/libweave/include/weave/test/mock_device.h b/libweave/include/weave/test/mock_device.h
index 480208e..f751f97 100644
--- a/libweave/include/weave/test/mock_device.h
+++ b/libweave/include/weave/test/mock_device.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -21,27 +21,32 @@
MOCK_CONST_METHOD0(GetSettings, const Settings&());
MOCK_METHOD1(AddSettingsChangedCallback,
void(const SettingsChangedCallback& callback));
- MOCK_METHOD1(AddCommandAddedCallback, void(const CommandCallback&));
- MOCK_METHOD1(AddCommandRemovedCallback, void(const CommandCallback&));
+ MOCK_METHOD1(AddCommandDefinitionsFromJson, void(const std::string&));
+ MOCK_METHOD1(AddCommandDefinitions, void(const base::DictionaryValue&));
+ MOCK_METHOD2(AddCommandHandler,
+ void(const std::string&, const CommandHandlerCallback&));
MOCK_METHOD3(AddCommand,
bool(const base::DictionaryValue&, std::string*, ErrorPtr*));
MOCK_METHOD1(FindCommand, Command*(const std::string&));
MOCK_METHOD1(AddStateChangedCallback, void(const base::Closure& callback));
+ MOCK_METHOD1(AddStateDefinitionsFromJson, void(const std::string&));
+ MOCK_METHOD1(AddStateDefinitions, void(const base::DictionaryValue&));
+ MOCK_METHOD2(SetStatePropertiesFromJson, bool(const std::string&, ErrorPtr*));
+ MOCK_METHOD2(SetStateProperties,
+ bool(const base::DictionaryValue&, ErrorPtr*));
MOCK_CONST_METHOD1(MockGetStateProperty,
base::Value*(const std::string& name));
MOCK_METHOD3(SetStateProperty,
bool(const std::string& name,
const base::Value& value,
ErrorPtr* error));
- MOCK_METHOD2(SetStateProperties,
- bool(const base::DictionaryValue& property_set,
- ErrorPtr* error));
MOCK_CONST_METHOD0(MockGetState, base::DictionaryValue*());
MOCK_CONST_METHOD0(GetGcdState, GcdState());
MOCK_METHOD1(AddGcdStateChangedCallback,
void(const GcdStateChangedCallback& callback));
MOCK_METHOD2(Register,
- std::string(const std::string& ticket_id, ErrorPtr* error));
+ void(const std::string& ticket_id,
+ const DoneCallback& callback));
MOCK_METHOD2(AddPairingChangedCallbacks,
void(const PairingBeginCallback& begin_callback,
const PairingEndCallback& end_callback));
diff --git a/libweave/include/weave/test/unittest_utils.h b/libweave/include/weave/test/unittest_utils.h
index ff8cd2a..304ba01 100644
--- a/libweave/include/weave/test/unittest_utils.h
+++ b/libweave/include/weave/test/unittest_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/libweave.gypi b/libweave/libweave.gypi
index bad1412..1e42f83 100644
--- a/libweave/libweave.gypi
+++ b/libweave/libweave.gypi
@@ -1,9 +1,9 @@
+# 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.
{
'variables': {
'weave_sources': [
- 'external/crypto/p224.cc',
- 'external/crypto/p224_spake.cc',
- 'external/crypto/sha2.cc',
'src/backoff_entry.cc',
'src/base_api_handler.cc',
'src/commands/cloud_command_proxy.cc',
@@ -47,21 +47,21 @@
'src/states/state_change_queue.cc',
'src/states/state_manager.cc',
'src/states/state_package.cc',
+ 'src/streams.cc',
'src/string_utils.cc',
'src/utils.cc',
+ 'third_party/chromium/crypto/p224.cc',
+ 'third_party/chromium/crypto/p224_spake.cc',
+ 'third_party/chromium/crypto/sha2.cc',
'third_party/modp_b64/modp_b64.cc',
],
'weave_test_sources': [
'src/test/fake_stream.cc',
'src/test/fake_task_runner.cc',
'src/test/mock_command.cc',
- 'src/test/mock_http_client.cc',
'src/test/unittest_utils.cc',
],
'weave_unittest_sources': [
- 'external/crypto/p224_spake_unittest.cc',
- 'external/crypto/p224_unittest.cc',
- 'external/crypto/sha2_unittest.cc',
'src/backoff_entry_unittest.cc',
'src/base_api_handler_unittest.cc',
'src/commands/cloud_command_proxy_unittest.cc',
@@ -87,68 +87,72 @@
'src/states/state_change_queue_unittest.cc',
'src/states/state_manager_unittest.cc',
'src/states/state_package_unittest.cc',
+ 'src/streams_unittest.cc',
'src/string_utils_unittest.cc',
'src/test/weave_testrunner.cc',
+ 'third_party/chromium/crypto/p224_spake_unittest.cc',
+ 'third_party/chromium/crypto/p224_unittest.cc',
+ 'third_party/chromium/crypto/sha2_unittest.cc',
],
'weave_exports_unittest_sources': [
'src/test/weave_testrunner.cc',
'src/weave_unittest.cc',
],
'base_sources': [
- 'external/base/bind_helpers.cc',
- 'external/base/callback_internal.cc',
- 'external/base/guid_posix.cc',
- 'external/base/json/json_parser.cc',
- 'external/base/json/json_reader.cc',
- 'external/base/json/json_writer.cc',
- 'external/base/json/string_escape.cc',
- 'external/base/memory/ref_counted.cc',
- 'external/base/logging.cc',
- 'external/base/location.cc',
- 'external/base/memory/weak_ptr.cc',
- 'external/base/memory/weak_ptr.cc',
- 'external/base/rand_util.cc',
- 'external/base/rand_util_posix.cc',
- 'external/base/strings/string_number_conversions.cc',
- 'external/base/strings/string_piece.cc',
- 'external/base/strings/stringprintf.cc',
- 'external/base/strings/string_util.cc',
- 'external/base/strings/string_util_constants.cc',
- 'external/base/strings/utf_string_conversion_utils.cc',
- 'external/base/third_party/dmg_fp/g_fmt.cc',
- 'external/base/third_party/dmg_fp/dtoa.cc',
- 'external/base/third_party/icu/icu_utf.cc',
- 'external/base/time/clock.cc',
- 'external/base/time/time.cc',
- 'external/base/time/time_posix.cc',
- 'external/base/values.cc',
+ 'third_party/chromium/base/bind_helpers.cc',
+ 'third_party/chromium/base/callback_internal.cc',
+ 'third_party/chromium/base/guid_posix.cc',
+ 'third_party/chromium/base/json/json_parser.cc',
+ 'third_party/chromium/base/json/json_reader.cc',
+ 'third_party/chromium/base/json/json_writer.cc',
+ 'third_party/chromium/base/json/string_escape.cc',
+ 'third_party/chromium/base/memory/ref_counted.cc',
+ 'third_party/chromium/base/logging.cc',
+ 'third_party/chromium/base/location.cc',
+ 'third_party/chromium/base/memory/weak_ptr.cc',
+ 'third_party/chromium/base/memory/weak_ptr.cc',
+ 'third_party/chromium/base/rand_util.cc',
+ 'third_party/chromium/base/rand_util_posix.cc',
+ 'third_party/chromium/base/strings/string_number_conversions.cc',
+ 'third_party/chromium/base/strings/string_piece.cc',
+ 'third_party/chromium/base/strings/stringprintf.cc',
+ 'third_party/chromium/base/strings/string_util.cc',
+ 'third_party/chromium/base/strings/string_util_constants.cc',
+ 'third_party/chromium/base/strings/utf_string_conversion_utils.cc',
+ 'third_party/chromium/base/third_party/dmg_fp/g_fmt.cc',
+ 'third_party/chromium/base/third_party/dmg_fp/dtoa.cc',
+ 'third_party/chromium/base/third_party/icu/icu_utf.cc',
+ 'third_party/chromium/base/time/clock.cc',
+ 'third_party/chromium/base/time/time.cc',
+ 'third_party/chromium/base/time/time_posix.cc',
+ 'third_party/chromium/base/values.cc',
],
'base_unittests': [
- 'external/base/bind_unittest.cc',
- 'external/base/callback_list_unittest.cc',
- 'external/base/callback_unittest.cc',
- 'external/base/guid_unittest.cc',
- 'external/base/json/json_parser_unittest.cc',
- 'external/base/json/json_reader_unittest.cc',
- 'external/base/json/json_writer_unittest.cc',
- 'external/base/json/string_escape_unittest.cc',
- 'external/base/logging_unittest.cc',
- 'external/base/memory/ref_counted_unittest.cc',
- 'external/base/memory/scoped_ptr_unittest.cc',
- 'external/base/memory/weak_ptr_unittest.cc',
- 'external/base/move_unittest.cc',
- 'external/base/numerics/safe_numerics_unittest.cc',
- 'external/base/observer_list_unittest.cc',
- 'external/base/rand_util_unittest.cc',
- 'external/base/scoped_clear_errno_unittest.cc',
- 'external/base/strings/string_number_conversions_unittest.cc',
- 'external/base/strings/string_piece_unittest.cc',
- 'external/base/strings/string_util_unittest.cc',
- 'external/base/strings/stringprintf_unittest.cc',
- 'external/base/template_util_unittest.cc',
- 'external/base/time/time_unittest.cc',
- 'external/base/tuple_unittest.cc',
- 'external/base/values_unittest.cc',
+ 'third_party/chromium/base/bind_unittest.cc',
+ 'third_party/chromium/base/callback_list_unittest.cc',
+ 'third_party/chromium/base/callback_unittest.cc',
+ 'third_party/chromium/base/guid_unittest.cc',
+ 'third_party/chromium/base/json/json_parser_unittest.cc',
+ 'third_party/chromium/base/json/json_reader_unittest.cc',
+ 'third_party/chromium/base/json/json_writer_unittest.cc',
+ 'third_party/chromium/base/json/string_escape_unittest.cc',
+ 'third_party/chromium/base/logging_unittest.cc',
+ 'third_party/chromium/base/memory/ref_counted_unittest.cc',
+ 'third_party/chromium/base/memory/scoped_ptr_unittest.cc',
+ 'third_party/chromium/base/memory/weak_ptr_unittest.cc',
+ 'third_party/chromium/base/move_unittest.cc',
+ 'third_party/chromium/base/numerics/safe_numerics_unittest.cc',
+ 'third_party/chromium/base/observer_list_unittest.cc',
+ 'third_party/chromium/base/rand_util_unittest.cc',
+ 'third_party/chromium/base/scoped_clear_errno_unittest.cc',
+ 'third_party/chromium/base/strings/string_number_conversions_unittest.cc',
+ 'third_party/chromium/base/strings/string_piece_unittest.cc',
+ 'third_party/chromium/base/strings/string_util_unittest.cc',
+ 'third_party/chromium/base/strings/stringprintf_unittest.cc',
+ 'third_party/chromium/base/template_util_unittest.cc',
+ 'third_party/chromium/base/time/time_unittest.cc',
+ 'third_party/chromium/base/tuple_unittest.cc',
+ 'third_party/chromium/base/values_unittest.cc',
],
},
}
diff --git a/libweave/libweave_common.gypi b/libweave/libweave_common.gypi
index 84c7a17..125047d 100644
--- a/libweave/libweave_common.gypi
+++ b/libweave/libweave_common.gypi
@@ -1,3 +1,6 @@
+# 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.
{
'target_defaults': {
'configurations': {
@@ -21,7 +24,7 @@
'include_dirs': [
'.',
'include',
- 'external',
+ 'third_party/chromium',
'third_party/include',
'third_party/modp_b64/modp_b64',
],
diff --git a/libweave/libweave_standalone.gyp b/libweave/libweave_standalone.gyp
index 6c825ac..6b73f84 100644
--- a/libweave/libweave_standalone.gyp
+++ b/libweave/libweave_standalone.gyp
@@ -1,3 +1,6 @@
+# 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.
{
'includes': [
'libweave.gypi',
@@ -6,9 +9,9 @@
'libraries': [
'-lcrypto',
'-lexpat',
- '-lpthread',
'-lgtest',
'-lgmock',
+ '-lpthread',
],
},
'targets': [
diff --git a/libweave/platform2.gyp b/libweave/platform2.gyp
deleted file mode 100644
index 41b9fd5..0000000
--- a/libweave/platform2.gyp
+++ /dev/null
@@ -1,185 +0,0 @@
-{
- 'includes': [
- 'libweave.gypi',
- ],
- 'target_defaults': {
- 'variables': {
- 'deps': [
- 'expat',
- 'libcrypto',
- ],
- },
- 'include_dirs': [
- '<(platform2_root)/../weave/libweave/libweave',
- '<(platform2_root)/../weave/libweave/libweave/include',
- '<(platform2_root)/../weave/libweave/libweave/third_party/modp_b64/modp_b64/',
- ],
- },
- 'targets': [
- {
- 'target_name': 'libweave_common',
- 'type': 'static_library',
- 'cflags!': ['-fPIE'],
- 'cflags': ['-fPIC'],
- 'variables': {
- 'deps': [
- 'libchrome-<(libbase_ver)',
- ],
- },
- 'sources': [
- '<@(weave_sources)',
- ],
- },
- {
- 'target_name': 'libweave-<(libbase_ver)',
- 'type': 'shared_library',
- 'variables': {
- 'deps': [
- 'libchrome-<(libbase_ver)',
- ],
- },
- 'includes': [
- '../../../platform2/common-mk/deps.gypi',
- ],
- 'dependencies': [
- 'libweave_common',
- ],
- 'sources': [
- 'src/empty.cc'
- ],
- },
- {
- 'target_name': 'libweave-test-<(libbase_ver)',
- 'type': 'static_library',
- 'standalone_static_library': 1,
- 'variables': {
- 'deps': [
- 'libchrome-<(libbase_ver)',
- ],
- },
- 'sources': [
- '<@(weave_test_sources)',
- ],
- 'includes': ['../../../platform2/common-mk/deps.gypi'],
- },
- {
- 'target_name': 'libweave_base_common',
- 'type': 'static_library',
- 'cflags!': ['-fPIE'],
- 'cflags': [
- '-fPIC',
- '-Wno-format-nonliteral',
- '-Wno-char-subscripts',
- '-Wno-deprecated-register',
- ],
- 'include_dirs': [
- '../libweave/external',
- ],
- 'sources': [
- '<@(weave_sources)',
- '<@(base_sources)',
- ],
- },
- {
- 'target_name': 'libweave_base',
- 'type': 'shared_library',
- 'include_dirs': [
- '../libweave/external',
- ],
- 'includes': [
- '../../../platform2/common-mk/deps.gypi',
- ],
- 'dependencies': [
- 'libweave_base_common',
- ],
- 'sources': [
- 'src/empty.cc'
- ],
- },
- {
- 'target_name': 'libweave_base-test',
- 'type': 'static_library',
- 'standalone_static_library': 1,
- 'include_dirs': [
- '../libweave/external',
- ],
- 'sources': [
- '<@(weave_test_sources)',
- ],
- 'includes': ['../../../platform2/common-mk/deps.gypi'],
- },
- ],
- 'conditions': [
- ['USE_test == 1', {
- 'targets': [
- {
- 'target_name': 'libweave_testrunner',
- 'type': 'executable',
- 'variables': {
- 'deps': [
- 'libchrome-<(libbase_ver)',
- ],
- },
- 'dependencies': [
- 'libweave_common',
- 'libweave-test-<(libbase_ver)',
- ],
- 'includes': ['../../../platform2/common-mk/common_test.gypi'],
- 'sources': [
- '<@(weave_unittest_sources)',
- ],
- },
- {
- 'target_name': 'libweave_base_testrunner',
- 'type': 'executable',
- 'cflags': ['-Wno-format-nonliteral'],
- 'include_dirs': [
- '../libweave/external',
- ],
- 'dependencies': [
- 'libweave_base_common',
- 'libweave_base-test',
- ],
- 'includes': ['../../../platform2/common-mk/common_test.gypi'],
- 'sources': [
- '<@(weave_unittest_sources)',
- '<@(base_unittests)',
- ],
- },
- {
- 'target_name': 'libweave_exports_testrunner',
- 'type': 'executable',
- 'variables': {
- 'deps': [
- 'libchrome-<(libbase_ver)',
- ],
- },
- 'dependencies': [
- 'libweave-<(libbase_ver)',
- 'libweave-test-<(libbase_ver)',
- ],
- 'includes': ['../../../platform2/common-mk/common_test.gypi'],
- 'sources': [
- '<@(weave_exports_unittest_sources)',
- ],
- },
- {
- 'target_name': 'libweave_base_exports_testrunner',
- 'type': 'executable',
- 'cflags': ['-Wno-format-nonliteral'],
- 'include_dirs': [
- '../libweave/external',
- ],
- 'dependencies': [
- 'libweave_base',
- 'libweave_base-test',
- ],
- 'includes': ['../../../platform2/common-mk/common_test.gypi'],
- 'sources': [
- '<@(weave_exports_unittest_sources)',
- ],
- },
- ],
- }],
- ],
-}
diff --git a/libweave/platform2_preinstall.sh b/libweave/platform2_preinstall.sh
deleted file mode 100755
index dfd19c9..0000000
--- a/libweave/platform2_preinstall.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# Copyright 2015 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-set -e
-
-OUT=$1
-v=$2
-
-deps=$(<"${OUT}"/gen/libweave-${v}-deps.txt)
-sed \
- -e "s/@BSLOT@/${v}/g" \
- -e "s/@PRIVATE_PC@/${deps}/g" \
- "libweave.pc.in" > "${OUT}/lib/libweave-${v}.pc"
-
-
-deps_test=$(<"${OUT}"/gen/libweave-test-${v}-deps.txt)
-sed \
- -e "s/@BSLOT@/${v}/g" \
- -e "s/@PRIVATE_PC@/${deps_test}/g" \
- "libweave-test.pc.in" > "${OUT}/lib/libweave-test-${v}.pc"
diff --git a/libweave/src/backoff_entry.cc b/libweave/src/backoff_entry.cc
index 4cc1241..6b99d79 100644
--- a/libweave/src/backoff_entry.cc
+++ b/libweave/src/backoff_entry.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/backoff_entry.h b/libweave/src/backoff_entry.h
index 3e7a036..2df0d8a 100644
--- a/libweave/src/backoff_entry.h
+++ b/libweave/src/backoff_entry.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/backoff_entry_unittest.cc b/libweave/src/backoff_entry_unittest.cc
index 598e7c4..9647c74 100644
--- a/libweave/src/backoff_entry_unittest.cc
+++ b/libweave/src/backoff_entry_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/base_api_handler.cc b/libweave/src/base_api_handler.cc
index 69a2838..52b5399 100644
--- a/libweave/src/base_api_handler.cc
+++ b/libweave/src/base_api_handler.cc
@@ -1,15 +1,14 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
#include "src/base_api_handler.h"
#include <base/bind.h>
+#include <weave/device.h>
-#include "src/commands/command_instance.h"
-#include "src/commands/command_manager.h"
+#include "src/commands/schema_constants.h"
#include "src/device_registration_info.h"
-#include "src/states/state_manager.h"
namespace weave {
@@ -20,36 +19,41 @@
const char kBaseStatePairingEnabled[] = "base.localPairingEnabled";
} // namespace
-BaseApiHandler::BaseApiHandler(
- DeviceRegistrationInfo* device_info,
- const std::shared_ptr<StateManager>& state_manager,
- const std::shared_ptr<CommandManager>& command_manager)
- : device_info_{device_info}, state_manager_{state_manager} {
+BaseApiHandler::BaseApiHandler(DeviceRegistrationInfo* device_info,
+ Device* device)
+ : device_info_{device_info}, device_{device} {
device_info_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
&BaseApiHandler::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
const auto& settings = device_info_->GetSettings();
base::DictionaryValue state;
- state.SetStringWithoutPathExpansion(kBaseStateFirmwareVersion,
- settings.firmware_version);
- CHECK(state_manager_->SetProperties(state, nullptr));
+ state.SetString(kBaseStateFirmwareVersion, settings.firmware_version);
+ CHECK(device_->SetStateProperties(state, nullptr));
- command_manager->AddCommandAddedCallback(base::Bind(
- &BaseApiHandler::OnCommandAdded, weak_ptr_factory_.GetWeakPtr()));
+ device->AddCommandDefinitionsFromJson(R"({
+ "base": {
+ "updateBaseConfiguration": {},
+ "updateDeviceInfo": {}
+ }
+ })");
+
+ device_->AddCommandHandler(
+ "base.updateBaseConfiguration",
+ base::Bind(&BaseApiHandler::UpdateBaseConfiguration,
+ weak_ptr_factory_.GetWeakPtr()));
+
+ device_->AddCommandHandler("base.updateDeviceInfo",
+ base::Bind(&BaseApiHandler::UpdateDeviceInfo,
+ weak_ptr_factory_.GetWeakPtr()));
}
-void BaseApiHandler::OnCommandAdded(Command* command) {
- if (command->GetStatus() != CommandStatus::kQueued)
+void BaseApiHandler::UpdateBaseConfiguration(
+ const std::weak_ptr<Command>& cmd) {
+ auto command = cmd.lock();
+ if (!command)
return;
-
- if (command->GetName() == "base.updateBaseConfiguration")
- return UpdateBaseConfiguration(command);
-
- if (command->GetName() == "base.updateDeviceInfo")
- return UpdateDeviceInfo(command);
-}
-
-void BaseApiHandler::UpdateBaseConfiguration(Command* command) {
+ CHECK(command->GetState() == Command::State::kQueued)
+ << EnumToString(command->GetState());
command->SetProgress(base::DictionaryValue{}, nullptr);
const auto& settings = device_info_->GetSettings();
@@ -65,28 +69,37 @@
AuthScope auth_scope{AuthScope::kNone};
if (!StringToEnum(anonymous_access_role, &auth_scope)) {
- return command->Abort();
+ ErrorPtr error;
+ Error::AddToPrintf(&error, FROM_HERE, errors::commands::kDomain,
+ errors::commands::kInvalidPropValue,
+ "Invalid localAnonymousAccessMaxRole value '%s'",
+ anonymous_access_role.c_str());
+ command->Abort(error.get(), nullptr);
+ return;
}
device_info_->UpdateBaseConfig(auth_scope, discovery_enabled,
pairing_enabled);
- command->Done();
+ command->Complete({}, nullptr);
}
void BaseApiHandler::OnConfigChanged(const Settings& settings) {
base::DictionaryValue state;
- state.SetStringWithoutPathExpansion(
- kBaseStateAnonymousAccessRole,
- EnumToString(settings.local_anonymous_access_role));
- state.SetBooleanWithoutPathExpansion(kBaseStateDiscoveryEnabled,
- settings.local_discovery_enabled);
- state.SetBooleanWithoutPathExpansion(kBaseStatePairingEnabled,
- settings.local_pairing_enabled);
- state_manager_->SetProperties(state, nullptr);
+ state.SetString(kBaseStateAnonymousAccessRole,
+ EnumToString(settings.local_anonymous_access_role));
+ state.SetBoolean(kBaseStateDiscoveryEnabled,
+ settings.local_discovery_enabled);
+ state.SetBoolean(kBaseStatePairingEnabled, settings.local_pairing_enabled);
+ device_->SetStateProperties(state, nullptr);
}
-void BaseApiHandler::UpdateDeviceInfo(Command* command) {
+void BaseApiHandler::UpdateDeviceInfo(const std::weak_ptr<Command>& cmd) {
+ auto command = cmd.lock();
+ if (!command)
+ return;
+ CHECK(command->GetState() == Command::State::kQueued)
+ << EnumToString(command->GetState());
command->SetProgress(base::DictionaryValue{}, nullptr);
const auto& settings = device_info_->GetSettings();
@@ -100,7 +113,7 @@
parameters->GetString("location", &location);
device_info_->UpdateDeviceInfo(name, description, location);
- command->Done();
+ command->Complete({}, nullptr);
}
} // namespace weave
diff --git a/libweave/src/base_api_handler.h b/libweave/src/base_api_handler.h
index c1a5f2e..8497692 100644
--- a/libweave/src/base_api_handler.h
+++ b/libweave/src/base_api_handler.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -13,9 +13,8 @@
namespace weave {
class Command;
-class CommandManager;
+class Device;
class DeviceRegistrationInfo;
-class StateManager;
struct Settings;
// Handles commands from 'base' package.
@@ -26,21 +25,18 @@
// base.updateBaseConfiguration
class BaseApiHandler final {
public:
- BaseApiHandler(DeviceRegistrationInfo* device_info,
- const std::shared_ptr<StateManager>& state_manager,
- const std::shared_ptr<CommandManager>& command_manager);
+ BaseApiHandler(DeviceRegistrationInfo* device_info, Device* device);
private:
- void OnCommandAdded(Command* command);
- void UpdateBaseConfiguration(Command* command);
- void UpdateDeviceInfo(Command* command);
+ void UpdateBaseConfiguration(const std::weak_ptr<Command>& command);
+ void UpdateDeviceInfo(const std::weak_ptr<Command>& command);
bool UpdateState(const std::string& anonymous_access_role,
bool discovery_enabled,
bool pairing_enabled);
void OnConfigChanged(const Settings& settings);
DeviceRegistrationInfo* device_info_;
- std::shared_ptr<StateManager> state_manager_;
+ Device* device_;
base::WeakPtrFactory<BaseApiHandler> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(BaseApiHandler);
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index a583dc3..172c8f1 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -9,6 +9,7 @@
#include <gtest/gtest.h>
#include <weave/provider/test/mock_config_store.h>
#include <weave/provider/test/mock_http_client.h>
+#include <weave/test/mock_device.h>
#include "src/commands/command_manager.h"
#include "src/commands/unittest_utils.h"
@@ -18,6 +19,8 @@
#include "src/states/state_manager.h"
using testing::_;
+using testing::AnyOf;
+using testing::Eq;
using testing::Invoke;
using testing::Return;
using testing::StrictMock;
@@ -31,58 +34,45 @@
.WillRepeatedly(Return(true));
command_manager_ = std::make_shared<CommandManager>();
+ command_manager_->Startup();
+
state_manager_ = std::make_shared<StateManager>(&mock_state_change_queue_);
- auto state_definition = test::CreateDictionaryValue(R"({
- 'base': {
- 'firmwareVersion': 'string',
- 'localDiscoveryEnabled': 'boolean',
- 'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
- 'localPairingEnabled': 'boolean',
- 'network': {
- 'properties': {
- 'name': 'string'
- }
- }
- }
- })");
- auto state_defaults = test::CreateDictionaryValue(R"({
- 'base': {
- 'firmwareVersion': '123123',
- 'localDiscoveryEnabled': false,
- 'localAnonymousAccessMaxRole': 'none',
- 'localPairingEnabled': false
- }
- })");
- ASSERT_TRUE(
- state_manager_->LoadStateDefinition(*state_definition, nullptr));
- ASSERT_TRUE(state_manager_->LoadStateDefaults(*state_defaults, nullptr));
+ state_manager_->Startup();
+
+ EXPECT_CALL(device_, SetStateProperties(_, _))
+ .WillRepeatedly(
+ Invoke(state_manager_.get(), &StateManager::SetProperties));
+ EXPECT_CALL(device_, AddCommandDefinitionsFromJson(_))
+ .WillRepeatedly(Invoke([this](const std::string& json) {
+ EXPECT_TRUE(command_manager_->LoadCommands(json, nullptr));
+ }));
+
+ EXPECT_CALL(device_, AddCommandHandler(AnyOf("base.updateBaseConfiguration",
+ "base.updateDeviceInfo"),
+ _))
+ .WillRepeatedly(
+ Invoke(command_manager_.get(), &CommandManager::AddCommandHandler));
+
std::unique_ptr<Config> config{new Config{&config_store_}};
config->Load();
dev_reg_.reset(new DeviceRegistrationInfo(command_manager_, state_manager_,
std::move(config), nullptr,
&http_client_, nullptr));
- handler_.reset(
- new BaseApiHandler{dev_reg_.get(), state_manager_, command_manager_});
- }
-
- void LoadCommands(const std::string& command_definitions) {
- auto json = test::CreateDictionaryValue(command_definitions.c_str());
- EXPECT_TRUE(command_manager_->LoadBaseCommands(*json, nullptr));
- EXPECT_TRUE(command_manager_->LoadCommands(*json, nullptr));
+ handler_.reset(new BaseApiHandler{dev_reg_.get(), &device_});
}
void AddCommand(const std::string& command) {
auto command_instance = CommandInstance::FromJson(
test::CreateDictionaryValue(command.c_str()).get(),
- CommandOrigin::kLocal, command_manager_->GetCommandDictionary(),
+ Command::Origin::kLocal, command_manager_->GetCommandDictionary(),
nullptr, nullptr);
EXPECT_TRUE(!!command_instance);
std::string id{base::IntToString(++command_id_)};
command_instance->SetID(id);
command_manager_->AddCommand(std::move(command_instance));
- EXPECT_EQ(CommandStatus::kDone,
- command_manager_->FindCommand(id)->GetStatus());
+ EXPECT_EQ(Command::State::kDone,
+ command_manager_->FindCommand(id)->GetState());
}
provider::test::MockConfigStore config_store_;
@@ -92,23 +82,11 @@
testing::StrictMock<MockStateChangeQueueInterface> mock_state_change_queue_;
std::shared_ptr<StateManager> state_manager_;
std::unique_ptr<BaseApiHandler> handler_;
+ StrictMock<test::MockDevice> device_;
int command_id_{0};
};
TEST_F(BaseApiHandlerTest, UpdateBaseConfiguration) {
- LoadCommands(R"({
- 'base': {
- 'updateBaseConfiguration': {
- 'parameters': {
- 'localDiscoveryEnabled': 'boolean',
- 'localAnonymousAccessMaxRole': [ 'none', 'viewer', 'user' ],
- 'localPairingEnabled': 'boolean'
- },
- 'results': {}
- }
- }
- })");
-
const Settings& settings = dev_reg_->GetSettings();
AddCommand(R"({
@@ -173,22 +151,6 @@
}
TEST_F(BaseApiHandlerTest, UpdateDeviceInfo) {
- LoadCommands(R"({
- 'base': {
- 'updateDeviceInfo': {
- 'parameters': {
- 'description': 'string',
- 'name': {
- 'type': 'string',
- 'minLength': 1
- },
- 'location': 'string'
- },
- 'results': {}
- }
- }
- })");
-
AddCommand(R"({
'name' : 'base.updateDeviceInfo',
'parameters': {
diff --git a/libweave/src/bind_lambda.h b/libweave/src/bind_lambda.h
index bceacc5..e6f367c 100644
--- a/libweave/src/bind_lambda.h
+++ b/libweave/src/bind_lambda.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/cloud_command_proxy.cc b/libweave/src/commands/cloud_command_proxy.cc
index 9f6ada3..9ec3d3e 100644
--- a/libweave/src/commands/cloud_command_proxy.cc
+++ b/libweave/src/commands/cloud_command_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -12,6 +12,7 @@
#include "src/commands/prop_constraints.h"
#include "src/commands/prop_types.h"
#include "src/commands/schema_constants.h"
+#include "src/utils.h"
namespace weave {
@@ -32,6 +33,15 @@
observer_.Add(command_instance);
}
+void CloudCommandProxy::OnErrorChanged() {
+ std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue};
+ patch->Set(commands::attributes::kCommand_Error,
+ command_instance_->GetError()
+ ? ErrorInfoToJson(*command_instance_->GetError()).release()
+ : base::Value::CreateNullValue().release());
+ QueueCommandUpdate(std::move(patch));
+}
+
void CloudCommandProxy::OnResultsChanged() {
std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue};
patch->Set(commands::attributes::kCommand_Results,
@@ -39,10 +49,10 @@
QueueCommandUpdate(std::move(patch));
}
-void CloudCommandProxy::OnStatusChanged() {
+void CloudCommandProxy::OnStateChanged() {
std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue};
patch->SetString(commands::attributes::kCommand_State,
- EnumToString(command_instance_->GetStatus()));
+ EnumToString(command_instance_->GetState()));
QueueCommandUpdate(std::move(patch));
}
@@ -78,7 +88,12 @@
}
}
// Send out an update request to the server, if needed.
- SendCommandUpdate();
+
+ // Post to accumulate more changes during the current message loop task run.
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&CloudCommandProxy::SendCommandUpdate,
+ backoff_weak_ptr_factory_.GetWeakPtr()),
+ {});
}
void CloudCommandProxy::SendCommandUpdate() {
@@ -124,10 +139,8 @@
command_update_in_progress_ = true;
cloud_command_updater_->UpdateCommand(
command_instance_->GetID(), *update_queue_.front().second,
- base::Bind(&CloudCommandProxy::OnUpdateCommandFinished,
- weak_ptr_factory_.GetWeakPtr(), true),
- base::Bind(&CloudCommandProxy::OnUpdateCommandFinished,
- weak_ptr_factory_.GetWeakPtr(), false));
+ base::Bind(&CloudCommandProxy::OnUpdateCommandDone,
+ weak_ptr_factory_.GetWeakPtr()));
}
void CloudCommandProxy::ResendCommandUpdate() {
@@ -135,10 +148,10 @@
SendCommandUpdate();
}
-void CloudCommandProxy::OnUpdateCommandFinished(bool success) {
+void CloudCommandProxy::OnUpdateCommandDone(ErrorPtr error) {
command_update_in_progress_ = false;
- cloud_backoff_entry_->InformOfRequest(success);
- if (success) {
+ cloud_backoff_entry_->InformOfRequest(!error);
+ if (!error) {
// Remove the succeeded update from the queue.
update_queue_.pop_front();
}
diff --git a/libweave/src/commands/cloud_command_proxy.h b/libweave/src/commands/cloud_command_proxy.h
index c5be02e..ee6358f 100644
--- a/libweave/src/commands/cloud_command_proxy.h
+++ b/libweave/src/commands/cloud_command_proxy.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -17,6 +17,7 @@
#include "src/backoff_entry.h"
#include "src/commands/cloud_command_update_interface.h"
+#include "src/commands/command_instance.h"
#include "src/states/state_change_queue_interface.h"
namespace weave {
@@ -28,7 +29,7 @@
}
// Command proxy which publishes command updates to the cloud.
-class CloudCommandProxy final : public Command::Observer {
+class CloudCommandProxy final : public CommandInstance::Observer {
public:
CloudCommandProxy(CommandInstance* command_instance,
CloudCommandUpdateInterface* cloud_command_updater,
@@ -38,10 +39,11 @@
~CloudCommandProxy() override = default;
// CommandProxyInterface implementation/overloads.
- void OnResultsChanged() override;
- void OnStatusChanged() override;
- void OnProgressChanged() override;
void OnCommandDestroyed() override;
+ void OnErrorChanged() override;
+ void OnProgressChanged() override;
+ void OnResultsChanged() override;
+ void OnStateChanged() override;
private:
using UpdateID = StateChangeQueueInterface::UpdateID;
@@ -61,9 +63,7 @@
void ResendCommandUpdate();
// Callback invoked by the asynchronous PATCH request to the server.
- // Called both in a case of successfully updating server command resource
- // and in case of an error, indicated by the |success| parameter.
- void OnUpdateCommandFinished(bool success);
+ void OnUpdateCommandDone(ErrorPtr error);
// Callback invoked by the device state change queue to notify of the
// successful device state update. |update_id| is the ID of the state that
@@ -93,7 +93,7 @@
// successfully.
UpdateID last_state_update_id_{0};
- ScopedObserver<Command, Command::Observer> observer_{this};
+ ScopedObserver<CommandInstance, CommandInstance::Observer> observer_{this};
base::WeakPtrFactory<CloudCommandProxy> backoff_weak_ptr_factory_{this};
base::WeakPtrFactory<CloudCommandProxy> weak_ptr_factory_{this};
diff --git a/libweave/src/commands/cloud_command_proxy_unittest.cc b/libweave/src/commands/cloud_command_proxy_unittest.cc
index e1d96b0..0c04592 100644
--- a/libweave/src/commands/cloud_command_proxy_unittest.cc
+++ b/libweave/src/commands/cloud_command_proxy_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -16,11 +16,12 @@
#include "src/commands/unittest_utils.h"
#include "src/states/mock_state_change_queue_interface.h"
-using testing::SaveArg;
+using testing::_;
+using testing::DoAll;
using testing::Invoke;
using testing::Return;
using testing::ReturnPointee;
-using testing::_;
+using testing::SaveArg;
namespace weave {
@@ -37,11 +38,10 @@
class MockCloudCommandUpdateInterface : public CloudCommandUpdateInterface {
public:
- MOCK_METHOD4(UpdateCommand,
+ MOCK_METHOD3(UpdateCommand,
void(const std::string&,
const base::DictionaryValue&,
- const base::Closure&,
- const base::Closure&));
+ const DoneCallback&));
};
// Test back-off entry that uses the test clock.
@@ -112,7 +112,7 @@
CHECK(command_json.get());
command_instance_ =
- CommandInstance::FromJson(command_json.get(), CommandOrigin::kCloud,
+ CommandInstance::FromJson(command_json.get(), Command::Origin::kCloud,
command_dictionary_, nullptr, nullptr);
CHECK(command_instance_.get());
@@ -146,20 +146,21 @@
TEST_F(CloudCommandProxyTest, ImmediateUpdate) {
const char expected[] = "{'state':'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
- command_instance_->Done();
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
+ command_instance_->Complete({}, nullptr);
+ task_runner_.RunOnce();
}
TEST_F(CloudCommandProxyTest, DelayedUpdate) {
// Simulate that the current device state has changed.
current_state_update_id_ = 20;
// No command update is expected here.
- command_instance_->Done();
+ command_instance_->Complete({}, nullptr);
// Still no command update here...
callbacks_.Notify(19);
// Now we should get the update...
const char expected[] = "{'state':'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
callbacks_.Notify(20);
}
@@ -168,18 +169,18 @@
// state=inProgress
// progress={...}
// The first state update is sent immediately, the second should be delayed.
- base::Closure on_success;
- EXPECT_CALL(cloud_updater_,
- UpdateCommand(kCmdID, MatchJson("{'state':'inProgress'}"), _, _))
- .WillOnce(SaveArg<2>(&on_success));
+ DoneCallback callback;
+ EXPECT_CALL(
+ cloud_updater_,
+ UpdateCommand(
+ kCmdID,
+ MatchJson("{'state':'inProgress', 'progress':{'status':'ready'}}"),
+ _))
+ .WillOnce(SaveArg<2>(&callback));
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'ready'}"), nullptr));
- // Now simulate the first request completing.
- // The second request should be sent now.
- const char expected[] = "{'progress':{'status':'ready'}}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
- on_success.Run();
+ task_runner_.RunOnce();
}
TEST_F(CloudCommandProxyTest, CombineMultiple) {
@@ -198,45 +199,38 @@
'progress': {'status':'ready'},
'state':'inProgress'
})";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
callbacks_.Notify(20);
}
TEST_F(CloudCommandProxyTest, RetryFailed) {
- base::Closure on_error;
- const char expect1[] = "{'state':'inProgress'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect1), _, _))
- .WillOnce(SaveArg<3>(&on_error));
+ DoneCallback callback;
+
+ const char expect[] =
+ "{'state':'inProgress', 'progress': {'status': 'ready'}}";
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect), _))
+ .Times(3)
+ .WillRepeatedly(SaveArg<2>(&callback));
+ auto started = task_runner_.GetClock()->Now();
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'ready'}"), nullptr));
+ task_runner_.Run();
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "TEST", "TEST", "TEST");
+ callback.Run(error->Clone());
+ task_runner_.Run();
+ EXPECT_GE(task_runner_.GetClock()->Now() - started,
+ base::TimeDelta::FromSecondsD(0.9));
- // Now pretend the first command update request has failed.
- // We should retry with both state and progress fields updated this time,
- // after the initial backoff (which should be 1s in our case).
- base::TimeDelta expected_delay = base::TimeDelta::FromSeconds(1);
- on_error.Run();
+ callback.Run(error->Clone());
+ task_runner_.Run();
+ EXPECT_GE(task_runner_.GetClock()->Now() - started,
+ base::TimeDelta::FromSecondsD(2.9));
- // Execute the delayed request. But pretend that it failed too.
- const char expect2[] = R"({
- 'progress': {'status':'ready'},
- 'state':'inProgress'
- })";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _, _))
- .WillOnce(SaveArg<3>(&on_error));
- task_runner_.RunOnce();
-
- // Now backoff should be 2 seconds.
- expected_delay = base::TimeDelta::FromSeconds(2);
- on_error.Run();
-
- // Retry the task.
- base::Closure on_success;
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _, _))
- .WillOnce(SaveArg<2>(&on_success));
- task_runner_.RunOnce();
-
- // Pretend it succeeds this time.
- on_success.Run();
+ callback.Run(nullptr);
+ task_runner_.Run();
+ EXPECT_GE(task_runner_.GetClock()->Now() - started,
+ base::TimeDelta::FromSecondsD(2.9));
}
TEST_F(CloudCommandProxyTest, GateOnStateUpdates) {
@@ -247,23 +241,23 @@
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'busy'}"), nullptr));
current_state_update_id_ = 22;
- command_instance_->Done();
+ command_instance_->Complete({}, nullptr);
// Device state #20 updated.
- base::Closure on_success;
+ DoneCallback callback;
const char expect1[] = R"({
'progress': {'status':'ready'},
'state':'inProgress'
})";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect1), _, _))
- .WillOnce(SaveArg<2>(&on_success));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect1), _))
+ .WillOnce(SaveArg<2>(&callback));
callbacks_.Notify(20);
- on_success.Run();
+ callback.Run(nullptr);
// Device state #21 updated.
const char expect2[] = "{'progress': {'status':'busy'}}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _, _))
- .WillOnce(SaveArg<2>(&on_success));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _))
+ .WillOnce(SaveArg<2>(&callback));
callbacks_.Notify(21);
// Device state #22 updated. Nothing happens here since the previous command
@@ -273,9 +267,9 @@
// Now the command update is complete, send out the patch that happened after
// the state #22 was updated.
const char expect3[] = "{'state': 'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect3), _, _))
- .WillOnce(SaveArg<2>(&on_success));
- on_success.Run();
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect3), _))
+ .WillOnce(SaveArg<2>(&callback));
+ callback.Run(nullptr);
}
TEST_F(CloudCommandProxyTest, CombineSomeStates) {
@@ -286,25 +280,25 @@
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'busy'}"), nullptr));
current_state_update_id_ = 22;
- command_instance_->Done();
+ command_instance_->Complete({}, nullptr);
// Device state 20-21 updated.
- base::Closure on_success;
+ DoneCallback callback;
const char expect1[] = R"({
'progress': {'status':'busy'},
'state':'inProgress'
})";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect1), _, _))
- .WillOnce(SaveArg<2>(&on_success));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect1), _))
+ .WillOnce(SaveArg<2>(&callback));
callbacks_.Notify(21);
- on_success.Run();
+ callback.Run(nullptr);
// Device state #22 updated.
const char expect2[] = "{'state': 'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _, _))
- .WillOnce(SaveArg<2>(&on_success));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expect2), _))
+ .WillOnce(SaveArg<2>(&callback));
callbacks_.Notify(22);
- on_success.Run();
+ callback.Run(nullptr);
}
TEST_F(CloudCommandProxyTest, CombineAllStates) {
@@ -315,14 +309,14 @@
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'busy'}"), nullptr));
current_state_update_id_ = 22;
- command_instance_->Done();
+ command_instance_->Complete({}, nullptr);
// Device state 30 updated.
const char expected[] = R"({
'progress': {'status':'busy'},
'state':'done'
})";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
callbacks_.Notify(30);
}
@@ -334,16 +328,15 @@
*CreateDictionaryValue("{'status': 'busy'}"), nullptr));
EXPECT_TRUE(command_instance_->SetProgress(
*CreateDictionaryValue("{'status': 'finished'}"), nullptr));
- EXPECT_TRUE(command_instance_->SetResults(
- *CreateDictionaryValue("{'sum': 30}"), nullptr));
- command_instance_->Done();
+ EXPECT_TRUE(command_instance_->Complete(*CreateDictionaryValue("{'sum': 30}"),
+ nullptr));
const char expected[] = R"({
'progress': {'status':'finished'},
'results': {'sum':30},
'state':'done'
})";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
callbacks_.Notify(30);
}
@@ -359,8 +352,9 @@
// As soon as we change the command, the update to the server should be sent.
const char expected[] = "{'state':'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
- command_instance_->Done();
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
+ command_instance_->Complete({}, nullptr);
+ task_runner_.RunOnce();
}
TEST_F(CloudCommandProxyTest, NonEmptyStateChangeQueue) {
@@ -372,11 +366,11 @@
CreateCommandInstance();
// No command updates right now.
- command_instance_->Done();
+ command_instance_->Complete({}, nullptr);
// Only when the state #20 is published we should update the command
const char expected[] = "{'state':'done'}";
- EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _, _));
+ EXPECT_CALL(cloud_updater_, UpdateCommand(kCmdID, MatchJson(expected), _));
callbacks_.Notify(20);
}
diff --git a/libweave/src/commands/cloud_command_update_interface.h b/libweave/src/commands/cloud_command_update_interface.h
index 5bd5c11..9538960 100644
--- a/libweave/src/commands/cloud_command_update_interface.h
+++ b/libweave/src/commands/cloud_command_update_interface.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,8 +18,7 @@
public:
virtual void UpdateCommand(const std::string& command_id,
const base::DictionaryValue& command_patch,
- const base::Closure& on_success,
- const base::Closure& on_error) = 0;
+ const DoneCallback& callback) = 0;
protected:
virtual ~CloudCommandUpdateInterface() = default;
diff --git a/libweave/src/commands/command_definition.cc b/libweave/src/commands/command_definition.cc
index 21e186a..d7ebc83 100644
--- a/libweave/src/commands/command_definition.cc
+++ b/libweave/src/commands/command_definition.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_definition.h b/libweave/src/commands/command_definition.h
index 2c5dd77..3bcc07f 100644
--- a/libweave/src/commands/command_definition.h
+++ b/libweave/src/commands/command_definition.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_definition_unittest.cc b/libweave/src/commands/command_definition_unittest.cc
index dda2385..77b2754 100644
--- a/libweave/src/commands/command_definition_unittest.cc
+++ b/libweave/src/commands/command_definition_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_dictionary.cc b/libweave/src/commands/command_dictionary.cc
index f03e92d..053e7aa 100644
--- a/libweave/src/commands/command_dictionary.cc
+++ b/libweave/src/commands/command_dictionary.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_dictionary.h b/libweave/src/commands/command_dictionary.h
index 389d419..8d3d45c 100644
--- a/libweave/src/commands/command_dictionary.h
+++ b/libweave/src/commands/command_dictionary.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_dictionary_unittest.cc b/libweave/src/commands/command_dictionary_unittest.cc
index 531a561..819718f 100644
--- a/libweave/src/commands/command_dictionary_unittest.cc
+++ b/libweave/src/commands/command_dictionary_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index a8891f7..f152d82 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -16,39 +16,57 @@
#include "src/commands/schema_constants.h"
#include "src/commands/schema_utils.h"
#include "src/json_error_codes.h"
+#include "src/utils.h"
namespace weave {
namespace {
-const EnumToStringMap<CommandStatus>::Map kMapStatus[] = {
- {CommandStatus::kQueued, "queued"},
- {CommandStatus::kInProgress, "inProgress"},
- {CommandStatus::kPaused, "paused"},
- {CommandStatus::kError, "error"},
- {CommandStatus::kDone, "done"},
- {CommandStatus::kCancelled, "cancelled"},
- {CommandStatus::kAborted, "aborted"},
- {CommandStatus::kExpired, "expired"},
+const EnumToStringMap<Command::State>::Map kMapStatus[] = {
+ {Command::State::kQueued, "queued"},
+ {Command::State::kInProgress, "inProgress"},
+ {Command::State::kPaused, "paused"},
+ {Command::State::kError, "error"},
+ {Command::State::kDone, "done"},
+ {Command::State::kCancelled, "cancelled"},
+ {Command::State::kAborted, "aborted"},
+ {Command::State::kExpired, "expired"},
};
-const EnumToStringMap<CommandOrigin>::Map kMapOrigin[] = {
- {CommandOrigin::kLocal, "local"},
- {CommandOrigin::kCloud, "cloud"},
+const EnumToStringMap<Command::Origin>::Map kMapOrigin[] = {
+ {Command::Origin::kLocal, "local"},
+ {Command::Origin::kCloud, "cloud"},
};
+bool ReportDestroyedError(ErrorPtr* error) {
+ Error::AddTo(error, FROM_HERE, errors::commands::kDomain,
+ errors::commands::kCommandDestroyed,
+ "Command has been destroyed");
+ return false;
+}
+
+bool ReportInvalidStateTransition(ErrorPtr* error,
+ Command::State from,
+ Command::State to) {
+ Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
+ errors::commands::kInvalidState,
+ "State switch impossible: '%s' -> '%s'",
+ EnumToString(from).c_str(), EnumToString(to).c_str());
+ return false;
+}
+
} // namespace
template <>
-LIBWEAVE_EXPORT EnumToStringMap<CommandStatus>::EnumToStringMap()
+LIBWEAVE_EXPORT EnumToStringMap<Command::State>::EnumToStringMap()
: EnumToStringMap(kMapStatus) {}
template <>
-LIBWEAVE_EXPORT EnumToStringMap<CommandOrigin>::EnumToStringMap()
+LIBWEAVE_EXPORT EnumToStringMap<Command::Origin>::EnumToStringMap()
: EnumToStringMap(kMapOrigin) {}
CommandInstance::CommandInstance(const std::string& name,
- CommandOrigin origin,
+ Command::Origin origin,
const CommandDefinition* command_definition,
const ValueMap& parameters)
: name_{name},
@@ -70,11 +88,11 @@
return name_;
}
-CommandStatus CommandInstance::GetStatus() const {
- return status_;
+Command::State CommandInstance::GetState() const {
+ return state_;
}
-CommandOrigin CommandInstance::GetOrigin() const {
+Command::Origin CommandInstance::GetOrigin() const {
return origin_;
}
@@ -90,8 +108,14 @@
return TypedValueToJson(results_);
}
+const Error* CommandInstance::GetError() const {
+ return error_.get();
+}
+
bool CommandInstance::SetProgress(const base::DictionaryValue& progress,
ErrorPtr* error) {
+ if (!command_definition_)
+ return ReportDestroyedError(error);
ObjectPropType obj_prop_type;
obj_prop_type.SetObjectSchema(command_definition_->GetProgress()->Clone());
@@ -100,16 +124,21 @@
return false;
// Change status even if progress unchanged, e.g. 0% -> 0%.
- SetStatus(CommandStatus::kInProgress);
+ if (!SetStatus(State::kInProgress, error))
+ return false;
+
if (obj != progress_) {
progress_ = obj;
FOR_EACH_OBSERVER(Observer, observers_, OnProgressChanged());
}
+
return true;
}
-bool CommandInstance::SetResults(const base::DictionaryValue& results,
- ErrorPtr* error) {
+bool CommandInstance::Complete(const base::DictionaryValue& results,
+ ErrorPtr* error) {
+ if (!command_definition_)
+ return ReportDestroyedError(error);
ObjectPropType obj_prop_type;
obj_prop_type.SetObjectSchema(command_definition_->GetResults()->Clone());
@@ -121,7 +150,17 @@
results_ = obj;
FOR_EACH_OBSERVER(Observer, observers_, OnResultsChanged());
}
- return true;
+ // Change status even if result is unchanged.
+ bool result = SetStatus(State::kDone, error);
+ RemoveFromQueue();
+ // The command will be destroyed after that, so do not access any members.
+ return result;
+}
+
+bool CommandInstance::SetError(const Error* command_error, ErrorPtr* error) {
+ error_ = command_error ? command_error->Clone() : nullptr;
+ FOR_EACH_OBSERVER(Observer, observers_, OnErrorChanged());
+ return SetStatus(State::kError, error);
}
namespace {
@@ -168,7 +207,7 @@
std::unique_ptr<CommandInstance> CommandInstance::FromJson(
const base::Value* value,
- CommandOrigin origin,
+ Command::Origin origin,
const CommandDictionary& dictionary,
std::string* command_id,
ErrorPtr* error) {
@@ -235,7 +274,11 @@
TypedValueToJson(progress_).release());
json->Set(commands::attributes::kCommand_Results,
TypedValueToJson(results_).release());
- json->SetString(commands::attributes::kCommand_State, EnumToString(status_));
+ json->SetString(commands::attributes::kCommand_State, EnumToString(state_));
+ if (error_) {
+ json->Set(commands::attributes::kCommand_Error,
+ ErrorInfoToJson(*error_).release());
+ }
return json;
}
@@ -248,29 +291,46 @@
observers_.RemoveObserver(observer);
}
-void CommandInstance::Abort() {
- SetStatus(CommandStatus::kAborted);
- RemoveFromQueue();
- // The command will be destroyed after that, so do not access any members.
+bool CommandInstance::Pause(ErrorPtr* error) {
+ return SetStatus(State::kPaused, error);
}
-void CommandInstance::Cancel() {
- SetStatus(CommandStatus::kCancelled);
+bool CommandInstance::Abort(const Error* command_error, ErrorPtr* error) {
+ error_ = command_error ? command_error->Clone() : nullptr;
+ FOR_EACH_OBSERVER(Observer, observers_, OnErrorChanged());
+ bool result = SetStatus(State::kAborted, error);
RemoveFromQueue();
// The command will be destroyed after that, so do not access any members.
+ return result;
}
-void CommandInstance::Done() {
- SetStatus(CommandStatus::kDone);
+bool CommandInstance::Cancel(ErrorPtr* error) {
+ bool result = SetStatus(State::kCancelled, error);
RemoveFromQueue();
// The command will be destroyed after that, so do not access any members.
+ return result;
}
-void CommandInstance::SetStatus(CommandStatus status) {
- if (status != status_) {
- status_ = status;
- FOR_EACH_OBSERVER(Observer, observers_, OnStatusChanged());
+bool CommandInstance::SetStatus(Command::State status, ErrorPtr* error) {
+ if (status == state_)
+ return true;
+ if (status == State::kQueued)
+ return ReportInvalidStateTransition(error, state_, status);
+ switch (state_) {
+ case State::kDone:
+ case State::kCancelled:
+ case State::kAborted:
+ case State::kExpired:
+ return ReportInvalidStateTransition(error, state_, status);
+ case State::kQueued:
+ case State::kInProgress:
+ case State::kPaused:
+ case State::kError:
+ break;
}
+ state_ = status;
+ FOR_EACH_OBSERVER(Observer, observers_, OnStateChanged());
+ return true;
}
void CommandInstance::RemoveFromQueue() {
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index 8a54b05..5a2ebf7 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -31,33 +31,43 @@
class CommandInstance final : public Command {
public:
+ class Observer {
+ public:
+ virtual void OnCommandDestroyed() = 0;
+ virtual void OnErrorChanged() = 0;
+ virtual void OnProgressChanged() = 0;
+ virtual void OnResultsChanged() = 0;
+ virtual void OnStateChanged() = 0;
+
+ protected:
+ virtual ~Observer() = default;
+ };
+
// Construct a command instance given the full command |name| which must
// be in format "<package_name>.<command_name>", a command |category| and
// a list of parameters and their values specified in |parameters|.
CommandInstance(const std::string& name,
- CommandOrigin origin,
+ Command::Origin origin,
const CommandDefinition* command_definition,
const ValueMap& parameters);
~CommandInstance() override;
// Command overrides.
- std::unique_ptr<base::DictionaryValue> ToJson() const override;
- void AddObserver(Observer* observer) override;
- void RemoveObserver(Observer* observer) override;
const std::string& GetID() const override;
const std::string& GetName() const override;
- CommandStatus GetStatus() const override;
- CommandOrigin GetOrigin() const override;
+ Command::State GetState() const override;
+ Command::Origin GetOrigin() const override;
std::unique_ptr<base::DictionaryValue> GetParameters() const override;
std::unique_ptr<base::DictionaryValue> GetProgress() const override;
std::unique_ptr<base::DictionaryValue> GetResults() const override;
+ const Error* GetError() const override;
bool SetProgress(const base::DictionaryValue& progress,
ErrorPtr* error) override;
- bool SetResults(const base::DictionaryValue& results,
- ErrorPtr* error) override;
- void Abort() override;
- void Cancel() override;
- void Done() override;
+ bool Complete(const base::DictionaryValue& results, ErrorPtr* error) override;
+ bool Pause(ErrorPtr* error) override;
+ bool SetError(const Error* command_error, ErrorPtr* error) override;
+ bool Abort(const Error* command_error, ErrorPtr* error) override;
+ bool Cancel(ErrorPtr* error) override;
// Returns command definition.
const CommandDefinition* GetCommandDefinition() const {
@@ -74,21 +84,32 @@
// This is used to report parse failures back to the server.
static std::unique_ptr<CommandInstance> FromJson(
const base::Value* value,
- CommandOrigin origin,
+ Command::Origin origin,
const CommandDictionary& dictionary,
std::string* command_id,
ErrorPtr* error);
+ std::unique_ptr<base::DictionaryValue> ToJson() const;
+
// Sets the command ID (normally done by CommandQueue when the command
// instance is added to it).
void SetID(const std::string& id) { id_ = id; }
+
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
+
// Sets the pointer to queue this command is part of.
- void SetCommandQueue(CommandQueue* queue) { queue_ = queue; }
+ void AttachToQueue(CommandQueue* queue) { queue_ = queue; }
+ void DetachFromQueue() {
+ observers_.Clear();
+ queue_ = nullptr;
+ command_definition_ = nullptr;
+ }
private:
// Helper function to update the command status.
// Used by Abort(), Cancel(), Done() methods.
- void SetStatus(CommandStatus status);
+ bool SetStatus(Command::State status, ErrorPtr* error);
// Helper method that removes this command from the command queue.
// Note that since the command queue owns the lifetime of the command instance
// object, removing a command from the queue will also destroy it.
@@ -99,17 +120,19 @@
// Full command name as "<package_name>.<command_name>".
std::string name_;
// The origin of the command, either "local" or "cloud".
- CommandOrigin origin_ = CommandOrigin::kLocal;
+ Command::Origin origin_ = Command::Origin::kLocal;
// Command definition.
- const CommandDefinition* command_definition_;
+ const CommandDefinition* command_definition_{nullptr};
// Command parameters and their values.
ValueMap parameters_;
// Current command execution progress.
ValueMap progress_;
// Command results.
ValueMap results_;
- // Current command status.
- CommandStatus status_ = CommandStatus::kQueued;
+ // Current command state.
+ Command::State state_ = Command::State::kQueued;
+ // Error encountered during execution of the command.
+ ErrorPtr error_;
// Command observers.
base::ObserverList<Observer> observers_;
// Pointer to the command queue this command instance is added to.
diff --git a/libweave/src/commands/command_instance_unittest.cc b/libweave/src/commands/command_instance_unittest.cc
index 865ba6e..4e208ed 100644
--- a/libweave/src/commands/command_instance_unittest.cc
+++ b/libweave/src/commands/command_instance_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -76,29 +76,29 @@
params["phrase"] =
str_prop.CreateValue(base::StringValue{"iPityDaFool"}, nullptr);
params["volume"] = int_prop.CreateValue(base::FundamentalValue{5}, nullptr);
- CommandInstance instance{"robot.speak", CommandOrigin::kCloud,
+ CommandInstance instance{"robot.speak", Command::Origin::kCloud,
dict_.FindCommand("robot.speak"), params};
EXPECT_TRUE(
- instance.SetResults(*CreateDictionaryValue("{'foo': 239}"), nullptr));
+ instance.Complete(*CreateDictionaryValue("{'foo': 239}"), nullptr));
EXPECT_EQ("", instance.GetID());
EXPECT_EQ("robot.speak", instance.GetName());
- EXPECT_EQ(CommandOrigin::kCloud, instance.GetOrigin());
+ EXPECT_EQ(Command::Origin::kCloud, instance.GetOrigin());
EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}",
*instance.GetParameters());
EXPECT_JSON_EQ("{'foo': 239}", *instance.GetResults());
CommandInstance instance2{"base.reboot",
- CommandOrigin::kLocal,
+ Command::Origin::kLocal,
dict_.FindCommand("base.reboot"),
{}};
- EXPECT_EQ(CommandOrigin::kLocal, instance2.GetOrigin());
+ EXPECT_EQ(Command::Origin::kLocal, instance2.GetOrigin());
}
TEST_F(CommandInstanceTest, SetID) {
CommandInstance instance{"base.reboot",
- CommandOrigin::kLocal,
+ Command::Origin::kLocal,
dict_.FindCommand("base.reboot"),
{}};
instance.SetID("command_id");
@@ -116,7 +116,7 @@
'results': {}
})");
std::string id;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, &id, nullptr);
EXPECT_EQ("abcd", id);
EXPECT_EQ("abcd", instance->GetID());
@@ -127,7 +127,7 @@
TEST_F(CommandInstanceTest, FromJson_ParamsOmitted) {
auto json = CreateDictionaryValue("{'name': 'base.reboot'}");
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, nullptr);
EXPECT_EQ("base.reboot", instance->GetName());
EXPECT_JSON_EQ("{}", *instance->GetParameters());
@@ -136,7 +136,7 @@
TEST_F(CommandInstanceTest, FromJson_NotObject) {
auto json = CreateValue("'string'");
ErrorPtr error;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, &error);
EXPECT_EQ(nullptr, instance.get());
EXPECT_EQ("json_object_expected", error->GetCode());
@@ -145,7 +145,7 @@
TEST_F(CommandInstanceTest, FromJson_NameMissing) {
auto json = CreateDictionaryValue("{'param': 'value'}");
ErrorPtr error;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, &error);
EXPECT_EQ(nullptr, instance.get());
EXPECT_EQ("parameter_missing", error->GetCode());
@@ -154,7 +154,7 @@
TEST_F(CommandInstanceTest, FromJson_UnknownCommand) {
auto json = CreateDictionaryValue("{'name': 'robot.scream'}");
ErrorPtr error;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, &error);
EXPECT_EQ(nullptr, instance.get());
EXPECT_EQ("invalid_command_name", error->GetCode());
@@ -166,7 +166,7 @@
'parameters': 'hello'
})");
ErrorPtr error;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, &error);
EXPECT_EQ(nullptr, instance.get());
auto inner = error->GetInnerError();
@@ -183,7 +183,7 @@
}
})");
ErrorPtr error;
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, &error);
EXPECT_EQ(nullptr, instance.get());
auto first = error->GetFirstError();
@@ -202,20 +202,20 @@
},
'results': {}
})");
- auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
dict_, nullptr, nullptr);
EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
nullptr));
EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
nullptr));
instance->SetID("testId");
- EXPECT_TRUE(instance->SetResults(*CreateDictionaryValue("{'testResult': 17}"),
- nullptr));
+ EXPECT_TRUE(instance->Complete(*CreateDictionaryValue("{'testResult': 17}"),
+ nullptr));
json->MergeDictionary(CreateDictionaryValue(R"({
'id': 'testId',
'progress': {'progress': 15},
- 'state': 'inProgress',
+ 'state': 'done',
'results': {'testResult': 17}
})").get());
@@ -225,4 +225,31 @@
*json, *converted);
}
+TEST_F(CommandInstanceTest, ToJsonError) {
+ auto json = CreateDictionaryValue(R"({
+ 'name': 'base.reboot',
+ 'parameters': {}
+ })");
+ auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
+ dict_, nullptr, nullptr);
+ instance->SetID("testId");
+
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "DOMAIN", "CODE", "MESSAGE");
+ instance->Abort(error.get(), nullptr);
+
+ json->MergeDictionary(CreateDictionaryValue(R"({
+ 'id': 'testId',
+ 'state': 'aborted',
+ 'progress': {},
+ 'results': {},
+ 'error': {'code': 'CODE', 'message': 'MESSAGE'}
+ })").get());
+
+ auto converted = instance->ToJson();
+ EXPECT_PRED2([](const base::Value& val1,
+ const base::Value& val2) { return val1.Equals(&val2); },
+ *json, *converted);
+}
+
} // namespace weave
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index 60b3d1c..70e804b 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -7,7 +7,6 @@
#include <base/values.h>
#include <weave/enum_to_string.h>
#include <weave/error.h>
-#include <weave/provider/config_store.h>
#include "src/commands/schema_constants.h"
#include "src/utils.h"
@@ -93,15 +92,11 @@
return LoadCommands(*dict, error);
}
-void CommandManager::Startup(provider::ConfigStore* config_store) {
+void CommandManager::Startup() {
LOG(INFO) << "Initializing CommandManager.";
// Load global standard GCD command dictionary.
CHECK(LoadBaseCommands(kBaseCommandDefs, nullptr));
-
- // Loading the rest of commands.
- for (const auto& defs : config_store->LoadCommandDefs())
- CHECK(this->LoadCommands(defs, nullptr));
}
void CommandManager::AddCommand(
@@ -119,8 +114,9 @@
UserRole role,
std::string* id,
ErrorPtr* error) {
- auto command_instance = CommandInstance::FromJson(
- &command, CommandOrigin::kLocal, GetCommandDictionary(), nullptr, error);
+ auto command_instance =
+ CommandInstance::FromJson(&command, Command::Origin::kLocal,
+ GetCommandDictionary(), nullptr, error);
if (!command_instance)
return false;
@@ -176,13 +172,21 @@
}
void CommandManager::AddCommandAddedCallback(
- const Device::CommandCallback& callback) {
+ const CommandQueue::CommandCallback& callback) {
command_queue_.AddCommandAddedCallback(callback);
}
void CommandManager::AddCommandRemovedCallback(
- const Device::CommandCallback& callback) {
+ const CommandQueue::CommandCallback& callback) {
command_queue_.AddCommandRemovedCallback(callback);
}
+void CommandManager::AddCommandHandler(
+ const std::string& command_name,
+ const Device::CommandHandlerCallback& callback) {
+ CHECK(command_name.empty() || dictionary_.FindCommand(command_name))
+ << "Command undefined: " << command_name;
+ command_queue_.AddCommandHandler(command_name, callback);
+}
+
} // namespace weave
diff --git a/libweave/src/commands/command_manager.h b/libweave/src/commands/command_manager.h
index 605f770..e2b212e 100644
--- a/libweave/src/commands/command_manager.h
+++ b/libweave/src/commands/command_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -20,10 +20,6 @@
class CommandInstance;
-namespace provider {
-class ConfigStore;
-}
-
// CommandManager class that will have a list of all the device command
// schemas as well as the live command queue of pending command instances
// dispatched to the device.
@@ -37,8 +33,10 @@
std::string* id,
ErrorPtr* error);
CommandInstance* FindCommand(const std::string& id);
- void AddCommandAddedCallback(const Device::CommandCallback& callback);
- void AddCommandRemovedCallback(const Device::CommandCallback& callback);
+ void AddCommandAddedCallback(const CommandQueue::CommandCallback& callback);
+ void AddCommandRemovedCallback(const CommandQueue::CommandCallback& callback);
+ void AddCommandHandler(const std::string& command_name,
+ const Device::CommandHandlerCallback& callback);
// Sets callback which is called when command definitions is changed.
void AddCommandDefChanged(const base::Closure& callback);
@@ -69,10 +67,8 @@
ErrorPtr* error);
// Startup method to be called by buffet daemon at startup.
- // Initializes the object and loads:
- // 1) the standard GCD command dictionary
- // 2) static vendor-provided command definitions
- void Startup(weave::provider::ConfigStore* config_store);
+ // Initializes standard GCD command dictionary.
+ void Startup();
// Adds a new command to the command queue.
void AddCommand(std::unique_ptr<CommandInstance> command_instance);
diff --git a/libweave/src/commands/command_manager_unittest.cc b/libweave/src/commands/command_manager_unittest.cc
index 3e0d383..aacf30c 100644
--- a/libweave/src/commands/command_manager_unittest.cc
+++ b/libweave/src/commands/command_manager_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -115,11 +115,9 @@
TEST(CommandManager, ShouldLoadStandardAndTestDefinitions) {
CommandManager manager;
- provider::test::MockConfigStore config_store;
- EXPECT_CALL(config_store, LoadCommandDefs())
- .WillOnce(Return(
- std::vector<std::string>{kTestVendorCommands, kTestTestCommands}));
- manager.Startup(&config_store);
+ manager.Startup();
+ ASSERT_TRUE(manager.LoadCommands(kTestVendorCommands, nullptr));
+ ASSERT_TRUE(manager.LoadCommands(kTestTestCommands, nullptr));
EXPECT_EQ(3, manager.GetCommandDictionary().GetSize());
EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
EXPECT_NE(nullptr,
diff --git a/libweave/src/commands/command_queue.cc b/libweave/src/commands/command_queue.cc
index e580048..e08527b 100644
--- a/libweave/src/commands/command_queue.cc
+++ b/libweave/src/commands/command_queue.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -13,28 +13,65 @@
const int kRemoveCommandDelayMin = 5;
}
-void CommandQueue::AddCommandAddedCallback(
- const Device::CommandCallback& callback) {
+void CommandQueue::AddCommandAddedCallback(const CommandCallback& callback) {
on_command_added_.push_back(callback);
// Send all pre-existed commands.
for (const auto& command : map_)
callback.Run(command.second.get());
}
-void CommandQueue::AddCommandRemovedCallback(
- const Device::CommandCallback& callback) {
+void CommandQueue::AddCommandRemovedCallback(const CommandCallback& callback) {
on_command_removed_.push_back(callback);
}
+void CommandQueue::AddCommandHandler(
+ const std::string& command_name,
+ const Device::CommandHandlerCallback& callback) {
+ if (!command_name.empty()) {
+ CHECK(default_command_callback_.is_null())
+ << "Commands specific handler are not allowed after default one";
+
+ for (const auto& command : map_) {
+ if (command.second->GetState() == Command::State::kQueued &&
+ command.second->GetName() == command_name) {
+ callback.Run(command.second);
+ }
+ }
+
+ CHECK(command_callbacks_.emplace(command_name, callback).second)
+ << command_name << " already has handler";
+
+ } else {
+ for (const auto& command : map_) {
+ if (command.second->GetState() == Command::State::kQueued &&
+ command_callbacks_.find(command.second->GetName()) ==
+ command_callbacks_.end()) {
+ callback.Run(command.second);
+ }
+ }
+
+ CHECK(default_command_callback_.is_null()) << "Already has default handler";
+ default_command_callback_ = callback;
+ }
+}
+
void CommandQueue::Add(std::unique_ptr<CommandInstance> instance) {
std::string id = instance->GetID();
LOG_IF(FATAL, id.empty()) << "Command has no ID";
- instance->SetCommandQueue(this);
+ instance->AttachToQueue(this);
auto pair = map_.insert(std::make_pair(id, std::move(instance)));
LOG_IF(FATAL, !pair.second) << "Command with ID '" << id
<< "' is already in the queue";
for (const auto& cb : on_command_added_)
cb.Run(pair.first->second.get());
+
+ auto it_handler = command_callbacks_.find(pair.first->second->GetName());
+
+ if (it_handler != command_callbacks_.end())
+ it_handler->second.Run(pair.first->second);
+ else if (!default_command_callback_.is_null())
+ default_command_callback_.Run(pair.first->second);
+
Cleanup();
}
@@ -52,8 +89,8 @@
auto p = map_.find(id);
if (p == map_.end())
return false;
- std::unique_ptr<CommandInstance> instance{std::move(p->second)};
- instance->SetCommandQueue(nullptr);
+ std::shared_ptr<CommandInstance> instance = p->second;
+ instance->DetachFromQueue();
map_.erase(p);
for (const auto& cb : on_command_removed_)
cb.Run(instance.get());
diff --git a/libweave/src/commands/command_queue.h b/libweave/src/commands/command_queue.h
index c3e86d5..74ed86f 100644
--- a/libweave/src/commands/command_queue.h
+++ b/libweave/src/commands/command_queue.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -25,11 +25,17 @@
public:
CommandQueue() = default;
+ // TODO: Remove AddCommandAddedCallback and AddCommandRemovedCallback.
+ using CommandCallback = base::Callback<void(Command* command)>;
+
// Adds notifications callback for a new command is added to the queue.
- void AddCommandAddedCallback(const Device::CommandCallback& callback);
+ void AddCommandAddedCallback(const CommandCallback& callback);
// Adds notifications callback for a command is removed from the queue.
- void AddCommandRemovedCallback(const Device::CommandCallback& callback);
+ void AddCommandRemovedCallback(const CommandCallback& callback);
+
+ void AddCommandHandler(const std::string& command_name,
+ const Device::CommandHandlerCallback& callback);
// Checks if the command queue is empty.
bool IsEmpty() const { return map_.empty(); }
@@ -70,14 +76,16 @@
base::Time test_now_;
// ID-to-CommandInstance map.
- std::map<std::string, std::unique_ptr<CommandInstance>> map_;
+ std::map<std::string, std::shared_ptr<CommandInstance>> map_;
// Queue of commands to be removed.
std::queue<std::pair<base::Time, std::string>> remove_queue_;
- using CallbackList = std::vector<Device::CommandCallback>;
+ using CallbackList = std::vector<CommandCallback>;
CallbackList on_command_added_;
CallbackList on_command_removed_;
+ std::map<std::string, Device::CommandHandlerCallback> command_callbacks_;
+ Device::CommandHandlerCallback default_command_callback_;
DISALLOW_COPY_AND_ASSIGN(CommandQueue);
};
diff --git a/libweave/src/commands/command_queue_unittest.cc b/libweave/src/commands/command_queue_unittest.cc
index d119f74..5060071 100644
--- a/libweave/src/commands/command_queue_unittest.cc
+++ b/libweave/src/commands/command_queue_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -24,7 +24,7 @@
const std::string& name,
const std::string& id) {
std::unique_ptr<CommandInstance> cmd{new CommandInstance{
- name, CommandOrigin::kLocal, &command_definition_, {}}};
+ name, Command::Origin::kLocal, &command_definition_, {}}};
cmd->SetID(id);
return cmd;
}
diff --git a/libweave/src/commands/object_schema.cc b/libweave/src/commands/object_schema.cc
index c43bd14..b70beff 100644
--- a/libweave/src/commands/object_schema.cc
+++ b/libweave/src/commands/object_schema.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/object_schema.h b/libweave/src/commands/object_schema.h
index c65d21e..504e1dd 100644
--- a/libweave/src/commands/object_schema.h
+++ b/libweave/src/commands/object_schema.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/object_schema_unittest.cc b/libweave/src/commands/object_schema_unittest.cc
index 4108aa8..6417952 100644
--- a/libweave/src/commands/object_schema_unittest.cc
+++ b/libweave/src/commands/object_schema_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_constraints.cc b/libweave/src/commands/prop_constraints.cc
index bb52ba1..b7e9cf6 100644
--- a/libweave/src/commands/prop_constraints.cc
+++ b/libweave/src/commands/prop_constraints.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_constraints.h b/libweave/src/commands/prop_constraints.h
index b2bdebe..53a4d93 100644
--- a/libweave/src/commands/prop_constraints.h
+++ b/libweave/src/commands/prop_constraints.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_types.cc b/libweave/src/commands/prop_types.cc
index c06170a..88a53bd 100644
--- a/libweave/src/commands/prop_types.cc
+++ b/libweave/src/commands/prop_types.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_types.h b/libweave/src/commands/prop_types.h
index 4b0b721..f784eb6 100644
--- a/libweave/src/commands/prop_types.h
+++ b/libweave/src/commands/prop_types.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_values.cc b/libweave/src/commands/prop_values.cc
index 2e78ce5..6f30bee 100644
--- a/libweave/src/commands/prop_values.cc
+++ b/libweave/src/commands/prop_values.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/prop_values.h b/libweave/src/commands/prop_values.h
index 9f7ed72..f0a401e 100644
--- a/libweave/src/commands/prop_values.h
+++ b/libweave/src/commands/prop_values.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/schema_constants.cc b/libweave/src/commands/schema_constants.cc
index 9affe73..c99536b 100644
--- a/libweave/src/commands/schema_constants.cc
+++ b/libweave/src/commands/schema_constants.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -25,6 +25,8 @@
const char kCommandFailed[] = "command_failed";
const char kInvalidCommandVisibility[] = "invalid_command_visibility";
const char kInvalidMinimalRole[] = "invalid_minimal_role";
+const char kCommandDestroyed[] = "command_destroyed";
+const char kInvalidState[] = "invalid_state";
} // namespace commands
} // namespace errors
@@ -56,6 +58,7 @@
const char kCommand_Progress[] = "progress";
const char kCommand_Results[] = "results";
const char kCommand_State[] = "state";
+const char kCommand_Error[] = "error";
const char kCommand_Role[] = "minimalRole";
const char kCommand_Role_Manager[] = "manager";
@@ -63,9 +66,6 @@
const char kCommand_Role_User[] = "user";
const char kCommand_Role_Viewer[] = "viewer";
-const char kCommand_ErrorCode[] = "error.code";
-const char kCommand_ErrorMessage[] = "error.message";
-
const char kCommand_Visibility[] = "visibility";
const char kCommand_Visibility_None[] = "none";
const char kCommand_Visibility_Local[] = "local";
diff --git a/libweave/src/commands/schema_constants.h b/libweave/src/commands/schema_constants.h
index 2d4ae07..742245f 100644
--- a/libweave/src/commands/schema_constants.h
+++ b/libweave/src/commands/schema_constants.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -28,6 +28,8 @@
extern const char kCommandFailed[];
extern const char kInvalidCommandVisibility[];
extern const char kInvalidMinimalRole[];
+extern const char kCommandDestroyed[];
+extern const char kInvalidState[];
} // namespace commands
} // namespace errors
@@ -59,6 +61,7 @@
extern const char kCommand_Progress[];
extern const char kCommand_Results[];
extern const char kCommand_State[];
+extern const char kCommand_Error[];
extern const char kCommand_Role[];
extern const char kCommand_Role_Manager[];
@@ -66,9 +69,6 @@
extern const char kCommand_Role_User[];
extern const char kCommand_Role_Viewer[];
-extern const char kCommand_ErrorCode[];
-extern const char kCommand_ErrorMessage[];
-
extern const char kCommand_Visibility[];
extern const char kCommand_Visibility_None[];
extern const char kCommand_Visibility_Local[];
diff --git a/libweave/src/commands/schema_utils.cc b/libweave/src/commands/schema_utils.cc
index 1191264..3c3e949 100644
--- a/libweave/src/commands/schema_utils.cc
+++ b/libweave/src/commands/schema_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/schema_utils.h b/libweave/src/commands/schema_utils.h
index 570fb42..826bab8 100644
--- a/libweave/src/commands/schema_utils.h
+++ b/libweave/src/commands/schema_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/schema_utils_unittest.cc b/libweave/src/commands/schema_utils_unittest.cc
index 09122f3..1ea4c90 100644
--- a/libweave/src/commands/schema_utils_unittest.cc
+++ b/libweave/src/commands/schema_utils_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/commands/unittest_utils.h b/libweave/src/commands/unittest_utils.h
index b1cde46..25392ee 100644
--- a/libweave/src/commands/unittest_utils.h
+++ b/libweave/src/commands/unittest_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/config.cc b/libweave/src/config.cc
index 4f59497..9a18bb0 100644
--- a/libweave/src/config.cc
+++ b/libweave/src/config.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -22,6 +22,8 @@
namespace config_keys {
+const char kVersion[] = "version";
+
const char kClientId[] = "client_id";
const char kClientSecret[] = "client_secret";
const char kApiKey[] = "api_key";
@@ -44,6 +46,17 @@
namespace {
+const int kCurrentConfigVersion = 1;
+
+void MigrateFromV0(base::DictionaryValue* dict) {
+ std::string cloud_id;
+ if (dict->GetString(config_keys::kCloudId, &cloud_id) && !cloud_id.empty())
+ return;
+ scoped_ptr<base::Value> tmp;
+ if (dict->Remove(config_keys::kDeviceId, &tmp))
+ dict->Set(config_keys::kCloudId, std::move(tmp));
+}
+
Config::Settings CreateDefaultSettings() {
Config::Settings result;
result.oauth_url = "https://accounts.google.com/o/oauth2/";
@@ -115,12 +128,25 @@
return;
auto value = base::JSONReader::Read(json_string);
- const base::DictionaryValue* dict = nullptr;
+ base::DictionaryValue* dict = nullptr;
if (!value || !value->GetAsDictionary(&dict)) {
LOG(ERROR) << "Failed to parse settings.";
return;
}
+ int loaded_version = 0;
+ dict->GetInteger(config_keys::kVersion, &loaded_version);
+
+ if (loaded_version != kCurrentConfigVersion) {
+ LOG(INFO) << "State version mismatch. expected: " << kCurrentConfigVersion
+ << ", loaded: " << loaded_version;
+ save_ = true;
+ }
+
+ if (loaded_version == 0) {
+ MigrateFromV0(dict);
+ }
+
std::string tmp;
bool tmp_bool{false};
@@ -184,6 +210,8 @@
return;
base::DictionaryValue dict;
+ dict.SetInteger(config_keys::kVersion, kCurrentConfigVersion);
+
dict.SetString(config_keys::kClientId, settings_.client_id);
dict.SetString(config_keys::kClientSecret, settings_.client_secret);
dict.SetString(config_keys::kApiKey, settings_.api_key);
diff --git a/libweave/src/config.h b/libweave/src/config.h
index bec99ea..f4c3465 100644
--- a/libweave/src/config.h
+++ b/libweave/src/config.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/config_unittest.cc b/libweave/src/config_unittest.cc
index f65f203..fbfd25f 100644
--- a/libweave/src/config_unittest.cc
+++ b/libweave/src/config_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -79,8 +79,35 @@
EXPECT_EQ("", GetSettings().secret);
}
+TEST_F(ConfigTest, LoadStateV0) {
+ EXPECT_CALL(config_store_, LoadSettings())
+ .WillOnce(Return(R"({
+ "device_id": "state_device_id"
+ })"));
+
+ EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
+ config_.Load();
+
+ EXPECT_EQ("state_device_id", GetSettings().cloud_id);
+ EXPECT_FALSE(GetSettings().device_id.empty());
+ EXPECT_NE(GetSettings().cloud_id, GetSettings().device_id);
+
+ EXPECT_CALL(config_store_, LoadSettings())
+ .WillOnce(Return(R"({
+ "device_id": "state_device_id",
+ "cloud_id": "state_cloud_id"
+ })"));
+
+ EXPECT_CALL(*this, OnConfigChanged(_)).Times(1);
+ config_.Load();
+
+ EXPECT_EQ("state_cloud_id", GetSettings().cloud_id);
+ EXPECT_EQ("state_device_id", GetSettings().device_id);
+}
+
TEST_F(ConfigTest, LoadState) {
auto state = R"({
+ "version": 1,
"api_key": "state_api_key",
"client_id": "state_client_id",
"client_secret": "state_client_secret",
@@ -205,6 +232,7 @@
EXPECT_CALL(config_store_, SaveSettings(_))
.WillOnce(Invoke([](const std::string& json) {
auto expected = R"({
+ 'version': 1,
'api_key': 'set_api_key',
'client_id': 'set_client_id',
'client_secret': 'set_client_secret',
diff --git a/libweave/src/data_encoding.cc b/libweave/src/data_encoding.cc
index d863b16..b8214aa 100644
--- a/libweave/src/data_encoding.cc
+++ b/libweave/src/data_encoding.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/data_encoding.h b/libweave/src/data_encoding.h
index f952fa1..c074778 100644
--- a/libweave/src/data_encoding.h
+++ b/libweave/src/data_encoding.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/data_encoding_unittest.cc b/libweave/src/data_encoding_unittest.cc
index ac981c3..7e3bfe4 100644
--- a/libweave/src/data_encoding_unittest.cc
+++ b/libweave/src/data_encoding_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// Copyright (c) 2011 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.
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index aedd425..a0c6199 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -34,10 +34,10 @@
provider::Wifi* wifi,
provider::Bluetooth* bluetooth) {
command_manager_ = std::make_shared<CommandManager>();
- command_manager_->Startup(config_store);
+ command_manager_->Startup();
state_change_queue_.reset(new StateChangeQueue(kMaxStateChangeQueueSize));
state_manager_ = std::make_shared<StateManager>(state_change_queue_.get());
- state_manager_->Startup(config_store);
+ state_manager_->Startup();
std::unique_ptr<Config> config{new Config{config_store}};
config->Load();
@@ -45,8 +45,7 @@
device_info_.reset(new DeviceRegistrationInfo(
command_manager_, state_manager_, std::move(config), task_runner,
http_client, network));
- base_api_handler_.reset(
- new BaseApiHandler{device_info_.get(), state_manager_, command_manager_});
+ base_api_handler_.reset(new BaseApiHandler{device_info_.get(), this});
device_info_->Start();
@@ -78,10 +77,9 @@
provider::HttpServer* http_server,
provider::Wifi* wifi,
provider::Bluetooth* bluetooth) {
- privet_.reset(new privet::Manager{});
- privet_->Start(task_runner, network, dns_sd, http_server, wifi,
- device_info_.get(), command_manager_.get(),
- state_manager_.get());
+ privet_.reset(new privet::Manager{task_runner});
+ privet_->Start(network, dns_sd, http_server, wifi, device_info_.get(),
+ command_manager_.get(), state_manager_.get());
}
GcdState DeviceManager::GetGcdState() const {
@@ -93,8 +91,12 @@
device_info_->AddGcdStateChangedCallback(callback);
}
-void DeviceManager::AddStateChangedCallback(const base::Closure& callback) {
- state_manager_->AddChangedCallback(callback);
+void DeviceManager::AddCommandDefinitionsFromJson(const std::string& json) {
+ CHECK(command_manager_->LoadCommands(json, nullptr));
+}
+
+void DeviceManager::AddCommandDefinitions(const base::DictionaryValue& dict) {
+ CHECK(command_manager_->LoadCommands(dict, nullptr));
}
bool DeviceManager::AddCommand(const base::DictionaryValue& command,
@@ -107,18 +109,31 @@
return command_manager_->FindCommand(id);
}
-void DeviceManager::AddCommandAddedCallback(const CommandCallback& callback) {
- return command_manager_->AddCommandAddedCallback(callback);
+void DeviceManager::AddCommandHandler(const std::string& command_name,
+ const CommandHandlerCallback& callback) {
+ return command_manager_->AddCommandHandler(command_name, callback);
}
-void DeviceManager::AddCommandRemovedCallback(const CommandCallback& callback) {
- return command_manager_->AddCommandRemovedCallback(callback);
+void DeviceManager::AddStateChangedCallback(const base::Closure& callback) {
+ state_manager_->AddChangedCallback(callback);
}
-bool DeviceManager::SetStateProperties(
- const base::DictionaryValue& property_set,
- ErrorPtr* error) {
- return state_manager_->SetProperties(property_set, error);
+void DeviceManager::AddStateDefinitionsFromJson(const std::string& json) {
+ CHECK(state_manager_->LoadStateDefinitionFromJson(json, nullptr));
+}
+
+void DeviceManager::AddStateDefinitions(const base::DictionaryValue& dict) {
+ CHECK(state_manager_->LoadStateDefinition(dict, nullptr));
+}
+
+bool DeviceManager::SetStatePropertiesFromJson(const std::string& json,
+ ErrorPtr* error) {
+ return state_manager_->SetPropertiesFromJson(json, error);
+}
+
+bool DeviceManager::SetStateProperties(const base::DictionaryValue& dict,
+ ErrorPtr* error) {
+ return state_manager_->SetProperties(dict, error);
}
std::unique_ptr<base::Value> DeviceManager::GetStateProperty(
@@ -136,9 +151,9 @@
return state_manager_->GetState();
}
-std::string DeviceManager::Register(const std::string& ticket_id,
- ErrorPtr* error) {
- return device_info_->RegisterDevice(ticket_id, error);
+void DeviceManager::Register(const std::string& ticket_id,
+ const DoneCallback& callback) {
+ device_info_->RegisterDevice(ticket_id, callback);
}
void DeviceManager::AddPairingChangedCallbacks(
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index d28d0b0..ccf8778 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -37,14 +37,20 @@
const Settings& GetSettings() const override;
void AddSettingsChangedCallback(
const SettingsChangedCallback& callback) override;
+ void AddCommandDefinitionsFromJson(const std::string& json) override;
+ void AddCommandDefinitions(const base::DictionaryValue& dict) override;
bool AddCommand(const base::DictionaryValue& command,
std::string* id,
ErrorPtr* error) override;
Command* FindCommand(const std::string& id) override;
- void AddCommandAddedCallback(const CommandCallback& callback) override;
- void AddCommandRemovedCallback(const CommandCallback& callback) override;
+ void AddCommandHandler(const std::string& command_name,
+ const CommandHandlerCallback& callback) override;
void AddStateChangedCallback(const base::Closure& callback) override;
- bool SetStateProperties(const base::DictionaryValue& property_set,
+ void AddStateDefinitionsFromJson(const std::string& json) override;
+ void AddStateDefinitions(const base::DictionaryValue& dict) override;
+ bool SetStatePropertiesFromJson(const std::string& json,
+ ErrorPtr* error) override;
+ bool SetStateProperties(const base::DictionaryValue& dict,
ErrorPtr* error) override;
std::unique_ptr<base::Value> GetStateProperty(
const std::string& name) const override;
@@ -52,7 +58,8 @@
const base::Value& value,
ErrorPtr* error) override;
std::unique_ptr<base::DictionaryValue> GetState() const override;
- std::string Register(const std::string& ticket_id, ErrorPtr* error) override;
+ void Register(const std::string& ticket_id,
+ const DoneCallback& callback) override;
GcdState GetGcdState() const override;
void AddGcdStateChangedCallback(
const GcdStateChangedCallback& callback) override;
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index e9e267a..48361b9 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -98,36 +98,49 @@
return AppendQueryParams(result, params);
}
-void IgnoreCloudError(const Error*) {}
-
-void IgnoreCloudErrorWithCallback(const base::Closure& cb, const Error*) {
+void IgnoreCloudErrorWithCallback(const base::Closure& cb, ErrorPtr) {
cb.Run();
}
-void IgnoreCloudResult(const base::DictionaryValue&) {}
+void IgnoreCloudError(ErrorPtr) {}
-void IgnoreCloudResultWithCallback(const base::Closure& cb,
- const base::DictionaryValue&) {
- cb.Run();
+void IgnoreCloudResult(const base::DictionaryValue&, ErrorPtr error) {}
+
+void IgnoreCloudResultWithCallback(const DoneCallback& cb,
+ const base::DictionaryValue&,
+ ErrorPtr error) {
+ cb.Run(std::move(error));
}
class RequestSender final {
public:
- RequestSender(const std::string& method,
+ RequestSender(HttpClient::Method method,
const std::string& url,
HttpClient* transport)
: method_{method}, url_{url}, transport_{transport} {}
- std::unique_ptr<provider::HttpClient::Response> SendAndBlock(
- ErrorPtr* error) {
- return transport_->SendRequestAndBlock(method_, url_, GetFullHeaders(),
- data_, error);
- }
-
- int Send(const HttpClient::SuccessCallback& success_callback,
- const HttpClient::ErrorCallback& error_callback) {
- return transport_->SendRequest(method_, url_, GetFullHeaders(), data_,
- success_callback, error_callback);
+ void Send(const HttpClient::SendRequestCallback& callback) {
+ static int debug_id = 0;
+ ++debug_id;
+ VLOG(1) << "Sending request. id:" << debug_id
+ << " method:" << EnumToString(method_) << " url:" << url_;
+ VLOG(2) << "Request data: " << data_;
+ auto on_done = [](
+ int debug_id, const HttpClient::SendRequestCallback& callback,
+ std::unique_ptr<HttpClient::Response> response, ErrorPtr error) {
+ if (error) {
+ VLOG(1) << "Request failed, id=" << debug_id
+ << ", reason: " << error->GetCode()
+ << ", message: " << error->GetMessage();
+ return callback.Run({}, std::move(error));
+ }
+ VLOG(1) << "Request succeeded. id:" << debug_id
+ << " status:" << response->GetStatusCode();
+ VLOG(2) << "Response data: " << response->GetData();
+ callback.Run(std::move(response), nullptr);
+ };
+ transport_->SendRequest(method_, url_, GetFullHeaders(), data_,
+ base::Bind(on_done, debug_id, callback));
}
void SetAccessToken(const std::string& access_token) {
@@ -160,7 +173,7 @@
return headers;
}
- std::string method_;
+ HttpClient::Method method_;
std::string url_;
std::string data_;
std::string mime_type_;
@@ -289,7 +302,8 @@
return; // Assume we're in test
task_runner_->PostDelayedTask(
FROM_HERE,
- base::Bind(&DeviceRegistrationInfo::ConnectToCloud, AsWeakPtr()), delay);
+ base::Bind(&DeviceRegistrationInfo::ConnectToCloud, AsWeakPtr(), nullptr),
+ delay);
}
bool DeviceRegistrationInfo::HaveRegistrationCredentials() const {
@@ -335,16 +349,12 @@
return resp;
}
-void DeviceRegistrationInfo::RefreshAccessToken(
- const base::Closure& success_callback,
- const ErrorCallback& error_callback) {
+void DeviceRegistrationInfo::RefreshAccessToken(const DoneCallback& callback) {
LOG(INFO) << "Refreshing access token.";
ErrorPtr error;
- if (!VerifyRegistrationCredentials(&error)) {
- error_callback.Run(error.get());
- return;
- }
+ if (!VerifyRegistrationCredentials(&error))
+ return callback.Run(std::move(error));
if (oauth2_backoff_entry_->ShouldRejectRequest()) {
VLOG(1) << "RefreshToken request delayed for "
@@ -352,50 +362,38 @@
<< " due to backoff policy";
task_runner_->PostDelayedTask(
FROM_HERE, base::Bind(&DeviceRegistrationInfo::RefreshAccessToken,
- AsWeakPtr(), success_callback, error_callback),
+ AsWeakPtr(), callback),
oauth2_backoff_entry_->GetTimeUntilRelease());
return;
}
- // Make a shared pointer to |success_callback| and |error_callback| since we
- // are going to share these callbacks with both success and error callbacks
- // for PostFormData() and if the callbacks have any move-only types,
- // one of the copies will be bad.
- auto shared_success_callback =
- std::make_shared<base::Closure>(success_callback);
- auto shared_error_callback = std::make_shared<ErrorCallback>(error_callback);
-
- RequestSender sender{http::kPost, GetOAuthURL("token"), http_client_};
+ RequestSender sender{HttpClient::Method::kPost, GetOAuthURL("token"),
+ http_client_};
sender.SetFormData({
{"refresh_token", GetSettings().refresh_token},
{"client_id", GetSettings().client_id},
{"client_secret", GetSettings().client_secret},
{"grant_type", "refresh_token"},
});
- int request_id = sender.Send(
- base::Bind(&DeviceRegistrationInfo::OnRefreshAccessTokenSuccess,
- weak_factory_.GetWeakPtr(), shared_success_callback,
- shared_error_callback),
- base::Bind(&DeviceRegistrationInfo::OnRefreshAccessTokenError,
- weak_factory_.GetWeakPtr(), shared_success_callback,
- shared_error_callback));
- VLOG(1) << "Refresh access token request dispatched. Request ID = "
- << request_id;
+ sender.Send(base::Bind(&DeviceRegistrationInfo::OnRefreshAccessTokenDone,
+ weak_factory_.GetWeakPtr(), callback));
+ VLOG(1) << "Refresh access token request dispatched";
}
-void DeviceRegistrationInfo::OnRefreshAccessTokenSuccess(
- const std::shared_ptr<base::Closure>& success_callback,
- const std::shared_ptr<ErrorCallback>& error_callback,
- int id,
- const HttpClient::Response& response) {
- VLOG(1) << "Refresh access token request with ID " << id << " completed";
- oauth2_backoff_entry_->InformOfRequest(true);
- ErrorPtr error;
- auto json = ParseOAuthResponse(response, &error);
- if (!json) {
- error_callback->Run(error.get());
- return;
+void DeviceRegistrationInfo::OnRefreshAccessTokenDone(
+ const DoneCallback& callback,
+ std::unique_ptr<HttpClient::Response> response,
+ ErrorPtr error) {
+ if (error) {
+ VLOG(1) << "Refresh access token failed";
+ oauth2_backoff_entry_->InformOfRequest(false);
+ return RefreshAccessToken(callback);
}
+ VLOG(1) << "Refresh access token request completed";
+ oauth2_backoff_entry_->InformOfRequest(true);
+ auto json = ParseOAuthResponse(*response, &error);
+ if (!json)
+ return callback.Run(std::move(error));
int expires_in = 0;
if (!json->GetString("access_token", &access_token_) ||
@@ -404,8 +402,7 @@
LOG(ERROR) << "Access token unavailable.";
Error::AddTo(&error, FROM_HERE, kErrorDomainOAuth2,
"unexpected_server_response", "Access token unavailable");
- error_callback->Run(error.get());
- return;
+ return callback.Run(std::move(error));
}
access_token_expiration_ =
base::Time::Now() + base::TimeDelta::FromSeconds(expires_in);
@@ -418,17 +415,7 @@
// Now that we have a new access token, retry the connection.
StartNotificationChannel();
}
- success_callback->Run();
-}
-
-void DeviceRegistrationInfo::OnRefreshAccessTokenError(
- const std::shared_ptr<base::Closure>& success_callback,
- const std::shared_ptr<ErrorCallback>& error_callback,
- int id,
- const Error* error) {
- VLOG(1) << "Refresh access token request with ID " << id << " failed";
- oauth2_backoff_entry_->InformOfRequest(false);
- RefreshAccessToken(*success_callback, *error_callback);
+ callback.Run(nullptr);
}
void DeviceRegistrationInfo::StartNotificationChannel() {
@@ -438,8 +425,8 @@
LOG(INFO) << "Starting notification channel";
// If no TaskRunner assume we're in test.
- if (!task_runner_) {
- LOG(INFO) << "No TaskRunner, not starting notification channel";
+ if (!network_) {
+ LOG(INFO) << "No Network, not starting notification channel";
return;
}
@@ -513,24 +500,27 @@
}
void DeviceRegistrationInfo::GetDeviceInfo(
- const CloudRequestCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const CloudRequestDoneCallback& callback) {
ErrorPtr error;
if (!VerifyRegistrationCredentials(&error)) {
- if (!error_callback.is_null())
- error_callback.Run(error.get());
- return;
+ return callback.Run({}, std::move(error));
}
- DoCloudRequest(http::kGet, GetDeviceURL(), nullptr, success_callback,
- error_callback);
+ DoCloudRequest(HttpClient::Method::kGet, GetDeviceURL(), nullptr, callback);
}
-std::string DeviceRegistrationInfo::RegisterDevice(const std::string& ticket_id,
- ErrorPtr* error) {
+void DeviceRegistrationInfo::RegisterDeviceError(const DoneCallback& callback,
+ ErrorPtr error) {
+ task_runner_->PostDelayedTask(FROM_HERE,
+ base::Bind(callback, base::Passed(&error)), {});
+}
+
+void DeviceRegistrationInfo::RegisterDevice(const std::string& ticket_id,
+ const DoneCallback& callback) {
+ ErrorPtr error;
std::unique_ptr<base::DictionaryValue> device_draft =
- BuildDeviceResource(error);
+ BuildDeviceResource(&error);
if (!device_draft)
- return std::string();
+ return RegisterDeviceError(callback, std::move(error));
base::DictionaryValue req_json;
req_json.SetString("id", ticket_id);
@@ -540,31 +530,48 @@
auto url = GetServiceURL("registrationTickets/" + ticket_id,
{{"key", GetSettings().api_key}});
- RequestSender sender{http::kPatch, url, http_client_};
+ RequestSender sender{HttpClient::Method::kPatch, url, http_client_};
sender.SetJsonData(req_json);
- auto response = sender.SendAndBlock(error);
+ sender.Send(base::Bind(&DeviceRegistrationInfo::RegisterDeviceOnTicketSent,
+ weak_factory_.GetWeakPtr(), ticket_id, callback));
+}
- if (!response)
- return std::string();
- auto json_resp = ParseJsonResponse(*response, error);
+void DeviceRegistrationInfo::RegisterDeviceOnTicketSent(
+ const std::string& ticket_id,
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error) {
+ if (error)
+ return RegisterDeviceError(callback, std::move(error));
+ auto json_resp = ParseJsonResponse(*response, &error);
if (!json_resp)
- return std::string();
+ return RegisterDeviceError(callback, std::move(error));
+
if (!IsSuccessful(*response)) {
- ParseGCDError(json_resp.get(), error);
- return std::string();
+ ParseGCDError(json_resp.get(), &error);
+ return RegisterDeviceError(callback, std::move(error));
}
- url = GetServiceURL("registrationTickets/" + ticket_id + "/finalize",
- {{"key", GetSettings().api_key}});
- response = RequestSender{http::kPost, url, http_client_}.SendAndBlock(error);
- if (!response)
- return std::string();
- json_resp = ParseJsonResponse(*response, error);
+ std::string url =
+ GetServiceURL("registrationTickets/" + ticket_id + "/finalize",
+ {{"key", GetSettings().api_key}});
+ RequestSender{HttpClient::Method::kPost, url, http_client_}.Send(
+ base::Bind(&DeviceRegistrationInfo::RegisterDeviceOnTicketFinalized,
+ weak_factory_.GetWeakPtr(), callback));
+}
+
+void DeviceRegistrationInfo::RegisterDeviceOnTicketFinalized(
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error) {
+ if (error)
+ return RegisterDeviceError(callback, std::move(error));
+ auto json_resp = ParseJsonResponse(*response, &error);
if (!json_resp)
- return std::string();
+ return RegisterDeviceError(callback, std::move(error));
if (!IsSuccessful(*response)) {
- ParseGCDError(json_resp.get(), error);
- return std::string();
+ ParseGCDError(json_resp.get(), &error);
+ return RegisterDeviceError(callback, std::move(error));
}
std::string auth_code;
@@ -575,15 +582,16 @@
!json_resp->GetString("robotAccountAuthorizationCode", &auth_code) ||
!json_resp->GetDictionary("deviceDraft", &device_draft_response) ||
!device_draft_response->GetString("id", &cloud_id)) {
- Error::AddTo(error, FROM_HERE, kErrorDomainGCD, "unexpected_response",
+ Error::AddTo(&error, FROM_HERE, kErrorDomainGCD, "unexpected_response",
"Device account missing in response");
- return std::string();
+ return RegisterDeviceError(callback, std::move(error));
}
UpdateDeviceInfoTimestamp(*device_draft_response);
// Now get access_token and refresh_token
- RequestSender sender2{http::kPost, GetOAuthURL("token"), http_client_};
+ RequestSender sender2{HttpClient::Method::kPost, GetOAuthURL("token"),
+ http_client_};
sender2.SetFormData(
{{"code", auth_code},
{"client_id", GetSettings().client_id},
@@ -591,21 +599,29 @@
{"redirect_uri", "oob"},
{"scope", "https://www.googleapis.com/auth/clouddevices"},
{"grant_type", "authorization_code"}});
- response = sender2.SendAndBlock(error);
+ sender2.Send(base::Bind(&DeviceRegistrationInfo::RegisterDeviceOnAuthCodeSent,
+ weak_factory_.GetWeakPtr(), cloud_id, robot_account,
+ callback));
+}
- if (!response)
- return std::string();
-
- json_resp = ParseOAuthResponse(*response, error);
+void DeviceRegistrationInfo::RegisterDeviceOnAuthCodeSent(
+ const std::string& cloud_id,
+ const std::string& robot_account,
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error) {
+ if (error)
+ return RegisterDeviceError(callback, std::move(error));
+ auto json_resp = ParseOAuthResponse(*response, &error);
int expires_in = 0;
std::string refresh_token;
if (!json_resp || !json_resp->GetString("access_token", &access_token_) ||
!json_resp->GetString("refresh_token", &refresh_token) ||
!json_resp->GetInteger("expires_in", &expires_in) ||
access_token_.empty() || refresh_token.empty() || expires_in <= 0) {
- Error::AddTo(error, FROM_HERE, kErrorDomainGCD, "unexpected_response",
+ Error::AddTo(&error, FROM_HERE, kErrorDomainGCD, "unexpected_response",
"Device access_token missing in response");
- return std::string();
+ return RegisterDeviceError(callback, std::move(error));
}
access_token_expiration_ =
@@ -617,22 +633,22 @@
change.set_refresh_token(refresh_token);
change.Commit();
+ task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr), {});
+
StartNotificationChannel();
// We're going to respond with our success immediately and we'll connect to
// cloud shortly after.
- ScheduleCloudConnection(base::TimeDelta::FromSeconds(0));
- return cloud_id;
+ ScheduleCloudConnection({});
}
void DeviceRegistrationInfo::DoCloudRequest(
- const std::string& method,
+ HttpClient::Method method,
const std::string& url,
const base::DictionaryValue* body,
- const CloudRequestCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const CloudRequestDoneCallback& callback) {
// We make CloudRequestData shared here because we want to make sure
- // there is only one instance of success_callback and error_calback since
+ // there is only one instance of callback and error_calback since
// those may have move-only types and making a copy of the callback with
// move-only types curried-in will invalidate the source callback.
auto data = std::make_shared<CloudRequestData>();
@@ -640,8 +656,7 @@
data->url = url;
if (body)
base::JSONWriter::Write(*body, &data->body);
- data->success_callback = success_callback;
- data->error_callback = error_callback;
+ data->callback = callback;
SendCloudRequest(data);
}
@@ -651,49 +666,39 @@
// forget about 5xx when fetching new access token).
// TODO(antonm): Add support for device removal.
- VLOG(1) << "Sending cloud request '" << data->method << "' to '" << data->url
- << "' with request body '" << data->body << "'";
ErrorPtr error;
if (!VerifyRegistrationCredentials(&error)) {
- data->error_callback.Run(error.get());
- return;
+ return data->callback.Run({}, std::move(error));
}
if (cloud_backoff_entry_->ShouldRejectRequest()) {
VLOG(1) << "Cloud request delayed for "
<< cloud_backoff_entry_->GetTimeUntilRelease()
<< " due to backoff policy";
- task_runner_->PostDelayedTask(
+ return task_runner_->PostDelayedTask(
FROM_HERE, base::Bind(&DeviceRegistrationInfo::SendCloudRequest,
AsWeakPtr(), data),
cloud_backoff_entry_->GetTimeUntilRelease());
- return;
}
RequestSender sender{data->method, data->url, http_client_};
sender.SetData(data->body, http::kJsonUtf8);
sender.SetAccessToken(access_token_);
- int request_id =
- sender.Send(base::Bind(&DeviceRegistrationInfo::OnCloudRequestSuccess,
- AsWeakPtr(), data),
- base::Bind(&DeviceRegistrationInfo::OnCloudRequestError,
- AsWeakPtr(), data));
- VLOG(1) << "Cloud request with ID " << request_id << " successfully sent";
+ sender.Send(base::Bind(&DeviceRegistrationInfo::OnCloudRequestDone,
+ AsWeakPtr(), data));
}
-void DeviceRegistrationInfo::OnCloudRequestSuccess(
+void DeviceRegistrationInfo::OnCloudRequestDone(
const std::shared_ptr<const CloudRequestData>& data,
- int request_id,
- const HttpClient::Response& response) {
- int status_code = response.GetStatusCode();
- VLOG(1) << "Response for cloud request with ID " << request_id
- << " received with status code " << status_code;
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error) {
+ if (error)
+ return RetryCloudRequest(data);
+ int status_code = response->GetStatusCode();
if (status_code == http::kDenied) {
cloud_backoff_entry_->InformOfRequest(true);
RefreshAccessToken(
base::Bind(&DeviceRegistrationInfo::OnAccessTokenRefreshed, AsWeakPtr(),
- data),
- base::Bind(&DeviceRegistrationInfo::OnAccessTokenError, AsWeakPtr(),
data));
return;
}
@@ -707,38 +712,26 @@
return;
}
- ErrorPtr error;
- auto json_resp = ParseJsonResponse(response, &error);
+ auto json_resp = ParseJsonResponse(*response, &error);
if (!json_resp) {
- data->error_callback.Run(error.get());
cloud_backoff_entry_->InformOfRequest(true);
- return;
+ return data->callback.Run({}, std::move(error));
}
- if (!IsSuccessful(response)) {
+ if (!IsSuccessful(*response)) {
ParseGCDError(json_resp.get(), &error);
if (status_code == http::kForbidden &&
error->HasError(kErrorDomainGCDServer, "rateLimitExceeded")) {
// If we exceeded server quota, retry the request later.
- RetryCloudRequest(data);
- return;
+ return RetryCloudRequest(data);
}
cloud_backoff_entry_->InformOfRequest(true);
- data->error_callback.Run(error.get());
- return;
+ return data->callback.Run({}, std::move(error));
}
cloud_backoff_entry_->InformOfRequest(true);
SetGcdState(GcdState::kConnected);
- data->success_callback.Run(*json_resp);
-}
-
-void DeviceRegistrationInfo::OnCloudRequestError(
- const std::shared_ptr<const CloudRequestData>& data,
- int request_id,
- const Error* error) {
- VLOG(1) << "Cloud request with ID " << request_id << " failed";
- RetryCloudRequest(data);
+ data->callback.Run(*json_resp, nullptr);
}
void DeviceRegistrationInfo::RetryCloudRequest(
@@ -750,32 +743,34 @@
}
void DeviceRegistrationInfo::OnAccessTokenRefreshed(
- const std::shared_ptr<const CloudRequestData>& data) {
+ const std::shared_ptr<const CloudRequestData>& data,
+ ErrorPtr error) {
+ if (error) {
+ CheckAccessTokenError(error->Clone());
+ return data->callback.Run({}, std::move(error));
+ }
SendCloudRequest(data);
}
-void DeviceRegistrationInfo::OnAccessTokenError(
- const std::shared_ptr<const CloudRequestData>& data,
- const Error* error) {
- CheckAccessTokenError(error);
- data->error_callback.Run(error);
-}
-
-void DeviceRegistrationInfo::CheckAccessTokenError(const Error* error) {
- if (error->HasError(kErrorDomainOAuth2, "invalid_grant"))
+void DeviceRegistrationInfo::CheckAccessTokenError(ErrorPtr error) {
+ if (error && error->HasError(kErrorDomainOAuth2, "invalid_grant"))
MarkDeviceUnregistered();
}
-void DeviceRegistrationInfo::ConnectToCloud() {
+void DeviceRegistrationInfo::ConnectToCloud(ErrorPtr error) {
+ if (error) {
+ if (error->HasError(kErrorDomainOAuth2, "invalid_grant"))
+ MarkDeviceUnregistered();
+ return;
+ }
+
connected_to_cloud_ = false;
if (!VerifyRegistrationCredentials(nullptr))
return;
if (access_token_.empty()) {
RefreshAccessToken(
- base::Bind(&DeviceRegistrationInfo::ConnectToCloud, AsWeakPtr()),
- base::Bind(&DeviceRegistrationInfo::CheckAccessTokenError,
- AsWeakPtr()));
+ base::Bind(&DeviceRegistrationInfo::ConnectToCloud, AsWeakPtr()));
return;
}
@@ -785,16 +780,16 @@
// 3) abort any commands that we've previously marked as "in progress"
// or as being in an error state; publish queued commands
UpdateDeviceResource(
- base::Bind(&DeviceRegistrationInfo::OnConnectedToCloud, AsWeakPtr()),
- base::Bind(&IgnoreCloudError));
+ base::Bind(&DeviceRegistrationInfo::OnConnectedToCloud, AsWeakPtr()));
}
-void DeviceRegistrationInfo::OnConnectedToCloud() {
+void DeviceRegistrationInfo::OnConnectedToCloud(ErrorPtr error) {
+ if (error)
+ return;
LOG(INFO) << "Device connected to cloud server";
connected_to_cloud_ = true;
FetchCommands(base::Bind(&DeviceRegistrationInfo::ProcessInitialCommandList,
- AsWeakPtr()),
- base::Bind(&IgnoreCloudError));
+ AsWeakPtr()));
// In case there are any pending state updates since we sent off the initial
// UpdateDeviceResource() request, update the server with any state changes.
PublishStateUpdates();
@@ -810,8 +805,7 @@
change.Commit();
if (HaveRegistrationCredentials()) {
- UpdateDeviceResource(base::Bind(&base::DoNothing),
- base::Bind(&IgnoreCloudError));
+ UpdateDeviceResource(base::Bind(&IgnoreCloudError));
}
}
@@ -848,39 +842,27 @@
void DeviceRegistrationInfo::UpdateCommand(
const std::string& command_id,
const base::DictionaryValue& command_patch,
- const base::Closure& on_success,
- const base::Closure& on_error) {
- DoCloudRequest(http::kPatch, GetServiceURL("commands/" + command_id),
- &command_patch,
- base::Bind(&IgnoreCloudResultWithCallback, on_success),
- base::Bind(&IgnoreCloudErrorWithCallback, on_error));
+ const DoneCallback& callback) {
+ DoCloudRequest(HttpClient::Method::kPatch,
+ GetServiceURL("commands/" + command_id), &command_patch,
+ base::Bind(&IgnoreCloudResultWithCallback, callback));
}
void DeviceRegistrationInfo::NotifyCommandAborted(const std::string& command_id,
ErrorPtr error) {
base::DictionaryValue command_patch;
command_patch.SetString(commands::attributes::kCommand_State,
- EnumToString(CommandStatus::kAborted));
+ EnumToString(Command::State::kAborted));
if (error) {
- command_patch.SetString(commands::attributes::kCommand_ErrorCode,
- Join(":", error->GetDomain(), error->GetCode()));
- std::vector<std::string> messages;
- const Error* current_error = error.get();
- while (current_error) {
- messages.push_back(current_error->GetMessage());
- current_error = current_error->GetInnerError();
- }
- command_patch.SetString(commands::attributes::kCommand_ErrorMessage,
- Join(";", messages));
+ command_patch.Set(commands::attributes::kCommand_Error,
+ ErrorInfoToJson(*error).release());
}
- UpdateCommand(command_id, command_patch, base::Bind(&base::DoNothing),
- base::Bind(&base::DoNothing));
+ UpdateCommand(command_id, command_patch, base::Bind(&IgnoreCloudError));
}
void DeviceRegistrationInfo::UpdateDeviceResource(
- const base::Closure& on_success,
- const ErrorCallback& on_failure) {
- queued_resource_update_callbacks_.emplace_back(on_success, on_failure);
+ const DoneCallback& callback) {
+ queued_resource_update_callbacks_.emplace_back(callback);
if (!in_progress_resource_update_callbacks_.empty()) {
VLOG(1) << "Another request is already pending.";
return;
@@ -900,10 +882,8 @@
// the request to guard against out-of-order requests overwriting settings
// specified by later requests.
VLOG(1) << "Getting the last device resource timestamp from server...";
- GetDeviceInfo(
- base::Bind(&DeviceRegistrationInfo::OnDeviceInfoRetrieved, AsWeakPtr()),
- base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceError,
- AsWeakPtr()));
+ GetDeviceInfo(base::Bind(&DeviceRegistrationInfo::OnDeviceInfoRetrieved,
+ AsWeakPtr()));
return;
}
@@ -918,23 +898,22 @@
std::unique_ptr<base::DictionaryValue> device_resource =
BuildDeviceResource(&error);
if (!device_resource) {
- OnUpdateDeviceResourceError(error.get());
- return;
+ return OnUpdateDeviceResourceError(std::move(error));
}
std::string url = GetDeviceURL(
{}, {{"lastUpdateTimeMs", last_device_resource_updated_timestamp_}});
- DoCloudRequest(
- http::kPut, url, device_resource.get(),
- base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceSuccess,
- AsWeakPtr()),
- base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceError,
- AsWeakPtr()));
+ DoCloudRequest(HttpClient::Method::kPut, url, device_resource.get(),
+ base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceDone,
+ AsWeakPtr()));
}
void DeviceRegistrationInfo::OnDeviceInfoRetrieved(
- const base::DictionaryValue& device_info) {
+ const base::DictionaryValue& device_info,
+ ErrorPtr error) {
+ if (error)
+ return OnUpdateDeviceResourceError(std::move(error));
if (UpdateDeviceInfoTimestamp(device_info))
StartQueuedUpdateDeviceResource();
}
@@ -953,27 +932,28 @@
return true;
}
-void DeviceRegistrationInfo::OnUpdateDeviceResourceSuccess(
- const base::DictionaryValue& device_info) {
+void DeviceRegistrationInfo::OnUpdateDeviceResourceDone(
+ const base::DictionaryValue& device_info,
+ ErrorPtr error) {
+ if (error)
+ return OnUpdateDeviceResourceError(std::move(error));
UpdateDeviceInfoTimestamp(device_info);
// Make a copy of the callback list so that if the callback triggers another
// call to UpdateDeviceResource(), we do not modify the list we are iterating
// over.
auto callback_list = std::move(in_progress_resource_update_callbacks_);
- for (const auto& callback_pair : callback_list)
- callback_pair.first.Run();
+ for (const auto& callback : callback_list)
+ callback.Run(nullptr);
StartQueuedUpdateDeviceResource();
}
-void DeviceRegistrationInfo::OnUpdateDeviceResourceError(const Error* error) {
+void DeviceRegistrationInfo::OnUpdateDeviceResourceError(ErrorPtr error) {
if (error->HasError(kErrorDomainGCDServer, "invalid_last_update_time_ms")) {
// If the server rejected our previous request, retrieve the latest
// timestamp from the server and retry.
VLOG(1) << "Getting the last device resource timestamp from server...";
- GetDeviceInfo(
- base::Bind(&DeviceRegistrationInfo::OnDeviceInfoRetrieved, AsWeakPtr()),
- base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceError,
- AsWeakPtr()));
+ GetDeviceInfo(base::Bind(&DeviceRegistrationInfo::OnDeviceInfoRetrieved,
+ AsWeakPtr()));
return;
}
@@ -981,28 +961,24 @@
// call to UpdateDeviceResource(), we do not modify the list we are iterating
// over.
auto callback_list = std::move(in_progress_resource_update_callbacks_);
- for (const auto& callback_pair : callback_list)
- callback_pair.second.Run(error);
+ for (const auto& callback : callback_list)
+ callback.Run(error->Clone());
StartQueuedUpdateDeviceResource();
}
-void DeviceRegistrationInfo::OnFetchCommandsSuccess(
- const base::Callback<void(const base::ListValue&)>& callback,
- const base::DictionaryValue& json) {
+void DeviceRegistrationInfo::OnFetchCommandsDone(
+ const base::Callback<void(const base::ListValue&, ErrorPtr)>& callback,
+ const base::DictionaryValue& json,
+ ErrorPtr error) {
OnFetchCommandsReturned();
+ if (error)
+ return callback.Run({}, std::move(error));
const base::ListValue* commands{nullptr};
- if (!json.GetList("commands", &commands)) {
+ if (!json.GetList("commands", &commands))
VLOG(2) << "No commands in the response.";
- }
const base::ListValue empty;
- callback.Run(commands ? *commands : empty);
-}
-
-void DeviceRegistrationInfo::OnFetchCommandsError(const ErrorCallback& callback,
- const Error* error) {
- OnFetchCommandsReturned();
- callback.Run(error);
+ callback.Run(commands ? *commands : empty, nullptr);
}
void DeviceRegistrationInfo::OnFetchCommandsReturned() {
@@ -1013,17 +989,15 @@
}
void DeviceRegistrationInfo::FetchCommands(
- const base::Callback<void(const base::ListValue&)>& on_success,
- const ErrorCallback& on_failure) {
+ const base::Callback<void(const base::ListValue&, ErrorPtr error)>&
+ callback) {
fetch_commands_request_sent_ = true;
fetch_commands_request_queued_ = false;
DoCloudRequest(
- http::kGet,
+ HttpClient::Method::kGet,
GetServiceURL("commands/queue", {{"deviceId", GetSettings().cloud_id}}),
- nullptr, base::Bind(&DeviceRegistrationInfo::OnFetchCommandsSuccess,
- AsWeakPtr(), on_success),
- base::Bind(&DeviceRegistrationInfo::OnFetchCommandsError, AsWeakPtr(),
- on_failure));
+ nullptr, base::Bind(&DeviceRegistrationInfo::OnFetchCommandsDone,
+ AsWeakPtr(), callback));
}
void DeviceRegistrationInfo::FetchAndPublishCommands() {
@@ -1033,12 +1007,14 @@
}
FetchCommands(base::Bind(&DeviceRegistrationInfo::PublishCommands,
- weak_factory_.GetWeakPtr()),
- base::Bind(&IgnoreCloudError));
+ weak_factory_.GetWeakPtr()));
}
void DeviceRegistrationInfo::ProcessInitialCommandList(
- const base::ListValue& commands) {
+ const base::ListValue& commands,
+ ErrorPtr error) {
+ if (error)
+ return;
for (const base::Value* command : commands) {
const base::DictionaryValue* command_dict{nullptr};
if (!command->GetAsDictionary(&command_dict)) {
@@ -1062,9 +1038,9 @@
std::unique_ptr<base::DictionaryValue> cmd_copy{command_dict->DeepCopy()};
cmd_copy->SetString("state", "aborted");
// TODO(wiley) We could consider handling this error case more gracefully.
- DoCloudRequest(http::kPut, GetServiceURL("commands/" + command_id),
- cmd_copy.get(), base::Bind(&IgnoreCloudResult),
- base::Bind(&IgnoreCloudError));
+ DoCloudRequest(HttpClient::Method::kPut,
+ GetServiceURL("commands/" + command_id), cmd_copy.get(),
+ base::Bind(&IgnoreCloudResult));
} else {
// Normal command, publish it to local clients.
PublishCommand(*command_dict);
@@ -1072,7 +1048,10 @@
}
}
-void DeviceRegistrationInfo::PublishCommands(const base::ListValue& commands) {
+void DeviceRegistrationInfo::PublishCommands(const base::ListValue& commands,
+ ErrorPtr error) {
+ if (error)
+ return;
for (const base::Value* command : commands) {
const base::DictionaryValue* command_dict{nullptr};
if (!command->GetAsDictionary(&command_dict)) {
@@ -1088,8 +1067,8 @@
std::string command_id;
ErrorPtr error;
auto command_instance = CommandInstance::FromJson(
- &command, CommandOrigin::kCloud, command_manager_->GetCommandDictionary(),
- &command_id, &error);
+ &command, Command::Origin::kCloud,
+ command_manager_->GetCommandDictionary(), &command_id, &error);
if (!command_instance) {
LOG(WARNING) << "Failed to parse a command instance: " << command;
if (!command_id.empty())
@@ -1153,28 +1132,26 @@
body.Set("patches", patches.release());
device_state_update_pending_ = true;
- DoCloudRequest(
- http::kPost, GetDeviceURL("patchState"), &body,
- base::Bind(&DeviceRegistrationInfo::OnPublishStateSuccess, AsWeakPtr(),
- update_id),
- base::Bind(&DeviceRegistrationInfo::OnPublishStateError, AsWeakPtr()));
+ DoCloudRequest(HttpClient::Method::kPost, GetDeviceURL("patchState"), &body,
+ base::Bind(&DeviceRegistrationInfo::OnPublishStateDone,
+ AsWeakPtr(), update_id));
}
-void DeviceRegistrationInfo::OnPublishStateSuccess(
+void DeviceRegistrationInfo::OnPublishStateDone(
StateChangeQueueInterface::UpdateID update_id,
- const base::DictionaryValue& reply) {
+ const base::DictionaryValue& reply,
+ ErrorPtr error) {
device_state_update_pending_ = false;
+ if (error) {
+ LOG(ERROR) << "Permanent failure while trying to update device state";
+ return;
+ }
state_manager_->NotifyStateUpdatedOnServer(update_id);
// See if there were more pending state updates since the previous request
// had been sent out.
PublishStateUpdates();
}
-void DeviceRegistrationInfo::OnPublishStateError(const Error* error) {
- LOG(ERROR) << "Permanent failure while trying to update device state";
- device_state_update_pending_ = false;
-}
-
void DeviceRegistrationInfo::SetGcdState(GcdState new_state) {
VLOG_IF(1, new_state != gcd_state_) << "Changing registration status to "
<< EnumToString(new_state);
@@ -1188,8 +1165,7 @@
if (!HaveRegistrationCredentials() || !connected_to_cloud_)
return;
- UpdateDeviceResource(base::Bind(&base::DoNothing),
- base::Bind(&IgnoreCloudError));
+ UpdateDeviceResource(base::Bind(&IgnoreCloudError));
}
void DeviceRegistrationInfo::OnStateChanged() {
@@ -1222,8 +1198,9 @@
// the moment of the last poll and the time we successfully told the server
// to send new commands over the new notification channel.
UpdateDeviceResource(
- base::Bind(&DeviceRegistrationInfo::FetchAndPublishCommands, AsWeakPtr()),
- base::Bind(&IgnoreCloudError));
+ base::Bind(&IgnoreCloudErrorWithCallback,
+ base::Bind(&DeviceRegistrationInfo::FetchAndPublishCommands,
+ AsWeakPtr())));
}
void DeviceRegistrationInfo::OnDisconnected() {
@@ -1234,15 +1211,13 @@
pull_channel_->UpdatePullInterval(
base::TimeDelta::FromSeconds(kPollingPeriodSeconds));
current_notification_channel_ = pull_channel_.get();
- UpdateDeviceResource(base::Bind(&base::DoNothing),
- base::Bind(&IgnoreCloudError));
+ UpdateDeviceResource(base::Bind(&IgnoreCloudError));
}
void DeviceRegistrationInfo::OnPermanentFailure() {
LOG(ERROR) << "Failed to establish notification channel.";
notification_channel_starting_ = false;
RefreshAccessToken(
- base::Bind(&base::DoNothing),
base::Bind(&DeviceRegistrationInfo::CheckAccessTokenError, AsWeakPtr()));
}
@@ -1251,6 +1226,8 @@
if (!connected_to_cloud_)
return;
+ VLOG(1) << "Command notification received: " << command;
+
if (!command.empty()) {
// GCD spec indicates that the command parameter in notification object
// "may be empty if command size is too big".
diff --git a/libweave/src/device_registration_info.h b/libweave/src/device_registration_info.h
index c797102..8eb0ec3 100644
--- a/libweave/src/device_registration_info.h
+++ b/libweave/src/device_registration_info.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -50,8 +50,9 @@
class DeviceRegistrationInfo : public NotificationDelegate,
public CloudCommandUpdateInterface {
public:
- using CloudRequestCallback =
- base::Callback<void(const base::DictionaryValue& response)>;
+ using CloudRequestDoneCallback =
+ base::Callback<void(const base::DictionaryValue& response,
+ ErrorPtr error)>;
DeviceRegistrationInfo(const std::shared_ptr<CommandManager>& command_manager,
const std::shared_ptr<StateManager>& state_manager,
@@ -64,7 +65,8 @@
void AddGcdStateChangedCallback(
const Device::GcdStateChangedCallback& callback);
- std::string RegisterDevice(const std::string& ticket_id, ErrorPtr* error);
+ void RegisterDevice(const std::string& ticket_id,
+ const DoneCallback& callback);
void UpdateDeviceInfo(const std::string& name,
const std::string& description,
@@ -79,8 +81,7 @@
const std::string& service_url,
ErrorPtr* error);
- void GetDeviceInfo(const CloudRequestCallback& success_callback,
- const ErrorCallback& error_callback);
+ void GetDeviceInfo(const CloudRequestDoneCallback& callback);
// Returns the GCD service request URL. If |subpath| is specified, it is
// appended to the base URL which is normally
@@ -118,8 +119,7 @@
// Updates a command (override from CloudCommandUpdateInterface).
void UpdateCommand(const std::string& command_id,
const base::DictionaryValue& command_patch,
- const base::Closure& on_success,
- const base::Closure& on_error) override;
+ const DoneCallback& callback) override;
// TODO(vitalybuka): remove getters and pass config to dependent code.
const Config::Settings& GetSettings() const { return config_->GetSettings(); }
@@ -141,25 +141,18 @@
// Initiates the connection to the cloud server.
// Device will do required start up chores and then start to listen
// to new commands.
- void ConnectToCloud();
+ void ConnectToCloud(ErrorPtr error);
// Notification called when ConnectToCloud() succeeds.
- void OnConnectedToCloud();
+ void OnConnectedToCloud(ErrorPtr error);
// Forcibly refreshes the access token.
- void RefreshAccessToken(const base::Closure& success_callback,
- const ErrorCallback& error_callback);
+ void RefreshAccessToken(const DoneCallback& callback);
// Callbacks for RefreshAccessToken().
- void OnRefreshAccessTokenSuccess(
- const std::shared_ptr<base::Closure>& success_callback,
- const std::shared_ptr<ErrorCallback>& error_callback,
- int id,
- const provider::HttpClient::Response& response);
- void OnRefreshAccessTokenError(
- const std::shared_ptr<base::Closure>& success_callback,
- const std::shared_ptr<ErrorCallback>& error_callback,
- int id,
- const Error* error);
+ void OnRefreshAccessTokenDone(
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error);
// Parse the OAuth response, and sets registration status to
// kInvalidCredentials if our registration is no longer valid.
@@ -176,45 +169,39 @@
// and device removal. It is a recommended way to do cloud API
// requests.
// TODO(antonm): Consider moving into some other class.
- void DoCloudRequest(const std::string& method,
+ void DoCloudRequest(provider::HttpClient::Method method,
const std::string& url,
const base::DictionaryValue* body,
- const CloudRequestCallback& success_callback,
- const ErrorCallback& error_callback);
+ const CloudRequestDoneCallback& callback);
// Helper for DoCloudRequest().
struct CloudRequestData {
- std::string method;
+ provider::HttpClient::Method method;
std::string url;
std::string body;
- CloudRequestCallback success_callback;
- ErrorCallback error_callback;
+ CloudRequestDoneCallback callback;
};
void SendCloudRequest(const std::shared_ptr<const CloudRequestData>& data);
- void OnCloudRequestSuccess(
+ void OnCloudRequestDone(
const std::shared_ptr<const CloudRequestData>& data,
- int request_id,
- const provider::HttpClient::Response& response);
- void OnCloudRequestError(const std::shared_ptr<const CloudRequestData>& data,
- int request_id,
- const Error* error);
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error);
void RetryCloudRequest(const std::shared_ptr<const CloudRequestData>& data);
void OnAccessTokenRefreshed(
- const std::shared_ptr<const CloudRequestData>& data);
- void OnAccessTokenError(const std::shared_ptr<const CloudRequestData>& data,
- const Error* error);
- void CheckAccessTokenError(const Error* error);
+ const std::shared_ptr<const CloudRequestData>& data,
+ ErrorPtr error);
+ void CheckAccessTokenError(ErrorPtr error);
- void UpdateDeviceResource(const base::Closure& on_success,
- const ErrorCallback& on_failure);
+ void UpdateDeviceResource(const DoneCallback& callback);
void StartQueuedUpdateDeviceResource();
- // Success/failure callbacks for UpdateDeviceResource().
- void OnUpdateDeviceResourceSuccess(const base::DictionaryValue& device_info);
- void OnUpdateDeviceResourceError(const Error* error);
+ void OnUpdateDeviceResourceDone(const base::DictionaryValue& device_info,
+ ErrorPtr error);
+ void OnUpdateDeviceResourceError(ErrorPtr error);
// Callback from GetDeviceInfo() to retrieve the device resource timestamp
// and retry UpdateDeviceResource() call.
- void OnDeviceInfoRetrieved(const base::DictionaryValue& device_info);
+ void OnDeviceInfoRetrieved(const base::DictionaryValue& device_info,
+ ErrorPtr error);
// Extracts the timestamp from the device resource and sets it to
// |last_device_resource_updated_timestamp_|.
@@ -223,13 +210,11 @@
bool UpdateDeviceInfoTimestamp(const base::DictionaryValue& device_info);
void FetchCommands(
- const base::Callback<void(const base::ListValue&)>& on_success,
- const ErrorCallback& on_failure);
- // Success/failure callbacks for FetchCommands().
- void OnFetchCommandsSuccess(
- const base::Callback<void(const base::ListValue&)>& callback,
- const base::DictionaryValue& json);
- void OnFetchCommandsError(const ErrorCallback& callback, const Error* error);
+ const base::Callback<void(const base::ListValue&, ErrorPtr)>& callback);
+ void OnFetchCommandsDone(
+ const base::Callback<void(const base::ListValue&, ErrorPtr)>& callback,
+ const base::DictionaryValue& json,
+ ErrorPtr);
// Called when FetchCommands completes (with either success or error).
// This method reschedules any pending/queued fetch requests.
void OnFetchCommandsReturned();
@@ -237,9 +222,10 @@
// Processes the command list that is fetched from the server on connection.
// Aborts commands which are in transitional states and publishes queued
// commands which are queued.
- void ProcessInitialCommandList(const base::ListValue& commands);
+ void ProcessInitialCommandList(const base::ListValue& commands,
+ ErrorPtr error);
- void PublishCommands(const base::ListValue& commands);
+ void PublishCommands(const base::ListValue& commands, ErrorPtr error);
void PublishCommand(const base::DictionaryValue& command);
// Helper function to pull the pending command list from the server using
@@ -247,9 +233,10 @@
void FetchAndPublishCommands();
void PublishStateUpdates();
- void OnPublishStateSuccess(StateChangeQueueInterface::UpdateID update_id,
- const base::DictionaryValue& reply);
- void OnPublishStateError(const Error* error);
+ void OnPublishStateDone(StateChangeQueueInterface::UpdateID update_id,
+ const base::DictionaryValue& reply,
+ ErrorPtr error);
+ void OnPublishStateError(ErrorPtr error);
// If unrecoverable error occurred (e.g. error parsing command instance),
// notify the server that the command is aborted by the device.
@@ -277,6 +264,23 @@
// Wipes out the device registration information and stops server connections.
void MarkDeviceUnregistered();
+ void RegisterDeviceError(const DoneCallback& callback, ErrorPtr error);
+ void RegisterDeviceOnTicketSent(
+ const std::string& ticket_id,
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error);
+ void RegisterDeviceOnTicketFinalized(
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error);
+ void RegisterDeviceOnAuthCodeSent(
+ const std::string& cloud_id,
+ const std::string& robot_account,
+ const DoneCallback& callback,
+ std::unique_ptr<provider::HttpClient::Response> response,
+ ErrorPtr error);
+
// Transient data
std::string access_token_;
base::Time access_token_expiration_;
@@ -313,13 +317,12 @@
// another one was in flight.
bool fetch_commands_request_queued_{false};
- using ResourceUpdateCallbackList =
- std::vector<std::pair<base::Closure, ErrorCallback>>;
- // Success/error callbacks for device resource update request currently in
- // flight to the cloud server.
+ using ResourceUpdateCallbackList = std::vector<DoneCallback>;
+ // Callbacks for device resource update request currently in flight to the
+ // cloud server.
ResourceUpdateCallbackList in_progress_resource_update_callbacks_;
- // Success/error callbacks for device resource update requests queued while
- // another request is in flight to the cloud server.
+ // Callbacks for device resource update requests queued while another request
+ // is in flight to the cloud server.
ResourceUpdateCallbackList queued_resource_update_callbacks_;
std::unique_ptr<NotificationChannel> primary_notification_channel_;
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index f5c53fa..060e5c4 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -8,6 +8,7 @@
#include <base/json/json_writer.h>
#include <base/values.h>
#include <gtest/gtest.h>
+#include <weave/provider/test/fake_task_runner.h>
#include <weave/provider/test/mock_config_store.h>
#include <weave/provider/test/mock_http_client.h>
@@ -76,12 +77,14 @@
return {};
}
-HttpClient::Response* ReplyWithJson(int status_code, const base::Value& json) {
+std::unique_ptr<HttpClient::Response> ReplyWithJson(int status_code,
+ const base::Value& json) {
std::string text;
base::JSONWriter::WriteWithOptions(
json, base::JSONWriter::OPTIONS_PRETTY_PRINT, &text);
- MockHttpClientResponse* response = new StrictMock<MockHttpClientResponse>;
+ std::unique_ptr<MockHttpClientResponse> response{
+ new StrictMock<MockHttpClientResponse>};
EXPECT_CALL(*response, GetStatusCode())
.Times(AtLeast(1))
.WillRepeatedly(Return(status_code));
@@ -90,8 +93,8 @@
.WillRepeatedly(Return(http::kJsonUtf8));
EXPECT_CALL(*response, GetData())
.Times(AtLeast(1))
- .WillRepeatedly(ReturnRefOfCopy(text));
- return response;
+ .WillRepeatedly(Return(text));
+ return std::move(response);
}
std::pair<std::string, std::string> GetAuthHeader() {
@@ -123,7 +126,7 @@
std::unique_ptr<Config> config{new Config{&config_store_}};
config_ = config.get();
dev_reg_.reset(new DeviceRegistrationInfo{command_manager_, state_manager_,
- std::move(config), nullptr,
+ std::move(config), &task_runner_,
&http_client_, nullptr});
ReloadDefaults();
@@ -163,18 +166,19 @@
}
void PublishCommands(const base::ListValue& commands) {
- return dev_reg_->PublishCommands(commands);
+ dev_reg_->PublishCommands(commands, nullptr);
}
bool RefreshAccessToken(ErrorPtr* error) const {
bool succeeded = false;
- auto on_success = [&succeeded]() { succeeded = true; };
- auto on_failure = [&error](const Error* in_error) {
- if (error)
- *error = in_error->Clone();
+ auto callback = [&succeeded, &error](ErrorPtr in_error) {
+ if (error) {
+ *error = std::move(in_error);
+ return;
+ }
+ succeeded = true;
};
- dev_reg_->RefreshAccessToken(base::Bind(on_success),
- base::Bind(on_failure));
+ dev_reg_->RefreshAccessToken(base::Bind(callback));
return succeeded;
}
@@ -182,6 +186,7 @@
GcdState GetGcdState() const { return dev_reg_->GetGcdState(); }
+ provider::test::FakeTaskRunner task_runner_;
provider::test::MockConfigStore config_store_;
StrictMock<MockHttpClient> http_client_;
base::DictionaryValue data_;
@@ -192,7 +197,6 @@
std::shared_ptr<StateManager> state_manager_;
};
-////////////////////////////////////////////////////////////////////////////////
TEST_F(DeviceRegistrationInfoTest, GetServiceURL) {
EXPECT_EQ(test_data::kServiceURL, dev_reg_->GetServiceURL());
std::string url = test_data::kServiceURL;
@@ -230,10 +234,13 @@
EXPECT_FALSE(dev_reg_->HaveRegistrationCredentials());
ReloadSettings();
- EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -245,7 +252,7 @@
json.SetString("access_token", test_data::kAccessToken);
json.SetInteger("expires_in", 3600);
- return ReplyWithJson(200, json);
+ callback.Run(ReplyWithJson(200, json), nullptr);
})));
EXPECT_TRUE(RefreshAccessToken(nullptr));
@@ -256,10 +263,13 @@
ReloadSettings();
EXPECT_EQ(GcdState::kConnecting, GetGcdState());
- EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -269,7 +279,7 @@
base::DictionaryValue json;
json.SetString("error", "unable_to_authenticate");
- return ReplyWithJson(400, json);
+ callback.Run(ReplyWithJson(400, json), nullptr);
})));
ErrorPtr error;
@@ -282,10 +292,13 @@
ReloadSettings();
EXPECT_EQ(GcdState::kConnecting, GetGcdState());
- EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRefreshToken,
GetFormField(data, "refresh_token"));
@@ -295,7 +308,7 @@
base::DictionaryValue json;
json.SetString("error", "invalid_grant");
- return ReplyWithJson(400, json);
+ callback.Run(ReplyWithJson(400, json), nullptr);
})));
ErrorPtr error;
@@ -308,30 +321,31 @@
ReloadSettings();
SetAccessToken();
- EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kGet, dev_reg_->GetDeviceURL(),
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kGet, dev_reg_->GetDeviceURL(),
HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- base::DictionaryValue json;
- json.SetString("channel.supportedType", "xmpp");
- json.SetString("deviceKind", "vendor");
- json.SetString("id", test_data::kDeviceId);
- json.SetString("kind", "clouddevices#device");
- return ReplyWithJson(200, json);
- })));
+ .WillOnce(WithArgs<3, 4>(
+ Invoke([](const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
+ base::DictionaryValue json;
+ json.SetString("channel.supportedType", "xmpp");
+ json.SetString("deviceKind", "vendor");
+ json.SetString("id", test_data::kDeviceId);
+ json.SetString("kind", "clouddevices#device");
+ callback.Run(ReplyWithJson(200, json), nullptr);
+ })));
bool succeeded = false;
- auto on_success = [&succeeded, this](const base::DictionaryValue& info) {
+ auto callback = [&succeeded, this](const base::DictionaryValue& info,
+ ErrorPtr error) {
+ EXPECT_FALSE(error);
std::string id;
EXPECT_TRUE(info.GetString("id", &id));
EXPECT_EQ(test_data::kDeviceId, id);
succeeded = true;
};
- auto on_failure = [](const Error* error) {
- FAIL() << "Should not be called";
- };
- dev_reg_->GetDeviceInfo(base::Bind(on_success), base::Bind(on_failure));
+ dev_reg_->GetDeviceInfo(base::Bind(callback));
EXPECT_TRUE(succeeded);
}
@@ -371,11 +385,13 @@
std::string ticket_url = dev_reg_->GetServiceURL("registrationTickets/") +
test_data::kClaimTicketId;
- EXPECT_CALL(
- http_client_,
- MockSendRequest(http::kPatch, ticket_url + "?key=" + test_data::kApiKey,
- HttpClient::Headers{GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ EXPECT_CALL(http_client_,
+ SendRequest(HttpClient::Method::kPatch,
+ ticket_url + "?key=" + test_data::kApiKey,
+ HttpClient::Headers{GetJsonHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
auto json = test::CreateDictionaryValue(data);
EXPECT_NE(nullptr, json.get());
std::string value;
@@ -435,32 +451,36 @@
device_draft->SetString("kind", "clouddevices#device");
json_resp.Set("deviceDraft", device_draft);
- return ReplyWithJson(200, json_resp);
+ callback.Run(ReplyWithJson(200, json_resp), nullptr);
})));
EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, ticket_url + "/finalize?key=" +
- test_data::kApiKey,
- HttpClient::Headers{}, _, _))
- .WillOnce(InvokeWithoutArgs([]() {
- base::DictionaryValue json;
- json.SetString("id", test_data::kClaimTicketId);
- json.SetString("kind", "clouddevices#registrationTicket");
- json.SetString("oauthClientId", test_data::kClientId);
- json.SetString("userEmail", "user@email.com");
- json.SetString("deviceDraft.id", test_data::kDeviceId);
- json.SetString("deviceDraft.kind", "clouddevices#device");
- json.SetString("deviceDraft.channel.supportedType", "xmpp");
- json.SetString("robotAccountEmail", test_data::kRobotAccountEmail);
- json.SetString("robotAccountAuthorizationCode",
- test_data::kRobotAccountAuthCode);
- return ReplyWithJson(200, json);
- }));
+ SendRequest(HttpClient::Method::kPost,
+ ticket_url + "/finalize?key=" + test_data::kApiKey,
+ HttpClient::Headers{}, _, _))
+ .WillOnce(WithArgs<4>(
+ Invoke([](const HttpClient::SendRequestCallback& callback) {
+ base::DictionaryValue json;
+ json.SetString("id", test_data::kClaimTicketId);
+ json.SetString("kind", "clouddevices#registrationTicket");
+ json.SetString("oauthClientId", test_data::kClientId);
+ json.SetString("userEmail", "user@email.com");
+ json.SetString("deviceDraft.id", test_data::kDeviceId);
+ json.SetString("deviceDraft.kind", "clouddevices#device");
+ json.SetString("deviceDraft.channel.supportedType", "xmpp");
+ json.SetString("robotAccountEmail", test_data::kRobotAccountEmail);
+ json.SetString("robotAccountAuthorizationCode",
+ test_data::kRobotAccountAuthCode);
+ callback.Run(ReplyWithJson(200, json), nullptr);
+ })));
- EXPECT_CALL(http_client_,
- MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
- HttpClient::Headers{GetFormHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPost, dev_reg_->GetOAuthURL("token"),
+ HttpClient::Headers{GetFormHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
EXPECT_EQ("authorization_code", GetFormField(data, "grant_type"));
EXPECT_EQ(test_data::kRobotAccountAuthCode, GetFormField(data, "code"));
EXPECT_EQ(test_data::kClientId, GetFormField(data, "client_id"));
@@ -477,20 +497,26 @@
json.SetString("refresh_token", test_data::kRefreshToken);
json.SetInteger("expires_in", 3600);
- return ReplyWithJson(200, json);
+ callback.Run(ReplyWithJson(200, json), nullptr);
})));
- std::string cloud_id =
- dev_reg_->RegisterDevice(test_data::kClaimTicketId, nullptr);
+ bool done = false;
+ dev_reg_->RegisterDevice(
+ test_data::kClaimTicketId, base::Bind([this, &done](ErrorPtr error) {
+ EXPECT_FALSE(error);
+ done = true;
+ task_runner_.Break();
+ EXPECT_EQ(GcdState::kConnecting, GetGcdState());
- EXPECT_EQ(test_data::kDeviceId, cloud_id);
- EXPECT_EQ(GcdState::kConnecting, GetGcdState());
-
- // Validate the device info saved to storage...
- EXPECT_EQ(test_data::kDeviceId, dev_reg_->GetSettings().cloud_id);
- EXPECT_EQ(test_data::kRefreshToken, dev_reg_->GetSettings().refresh_token);
- EXPECT_EQ(test_data::kRobotAccountEmail,
- dev_reg_->GetSettings().robot_account);
+ // Validate the device info saved to storage...
+ EXPECT_EQ(test_data::kDeviceId, dev_reg_->GetSettings().cloud_id);
+ EXPECT_EQ(test_data::kRefreshToken,
+ dev_reg_->GetSettings().refresh_token);
+ EXPECT_EQ(test_data::kRobotAccountEmail,
+ dev_reg_->GetSettings().robot_account);
+ }));
+ task_runner_.Run();
+ EXPECT_TRUE(done);
}
TEST_F(DeviceRegistrationInfoTest, OOBRegistrationStatus) {
@@ -502,83 +528,100 @@
EXPECT_EQ(GcdState::kConnecting, GetGcdState());
}
-TEST_F(DeviceRegistrationInfoTest, UpdateCommand) {
- ReloadSettings();
- SetAccessToken();
+class DeviceRegistrationInfoUpdateCommandTest
+ : public DeviceRegistrationInfoTest {
+ protected:
+ void SetUp() override {
+ DeviceRegistrationInfoTest::SetUp();
- auto json_cmds = CreateDictionaryValue(R"({
- 'robot': {
- '_jump': {
- 'parameters': {'_height': 'integer'},
- 'progress': {'progress': 'integer'},
- 'results': {'status': 'string'},
- 'minimalRole': 'user'
+ ReloadSettings();
+ SetAccessToken();
+
+ auto json_cmds = CreateDictionaryValue(R"({
+ 'robot': {
+ '_jump': {
+ 'parameters': {'_height': 'integer'},
+ 'progress': {'progress': 'integer'},
+ 'results': {'status': 'string'},
+ 'minimalRole': 'user'
+ }
}
- }
- })");
- EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, nullptr));
+ })");
+ EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, nullptr));
- const std::string command_url = dev_reg_->GetServiceURL("commands/1234");
+ command_url_ = dev_reg_->GetServiceURL("commands/1234");
- auto commands_json = CreateValue(R"([{
- 'name':'robot._jump',
- 'id':'1234',
- 'parameters': {'_height': 100},
- 'minimalRole': 'user'
- }])");
- ASSERT_NE(nullptr, commands_json.get());
- const base::ListValue* command_list = nullptr;
- ASSERT_TRUE(commands_json->GetAsList(&command_list));
- PublishCommands(*command_list);
- auto command = command_manager_->FindCommand("1234");
- ASSERT_NE(nullptr, command);
+ auto commands_json = CreateValue(R"([{
+ 'name':'robot._jump',
+ 'id':'1234',
+ 'parameters': {'_height': 100},
+ 'minimalRole': 'user'
+ }])");
+ ASSERT_NE(nullptr, commands_json.get());
+ const base::ListValue* command_list = nullptr;
+ ASSERT_TRUE(commands_json->GetAsList(&command_list));
+ PublishCommands(*command_list);
+ command_ = command_manager_->FindCommand("1234");
+ ASSERT_NE(nullptr, command_);
+ }
- EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url,
+ void TearDown() override {
+ task_runner_.RunOnce();
+ DeviceRegistrationInfoTest::TearDown();
+ }
+
+ Command* command_{nullptr};
+ std::string command_url_;
+};
+
+TEST_F(DeviceRegistrationInfoUpdateCommandTest, SetProgress) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPatch, command_url_,
HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- EXPECT_JSON_EQ(R"({"results":{"status":"Ok"}})",
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
+ EXPECT_JSON_EQ((R"({"state":"inProgress","progress":{"progress":18}})"),
*CreateDictionaryValue(data));
base::DictionaryValue json;
- return ReplyWithJson(200, json);
+ callback.Run(ReplyWithJson(200, json), nullptr);
+ })));
+ EXPECT_TRUE(command_->SetProgress(*CreateDictionaryValue("{'progress':18}"),
+ nullptr));
+}
+
+TEST_F(DeviceRegistrationInfoUpdateCommandTest, Complete) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPatch, command_url_,
+ HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
+ EXPECT_JSON_EQ(R"({"state":"done", "results":{"status":"Ok"}})",
+ *CreateDictionaryValue(data));
+ base::DictionaryValue json;
+ callback.Run(ReplyWithJson(200, json), nullptr);
})));
EXPECT_TRUE(
- command->SetResults(*CreateDictionaryValue("{'status': 'Ok'}"), nullptr));
- Mock::VerifyAndClearExpectations(&http_client_);
+ command_->Complete(*CreateDictionaryValue("{'status': 'Ok'}"), nullptr));
+}
- EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url,
+TEST_F(DeviceRegistrationInfoUpdateCommandTest, Cancel) {
+ EXPECT_CALL(
+ http_client_,
+ SendRequest(HttpClient::Method::kPatch, command_url_,
HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- EXPECT_JSON_EQ(R"({"state":"inProgress"})",
- *CreateDictionaryValue(data));
- base::DictionaryValue json;
- return ReplyWithJson(200, json);
- })))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
- EXPECT_JSON_EQ(R"({"progress":{"progress":18}})",
- *CreateDictionaryValue(data));
- base::DictionaryValue json;
- return ReplyWithJson(200, json);
- })));
- EXPECT_TRUE(
- command->SetProgress(*CreateDictionaryValue("{'progress':18}"), nullptr));
- Mock::VerifyAndClearExpectations(&http_client_);
-
- EXPECT_CALL(http_client_,
- MockSendRequest(
- http::kPatch, command_url,
- HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
- .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
+ .WillOnce(WithArgs<3, 4>(Invoke([](
+ const std::string& data,
+ const HttpClient::SendRequestCallback& callback) {
EXPECT_JSON_EQ(R"({"state":"cancelled"})",
*CreateDictionaryValue(data));
base::DictionaryValue json;
- return ReplyWithJson(200, json);
+ callback.Run(ReplyWithJson(200, json), nullptr);
})));
- command->Cancel();
- Mock::VerifyAndClearExpectations(&http_client_);
+ EXPECT_TRUE(command_->Cancel(nullptr));
}
} // namespace weave
diff --git a/libweave/src/empty.cc b/libweave/src/empty.cc
index 1ad31f8..108f420 100644
--- a/libweave/src/empty.cc
+++ b/libweave/src/empty.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/error.cc b/libweave/src/error.cc
index 92ee42e..89071df 100644
--- a/libweave/src/error.cc
+++ b/libweave/src/error.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/error_unittest.cc b/libweave/src/error_unittest.cc
index 36028fb..85633de 100644
--- a/libweave/src/error_unittest.cc
+++ b/libweave/src/error_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/http_constants.cc b/libweave/src/http_constants.cc
index e80aae4..ecea880 100644
--- a/libweave/src/http_constants.cc
+++ b/libweave/src/http_constants.cc
@@ -1,17 +1,15 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
#include "src/http_constants.h"
+#include <weave/enum_to_string.h>
+#include <weave/provider/http_client.h>
+
namespace weave {
namespace http {
-const char kGet[] = "GET";
-const char kPatch[] = "PATCH";
-const char kPost[] = "POST";
-const char kPut[] = "PUT";
-
const char kAuthorization[] = "Authorization";
const char kContentType[] = "Content-Type";
@@ -21,4 +19,21 @@
const char kWwwFormUrlEncoded[] = "application/x-www-form-urlencoded";
} // namespace http
+
+using provider::HttpClient;
+
+namespace {
+
+const weave::EnumToStringMap<HttpClient::Method>::Map kMapMethod[] = {
+ {HttpClient::Method::kGet, "GET"},
+ {HttpClient::Method::kPost, "POST"},
+ {HttpClient::Method::kPut, "PUT"},
+ {HttpClient::Method::kPatch, "PATCH"}};
+
+} // namespace
+
+template <>
+LIBWEAVE_EXPORT EnumToStringMap<HttpClient::Method>::EnumToStringMap()
+ : EnumToStringMap(kMapMethod) {}
+
} // namespace weave
diff --git a/libweave/src/http_constants.h b/libweave/src/http_constants.h
index f219a3c..ef84fc8 100644
--- a/libweave/src/http_constants.h
+++ b/libweave/src/http_constants.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,11 +18,6 @@
const int kServiceUnavailable = 503;
const int kNotSupported = 501;
-extern const char kGet[];
-extern const char kPatch[];
-extern const char kPost[];
-extern const char kPut[];
-
extern const char kAuthorization[];
extern const char kContentType[];
diff --git a/libweave/src/json_error_codes.cc b/libweave/src/json_error_codes.cc
index 2a53ab5..9bfaef0 100644
--- a/libweave/src/json_error_codes.cc
+++ b/libweave/src/json_error_codes.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/json_error_codes.h b/libweave/src/json_error_codes.h
index 193f6b2..5d3f07b 100644
--- a/libweave/src/json_error_codes.h
+++ b/libweave/src/json_error_codes.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/notification_channel.h b/libweave/src/notification/notification_channel.h
index 972629f..5fb7993 100644
--- a/libweave/src/notification/notification_channel.h
+++ b/libweave/src/notification/notification_channel.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/notification_delegate.h b/libweave/src/notification/notification_delegate.h
index ad49ab8..feb9d17 100644
--- a/libweave/src/notification/notification_delegate.h
+++ b/libweave/src/notification/notification_delegate.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/notification_parser.cc b/libweave/src/notification/notification_parser.cc
index 8f23757..25c525f 100644
--- a/libweave/src/notification/notification_parser.cc
+++ b/libweave/src/notification/notification_parser.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/notification_parser.h b/libweave/src/notification/notification_parser.h
index e77c9e7..ed62d10 100644
--- a/libweave/src/notification/notification_parser.h
+++ b/libweave/src/notification/notification_parser.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/notification_parser_unittest.cc b/libweave/src/notification/notification_parser_unittest.cc
index fae7e0d..146208f 100644
--- a/libweave/src/notification/notification_parser_unittest.cc
+++ b/libweave/src/notification/notification_parser_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/pull_channel.cc b/libweave/src/notification/pull_channel.cc
index f71066c..b192df6 100644
--- a/libweave/src/notification/pull_channel.cc
+++ b/libweave/src/notification/pull_channel.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/pull_channel.h b/libweave/src/notification/pull_channel.h
index 8f33f8f..a48b9f6 100644
--- a/libweave/src/notification/pull_channel.h
+++ b/libweave/src/notification/pull_channel.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xml_node.cc b/libweave/src/notification/xml_node.cc
index d838613..60f24b3 100644
--- a/libweave/src/notification/xml_node.cc
+++ b/libweave/src/notification/xml_node.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xml_node.h b/libweave/src/notification/xml_node.h
index 9977fb4..bb5a514 100644
--- a/libweave/src/notification/xml_node.h
+++ b/libweave/src/notification/xml_node.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xml_node_unittest.cc b/libweave/src/notification/xml_node_unittest.cc
index 09d25d3..34ccfb0 100644
--- a/libweave/src/notification/xml_node_unittest.cc
+++ b/libweave/src/notification/xml_node_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_channel.cc b/libweave/src/notification/xmpp_channel.cc
index fae2022..bca4c3b 100644
--- a/libweave/src/notification/xmpp_channel.cc
+++ b/libweave/src/notification/xmpp_channel.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -106,10 +106,12 @@
}
}
-void XmppChannel::OnMessageRead(size_t size) {
+void XmppChannel::OnMessageRead(size_t size, ErrorPtr error) {
+ read_pending_ = false;
+ if (error)
+ return Restart();
std::string msg(read_socket_data_.data(), size);
VLOG(2) << "Received XMPP packet: '" << msg << "'";
- read_pending_ = false;
if (!size)
return Restart();
@@ -286,14 +288,24 @@
LOG(INFO) << "Starting XMPP connection to " << kDefaultXmppHost << ":"
<< kDefaultXmppPort;
- network_->OpenSslSocket(
- kDefaultXmppHost, kDefaultXmppPort,
- base::Bind(&XmppChannel::OnSslSocketReady,
- task_ptr_factory_.GetWeakPtr()),
- base::Bind(&XmppChannel::OnSslError, task_ptr_factory_.GetWeakPtr()));
+ network_->OpenSslSocket(kDefaultXmppHost, kDefaultXmppPort,
+ base::Bind(&XmppChannel::OnSslSocketReady,
+ task_ptr_factory_.GetWeakPtr()));
}
-void XmppChannel::OnSslSocketReady(std::unique_ptr<Stream> stream) {
+void XmppChannel::OnSslSocketReady(std::unique_ptr<Stream> stream,
+ ErrorPtr error) {
+ if (error) {
+ LOG(ERROR) << "TLS handshake failed. Restarting XMPP connection";
+ backoff_entry_.InformOfRequest(false);
+
+ LOG(INFO) << "Delaying connection to XMPP server for "
+ << backoff_entry_.GetTimeUntilRelease();
+ return task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&XmppChannel::CreateSslSocket,
+ task_ptr_factory_.GetWeakPtr()),
+ backoff_entry_.GetTimeUntilRelease());
+ }
CHECK(XmppState::kConnecting == state_);
backoff_entry_.InformOfRequest(true);
stream_ = std::move(stream);
@@ -302,18 +314,6 @@
ScheduleRegularPing();
}
-void XmppChannel::OnSslError(const Error* error) {
- LOG(ERROR) << "TLS handshake failed. Restarting XMPP connection";
- backoff_entry_.InformOfRequest(false);
-
- LOG(INFO) << "Delaying connection to XMPP server for "
- << backoff_entry_.GetTimeUntilRelease();
- task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&XmppChannel::CreateSslSocket, task_ptr_factory_.GetWeakPtr()),
- backoff_entry_.GetTimeUntilRelease());
-}
-
void XmppChannel::SendMessage(const std::string& message) {
CHECK(stream_) << "No XMPP socket stream available";
if (write_pending_) {
@@ -327,13 +327,13 @@
write_pending_ = true;
stream_->Write(
write_socket_data_.data(), write_socket_data_.size(),
- base::Bind(&XmppChannel::OnMessageSent, task_ptr_factory_.GetWeakPtr()),
- base::Bind(&XmppChannel::OnWriteError, task_ptr_factory_.GetWeakPtr()));
+ base::Bind(&XmppChannel::OnMessageSent, task_ptr_factory_.GetWeakPtr()));
}
-void XmppChannel::OnMessageSent() {
- ErrorPtr error;
+void XmppChannel::OnMessageSent(ErrorPtr error) {
write_pending_ = false;
+ if (error)
+ return Restart();
if (queued_write_data_.empty()) {
WaitForMessage();
} else {
@@ -348,18 +348,7 @@
read_pending_ = true;
stream_->Read(
read_socket_data_.data(), read_socket_data_.size(),
- base::Bind(&XmppChannel::OnMessageRead, task_ptr_factory_.GetWeakPtr()),
- base::Bind(&XmppChannel::OnReadError, task_ptr_factory_.GetWeakPtr()));
-}
-
-void XmppChannel::OnReadError(const Error* error) {
- read_pending_ = false;
- Restart();
-}
-
-void XmppChannel::OnWriteError(const Error* error) {
- write_pending_ = false;
- Restart();
+ base::Bind(&XmppChannel::OnMessageRead, task_ptr_factory_.GetWeakPtr()));
}
std::string XmppChannel::GetName() const {
diff --git a/libweave/src/notification/xmpp_channel.h b/libweave/src/notification/xmpp_channel.h
index 27e1f1b..e6185d9 100644
--- a/libweave/src/notification/xmpp_channel.h
+++ b/libweave/src/notification/xmpp_channel.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -97,15 +97,12 @@
void RestartXmppStream();
void CreateSslSocket();
- void OnSslSocketReady(std::unique_ptr<Stream> stream);
- void OnSslError(const Error* error);
+ void OnSslSocketReady(std::unique_ptr<Stream> stream, ErrorPtr error);
void WaitForMessage();
- void OnMessageRead(size_t size);
- void OnMessageSent();
- void OnReadError(const Error* error);
- void OnWriteError(const Error* error);
+ void OnMessageRead(size_t size, ErrorPtr error);
+ void OnMessageSent(ErrorPtr error);
void Restart();
void CloseStream();
diff --git a/libweave/src/notification/xmpp_channel_unittest.cc b/libweave/src/notification/xmpp_channel_unittest.cc
index c6e0be1..674fe22 100644
--- a/libweave/src/notification/xmpp_channel_unittest.cc
+++ b/libweave/src/notification/xmpp_channel_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -88,8 +88,9 @@
stream_{new test::FakeStream{task_runner_}},
fake_stream_{stream_.get()} {}
- void Connect(const base::Callback<void(std::unique_ptr<Stream>)>& callback) {
- callback.Run(std::move(stream_));
+ void Connect(const base::Callback<void(std::unique_ptr<Stream>,
+ ErrorPtr error)>& callback) {
+ callback.Run(std::move(stream_), nullptr);
}
XmppState state() const { return state_; }
@@ -121,7 +122,7 @@
class XmppChannelTest : public ::testing::Test {
protected:
XmppChannelTest() {
- EXPECT_CALL(network_, OpenSslSocket("talk.google.com", 5223, _, _))
+ EXPECT_CALL(network_, OpenSslSocket("talk.google.com", 5223, _))
.WillOnce(
WithArgs<2>(Invoke(&xmpp_client_, &FakeXmppChannel::Connect)));
}
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler.cc b/libweave/src/notification/xmpp_iq_stanza_handler.cc
index 4b21e2d..8753030 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler.cc
+++ b/libweave/src/notification/xmpp_iq_stanza_handler.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler.h b/libweave/src/notification/xmpp_iq_stanza_handler.h
index 9a463d4..052e5d2 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler.h
+++ b/libweave/src/notification/xmpp_iq_stanza_handler.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
index 72f3719..052b7c5 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
+++ b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_stream_parser.cc b/libweave/src/notification/xmpp_stream_parser.cc
index 607e4d6..de3b8f1 100644
--- a/libweave/src/notification/xmpp_stream_parser.cc
+++ b/libweave/src/notification/xmpp_stream_parser.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_stream_parser.h b/libweave/src/notification/xmpp_stream_parser.h
index 43dfda7..41faaff 100644
--- a/libweave/src/notification/xmpp_stream_parser.h
+++ b/libweave/src/notification/xmpp_stream_parser.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/notification/xmpp_stream_parser_unittest.cc b/libweave/src/notification/xmpp_stream_parser_unittest.cc
index 3c9bade..f6466fe 100644
--- a/libweave/src/notification/xmpp_stream_parser_unittest.cc
+++ b/libweave/src/notification/xmpp_stream_parser_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index 309876a..b4ab288 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -31,7 +31,8 @@
const int kMaxDeviceRegistrationTimeMinutes = 5;
-Command* ReturnNotFound(const std::string& command_id, ErrorPtr* error) {
+CommandInstance* ReturnNotFound(const std::string& command_id,
+ ErrorPtr* error) {
Error::AddToPrintf(error, FROM_HERE, errors::kDomain, errors::kNotFound,
"Command not found, ID='%s'", command_id.c_str());
return nullptr;
@@ -153,8 +154,7 @@
void AddCommand(const base::DictionaryValue& command,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
+ const CommandDoneCallback& callback) override {
CHECK(user_info.scope() != AuthScope::kNone);
CHECK_NE(user_info.user_id(), 0u);
@@ -165,46 +165,41 @@
Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
errors::kInvalidParams, "Invalid role: '%s'",
str_scope.c_str());
- return error_callback.Run(error.get());
+ return callback.Run({}, std::move(error));
}
std::string id;
if (!command_manager_->AddCommand(command, role, &id, &error))
- return error_callback.Run(error.get());
+ return callback.Run({}, std::move(error));
command_owners_[id] = user_info.user_id();
- success_callback.Run(*command_manager_->FindCommand(id)->ToJson());
+ callback.Run(*command_manager_->FindCommand(id)->ToJson(), nullptr);
}
void GetCommand(const std::string& id,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
+ const CommandDoneCallback& callback) override {
CHECK(user_info.scope() != AuthScope::kNone);
ErrorPtr error;
auto command = GetCommandInternal(id, user_info, &error);
if (!command)
- return error_callback.Run(error.get());
- success_callback.Run(*command->ToJson());
+ return callback.Run({}, std::move(error));
+ callback.Run(*command->ToJson(), nullptr);
}
void CancelCommand(const std::string& id,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
+ const CommandDoneCallback& callback) override {
CHECK(user_info.scope() != AuthScope::kNone);
ErrorPtr error;
auto command = GetCommandInternal(id, user_info, &error);
- if (!command)
- return error_callback.Run(error.get());
-
- command->Cancel();
- success_callback.Run(*command->ToJson());
+ if (!command || !command->Cancel(&error))
+ return callback.Run({}, std::move(error));
+ callback.Run(*command->ToJson(), nullptr);
}
void ListCommands(const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) override {
+ const CommandDoneCallback& callback) override {
CHECK(user_info.scope() != AuthScope::kNone);
base::ListValue list_value;
@@ -219,7 +214,7 @@
base::DictionaryValue commands_json;
commands_json.Set("commands", list_value.DeepCopy());
- success_callback.Run(commands_json);
+ callback.Run(commands_json, nullptr);
}
private:
@@ -285,24 +280,31 @@
return;
}
- if (!device_->RegisterDevice(ticket_id, &error).empty()) {
- backoff_entry_.InformOfRequest(true);
- setup_state_ = SetupState(SetupState::kSuccess);
- return;
- }
-
- // Registration failed. Retry with backoff.
- backoff_entry_.InformOfRequest(false);
- task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&CloudDelegateImpl::CallManagerRegisterDevice,
- setup_weak_factory_.GetWeakPtr(), ticket_id, deadline),
- backoff_entry_.GetTimeUntilRelease());
+ device_->RegisterDevice(
+ ticket_id,
+ base::Bind(&CloudDelegateImpl::RegisterDeviceDone,
+ setup_weak_factory_.GetWeakPtr(), ticket_id, deadline));
}
- Command* GetCommandInternal(const std::string& command_id,
- const UserInfo& user_info,
- ErrorPtr* error) const {
+ void RegisterDeviceDone(const std::string& ticket_id,
+ const base::Time& deadline,
+ ErrorPtr error) {
+ if (error) {
+ // Registration failed. Retry with backoff.
+ backoff_entry_.InformOfRequest(false);
+ return task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&CloudDelegateImpl::CallManagerRegisterDevice,
+ setup_weak_factory_.GetWeakPtr(), ticket_id, deadline),
+ backoff_entry_.GetTimeUntilRelease());
+ }
+ backoff_entry_.InformOfRequest(true);
+ setup_state_ = SetupState(SetupState::kSuccess);
+ }
+
+ CommandInstance* GetCommandInternal(const std::string& command_id,
+ const UserInfo& user_info,
+ ErrorPtr* error) const {
if (user_info.scope() != AuthScope::kOwner) {
auto it = command_owners_.find(command_id);
if (it == command_owners_.end())
diff --git a/libweave/src/privet/cloud_delegate.h b/libweave/src/privet/cloud_delegate.h
index 74456d3..3875580 100644
--- a/libweave/src/privet/cloud_delegate.h
+++ b/libweave/src/privet/cloud_delegate.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -39,8 +39,9 @@
CloudDelegate();
virtual ~CloudDelegate();
- using CommandSuccessCallback =
- base::Callback<void(const base::DictionaryValue& commands)>;
+ using CommandDoneCallback =
+ base::Callback<void(const base::DictionaryValue& commands,
+ ErrorPtr error)>;
class Observer {
public:
@@ -107,25 +108,21 @@
// Adds command created from the given JSON representation.
virtual void AddCommand(const base::DictionaryValue& command,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const CommandDoneCallback& callback) = 0;
// Returns command with the given ID.
virtual void GetCommand(const std::string& id,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const CommandDoneCallback& callback) = 0;
// Cancels command with the given ID.
virtual void CancelCommand(const std::string& id,
const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const CommandDoneCallback& callback) = 0;
// Lists commands.
virtual void ListCommands(const UserInfo& user_info,
- const CommandSuccessCallback& success_callback,
- const ErrorCallback& error_callback) = 0;
+ const CommandDoneCallback& callback) = 0;
void AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
void RemoveObserver(Observer* observer) {
diff --git a/libweave/src/privet/constants.cc b/libweave/src/privet/constants.cc
index ade70af..3cc3e4a 100644
--- a/libweave/src/privet/constants.cc
+++ b/libweave/src/privet/constants.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/constants.h b/libweave/src/privet/constants.h
index 256cf9e..0668879 100644
--- a/libweave/src/privet/constants.h
+++ b/libweave/src/privet/constants.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/device_delegate.cc b/libweave/src/privet/device_delegate.cc
index 3b2e247..78aa3c4 100644
--- a/libweave/src/privet/device_delegate.cc
+++ b/libweave/src/privet/device_delegate.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -15,7 +15,8 @@
class DeviceDelegateImpl : public DeviceDelegate {
public:
- DeviceDelegateImpl() = default;
+ DeviceDelegateImpl(uint16_t http_port, uint16_t https_port)
+ : http_port_{http_port}, https_port_{https_port} {}
~DeviceDelegateImpl() override = default;
std::pair<uint16_t, uint16_t> GetHttpEnpoint() const override {
@@ -45,8 +46,11 @@
DeviceDelegate::~DeviceDelegate() {}
// static
-std::unique_ptr<DeviceDelegate> DeviceDelegate::CreateDefault() {
- return std::unique_ptr<DeviceDelegate>(new DeviceDelegateImpl());
+std::unique_ptr<DeviceDelegate> DeviceDelegate::CreateDefault(
+ uint16_t http_port,
+ uint16_t https_port) {
+ return std::unique_ptr<DeviceDelegate>(
+ new DeviceDelegateImpl(http_port, https_port));
}
} // namespace privet
diff --git a/libweave/src/privet/device_delegate.h b/libweave/src/privet/device_delegate.h
index 12996d7..3f13b22 100644
--- a/libweave/src/privet/device_delegate.h
+++ b/libweave/src/privet/device_delegate.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -38,7 +38,8 @@
virtual void SetHttpsPort(uint16_t port) = 0;
// Create default instance.
- static std::unique_ptr<DeviceDelegate> CreateDefault();
+ static std::unique_ptr<DeviceDelegate> CreateDefault(uint16_t http_port,
+ uint16_t https_port);
};
} // namespace privet
diff --git a/libweave/src/privet/mock_delegates.h b/libweave/src/privet/mock_delegates.h
index 48227ae..159fa09 100644
--- a/libweave/src/privet/mock_delegates.h
+++ b/libweave/src/privet/mock_delegates.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -154,25 +154,19 @@
MOCK_CONST_METHOD0(GetCloudId, std::string());
MOCK_CONST_METHOD0(GetState, const base::DictionaryValue&());
MOCK_CONST_METHOD0(GetCommandDef, const base::DictionaryValue&());
- MOCK_METHOD4(AddCommand,
+ MOCK_METHOD3(AddCommand,
void(const base::DictionaryValue&,
const UserInfo&,
- const CommandSuccessCallback&,
- const ErrorCallback&));
- MOCK_METHOD4(GetCommand,
+ const CommandDoneCallback&));
+ MOCK_METHOD3(GetCommand,
void(const std::string&,
const UserInfo&,
- const CommandSuccessCallback&,
- const ErrorCallback&));
- MOCK_METHOD4(CancelCommand,
+ const CommandDoneCallback&));
+ MOCK_METHOD3(CancelCommand,
void(const std::string&,
const UserInfo&,
- const CommandSuccessCallback&,
- const ErrorCallback&));
- MOCK_METHOD3(ListCommands,
- void(const UserInfo&,
- const CommandSuccessCallback&,
- const ErrorCallback&));
+ const CommandDoneCallback&));
+ MOCK_METHOD2(ListCommands, void(const UserInfo&, const CommandDoneCallback&));
MockCloudDelegate() {
EXPECT_CALL(*this, GetDeviceId()).WillRepeatedly(Return("TestId"));
diff --git a/libweave/src/privet/openssl_utils.cc b/libweave/src/privet/openssl_utils.cc
index c590a34..2a98fa8 100644
--- a/libweave/src/privet/openssl_utils.cc
+++ b/libweave/src/privet/openssl_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/openssl_utils.h b/libweave/src/privet/openssl_utils.h
index 0206681..a67d023 100644
--- a/libweave/src/privet/openssl_utils.h
+++ b/libweave/src/privet/openssl_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/privet_handler.cc b/libweave/src/privet/privet_handler.cc
index 47ee8f7..2180cad 100644
--- a/libweave/src/privet/privet_handler.cc
+++ b/libweave/src/privet/privet_handler.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -23,6 +23,7 @@
#include "src/privet/security_delegate.h"
#include "src/privet/wifi_delegate.h"
#include "src/string_utils.h"
+#include "src/utils.h"
namespace weave {
namespace privet {
@@ -90,8 +91,6 @@
const char kAuthorizationHeaderPrefix[] = "Privet";
-const char kErrorCodeKey[] = "code";
-const char kErrorMessageKey[] = "message";
const char kErrorDebugInfoKey[] = "debugInfo";
const char kSetupStartSsidKey[] = "ssid";
@@ -156,13 +155,6 @@
return SplitAtFirst(auth_header, " ", true).second;
}
-std::unique_ptr<base::DictionaryValue> ErrorInfoToJson(const Error& error) {
- std::unique_ptr<base::DictionaryValue> output{new base::DictionaryValue};
- output->SetString(kErrorMessageKey, error.GetMessage());
- output->SetString(kErrorCodeKey, error.GetCode());
- return output;
-}
-
// Creates JSON similar to GCD server error format.
std::unique_ptr<base::DictionaryValue> ErrorToJson(const Error& error) {
std::unique_ptr<base::DictionaryValue> output{ErrorInfoToJson(error)};
@@ -182,7 +174,7 @@
}
template <class T>
-void SetState(const T& state, base::DictionaryValue* parent) {
+void SetStateProperties(const T& state, base::DictionaryValue* parent) {
if (!state.error()) {
parent->SetString(kStatusKey, EnumToString(state.status()));
return;
@@ -206,23 +198,20 @@
}
void OnCommandRequestSucceeded(const PrivetHandler::RequestCallback& callback,
- const base::DictionaryValue& output) {
- callback.Run(http::kOk, output);
-}
+ const base::DictionaryValue& output,
+ ErrorPtr error) {
+ if (!error)
+ return callback.Run(http::kOk, output);
-void OnCommandRequestFailed(const PrivetHandler::RequestCallback& callback,
- const Error* error) {
if (error->HasError("gcd", "unknown_command")) {
- ErrorPtr new_error = error->Clone();
- Error::AddTo(&new_error, FROM_HERE, errors::kDomain, errors::kNotFound,
+ Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kNotFound,
"Unknown command ID");
- return ReturnError(*new_error, callback);
+ return ReturnError(*error, callback);
}
if (error->HasError("gcd", "access_denied")) {
- ErrorPtr new_error = error->Clone();
- Error::AddTo(&new_error, FROM_HERE, errors::kDomain, errors::kAccessDenied,
+ Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kAccessDenied,
error->GetMessage());
- return ReturnError(*new_error, callback);
+ return ReturnError(*error, callback);
}
return ReturnError(*error, callback);
}
@@ -330,7 +319,7 @@
DCHECK(!state.IsStatusEqual(ConnectionState::kOnline));
result->SetString(kInfoWifiHostedSsidKey, hosted_ssid);
}
- SetState(state, result.get());
+ SetStateProperties(state, result.get());
return result;
}
@@ -338,7 +327,7 @@
const CloudDelegate& cloud) {
std::unique_ptr<base::DictionaryValue> gcd(new base::DictionaryValue());
gcd->SetString(kInfoIdKey, cloud.GetCloudId());
- SetState(cloud.GetConnectionState(), gcd.get());
+ SetStateProperties(cloud.GetConnectionState(), gcd.get());
return gcd;
}
@@ -351,6 +340,18 @@
} // namespace
+std::vector<std::string> PrivetHandler::GetHttpPaths() const {
+ // TODO(vitalybuka): Should be subset only.
+ return GetHttpsPaths();
+}
+
+std::vector<std::string> PrivetHandler::GetHttpsPaths() const {
+ std::vector<std::string> result;
+ for (const auto& pair : handlers_)
+ result.push_back(pair.first);
+ return result;
+}
+
PrivetHandler::PrivetHandler(CloudDelegate* cloud,
DeviceDelegate* device,
SecurityDelegate* security,
@@ -718,7 +719,7 @@
if (!state.IsStatusEqual(SetupState::kNone)) {
base::DictionaryValue* gcd = new base::DictionaryValue;
output.Set(kGcdKey, gcd);
- SetState(state, gcd);
+ SetStateProperties(state, gcd);
if (state.IsStatusEqual(SetupState::kSuccess))
gcd->SetString(kInfoIdKey, cloud_->GetCloudId());
}
@@ -728,7 +729,7 @@
if (!state.IsStatusEqual(SetupState::kNone)) {
base::DictionaryValue* wifi = new base::DictionaryValue;
output.Set(kWifiKey, wifi);
- SetState(state, wifi);
+ SetStateProperties(state, wifi);
if (state.IsStatusEqual(SetupState::kSuccess))
wifi->SetString(kInfoWifiSsidKey, wifi_->GetCurrentlyConnectedSsid());
}
@@ -764,8 +765,7 @@
const UserInfo& user_info,
const RequestCallback& callback) {
cloud_->AddCommand(input, user_info,
- base::Bind(&OnCommandRequestSucceeded, callback),
- base::Bind(&OnCommandRequestFailed, callback));
+ base::Bind(&OnCommandRequestSucceeded, callback));
}
void PrivetHandler::HandleCommandsStatus(const base::DictionaryValue& input,
@@ -780,16 +780,14 @@
return ReturnError(*error, callback);
}
cloud_->GetCommand(id, user_info,
- base::Bind(&OnCommandRequestSucceeded, callback),
- base::Bind(&OnCommandRequestFailed, callback));
+ base::Bind(&OnCommandRequestSucceeded, callback));
}
void PrivetHandler::HandleCommandsList(const base::DictionaryValue& input,
const UserInfo& user_info,
const RequestCallback& callback) {
cloud_->ListCommands(user_info,
- base::Bind(&OnCommandRequestSucceeded, callback),
- base::Bind(&OnCommandRequestFailed, callback));
+ base::Bind(&OnCommandRequestSucceeded, callback));
}
void PrivetHandler::HandleCommandsCancel(const base::DictionaryValue& input,
@@ -804,8 +802,7 @@
return ReturnError(*error, callback);
}
cloud_->CancelCommand(id, user_info,
- base::Bind(&OnCommandRequestSucceeded, callback),
- base::Bind(&OnCommandRequestFailed, callback));
+ base::Bind(&OnCommandRequestSucceeded, callback));
}
} // namespace privet
diff --git a/libweave/src/privet/privet_handler.h b/libweave/src/privet/privet_handler.h
index ce32485..7818d87 100644
--- a/libweave/src/privet/privet_handler.h
+++ b/libweave/src/privet/privet_handler.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -48,6 +48,9 @@
void OnCommandDefsChanged() override;
void OnStateChanged() override;
+ std::vector<std::string> GetHttpPaths() const;
+ std::vector<std::string> GetHttpsPaths() const;
+
// Handles HTTP/HTTPS Privet request.
// |api| is the path from the HTTP request, e.g /privet/info.
// |auth_header| is the Authentication header from HTTP request.
diff --git a/libweave/src/privet/privet_handler_unittest.cc b/libweave/src/privet/privet_handler_unittest.cc
index 6829984..6f123e2 100644
--- a/libweave/src/privet/privet_handler_unittest.cc
+++ b/libweave/src/privet/privet_handler_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -24,6 +24,7 @@
using testing::Invoke;
using testing::Return;
using testing::SetArgPointee;
+using testing::WithArgs;
namespace weave {
namespace privet {
@@ -648,8 +649,11 @@
base::DictionaryValue command;
LoadTestJson(kInput, &command);
LoadTestJson("{'id':'5'}", &command);
- EXPECT_CALL(cloud_, AddCommand(_, _, _, _))
- .WillOnce(RunCallback<2, const base::DictionaryValue&>(command));
+ EXPECT_CALL(cloud_, AddCommand(_, _, _))
+ .WillOnce(WithArgs<2>(Invoke(
+ [&command](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run(command, nullptr);
+ })));
EXPECT_PRED2(IsEqualJson, "{'name':'test', 'id':'5'}",
HandleRequest("/privet/v3/commands/execute", kInput));
@@ -660,16 +664,22 @@
base::DictionaryValue command;
LoadTestJson(kInput, &command);
LoadTestJson("{'name':'test'}", &command);
- EXPECT_CALL(cloud_, GetCommand(_, _, _, _))
- .WillOnce(RunCallback<2, const base::DictionaryValue&>(command));
+ EXPECT_CALL(cloud_, GetCommand(_, _, _))
+ .WillOnce(WithArgs<2>(Invoke(
+ [&command](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run(command, nullptr);
+ })));
EXPECT_PRED2(IsEqualJson, "{'name':'test', 'id':'5'}",
HandleRequest("/privet/v3/commands/status", kInput));
ErrorPtr error;
Error::AddTo(&error, FROM_HERE, errors::kDomain, "notFound", "");
- EXPECT_CALL(cloud_, GetCommand(_, _, _, _))
- .WillOnce(RunCallback<3>(error.get()));
+ EXPECT_CALL(cloud_, GetCommand(_, _, _))
+ .WillOnce(WithArgs<2>(
+ Invoke([&error](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run({}, std::move(error));
+ })));
EXPECT_PRED2(IsEqualError, CodeWithReason(404, "notFound"),
HandleRequest("/privet/v3/commands/status", "{'id': '15'}"));
@@ -679,16 +689,22 @@
const char kExpected[] = "{'id': '5', 'name':'test', 'state':'cancelled'}";
base::DictionaryValue command;
LoadTestJson(kExpected, &command);
- EXPECT_CALL(cloud_, CancelCommand(_, _, _, _))
- .WillOnce(RunCallback<2, const base::DictionaryValue&>(command));
+ EXPECT_CALL(cloud_, CancelCommand(_, _, _))
+ .WillOnce(WithArgs<2>(Invoke(
+ [&command](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run(command, nullptr);
+ })));
EXPECT_PRED2(IsEqualJson, kExpected,
HandleRequest("/privet/v3/commands/cancel", "{'id': '8'}"));
ErrorPtr error;
Error::AddTo(&error, FROM_HERE, errors::kDomain, "notFound", "");
- EXPECT_CALL(cloud_, CancelCommand(_, _, _, _))
- .WillOnce(RunCallback<3>(error.get()));
+ EXPECT_CALL(cloud_, CancelCommand(_, _, _))
+ .WillOnce(WithArgs<2>(
+ Invoke([&error](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run({}, std::move(error));
+ })));
EXPECT_PRED2(IsEqualError, CodeWithReason(404, "notFound"),
HandleRequest("/privet/v3/commands/cancel", "{'id': '11'}"));
@@ -704,8 +720,11 @@
base::DictionaryValue commands;
LoadTestJson(kExpected, &commands);
- EXPECT_CALL(cloud_, ListCommands(_, _, _))
- .WillOnce(RunCallback<1, const base::DictionaryValue&>(commands));
+ EXPECT_CALL(cloud_, ListCommands(_, _))
+ .WillOnce(WithArgs<1>(Invoke(
+ [&commands](const CloudDelegate::CommandDoneCallback& callback) {
+ callback.Run(commands, nullptr);
+ })));
EXPECT_PRED2(IsEqualJson, kExpected,
HandleRequest("/privet/v3/commands/list", "{}"));
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index ac47c6c..7a97570 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -17,6 +17,7 @@
#include <base/values.h>
#include <weave/provider/network.h>
+#include "src/bind_lambda.h"
#include "src/device_registration_info.h"
#include "src/http_constants.h"
#include "src/privet/cloud_delegate.h"
@@ -24,6 +25,7 @@
#include "src/privet/device_delegate.h"
#include "src/privet/privet_handler.h"
#include "src/privet/publisher.h"
+#include "src/streams.h"
#include "src/string_utils.h"
namespace weave {
@@ -35,12 +37,11 @@
using provider::HttpServer;
using provider::Wifi;
-Manager::Manager() {}
+Manager::Manager(TaskRunner* task_runner) : task_runner_{task_runner} {}
Manager::~Manager() {}
-void Manager::Start(TaskRunner* task_runner,
- Network* network,
+void Manager::Start(Network* network,
DnsServiceDiscovery* dns_sd,
HttpServer* http_server,
Wifi* wifi,
@@ -49,16 +50,19 @@
StateManager* state_manager) {
disable_security_ = device->GetSettings().disable_security;
- device_ = DeviceDelegate::CreateDefault();
- cloud_ = CloudDelegate::CreateDefault(task_runner, device, command_manager,
+ device_ = DeviceDelegate::CreateDefault(http_server->GetHttpPort(),
+ http_server->GetHttpsPort());
+ cloud_ = CloudDelegate::CreateDefault(task_runner_, device, command_manager,
state_manager);
cloud_observer_.Add(cloud_.get());
security_.reset(new SecurityManager(
device->GetSettings().secret, device->GetSettings().pairing_modes,
- device->GetSettings().embedded_code, disable_security_, task_runner));
+ device->GetSettings().embedded_code, disable_security_, task_runner_));
+ security_->SetCertificateFingerprint(
+ http_server->GetHttpsCertificateFingerprint());
if (device->GetSettings().secret.empty()) {
// TODO(vitalybuka): Post all Config::Transaction to avoid following.
- task_runner->PostDelayedTask(
+ task_runner_->PostDelayedTask(
FROM_HERE,
base::Bind(&Manager::SaveDeviceSecret, weak_ptr_factory_.GetWeakPtr(),
base::Unretained(device->GetMutableConfig())),
@@ -70,7 +74,7 @@
if (wifi && device->GetSettings().wifi_auto_setup_enabled) {
VLOG(1) << "Enabling WiFi bootstrapping.";
wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
- device->GetMutableConfig(), task_runner, network, wifi, cloud_.get()));
+ device->GetMutableConfig(), task_runner_, network, wifi, cloud_.get()));
wifi_bootstrap_manager_->Init();
}
@@ -83,11 +87,17 @@
security_.get(),
wifi_bootstrap_manager_.get()));
- http_server->AddOnStateChangedCallback(base::Bind(
- &Manager::OnHttpServerStatusChanged, weak_ptr_factory_.GetWeakPtr()));
- http_server->AddRequestHandler("/privet/",
- base::Bind(&Manager::PrivetRequestHandler,
- weak_ptr_factory_.GetWeakPtr()));
+ for (const auto& path : privet_handler_->GetHttpPaths()) {
+ http_server->AddHttpRequestHandler(
+ path, base::Bind(&Manager::PrivetRequestHandler,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ for (const auto& path : privet_handler_->GetHttpsPaths()) {
+ http_server->AddHttpsRequestHandler(
+ path, base::Bind(&Manager::PrivetRequestHandler,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
}
std::string Manager::GetCurrentlyConnectedSsid() const {
@@ -107,43 +117,52 @@
}
void Manager::PrivetRequestHandler(
- const HttpServer::Request& request,
- const HttpServer::OnReplyCallback& callback) {
- std::string auth_header = request.GetFirstHeader(http::kAuthorization);
- if (auth_header.empty() && disable_security_)
- auth_header = "Privet anonymous";
- std::string data(request.GetData().begin(), request.GetData().end());
- VLOG(3) << "Input: " << data;
-
- base::DictionaryValue empty;
- std::unique_ptr<base::Value> value;
- const base::DictionaryValue* dictionary = ∅
+ std::unique_ptr<provider::HttpServer::Request> req) {
+ std::shared_ptr<provider::HttpServer::Request> request{std::move(req)};
std::string content_type =
- SplitAtFirst(request.GetFirstHeader(http::kContentType), ";", true).first;
- if (content_type == http::kJson) {
- value.reset(base::JSONReader::Read(data).release());
- if (value)
- value->GetAsDictionary(&dictionary);
- }
+ SplitAtFirst(request->GetFirstHeader(http::kContentType), ";", true)
+ .first;
- privet_handler_->HandleRequest(
- request.GetPath(), auth_header, dictionary,
- base::Bind(&Manager::PrivetResponseHandler,
- weak_ptr_factory_.GetWeakPtr(), callback));
+ return PrivetRequestHandlerWithData(request, content_type == http::kJson
+ ? request->GetData()
+ : std::string{});
}
-void Manager::PrivetResponseHandler(const HttpServer::OnReplyCallback& callback,
- int status,
- const base::DictionaryValue& output) {
+void Manager::PrivetRequestHandlerWithData(
+ const std::shared_ptr<provider::HttpServer::Request>& request,
+ const std::string& data) {
+ std::string auth_header = request->GetFirstHeader(http::kAuthorization);
+ if (auth_header.empty() && disable_security_)
+ auth_header = "Privet anonymous";
+
+ base::DictionaryValue empty;
+ auto value = base::JSONReader::Read(data);
+ const base::DictionaryValue* dictionary = ∅
+ if (value)
+ value->GetAsDictionary(&dictionary);
+
+ VLOG(3) << "Input: " << *dictionary;
+
+ privet_handler_->HandleRequest(
+ request->GetPath(), auth_header, dictionary,
+ base::Bind(&Manager::PrivetResponseHandler,
+ weak_ptr_factory_.GetWeakPtr(), request));
+}
+
+void Manager::PrivetResponseHandler(
+ const std::shared_ptr<provider::HttpServer::Request>& request,
+ int status,
+ const base::DictionaryValue& output) {
VLOG(3) << "status: " << status << ", Output: " << output;
std::string data;
base::JSONWriter::WriteWithOptions(
output, base::JSONWriter::OPTIONS_PRETTY_PRINT, &data);
- callback.Run(status, data, http::kJson);
+ request->SendReply(status, data, http::kJson);
}
void Manager::OnChanged() {
+ VLOG(1) << "Manager::OnChanged";
if (publisher_)
publisher_->Update();
}
@@ -152,16 +171,6 @@
OnChanged();
}
-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(server.GetHttpsPort());
- security_->SetCertificateFingerprint(server.GetHttpsCertificateFingerprint());
-}
-
void Manager::SaveDeviceSecret(Config* config) {
Config::Transaction transaction(config);
transaction.set_secret(security_->GetSecret());
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 35fb6f9..3174ca0 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -44,11 +44,10 @@
class Manager : public CloudDelegate::Observer {
public:
- Manager();
+ explicit Manager(provider::TaskRunner* task_runner);
~Manager() override;
- void Start(provider::TaskRunner* task_runner,
- provider::Network* network,
+ void Start(provider::Network* network,
provider::DnsServiceDiscovery* dns_sd,
provider::HttpServer* http_server,
provider::Wifi* wifi,
@@ -67,21 +66,24 @@
void OnDeviceInfoChanged() override;
void PrivetRequestHandler(
- const provider::HttpServer::Request& request,
- const provider::HttpServer::OnReplyCallback& callback);
+ std::unique_ptr<provider::HttpServer::Request> request);
+
+ void PrivetRequestHandlerWithData(
+ const std::shared_ptr<provider::HttpServer::Request>& request,
+ const std::string& data);
void PrivetResponseHandler(
- const provider::HttpServer::OnReplyCallback& callback,
+ const std::shared_ptr<provider::HttpServer::Request>& request,
int status,
const base::DictionaryValue& output);
void OnChanged();
void OnConnectivityChanged();
- void OnHttpServerStatusChanged(const provider::HttpServer& server);
void SaveDeviceSecret(Config* config);
bool disable_security_{false};
+ provider::TaskRunner* task_runner_{nullptr};
std::unique_ptr<CloudDelegate> cloud_;
std::unique_ptr<DeviceDelegate> device_;
std::unique_ptr<SecurityManager> security_;
diff --git a/libweave/src/privet/privet_types.cc b/libweave/src/privet/privet_types.cc
index 8d380f0..ab026e1 100644
--- a/libweave/src/privet/privet_types.cc
+++ b/libweave/src/privet/privet_types.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -58,9 +58,9 @@
const EnumToStringMap<Network::State>::Map kNetworkStateMap[] = {
{Network::State::kOffline, "offline"},
- {Network::State::kFailure, "failure"},
+ {Network::State::kError, "error"},
{Network::State::kConnecting, "connecting"},
- {Network::State::kConnected, "connected"},
+ {Network::State::kOnline, "online"},
};
} // namespace
diff --git a/libweave/src/privet/privet_types.h b/libweave/src/privet/privet_types.h
index 9c05be1..bc8e400 100644
--- a/libweave/src/privet/privet_types.h
+++ b/libweave/src/privet/privet_types.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/publisher.cc b/libweave/src/privet/publisher.cc
index 37da735..f323dac 100644
--- a/libweave/src/privet/publisher.cc
+++ b/libweave/src/privet/publisher.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -50,7 +50,7 @@
std::string model_id{cloud_->GetModelId()};
DCHECK_EQ(model_id.size(), 5U);
- VLOG(1) << "Starting peerd advertising.";
+ VLOG(2) << "DNS-SD update requested";
const uint16_t port = device_->GetHttpEnpoint().first;
DCHECK_NE(port, 0);
@@ -77,6 +77,7 @@
auto new_data = std::make_pair(port, txt_record);
if (published_ == new_data)
return;
+ VLOG(1) << "Updating DNS-SD";
published_ = new_data;
dns_sd_->PublishService(kPrivetServiceType, port, txt_record);
}
@@ -85,7 +86,7 @@
if (!published_.first)
return;
published_ = {};
- VLOG(1) << "Stopping service publishing.";
+ VLOG(1) << "Stopping service publishing";
dns_sd_->StopPublishing(kPrivetServiceType);
}
diff --git a/libweave/src/privet/publisher.h b/libweave/src/privet/publisher.h
index ce417a7..5de3345 100644
--- a/libweave/src/privet/publisher.h
+++ b/libweave/src/privet/publisher.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/security_delegate.h b/libweave/src/privet/security_delegate.h
index e56dee7..1d28ba3 100644
--- a/libweave/src/privet/security_delegate.h
+++ b/libweave/src/privet/security_delegate.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/security_manager.cc b/libweave/src/privet/security_manager.cc
index 9b8e853..8b1500c 100644
--- a/libweave/src/privet/security_manager.cc
+++ b/libweave/src/privet/security_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -18,11 +18,11 @@
#include <base/time/time.h>
#include <weave/provider/task_runner.h>
-#include "external/crypto/p224_spake.h"
#include "src/data_encoding.h"
#include "src/privet/constants.h"
#include "src/privet/openssl_utils.h"
#include "src/string_utils.h"
+#include "third_party/chromium/crypto/p224_spake.h"
namespace weave {
namespace privet {
diff --git a/libweave/src/privet/security_manager.h b/libweave/src/privet/security_manager.h
index c1adfc8..c99201b 100644
--- a/libweave/src/privet/security_manager.h
+++ b/libweave/src/privet/security_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/security_manager_unittest.cc b/libweave/src/privet/security_manager_unittest.cc
index 7e4ea05..7229710 100644
--- a/libweave/src/privet/security_manager_unittest.cc
+++ b/libweave/src/privet/security_manager_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -21,9 +21,9 @@
#include <gtest/gtest.h>
#include <weave/provider/test/fake_task_runner.h>
-#include "external/crypto/p224_spake.h"
#include "src/data_encoding.h"
#include "src/privet/openssl_utils.h"
+#include "third_party/chromium/crypto/p224_spake.h"
using testing::Eq;
using testing::_;
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index 7e439e3..255ae6b 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -59,7 +59,7 @@
}
void WifiBootstrapManager::StartBootstrapping() {
- if (network_->GetConnectionState() == Network::State::kConnected) {
+ if (network_->GetConnectionState() == Network::State::kOnline) {
// If one of the devices we monitor for connectivity is online, we need not
// start an AP. For most devices, this is a situation which happens in
// testing when we have an ethernet connection. If you need to always
@@ -96,22 +96,12 @@
<< ", pass=" << passphrase << ").";
UpdateState(State::kConnecting);
task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectError,
- tasks_weak_factory_.GetWeakPtr(), nullptr),
+ FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
+ tasks_weak_factory_.GetWeakPtr()),
base::TimeDelta::FromMinutes(3));
wifi_->Connect(ssid, passphrase,
- base::Bind(&WifiBootstrapManager::OnConnectSuccess,
- tasks_weak_factory_.GetWeakPtr(), ssid),
- base::Bind(&WifiBootstrapManager::OnConnectError,
- tasks_weak_factory_.GetWeakPtr()));
-}
-
-void WifiBootstrapManager::OnConnectError(const Error* error) {
- ErrorPtr new_error = error ? error->Clone() : nullptr;
- Error::AddTo(&new_error, FROM_HERE, errors::kDomain, errors::kInvalidState,
- "Failed to connect to provided network");
- setup_state_ = SetupState{std::move(new_error)};
- StartBootstrapping();
+ base::Bind(&WifiBootstrapManager::OnConnectDone,
+ tasks_weak_factory_.GetWeakPtr(), ssid));
}
void WifiBootstrapManager::EndConnecting() {}
@@ -122,7 +112,7 @@
// connectivity state. See OnConnectivityChange().
UpdateState(State::kMonitoring);
- if (network_->GetConnectionState() == Network::State::kConnected) {
+ if (network_->GetConnectionState() == Network::State::kOnline) {
monitor_until_ = {};
} else {
if (monitor_until_.is_null()) {
@@ -204,7 +194,14 @@
return {WifiType::kWifi24};
}
-void WifiBootstrapManager::OnConnectSuccess(const std::string& ssid) {
+void WifiBootstrapManager::OnConnectDone(const std::string& ssid,
+ ErrorPtr error) {
+ if (error) {
+ Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kInvalidState,
+ "Failed to connect to provided network");
+ setup_state_ = SetupState{std::move(error)};
+ return StartBootstrapping();
+ }
VLOG(1) << "Wifi was connected successfully";
Config::Transaction change{config_};
change.set_last_configured_ssid(ssid);
@@ -213,6 +210,14 @@
StartMonitoring();
}
+void WifiBootstrapManager::OnConnectTimeout() {
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kInvalidState,
+ "Timeout connecting to provided network");
+ setup_state_ = SetupState{std::move(error)};
+ return StartBootstrapping();
+}
+
void WifiBootstrapManager::OnBootstrapTimeout() {
VLOG(1) << "Bootstrapping has timed out.";
StartMonitoring();
@@ -225,7 +230,7 @@
if (state_ == State::kMonitoring || // Reset monitoring timeout.
(state_ != State::kDisabled &&
- network_->GetConnectionState() == Network::State::kConnected)) {
+ network_->GetConnectionState() == Network::State::kOnline)) {
StartMonitoring();
}
}
@@ -246,7 +251,7 @@
case Network::State::kOffline:
connection_state_ = ConnectionState{ConnectionState::kOffline};
return;
- case Network::State::kFailure: {
+ case Network::State::kError: {
// TODO(wiley) Pull error information from somewhere.
ErrorPtr error;
Error::AddTo(&error, FROM_HERE, errors::kDomain, errors::kInvalidState,
@@ -257,7 +262,7 @@
case Network::State::kConnecting:
connection_state_ = ConnectionState{ConnectionState::kConnecting};
return;
- case Network::State::kConnected:
+ case Network::State::kOnline:
connection_state_ = ConnectionState{ConnectionState::kOnline};
return;
}
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index 6423b9d..4ff2d3e 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -87,8 +87,8 @@
// to return to monitoring mode periodically in case our connectivity issues
// were temporary.
void OnBootstrapTimeout();
- void OnConnectSuccess(const std::string& ssid);
- void OnConnectError(const Error* error);
+ void OnConnectDone(const std::string& ssid, ErrorPtr error);
+ void OnConnectTimeout();
void OnConnectivityChange();
void OnMonitorTimeout();
void UpdateConnectionState();
diff --git a/libweave/src/privet/wifi_delegate.h b/libweave/src/privet/wifi_delegate.h
index 0cdf219..ae5e520 100644
--- a/libweave/src/privet/wifi_delegate.h
+++ b/libweave/src/privet/wifi_delegate.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/wifi_ssid_generator.cc b/libweave/src/privet/wifi_ssid_generator.cc
index 4a1a589..a049c20 100644
--- a/libweave/src/privet/wifi_ssid_generator.cc
+++ b/libweave/src/privet/wifi_ssid_generator.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/wifi_ssid_generator.h b/libweave/src/privet/wifi_ssid_generator.h
index 90f1493..d720fb5 100644
--- a/libweave/src/privet/wifi_ssid_generator.h
+++ b/libweave/src/privet/wifi_ssid_generator.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/privet/wifi_ssid_generator_unittest.cc b/libweave/src/privet/wifi_ssid_generator_unittest.cc
index 85e2c1b..3bd561f 100644
--- a/libweave/src/privet/wifi_ssid_generator_unittest.cc
+++ b/libweave/src/privet/wifi_ssid_generator_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/registration_status.cc b/libweave/src/registration_status.cc
index 167eb0f..852f3ea 100644
--- a/libweave/src/registration_status.cc
+++ b/libweave/src/registration_status.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/error_codes.cc b/libweave/src/states/error_codes.cc
index 4cf1699..4b12a45 100644
--- a/libweave/src/states/error_codes.cc
+++ b/libweave/src/states/error_codes.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/error_codes.h b/libweave/src/states/error_codes.h
index c5f876f..676a199 100644
--- a/libweave/src/states/error_codes.h
+++ b/libweave/src/states/error_codes.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/mock_state_change_queue_interface.h b/libweave/src/states/mock_state_change_queue_interface.h
index 2eab88a..c3f50c0 100644
--- a/libweave/src/states/mock_state_change_queue_interface.h
+++ b/libweave/src/states/mock_state_change_queue_interface.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_change_queue.cc b/libweave/src/states/state_change_queue.cc
index 4a2906c..288dadc 100644
--- a/libweave/src/states/state_change_queue.cc
+++ b/libweave/src/states/state_change_queue.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_change_queue.h b/libweave/src/states/state_change_queue.h
index a4b85d1..00b827f 100644
--- a/libweave/src/states/state_change_queue.h
+++ b/libweave/src/states/state_change_queue.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_change_queue_interface.h b/libweave/src/states/state_change_queue_interface.h
index a50d0ba..e3b3650 100644
--- a/libweave/src/states/state_change_queue_interface.h
+++ b/libweave/src/states/state_change_queue_interface.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_change_queue_unittest.cc b/libweave/src/states/state_change_queue_unittest.cc
index 427ff5b..9f26071 100644
--- a/libweave/src/states/state_change_queue_unittest.cc
+++ b/libweave/src/states/state_change_queue_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc
index cd94736..f629aa1 100644
--- a/libweave/src/states/state_manager.cc
+++ b/libweave/src/states/state_manager.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -6,7 +6,6 @@
#include <base/logging.h>
#include <base/values.h>
-#include <weave/provider/config_store.h>
#include "src/json_error_codes.h"
#include "src/states/error_codes.h"
@@ -54,22 +53,14 @@
callback.Run(); // Force to read current state.
}
-void StateManager::Startup(provider::ConfigStore* config_store) {
+void StateManager::Startup() {
LOG(INFO) << "Initializing StateManager.";
// Load standard device state definition.
CHECK(LoadBaseStateDefinition(kBaseStateDefs, nullptr));
- // Load component-specific device state definitions.
- for (const auto& state_def : config_store->LoadStateDefs())
- CHECK(LoadStateDefinition(state_def, nullptr));
-
// Load standard device state defaults.
- CHECK(LoadStateDefaults(kBaseStateDefaults, nullptr));
-
- // Load component-specific device state defaults.
- for (const auto& json : config_store->LoadStateDefaults())
- CHECK(LoadStateDefaults(json, nullptr));
+ CHECK(SetPropertiesFromJson(kBaseStateDefaults, nullptr));
for (const auto& cb : on_changed_)
cb.Run();
@@ -85,23 +76,6 @@
return dict;
}
-bool StateManager::SetProperties(const base::DictionaryValue& property_set,
- ErrorPtr* error) {
- base::Time timestamp = base::Time::Now();
- bool all_success = true;
- for (base::DictionaryValue::Iterator it(property_set); !it.IsAtEnd();
- it.Advance()) {
- if (!SetPropertyValue(it.key(), it.value(), timestamp, error)) {
- // Remember that an error occurred but keep going and update the rest of
- // the properties if possible.
- all_success = false;
- }
- }
- for (const auto& cb : on_changed_)
- cb.Run();
- return all_success;
-}
-
bool StateManager::SetProperty(const std::string& name,
const base::Value& value,
ErrorPtr* error) {
@@ -176,8 +150,8 @@
bool StateManager::LoadStateDefinition(const base::DictionaryValue& dict,
ErrorPtr* error) {
- base::DictionaryValue::Iterator iter(dict);
- while (!iter.IsAtEnd()) {
+ for (base::DictionaryValue::Iterator iter(dict); !iter.IsAtEnd();
+ iter.Advance()) {
std::string package_name = iter.key();
if (package_name.empty()) {
Error::AddTo(error, FROM_HERE, errors::kErrorDomain,
@@ -196,14 +170,13 @@
CHECK(package) << "Unable to create state package " << package_name;
if (!package->AddSchemaFromJson(package_dict, error))
return false;
- iter.Advance();
}
return true;
}
-bool StateManager::LoadStateDefinition(const std::string& json,
- ErrorPtr* error) {
+bool StateManager::LoadStateDefinitionFromJson(const std::string& json,
+ ErrorPtr* error) {
std::unique_ptr<const base::DictionaryValue> dict = LoadJsonDict(json, error);
if (!dict)
return false;
@@ -230,44 +203,49 @@
return true;
}
-bool StateManager::LoadStateDefaults(const base::DictionaryValue& dict,
- ErrorPtr* error) {
- base::DictionaryValue::Iterator iter(dict);
- while (!iter.IsAtEnd()) {
- std::string package_name = iter.key();
- if (package_name.empty()) {
+bool StateManager::SetProperties(const base::DictionaryValue& dict,
+ ErrorPtr* error) {
+ base::Time timestamp = base::Time::Now();
+ bool all_success = true;
+ for (base::DictionaryValue::Iterator iter(dict); !iter.IsAtEnd();
+ iter.Advance()) {
+ if (iter.key().empty()) {
Error::AddTo(error, FROM_HERE, errors::kErrorDomain,
errors::kInvalidPackageError, "State package name is empty");
- return false;
+ all_success = false;
+ continue;
}
+
const base::DictionaryValue* package_dict = nullptr;
if (!iter.value().GetAsDictionary(&package_dict)) {
Error::AddToPrintf(error, FROM_HERE, errors::json::kDomain,
errors::json::kObjectExpected,
"State package '%s' must be an object",
- package_name.c_str());
- return false;
+ iter.key().c_str());
+ all_success = false;
+ continue;
}
- StatePackage* package = FindPackage(package_name);
- if (package == nullptr) {
- Error::AddToPrintf(error, FROM_HERE, errors::json::kDomain,
- errors::json::kObjectExpected,
- "Providing values for undefined state package '%s'",
- package_name.c_str());
- return false;
+
+ for (base::DictionaryValue::Iterator it_prop(*package_dict);
+ !it_prop.IsAtEnd(); it_prop.Advance()) {
+ if (!SetPropertyValue(iter.key() + "." + it_prop.key(), it_prop.value(),
+ timestamp, error)) {
+ all_success = false;
+ continue;
+ }
}
- if (!package->AddValuesFromJson(package_dict, error))
- return false;
- iter.Advance();
}
- return true;
+ for (const auto& cb : on_changed_)
+ cb.Run();
+ return all_success;
}
-bool StateManager::LoadStateDefaults(const std::string& json, ErrorPtr* error) {
+bool StateManager::SetPropertiesFromJson(const std::string& json,
+ ErrorPtr* error) {
std::unique_ptr<const base::DictionaryValue> dict = LoadJsonDict(json, error);
if (!dict)
return false;
- if (!LoadStateDefaults(*dict, error)) {
+ if (!SetProperties(*dict, error)) {
Error::AddToPrintf(error, FROM_HERE, errors::kErrorDomain,
errors::kSchemaError, "Failed to load defaults: '%s'",
json.c_str());
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h
index 5a64d78..2e2e002 100644
--- a/libweave/src/states/state_manager.h
+++ b/libweave/src/states/state_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -26,10 +26,6 @@
namespace weave {
-namespace provider {
-class ConfigStore;
-}
-
// StateManager is the class that aggregates the device state fragments
// provided by device daemons and makes the aggregate device state available
// to the GCD cloud server and local clients.
@@ -39,8 +35,10 @@
~StateManager();
void AddChangedCallback(const base::Closure& callback);
- bool SetProperties(const base::DictionaryValue& property_set,
- ErrorPtr* error);
+ bool LoadStateDefinition(const base::DictionaryValue& dict, ErrorPtr* error);
+ bool LoadStateDefinitionFromJson(const std::string& json, ErrorPtr* error);
+ bool SetProperties(const base::DictionaryValue& dict, ErrorPtr* error);
+ bool SetPropertiesFromJson(const std::string& json, ErrorPtr* error);
std::unique_ptr<base::Value> GetProperty(const std::string& name) const;
bool SetProperty(const std::string& name,
const base::Value& value,
@@ -49,7 +47,7 @@
// Initializes the state manager and load device state fragments.
// Called by Buffet daemon at startup.
- void Startup(provider::ConfigStore* config_store);
+ void Startup();
// Returns the recorded state changes since last time this method has been
// called.
@@ -75,25 +73,11 @@
const base::Time& timestamp,
ErrorPtr* error);
- // Loads a device state fragment from a JSON object.
- bool LoadStateDefinition(const base::DictionaryValue& dict,
- ErrorPtr* error);
-
- // Loads a device state fragment JSON.
- bool LoadStateDefinition(const std::string& json,
- ErrorPtr* error);
-
// Loads the base device state fragment JSON. This state fragment
// defines the standard state properties from the 'base' package as defined
// by GCD specification.
bool LoadBaseStateDefinition(const std::string& json, ErrorPtr* error);
- // Loads state default values from JSON object.
- bool LoadStateDefaults(const base::DictionaryValue& dict, ErrorPtr* error);
-
- // Loads state default values from JSON.
- bool LoadStateDefaults(const std::string& json, ErrorPtr* error);
-
// Finds a package by its name. Returns nullptr if not found.
StatePackage* FindPackage(const std::string& package_name);
const StatePackage* FindPackage(const std::string& package_name) const;
diff --git a/libweave/src/states/state_manager_unittest.cc b/libweave/src/states/state_manager_unittest.cc
index 522e0e6..b62dc10 100644
--- a/libweave/src/states/state_manager_unittest.cc
+++ b/libweave/src/states/state_manager_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -59,17 +59,17 @@
// Initial expectations.
EXPECT_CALL(mock_state_change_queue_, IsEmpty()).Times(0);
EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(_, _))
- .Times(0);
+ .WillRepeatedly(Return(true));
EXPECT_CALL(mock_state_change_queue_, GetAndClearRecordedStateChanges())
.Times(0);
mgr_.reset(new StateManager(&mock_state_change_queue_));
- EXPECT_CALL(*this, OnStateChanged()).Times(1);
+ EXPECT_CALL(*this, OnStateChanged()).Times(2);
mgr_->AddChangedCallback(
base::Bind(&StateManagerTest::OnStateChanged, base::Unretained(this)));
LoadStateDefinition(GetTestSchema().get(), nullptr);
- ASSERT_TRUE(mgr_->LoadStateDefaults(*GetTestValues().get(), nullptr));
+ ASSERT_TRUE(mgr_->SetProperties(*GetTestValues().get(), nullptr));
}
void TearDown() override { mgr_.reset(); }
@@ -133,18 +133,13 @@
}
TEST_F(StateManagerTest, Startup) {
- provider::test::MockConfigStore config_store;
StateManager manager(&mock_state_change_queue_);
- EXPECT_CALL(config_store, LoadStateDefs())
- .WillOnce(Return(std::vector<std::string>{
- {R"({"power": {"battery_level":"integer"}})"}}));
-
- EXPECT_CALL(config_store, LoadStateDefaults())
- .WillOnce(Return(
- std::vector<std::string>{{R"({"power": {"battery_level":44}})"}}));
-
- manager.Startup(&config_store);
+ manager.Startup();
+ ASSERT_TRUE(manager.LoadStateDefinitionFromJson(
+ R"({"power": {"battery_level":"integer"}})", nullptr));
+ ASSERT_TRUE(manager.SetPropertiesFromJson(
+ R"({"power": {"battery_level":44}})", nullptr));
auto expected = R"({
'base': {
@@ -243,7 +238,7 @@
EXPECT_CALL(*this, OnStateChanged()).Times(1);
ASSERT_TRUE(mgr_->SetProperties(
- *CreateDictionaryValue("{'base.manufacturer': 'No Name'}"), nullptr));
+ *CreateDictionaryValue("{'base':{'manufacturer':'No Name'}}"), nullptr));
auto expected = R"({
'base': {
diff --git a/libweave/src/states/state_package.cc b/libweave/src/states/state_package.cc
index b6a5353..0b8e219 100644
--- a/libweave/src/states/state_package.cc
+++ b/libweave/src/states/state_package.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_package.h b/libweave/src/states/state_package.h
index ea640a1..e8e3964 100644
--- a/libweave/src/states/state_package.h
+++ b/libweave/src/states/state_package.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/states/state_package_unittest.cc b/libweave/src/states/state_package_unittest.cc
index f830997..f958bf5 100644
--- a/libweave/src/states/state_package_unittest.cc
+++ b/libweave/src/states/state_package_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/streams.cc b/libweave/src/streams.cc
new file mode 100644
index 0000000..22527c9
--- /dev/null
+++ b/libweave/src/streams.cc
@@ -0,0 +1,72 @@
+// 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.
+
+#include "src/streams.h"
+
+#include <base/bind.h>
+#include <base/callback.h>
+#include <weave/provider/task_runner.h>
+#include <weave/stream.h>
+
+namespace weave {
+
+namespace {} // namespace
+
+MemoryStream::MemoryStream(const std::vector<uint8_t>& data,
+ provider::TaskRunner* task_runner)
+ : data_{data}, task_runner_{task_runner} {}
+
+void MemoryStream::Read(void* buffer,
+ size_t size_to_read,
+ const ReadCallback& callback) {
+ CHECK_LE(read_position_, data_.size());
+ size_t size_read = std::min(size_to_read, data_.size() - read_position_);
+ if (size_read > 0)
+ memcpy(buffer, data_.data() + read_position_, size_read);
+ read_position_ += size_read;
+ task_runner_->PostDelayedTask(FROM_HERE,
+ base::Bind(callback, size_read, nullptr), {});
+}
+
+void MemoryStream::Write(const void* buffer,
+ size_t size_to_write,
+ const WriteCallback& callback) {
+ data_.insert(data_.end(), static_cast<const char*>(buffer),
+ static_cast<const char*>(buffer) + size_to_write);
+ task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr), {});
+}
+
+StreamCopier::StreamCopier(InputStream* source, OutputStream* destination)
+ : source_{source}, destination_{destination}, buffer_(4096) {}
+
+void StreamCopier::Copy(const InputStream::ReadCallback& callback) {
+ source_->Read(buffer_.data(), buffer_.size(),
+ base::Bind(&StreamCopier::OnReadDone,
+ weak_ptr_factory_.GetWeakPtr(), callback));
+}
+
+void StreamCopier::OnReadDone(const InputStream::ReadCallback& callback,
+ size_t size,
+ ErrorPtr error) {
+ if (error)
+ return callback.Run(0, std::move(error));
+
+ size_done_ += size;
+ if (size) {
+ return destination_->Write(
+ buffer_.data(), size,
+ base::Bind(&StreamCopier::OnWriteDone, weak_ptr_factory_.GetWeakPtr(),
+ callback));
+ }
+ callback.Run(size_done_, nullptr);
+}
+
+void StreamCopier::OnWriteDone(const InputStream::ReadCallback& callback,
+ ErrorPtr error) {
+ if (error)
+ return callback.Run(size_done_, std::move(error));
+ Copy(callback);
+}
+
+} // namespace weave
diff --git a/libweave/src/streams.h b/libweave/src/streams.h
new file mode 100644
index 0000000..990f47c
--- /dev/null
+++ b/libweave/src/streams.h
@@ -0,0 +1,61 @@
+// 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_SRC_STREAMS_H_
+#define LIBWEAVE_SRC_STREAMS_H_
+
+#include <base/memory/weak_ptr.h>
+#include <weave/stream.h>
+
+namespace weave {
+
+namespace provider {
+class TaskRunner;
+}
+
+class MemoryStream : public InputStream, public OutputStream {
+ public:
+ MemoryStream(const std::vector<uint8_t>& data,
+ provider::TaskRunner* task_runner);
+
+ void Read(void* buffer,
+ size_t size_to_read,
+ const ReadCallback& callback) override;
+
+ void Write(const void* buffer,
+ size_t size_to_write,
+ const WriteCallback& callback) override;
+
+ const std::vector<uint8_t>& GetData() const { return data_; }
+
+ private:
+ std::vector<uint8_t> data_;
+ provider::TaskRunner* task_runner_{nullptr};
+ size_t read_position_{0};
+};
+
+class StreamCopier {
+ public:
+ StreamCopier(InputStream* source, OutputStream* destination);
+
+ void Copy(const InputStream::ReadCallback& callback);
+
+ private:
+ void OnWriteDone(const InputStream::ReadCallback& callback, ErrorPtr error);
+ void OnReadDone(const InputStream::ReadCallback& callback,
+ size_t size,
+ ErrorPtr error);
+
+ InputStream* source_{nullptr};
+ OutputStream* destination_{nullptr};
+
+ size_t size_done_{0};
+ std::vector<uint8_t> buffer_;
+
+ base::WeakPtrFactory<StreamCopier> weak_ptr_factory_{this};
+};
+
+} // namespace weave
+
+#endif // LIBWEAVE_SRC_STREAMS_H_
diff --git a/libweave/src/streams_unittest.cc b/libweave/src/streams_unittest.cc
new file mode 100644
index 0000000..fba6ca5
--- /dev/null
+++ b/libweave/src/streams_unittest.cc
@@ -0,0 +1,39 @@
+// 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.
+
+#include "src/streams.h"
+
+#include <functional>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <weave/provider/test/fake_task_runner.h>
+
+#include <src/bind_lambda.h>
+
+namespace weave {
+
+TEST(Stream, CopyStreams) {
+ provider::test::FakeTaskRunner task_runner;
+ std::vector<uint8_t> test_data(1024 * 1024);
+ for (size_t i = 0; i < test_data.size(); ++i)
+ test_data[i] = static_cast<uint8_t>(std::hash<size_t>()(i));
+ MemoryStream source{test_data, &task_runner};
+ MemoryStream destination{{}, &task_runner};
+
+ bool done = false;
+
+ auto callback = base::Bind(
+ [&test_data, &done, &destination](size_t size, ErrorPtr error) {
+ EXPECT_FALSE(error);
+ done = true;
+ EXPECT_EQ(test_data, destination.GetData());
+ });
+ StreamCopier copier{&source, &destination};
+ copier.Copy(callback);
+
+ task_runner.Run(test_data.size());
+ EXPECT_TRUE(done);
+}
+
+} // namespace weave
diff --git a/libweave/src/string_utils.cc b/libweave/src/string_utils.cc
index 67688b9..b5e71b8 100644
--- a/libweave/src/string_utils.cc
+++ b/libweave/src/string_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/string_utils.h b/libweave/src/string_utils.h
index 5771971..e349d9d 100644
--- a/libweave/src/string_utils.h
+++ b/libweave/src/string_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/string_utils_unittest.cc b/libweave/src/string_utils_unittest.cc
index 2473a79..c26d7d8 100644
--- a/libweave/src/string_utils_unittest.cc
+++ b/libweave/src/string_utils_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+// Copyright (c) 2014 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.
diff --git a/libweave/src/test/fake_stream.cc b/libweave/src/test/fake_stream.cc
index 786aa01..1101779 100644
--- a/libweave/src/test/fake_stream.cc
+++ b/libweave/src/test/fake_stream.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -30,33 +30,30 @@
void FakeStream::Read(void* buffer,
size_t size_to_read,
- const ReadSuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const ReadCallback& callback) {
if (read_data_.empty()) {
task_runner_->PostDelayedTask(
- FROM_HERE,
- base::Bind(&FakeStream::Read, base::Unretained(this), buffer,
- size_to_read, success_callback, error_callback),
+ FROM_HERE, base::Bind(&FakeStream::Read, base::Unretained(this), buffer,
+ size_to_read, callback),
base::TimeDelta::FromSeconds(0));
return;
}
size_t size = std::min(size_to_read, read_data_.size());
memcpy(buffer, read_data_.data(), size);
read_data_ = read_data_.substr(size);
- task_runner_->PostDelayedTask(FROM_HERE, base::Bind(success_callback, size),
+ task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, size, nullptr),
base::TimeDelta::FromSeconds(0));
}
void FakeStream::Write(const void* buffer,
size_t size_to_write,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
+ const WriteCallback& callback) {
size_t size = std::min(size_to_write, write_data_.size());
EXPECT_EQ(
write_data_.substr(0, size),
std::string(reinterpret_cast<const char*>(buffer), size_to_write));
write_data_ = write_data_.substr(size);
- task_runner_->PostDelayedTask(FROM_HERE, success_callback,
+ task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr),
base::TimeDelta::FromSeconds(0));
}
diff --git a/libweave/src/test/fake_task_runner.cc b/libweave/src/test/fake_task_runner.cc
index 4026880..88e078b 100644
--- a/libweave/src/test/fake_task_runner.cc
+++ b/libweave/src/test/fake_task_runner.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -32,9 +32,9 @@
return true;
}
-void FakeTaskRunner::Run() {
+void FakeTaskRunner::Run(size_t number_of_iterations) {
break_ = false;
- for (size_t i = 0; i < 1000 && !break_ && RunOnce(); ++i) {
+ for (size_t i = 0; i < number_of_iterations && !break_ && RunOnce(); ++i) {
}
}
diff --git a/libweave/src/test/mock_command.cc b/libweave/src/test/mock_command.cc
index 43b528b..a8564c4 100644
--- a/libweave/src/test/mock_command.cc
+++ b/libweave/src/test/mock_command.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -26,9 +26,5 @@
return CreateDictionaryValue(MockGetResults());
}
-std::unique_ptr<base::DictionaryValue> MockCommand::ToJson() const {
- return CreateDictionaryValue(MockToJson());
-}
-
} // namespace test
} // namespace weave
diff --git a/libweave/src/test/mock_http_client.cc b/libweave/src/test/mock_http_client.cc
deleted file mode 100644
index b17645c..0000000
--- a/libweave/src/test/mock_http_client.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <weave/provider/test/mock_http_client.h>
-
-#include <memory>
-#include <string>
-
-namespace weave {
-namespace provider {
-namespace test {
-
-std::unique_ptr<HttpClient::Response> MockHttpClient::SendRequestAndBlock(
- const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- ErrorPtr* error) {
- return std::unique_ptr<Response>{
- MockSendRequest(method, url, headers, data, error)};
-}
-
-int MockHttpClient::SendRequest(const std::string& method,
- const std::string& url,
- const Headers& headers,
- const std::string& data,
- const SuccessCallback& success_callback,
- const ErrorCallback& error_callback) {
- ErrorPtr error;
- std::unique_ptr<Response> response{
- MockSendRequest(method, url, headers, data, &error)};
- if (response) {
- success_callback.Run(0, *response);
- } else {
- error_callback.Run(0, error.get());
- }
- return 0;
-}
-
-} // namespace test
-} // namespace provider
-} // namespace weave
diff --git a/libweave/src/test/unittest_utils.cc b/libweave/src/test/unittest_utils.cc
index 0078894..b9858e4 100644
--- a/libweave/src/test/unittest_utils.cc
+++ b/libweave/src/test/unittest_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/test/weave_testrunner.cc b/libweave/src/test/weave_testrunner.cc
index 5de7cae..00e3432 100644
--- a/libweave/src/test/weave_testrunner.cc
+++ b/libweave/src/test/weave_testrunner.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
diff --git a/libweave/src/utils.cc b/libweave/src/utils.cc
index 6827db5..24ce1ca 100644
--- a/libweave/src/utils.cc
+++ b/libweave/src/utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -23,6 +23,9 @@
const size_t kMaxStrLen = 1700; // Log messages are limited to 2000 chars.
+const char kErrorCodeKey[] = "code";
+const char kErrorMessageKey[] = "message";
+
} // anonymous namespace
namespace errors {
@@ -62,4 +65,11 @@
return result;
}
+std::unique_ptr<base::DictionaryValue> ErrorInfoToJson(const Error& error) {
+ std::unique_ptr<base::DictionaryValue> output{new base::DictionaryValue};
+ output->SetString(kErrorMessageKey, error.GetMessage());
+ output->SetString(kErrorCodeKey, error.GetCode());
+ return output;
+}
+
} // namespace weave
diff --git a/libweave/src/utils.h b/libweave/src/utils.h
index 29ea138..bd69e94 100644
--- a/libweave/src/utils.h
+++ b/libweave/src/utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -30,6 +30,8 @@
const std::string& json_string,
ErrorPtr* error);
+std::unique_ptr<base::DictionaryValue> ErrorInfoToJson(const Error& error);
+
} // namespace weave
#endif // LIBWEAVE_SRC_UTILS_H_
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index f0f8a58..0bfbe0b 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// 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.
@@ -14,6 +14,7 @@
#include <weave/provider/test/mock_http_server.h>
#include <weave/provider/test/mock_network.h>
#include <weave/provider/test/mock_wifi.h>
+#include <weave/test/mock_command.h>
#include <weave/test/mock_device.h>
#include <weave/test/unittest_utils.h>
@@ -35,10 +36,11 @@
namespace weave {
+using provider::HttpClient;
+using provider::Network;
+using provider::test::MockHttpClientResponse;
using test::CreateDictionaryValue;
using test::ValueToString;
-using provider::test::MockHttpClientResponse;
-using provider::Network;
const char kCommandDefs[] = R"({
"base": {
@@ -135,13 +137,14 @@
protected:
void SetUp() override {}
- void ExpectRequest(const std::string& method,
+ void ExpectRequest(HttpClient::Method method,
const std::string& url,
const std::string& json_response) {
- EXPECT_CALL(http_client_, MockSendRequest(method, url, _, _, _))
- .WillOnce(InvokeWithoutArgs([json_response]() {
- provider::test::MockHttpClientResponse* response =
- new StrictMock<provider::test::MockHttpClientResponse>;
+ EXPECT_CALL(http_client_, SendRequest(method, url, _, _, _))
+ .WillOnce(WithArgs<4>(Invoke([json_response](
+ const HttpClient::SendRequestCallback& callback) {
+ std::unique_ptr<provider::test::MockHttpClientResponse> response{
+ new StrictMock<provider::test::MockHttpClientResponse>};
EXPECT_CALL(*response, GetStatusCode())
.Times(AtLeast(1))
.WillRepeatedly(Return(200));
@@ -150,22 +153,13 @@
.WillRepeatedly(Return("application/json; charset=utf-8"));
EXPECT_CALL(*response, GetData())
.Times(AtLeast(1))
- .WillRepeatedly(ReturnRefOfCopy(json_response));
- return response;
- }));
+ .WillRepeatedly(Return(json_response));
+ callback.Run(std::move(response), nullptr);
+ })));
}
void InitConfigStore() {
EXPECT_CALL(config_store_, SaveSettings("")).WillRepeatedly(Return());
-
- EXPECT_CALL(config_store_, LoadCommandDefs())
- .WillOnce(Return(std::vector<std::string>{kCommandDefs}));
-
- EXPECT_CALL(config_store_, LoadStateDefs())
- .WillOnce(Return(std::vector<std::string>{kStateDefs}));
-
- EXPECT_CALL(config_store_, LoadStateDefaults())
- .WillOnce(Return(std::vector<std::string>{kStateDefaults}));
}
void InitNetwork() {
@@ -201,6 +195,7 @@
}
EXPECT_CALL(dns_sd_, PublishService("_privet._tcp", 11, MatchTxt(txt)))
+ .Times(AtMost(1))
.WillOnce(Return());
}
@@ -208,17 +203,18 @@
EXPECT_CALL(http_server_, GetHttpPort()).WillRepeatedly(Return(11));
EXPECT_CALL(http_server_, GetHttpsPort()).WillRepeatedly(Return(12));
EXPECT_CALL(http_server_, GetHttpsCertificateFingerprint())
- .WillRepeatedly(ReturnRefOfCopy(std::vector<uint8_t>{1, 2, 3}));
- EXPECT_CALL(http_server_, AddRequestHandler(_, _))
- .WillRepeatedly(
- Invoke([this](const std::string& path_prefix,
- const provider::HttpServer::OnRequestCallback& cb) {
+ .WillRepeatedly(Return(std::vector<uint8_t>{1, 2, 3}));
+ EXPECT_CALL(http_server_, AddHttpRequestHandler(_, _))
+ .WillRepeatedly(Invoke(
+ [this](const std::string& path_prefix,
+ const provider::HttpServer::RequestHandlerCallback& cb) {
http_server_request_cb_.push_back(cb);
}));
- EXPECT_CALL(http_server_, AddOnStateChangedCallback(_))
+ EXPECT_CALL(http_server_, AddHttpsRequestHandler(_, _))
.WillRepeatedly(Invoke(
- [this](const provider::HttpServer::OnStateChangedCallback& cb) {
- http_server_changed_cb_.push_back(cb);
+ [this](const std::string& path_prefix,
+ const provider::HttpServer::RequestHandlerCallback& cb) {
+ http_server_request_cb_.push_back(cb);
}));
}
@@ -236,8 +232,9 @@
&http_client_, &network_, &dns_sd_,
&http_server_, &wifi_, &bluetooth_);
- for (const auto& cb : http_server_changed_cb_)
- cb.Run(http_server_);
+ device_->AddCommandDefinitionsFromJson(kCommandDefs);
+ device_->AddStateDefinitionsFromJson(kStateDefs);
+ device_->SetStatePropertiesFromJson(kStateDefaults, nullptr);
task_runner_.Run();
}
@@ -250,9 +247,8 @@
}
}
- std::vector<provider::HttpServer::OnStateChangedCallback>
- http_server_changed_cb_;
- std::vector<provider::HttpServer::OnRequestCallback> http_server_request_cb_;
+ std::vector<provider::HttpServer::RequestHandlerCallback>
+ http_server_request_cb_;
StrictMock<provider::test::MockConfigStore> config_store_;
StrictMock<provider::test::FakeTaskRunner> task_runner_;
@@ -268,10 +264,11 @@
std::unique_ptr<weave::Device> device_;
};
-TEST_F(WeaveTest, MockDevice) {
+TEST_F(WeaveTest, Mocks) {
// Test checks if mock implements entire interface and mock can be
// instantiated.
test::MockDevice device;
+ test::MockCommand command;
}
TEST_F(WeaveTest, StartMinimal) {
@@ -290,9 +287,7 @@
device_ = weave::Device::Create(&config_store_, &task_runner_, &http_client_,
&network_, &dns_sd_, &http_server_, nullptr,
&bluetooth_);
-
- for (const auto& cb : http_server_changed_cb_)
- cb.Run(http_server_);
+ device_->AddCommandDefinitionsFromJson(kCommandDefs);
task_runner_.Run();
}
@@ -312,14 +307,14 @@
}
TEST_F(WeaveBasicTest, Register) {
- EXPECT_CALL(network_, OpenSslSocket(_, _, _, _)).WillRepeatedly(Return());
+ EXPECT_CALL(network_, OpenSslSocket(_, _, _)).WillRepeatedly(Return());
StartDevice();
auto draft = CreateDictionaryValue(kDeviceResource);
auto response = CreateDictionaryValue(kRegistrationResponse);
response->Set("deviceDraft", draft->DeepCopy());
ExpectRequest(
- "PATCH",
+ HttpClient::Method::kPatch,
"https://www.googleapis.com/clouddevices/v1/registrationTickets/"
"TICKET_ID?key=TEST_API_KEY",
ValueToString(*response));
@@ -327,17 +322,26 @@
response = CreateDictionaryValue(kRegistrationFinalResponse);
response->Set("deviceDraft", draft->DeepCopy());
ExpectRequest(
- "POST",
+ HttpClient::Method::kPost,
"https://www.googleapis.com/clouddevices/v1/registrationTickets/"
"TICKET_ID/finalize?key=TEST_API_KEY",
ValueToString(*response));
- ExpectRequest("POST", "https://accounts.google.com/o/oauth2/token",
+ ExpectRequest(HttpClient::Method::kPost,
+ "https://accounts.google.com/o/oauth2/token",
kAuthTokenResponse);
InitDnsSdPublishing(true, "DB");
- EXPECT_EQ("CLOUD_ID", device_->Register("TICKET_ID", nullptr));
+ bool done = false;
+ device_->Register("TICKET_ID", base::Bind([this, &done](ErrorPtr error) {
+ EXPECT_FALSE(error);
+ done = true;
+ task_runner_.Break();
+ EXPECT_EQ("CLOUD_ID", device_->GetSettings().cloud_id);
+ }));
+ task_runner_.Run();
+ EXPECT_TRUE(done);
}
class WeaveWiFiSetupTest : public WeaveTest {
@@ -351,7 +355,7 @@
InitDnsSd();
EXPECT_CALL(network_, GetConnectionState())
- .WillRepeatedly(Return(provider::Network::State::kConnected));
+ .WillRepeatedly(Return(provider::Network::State::kOnline));
}
};
@@ -360,7 +364,7 @@
// Short disconnect.
NotifyNetworkChanged(provider::Network::State::kOffline, {});
- NotifyNetworkChanged(provider::Network::State::kConnected,
+ NotifyNetworkChanged(provider::Network::State::kOnline,
base::TimeDelta::FromSeconds(10));
task_runner_.Run();
@@ -408,7 +412,7 @@
task_runner_.Run();
}
- NotifyNetworkChanged(Network::State::kConnected, {});
+ NotifyNetworkChanged(Network::State::kOnline, {});
task_runner_.Run();
}
diff --git a/libweave/third_party/chromium/LICENSE b/libweave/third_party/chromium/LICENSE
new file mode 100644
index 0000000..a32e00c
--- /dev/null
+++ b/libweave/third_party/chromium/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/libweave/third_party/chromium/LICENSE.chromium_os b/libweave/third_party/chromium/LICENSE.chromium_os
new file mode 100644
index 0000000..0aa7fc9
--- /dev/null
+++ b/libweave/third_party/chromium/LICENSE.chromium_os
@@ -0,0 +1,27 @@
+// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/libweave/external/base/base_export.h b/libweave/third_party/chromium/base/base_export.h
similarity index 100%
rename from libweave/external/base/base_export.h
rename to libweave/third_party/chromium/base/base_export.h
diff --git a/libweave/external/base/basictypes.h b/libweave/third_party/chromium/base/basictypes.h
similarity index 100%
rename from libweave/external/base/basictypes.h
rename to libweave/third_party/chromium/base/basictypes.h
diff --git a/libweave/external/base/bind.h b/libweave/third_party/chromium/base/bind.h
similarity index 100%
rename from libweave/external/base/bind.h
rename to libweave/third_party/chromium/base/bind.h
diff --git a/libweave/external/base/bind_helpers.cc b/libweave/third_party/chromium/base/bind_helpers.cc
similarity index 100%
rename from libweave/external/base/bind_helpers.cc
rename to libweave/third_party/chromium/base/bind_helpers.cc
diff --git a/libweave/external/base/bind_helpers.h b/libweave/third_party/chromium/base/bind_helpers.h
similarity index 100%
rename from libweave/external/base/bind_helpers.h
rename to libweave/third_party/chromium/base/bind_helpers.h
diff --git a/libweave/external/base/bind_internal.h b/libweave/third_party/chromium/base/bind_internal.h
similarity index 100%
rename from libweave/external/base/bind_internal.h
rename to libweave/third_party/chromium/base/bind_internal.h
diff --git a/libweave/external/base/bind_unittest.cc b/libweave/third_party/chromium/base/bind_unittest.cc
similarity index 100%
rename from libweave/external/base/bind_unittest.cc
rename to libweave/third_party/chromium/base/bind_unittest.cc
diff --git a/libweave/external/base/build/build_config.h b/libweave/third_party/chromium/base/build/build_config.h
similarity index 100%
rename from libweave/external/base/build/build_config.h
rename to libweave/third_party/chromium/base/build/build_config.h
diff --git a/libweave/external/base/callback.h b/libweave/third_party/chromium/base/callback.h
similarity index 100%
rename from libweave/external/base/callback.h
rename to libweave/third_party/chromium/base/callback.h
diff --git a/libweave/external/base/callback_forward.h b/libweave/third_party/chromium/base/callback_forward.h
similarity index 100%
rename from libweave/external/base/callback_forward.h
rename to libweave/third_party/chromium/base/callback_forward.h
diff --git a/libweave/external/base/callback_internal.cc b/libweave/third_party/chromium/base/callback_internal.cc
similarity index 100%
rename from libweave/external/base/callback_internal.cc
rename to libweave/third_party/chromium/base/callback_internal.cc
diff --git a/libweave/external/base/callback_internal.h b/libweave/third_party/chromium/base/callback_internal.h
similarity index 100%
rename from libweave/external/base/callback_internal.h
rename to libweave/third_party/chromium/base/callback_internal.h
diff --git a/libweave/external/base/callback_list.h b/libweave/third_party/chromium/base/callback_list.h
similarity index 100%
rename from libweave/external/base/callback_list.h
rename to libweave/third_party/chromium/base/callback_list.h
diff --git a/libweave/external/base/callback_list_unittest.cc b/libweave/third_party/chromium/base/callback_list_unittest.cc
similarity index 100%
rename from libweave/external/base/callback_list_unittest.cc
rename to libweave/third_party/chromium/base/callback_list_unittest.cc
diff --git a/libweave/external/base/callback_unittest.cc b/libweave/third_party/chromium/base/callback_unittest.cc
similarity index 100%
rename from libweave/external/base/callback_unittest.cc
rename to libweave/third_party/chromium/base/callback_unittest.cc
diff --git a/libweave/external/base/command_line.h b/libweave/third_party/chromium/base/command_line.h
similarity index 100%
rename from libweave/external/base/command_line.h
rename to libweave/third_party/chromium/base/command_line.h
diff --git a/libweave/external/base/compiler_specific.h b/libweave/third_party/chromium/base/compiler_specific.h
similarity index 100%
rename from libweave/external/base/compiler_specific.h
rename to libweave/third_party/chromium/base/compiler_specific.h
diff --git a/libweave/external/base/gtest_prod_util.h b/libweave/third_party/chromium/base/gtest_prod_util.h
similarity index 100%
rename from libweave/external/base/gtest_prod_util.h
rename to libweave/third_party/chromium/base/gtest_prod_util.h
diff --git a/libweave/external/base/guid.h b/libweave/third_party/chromium/base/guid.h
similarity index 100%
rename from libweave/external/base/guid.h
rename to libweave/third_party/chromium/base/guid.h
diff --git a/libweave/external/base/guid_posix.cc b/libweave/third_party/chromium/base/guid_posix.cc
similarity index 100%
rename from libweave/external/base/guid_posix.cc
rename to libweave/third_party/chromium/base/guid_posix.cc
diff --git a/libweave/external/base/guid_unittest.cc b/libweave/third_party/chromium/base/guid_unittest.cc
similarity index 100%
rename from libweave/external/base/guid_unittest.cc
rename to libweave/third_party/chromium/base/guid_unittest.cc
diff --git a/libweave/external/base/json/json_parser.cc b/libweave/third_party/chromium/base/json/json_parser.cc
similarity index 100%
rename from libweave/external/base/json/json_parser.cc
rename to libweave/third_party/chromium/base/json/json_parser.cc
diff --git a/libweave/external/base/json/json_parser.h b/libweave/third_party/chromium/base/json/json_parser.h
similarity index 100%
rename from libweave/external/base/json/json_parser.h
rename to libweave/third_party/chromium/base/json/json_parser.h
diff --git a/libweave/external/base/json/json_parser_unittest.cc b/libweave/third_party/chromium/base/json/json_parser_unittest.cc
similarity index 100%
rename from libweave/external/base/json/json_parser_unittest.cc
rename to libweave/third_party/chromium/base/json/json_parser_unittest.cc
diff --git a/libweave/external/base/json/json_reader.cc b/libweave/third_party/chromium/base/json/json_reader.cc
similarity index 100%
rename from libweave/external/base/json/json_reader.cc
rename to libweave/third_party/chromium/base/json/json_reader.cc
diff --git a/libweave/external/base/json/json_reader.h b/libweave/third_party/chromium/base/json/json_reader.h
similarity index 100%
rename from libweave/external/base/json/json_reader.h
rename to libweave/third_party/chromium/base/json/json_reader.h
diff --git a/libweave/external/base/json/json_reader_unittest.cc b/libweave/third_party/chromium/base/json/json_reader_unittest.cc
similarity index 100%
rename from libweave/external/base/json/json_reader_unittest.cc
rename to libweave/third_party/chromium/base/json/json_reader_unittest.cc
diff --git a/libweave/external/base/json/json_writer.cc b/libweave/third_party/chromium/base/json/json_writer.cc
similarity index 100%
rename from libweave/external/base/json/json_writer.cc
rename to libweave/third_party/chromium/base/json/json_writer.cc
diff --git a/libweave/external/base/json/json_writer.h b/libweave/third_party/chromium/base/json/json_writer.h
similarity index 100%
rename from libweave/external/base/json/json_writer.h
rename to libweave/third_party/chromium/base/json/json_writer.h
diff --git a/libweave/external/base/json/json_writer_unittest.cc b/libweave/third_party/chromium/base/json/json_writer_unittest.cc
similarity index 100%
rename from libweave/external/base/json/json_writer_unittest.cc
rename to libweave/third_party/chromium/base/json/json_writer_unittest.cc
diff --git a/libweave/external/base/json/string_escape.cc b/libweave/third_party/chromium/base/json/string_escape.cc
similarity index 100%
rename from libweave/external/base/json/string_escape.cc
rename to libweave/third_party/chromium/base/json/string_escape.cc
diff --git a/libweave/external/base/json/string_escape.h b/libweave/third_party/chromium/base/json/string_escape.h
similarity index 100%
rename from libweave/external/base/json/string_escape.h
rename to libweave/third_party/chromium/base/json/string_escape.h
diff --git a/libweave/external/base/json/string_escape_unittest.cc b/libweave/third_party/chromium/base/json/string_escape_unittest.cc
similarity index 100%
rename from libweave/external/base/json/string_escape_unittest.cc
rename to libweave/third_party/chromium/base/json/string_escape_unittest.cc
diff --git a/libweave/external/base/location.cc b/libweave/third_party/chromium/base/location.cc
similarity index 100%
rename from libweave/external/base/location.cc
rename to libweave/third_party/chromium/base/location.cc
diff --git a/libweave/external/base/location.h b/libweave/third_party/chromium/base/location.h
similarity index 100%
rename from libweave/external/base/location.h
rename to libweave/third_party/chromium/base/location.h
diff --git a/libweave/external/base/logging.cc b/libweave/third_party/chromium/base/logging.cc
similarity index 98%
rename from libweave/external/base/logging.cc
rename to libweave/third_party/chromium/base/logging.cc
index c576d18..1fd047f 100644
--- a/libweave/external/base/logging.cc
+++ b/libweave/third_party/chromium/base/logging.cc
@@ -83,11 +83,6 @@
return std::max(-1, LOG_INFO - GetMinLogLevel());
}
-int GetVlogLevelHelper(const char* file, size_t N) {
- DCHECK_GT(N, 0U);
- return 0;
-}
-
void SetLogItems(bool enable_process_id, bool enable_thread_id,
bool enable_timestamp, bool enable_tickcount) {
g_log_timestamp = enable_timestamp;
diff --git a/libweave/external/base/logging.h b/libweave/third_party/chromium/base/logging.h
similarity index 99%
rename from libweave/external/base/logging.h
rename to libweave/third_party/chromium/base/logging.h
index 0096d9d..61e9f9d 100644
--- a/libweave/external/base/logging.h
+++ b/libweave/third_party/chromium/base/logging.h
@@ -195,7 +195,9 @@
// __FILE__).
// Note that |N| is the size *with* the null terminator.
-int GetVlogLevelHelper(const char* file_start, size_t N);
+inline int GetVlogLevelHelper(const char* file_start, size_t N) {
+ return GetVlogVerbosity();
+}
template <size_t N>
int GetVlogLevel(const char (&file)[N]) {
diff --git a/libweave/external/base/logging_unittest.cc b/libweave/third_party/chromium/base/logging_unittest.cc
similarity index 100%
rename from libweave/external/base/logging_unittest.cc
rename to libweave/third_party/chromium/base/logging_unittest.cc
diff --git a/libweave/external/base/macros.h b/libweave/third_party/chromium/base/macros.h
similarity index 100%
rename from libweave/external/base/macros.h
rename to libweave/third_party/chromium/base/macros.h
diff --git a/libweave/external/base/memory/ref_counted.cc b/libweave/third_party/chromium/base/memory/ref_counted.cc
similarity index 100%
rename from libweave/external/base/memory/ref_counted.cc
rename to libweave/third_party/chromium/base/memory/ref_counted.cc
diff --git a/libweave/external/base/memory/ref_counted.h b/libweave/third_party/chromium/base/memory/ref_counted.h
similarity index 100%
rename from libweave/external/base/memory/ref_counted.h
rename to libweave/third_party/chromium/base/memory/ref_counted.h
diff --git a/libweave/external/base/memory/ref_counted_unittest.cc b/libweave/third_party/chromium/base/memory/ref_counted_unittest.cc
similarity index 100%
rename from libweave/external/base/memory/ref_counted_unittest.cc
rename to libweave/third_party/chromium/base/memory/ref_counted_unittest.cc
diff --git a/libweave/external/base/memory/scoped_ptr.h b/libweave/third_party/chromium/base/memory/scoped_ptr.h
similarity index 100%
rename from libweave/external/base/memory/scoped_ptr.h
rename to libweave/third_party/chromium/base/memory/scoped_ptr.h
diff --git a/libweave/external/base/memory/scoped_ptr_unittest.cc b/libweave/third_party/chromium/base/memory/scoped_ptr_unittest.cc
similarity index 100%
rename from libweave/external/base/memory/scoped_ptr_unittest.cc
rename to libweave/third_party/chromium/base/memory/scoped_ptr_unittest.cc
diff --git a/libweave/external/base/memory/weak_ptr.cc b/libweave/third_party/chromium/base/memory/weak_ptr.cc
similarity index 100%
rename from libweave/external/base/memory/weak_ptr.cc
rename to libweave/third_party/chromium/base/memory/weak_ptr.cc
diff --git a/libweave/external/base/memory/weak_ptr.h b/libweave/third_party/chromium/base/memory/weak_ptr.h
similarity index 100%
rename from libweave/external/base/memory/weak_ptr.h
rename to libweave/third_party/chromium/base/memory/weak_ptr.h
diff --git a/libweave/external/base/memory/weak_ptr_unittest.cc b/libweave/third_party/chromium/base/memory/weak_ptr_unittest.cc
similarity index 100%
rename from libweave/external/base/memory/weak_ptr_unittest.cc
rename to libweave/third_party/chromium/base/memory/weak_ptr_unittest.cc
diff --git a/libweave/external/base/move.h b/libweave/third_party/chromium/base/move.h
similarity index 100%
rename from libweave/external/base/move.h
rename to libweave/third_party/chromium/base/move.h
diff --git a/libweave/external/base/move_unittest.cc b/libweave/third_party/chromium/base/move_unittest.cc
similarity index 100%
rename from libweave/external/base/move_unittest.cc
rename to libweave/third_party/chromium/base/move_unittest.cc
diff --git a/libweave/external/base/numerics/safe_conversions.h b/libweave/third_party/chromium/base/numerics/safe_conversions.h
similarity index 100%
rename from libweave/external/base/numerics/safe_conversions.h
rename to libweave/third_party/chromium/base/numerics/safe_conversions.h
diff --git a/libweave/external/base/numerics/safe_conversions_impl.h b/libweave/third_party/chromium/base/numerics/safe_conversions_impl.h
similarity index 100%
rename from libweave/external/base/numerics/safe_conversions_impl.h
rename to libweave/third_party/chromium/base/numerics/safe_conversions_impl.h
diff --git a/libweave/external/base/numerics/safe_math.h b/libweave/third_party/chromium/base/numerics/safe_math.h
similarity index 100%
rename from libweave/external/base/numerics/safe_math.h
rename to libweave/third_party/chromium/base/numerics/safe_math.h
diff --git a/libweave/external/base/numerics/safe_math_impl.h b/libweave/third_party/chromium/base/numerics/safe_math_impl.h
similarity index 100%
rename from libweave/external/base/numerics/safe_math_impl.h
rename to libweave/third_party/chromium/base/numerics/safe_math_impl.h
diff --git a/libweave/external/base/numerics/safe_numerics_unittest.cc b/libweave/third_party/chromium/base/numerics/safe_numerics_unittest.cc
similarity index 100%
rename from libweave/external/base/numerics/safe_numerics_unittest.cc
rename to libweave/third_party/chromium/base/numerics/safe_numerics_unittest.cc
diff --git a/libweave/external/base/observer_list.h b/libweave/third_party/chromium/base/observer_list.h
similarity index 100%
rename from libweave/external/base/observer_list.h
rename to libweave/third_party/chromium/base/observer_list.h
diff --git a/libweave/external/base/observer_list_unittest.cc b/libweave/third_party/chromium/base/observer_list_unittest.cc
similarity index 100%
rename from libweave/external/base/observer_list_unittest.cc
rename to libweave/third_party/chromium/base/observer_list_unittest.cc
diff --git a/libweave/external/base/posix/eintr_wrapper.h b/libweave/third_party/chromium/base/posix/eintr_wrapper.h
similarity index 100%
rename from libweave/external/base/posix/eintr_wrapper.h
rename to libweave/third_party/chromium/base/posix/eintr_wrapper.h
diff --git a/libweave/external/base/rand_util.cc b/libweave/third_party/chromium/base/rand_util.cc
similarity index 100%
rename from libweave/external/base/rand_util.cc
rename to libweave/third_party/chromium/base/rand_util.cc
diff --git a/libweave/external/base/rand_util.h b/libweave/third_party/chromium/base/rand_util.h
similarity index 100%
rename from libweave/external/base/rand_util.h
rename to libweave/third_party/chromium/base/rand_util.h
diff --git a/libweave/external/base/rand_util_posix.cc b/libweave/third_party/chromium/base/rand_util_posix.cc
similarity index 100%
rename from libweave/external/base/rand_util_posix.cc
rename to libweave/third_party/chromium/base/rand_util_posix.cc
diff --git a/libweave/external/base/rand_util_unittest.cc b/libweave/third_party/chromium/base/rand_util_unittest.cc
similarity index 100%
rename from libweave/external/base/rand_util_unittest.cc
rename to libweave/third_party/chromium/base/rand_util_unittest.cc
diff --git a/libweave/external/base/scoped_clear_errno.h b/libweave/third_party/chromium/base/scoped_clear_errno.h
similarity index 100%
rename from libweave/external/base/scoped_clear_errno.h
rename to libweave/third_party/chromium/base/scoped_clear_errno.h
diff --git a/libweave/external/base/scoped_clear_errno_unittest.cc b/libweave/third_party/chromium/base/scoped_clear_errno_unittest.cc
similarity index 100%
rename from libweave/external/base/scoped_clear_errno_unittest.cc
rename to libweave/third_party/chromium/base/scoped_clear_errno_unittest.cc
diff --git a/libweave/external/base/scoped_observer.h b/libweave/third_party/chromium/base/scoped_observer.h
similarity index 100%
rename from libweave/external/base/scoped_observer.h
rename to libweave/third_party/chromium/base/scoped_observer.h
diff --git a/libweave/external/base/strings/string_number_conversions.cc b/libweave/third_party/chromium/base/strings/string_number_conversions.cc
similarity index 100%
rename from libweave/external/base/strings/string_number_conversions.cc
rename to libweave/third_party/chromium/base/strings/string_number_conversions.cc
diff --git a/libweave/external/base/strings/string_number_conversions.h b/libweave/third_party/chromium/base/strings/string_number_conversions.h
similarity index 100%
rename from libweave/external/base/strings/string_number_conversions.h
rename to libweave/third_party/chromium/base/strings/string_number_conversions.h
diff --git a/libweave/external/base/strings/string_number_conversions_unittest.cc b/libweave/third_party/chromium/base/strings/string_number_conversions_unittest.cc
similarity index 100%
rename from libweave/external/base/strings/string_number_conversions_unittest.cc
rename to libweave/third_party/chromium/base/strings/string_number_conversions_unittest.cc
diff --git a/libweave/external/base/strings/string_piece.cc b/libweave/third_party/chromium/base/strings/string_piece.cc
similarity index 100%
rename from libweave/external/base/strings/string_piece.cc
rename to libweave/third_party/chromium/base/strings/string_piece.cc
diff --git a/libweave/external/base/strings/string_piece.h b/libweave/third_party/chromium/base/strings/string_piece.h
similarity index 100%
rename from libweave/external/base/strings/string_piece.h
rename to libweave/third_party/chromium/base/strings/string_piece.h
diff --git a/libweave/external/base/strings/string_piece_unittest.cc b/libweave/third_party/chromium/base/strings/string_piece_unittest.cc
similarity index 100%
rename from libweave/external/base/strings/string_piece_unittest.cc
rename to libweave/third_party/chromium/base/strings/string_piece_unittest.cc
diff --git a/libweave/external/base/strings/string_util.cc b/libweave/third_party/chromium/base/strings/string_util.cc
similarity index 100%
rename from libweave/external/base/strings/string_util.cc
rename to libweave/third_party/chromium/base/strings/string_util.cc
diff --git a/libweave/external/base/strings/string_util.h b/libweave/third_party/chromium/base/strings/string_util.h
similarity index 100%
rename from libweave/external/base/strings/string_util.h
rename to libweave/third_party/chromium/base/strings/string_util.h
diff --git a/libweave/external/base/strings/string_util_constants.cc b/libweave/third_party/chromium/base/strings/string_util_constants.cc
similarity index 100%
rename from libweave/external/base/strings/string_util_constants.cc
rename to libweave/third_party/chromium/base/strings/string_util_constants.cc
diff --git a/libweave/external/base/strings/string_util_posix.h b/libweave/third_party/chromium/base/strings/string_util_posix.h
similarity index 100%
rename from libweave/external/base/strings/string_util_posix.h
rename to libweave/third_party/chromium/base/strings/string_util_posix.h
diff --git a/libweave/external/base/strings/string_util_unittest.cc b/libweave/third_party/chromium/base/strings/string_util_unittest.cc
similarity index 100%
rename from libweave/external/base/strings/string_util_unittest.cc
rename to libweave/third_party/chromium/base/strings/string_util_unittest.cc
diff --git a/libweave/external/base/strings/stringprintf.cc b/libweave/third_party/chromium/base/strings/stringprintf.cc
similarity index 100%
rename from libweave/external/base/strings/stringprintf.cc
rename to libweave/third_party/chromium/base/strings/stringprintf.cc
diff --git a/libweave/external/base/strings/stringprintf.h b/libweave/third_party/chromium/base/strings/stringprintf.h
similarity index 100%
rename from libweave/external/base/strings/stringprintf.h
rename to libweave/third_party/chromium/base/strings/stringprintf.h
diff --git a/libweave/external/base/strings/stringprintf_unittest.cc b/libweave/third_party/chromium/base/strings/stringprintf_unittest.cc
similarity index 100%
rename from libweave/external/base/strings/stringprintf_unittest.cc
rename to libweave/third_party/chromium/base/strings/stringprintf_unittest.cc
diff --git a/libweave/external/base/strings/utf_string_conversion_utils.cc b/libweave/third_party/chromium/base/strings/utf_string_conversion_utils.cc
similarity index 100%
rename from libweave/external/base/strings/utf_string_conversion_utils.cc
rename to libweave/third_party/chromium/base/strings/utf_string_conversion_utils.cc
diff --git a/libweave/external/base/strings/utf_string_conversion_utils.h b/libweave/third_party/chromium/base/strings/utf_string_conversion_utils.h
similarity index 100%
rename from libweave/external/base/strings/utf_string_conversion_utils.h
rename to libweave/third_party/chromium/base/strings/utf_string_conversion_utils.h
diff --git a/libweave/external/base/template_util.h b/libweave/third_party/chromium/base/template_util.h
similarity index 100%
rename from libweave/external/base/template_util.h
rename to libweave/third_party/chromium/base/template_util.h
diff --git a/libweave/external/base/template_util_unittest.cc b/libweave/third_party/chromium/base/template_util_unittest.cc
similarity index 100%
rename from libweave/external/base/template_util_unittest.cc
rename to libweave/third_party/chromium/base/template_util_unittest.cc
diff --git a/libweave/external/base/third_party/dmg_fp/LICENSE b/libweave/third_party/chromium/base/third_party/dmg_fp/LICENSE
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/LICENSE
rename to libweave/third_party/chromium/base/third_party/dmg_fp/LICENSE
diff --git a/libweave/external/base/third_party/dmg_fp/README.chromium b/libweave/third_party/chromium/base/third_party/dmg_fp/README.chromium
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/README.chromium
rename to libweave/third_party/chromium/base/third_party/dmg_fp/README.chromium
diff --git a/libweave/external/base/third_party/dmg_fp/dmg_fp.h b/libweave/third_party/chromium/base/third_party/dmg_fp/dmg_fp.h
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/dmg_fp.h
rename to libweave/third_party/chromium/base/third_party/dmg_fp/dmg_fp.h
diff --git a/libweave/external/base/third_party/dmg_fp/dtoa.cc b/libweave/third_party/chromium/base/third_party/dmg_fp/dtoa.cc
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/dtoa.cc
rename to libweave/third_party/chromium/base/third_party/dmg_fp/dtoa.cc
diff --git a/libweave/external/base/third_party/dmg_fp/dtoa_wrapper.cc b/libweave/third_party/chromium/base/third_party/dmg_fp/dtoa_wrapper.cc
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/dtoa_wrapper.cc
rename to libweave/third_party/chromium/base/third_party/dmg_fp/dtoa_wrapper.cc
diff --git a/libweave/external/base/third_party/dmg_fp/g_fmt.cc b/libweave/third_party/chromium/base/third_party/dmg_fp/g_fmt.cc
similarity index 100%
rename from libweave/external/base/third_party/dmg_fp/g_fmt.cc
rename to libweave/third_party/chromium/base/third_party/dmg_fp/g_fmt.cc
diff --git a/libweave/external/base/third_party/icu/LICENSE b/libweave/third_party/chromium/base/third_party/icu/LICENSE
similarity index 100%
rename from libweave/external/base/third_party/icu/LICENSE
rename to libweave/third_party/chromium/base/third_party/icu/LICENSE
diff --git a/libweave/external/base/third_party/icu/README.chromium b/libweave/third_party/chromium/base/third_party/icu/README.chromium
similarity index 100%
rename from libweave/external/base/third_party/icu/README.chromium
rename to libweave/third_party/chromium/base/third_party/icu/README.chromium
diff --git a/libweave/external/base/third_party/icu/icu_utf.cc b/libweave/third_party/chromium/base/third_party/icu/icu_utf.cc
similarity index 100%
rename from libweave/external/base/third_party/icu/icu_utf.cc
rename to libweave/third_party/chromium/base/third_party/icu/icu_utf.cc
diff --git a/libweave/external/base/third_party/icu/icu_utf.h b/libweave/third_party/chromium/base/third_party/icu/icu_utf.h
similarity index 100%
rename from libweave/external/base/third_party/icu/icu_utf.h
rename to libweave/third_party/chromium/base/third_party/icu/icu_utf.h
diff --git a/libweave/external/base/time/clock.cc b/libweave/third_party/chromium/base/time/clock.cc
similarity index 100%
rename from libweave/external/base/time/clock.cc
rename to libweave/third_party/chromium/base/time/clock.cc
diff --git a/libweave/external/base/time/clock.h b/libweave/third_party/chromium/base/time/clock.h
similarity index 100%
rename from libweave/external/base/time/clock.h
rename to libweave/third_party/chromium/base/time/clock.h
diff --git a/libweave/external/base/time/default_clock.cc b/libweave/third_party/chromium/base/time/default_clock.cc
similarity index 100%
rename from libweave/external/base/time/default_clock.cc
rename to libweave/third_party/chromium/base/time/default_clock.cc
diff --git a/libweave/external/base/time/default_clock.h b/libweave/third_party/chromium/base/time/default_clock.h
similarity index 100%
rename from libweave/external/base/time/default_clock.h
rename to libweave/third_party/chromium/base/time/default_clock.h
diff --git a/libweave/external/base/time/time.cc b/libweave/third_party/chromium/base/time/time.cc
similarity index 100%
rename from libweave/external/base/time/time.cc
rename to libweave/third_party/chromium/base/time/time.cc
diff --git a/libweave/external/base/time/time.h b/libweave/third_party/chromium/base/time/time.h
similarity index 100%
rename from libweave/external/base/time/time.h
rename to libweave/third_party/chromium/base/time/time.h
diff --git a/libweave/external/base/time/time_posix.cc b/libweave/third_party/chromium/base/time/time_posix.cc
similarity index 100%
rename from libweave/external/base/time/time_posix.cc
rename to libweave/third_party/chromium/base/time/time_posix.cc
diff --git a/libweave/external/base/time/time_unittest.cc b/libweave/third_party/chromium/base/time/time_unittest.cc
similarity index 100%
rename from libweave/external/base/time/time_unittest.cc
rename to libweave/third_party/chromium/base/time/time_unittest.cc
diff --git a/libweave/external/base/tuple.h b/libweave/third_party/chromium/base/tuple.h
similarity index 100%
rename from libweave/external/base/tuple.h
rename to libweave/third_party/chromium/base/tuple.h
diff --git a/libweave/external/base/tuple_unittest.cc b/libweave/third_party/chromium/base/tuple_unittest.cc
similarity index 100%
rename from libweave/external/base/tuple_unittest.cc
rename to libweave/third_party/chromium/base/tuple_unittest.cc
diff --git a/libweave/external/base/values.cc b/libweave/third_party/chromium/base/values.cc
similarity index 100%
rename from libweave/external/base/values.cc
rename to libweave/third_party/chromium/base/values.cc
diff --git a/libweave/external/base/values.h b/libweave/third_party/chromium/base/values.h
similarity index 100%
rename from libweave/external/base/values.h
rename to libweave/third_party/chromium/base/values.h
diff --git a/libweave/external/base/values_unittest.cc b/libweave/third_party/chromium/base/values_unittest.cc
similarity index 100%
rename from libweave/external/base/values_unittest.cc
rename to libweave/third_party/chromium/base/values_unittest.cc
diff --git a/libweave/external/crypto/p224.cc b/libweave/third_party/chromium/crypto/p224.cc
similarity index 99%
rename from libweave/external/crypto/p224.cc
rename to libweave/third_party/chromium/crypto/p224.cc
index 8ec4034..81bce3a 100644
--- a/libweave/external/crypto/p224.cc
+++ b/libweave/third_party/chromium/crypto/p224.cc
@@ -7,11 +7,10 @@
//
// See http://www.imperialviolet.org/2010/12/04/ecc.html ([1]) for background.
-#include "external/crypto/p224.h"
+#include "third_party/chromium/crypto/p224.h"
#include <string.h>
-namespace weave {
namespace crypto {
namespace p224 {
@@ -767,4 +766,3 @@
} // namespace p224
} // namespace crypto
-} // namespace weave
diff --git a/libweave/external/crypto/p224.h b/libweave/third_party/chromium/crypto/p224.h
similarity index 90%
rename from libweave/external/crypto/p224.h
rename to libweave/third_party/chromium/crypto/p224.h
index ea15acf..7574389 100644
--- a/libweave/external/crypto/p224.h
+++ b/libweave/third_party/chromium/crypto/p224.h
@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef LIBWEAVE_EXTERNAL_CRYPTO_P224_H_
-#define LIBWEAVE_EXTERNAL_CRYPTO_P224_H_
+#ifndef LIBWEAVE_THIRD_PARTY_CHROMIUM_P224_H_
+#define LIBWEAVE_THIRD_PARTY_CHROMIUM_P224_H_
#include <string>
#include <base/basictypes.h>
-namespace weave {
namespace crypto {
// P224 implements an elliptic curve group, commonly known as P224 and defined
@@ -54,6 +53,5 @@
} // namespace p224
} // namespace crypto
-} // namespace weave
-#endif // LIBWEAVE_EXTERNAL_CRYPTO_P224_H_
+#endif // LIBWEAVE_THIRD_PARTY_CHROMIUM_P224_H_
diff --git a/libweave/external/crypto/p224_spake.cc b/libweave/third_party/chromium/crypto/p224_spake.cc
similarity index 98%
rename from libweave/external/crypto/p224_spake.cc
rename to libweave/third_party/chromium/crypto/p224_spake.cc
index 1db768e..6d82322 100644
--- a/libweave/external/crypto/p224_spake.cc
+++ b/libweave/third_party/chromium/crypto/p224_spake.cc
@@ -5,16 +5,15 @@
// This code implements SPAKE2, a variant of EKE:
// http://www.di.ens.fr/~pointche/pub.php?reference=AbPo04
-#include "external/crypto/p224_spake.h"
+#include "third_party/chromium/crypto/p224_spake.h"
#include <algorithm>
#include <base/logging.h>
#include <base/rand_util.h>
-#include "external/crypto/p224.h"
+#include "third_party/chromium/crypto/p224.h"
-namespace weave {
namespace crypto {
namespace {
@@ -283,4 +282,3 @@
}
} // namespace crypto
-} // namespace weave
diff --git a/libweave/external/crypto/p224_spake.h b/libweave/third_party/chromium/crypto/p224_spake.h
similarity index 94%
rename from libweave/external/crypto/p224_spake.h
rename to libweave/third_party/chromium/crypto/p224_spake.h
index 14bde6d..dcfd0fe 100644
--- a/libweave/external/crypto/p224_spake.h
+++ b/libweave/third_party/chromium/crypto/p224_spake.h
@@ -2,17 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef LIBWEAVE_EXTERNAL_CRYPTO_P224_SPAKE_H_
-#define LIBWEAVE_EXTERNAL_CRYPTO_P224_SPAKE_H_
+#ifndef LIBWEAVE_THIRD_PARTY_CHROMIUM_P224_SPAKE_H_
#include <string>
#include <base/gtest_prod_util.h>
-#include "external/crypto/p224.h"
-#include "external/crypto/sha2.h"
+#include "third_party/chromium/crypto/p224.h"
+#include "third_party/chromium/crypto/sha2.h"
-namespace weave {
namespace crypto {
// P224EncryptedKeyExchange implements SPAKE2, a variant of Encrypted
@@ -124,6 +122,5 @@
};
} // namespace crypto
-} // namespace weave
-#endif // LIBWEAVE_EXTERNAL_CRYPTO_P224_SPAKE_H_
+#endif // LIBWEAVE_THIRD_PARTY_CHROMIUM_P224_SPAKE_H_
diff --git a/libweave/external/crypto/p224_spake_unittest.cc b/libweave/third_party/chromium/crypto/p224_spake_unittest.cc
similarity index 98%
rename from libweave/external/crypto/p224_spake_unittest.cc
rename to libweave/third_party/chromium/crypto/p224_spake_unittest.cc
index 21cda88..9a9f9d2 100644
--- a/libweave/external/crypto/p224_spake_unittest.cc
+++ b/libweave/third_party/chromium/crypto/p224_spake_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "external/crypto/p224_spake.h"
+#include "third_party/chromium/crypto/p224_spake.h"
#include <string>
@@ -10,7 +10,6 @@
#include <base/strings/string_number_conversions.h>
#include <gtest/gtest.h>
-namespace weave {
namespace crypto {
namespace {
@@ -173,4 +172,3 @@
}
} // namespace crypto
-} // namespace weave
diff --git a/libweave/external/crypto/p224_unittest.cc b/libweave/third_party/chromium/crypto/p224_unittest.cc
similarity index 99%
rename from libweave/external/crypto/p224_unittest.cc
rename to libweave/third_party/chromium/crypto/p224_unittest.cc
index 6bfda46..0540dbb 100644
--- a/libweave/external/crypto/p224_unittest.cc
+++ b/libweave/third_party/chromium/crypto/p224_unittest.cc
@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "third_party/chromium/crypto/p224.h"
+
#include <stdio.h>
#include <string.h>
#include <gtest/gtest.h>
-#include "external/crypto/p224.h"
-
-namespace weave {
namespace crypto {
using p224::Point;
@@ -823,4 +822,3 @@
}
} // namespace crypto
-} // namespace weave
diff --git a/libweave/external/crypto/sha2.cc b/libweave/third_party/chromium/crypto/sha2.cc
similarity index 91%
rename from libweave/external/crypto/sha2.cc
rename to libweave/third_party/chromium/crypto/sha2.cc
index 4ad40ba..7dcef0b 100644
--- a/libweave/external/crypto/sha2.cc
+++ b/libweave/third_party/chromium/crypto/sha2.cc
@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "external/crypto/sha2.h"
+#include "third_party/chromium/crypto/sha2.h"
#include <algorithm>
#include <openssl/sha.h>
#include <base/memory/scoped_ptr.h>
-namespace weave {
namespace crypto {
void SHA256HashString(const std::string& str, uint8_t* output, size_t len) {
@@ -29,4 +28,3 @@
}
} // namespace crypto
-} // namespace weave
diff --git a/libweave/external/crypto/sha2.h b/libweave/third_party/chromium/crypto/sha2.h
similarity index 83%
rename from libweave/external/crypto/sha2.h
rename to libweave/third_party/chromium/crypto/sha2.h
index 920a798..8e05388 100644
--- a/libweave/external/crypto/sha2.h
+++ b/libweave/third_party/chromium/crypto/sha2.h
@@ -2,12 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef LIBWEAVE_EXTERNAL_CRYPTO_SHA2_H_
-#define LIBWEAVE_EXTERNAL_CRYPTO_SHA2_H_
+#ifndef LIBWEAVE_THIRD_PARTY_CHROMIUM_SHA2_H_
+#define LIBWEAVE_THIRD_PARTY_CHROMIUM_SHA2_H_
#include <string>
-namespace weave {
namespace crypto {
// These functions perform SHA-256 operations.
@@ -26,6 +25,5 @@
std::string SHA256HashString(const std::string& str);
} // namespace crypto
-} // namespace weave
-#endif // LIBWEAVE_EXTERNAL_CRYPTO_SHA2_H_
+#endif // LIBWEAVE_THIRD_PARTY_CHROMIUM_SHA2_H_
diff --git a/libweave/external/crypto/sha2_unittest.cc b/libweave/third_party/chromium/crypto/sha2_unittest.cc
similarity index 98%
rename from libweave/external/crypto/sha2_unittest.cc
rename to libweave/third_party/chromium/crypto/sha2_unittest.cc
index cd89043..0c30f45 100644
--- a/libweave/external/crypto/sha2_unittest.cc
+++ b/libweave/third_party/chromium/crypto/sha2_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "external/crypto/sha2.h"
+#include "third_party/chromium/crypto/sha2.h"
#include <base/basictypes.h>
#include <gtest/gtest.h>