/* Copyright 2012 The Chromium Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/**
* PP_ArrayOutput_GetDataBuffer is a callback function to allocate plugin
* memory for an array. It returns the allocated memory or null on failure.
*
* This function will be called reentrantly. This means that if you call a
* function PPB_Foo.GetData(&array_output), GetData will call your
* GetDataBuffer function before it returns.
*
* This function will be called even when returning 0-length arrays, so be sure
* your implementation can support that. You can return NULL for 0 length
* arrays and it will not be treated as a failure.
* You should not perform any processing in this callback, including calling
* other PPAPI functions, outside of allocating memory. You should not throw
* any exceptions. In C++, this means using "new (nothrow)" or being sure to
* catch any exceptions before returning.
*
* The C++ wrapper provides a convenient templatized implementation around
* std::vector which you should generally use instead of coding this
* specifically.
*
* @param user_data The pointer provided in the PP_ArrayOutput structure. This
* has no meaning to the browser, it is intended to be used by the
* implementation to figure out where to put the data.
*
* @param element_count The number of elements in the array. This will be 0
* if there is no data to return.
*
* @param element_size The size of each element in bytes.
*
* @return Returns a pointer to the allocated memory. On failure, returns null.
* You can also return null if the element_count is 0. When a non-null value is
* returned, the buffer must remain valid until after the callback runs. If used
* with a blocking callback, the buffer must remain valid until after the
* function returns. The plugin can then free any memory that it allocated.
*/
typedef mem_t PP_ArrayOutput_GetDataBuffer([inout] mem_t user_data,
[in] uint32_t element_count,
[in] uint32_t element_size);
/**
* A structure that defines a way for the browser to return arrays of data
* to the plugin. The browser can not allocate memory on behalf of the plugin
* because the plugin and browser may have different allocators.
*
* Array output works by having the browser call to the plugin to allocate a
* buffer, and then the browser will copy the contents of the array into that
* buffer.
*
* In C, you would typically implement this as follows:
*
* @code
* struct MyArrayOutput {
* void* data;
* int element_count;
* };
* void* MyGetDataBuffer(void* user_data, uint32_t count, uint32_t size) {
* MyArrayOutput* output = (MyArrayOutput*)user_data;
* output->element_count = count;
* if (size) {
* output->data = malloc(count * size);
* if (!output->data) // Be careful to set size properly on malloc failure.
* output->element_count = 0;
* } else {
* output->data = NULL;
* }
* return output->data;
* }
* void MyFunction() {
* MyArrayOutput array = { NULL, 0 };
* PP_ArrayOutput output = { &MyGetDataBuffer, &array };
* ppb_foo->GetData(&output);
* }
* @endcode
*/
[passByValue]
struct PP_ArrayOutput {
/**
* A pointer to the allocation function that the browser will call.
*/
PP_ArrayOutput_GetDataBuffer GetDataBuffer;
/**
* Data that is passed to the allocation function. Typically, this is used
* to communicate how the data should be stored.
*/
mem_t user_data;
};