PolicyManager: Specify the full Policy method type on the PM interface.
This patch replaces the template parameter "typename T" used to pass
the policy_method with its actual type, which can be inferred from
the remaining types, removing this template parameter.
This makes the C++ error messages more meaningful when the wrong
parameters are passed to a policy request.
BUG=None
TEST=Build. Manual test passing the wrong type for "result" and getting a meaningful error message.
Change-Id: I98cda8782a0db8642f1e6636af286a97a2df56a3
Reviewed-on: https://chromium-review.googlesource.com/193675
Reviewed-by: Alex Deymo <deymo@chromium.org>
Commit-Queue: Alex Deymo <deymo@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
diff --git a/policy_manager/policy_manager-inl.h b/policy_manager/policy_manager-inl.h
index f0d4937..f19df55 100644
--- a/policy_manager/policy_manager-inl.h
+++ b/policy_manager/policy_manager-inl.h
@@ -14,10 +14,15 @@
namespace chromeos_policy_manager {
-template<typename T, typename R, typename... Args>
-EvalStatus PolicyManager::EvaluatePolicy(EvaluationContext* ec,
- T policy_method, R* result,
- Args... args) {
+template<typename R, typename... Args>
+EvalStatus PolicyManager::EvaluatePolicy(
+ EvaluationContext* ec,
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ R* result, Args... args) {
std::string error;
// First try calling the actual policy.
@@ -38,11 +43,16 @@
return status;
}
-template<typename T, typename R, typename... Args>
+template<typename R, typename... Args>
void PolicyManager::OnPolicyReadyToEvaluate(
scoped_refptr<EvaluationContext> ec,
base::Callback<void(EvalStatus status, const R& result)> callback,
- T policy_method, Args... args) {
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ Args... args) {
R result;
EvalStatus status = EvaluatePolicy(ec, policy_method, &result, args...);
@@ -53,7 +63,7 @@
}
// Re-schedule the policy request based on used variables.
base::Closure closure = base::Bind(
- &PolicyManager::OnPolicyReadyToEvaluate<T, R, Args...>,
+ &PolicyManager::OnPolicyReadyToEvaluate<R, Args...>,
base::Unretained(this), ec, callback, policy_method, args...);
if (!ec->RunOnValueChangeOrTimeout(closure)) {
@@ -67,23 +77,32 @@
}
}
-template<typename T, typename R, typename... Args>
-EvalStatus PolicyManager::PolicyRequest(T policy_method, R* result,
- Args... args) {
+template<typename R, typename... Args>
+EvalStatus PolicyManager::PolicyRequest(
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ R* result, Args... args) {
scoped_refptr<EvaluationContext> ec(new EvaluationContext);
// A PolicyRequest allways consists on a single evaluation on a new
// EvaluationContext.
return EvaluatePolicy(ec, policy_method, result, args...);
}
-template<typename T, typename R, typename... Args>
+template<typename R, typename... Args>
void PolicyManager::AsyncPolicyRequest(
base::Callback<void(EvalStatus, const R& result)> callback,
- T policy_method, Args... args) {
-
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ Args... args) {
scoped_refptr<EvaluationContext> ec = new EvaluationContext;
base::Closure closure = base::Bind(
- &PolicyManager::OnPolicyReadyToEvaluate<T, R, Args...>,
+ &PolicyManager::OnPolicyReadyToEvaluate<R, Args...>,
base::Unretained(this), ec, callback, policy_method, args...);
RunFromMainLoop(closure);
}
diff --git a/policy_manager/policy_manager.h b/policy_manager/policy_manager.h
index 5b89bf2..d874e9c 100644
--- a/policy_manager/policy_manager.h
+++ b/policy_manager/policy_manager.h
@@ -41,8 +41,14 @@
//
// An example call to this method is:
// pm.PolicyRequest(&Policy::SomePolicyMethod, &bool_result, arg1, arg2);
- template<typename T, typename R, typename... Args>
- EvalStatus PolicyRequest(T policy_method, R* result, Args... args);
+ template<typename R, typename... Args>
+ EvalStatus PolicyRequest(
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ R* result, Args... args);
// Evaluates the given |policy_method| policy with the provided |args|
// arguments and calls the |callback| callback with the result when done.
@@ -52,10 +58,15 @@
// policy until another status is returned. If the policy implementation based
// its return value solely on const variables, the callback will be called
// with the EvalStatus::kAskMeAgainLater status.
- template<typename T, typename R, typename... Args>
+ template<typename R, typename... Args>
void AsyncPolicyRequest(
base::Callback<void(EvalStatus, const R& result)> callback,
- T policy_method, Args... args);
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ Args... args);
protected:
// The PolicyManager receives ownership of the passed Policy instance.
@@ -73,10 +84,15 @@
// EvaluatePolicy() evaluates the passed |policy_method| method on the current
// policy with the given |args| arguments. If the method fails, the default
// policy is used instead.
- template<typename T, typename R, typename... Args>
- EvalStatus EvaluatePolicy(EvaluationContext* ec,
- T policy_method, R* result,
- Args... args);
+ template<typename R, typename... Args>
+ EvalStatus EvaluatePolicy(
+ EvaluationContext* ec,
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ R* result, Args... args);
// OnPolicyReadyToEvaluate() is called by the main loop when the evaluation
// of the given |policy_method| should be executed. If the evaluation finishes
@@ -84,11 +100,16 @@
// returned by the policy. If the evaluation returns an
// EvalStatus::kAskMeAgainLater state, the |callback| will NOT be called and
// the evaluation will be re-scheduled to be called later.
- template<typename T, typename R, typename... Args>
+ template<typename R, typename... Args>
void OnPolicyReadyToEvaluate(
scoped_refptr<EvaluationContext> ec,
base::Callback<void(EvalStatus status, const R& result)> callback,
- T policy_method, Args... args);
+ EvalStatus (Policy::*policy_method)(EvaluationContext* ec,
+ State* state,
+ std::string* error,
+ R* result,
+ Args... args) const,
+ Args... args);
// The policy used by the PolicyManager. Note that since it is a const Policy,
// policy implementations are not allowed to persist state on this class.