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