Home | History | Annotate | Download | only in c
      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 
      6 /* From pp_var.idl modified Mon Feb 11 15:41:10 2013. */
      7 
      8 #ifndef PPAPI_C_PP_VAR_H_
      9 #define PPAPI_C_PP_VAR_H_
     10 
     11 #include "ppapi/c/pp_bool.h"
     12 #include "ppapi/c/pp_macros.h"
     13 #include "ppapi/c/pp_stdint.h"
     14 
     15 /**
     16  * @file
     17  * This file defines the API for handling the passing of data types between
     18  * your module and the page.
     19  */
     20 
     21 
     22 /**
     23  * @addtogroup Enums
     24  * @{
     25  */
     26 /**
     27  * The <code>PP_VarType</code> is an enumeration of the different types that
     28  * can be contained within a <code>PP_Var</code> structure.
     29  */
     30 typedef enum {
     31   /**
     32    * An undefined value.
     33    */
     34   PP_VARTYPE_UNDEFINED = 0,
     35   /**
     36    * A NULL value. This is similar to undefined, but JavaScript differentiates
     37    * the two so it is exposed here as well.
     38    */
     39   PP_VARTYPE_NULL = 1,
     40   /**
     41    * A boolean value, use the <code>as_bool</code> member of the var.
     42    */
     43   PP_VARTYPE_BOOL = 2,
     44   /**
     45    * A 32-bit integer value. Use the <code>as_int</code> member of the var.
     46    */
     47   PP_VARTYPE_INT32 = 3,
     48   /**
     49    * A double-precision floating point value. Use the <code>as_double</code>
     50    * member of the var.
     51    */
     52   PP_VARTYPE_DOUBLE = 4,
     53   /**
     54    * The Var represents a string. The <code>as_id</code> field is used to
     55    * identify the string, which may be created and retrieved from the
     56    * <code>PPB_Var</code> interface.
     57    */
     58   PP_VARTYPE_STRING = 5,
     59   /**
     60    * Represents a JavaScript object. This vartype is not currently usable
     61    * from modules, although it is used internally for some tasks.
     62    */
     63   PP_VARTYPE_OBJECT = 6,
     64   /**
     65    * Arrays and dictionaries are not currently supported but will be added
     66    * in future revisions. These objects are reference counted so be sure
     67    * to properly AddRef/Release them as you would with strings to ensure your
     68    * module will continue to work with future versions of the API.
     69    */
     70   PP_VARTYPE_ARRAY = 7,
     71   PP_VARTYPE_DICTIONARY = 8,
     72   /**
     73    * ArrayBuffer represents a JavaScript ArrayBuffer. This is the type which
     74    * represents Typed Arrays in JavaScript. Unlike JavaScript 'Array', it is
     75    * only meant to contain basic numeric types, and is always stored
     76    * contiguously. See PPB_VarArrayBuffer_Dev for functions special to
     77    * ArrayBuffer vars.
     78    */
     79   PP_VARTYPE_ARRAY_BUFFER = 9
     80 } PP_VarType;
     81 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VarType, 4);
     82 /**
     83  * @}
     84  */
     85 
     86 /**
     87  * @addtogroup Structs
     88  * @{
     89  */
     90 /**
     91  * The PP_VarValue union stores the data for any one of the types listed
     92  * in the PP_VarType enum.
     93  */
     94 union PP_VarValue {
     95   /**
     96    * If <code>type</code> is <code>PP_VARTYPE_BOOL</code>,
     97    * <code>as_bool</code> represents the value of this <code>PP_Var</code> as
     98    * <code>PP_Bool</code>.
     99    */
    100   PP_Bool as_bool;
    101   /**
    102    * If <code>type</code> is <code>PP_VARTYPE_INT32</code>,
    103    * <code>as_int</code> represents the value of this <code>PP_Var</code> as
    104    * <code>int32_t</code>.
    105    */
    106   int32_t as_int;
    107   /**
    108    * If <code>type</code> is <code>PP_VARTYPE_DOUBLE</code>,
    109    * <code>as_double</code> represents the value of this <code>PP_Var</code>
    110    * as <code>double</code>.
    111    */
    112   double as_double;
    113   /**
    114    * If <code>type</code> is <code>PP_VARTYPE_STRING</code>,
    115    * <code>PP_VARTYPE_OBJECT</code>, <code>PP_VARTYPE_ARRAY</code>, or
    116    * <code>PP_VARTYPE_DICTIONARY</code>,
    117    * <code>as_id</code> represents the value of this <code>PP_Var</code> as
    118    * an opaque handle assigned by the browser. This handle is guaranteed
    119    * never to be 0, so a module can initialize this ID to 0 to indicate a
    120    * "NULL handle."
    121    */
    122   int64_t as_id;
    123 };
    124 
    125 /**
    126  * The <code>PP_VAR</code> struct is a variant data type and can contain any
    127  * value of one of the types named in the <code>PP_VarType</code> enum. This
    128  * structure is for passing data between native code which can be strongly
    129  * typed and the browser (JavaScript) which isn't strongly typed.
    130  *
    131  * JavaScript has a "number" type for holding a number, and does not
    132  * differentiate between floating point and integer numbers. The
    133  * JavaScript operations will try to optimize operations by using
    134  * integers when possible, but could end up with doubles. Therefore,
    135  * you can't assume a numeric <code>PP_Var</code> will be the type you expect.
    136  * Your code should be capable of handling either int32_t or double for numeric
    137  * PP_Vars sent from JavaScript.
    138  */
    139 struct PP_Var {
    140   PP_VarType type;
    141   /**
    142    * The <code>padding</code> ensures <code>value</code> is aligned on an
    143    * 8-byte boundary relative to the start of the struct. Some compilers
    144    * align doubles on 8-byte boundaries for 32-bit x86, and some align on
    145    * 4-byte boundaries.
    146    */
    147   int32_t padding;
    148   /**
    149    * This <code>value</code> represents the contents of the PP_Var. Only one of
    150    * the fields of <code>value</code> is valid at a time based upon
    151    * <code>type</code>.
    152    */
    153   union PP_VarValue value;
    154 };
    155 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Var, 16);
    156 /**
    157  * @}
    158  */
    159 
    160 /**
    161  * @addtogroup Functions
    162  * @{
    163  */
    164 
    165 /**
    166  * PP_MakeUndefined() is used to wrap an undefined value into a
    167  * <code>PP_Var</code> struct for passing to the browser.
    168  *
    169  * @return A <code>PP_Var</code> structure.
    170  */
    171 PP_INLINE struct PP_Var PP_MakeUndefined(void) {
    172   struct PP_Var result = { PP_VARTYPE_UNDEFINED, 0, {PP_FALSE} };
    173   return result;
    174 }
    175 
    176 /**
    177  * PP_MakeNull() is used to wrap a null value into a
    178  * <code>PP_Var</code> struct for passing to the browser.
    179  *
    180  * @return A <code>PP_Var</code> structure,
    181  */
    182 PP_INLINE struct PP_Var PP_MakeNull(void) {
    183   struct PP_Var result = { PP_VARTYPE_NULL, 0, {PP_FALSE} };
    184   return result;
    185 }
    186 
    187 /**
    188  * PP_MakeBool() is used to wrap a boolean value into a
    189  * <code>PP_Var</code> struct for passing to the browser.
    190  *
    191  * @param[in] value A <code>PP_Bool</code> enumeration to
    192  * wrap.
    193  *
    194  * @return A <code>PP_Var</code> structure.
    195  */
    196 PP_INLINE struct PP_Var PP_MakeBool(PP_Bool value) {
    197   struct PP_Var result = { PP_VARTYPE_BOOL, 0, {PP_FALSE} };
    198   result.value.as_bool = value;
    199   return result;
    200 }
    201 
    202 /**
    203  * PP_MakeInt32() is used to wrap a 32 bit integer value
    204  * into a <code>PP_Var</code> struct for passing to the browser.
    205  *
    206  * @param[in] value An int32 to wrap.
    207  *
    208  * @return A <code>PP_Var</code> structure.
    209  */
    210 PP_INLINE struct PP_Var PP_MakeInt32(int32_t value) {
    211   struct PP_Var result = { PP_VARTYPE_INT32, 0, {PP_FALSE} };
    212   result.value.as_int = value;
    213   return result;
    214 }
    215 
    216 /**
    217  * PP_MakeDouble() is used to wrap a double value into a
    218  * <code>PP_Var</code> struct for passing to the browser.
    219  *
    220  * @param[in] value A double to wrap.
    221  *
    222  * @return A <code>PP_Var</code> structure.
    223  */
    224 PP_INLINE struct PP_Var PP_MakeDouble(double value) {
    225   struct PP_Var result = { PP_VARTYPE_DOUBLE, 0, {PP_FALSE} };
    226   result.value.as_double = value;
    227   return result;
    228 }
    229 /**
    230  * @}
    231  */
    232 
    233 #endif  /* PPAPI_C_PP_VAR_H_ */
    234 
    235