xref: /aosp_15_r20/system/core/init/action.h (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
1*00c7fec1SAndroid Build Coastguard Worker /*
2*00c7fec1SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*00c7fec1SAndroid Build Coastguard Worker  *
4*00c7fec1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*00c7fec1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*00c7fec1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*00c7fec1SAndroid Build Coastguard Worker  *
8*00c7fec1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*00c7fec1SAndroid Build Coastguard Worker  *
10*00c7fec1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*00c7fec1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*00c7fec1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*00c7fec1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*00c7fec1SAndroid Build Coastguard Worker  * limitations under the License.
15*00c7fec1SAndroid Build Coastguard Worker  */
16*00c7fec1SAndroid Build Coastguard Worker 
17*00c7fec1SAndroid Build Coastguard Worker #pragma once
18*00c7fec1SAndroid Build Coastguard Worker 
19*00c7fec1SAndroid Build Coastguard Worker #include <map>
20*00c7fec1SAndroid Build Coastguard Worker #include <queue>
21*00c7fec1SAndroid Build Coastguard Worker #include <string>
22*00c7fec1SAndroid Build Coastguard Worker #include <variant>
23*00c7fec1SAndroid Build Coastguard Worker #include <vector>
24*00c7fec1SAndroid Build Coastguard Worker 
25*00c7fec1SAndroid Build Coastguard Worker #include <android-base/strings.h>
26*00c7fec1SAndroid Build Coastguard Worker 
27*00c7fec1SAndroid Build Coastguard Worker #include "builtins.h"
28*00c7fec1SAndroid Build Coastguard Worker #include "keyword_map.h"
29*00c7fec1SAndroid Build Coastguard Worker #include "result.h"
30*00c7fec1SAndroid Build Coastguard Worker #include "subcontext.h"
31*00c7fec1SAndroid Build Coastguard Worker 
32*00c7fec1SAndroid Build Coastguard Worker namespace android {
33*00c7fec1SAndroid Build Coastguard Worker namespace init {
34*00c7fec1SAndroid Build Coastguard Worker 
35*00c7fec1SAndroid Build Coastguard Worker Result<void> RunBuiltinFunction(const BuiltinFunction& function,
36*00c7fec1SAndroid Build Coastguard Worker                                 const std::vector<std::string>& args, const std::string& context);
37*00c7fec1SAndroid Build Coastguard Worker 
38*00c7fec1SAndroid Build Coastguard Worker class Command {
39*00c7fec1SAndroid Build Coastguard Worker   public:
40*00c7fec1SAndroid Build Coastguard Worker     Command(BuiltinFunction f, bool execute_in_subcontext, std::vector<std::string>&& args,
41*00c7fec1SAndroid Build Coastguard Worker             int line);
42*00c7fec1SAndroid Build Coastguard Worker 
43*00c7fec1SAndroid Build Coastguard Worker     Result<void> InvokeFunc(Subcontext* subcontext) const;
44*00c7fec1SAndroid Build Coastguard Worker     std::string BuildCommandString() const;
45*00c7fec1SAndroid Build Coastguard Worker     Result<void> CheckCommand() const;
46*00c7fec1SAndroid Build Coastguard Worker 
line()47*00c7fec1SAndroid Build Coastguard Worker     int line() const { return line_; }
48*00c7fec1SAndroid Build Coastguard Worker 
49*00c7fec1SAndroid Build Coastguard Worker   private:
50*00c7fec1SAndroid Build Coastguard Worker     BuiltinFunction func_;
51*00c7fec1SAndroid Build Coastguard Worker     bool execute_in_subcontext_;
52*00c7fec1SAndroid Build Coastguard Worker     std::vector<std::string> args_;
53*00c7fec1SAndroid Build Coastguard Worker     int line_;
54*00c7fec1SAndroid Build Coastguard Worker };
55*00c7fec1SAndroid Build Coastguard Worker 
56*00c7fec1SAndroid Build Coastguard Worker using EventTrigger = std::string;
57*00c7fec1SAndroid Build Coastguard Worker using PropertyChange = std::pair<std::string, std::string>;
58*00c7fec1SAndroid Build Coastguard Worker using BuiltinAction = class Action*;
59*00c7fec1SAndroid Build Coastguard Worker 
60*00c7fec1SAndroid Build Coastguard Worker class Action {
61*00c7fec1SAndroid Build Coastguard Worker   public:
62*00c7fec1SAndroid Build Coastguard Worker     Action(bool oneshot, Subcontext* subcontext, const std::string& filename, int line,
63*00c7fec1SAndroid Build Coastguard Worker            const std::string& event_trigger,
64*00c7fec1SAndroid Build Coastguard Worker            const std::map<std::string, std::string>& property_triggers);
65*00c7fec1SAndroid Build Coastguard Worker 
66*00c7fec1SAndroid Build Coastguard Worker     Result<void> AddCommand(std::vector<std::string>&& args, int line);
67*00c7fec1SAndroid Build Coastguard Worker     void AddCommand(BuiltinFunction f, std::vector<std::string>&& args, int line);
68*00c7fec1SAndroid Build Coastguard Worker     size_t NumCommands() const;
69*00c7fec1SAndroid Build Coastguard Worker     void ExecuteOneCommand(std::size_t command) const;
70*00c7fec1SAndroid Build Coastguard Worker     void ExecuteAllCommands() const;
71*00c7fec1SAndroid Build Coastguard Worker     bool CheckEvent(const EventTrigger& event_trigger) const;
72*00c7fec1SAndroid Build Coastguard Worker     bool CheckEvent(const PropertyChange& property_change) const;
73*00c7fec1SAndroid Build Coastguard Worker     bool CheckEvent(const BuiltinAction& builtin_action) const;
74*00c7fec1SAndroid Build Coastguard Worker     std::string BuildTriggersString() const;
75*00c7fec1SAndroid Build Coastguard Worker     void DumpState() const;
76*00c7fec1SAndroid Build Coastguard Worker     size_t CheckAllCommands() const;
77*00c7fec1SAndroid Build Coastguard Worker 
oneshot()78*00c7fec1SAndroid Build Coastguard Worker     bool oneshot() const { return oneshot_; }
filename()79*00c7fec1SAndroid Build Coastguard Worker     const std::string& filename() const { return filename_; }
line()80*00c7fec1SAndroid Build Coastguard Worker     int line() const { return line_; }
set_function_map(const BuiltinFunctionMap * function_map)81*00c7fec1SAndroid Build Coastguard Worker     static void set_function_map(const BuiltinFunctionMap* function_map) {
82*00c7fec1SAndroid Build Coastguard Worker         function_map_ = function_map;
83*00c7fec1SAndroid Build Coastguard Worker     }
IsFromApex()84*00c7fec1SAndroid Build Coastguard Worker     bool IsFromApex() const { return base::StartsWith(filename_, "/apex/"); }
85*00c7fec1SAndroid Build Coastguard Worker 
86*00c7fec1SAndroid Build Coastguard Worker   private:
87*00c7fec1SAndroid Build Coastguard Worker     void ExecuteCommand(const Command& command) const;
88*00c7fec1SAndroid Build Coastguard Worker     bool CheckPropertyTriggers(const std::string& name = "",
89*00c7fec1SAndroid Build Coastguard Worker                                const std::string& value = "") const;
90*00c7fec1SAndroid Build Coastguard Worker 
91*00c7fec1SAndroid Build Coastguard Worker     std::map<std::string, std::string> property_triggers_;
92*00c7fec1SAndroid Build Coastguard Worker     std::string event_trigger_;
93*00c7fec1SAndroid Build Coastguard Worker     std::vector<Command> commands_;
94*00c7fec1SAndroid Build Coastguard Worker     bool oneshot_;
95*00c7fec1SAndroid Build Coastguard Worker     Subcontext* subcontext_;
96*00c7fec1SAndroid Build Coastguard Worker     std::string filename_;
97*00c7fec1SAndroid Build Coastguard Worker     int line_;
98*00c7fec1SAndroid Build Coastguard Worker     static const BuiltinFunctionMap* function_map_;
99*00c7fec1SAndroid Build Coastguard Worker };
100*00c7fec1SAndroid Build Coastguard Worker 
101*00c7fec1SAndroid Build Coastguard Worker }  // namespace init
102*00c7fec1SAndroid Build Coastguard Worker }  // namespace android
103