blob: db9c51955ca3f5f20ff96a832fd4519a60252ac8 [file] [log] [blame]
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BUFFET_COMMANDS_COMMAND_INSTANCE_H_
6#define BUFFET_COMMANDS_COMMAND_INSTANCE_H_
7
8#include <map>
9#include <memory>
10#include <string>
Anton Muhin4dc37852014-10-30 22:17:25 +040011#include <vector>
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070012
Alex Vakulenko132617a2014-09-04 08:59:43 -070013#include <base/macros.h>
Alex Vakulenkoa8b95bc2014-08-27 11:00:57 -070014#include <chromeos/errors/error.h>
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070015
16#include "buffet/commands/prop_values.h"
17#include "buffet/commands/schema_utils.h"
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070018
19namespace base {
20class Value;
21} // namespace base
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070022
23namespace buffet {
24
Anton Muhincfde8692014-11-25 03:36:59 +040025class CommandDefinition;
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070026class CommandDictionary;
Alex Vakulenkof6b38712014-09-03 16:23:38 -070027class CommandProxyInterface;
28class CommandQueue;
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070029
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070030class CommandInstance final {
31 public:
32 // Construct a command instance given the full command |name| which must
33 // be in format "<package_name>.<command_name>", a command |category| and
34 // a list of parameters and their values specified in |parameters|.
Alex Vakulenko5ef75792015-03-19 15:50:44 -070035 CommandInstance(const std::string& name,
Alex Vakulenkof784e212015-04-20 12:33:52 -070036 const std::string& origin,
Alex Vakulenko5ef75792015-03-19 15:50:44 -070037 const CommandDefinition* command_definition,
38 const native_types::Object& parameters);
Anton Muhinb66a9302014-11-10 22:15:22 +040039 ~CommandInstance();
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070040
Alex Vakulenkofedc4872014-08-20 12:38:43 -070041 // Returns the full command ID.
42 const std::string& GetID() const { return id_; }
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070043 // Returns the full name of the command.
44 const std::string& GetName() const { return name_; }
45 // Returns the command category.
Anton Muhincfde8692014-11-25 03:36:59 +040046 const std::string& GetCategory() const;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070047 // Returns the command parameters and their values.
48 const native_types::Object& GetParameters() const { return parameters_; }
Anton Muhincfde8692014-11-25 03:36:59 +040049 // Returns the command results and their values.
50 const native_types::Object& GetResults() const { return results_; }
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070051 // Finds a command parameter value by parameter |name|. If the parameter
Alex Vakulenko5ef75792015-03-19 15:50:44 -070052 // with given name does not exist, returns nullptr.
53 const PropValue* FindParameter(const std::string& name) const;
Alex Vakulenkof784e212015-04-20 12:33:52 -070054 // Returns the full name of the command.
55 const std::string& GetOrigin() const { return origin_; }
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070056
Anton Muhincfde8692014-11-25 03:36:59 +040057 // Returns command definition.
Alex Vakulenko5ef75792015-03-19 15:50:44 -070058 const CommandDefinition* GetCommandDefinition() const {
Anton Muhincfde8692014-11-25 03:36:59 +040059 return command_definition_;
60 }
61
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070062 // Parses a command instance JSON definition and constructs a CommandInstance
63 // object, checking the JSON |value| against the command definition schema
64 // found in command |dictionary|. On error, returns null unique_ptr and
65 // fills in error details in |error|.
Alex Vakulenkofedc4872014-08-20 12:38:43 -070066 static std::unique_ptr<CommandInstance> FromJson(
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070067 const base::Value* value,
Alex Vakulenkof784e212015-04-20 12:33:52 -070068 const std::string& origin,
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070069 const CommandDictionary& dictionary,
Alex Vakulenko5f472062014-08-14 17:54:04 -070070 chromeos::ErrorPtr* error);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070071
Vitaly Buka906d39e2015-03-24 10:08:26 -070072 // Returns JSON representation of the command.
73 std::unique_ptr<base::DictionaryValue> ToJson() const;
74
Alex Vakulenkofedc4872014-08-20 12:38:43 -070075 // Sets the command ID (normally done by CommandQueue when the command
76 // instance is added to it).
77 void SetID(const std::string& id) { id_ = id; }
Anton Muhin4dc37852014-10-30 22:17:25 +040078 // Adds a proxy for this command.
Alex Vakulenkof6b38712014-09-03 16:23:38 -070079 // The proxy object is not owned by this class.
Anton Muhinb66a9302014-11-10 22:15:22 +040080 void AddProxy(std::unique_ptr<CommandProxyInterface> proxy);
Alex Vakulenkof6b38712014-09-03 16:23:38 -070081 // Sets the pointer to queue this command is part of.
82 void SetCommandQueue(CommandQueue* queue) { queue_ = queue; }
83
Anton Muhincfde8692014-11-25 03:36:59 +040084 // Updates the command results. The |results| should match the schema.
85 // Returns false if |results| value is incorrect.
86 bool SetResults(const native_types::Object& results);
87
Alex Vakulenkof6b38712014-09-03 16:23:38 -070088 // Updates the command execution progress. The |progress| must be between
Anton Muhincfde8692014-11-25 03:36:59 +040089 // 0 and 100. Returns false if |progress| value is incorrect.
Alex Vakulenkof6b38712014-09-03 16:23:38 -070090 bool SetProgress(int progress);
91 // Aborts command execution.
92 void Abort();
93 // Cancels command execution.
94 void Cancel();
95 // Marks the command as completed successfully.
96 void Done();
97
98 // Command state getters.
99 int GetProgress() const { return progress_; }
100 const std::string& GetStatus() const { return status_; }
101
Alex Vakulenko808e2d82015-04-08 15:45:56 -0700102 // Returns the "progress" portion of JSON command resource.
103 std::unique_ptr<base::Value> GetProgressJson() const;
104
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700105 // Values for command execution status.
106 static const char kStatusQueued[];
107 static const char kStatusInProgress[];
108 static const char kStatusPaused[];
109 static const char kStatusError[];
110 static const char kStatusDone[];
Alex Vakulenkodb221242015-03-13 14:02:46 -0700111 static const char kStatusCancelled[];
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700112 static const char kStatusAborted[];
113 static const char kStatusExpired[];
Alex Vakulenkofedc4872014-08-20 12:38:43 -0700114
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700115 private:
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700116 // Helper function to update the command status.
117 // Used by Abort(), Cancel(), Done() methods.
118 void SetStatus(const std::string& status);
119 // Helper method that removes this command from the command queue.
120 // Note that since the command queue owns the lifetime of the command instance
121 // object, removing a command from the queue will also destroy it.
122 void RemoveFromQueue();
123
Alex Vakulenkofedc4872014-08-20 12:38:43 -0700124 // Unique command ID within a command queue.
125 std::string id_;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700126 // Full command name as "<package_name>.<command_name>".
127 std::string name_;
Alex Vakulenkof784e212015-04-20 12:33:52 -0700128 // The origin of the command, either "local" or "cloud".
129 std::string origin_;
Anton Muhincfde8692014-11-25 03:36:59 +0400130 // Command definition.
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700131 const CommandDefinition* command_definition_;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700132 // Command parameters and their values.
133 native_types::Object parameters_;
Anton Muhincfde8692014-11-25 03:36:59 +0400134 // Command results.
135 native_types::Object results_;
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700136 // Current command status.
137 std::string status_ = kStatusQueued;
138 // Current command execution progress.
139 int progress_ = 0;
Anton Muhin4dc37852014-10-30 22:17:25 +0400140 // Command proxies for the command.
Anton Muhinb66a9302014-11-10 22:15:22 +0400141 std::vector<std::unique_ptr<CommandProxyInterface>> proxies_;
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700142 // Pointer to the command queue this command instance is added to.
143 // The queue owns the command instance, so it outlives this object.
144 CommandQueue* queue_ = nullptr;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700145
Anton Muhinb66a9302014-11-10 22:15:22 +0400146 friend class DBusCommandDispacherTest;
147 friend class DBusCommandProxyTest;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700148 DISALLOW_COPY_AND_ASSIGN(CommandInstance);
149};
150
151} // namespace buffet
152
153#endif // BUFFET_COMMANDS_COMMAND_INSTANCE_H_