#ifndef PPAPI_PROXY_DEVICE_ENUMERATION_RESOURCE_HELPER_H_
#define PPAPI_PROXY_DEVICE_ENUMERATION_RESOURCE_HELPER_H_
#include <vector>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "ppapi/c/dev/ppb_device_ref_dev.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/shared_impl/thread_aware_callback.h"
namespace IPC {
class Message;
}
struct PP_ArrayOutput;
namespace ppapi {
struct DeviceRefData;
class TrackedCallback;
namespace proxy {
class PluginResource;
class ResourceMessageReplyParams;
class PPAPI_PROXY_EXPORT DeviceEnumerationResourceHelper
: public base::SupportsWeakPtr<DeviceEnumerationResourceHelper> {
public:
explicit DeviceEnumerationResourceHelper(PluginResource* owner);
~DeviceEnumerationResourceHelper();
int32_t EnumerateDevices(const PP_ArrayOutput& output,
scoped_refptr<TrackedCallback> callback);
int32_t EnumerateDevicesSync(const PP_ArrayOutput& output);
int32_t MonitorDeviceChange(PP_MonitorDeviceChangeCallback callback,
void* user_data);
bool HandleReply(const ResourceMessageReplyParams& params,
const IPC::Message& msg);
void LastPluginRefWasDeleted();
private:
void OnPluginMsgEnumerateDevicesReply(
const PP_ArrayOutput& output,
scoped_refptr<TrackedCallback> callback,
const ResourceMessageReplyParams& params,
const std::vector<DeviceRefData>& devices);
void OnPluginMsgNotifyDeviceChange(const ResourceMessageReplyParams& params,
uint32_t callback_id,
const std::vector<DeviceRefData>& devices);
int32_t WriteToArrayOutput(const std::vector<DeviceRefData>& devices,
const PP_ArrayOutput& output);
PluginResource* owner_;
bool pending_enumerate_devices_;
uint32_t monitor_callback_id_;
scoped_ptr<ThreadAwareCallback<PP_MonitorDeviceChangeCallback> >
monitor_callback_;
void* monitor_user_data_;
DISALLOW_COPY_AND_ASSIGN(DeviceEnumerationResourceHelper);
};
}
}
#endif