// 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_CPP_DEV_RESOURCE_ARRAY_DEV_H_
#define PPAPI_CPP_DEV_RESOURCE_ARRAY_DEV_H_

#include "ppapi/c/pp_array_output.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/cpp/resource.h"

namespace pp {

class InstanceHandle;

class ResourceArray_Dev : public Resource {
 public:
  // Heap-allocated data passed to ArrayOutputCallbackConverter(). Please see
  // the comment of ArrayOutputCallbackConverter() for more details.
  struct ArrayOutputCallbackData {
    ArrayOutputCallbackData(const PP_ArrayOutput& array_output,
                            const PP_CompletionCallback& callback)
        : resource_array_output(0),
          output(array_output),
          original_callback(callback) {
    }

    PP_Resource resource_array_output;
    PP_ArrayOutput output;
    PP_CompletionCallback original_callback;
  };

  ResourceArray_Dev();

  ResourceArray_Dev(PassRef, PP_Resource resource);

  ResourceArray_Dev(const ResourceArray_Dev& other);

  ResourceArray_Dev(const InstanceHandle& instance,
                    const PP_Resource elements[],
                    uint32_t size);

  virtual ~ResourceArray_Dev();

  ResourceArray_Dev& operator=(const ResourceArray_Dev& other);

  uint32_t size() const;

  PP_Resource operator[](uint32_t index) const;

  // This is an adapter for backward compatibility. It works with those APIs
  // which take a PPB_ResourceArray_Dev resource as output parameter, and
  // returns results using PP_ArrayOutput. For example:
  //
  //   ResourceArray_Dev::ArrayOutputCallbackData* data =
  //       new ResourceArray_Dev::ArrayOutputCallbackData(
  //           pp_array_output, callback);
  //   ppb_foo->Bar(
  //       foo_resource, &data->resource_array_output,
  //       PP_MakeCompletionCallback(
  //           &ResourceArray_Dev::ArrayOutputCallbackConverter, data));
  //
  // It takes a heap-allocated ArrayOutputCallbackData struct passed as the user
  // data, and deletes it when the call completes.
  static void ArrayOutputCallbackConverter(void* user_data, int32_t result);
};

}  // namespace pp

#endif  // PPAPI_CPP_DEV_RESOURCE_ARRAY_DEV_H_