Chromium Code Reviews| Index: ppapi/cpp/completion_callback.h |
| diff --git a/ppapi/cpp/completion_callback.h b/ppapi/cpp/completion_callback.h |
| index b4564e1ab742604aac83a752106d9f0d9f667104..f82e7cdce359f7c1d4600b4a99a995f654705892 100644 |
| --- a/ppapi/cpp/completion_callback.h |
| +++ b/ppapi/cpp/completion_callback.h |
| @@ -9,13 +9,23 @@ |
| #include "ppapi/c/pp_errors.h" |
| #include "ppapi/cpp/logging.h" |
| #include "ppapi/cpp/module.h" |
| +#include "ppapi/cpp/output_traits.h" |
| + |
| +struct PP_ArrayOutput; |
| /// @file |
| /// This file defines the API to create and run a callback. |
| namespace pp { |
| +template<typename T> class AsyncArrayOutputAdapter; |
| +template<typename T> class AsyncResourceArrayOutputAdapter; |
| + |
| /// This API enables you to implement and receive callbacks when |
| /// Pepper operations complete asynchronously. |
| +/// |
| +/// You can create these objects yourself, but it is most common to use the |
| +/// CompletionCallbackFactory to allow the callbacks to call class member |
| +/// functions. |
| class CompletionCallback { |
| public: |
| /// The default constructor will create a blocking |
| @@ -148,6 +158,91 @@ class CompletionCallback { |
| PP_CompletionCallback cc_; |
| }; |
| +/// A CompletionCallbackWithOutput defines a completion callback that |
| +/// additionally stores a pointer to some output data. Some C++ wrappers |
| +/// take a CompletionCallbackWithOutput when the browser is returning a |
| +/// bit of data as part of the function call. The "output" parameter |
| +/// stored in the CompletionCallbackWithOutput will receive the data from |
| +/// the browser. |
| +/// |
| +/// You can create this yourself, but it is most common to use with the |
| +/// CompletionCallbackFactory's NewCallbackWithOutput, which manages the |
| +/// storage for the output parameter for you and passes it as an argument |
| +/// to your callback function. |
| +/// |
| +/// Note that this class doesn't actually do anything with the output data, |
| +/// it just stores a pointer to it. C++ wrapper objects that accept a |
| +/// CompletionCallbackWithOutput will retrieve this pointer and pass it to |
| +/// the browser as the output parameter. |
| +template<typename T> |
| +class CompletionCallbackWithOutput : public CompletionCallback { |
| + public: |
| + /// The type that will actually be stored in the completion callback. In the |
| + /// common case, this will be equal to the template parameter (for example, |
| + /// CompletionCallbackWithOutput<int> would obviously take an int*. However, |
| + /// resources are passed as PP_Resource, vars as PP_Var, and arrays as our |
| + /// special ArrayOutputAdapter object. The CallbackOutputTraits defines |
| + /// specializations for all of these cases. |
| + typedef typename internal::CallbackOutputTraits<T>::StorageType |
| + OutputStorageType; |
| + |
| + /// The default constructor will create a blocking |
| + /// <code>CompletionCallback</code> that references the given output |
| + /// data. |
| + /// |
| + /// @param[in] output A pointer to the data associated with the callback. The |
| + /// caller must ensure that this pointer outlives the completion callback. |
| + /// |
| + /// <strong>Note:</strong> Blocking completion callbacks are only allowed from |
| + /// from background threads. |
| + CompletionCallbackWithOutput(OutputStorageType* output) |
|
dmichael (off chromium)
2012/03/09 18:23:27
explicit
|
| + : CompletionCallback(), |
| + output_(output) { |
| + } |
| + |
| + /// A constructor for creating a <code>CompletionCallback</code> that |
| + /// references the given output data. |
| + /// |
| + /// @param[in] output A pointer to the data associated with the callback. The |
| + /// caller must ensure that this pointer outlives the completion callback. |
| + /// |
| + /// @param[in] user_data The user data to be passed to the callback function. |
|
dmichael (off chromium)
2012/03/09 18:23:27
nit: I'm used to seeing the params listed in the s
|
| + /// This is optional and is typically used to help track state in case of |
| + /// multiple pending callbacks. |
| + CompletionCallbackWithOutput(PP_CompletionCallback_Func func, |
| + void* user_data, |
| + OutputStorageType* output) |
| + : CompletionCallback(func, user_data), |
| + output_(output) { |
| + } |
| + |
| + /// A constructor for creating a <code>CompletionCallback</code> that |
| + /// references the given output data. |
| + /// |
| + /// @param[in] output A pointer to the data associated with the callback. The |
| + /// caller must ensure that this pointer outlives the completion callback. |
| + /// |
| + /// @param[in] user_data The user data to be passed to the callback function. |
| + /// This is optional and is typically used to help track state in case of |
| + /// multiple pending callbacks. |
| + /// |
| + /// @param[in] flags Bit field combination of |
|
dmichael (off chromium)
2012/03/09 18:23:27
nit: order again
|
| + /// <code>PP_CompletionCallback_Flag</code> flags used to control how |
| + /// non-NULL callbacks are scheduled by asynchronous methods. |
| + CompletionCallbackWithOutput(PP_CompletionCallback_Func func, |
| + void* user_data, |
| + int32_t flags, |
| + OutputStorageType* output) |
| + : CompletionCallback(func, user_data, flags), |
| + output_(output) { |
| + } |
| + |
| + OutputStorageType* output() const { return output_; } |
| + |
| + private: |
| + OutputStorageType* output_; |
| +}; |
| + |
| /// BlockUntilComplete() is used in place of an actual completion callback |
| /// to request blocking behavior. If specified, the calling thread will block |
| /// until the function completes. Blocking completion callbacks are only |