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 Thu Apr 10 14:52:30 2014. */ 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. These objects are reference counted, so 57 * AddRef() and Release() must be used properly to avoid memory leaks. 58 */ 59 PP_VARTYPE_STRING = 5, 60 /** 61 * Represents a JavaScript object. This vartype is not currently usable 62 * from modules, although it is used internally for some tasks. These objects 63 * are reference counted, so AddRef() and Release() must be used properly to 64 * avoid memory leaks. 65 */ 66 PP_VARTYPE_OBJECT = 6, 67 /** 68 * Represents an array of Vars. The <code>as_id</code> field is used to 69 * identify the array, which may be created and manipulated from the 70 * <code>PPB_VarArray</code> interface. These objects are reference counted, 71 * so AddRef() and Release() must be used properly to avoid memory leaks. 72 */ 73 PP_VARTYPE_ARRAY = 7, 74 /** 75 * Represents a mapping from strings to Vars. The <code>as_id</code> field is 76 * used to identify the dictionary, which may be created and manipulated from 77 * the <code>PPB_VarDictionary</code> interface. These objects are reference 78 * counted, so AddRef() and Release() must be used properly to avoid memory 79 * leaks. 80 */ 81 PP_VARTYPE_DICTIONARY = 8, 82 /** 83 * ArrayBuffer represents a JavaScript ArrayBuffer. This is the type which 84 * represents Typed Arrays in JavaScript. Unlike JavaScript 'Array', it is 85 * only meant to contain basic numeric types, and is always stored 86 * contiguously. See PPB_VarArrayBuffer_Dev for functions special to 87 * ArrayBuffer vars. These objects are reference counted, so AddRef() and 88 * Release() must be used properly to avoid memory leaks. 89 */ 90 PP_VARTYPE_ARRAY_BUFFER = 9, 91 /** 92 * This type allows the <code>PP_Var</code> to wrap a <code>PP_Resource 93 * </code>. This can be useful for sending or receiving some types of 94 * <code>PP_Resource</code> using <code>PPB_Messaging</code> or 95 * <code>PPP_Messaging</code>. 96 * 97 * These objects are reference counted, so AddRef() and Release() must be used 98 * properly to avoid memory leaks. Under normal circumstances, the 99 * <code>PP_Var</code> will implicitly hold a reference count on the 100 * <code>PP_Resource</code> on your behalf. For example, if you call 101 * VarFromResource(), it implicitly calls PPB_Core::AddRefResource() on the 102 * <code>PP_Resource</code>. Likewise, PPB_Var::Release() on a Resource 103 * <code>PP_Var</code> will invoke PPB_Core::ReleaseResource() when the Var 104 * reference count goes to zero. 105 */ 106 PP_VARTYPE_RESOURCE = 10 107 } PP_VarType; 108 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VarType, 4); 109 /** 110 * @} 111 */ 112 113 /** 114 * @addtogroup Structs 115 * @{ 116 */ 117 /** 118 * The PP_VarValue union stores the data for any one of the types listed 119 * in the PP_VarType enum. 120 */ 121 union PP_VarValue { 122 /** 123 * If <code>type</code> is <code>PP_VARTYPE_BOOL</code>, 124 * <code>as_bool</code> represents the value of this <code>PP_Var</code> as 125 * <code>PP_Bool</code>. 126 */ 127 PP_Bool as_bool; 128 /** 129 * If <code>type</code> is <code>PP_VARTYPE_INT32</code>, 130 * <code>as_int</code> represents the value of this <code>PP_Var</code> as 131 * <code>int32_t</code>. 132 */ 133 int32_t as_int; 134 /** 135 * If <code>type</code> is <code>PP_VARTYPE_DOUBLE</code>, 136 * <code>as_double</code> represents the value of this <code>PP_Var</code> 137 * as <code>double</code>. 138 */ 139 double as_double; 140 /** 141 * If <code>type</code> is <code>PP_VARTYPE_STRING</code>, 142 * <code>PP_VARTYPE_OBJECT</code>, <code>PP_VARTYPE_ARRAY</code>, 143 * <code>PP_VARTYPE_DICTIONARY</code>, <code>PP_VARTYPE_ARRAY_BUFFER</code>, 144 * or <code>PP_VARTYPE_RESOURCE</code>, <code>as_id</code> represents the 145 * value of this <code>PP_Var</code> as an opaque handle assigned by the 146 * browser. This handle is guaranteed never to be 0, so a module can 147 * initialize this ID to 0 to indicate a "NULL handle." 148 */ 149 int64_t as_id; 150 }; 151 152 /** 153 * The <code>PP_VAR</code> struct is a variant data type and can contain any 154 * value of one of the types named in the <code>PP_VarType</code> enum. This 155 * structure is for passing data between native code which can be strongly 156 * typed and the browser (JavaScript) which isn't strongly typed. 157 * 158 * JavaScript has a "number" type for holding a number, and does not 159 * differentiate between floating point and integer numbers. The 160 * JavaScript operations will try to optimize operations by using 161 * integers when possible, but could end up with doubles. Therefore, 162 * you can't assume a numeric <code>PP_Var</code> will be the type you expect. 163 * Your code should be capable of handling either int32_t or double for numeric 164 * PP_Vars sent from JavaScript. 165 */ 166 struct PP_Var { 167 PP_VarType type; 168 /** 169 * The <code>padding</code> ensures <code>value</code> is aligned on an 170 * 8-byte boundary relative to the start of the struct. Some compilers 171 * align doubles on 8-byte boundaries for 32-bit x86, and some align on 172 * 4-byte boundaries. 173 */ 174 int32_t padding; 175 /** 176 * This <code>value</code> represents the contents of the PP_Var. Only one of 177 * the fields of <code>value</code> is valid at a time based upon 178 * <code>type</code>. 179 */ 180 union PP_VarValue value; 181 }; 182 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Var, 16); 183 /** 184 * @} 185 */ 186 187 /** 188 * @addtogroup Functions 189 * @{ 190 */ 191 192 /** 193 * PP_MakeUndefined() is used to wrap an undefined value into a 194 * <code>PP_Var</code> struct for passing to the browser. 195 * 196 * @return A <code>PP_Var</code> structure. 197 */ 198 PP_INLINE struct PP_Var PP_MakeUndefined(void) { 199 struct PP_Var result = { PP_VARTYPE_UNDEFINED, 0, {PP_FALSE} }; 200 return result; 201 } 202 203 /** 204 * PP_MakeNull() is used to wrap a null value into a 205 * <code>PP_Var</code> struct for passing to the browser. 206 * 207 * @return A <code>PP_Var</code> structure, 208 */ 209 PP_INLINE struct PP_Var PP_MakeNull(void) { 210 struct PP_Var result = { PP_VARTYPE_NULL, 0, {PP_FALSE} }; 211 return result; 212 } 213 214 /** 215 * PP_MakeBool() is used to wrap a boolean value into a 216 * <code>PP_Var</code> struct for passing to the browser. 217 * 218 * @param[in] value A <code>PP_Bool</code> enumeration to 219 * wrap. 220 * 221 * @return A <code>PP_Var</code> structure. 222 */ 223 PP_INLINE struct PP_Var PP_MakeBool(PP_Bool value) { 224 struct PP_Var result = { PP_VARTYPE_BOOL, 0, {PP_FALSE} }; 225 result.value.as_bool = value; 226 return result; 227 } 228 229 /** 230 * PP_MakeInt32() is used to wrap a 32 bit integer value 231 * into a <code>PP_Var</code> struct for passing to the browser. 232 * 233 * @param[in] value An int32 to wrap. 234 * 235 * @return A <code>PP_Var</code> structure. 236 */ 237 PP_INLINE struct PP_Var PP_MakeInt32(int32_t value) { 238 struct PP_Var result = { PP_VARTYPE_INT32, 0, {PP_FALSE} }; 239 result.value.as_int = value; 240 return result; 241 } 242 243 /** 244 * PP_MakeDouble() is used to wrap a double value into a 245 * <code>PP_Var</code> struct for passing to the browser. 246 * 247 * @param[in] value A double to wrap. 248 * 249 * @return A <code>PP_Var</code> structure. 250 */ 251 PP_INLINE struct PP_Var PP_MakeDouble(double value) { 252 struct PP_Var result = { PP_VARTYPE_DOUBLE, 0, {PP_FALSE} }; 253 result.value.as_double = value; 254 return result; 255 } 256 /** 257 * @} 258 */ 259 260 #endif /* PPAPI_C_PP_VAR_H_ */ 261 262