/* Copyright (c) 2012 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* From pp_var.idl modified Thu Apr 10 14:52:30 2014. */ #ifndef PPAPI_C_PP_VAR_H_ #define PPAPI_C_PP_VAR_H_ #include "ppapi/c/pp_bool.h" #include "ppapi/c/pp_macros.h" #include "ppapi/c/pp_stdint.h" /** * @file * This file defines the API for handling the passing of data types between * your module and the page. */ /** * @addtogroup Enums * @{ */ /** * The PP_VarType is an enumeration of the different types that * can be contained within a PP_Var structure. */ typedef enum { /** * An undefined value. */ PP_VARTYPE_UNDEFINED = 0, /** * A NULL value. This is similar to undefined, but JavaScript differentiates * the two so it is exposed here as well. */ PP_VARTYPE_NULL = 1, /** * A boolean value, use the as_bool member of the var. */ PP_VARTYPE_BOOL = 2, /** * A 32-bit integer value. Use the as_int member of the var. */ PP_VARTYPE_INT32 = 3, /** * A double-precision floating point value. Use the as_double * member of the var. */ PP_VARTYPE_DOUBLE = 4, /** * The Var represents a string. The as_id field is used to * identify the string, which may be created and retrieved from the * PPB_Var interface. These objects are reference counted, so * AddRef() and Release() must be used properly to avoid memory leaks. */ PP_VARTYPE_STRING = 5, /** * Represents a JavaScript object. This vartype is not currently usable * from modules, although it is used internally for some tasks. These objects * are reference counted, so AddRef() and Release() must be used properly to * avoid memory leaks. */ PP_VARTYPE_OBJECT = 6, /** * Represents an array of Vars. The as_id field is used to * identify the array, which may be created and manipulated from the * PPB_VarArray interface. These objects are reference counted, * so AddRef() and Release() must be used properly to avoid memory leaks. */ PP_VARTYPE_ARRAY = 7, /** * Represents a mapping from strings to Vars. The as_id field is * used to identify the dictionary, which may be created and manipulated from * the PPB_VarDictionary interface. These objects are reference * counted, so AddRef() and Release() must be used properly to avoid memory * leaks. */ PP_VARTYPE_DICTIONARY = 8, /** * ArrayBuffer represents a JavaScript ArrayBuffer. This is the type which * represents Typed Arrays in JavaScript. Unlike JavaScript 'Array', it is * only meant to contain basic numeric types, and is always stored * contiguously. See PPB_VarArrayBuffer_Dev for functions special to * ArrayBuffer vars. These objects are reference counted, so AddRef() and * Release() must be used properly to avoid memory leaks. */ PP_VARTYPE_ARRAY_BUFFER = 9, /** * This type allows the PP_Var to wrap a PP_Resource * . This can be useful for sending or receiving some types of * PP_Resource using PPB_Messaging or * PPP_Messaging. * * These objects are reference counted, so AddRef() and Release() must be used * properly to avoid memory leaks. Under normal circumstances, the * PP_Var will implicitly hold a reference count on the * PP_Resource on your behalf. For example, if you call * VarFromResource(), it implicitly calls PPB_Core::AddRefResource() on the * PP_Resource. Likewise, PPB_Var::Release() on a Resource * PP_Var will invoke PPB_Core::ReleaseResource() when the Var * reference count goes to zero. */ PP_VARTYPE_RESOURCE = 10 } PP_VarType; PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VarType, 4); /** * @} */ /** * @addtogroup Structs * @{ */ /** * The PP_VarValue union stores the data for any one of the types listed * in the PP_VarType enum. */ union PP_VarValue { /** * If type is PP_VARTYPE_BOOL, * as_bool represents the value of this PP_Var as * PP_Bool. */ PP_Bool as_bool; /** * If type is PP_VARTYPE_INT32, * as_int represents the value of this PP_Var as * int32_t. */ int32_t as_int; /** * If type is PP_VARTYPE_DOUBLE, * as_double represents the value of this PP_Var * as double. */ double as_double; /** * If type is PP_VARTYPE_STRING, * PP_VARTYPE_OBJECT, PP_VARTYPE_ARRAY, * PP_VARTYPE_DICTIONARY, PP_VARTYPE_ARRAY_BUFFER, * or PP_VARTYPE_RESOURCE, as_id represents the * value of this PP_Var as an opaque handle assigned by the * browser. This handle is guaranteed never to be 0, so a module can * initialize this ID to 0 to indicate a "NULL handle." */ int64_t as_id; }; /** * The PP_VAR struct is a variant data type and can contain any * value of one of the types named in the PP_VarType enum. This * structure is for passing data between native code which can be strongly * typed and the browser (JavaScript) which isn't strongly typed. * * JavaScript has a "number" type for holding a number, and does not * differentiate between floating point and integer numbers. The * JavaScript operations will try to optimize operations by using * integers when possible, but could end up with doubles. Therefore, * you can't assume a numeric PP_Var will be the type you expect. * Your code should be capable of handling either int32_t or double for numeric * PP_Vars sent from JavaScript. */ struct PP_Var { PP_VarType type; /** * The padding ensures value is aligned on an * 8-byte boundary relative to the start of the struct. Some compilers * align doubles on 8-byte boundaries for 32-bit x86, and some align on * 4-byte boundaries. */ int32_t padding; /** * This value represents the contents of the PP_Var. Only one of * the fields of value is valid at a time based upon * type. */ union PP_VarValue value; }; PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Var, 16); /** * @} */ /** * @addtogroup Functions * @{ */ /** * PP_MakeUndefined() is used to wrap an undefined value into a * PP_Var struct for passing to the browser. * * @return A PP_Var structure. */ PP_INLINE struct PP_Var PP_MakeUndefined(void) { struct PP_Var result = { PP_VARTYPE_UNDEFINED, 0, {PP_FALSE} }; return result; } /** * PP_MakeNull() is used to wrap a null value into a * PP_Var struct for passing to the browser. * * @return A PP_Var structure, */ PP_INLINE struct PP_Var PP_MakeNull(void) { struct PP_Var result = { PP_VARTYPE_NULL, 0, {PP_FALSE} }; return result; } /** * PP_MakeBool() is used to wrap a boolean value into a * PP_Var struct for passing to the browser. * * @param[in] value A PP_Bool enumeration to * wrap. * * @return A PP_Var structure. */ PP_INLINE struct PP_Var PP_MakeBool(PP_Bool value) { struct PP_Var result = { PP_VARTYPE_BOOL, 0, {PP_FALSE} }; result.value.as_bool = value; return result; } /** * PP_MakeInt32() is used to wrap a 32 bit integer value * into a PP_Var struct for passing to the browser. * * @param[in] value An int32 to wrap. * * @return A PP_Var structure. */ PP_INLINE struct PP_Var PP_MakeInt32(int32_t value) { struct PP_Var result = { PP_VARTYPE_INT32, 0, {PP_FALSE} }; result.value.as_int = value; return result; } /** * PP_MakeDouble() is used to wrap a double value into a * PP_Var struct for passing to the browser. * * @param[in] value A double to wrap. * * @return A PP_Var structure. */ PP_INLINE struct PP_Var PP_MakeDouble(double value) { struct PP_Var result = { PP_VARTYPE_DOUBLE, 0, {PP_FALSE} }; result.value.as_double = value; return result; } /** * @} */ #endif /* PPAPI_C_PP_VAR_H_ */