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