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