13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#ifndef CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_SERVICE_H_
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#define CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_SERVICE_H_
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#pragma once
8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <deque>
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <map>
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <string>
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/basictypes.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/policy/device_management_backend.h"
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/net/url_fetcher.h"
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "googleurl/src/gurl.h"
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass Profile;
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass URLRequestContextGetter;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace policy {
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass DeviceManagementBackendImpl;
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// The device management service is responsible for everything related to
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// communication with the device management server. It creates the backends
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// objects that the device management policy provider and friends use to issue
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// requests.
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass DeviceManagementService : public URLFetcher::Delegate {
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Describes a device management job handled by the service.
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  class DeviceManagementJob {
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch   public:
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    virtual ~DeviceManagementJob() {}
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Handles the URL request response.
403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    virtual void HandleResponse(const net::URLRequestStatus& status,
413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                int response_code,
423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                const ResponseCookies& cookies,
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                const std::string& data) = 0;
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Gets the URL to contact.
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    virtual GURL GetURL(const std::string& server_url) = 0;
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Configures the fetcher, setting up payload and headers.
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    virtual void ConfigureRequest(URLFetcher* fetcher) = 0;
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  };
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  explicit DeviceManagementService(const std::string& server_url);
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual ~DeviceManagementService();
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Constructs a device management backend for use by client code. Ownership of
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the returned backend object is transferred to the caller.
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Marked virtual for the benefit of tests.
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual DeviceManagementBackend* CreateBackend();
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Provides the backend with a request context so it can make actual network
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // requests. This will also fire any requests queued earlier.
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Initialize(net::URLRequestContextGetter* request_context_getter);
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Makes the service stop all requests and drop the reference to the request
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // context.
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void Shutdown();
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Adds a job. Caller must make sure the job pointer stays valid until the job
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // completes or gets cancelled via RemoveJob().
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AddJob(DeviceManagementJob* job);
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Removes a job. The job will be removed and won't receive a completion
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // callback.
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void RemoveJob(DeviceManagementJob* job);
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  typedef std::map<const URLFetcher*, DeviceManagementJob*> JobFetcherMap;
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  typedef std::deque<DeviceManagementJob*> JobQueue;
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Starts the given job.
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void StartJob(DeviceManagementJob* job);
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // URLFetcher::Delegate override.
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const GURL& url,
863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                  const net::URLRequestStatus& status,
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  int response_code,
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const ResponseCookies& cookies,
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const std::string& data);
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Server at which to contact the service.
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const std::string server_url_;
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The request context we use.
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The jobs we currently have in flight.
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  JobFetcherMap pending_jobs_;
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Jobs that are registered, but not started yet.
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  JobQueue queued_jobs_;
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DeviceManagementService);
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace policy
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif  // CHROME_BROWSER_POLICY_DEVICE_MANAGEMENT_SERVICE_H_
109