1 // 2 // Copyright (C) 2014 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef UPDATE_ENGINE_UPDATE_MANAGER_POLICY_UTILS_H_ 18 #define UPDATE_ENGINE_UPDATE_MANAGER_POLICY_UTILS_H_ 19 20 #include <string> 21 #include <vector> 22 23 #include "update_engine/update_manager/policy.h" 24 25 // Checks that the passed pointer value is not null, returning kFailed on the 26 // current context and setting the *error description when it is null. The 27 // intended use is to validate variable failures while using 28 // EvaluationContext::GetValue, for example: 29 // 30 // const int* my_value = ec->GetValue(state->my_provider()->var_my_value()); 31 // POLICY_CHECK_VALUE_AND_FAIL(my_value, error); 32 // 33 #define POLICY_CHECK_VALUE_AND_FAIL(ptr, error) \ 34 do { \ 35 if ((ptr) == nullptr) { \ 36 *(error) = #ptr " is required but is null."; \ 37 return EvalStatus::kFailed; \ 38 } \ 39 } while (false) 40 41 namespace chromeos_update_manager { 42 43 // Call the passed-in Policy method on a series of Policy implementations, until 44 // one of them renders a decision by returning a value other than 45 // |EvalStatus::kContinue|. 46 template <typename T, typename R, typename... Args> 47 EvalStatus ConsultPolicies(const std::vector<Policy const*> policies, 48 T policy_method, 49 EvaluationContext* ec, 50 State* state, 51 std::string* error, 52 R* result, 53 Args... args) { 54 for (auto policy : policies) { 55 EvalStatus status = 56 (policy->*policy_method)(ec, state, error, result, args...); 57 if (status != EvalStatus::kContinue) { 58 LOG(INFO) << "decision by " << policy->PolicyRequestName(policy_method); 59 return status; 60 } 61 } 62 return EvalStatus::kContinue; 63 } 64 65 // Base class implementation that returns |EvalStatus::kContinue| for all 66 // decisions, to be used as a base-class for various Policy facets that only 67 // pertain to certain situations. This might be better folded into Policy 68 // instead of using pure-virtual methods on that class. 69 class PolicyImplBase : public Policy { 70 public: 71 // Policy overrides. 72 EvalStatus UpdateCheckAllowed(EvaluationContext* ec, 73 State* state, 74 std::string* error, 75 UpdateCheckParams* result) const override { 76 return EvalStatus::kContinue; 77 }; 78 79 EvalStatus UpdateCanBeApplied( 80 EvaluationContext* ec, 81 State* state, 82 std::string* error, 83 chromeos_update_engine::ErrorCode* result, 84 chromeos_update_engine::InstallPlan* install_plan) const override { 85 return EvalStatus::kContinue; 86 }; 87 88 EvalStatus UpdateCanStart(EvaluationContext* ec, 89 State* state, 90 std::string* error, 91 UpdateDownloadParams* result, 92 UpdateState update_state) const override { 93 return EvalStatus::kContinue; 94 }; 95 96 EvalStatus UpdateDownloadAllowed(EvaluationContext* ec, 97 State* state, 98 std::string* error, 99 bool* result) const override { 100 return EvalStatus::kContinue; 101 }; 102 103 EvalStatus P2PEnabled(EvaluationContext* ec, 104 State* state, 105 std::string* error, 106 bool* result) const override { 107 return EvalStatus::kContinue; 108 }; 109 110 EvalStatus P2PEnabledChanged(EvaluationContext* ec, 111 State* state, 112 std::string* error, 113 bool* result, 114 bool prev_result) const override { 115 return EvalStatus::kContinue; 116 }; 117 }; 118 119 } // namespace chromeos_update_manager 120 121 #endif // UPDATE_ENGINE_UPDATE_MANAGER_POLICY_UTILS_H_ 122