Home | History | Annotate | Download | only in pepper
      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 
     19 namespace ppapi {
     20 struct DeviceRefData;
     21 
     22 namespace host {
     23 class ResourceHost;
     24 }
     25 
     26 }  // namespace ppapi
     27 
     28 namespace IPC {
     29 class Message;
     30 }
     31 
     32 namespace 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.
     39 class 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