// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#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:
  // |owner| must outlive this object.
  explicit DeviceEnumerationResourceHelper(PluginResource* owner);
  ~DeviceEnumerationResourceHelper();

  int32_t EnumerateDevices0_2(PP_Resource* devices,
                              scoped_refptr<TrackedCallback> callback);
  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);

  // Returns true if the message has been handled.
  bool HandleReply(const ResourceMessageReplyParams& params,
                   const IPC::Message& msg);

  void LastPluginRefWasDeleted();

 private:
  void OnPluginMsgEnumerateDevicesReply0_2(
      PP_Resource* devices_resource,
      scoped_refptr<TrackedCallback> callback,
      const ResourceMessageReplyParams& params,
      const std::vector<DeviceRefData>& devices);
  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);

  // Not owned by this object.
  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);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_DEVICE_ENUMERATION_RESOURCE_HELPER_H_
