1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_BASE_SCREEN_HANDLER_UTILS_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_BASE_SCREEN_HANDLER_UTILS_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cstddef>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtypedef std::vector<std::string> StringList;
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtypedef std::vector<base::string16> String16List;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename T>
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct UnwrapConstRef {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef T Type;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename T>
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct UnwrapConstRef<const T&> {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef T Type;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, bool* out_value);
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, int* out_value);
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, double* out_value);
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, std::string* out_value);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, base::string16* out_value);
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                const base::DictionaryValue** out_value);
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, StringList* out_value);
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ParseValue(const base::Value* value, String16List* out_value);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename T>
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline bool GetArg(const base::ListValue* args, size_t index, T* out_value) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::Value* value;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!args->Get(index, &value))
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ParseValue(value, out_value);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::FundamentalValue MakeValue(bool v);
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::FundamentalValue MakeValue(int v);
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::FundamentalValue MakeValue(double v);
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::StringValue MakeValue(const std::string& v);
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::StringValue MakeValue(const base::string16& v);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename T>
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline const T& MakeValue(const T& v) {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return v;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CallbackWrapper0(base::Callback<void()> callback,
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      const base::ListValue* args);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename A1>
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CallbackWrapper1(base::Callback<void(A1)> callback,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::ListValue* args) {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(args);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(1u, args->GetSize());
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A1>::Type arg1;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!GetArg(args, 0, &arg1)) {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(arg1);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename A1, typename A2>
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CallbackWrapper2(base::Callback<void(A1, A2)> callback,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::ListValue* args) {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(args);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(2u, args->GetSize());
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A1>::Type arg1;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A2>::Type arg2;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!GetArg(args, 0, &arg1) || !GetArg(args, 1, &arg2)) {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(arg1, arg2);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename A1, typename A2, typename A3>
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CallbackWrapper3(base::Callback<void(A1, A2, A3)> callback,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::ListValue* args) {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(args);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(3u, args->GetSize());
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A1>::Type arg1;
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A2>::Type arg2;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A3>::Type arg3;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!GetArg(args, 0, &arg1) ||
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetArg(args, 1, &arg2) ||
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetArg(args, 2, &arg3)) {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(arg1, arg2, arg3);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<typename A1, typename A2, typename A3, typename A4>
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void CallbackWrapper4(base::Callback<void(A1, A2, A3, A4)> callback,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::ListValue* args) {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(args);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(4u, args->GetSize());
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A1>::Type arg1;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A2>::Type arg2;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A3>::Type arg3;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typename UnwrapConstRef<A4>::Type arg4;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!GetArg(args, 0, &arg1) ||
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetArg(args, 1, &arg2) ||
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetArg(args, 2, &arg3) ||
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetArg(args, 3, &arg4)) {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(arg1, arg2, arg3, arg4);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_BASE_SCREEN_HANDLER_UTILS_H_
129