Asynchronously open the temp file used for Pepper StreamToFile, and delete the
temp file once we are done with it.
We observe ResourceHandle::OnRequestClosed as a signal of when we should delete
the temp file. This corresponds to the WebURLLoader being closed (or
canceled).
This patch also includes some helpers:
base/scoped_callback_factory.h
This class makes it easy to allocate Callbacks that hold a weak reference
back to the owning class. It works just like ScopedRunnableMethodFactory
but for Callbacks instead of RunnableMethods.
base/platform_file.h
Added a PassPlatformFile class that is useful for cases where a callback may
decide not to take ownership of a PlatformFile (as can happen when using
ScopedCallbackFactory).
chrome/file_system_proxy.{h,cc}
This class provides static methods for executing file system commands on the
FILE thread. It routes callbacks back to the originating thread to deliver
results (file handles, etc.). Note: this file declares a few functions that
are not yet used. I anticipate that we'll make use of these and add more
functions here to support the Pepper and OWP FileSystem APIs.
chrome/chrome_thread_relay.{h,cc}
This class is a helper class for proxying calls over to a background
ChromeThread and then returning results to the originating ChromeThread.
R=brettw
BUG=49789
TEST=(more to be added in third_party/ppapi/tests)
Review URL: http://codereview.chromium.org/2878062
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54402 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/scoped_callback_factory.h b/base/scoped_callback_factory.h
new file mode 100644
index 0000000..a2fc1f0
--- /dev/null
+++ b/base/scoped_callback_factory.h
@@ -0,0 +1,133 @@
+// Copyright (c) 2010 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.
+
+// ScopedCallbackFactory helps in cases where you wish to allocate a Callback
+// (see base/callback.h), but need to prevent any pending callbacks from
+// executing when your object gets destroyed.
+//
+// EXAMPLE:
+//
+// void GatherDataAsynchronously(Callback1<Data>::Type* callback);
+//
+// class MyClass {
+// public:
+// MyClass() : factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+// }
+//
+// void Process() {
+// GatherDataAsynchronously(factory_.NewCallback(&MyClass::GotData));
+// }
+//
+// private:
+// void GotData(const Data& data) {
+// ...
+// }
+//
+// base::ScopedCallbackFactory<MyClass> factory_;
+// };
+//
+// In the above example, the Process function calls GatherDataAsynchronously to
+// kick off some asynchronous processing that upon completion will notify a
+// callback. If in the meantime, the MyClass instance is destroyed, when the
+// callback runs, it will notice that the MyClass instance is dead, and it will
+// avoid calling the GotData method.
+
+#ifndef BASE_SCOPED_CALLBACK_FACTORY_H_
+#define BASE_SCOPED_CALLBACK_FACTORY_H_
+
+#include "base/callback.h"
+#include "base/weak_ptr.h"
+
+namespace base {
+
+template <class T>
+class ScopedCallbackFactory {
+ public:
+ explicit ScopedCallbackFactory(T* obj) : weak_factory_(obj) {
+ }
+
+ typename Callback0::Type* NewCallback(
+ void (T::*method)()) {
+ return new CallbackImpl<void (T::*)(), Tuple0 >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ template <typename Arg1>
+ typename Callback1<Arg1>::Type* NewCallback(
+ void (T::*method)(Arg1)) {
+ return new CallbackImpl<void (T::*)(Arg1), Tuple1<Arg1> >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ template <typename Arg1, typename Arg2>
+ typename Callback2<Arg1, Arg2>::Type* NewCallback(
+ void (T::*method)(Arg1, Arg2)) {
+ return new CallbackImpl<void (T::*)(Arg1, Arg2), Tuple2<Arg1, Arg2> >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3>
+ typename Callback3<Arg1, Arg2, Arg3>::Type* NewCallback(
+ void (T::*method)(Arg1, Arg2, Arg3)) {
+ return new CallbackImpl<void (T::*)(Arg1, Arg2, Arg3),
+ Tuple3<Arg1, Arg2, Arg3> >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
+ typename Callback4<Arg1, Arg2, Arg3, Arg4>::Type* NewCallback(
+ void (T::*method)(Arg1, Arg2, Arg3, Arg4)) {
+ return new CallbackImpl<void (T::*)(Arg1, Arg2, Arg3, Arg4),
+ Tuple4<Arg1, Arg2, Arg3, Arg4> >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
+ typename Arg5>
+ typename Callback5<Arg1, Arg2, Arg3, Arg4, Arg5>::Type* NewCallback(
+ void (T::*method)(Arg1, Arg2, Arg3, Arg4, Arg5)) {
+ return new CallbackImpl<void (T::*)(Arg1, Arg2, Arg3, Arg4, Arg5),
+ Tuple5<Arg1, Arg2, Arg3, Arg4, Arg5> >(
+ weak_factory_.GetWeakPtr(), method);
+ }
+
+ void RevokeAll() { weak_factory_.InvalidateWeakPtrs(); }
+ bool HasPendingCallbacks() const { return weak_factory_.HasWeakPtrs(); }
+
+ private:
+ template <typename Method>
+ class CallbackStorage {
+ public:
+ CallbackStorage(const WeakPtr<T>& obj, Method meth)
+ : obj_(obj),
+ meth_(meth) {
+ }
+
+ protected:
+ WeakPtr<T> obj_;
+ Method meth_;
+ };
+
+ template <typename Method, typename Params>
+ class CallbackImpl : public CallbackStorage<Method>,
+ public CallbackRunner<Params> {
+ public:
+ CallbackImpl(const WeakPtr<T>& obj, Method meth)
+ : CallbackStorage<Method>(obj, meth) {
+ }
+ virtual void RunWithParams(const Params& params) {
+ // Use "this->" to force C++ to look inside our templatized base class;
+ // see Effective C++, 3rd Ed, item 43, p210 for details.
+ if (!this->obj_)
+ return;
+ DispatchToMethod(this->obj_.get(), this->meth_, params);
+ }
+ };
+
+ WeakPtrFactory<T> weak_factory_;
+};
+
+} // namespace base
+
+#endif // BASE_SCOPED_CALLBACK_FACTORY_H_