// 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_