| // Copyright 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. |
| |
| #ifndef LIBWEAVED_COMMAND_H_ |
| #define LIBWEAVED_COMMAND_H_ |
| |
| #include <string> |
| |
| #include <base/macros.h> |
| #include <binder/Status.h> |
| #include <brillo/errors/error.h> |
| #include <brillo/value_conversion.h> |
| #include <libweaved/export.h> |
| #include <utils/StrongPointer.h> |
| |
| namespace android { |
| namespace weave { |
| class IWeaveCommand; |
| } // namespace weave |
| } // namespace android |
| |
| namespace weaved { |
| |
| class ServiceImpl; |
| |
| class LIBWEAVED_EXPORT Command final { |
| public: |
| enum class State { |
| kQueued, |
| kInProgress, |
| kPaused, |
| kError, |
| kDone, |
| kCancelled, |
| kAborted, |
| kExpired, |
| }; |
| |
| enum class Origin { kLocal, kCloud }; |
| |
| ~Command(); |
| |
| // Returns the full command ID. |
| std::string GetID() const; |
| |
| // Returns the full name of the command. |
| std::string GetName() const; |
| |
| // Returns the name of the component this command was sent to. |
| std::string GetComponent() const; |
| |
| // Returns the command state. |
| Command::State GetState() const; |
| |
| // Returns the origin of the command. |
| Command::Origin GetOrigin() const; |
| |
| // Returns the command parameters. |
| const base::DictionaryValue& GetParameters() const; |
| |
| // Helper function to get a command parameter of particular type T from the |
| // command parameter list. Returns default value for type T (e.g. 0 for int or |
| // or "" for std::string) if the parameter with the given name is not found or |
| // is of incorrect type. |
| template <typename T> |
| T GetParameter(const std::string& name) const { |
| const base::DictionaryValue& parameters = GetParameters(); |
| T param_value{}; |
| const base::Value* value = nullptr; |
| if (parameters.Get(name, &value)) |
| brillo::FromValue(*value, ¶m_value); |
| return param_value; |
| } |
| |
| // Updates the command progress. The |progress| should match the schema. |
| // Returns false if |progress| value is incorrect. |
| bool SetProgress(const base::DictionaryValue& progress, |
| brillo::ErrorPtr* error); |
| |
| // Sets command into terminal "done" state. |
| // Updates the command results. The |results| should match the schema. |
| // Returns false if |results| value is incorrect. |
| bool Complete(const base::DictionaryValue& results, |
| brillo::ErrorPtr* error); |
| |
| // Aborts command execution. |
| // Sets command into terminal "aborted" state. |
| bool Abort(const std::string& error_code, |
| const std::string& error_message, |
| brillo::ErrorPtr* error); |
| |
| // Aborts command execution. |
| // Sets command into terminal "aborted" state and uses the error information |
| // from the |command_error| object. The error codes extracted from |
| // |command_error| are automatically prepended with an underscore ("_"). |
| bool AbortWithCustomError(const brillo::Error* command_error, |
| brillo::ErrorPtr* error); |
| // AbortWithCustomError overload for specifying the error information as |
| // binder::Status. |
| bool AbortWithCustomError(android::binder::Status status, |
| brillo::ErrorPtr* error); |
| |
| // Cancels command execution. |
| // Sets command into terminal "canceled" state. |
| bool Cancel(brillo::ErrorPtr* error); |
| |
| // Sets command into paused state. |
| // This is not terminal state. Command can be resumed with |SetProgress| call. |
| bool Pause(brillo::ErrorPtr* error); |
| |
| // Sets command into error state and assign error. |
| // This is not terminal state. Command can be resumed with |SetProgress| call. |
| bool SetError(const std::string& error_code, |
| const std::string& error_message, |
| brillo::ErrorPtr* error); |
| |
| // Sets command into error state and assign error. |
| // This is not terminal state. Command can be resumed with |SetProgress| call. |
| // Uses the error information from the |command_error| object. |
| // The error codes extracted from |command_error| are automatically prepended |
| // with an underscore ("_"). |
| bool SetCustomError(const brillo::Error* command_error, |
| brillo::ErrorPtr* error); |
| // SetError overload for specifying the error information as binder::Status. |
| bool SetCustomError(android::binder::Status status, |
| brillo::ErrorPtr* error); |
| |
| protected: |
| explicit Command(const android::sp<android::weave::IWeaveCommand>& proxy); |
| |
| private: |
| friend class ServiceImpl; |
| android::sp<android::weave::IWeaveCommand> binder_proxy_; |
| mutable std::unique_ptr<base::DictionaryValue> parameter_cache_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Command); |
| }; |
| |
| } // namespace weave |
| |
| #endif // LIBWEAVED_COMMAND_H_ |