| Index: ppapi/shared_impl/array_writer.cc
|
| diff --git a/ppapi/shared_impl/array_writer.cc b/ppapi/shared_impl/array_writer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..957ff77237baa5f2fe5370acbaef777564b5a335
|
| --- /dev/null
|
| +++ b/ppapi/shared_impl/array_writer.cc
|
| @@ -0,0 +1,79 @@
|
| +// 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.
|
| +
|
| +#include "ppapi/shared_impl/array_writer.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "ppapi/shared_impl/ppapi_globals.h"
|
| +#include "ppapi/shared_impl/resource.h"
|
| +#include "ppapi/shared_impl/resource_tracker.h"
|
| +
|
| +namespace ppapi {
|
| +
|
| +ArrayWriter::ArrayWriter() {
|
| + Reset();
|
| +}
|
| +
|
| +ArrayWriter::ArrayWriter(const PP_ArrayOutput& output)
|
| + : pp_array_output_(output) {
|
| +}
|
| +
|
| +ArrayWriter::~ArrayWriter() {
|
| +}
|
| +
|
| +void ArrayWriter::Reset() {
|
| + pp_array_output_.GetDataBuffer = NULL;
|
| + pp_array_output_.user_data = NULL;
|
| +}
|
| +
|
| +bool ArrayWriter::StoreResourceVector(
|
| + const std::vector< scoped_refptr<Resource> >& input) {
|
| + // Always call the alloc function, even on 0 array size.
|
| + void* dest = pp_array_output_.GetDataBuffer(
|
| + pp_array_output_.user_data,
|
| + static_cast<uint32_t>(input.size()),
|
| + sizeof(PP_Resource));
|
| +
|
| + // Regardless of success, we clear the output to prevent future calls on
|
| + // this same output object.
|
| + Reset();
|
| +
|
| + if (input.empty())
|
| + return true; // Allow plugin to return NULL on 0 elements.
|
| + if (!dest)
|
| + return false;
|
| +
|
| + // Convert to PP_Resources.
|
| + PP_Resource* dest_resources = static_cast<PP_Resource*>(dest);
|
| + for (size_t i = 0; i < input.size(); i++)
|
| + dest_resources[i] = input[i]->GetReference();
|
| + return true;
|
| +}
|
| +
|
| +bool ArrayWriter::StoreResourceVector(const std::vector<PP_Resource>& input) {
|
| + // Always call the alloc function, even on 0 array size.
|
| + void* dest = pp_array_output_.GetDataBuffer(
|
| + pp_array_output_.user_data,
|
| + static_cast<uint32_t>(input.size()),
|
| + sizeof(PP_Resource));
|
| +
|
| + // Regardless of success, we clear the output to prevent future calls on
|
| + // this same output object.
|
| + Reset();
|
| +
|
| + if (input.empty())
|
| + return true; // Allow plugin to return NULL on 0 elements.
|
| + if (!dest) {
|
| + // Free the resources.
|
| + for (size_t i = 0; i < input.size(); i++)
|
| + PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(input[i]);
|
| + return false;
|
| + }
|
| +
|
| + std::copy(input.begin(), input.end(), static_cast<PP_Resource*>(dest));
|
| + return true;
|
| +}
|
| +
|
| +} // namespace ppapi
|
|
|