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.
5 #ifndef COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_
6 #define COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/compiler_specific.h"
16 #include "base/memory/weak_ptr.h"
17 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
18 #include "components/policy/policy_export.h"
19 #include "net/url_request/url_fetcher_delegate.h"
20 #include "policy/proto/device_management_backend.pb.h"
23 class URLRequestContextGetter
;
28 class DeviceManagementRequestJobImpl
;
29 class DeviceManagementService
;
31 // DeviceManagementRequestJob describes a request to send to the device
32 // management service. Jobs are created by DeviceManagementService. They can be
33 // canceled by deleting the object.
34 class POLICY_EXPORT DeviceManagementRequestJob
{
36 // Describes the job type.
40 TYPE_API_AUTH_CODE_FETCH
,
43 TYPE_UPLOAD_CERTIFICATE
,
44 TYPE_DEVICE_STATE_RETRIEVAL
,
47 typedef base::Callback
<
48 void(DeviceManagementStatus
, int,
49 const enterprise_management::DeviceManagementResponse
&)> Callback
;
51 typedef base::Callback
<void(DeviceManagementRequestJob
*)> RetryCallback
;
53 virtual ~DeviceManagementRequestJob();
55 // Functions for configuring the job. These should only be called before
56 // Start()ing the job, but never afterwards.
57 void SetGaiaToken(const std::string
& gaia_token
);
58 void SetOAuthToken(const std::string
& oauth_token
);
59 void SetUserAffiliation(UserAffiliation user_affiliation
);
60 void SetDMToken(const std::string
& dm_token
);
61 void SetClientID(const std::string
& client_id
);
62 enterprise_management::DeviceManagementRequest
* GetRequest();
64 // A job may automatically retry if it fails due to a temporary condition, or
65 // due to proxy misconfigurations. If a |retry_callback| is set then it will
66 // be invoked with the DeviceManagementRequestJob as an argument when that
67 // happens, so that the job's owner can customize the retry request before
69 void SetRetryCallback(const RetryCallback
& retry_callback
);
71 // Starts the job. |callback| will be invoked on completion.
72 void Start(const Callback
& callback
);
75 typedef std::vector
<std::pair
<std::string
, std::string
> > ParameterMap
;
77 DeviceManagementRequestJob(JobType type
,
78 const std::string
& agent_parameter
,
79 const std::string
& platform_parameter
);
81 // Appends a parameter to |query_params|.
82 void AddParameter(const std::string
& name
, const std::string
& value
);
84 // Fires the job, to be filled in by implementations.
85 virtual void Run() = 0;
87 ParameterMap query_params_
;
88 std::string gaia_token_
;
89 std::string dm_token_
;
90 enterprise_management::DeviceManagementRequest request_
;
91 RetryCallback retry_callback_
;
96 DISALLOW_COPY_AND_ASSIGN(DeviceManagementRequestJob
);
99 // The device management service is responsible for everything related to
100 // communication with the device management server. It creates the backends
101 // objects that the device management policy provider and friends use to issue
103 class POLICY_EXPORT DeviceManagementService
: public net::URLFetcherDelegate
{
105 // Obtains the parameters used to contact the server.
106 // This allows creating the DeviceManagementService early and getting these
107 // parameters later. Passing the parameters directly in the ctor isn't
108 // possible because some aren't ready during startup. http://crbug.com/302798
109 class POLICY_EXPORT Configuration
{
111 virtual ~Configuration() {}
113 // Server at which to contact the service.
114 virtual std::string
GetServerUrl() = 0;
116 // Agent reported in the "agent" query parameter.
117 virtual std::string
GetAgentParameter() = 0;
119 // The platform reported in the "platform" query parameter.
120 virtual std::string
GetPlatformParameter() = 0;
123 explicit DeviceManagementService(scoped_ptr
<Configuration
> configuration
);
124 virtual ~DeviceManagementService();
126 // The ID of URLFetchers created by the DeviceManagementService. This can be
127 // used by tests that use a TestURLFetcherFactory to get the pending fetchers
128 // created by the DeviceManagementService.
129 static const int kURLFetcherID
;
131 // Creates a new device management request job. Ownership is transferred to
133 virtual DeviceManagementRequestJob
* CreateJob(
134 DeviceManagementRequestJob::JobType type
,
135 net::URLRequestContextGetter
* request_context
);
137 // Schedules a task to run |Initialize| after |delay_milliseconds| had passed.
138 void ScheduleInitialization(int64 delay_milliseconds
);
140 // Makes the service stop all requests.
143 // Gets the URL that the DMServer requests are sent to.
144 std::string
GetServerUrl();
147 typedef std::map
<const net::URLFetcher
*,
148 DeviceManagementRequestJobImpl
*> JobFetcherMap
;
149 typedef std::deque
<DeviceManagementRequestJobImpl
*> JobQueue
;
151 friend class DeviceManagementRequestJobImpl
;
153 // net::URLFetcherDelegate override.
154 virtual void OnURLFetchComplete(const net::URLFetcher
* source
) OVERRIDE
;
156 // Starts processing any queued jobs.
160 void StartJob(DeviceManagementRequestJobImpl
* job
);
162 // Adds a job. Caller must make sure the job pointer stays valid until the job
163 // completes or gets canceled via RemoveJob().
164 void AddJob(DeviceManagementRequestJobImpl
* job
);
166 // Removes a job. The job will be removed and won't receive a completion
168 void RemoveJob(DeviceManagementRequestJobImpl
* job
);
170 // A Configuration implementation that is used to obtain various parameters
171 // used to talk to the device management server.
172 scoped_ptr
<Configuration
> configuration_
;
174 // The jobs we currently have in flight.
175 JobFetcherMap pending_jobs_
;
177 // Jobs that are registered, but not started yet.
178 JobQueue queued_jobs_
;
180 // If this service is initialized, incoming requests get fired instantly.
181 // If it is not initialized, incoming requests are queued.
184 // Used to create tasks to run |Initialize| delayed on the UI thread.
185 base::WeakPtrFactory
<DeviceManagementService
> weak_ptr_factory_
;
187 DISALLOW_COPY_AND_ASSIGN(DeviceManagementService
);
190 } // namespace policy
192 #endif // COMPONENTS_POLICY_CORE_COMMON_CLOUD_DEVICE_MANAGEMENT_SERVICE_H_