Post error patches to the server
BUG:23906692
Change-Id: Ibca7c7b77b6fba4a69d9f50a18260cfed61e7a8c
Reviewed-on: https://weave-review.googlesource.com/1260
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc
index ff0d450..179c5d3 100644
--- a/libweave/examples/ubuntu/main.cc
+++ b/libweave/examples/ubuntu/main.cc
@@ -51,7 +51,7 @@
"_greeter": {
"_greet": {
"minimalRole": "user",
- "parameters": { "_name": "string", "_count": "integer"},
+ "parameters": { "_name": "string", "_count": {"minimum": 1, "maximum": 100}},
"progress": { "_todo": "integer"},
"results": { "_greeting": "string" }
}
@@ -92,10 +92,15 @@
return;
std::string name;
- if (!cmd->GetParameters()->GetString("_name", &name))
- name = "anonymous";
+ 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;
+ }
- if (todo > 0) {
+ if (todo-- > 0) {
LOG(INFO) << "Hello " << name;
base::DictionaryValue progress;
@@ -107,7 +112,7 @@
device_->SetStateProperties(state, nullptr);
}
- if (--todo > 0) {
+ if (todo > 0) {
task_runner_->PostDelayedTask(
FROM_HERE, base::Bind(&CommandHandler::DoGreet,
weak_ptr_factory_.GetWeakPtr(), command, todo),
diff --git a/libweave/src/commands/cloud_command_proxy.cc b/libweave/src/commands/cloud_command_proxy.cc
index 9f6ada3..931e3e4 100644
--- a/libweave/src/commands/cloud_command_proxy.cc
+++ b/libweave/src/commands/cloud_command_proxy.cc
@@ -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,
diff --git a/libweave/src/commands/cloud_command_proxy.h b/libweave/src/commands/cloud_command_proxy.h
index 711befa..12432df 100644
--- a/libweave/src/commands/cloud_command_proxy.h
+++ b/libweave/src/commands/cloud_command_proxy.h
@@ -39,10 +39,11 @@
~CloudCommandProxy() override = default;
// CommandProxyInterface implementation/overloads.
+ void OnCommandDestroyed() override;
+ void OnErrorChanged() override;
+ void OnProgressChanged() override;
void OnResultsChanged() override;
void OnStatusChanged() override;
- void OnProgressChanged() override;
- void OnCommandDestroyed() override;
private:
using UpdateID = StateChangeQueueInterface::UpdateID;
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index 4701bb6..e15b1b7 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -159,6 +159,7 @@
bool CommandInstance::SetError(const Error* command_error, ErrorPtr* error) {
error_ = command_error ? command_error->Clone() : nullptr;
+ FOR_EACH_OBSERVER(Observer, observers_, OnErrorChanged());
return SetStatus(CommandStatus::kError, error);
}
@@ -296,6 +297,7 @@
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(CommandStatus::kAborted, error);
RemoveFromQueue();
// The command will be destroyed after that, so do not access any members.
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index e8a838d..843087c 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -33,10 +33,11 @@
public:
class Observer {
public:
+ virtual void OnCommandDestroyed() = 0;
+ virtual void OnErrorChanged() = 0;
+ virtual void OnProgressChanged() = 0;
virtual void OnResultsChanged() = 0;
virtual void OnStatusChanged() = 0;
- virtual void OnProgressChanged() = 0;
- virtual void OnCommandDestroyed() = 0;
protected:
virtual ~Observer() = default;