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 "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_
    112