Chromium Code Reviews| 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..8fb357111cd9d10235051b0aa73961a97f66900f |
| --- /dev/null |
| +++ b/ppapi/shared_impl/array_writer.cc |
| @@ -0,0 +1,77 @@ |
| +// 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 "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)); |
|
viettrungluu
2012/03/26 16:55:19
You need to include <algorithm>.
|
| + return true; |
| +} |
| + |
| +} // namespace ppapi |