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 CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
6#define CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/callback_forward.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/weak_ptr.h"
14#include "content/common/content_export.h"
15#include "ppapi/c/dev/ppb_device_ref_dev.h"
16#include "ppapi/host/host_message_context.h"
17#include "url/gurl.h"
18
19namespace ppapi {
20struct DeviceRefData;
21
22namespace host {
23class ResourceHost;
24}
25
26}  // namespace ppapi
27
28namespace IPC {
29class Message;
30}
31
32namespace content {
33
34// Resource hosts that support device enumeration can use this class to filter
35// and process PpapiHostMsg_DeviceEnumeration_* messages.
36// TODO(yzshen): Refactor ppapi::host::ResourceMessageFilter to support message
37// handling on the same thread, and then derive this class from the filter
38// class.
39class CONTENT_EXPORT PepperDeviceEnumerationHostHelper {
40 public:
41  class Delegate {
42   public:
43    virtual ~Delegate() {}
44
45    typedef base::Callback<
46        void(int /* request_id */,
47             const std::vector<ppapi::DeviceRefData>& /* devices */)>
48        EnumerateDevicesCallback;
49
50    // Enumerates devices of the specified type. The request ID passed into the
51    // callback will be the same as the return value.
52    virtual int EnumerateDevices(PP_DeviceType_Dev type,
53                                 const GURL& document_url,
54                                 const EnumerateDevicesCallback& callback) = 0;
55    // Stop enumerating devices of the specified |request_id|. The |request_id|
56    // is the return value of EnumerateDevicesCallback.
57    virtual void StopEnumerateDevices(int request_id) = 0;
58  };
59
60  // |resource_host| and |delegate| must outlive this object.
61  PepperDeviceEnumerationHostHelper(ppapi::host::ResourceHost* resource_host,
62                                    base::WeakPtr<Delegate> delegate,
63                                    PP_DeviceType_Dev device_type,
64                                    const GURL& document_url);
65  ~PepperDeviceEnumerationHostHelper();
66
67  // Returns true if the message has been handled.
68  bool HandleResourceMessage(const IPC::Message& msg,
69                             ppapi::host::HostMessageContext* context,
70                             int32_t* result);
71
72 private:
73  class ScopedRequest;
74
75  // Has a different signature than HandleResourceMessage() in order to utilize
76  // message dispatching macros.
77  int32_t InternalHandleResourceMessage(
78      const IPC::Message& msg,
79      ppapi::host::HostMessageContext* context,
80      bool* handled);
81
82  int32_t OnEnumerateDevices(ppapi::host::HostMessageContext* context);
83  int32_t OnMonitorDeviceChange(ppapi::host::HostMessageContext* context,
84                                uint32_t callback_id);
85  int32_t OnStopMonitoringDeviceChange(
86      ppapi::host::HostMessageContext* context);
87
88  void OnEnumerateDevicesComplete(
89      int request_id,
90      const std::vector<ppapi::DeviceRefData>& devices);
91  void OnNotifyDeviceChange(uint32_t callback_id,
92                            int request_id,
93                            const std::vector<ppapi::DeviceRefData>& devices);
94
95  // Non-owning pointers.
96  ppapi::host::ResourceHost* resource_host_;
97  base::WeakPtr<Delegate> delegate_;
98
99  PP_DeviceType_Dev device_type_;
100  GURL document_url_;
101
102  scoped_ptr<ScopedRequest> enumerate_;
103  scoped_ptr<ScopedRequest> monitor_;
104
105  ppapi::host::ReplyMessageContext enumerate_devices_context_;
106
107  DISALLOW_COPY_AND_ASSIGN(PepperDeviceEnumerationHostHelper);
108};
109
110}  // namespace content
111
112#endif  // CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
113