ff7565964302415c2d7073f74d65031df3d31915
[platform/framework/web/crosswalk.git] / src / components / policy / core / common / cloud / device_management_service.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_
6 #define COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_
7
8 #include <deque>
9 #include <map>
10 #include <string>
11 #include <vector>
12
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/compiler_specific.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/weak_ptr.h"
18 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
19 #include "components/policy/policy_export.h"
20 #include "net/url_request/url_fetcher_delegate.h"
21 #include "policy/proto/device_management_backend.pb.h"
22
23 namespace net {
24 class URLRequestContextGetter;
25 }
26
27 namespace policy {
28
29 class DeviceManagementRequestJobImpl;
30 class DeviceManagementService;
31
32 // DeviceManagementRequestJob describes a request to send to the device
33 // management service. Jobs are created by DeviceManagementService. They can be
34 // canceled by deleting the object.
35 class POLICY_EXPORT DeviceManagementRequestJob {
36  public:
37   // Describes the job type.
38   enum JobType {
39     TYPE_AUTO_ENROLLMENT,
40     TYPE_REGISTRATION,
41     TYPE_API_AUTH_CODE_FETCH,
42     TYPE_POLICY_FETCH,
43     TYPE_UNREGISTRATION,
44     TYPE_UPLOAD_CERTIFICATE,
45     TYPE_DEVICE_STATE_RETRIEVAL,
46   };
47
48   typedef base::Callback<
49       void(DeviceManagementStatus, int,
50            const enterprise_management::DeviceManagementResponse&)> Callback;
51
52   typedef base::Callback<void(DeviceManagementRequestJob*)> RetryCallback;
53
54   virtual ~DeviceManagementRequestJob();
55
56   // Functions for configuring the job. These should only be called before
57   // Start()ing the job, but never afterwards.
58   void SetGaiaToken(const std::string& gaia_token);
59   void SetOAuthToken(const std::string& oauth_token);
60   void SetUserAffiliation(UserAffiliation user_affiliation);
61   void SetDMToken(const std::string& dm_token);
62   void SetClientID(const std::string& client_id);
63   enterprise_management::DeviceManagementRequest* GetRequest();
64
65   // A job may automatically retry if it fails due to a temporary condition, or
66   // due to proxy misconfigurations. If a |retry_callback| is set then it will
67   // be invoked with the DeviceManagementRequestJob as an argument when that
68   // happens, so that the job's owner can customize the retry request before
69   // it's sent.
70   void SetRetryCallback(const RetryCallback& retry_callback);
71
72   // Starts the job. |callback| will be invoked on completion.
73   void Start(const Callback& callback);
74
75  protected:
76   typedef std::vector<std::pair<std::string, std::string> > ParameterMap;
77
78   DeviceManagementRequestJob(JobType type,
79                              const std::string& agent_parameter,
80                              const std::string& platform_parameter);
81
82   // Appends a parameter to |query_params|.
83   void AddParameter(const std::string& name, const std::string& value);
84
85   // Fires the job, to be filled in by implementations.
86   virtual void Run() = 0;
87
88   ParameterMap query_params_;
89   std::string gaia_token_;
90   std::string dm_token_;
91   enterprise_management::DeviceManagementRequest request_;
92   RetryCallback retry_callback_;
93
94   Callback callback_;
95
96  private:
97   DISALLOW_COPY_AND_ASSIGN(DeviceManagementRequestJob);
98 };
99
100 // The device management service is responsible for everything related to
101 // communication with the device management server. It creates the backends
102 // objects that the device management policy provider and friends use to issue
103 // requests.
104 class POLICY_EXPORT DeviceManagementService : public net::URLFetcherDelegate {
105  public:
106   // Obtains the parameters used to contact the server.
107   // This allows creating the DeviceManagementService early and getting these
108   // parameters later. Passing the parameters directly in the ctor isn't
109   // possible because some aren't ready during startup. http://crbug.com/302798
110   class POLICY_EXPORT Configuration {
111    public:
112     virtual ~Configuration() {}
113
114     // Server at which to contact the service.
115     virtual std::string GetServerUrl() = 0;
116
117     // Agent reported in the "agent" query parameter.
118     virtual std::string GetAgentParameter() = 0;
119
120     // The platform reported in the "platform" query parameter.
121     virtual std::string GetPlatformParameter() = 0;
122   };
123
124   explicit DeviceManagementService(scoped_ptr<Configuration> configuration);
125   virtual ~DeviceManagementService();
126
127   // The ID of URLFetchers created by the DeviceManagementService. This can be
128   // used by tests that use a TestURLFetcherFactory to get the pending fetchers
129   // created by the DeviceManagementService.
130   static const int kURLFetcherID;
131
132   // Creates a new device management request job. Ownership is transferred to
133   // the caller.
134   virtual DeviceManagementRequestJob* CreateJob(
135       DeviceManagementRequestJob::JobType type,
136       const scoped_refptr<net::URLRequestContextGetter>& request_context);
137
138   // Schedules a task to run |Initialize| after |delay_milliseconds| had passed.
139   void ScheduleInitialization(int64 delay_milliseconds);
140
141   // Makes the service stop all requests.
142   void Shutdown();
143
144   // Gets the URL that the DMServer requests are sent to.
145   std::string GetServerUrl();
146
147  private:
148   typedef std::map<const net::URLFetcher*,
149                    DeviceManagementRequestJobImpl*> JobFetcherMap;
150   typedef std::deque<DeviceManagementRequestJobImpl*> JobQueue;
151
152   friend class DeviceManagementRequestJobImpl;
153
154   // net::URLFetcherDelegate override.
155   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
156
157   // Starts processing any queued jobs.
158   void Initialize();
159
160   // Starts a job.
161   void StartJob(DeviceManagementRequestJobImpl* job);
162
163   // Adds a job. Caller must make sure the job pointer stays valid until the job
164   // completes or gets canceled via RemoveJob().
165   void AddJob(DeviceManagementRequestJobImpl* job);
166
167   // Removes a job. The job will be removed and won't receive a completion
168   // callback.
169   void RemoveJob(DeviceManagementRequestJobImpl* job);
170
171   // A Configuration implementation that is used to obtain various parameters
172   // used to talk to the device management server.
173   scoped_ptr<Configuration> configuration_;
174
175   // The jobs we currently have in flight.
176   JobFetcherMap pending_jobs_;
177
178   // Jobs that are registered, but not started yet.
179   JobQueue queued_jobs_;
180
181   // If this service is initialized, incoming requests get fired instantly.
182   // If it is not initialized, incoming requests are queued.
183   bool initialized_;
184
185   // Used to create tasks to run |Initialize| delayed on the UI thread.
186   base::WeakPtrFactory<DeviceManagementService> weak_ptr_factory_;
187
188   DISALLOW_COPY_AND_ASSIGN(DeviceManagementService);
189 };
190
191 }  // namespace policy
192
193 #endif  // COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_