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