blob: 45cf485c69ea17a5aac5711162b4fe4774d270dd [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|.
Anton Muhincfde8692014-11-25 03:36:59 +040035 CommandInstance(
36 const std::string& name,
37 const std::shared_ptr<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
52 // with given name does not exist, returns null shared_ptr.
53 std::shared_ptr<const PropValue> FindParameter(const std::string& name) const;
54
Anton Muhincfde8692014-11-25 03:36:59 +040055 // Returns command definition.
56 std::shared_ptr<const CommandDefinition> GetCommandDefinition() const {
57 return command_definition_;
58 }
59
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070060 // Parses a command instance JSON definition and constructs a CommandInstance
61 // object, checking the JSON |value| against the command definition schema
62 // found in command |dictionary|. On error, returns null unique_ptr and
63 // fills in error details in |error|.
Alex Vakulenkofedc4872014-08-20 12:38:43 -070064 static std::unique_ptr<CommandInstance> FromJson(
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070065 const base::Value* value,
66 const CommandDictionary& dictionary,
Alex Vakulenko5f472062014-08-14 17:54:04 -070067 chromeos::ErrorPtr* error);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070068
Alex Vakulenkofedc4872014-08-20 12:38:43 -070069 // Sets the command ID (normally done by CommandQueue when the command
70 // instance is added to it).
71 void SetID(const std::string& id) { id_ = id; }
Anton Muhin4dc37852014-10-30 22:17:25 +040072 // Adds a proxy for this command.
Alex Vakulenkof6b38712014-09-03 16:23:38 -070073 // The proxy object is not owned by this class.
Anton Muhinb66a9302014-11-10 22:15:22 +040074 void AddProxy(std::unique_ptr<CommandProxyInterface> proxy);
Alex Vakulenkof6b38712014-09-03 16:23:38 -070075 // Sets the pointer to queue this command is part of.
76 void SetCommandQueue(CommandQueue* queue) { queue_ = queue; }
77
Anton Muhincfde8692014-11-25 03:36:59 +040078 // Updates the command results. The |results| should match the schema.
79 // Returns false if |results| value is incorrect.
80 bool SetResults(const native_types::Object& results);
81
Alex Vakulenkof6b38712014-09-03 16:23:38 -070082 // Updates the command execution progress. The |progress| must be between
Anton Muhincfde8692014-11-25 03:36:59 +040083 // 0 and 100. Returns false if |progress| value is incorrect.
Alex Vakulenkof6b38712014-09-03 16:23:38 -070084 bool SetProgress(int progress);
85 // Aborts command execution.
86 void Abort();
87 // Cancels command execution.
88 void Cancel();
89 // Marks the command as completed successfully.
90 void Done();
91
92 // Command state getters.
93 int GetProgress() const { return progress_; }
94 const std::string& GetStatus() const { return status_; }
95
96 // Values for command execution status.
97 static const char kStatusQueued[];
98 static const char kStatusInProgress[];
99 static const char kStatusPaused[];
100 static const char kStatusError[];
101 static const char kStatusDone[];
Alex Vakulenkodb221242015-03-13 14:02:46 -0700102 static const char kStatusCancelled[];
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700103 static const char kStatusAborted[];
104 static const char kStatusExpired[];
Alex Vakulenkofedc4872014-08-20 12:38:43 -0700105
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700106 private:
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700107 // Helper function to update the command status.
108 // Used by Abort(), Cancel(), Done() methods.
109 void SetStatus(const std::string& status);
110 // Helper method that removes this command from the command queue.
111 // Note that since the command queue owns the lifetime of the command instance
112 // object, removing a command from the queue will also destroy it.
113 void RemoveFromQueue();
114
Alex Vakulenkofedc4872014-08-20 12:38:43 -0700115 // Unique command ID within a command queue.
116 std::string id_;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700117 // Full command name as "<package_name>.<command_name>".
118 std::string name_;
Anton Muhincfde8692014-11-25 03:36:59 +0400119 // Command definition.
120 std::shared_ptr<const CommandDefinition> command_definition_;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700121 // Command parameters and their values.
122 native_types::Object parameters_;
Anton Muhincfde8692014-11-25 03:36:59 +0400123 // Command results.
124 native_types::Object results_;
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700125 // Current command status.
126 std::string status_ = kStatusQueued;
127 // Current command execution progress.
128 int progress_ = 0;
Anton Muhin4dc37852014-10-30 22:17:25 +0400129 // Command proxies for the command.
Anton Muhinb66a9302014-11-10 22:15:22 +0400130 std::vector<std::unique_ptr<CommandProxyInterface>> proxies_;
Alex Vakulenkof6b38712014-09-03 16:23:38 -0700131 // Pointer to the command queue this command instance is added to.
132 // The queue owns the command instance, so it outlives this object.
133 CommandQueue* queue_ = nullptr;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700134
Anton Muhinb66a9302014-11-10 22:15:22 +0400135 friend class DBusCommandDispacherTest;
136 friend class DBusCommandProxyTest;
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -0700137 DISALLOW_COPY_AND_ASSIGN(CommandInstance);
138};
139
140} // namespace buffet
141
142#endif // BUFFET_COMMANDS_COMMAND_INSTANCE_H_