1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_LOCAL_PRINTER_LISTER_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_LOCAL_PRINTER_LISTER_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <map>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string>
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/linked_ptr.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_device_lister.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_http.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_http_asynchronous_factory.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/local_discovery/service_discovery_client.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_context.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace local_discovery {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This is an adapter to PrivetDeviceLister that finds printers and checks if
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// they support Privet local printing.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrivetLocalPrinterLister : PrivetDeviceLister::Delegate {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Delegate {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~Delegate() {}
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void LocalPrinterChanged(bool added,
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     const std::string& name,
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                     bool has_local_printing,
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     const DeviceDescription& description) = 0;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void LocalPrinterRemoved(const std::string& name) = 0;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void LocalPrinterCacheFlushed() = 0;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PrivetLocalPrinterLister(ServiceDiscoveryClient* service_discovery_client,
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestContextGetter* request_context,
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           Delegate* delegate);
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~PrivetLocalPrinterLister();
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Start();
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Stops listening/listing, keeps the data.
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Stop();
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const DeviceDescription* GetDeviceDescription(const std::string& name);
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // PrivetDeviceLister::Delegate implementation.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DeviceChanged(bool added,
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             const std::string& name,
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             const DeviceDescription& description) OVERRIDE;
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DeviceRemoved(const std::string& name) OVERRIDE;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DeviceCacheFlushed() OVERRIDE;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct DeviceContext;
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::map<std::string, linked_ptr<DeviceContext> > DeviceContextMap;
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnPrivetInfoDone(DeviceContext* context,
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        const std::string& name,
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        const base::DictionaryValue* json_value);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnPrivetResolved(const std::string& name,
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        scoped_ptr<PrivetHTTPClient> http_client);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DeviceContextMap device_contexts_;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Delegate* delegate_;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<PrivetDeviceLister> privet_lister_;
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace local_discovery
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_LOCAL_PRINTER_LISTER_H_
76