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 |