Home | History | Annotate | Download | only in cpp
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef PPAPI_CPP_COMPLETION_CALLBACK_H_
      6 #define PPAPI_CPP_COMPLETION_CALLBACK_H_
      7 
      8 #include "ppapi/c/pp_completion_callback.h"
      9 #include "ppapi/c/pp_errors.h"
     10 #include "ppapi/cpp/extensions/ext_output_traits.h"
     11 #include "ppapi/cpp/logging.h"
     12 #include "ppapi/cpp/module.h"
     13 #include "ppapi/cpp/output_traits.h"
     14 
     15 /// @file
     16 /// This file defines the API to create and run a callback.
     17 namespace pp {
     18 
     19 /// This API enables you to implement and receive callbacks when
     20 /// Pepper operations complete asynchronously.
     21 ///
     22 /// You can create these objects yourself, but it is most common to use the
     23 /// CompletionCallbackFactory to allow the callbacks to call class member
     24 /// functions.
     25 class CompletionCallback {
     26  public:
     27   /// The default constructor will create a blocking
     28   /// <code>CompletionCallback</code> that can be passed to a method to
     29   /// indicate that the calling thread should be blocked until the asynchronous
     30   /// operation corresponding to the method completes.
     31   ///
     32   /// <strong>Note:</strong> Blocking completion callbacks are only allowed from
     33   /// from background threads.
     34   CompletionCallback() {
     35     cc_ = PP_BlockUntilComplete();
     36   }
     37 
     38   /// A constructor for creating a <code>CompletionCallback</code>.
     39   ///
     40   /// @param[in] func The function to be called on completion.
     41   /// @param[in] user_data The user data to be passed to the callback function.
     42   /// This is optional and is typically used to help track state in case of
     43   /// multiple pending callbacks.
     44   CompletionCallback(PP_CompletionCallback_Func func, void* user_data) {
     45     cc_ = PP_MakeCompletionCallback(func, user_data);
     46   }
     47 
     48   /// A constructor for creating a <code>CompletionCallback</code> with
     49   /// specified flags.
     50   ///
     51   /// @param[in] func The function to be called on completion.
     52   /// @param[in] user_data The user data to be passed to the callback function.
     53   /// This is optional and is typically used to help track state in case of
     54   /// multiple pending callbacks.
     55   /// @param[in] flags Bit field combination of
     56   /// <code>PP_CompletionCallback_Flag</code> flags used to control how
     57   /// non-NULL callbacks are scheduled by asynchronous methods.
     58   CompletionCallback(PP_CompletionCallback_Func func, void* user_data,
     59                      int32_t flags) {
     60     cc_ = PP_MakeCompletionCallback(func, user_data);
     61     cc_.flags = flags;
     62   }
     63 
     64   /// The set_flags() function is used to set the flags used to control
     65   /// how non-NULL callbacks are scheduled by asynchronous methods.
     66   ///
     67   /// @param[in] flags Bit field combination of
     68   /// <code>PP_CompletionCallback_Flag</code> flags used to control how
     69   /// non-NULL callbacks are scheduled by asynchronous methods.
     70   void set_flags(int32_t flags) { cc_.flags = flags; }
     71 
     72   /// Run() is used to run the <code>CompletionCallback</code>.
     73   /// Normally, the system runs a <code>CompletionCallback</code> after an
     74   /// asynchronous operation completes, but programs may wish to run the
     75   /// <code>CompletionCallback</code> manually in order to reuse the same code
     76   /// paths.
     77   ///
     78   /// @param[in] result The result of the operation to be passed to the
     79   /// callback function. Non-positive values correspond to the error codes
     80   /// from <code>pp_errors.h</code> (excluding
     81   /// <code>PP_OK_COMPLETIONPENDING</code>). Positive values indicate
     82   /// additional information such as bytes read.
     83   void Run(int32_t result) {
     84     PP_DCHECK(cc_.func);
     85     PP_RunCompletionCallback(&cc_, result);
     86   }
     87 
     88   /// RunAndClear() is used to run the <code>CompletionCallback</code> and
     89   /// clear out the callback so that it cannot be run a second time.
     90   ///
     91   /// @param[in] result The result of the operation to be passed to the
     92   /// callback function. Non-positive values correspond to the error codes
     93   /// from <code>pp_errors.h</code> (excluding
     94   /// <code>PP_OK_COMPLETIONPENDING</code>). Positive values indicate
     95   /// additional information such as bytes read.
     96   void RunAndClear(int32_t result) {
     97     PP_DCHECK(cc_.func);
     98     PP_RunAndClearCompletionCallback(&cc_, result);
     99   }
    100 
    101   /// IsOptional() is used to determine the setting of the
    102   /// <code>PP_COMPLETIONCALLBACK_FLAG_OPTIONAL</code> flag. This flag allows
    103   /// any method taking such callback to complete synchronously
    104   /// and not call the callback if the operation would not block. This is useful
    105   /// when performance is an issue, and the operation bandwidth should not be
    106   /// limited to the processing speed of the message loop.
    107   ///
    108   /// On synchronous method completion, the completion result will be returned
    109   /// by the method itself. Otherwise, the method will return
    110   /// PP_OK_COMPLETIONPENDING, and the callback will be invoked asynchronously
    111   /// on the same thread where the PPB method was invoked.
    112   ///
    113   /// @return true if this callback is optional, otherwise false.
    114   bool IsOptional() const {
    115     return (cc_.func == NULL ||
    116             (cc_.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL) != 0);
    117   }
    118 
    119   /// The pp_completion_callback() function returns the underlying
    120   /// <code>PP_CompletionCallback</code>
    121   ///
    122   /// @return A <code>PP_CompletionCallback</code>.
    123   const PP_CompletionCallback& pp_completion_callback() const { return cc_; }
    124 
    125   /// The flags() function returns flags used to control how non-NULL callbacks
    126   /// are scheduled by asynchronous methods.
    127   ///
    128   /// @return An int32_t containing a bit field combination of
    129   /// <code>PP_CompletionCallback_Flag</code> flags.
    130   int32_t flags() const { return cc_.flags; }
    131 
    132   /// MayForce() is used when implementing functions taking callbacks.
    133   /// If the callback is required and <code>result</code> indicates that it has
    134   /// not been scheduled, it will be forced on the main thread.
    135   ///
    136   /// <strong>Example:</strong>
    137   ///
    138   /// @code
    139   ///
    140   /// int32_t OpenURL(pp::URLLoader* loader,
    141   ///                 pp::URLRequestInfo* url_request_info,
    142   ///                 const CompletionCallback& cc) {
    143   ///   if (loader == NULL || url_request_info == NULL)
    144   ///     return cc.MayForce(PP_ERROR_BADRESOURCE);
    145   ///   return loader->Open(*loader, *url_request_info, cc);
    146   /// }
    147   ///
    148   /// @endcode
    149   ///
    150   /// @param[in] result PP_OK_COMPLETIONPENDING or the result of the completed
    151   /// operation to be passed to the callback function. PP_OK_COMPLETIONPENDING
    152   /// indicates that the callback has already been scheduled. Other
    153   /// non-positive values correspond to error codes from
    154   /// <code>pp_errors.h</code>. Positive values indicate additional information
    155   /// such as bytes read.
    156   ///
    157   /// @return <code>PP_OK_COMPLETIONPENDING</code> if the callback has been
    158   /// forced, result parameter otherwise.
    159   int32_t MayForce(int32_t result) const {
    160     if (result == PP_OK_COMPLETIONPENDING || IsOptional())
    161       return result;
    162     // FIXME(dmichael): Use pp::MessageLoop here once it's out of Dev.
    163     Module::Get()->core()->CallOnMainThread(0, *this, result);
    164     return PP_OK_COMPLETIONPENDING;
    165   }
    166 
    167  protected:
    168   PP_CompletionCallback cc_;
    169 };
    170 
    171 namespace internal {
    172 
    173 /// The base class of [Ext]CompletionCallbackWithOutput.
    174 ///
    175 /// The template parameter Traits determines the storage type
    176 /// (OutputStorageType), the output parameter type used by the browser
    177 /// (APIArgType), and how to map OutputStorageType to APIArgType.
    178 template <typename T, typename Traits>
    179 class CompletionCallbackWithOutputBase : public CompletionCallback {
    180  public:
    181   typedef typename Traits::StorageType OutputStorageType;
    182   typedef typename Traits::APIArgType APIArgType;
    183   typedef Traits TraitsType;
    184 
    185   explicit CompletionCallbackWithOutputBase(OutputStorageType* output)
    186       : CompletionCallback(),
    187         output_(output) {
    188   }
    189 
    190   CompletionCallbackWithOutputBase(PP_CompletionCallback_Func func,
    191                                    void* user_data,
    192                                    OutputStorageType* output)
    193       : CompletionCallback(func, user_data),
    194         output_(output) {
    195   }
    196 
    197   CompletionCallbackWithOutputBase(PP_CompletionCallback_Func func,
    198                                    void* user_data,
    199                                    int32_t flags,
    200                                    OutputStorageType* output)
    201       : CompletionCallback(func, user_data, flags),
    202         output_(output) {
    203   }
    204 
    205   APIArgType output() const {
    206     return Traits::StorageToAPIArg(*output_);
    207   }
    208 
    209  private:
    210   OutputStorageType* output_;
    211 };
    212 
    213 }  // namespace internal
    214 
    215 /// A CompletionCallbackWithOutput defines a completion callback that
    216 /// additionally stores a pointer to some output data. Some C++ wrappers
    217 /// take a CompletionCallbackWithOutput when the browser is returning a
    218 /// bit of data as part of the function call. The "output" parameter
    219 /// stored in the CompletionCallbackWithOutput will receive the data from
    220 /// the browser.
    221 ///
    222 /// You can create this yourself, but it is most common to use with the
    223 /// CompletionCallbackFactory's NewCallbackWithOutput, which manages the
    224 /// storage for the output parameter for you and passes it as an argument
    225 /// to your callback function.
    226 ///
    227 /// Note that this class doesn't actually do anything with the output data,
    228 /// it just stores a pointer to it. C++ wrapper objects that accept a
    229 /// CompletionCallbackWithOutput will retrieve this pointer and pass it to
    230 /// the browser as the output parameter.
    231 template <typename T>
    232 class CompletionCallbackWithOutput
    233     : public internal::CompletionCallbackWithOutputBase<
    234         T, internal::CallbackOutputTraits<T> > {
    235  public:
    236   typedef internal::CompletionCallbackWithOutputBase<
    237       T, internal::CallbackOutputTraits<T> > BaseType;
    238 
    239   /// The default constructor will create a blocking
    240   /// <code>CompletionCallbackWithOutput</code> that references the given output
    241   /// data.
    242   ///
    243   /// @param[in] output A pointer to the data associated with the callback. The
    244   /// caller must ensure that this pointer outlives the completion callback.
    245   /// In the common case, <code>OutputStorageType</code> will be equal to the
    246   /// template parameter T (for example,
    247   /// <code>CompletionCallbackWithOutput<int></code> would obviously take an
    248   /// int*. However, resources are passed as PP_Resource, vars as PP_Var, and
    249   /// arrays as our special ArrayOutputAdapter object.
    250   /// <code>internal::CallbackOutputTraits</code> defines specializations for
    251   /// all of these cases.
    252   ///
    253   /// <strong>Note:</strong> Blocking completion callbacks are only allowed from
    254   /// background threads.
    255   explicit CompletionCallbackWithOutput(
    256       typename BaseType::OutputStorageType* output)
    257       : BaseType(output) {
    258   }
    259 
    260   /// A constructor for creating a <code>CompletionCallbackWithOutput</code>
    261   /// that references the given output data.
    262   ///
    263   /// @param[in] func The function to be called on completion.
    264   /// @param[in] user_data The user data to be passed to the callback function.
    265   /// This is optional and is typically used to help track state in case of
    266   /// multiple pending callbacks.
    267   /// @param[in] output A pointer to the data associated with the callback. The
    268   /// caller must ensure that this pointer outlives the completion callback.
    269   CompletionCallbackWithOutput(PP_CompletionCallback_Func func,
    270                                void* user_data,
    271                                typename BaseType::OutputStorageType* output)
    272       : BaseType(func, user_data, output) {
    273   }
    274 
    275   /// A constructor for creating a <code>CompletionCallbackWithOutput</code>
    276   /// that references the given output data.
    277   ///
    278   /// @param[in] func The function to be called on completion.
    279   ///
    280   /// @param[in] user_data The user data to be passed to the callback function.
    281   /// This is optional and is typically used to help track state in case of
    282   /// multiple pending callbacks.
    283   ///
    284   /// @param[in] flags Bit field combination of
    285   /// <code>PP_CompletionCallback_Flag</code> flags used to control how
    286   /// non-NULL callbacks are scheduled by asynchronous methods.
    287   ///
    288   /// @param[in] output A pointer to the data associated with the callback. The
    289   /// caller must ensure that this pointer outlives the completion callback.
    290   CompletionCallbackWithOutput(PP_CompletionCallback_Func func,
    291                                void* user_data,
    292                                int32_t flags,
    293                                typename BaseType::OutputStorageType* output)
    294       : BaseType(func, user_data, flags, output) {
    295   }
    296 };
    297 
    298 namespace ext {
    299 
    300 /// ExtCompletionCallbackWithOutput is similar to CompletionCallbackWithOutput,
    301 /// but used by APIs within the pp::ext namespace. Usually it is used with the
    302 /// CompletionCallbackFactory's NewExtCallbackWithOutput.
    303 template <typename T>
    304 class ExtCompletionCallbackWithOutput
    305     : public ::pp::internal::CompletionCallbackWithOutputBase<
    306         T, internal::ExtCallbackOutputTraits<T> > {
    307  public:
    308   typedef ::pp::internal::CompletionCallbackWithOutputBase<
    309       T, internal::ExtCallbackOutputTraits<T> > BaseType;
    310 
    311   /// The default constructor will create a blocking
    312   /// <code>ExtCompletionCallbackWithOutput</code> that references the given
    313   /// output data.
    314   ///
    315   /// @param[in] output A pointer to the data associated with the callback. The
    316   /// caller must ensure that this pointer outlives the completion callback.
    317   /// <code>OutputStorageType</code> is either
    318   /// <code>ext::internal::ArrayVarOutputAdapterWithStorage<U></code> (if the
    319   /// template parameter T is of the form std::vector<U>) or
    320   /// <code>ext::internal::VarOutputAdapterWithStorage<T></code> (otherwise).
    321   ///
    322   /// <strong>Note:</strong> Blocking completion callbacks are only allowed from
    323   /// background threads.
    324   explicit ExtCompletionCallbackWithOutput(
    325       typename BaseType::OutputStorageType* output)
    326       : BaseType(output) {
    327   }
    328 
    329   /// A constructor for creating an <code>ExtCompletionCallbackWithOutput</code>
    330   /// that references the given output data.
    331   ///
    332   /// @param[in] func The function to be called on completion.
    333   /// @param[in] user_data The user data to be passed to the callback function.
    334   /// This is optional and is typically used to help track state in case of
    335   /// multiple pending callbacks.
    336   /// @param[in] output A pointer to the data associated with the callback. The
    337   /// caller must ensure that this pointer outlives the completion callback.
    338   ExtCompletionCallbackWithOutput(PP_CompletionCallback_Func func,
    339                                   void* user_data,
    340                                   typename BaseType::OutputStorageType* output)
    341       : BaseType(func, user_data, output) {
    342   }
    343 
    344   /// A constructor for creating an <code>ExtCompletionCallbackWithOutput</code>
    345   /// that references the given output data.
    346   ///
    347   /// @param[in] func The function to be called on completion.
    348   ///
    349   /// @param[in] user_data The user data to be passed to the callback function.
    350   /// This is optional and is typically used to help track state in case of
    351   /// multiple pending callbacks.
    352   ///
    353   /// @param[in] flags Bit field combination of
    354   /// <code>PP_CompletionCallback_Flag</code> flags used to control how
    355   /// non-NULL callbacks are scheduled by asynchronous methods.
    356   ///
    357   /// @param[in] output A pointer to the data associated with the callback. The
    358   /// caller must ensure that this pointer outlives the completion callback.
    359   ExtCompletionCallbackWithOutput(PP_CompletionCallback_Func func,
    360                                   void* user_data,
    361                                   int32_t flags,
    362                                   typename BaseType::OutputStorageType* output)
    363       : BaseType(func, user_data, flags, output) {
    364   }
    365 };
    366 
    367 }  // namespace ext
    368 
    369 /// BlockUntilComplete() is used in place of an actual completion callback
    370 /// to request blocking behavior. If specified, the calling thread will block
    371 /// until the function completes. Blocking completion callbacks are only
    372 /// allowed from background threads.
    373 ///
    374 /// @return A <code>CompletionCallback</code> corresponding to a NULL callback.
    375 inline CompletionCallback BlockUntilComplete() {
    376   // Note: Explicitly inlined to avoid link errors when included into
    377   // ppapi_proxy and ppapi_cpp_objects.
    378   return CompletionCallback();
    379 }
    380 
    381 }  // namespace pp
    382 
    383 #endif  // PPAPI_CPP_COMPLETION_CALLBACK_H_
    384