1698 lines
49 KiB
Plaintext
1698 lines
49 KiB
Plaintext
|
Chromium Embedded Framework (CEF) Translator Tool -- translator.py
|
||
|
-------------------------------------------------------------------------------
|
||
|
|
||
|
Document Last Updated: February 14, 2012
|
||
|
|
||
|
|
||
|
OVERVIEW
|
||
|
--------
|
||
|
|
||
|
The CEF translator tool automatically generates CEF source code based on the
|
||
|
contents of the CEF header file (cef.h). The generated source code includes the
|
||
|
main C API header file (cef_capi.h) and all files in the libcef_dll/cpptoc and
|
||
|
libcef_dll/ctocpp directories.
|
||
|
|
||
|
If any differences are detected between the new translator-generated output and
|
||
|
the file that currently exists on disk a backup of the existing file will be
|
||
|
created before the new file is written (this behavior can be controlled using
|
||
|
a command-line switch -- see 'translator.py -h' for more information). Header
|
||
|
files (*.h) are completely generated by the translator and should never be
|
||
|
edited by hand. Implementation files (*.cc) may contain user-created content
|
||
|
within method and function body blocks. The user-created content is extracted
|
||
|
from the existing file and inserted into the new translator-generated file. Any
|
||
|
differences between existing method/function prototypes and new method/function
|
||
|
prototypes in manually edited implementations will be noted as a warning in new
|
||
|
output file.
|
||
|
|
||
|
// WARNING - CHANGED ATTRIBUTES
|
||
|
// REMOVED: const wchar_t* key
|
||
|
// ADDED: int index
|
||
|
// WARNING - CHANGED RETURN VALUE
|
||
|
// WAS: void
|
||
|
// NOW: int
|
||
|
#pragma message("Warning: "__FILE__": MyFunction prototype has changed")
|
||
|
|
||
|
Auto-generated implementations will be added in the new output file for any
|
||
|
methods/functions that exist in the CEF header file but did not exist in the
|
||
|
current on-disk implementation file. Each time the translator re-generates the
|
||
|
implementation file it will warn if an implementation could not be auto-
|
||
|
generated. Delete the indicated portion of the generated code after adding the
|
||
|
implementation manually.
|
||
|
|
||
|
size_t CEF_CALLBACK frame_new_func(struct _cef_frame_t* self)
|
||
|
{
|
||
|
// BEGIN DELETE BEFORE MODIFYING
|
||
|
// AUTO-GENERATED CONTENT
|
||
|
#pragma message("Warning: "__FILE__": frame_new_func is not implemented")
|
||
|
// END DELETE BEFORE MODIFYING
|
||
|
}
|
||
|
|
||
|
If the complete function or method implementation has been auto-generated the
|
||
|
body of the function or method will contain the following comment.
|
||
|
|
||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||
|
|
||
|
If you edit the implementation manually you should remove this comment so that
|
||
|
CEF will not discard your changes on the next run of the translator tool.
|
||
|
|
||
|
The 'translator.[bat|sh]' file can be used to run the translator tool with
|
||
|
command- line arguments that match the default CEF directory structure and
|
||
|
output options. Run 'translator.py -h' for a complete list of available command-
|
||
|
line arguments.
|
||
|
|
||
|
|
||
|
HEADER ATTRIBUTES
|
||
|
-----------------
|
||
|
|
||
|
Comment-based attribute tags are added before each function, class and method
|
||
|
definition in the CEF header file to provide the translator with additional
|
||
|
information about how the output should be generated. The attribute tags must
|
||
|
be in the form of a comma-delimited list of name=value pairs. Attribute names
|
||
|
and values must contain only alpha-numeric characters, numbers and underscores,
|
||
|
and must all exist on a single line.
|
||
|
|
||
|
/*--cef(name1=value1,name2=value2,name3=value3)--*/
|
||
|
|
||
|
Supported method/function attributes:
|
||
|
|
||
|
capi_name=[string] (Optional) Force a specific output name for the
|
||
|
resulting C API function.
|
||
|
optional_param=[param] (Optional) Parameter name that will be optional
|
||
|
instead of required.
|
||
|
index_param=[param] (Optional) Parameter name representing an index
|
||
|
value that will be verified as >= 0.
|
||
|
default_retval=[string] (Required for enumeration types, Optional for other
|
||
|
types) Specify the default return value.
|
||
|
count_func=[param:func] (Required for non-const non-string std::vector
|
||
|
types) Specify the C++ function that returns the
|
||
|
count of elements for a vector parameter.
|
||
|
api_hash_check (Optional) If set an API hash check will be added
|
||
|
to the CToCpp version of the method/function.
|
||
|
|
||
|
Supported class attributes:
|
||
|
|
||
|
source=[library|client] (Required) Indicates whether the class
|
||
|
implementation is provided by the library or the
|
||
|
client. This effects the generation of guard
|
||
|
blocks in the cpptoc and ctocpp header files.
|
||
|
no_debugct_check (Optional) If set the debug reference count
|
||
|
of the object will not be checked on shutdown.
|
||
|
|
||
|
|
||
|
TRANSLATION RULES
|
||
|
-----------------
|
||
|
|
||
|
All C++ names in the CEF header file are written in CamelCaps format and all
|
||
|
C API translations are generated in lowercase_underscore format.
|
||
|
|
||
|
|
||
|
Translating Classes and Methods
|
||
|
-------------------------------
|
||
|
|
||
|
Class names and global function names must be prefixed with the 'Cef' string.
|
||
|
|
||
|
Global function translation
|
||
|
C++: void CefShutdown()
|
||
|
C API: void cef_shutdown()
|
||
|
|
||
|
The translation of a C++ class name to a C API structure name is prefixed with
|
||
|
'_' and postfixed with '_t'. A typedef of the C API structure to a value
|
||
|
without the prefixed '_' is also provided and may be used interchangeably.
|
||
|
|
||
|
Class name translation
|
||
|
C++: class CefPostData
|
||
|
C API: typedef struct _cef_post_data_t { ... } cef_post_data_t
|
||
|
|
||
|
The translation of a C++ virtual class method to a C API member function adds a
|
||
|
'self' structure pointer as the first parameter. This will always be a pointer
|
||
|
to the structure that contains the member function.
|
||
|
|
||
|
Virtual method translation
|
||
|
C++: virtual void SetFocus(bool enable)
|
||
|
C API: void set_focus(struct _cef_browser_t* self, int enable)
|
||
|
|
||
|
The translation of a C++ static class method to a C API global function
|
||
|
is prefixed with 'cef_classname_' where 'classname' is the
|
||
|
lowercase_underscore name of the class that contains the static method. Any
|
||
|
repeat of 'classname' in the function name is removed.
|
||
|
|
||
|
Static method translation
|
||
|
C++: static CefRefPtr<CefRequest> CreateRequest()
|
||
|
C API: struct _cef_request_t* cef_request_create()
|
||
|
|
||
|
Implementation of the wrapper method/function body is generally formatted as
|
||
|
follows.
|
||
|
|
||
|
Static/Global CppToC (without Return):
|
||
|
|
||
|
CEF_EXPORT void cef_function(capi_params)
|
||
|
{
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C parameter values to C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(cpp_arams);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Retore the C parameter values if changed.
|
||
|
// ...
|
||
|
}
|
||
|
|
||
|
Static/Global CppToC (with Return):
|
||
|
|
||
|
CEF_EXPORT capi_retval cef_function(capi_params)
|
||
|
{
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C parameter values to C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
cpp_retval _rv = CefFunction(cpp_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C parameter values if changed.
|
||
|
// ...
|
||
|
|
||
|
// Return Translation
|
||
|
// Convert the C++ return value to a C return value.
|
||
|
return ...;
|
||
|
}
|
||
|
|
||
|
Static/Global CToCpp (without Return):
|
||
|
|
||
|
void CefFunction(cpp_params)
|
||
|
{
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C++ parameter values to C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
cef_function(capi_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C++ parameter values if changed.
|
||
|
// ...
|
||
|
}
|
||
|
|
||
|
Static/Global CToCpp (with Return):
|
||
|
|
||
|
cpp_retval CefFunction(cpp_params)
|
||
|
{
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C++ parameter values to C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
capi_retval _rv = cef_function(capi_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C++ parameter values if changed.
|
||
|
// ...
|
||
|
|
||
|
// Return Translation
|
||
|
// Convert the C return value to a C++ return value.
|
||
|
return ...;
|
||
|
}
|
||
|
|
||
|
Member CppToC (without Return):
|
||
|
|
||
|
CEF_CALLBACK void class_function(cef_class_t* self, capi_params)
|
||
|
{
|
||
|
// Parameter Verification.
|
||
|
// Verify the C parameter values.
|
||
|
DCHECK(self);
|
||
|
DCHECK(...);
|
||
|
if (!self || ...)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert the C parameter values to C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
CefClassCppToC::Get(self)->CefFunction(cpp_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C parameter values if changed.
|
||
|
// ...
|
||
|
}
|
||
|
|
||
|
Member CppToC (with Return):
|
||
|
|
||
|
CEF_CALLBACK capi_retval class_function(cef_class_t* self, capi_params)
|
||
|
{
|
||
|
// Parameter Verification.
|
||
|
// Verify the C parameter values.
|
||
|
DCHECK(self);
|
||
|
DCHECK(...);
|
||
|
if (!self || ...)
|
||
|
return default_retval; // Configured or defaulted automatically.
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert the C parameter values to C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
cpp_retval _rv = CefClassCppToC::Get(self)->CefFunction(cpp_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C parameter values if changed.
|
||
|
// ...
|
||
|
|
||
|
// Return Translation
|
||
|
// Convert the C++ return value to a C return value.
|
||
|
return ...;
|
||
|
}
|
||
|
|
||
|
Member CToCpp (without Return):
|
||
|
|
||
|
void CefClassCToCpp::Function(cpp_params)
|
||
|
{
|
||
|
// Structure Verification
|
||
|
if (CEF_MEMBER_MISSING(struct_, function))
|
||
|
return;
|
||
|
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C++ parameter values to C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
struct_->class_function(struct_, capi_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C++ parameter values if changed.
|
||
|
// ...
|
||
|
}
|
||
|
|
||
|
Member CToCpp (with Return):
|
||
|
|
||
|
cpp_retval CefClassCToCpp::Function(cpp_params)
|
||
|
{
|
||
|
// Structure Verification
|
||
|
if (CEF_MEMBER_MISSING(struct_, function))
|
||
|
return default_retval; // Configured or defaulted automatically.
|
||
|
|
||
|
// Parameter Verification (Optional)
|
||
|
// Verify the C++ parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Parameter Translation (Optional)
|
||
|
// Convert C++ parameter values to C parameter values.
|
||
|
// ...
|
||
|
|
||
|
// Execution
|
||
|
capi_retval _rv = struct_->class_function(struct_, capi_params);
|
||
|
|
||
|
// Parameter Restoration (Optional)
|
||
|
// Restore the C++ parameter values if changed.
|
||
|
// ...
|
||
|
|
||
|
// Return Translation
|
||
|
// Convert the C return value to a C++ return value.
|
||
|
return ...;
|
||
|
}
|
||
|
|
||
|
|
||
|
Translating Data Types
|
||
|
----------------------
|
||
|
|
||
|
Data types that are available in both C++ and C are left unchanged. This
|
||
|
includes the 'double', 'int', 'long', 'size_t' and 'void' basic types. Other
|
||
|
data types have differing levels of support as indicated below. The translation
|
||
|
tool will terminate with an exception if it encounters a data type that it
|
||
|
cannot translate.
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
Simple/enumeration type by value (simple_byval):
|
||
|
C++: int value
|
||
|
C API: int value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int value)
|
||
|
{
|
||
|
// Execution
|
||
|
CefFunction(value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(int value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(value);
|
||
|
}
|
||
|
|
||
|
Simple/enumeration type by reference (simple_byref):
|
||
|
C++: int& value
|
||
|
C API: int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
int valueVal = value?*value:0;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueVal);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value)
|
||
|
*value = valueVal;
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(int& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(&value);
|
||
|
}
|
||
|
|
||
|
Simple/enumeration const type by reference (simple_byref_const):
|
||
|
C++: const int& value
|
||
|
C API: const int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(const int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
int valueVal = value?*value:0;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueVal);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const int& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(&value);
|
||
|
}
|
||
|
|
||
|
Simple/enumeration type by address (simple_byaddr):
|
||
|
C++: int* value
|
||
|
C API: int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Execution
|
||
|
cef_function(value);
|
||
|
}
|
||
|
|
||
|
Boolean type by value (bool_byval):
|
||
|
C++: bool value
|
||
|
C API: int value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int value)
|
||
|
{
|
||
|
// Execution
|
||
|
CefFunction(value?true:false);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(bool value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(value);
|
||
|
}
|
||
|
|
||
|
Boolean type by reference (bool_byref):
|
||
|
C++: bool& value
|
||
|
C API: int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
bool valueBool = (value && *value)?true:false;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueBool);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value)
|
||
|
*value = valueBool?true:false;
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(bool& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
int valueInt = value;
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueInt);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
value = valueInt?true:false;
|
||
|
}
|
||
|
|
||
|
Boolean type by address (bool_byaddr):
|
||
|
C++: bool* value
|
||
|
C API: int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
bool valueBool = (value && *value)?true:false;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(&valueBool);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value)
|
||
|
*value = valueBool?true:false;
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(bool* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
int valueInt = value?*value:0;
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueInt);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value)
|
||
|
*value = valueInt?true:false;
|
||
|
}
|
||
|
|
||
|
Structure const type by reference (struct_byref_const):
|
||
|
C++: const CefPopupFeatures& value
|
||
|
C API: const cef_popup_features_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(const cef_popup_features_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
CefPopupFeatures valueObj;
|
||
|
// Reference the existing values instead of copying.
|
||
|
if (value)
|
||
|
valueObj.Set(*value, false);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueObj);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const CefPopupFeatures& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(&value);
|
||
|
}
|
||
|
|
||
|
Structure non-const type by reference (struct_byref):
|
||
|
C++: CefWindowInfo& value
|
||
|
C API: cef_window_info_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_window_info_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
CefWindowInfo valueObj;
|
||
|
// Take ownership of the values.
|
||
|
if (value)
|
||
|
valueObj.AttachTo(*value);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueObj);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
// Return the values to the structure.
|
||
|
if (value)
|
||
|
valueObj.DetachTo(*value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefWindowInfo& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(&value);
|
||
|
}
|
||
|
|
||
|
String const type by reference (string_byref_const):
|
||
|
C++: const CefString& value
|
||
|
C API: const cef_string_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(const cef_string_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(CefString(value));
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const CefString& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(value.GetStruct());
|
||
|
}
|
||
|
|
||
|
String non-const type by reference (string_byref):
|
||
|
C++: CefString& value
|
||
|
C API: cef_string_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
CefString valueStr(value);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueStr);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefString& value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(value.GetWritableStruct());
|
||
|
}
|
||
|
|
||
|
Smart pointer type same boundary side (refptr_same):
|
||
|
C++: CefRefPtr<CefBrowser> value
|
||
|
C API: cef_browser_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_browser_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(CefBrowserCppToC::Unwrap(value));
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefRefPtr<CefBrowser> value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(CefBrowserCToCpp::Unwrap(value));
|
||
|
}
|
||
|
|
||
|
Smart pointer type same boundary side by reference (refptr_same_byref):
|
||
|
C++: CefRefPtr<CefClient>& value
|
||
|
C API: cef_client_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_client_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
CefRefPtr<CefClient> valuePtr;
|
||
|
if (value && *value)
|
||
|
valuePtr = CefClientCppToC::Unwrap(*value);
|
||
|
CefClient* valueOrig = valuePtr.get();
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valuePtr);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value) {
|
||
|
if (valuePtr.get()) {
|
||
|
if (valuePtr.get() != valueOrig) {
|
||
|
// The value has been changed.
|
||
|
*value = CefClientCppToC::Wrap(valuePtr);
|
||
|
}
|
||
|
} else {
|
||
|
*value = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefRefPtr<CefClient>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_client_t* valueStruct = NULL;
|
||
|
if(value.get())
|
||
|
valueStruct = CefClientCToCpp::Unwrap(value);
|
||
|
cef_client_t* valueOrig = valueStruct;
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueStuct);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueStruct) {
|
||
|
if (valueStruct != valueOrig) {
|
||
|
// The value was changed.
|
||
|
value = CefClientCToCpp::Wrap(valueStruct);
|
||
|
}
|
||
|
} else {
|
||
|
value = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Smart pointer type different boundary side (refptr_diff):
|
||
|
C++: CefRefPtr<CefBrowser> value
|
||
|
C API: cef_browser_t* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_browser_t* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(CefBrowserCToCpp::Wrap(value));
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefRefPtr<CefBrowser> value)
|
||
|
{
|
||
|
// Execution
|
||
|
cef_function(CefBrowserCppToC::Wrap(value));
|
||
|
}
|
||
|
|
||
|
Smart pointer type different boundary side by reference (refptr_diff_byref):
|
||
|
C++: CefRefPtr<CefClient>& value
|
||
|
C API: cef_client_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_client_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
CefRefPtr<CefClient> valuePtr;
|
||
|
if (value && *value)
|
||
|
valuePtr = CefClientCToCpp::Wrap(*value);
|
||
|
CefClient* valueOrig = valuePtr.get();
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valuePtr);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (value) {
|
||
|
if (valuePtr.get()) {
|
||
|
if (valuePtr.get() != valueOrig) {
|
||
|
// The value has been changed.
|
||
|
*value = CefClientCToCpp::Unwrap(valuePtr);
|
||
|
}
|
||
|
} else {
|
||
|
*value = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(CefRefPtr<CefClient>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_client_t* valueStruct = NULL;
|
||
|
if(value.get())
|
||
|
valueStruct = CefClientCppToC::Wrap(value);
|
||
|
cef_client_t* valueOrig = valueStruct;
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueStuct);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueStruct) {
|
||
|
if (valueStruct != valueOrig) {
|
||
|
// The value was changed.
|
||
|
value = CefClientCppToC::Unwrap(valueStruct);
|
||
|
}
|
||
|
} else {
|
||
|
value = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
String vector type by reference (string_vec_byref):
|
||
|
C++: std::vector<CefString>& value
|
||
|
C API: cef_string_list_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_list_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefString> valueList;
|
||
|
transfer_string_list_contents(value, valueList);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
cef_string_list_clear(value);
|
||
|
transfer_string_list_contents(valueList, value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::vector<CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_list_t valueList = cef_string_list_alloc();
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
transfer_string_list_contents(value, valueList);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList) {
|
||
|
value.clear();
|
||
|
transfer_string_list_contents(valueList, value);
|
||
|
cef_string_list_free(valueList);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
String vector const type by reference (string_vec_byref_const):
|
||
|
C++: const std::vector<CefString>& value
|
||
|
C API: cef_string_list_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_list_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefString> valueList;
|
||
|
transfer_string_list_contents(value, valueList);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::vector<CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_list_t valueList = cef_string_list_alloc();
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
transfer_string_list_contents(value, valueList);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList)
|
||
|
cef_string_list_free(valueList);
|
||
|
}
|
||
|
|
||
|
String-to-string single map type by reference (string_map_single_byref):
|
||
|
C++: std::map<CefString,CefString>& value
|
||
|
C API: cef_string_map_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_map_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::map<CefString,CefString> valueMap;
|
||
|
transfer_string_map_contents(value, valueMap);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueMap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
cef_string_map_clear(value);
|
||
|
transfer_string_map_contents(valueMap, value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::map<CefString,CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_map_t valueMap = cef_string_map_alloc();
|
||
|
DCHECK(valueMap);
|
||
|
if (valueMap)
|
||
|
transfer_string_map_contents(value, valueMap);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueMap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueMap) {
|
||
|
value.clear();
|
||
|
transfer_string_map_contents(valueMap, value);
|
||
|
cef_string_map_free(valueMap);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
String-to-string single map const type by reference
|
||
|
(string_map_single_byref_const):
|
||
|
C++: const std::map<CefString,CefString>& value
|
||
|
C API: cef_string_map_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_map_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::map<CefString,CefString> valueMap;
|
||
|
transfer_string_map_contents(value, valueMap);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueMap);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::map<CefString,CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_map_t valueMap = cef_string_map_alloc();
|
||
|
DCHECK(valueMap);
|
||
|
if (valueMap)
|
||
|
transfer_string_map_contents(value, valueMap);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueMap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueMap)
|
||
|
cef_string_map_free(valueMap);
|
||
|
}
|
||
|
|
||
|
String-to-string multi map type by reference (string_map_multi_byref):
|
||
|
C++: std::multimap<CefString,CefString>& value
|
||
|
C API: cef_string_multimap_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_multimap_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::multimap<CefString,CefString> valueMultimap;
|
||
|
transfer_string_multimap_contents(value, valueMultimap);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueMultimap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
cef_string_multimap_clear(value);
|
||
|
transfer_string_multimap_contents(valueMultimap, value);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::multimap<CefString,CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_multimap_t valueMultimap = cef_string_multimap_alloc();
|
||
|
DCHECK(valueMultimap);
|
||
|
if (valueMultimap)
|
||
|
transfer_string_multimap_contents(value, valueMultimap);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueMultimap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueMultimap) {
|
||
|
value.clear();
|
||
|
transfer_string_multimap_contents(valueMultimap, value);
|
||
|
cef_string_multimap_free(valueMultimap);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
String-to-string multi map const type by reference
|
||
|
(string_map_multi_byref_const):
|
||
|
C++: const std::multimap<CefString,CefString>& value
|
||
|
C API: cef_string_multimap_t value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(cef_string_multimap_t value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DHECK(value);
|
||
|
if (!value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::multimap<CefString,CefString> valueMultimap;
|
||
|
transfer_string_multimap_contents(value, valueMultimap);
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueMultimap);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::multimap<CefString,CefString>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
cef_string_multimap_t valueMultimap = cef_string_multimap_alloc();
|
||
|
DCHECK(valueMultimap);
|
||
|
if (valueMultimap)
|
||
|
transfer_string_multimap_contents(value, valueMultimap);
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueMultimap);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueMultimap)
|
||
|
cef_string_multimap_free(valueMultimap);
|
||
|
}
|
||
|
|
||
|
Simple/Enumeration vector non-const type by reference (simple_vec_byref):
|
||
|
C++: std::vector<int>& value
|
||
|
C API: size_t* valueCount, int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t* valueCount, int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount && (*valueCount == 0 || value));
|
||
|
if (!valueCount || (*valueCount > 0 && !value))
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<int> valueList;
|
||
|
if (valueCount && *valueCount > 0 && value) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
valueList.push_back(value[i]);
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueCount && value) {
|
||
|
*valueCount = std::min(valueList.size(), *valueCount);
|
||
|
if (*valueCount > 0) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
value[i] = valueList[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::vector<int>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
// Function identified by the "count_func" method attribute.
|
||
|
size_t valueSize = value.size();
|
||
|
size_t valueCount = std::max(GetFunctionCount(), valueSize);
|
||
|
int* valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
memset(valueList, 0, sizeof(int)*valueCount);
|
||
|
if (valueList && valueSize > 0) {
|
||
|
for (size_t i = 0; i < valueSize; ++i) {
|
||
|
valueList[i] = value[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
value.clear();
|
||
|
if (valueCount > 0 && valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
value.push_back(valueList[i]);
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Simple/Enumeration vector const type by reference (simple_vec_byref_const):
|
||
|
C++: const std::vector<int>& value
|
||
|
C API: size_t valueCount, int const* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t valueCount, int const* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount == 0 || value);
|
||
|
if (valueCount > 0 && !value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<int> valueList;
|
||
|
if (valueCount > 0) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList.push_back(value[i]);
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::vector<int>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
const size_t valueCount = value.size();
|
||
|
int* valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList[i] = value[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList)
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
|
||
|
Boolean vector non-const type by reference (bool_vec_byref):
|
||
|
C++: std::vector<bool>& value
|
||
|
C API: size_t* valueCount, int* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t* valueCount, int* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount && (*valueCount == 0 || value));
|
||
|
if (!valueCount || (*valueCount > 0 && !value))
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<bool> valueList;
|
||
|
if (valueCount && *valueCount > 0 && value) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
valueList.push_back(value[i]?true:false);
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueCount && value) {
|
||
|
*valueCount = std::min(valueList.size(), *valueCount);
|
||
|
if (*valueCount > 0) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
value[i] = valueList[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
// Function identified by the "count_func" method attribute.
|
||
|
size_t valueSize = value.size();
|
||
|
size_t valueCount = std::max(GetFunctionCount(), valueSize);
|
||
|
int* valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
memset(valueList, 0, sizeof(int)*valueCount);
|
||
|
if (valueList && valueSize > 0) {
|
||
|
for (size_t i = 0; i < valueSize; ++i) {
|
||
|
valueList[i] = value[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
value.clear();
|
||
|
if (valueCount > 0 && valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
value.push_back(valueList[i]?true:false);
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Boolean vector const type by reference (bool_vec_byref_const):
|
||
|
C++: const std::vector<bool>& value
|
||
|
C API: size_t valueCount, int const* value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t valueCount, int const* value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount == 0 || value);
|
||
|
if (valueCount > 0 && !value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<bool> valueList;
|
||
|
if (valueCount > 0) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList.push_back(value[i]?true:false);
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
const size_t valueCount = value.size();
|
||
|
int* valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList)
|
||
|
if (valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList[i] = value[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList)
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
|
||
|
Smart pointer vector non-const type same boundary side by reference
|
||
|
(refptr_vec_same_byref):
|
||
|
C++: std::vector<CefRefPtr<CefPostDataElement>>& value
|
||
|
C API: size_t* valueCount, cef_post_data_element_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t* valueCount,
|
||
|
cef_post_data_element_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount && (*valueCount == 0 || value));
|
||
|
if (!valueCount || (*valueCount > 0 && !value))
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefRefPtr<CefPostDataElement>> valueList;
|
||
|
if (valueCount && *valueCount > 0 && value) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
valueList.push_back(CefPostDataElementCppToC::Unwrap(value[i]));
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueCount && value) {
|
||
|
*valueCount = std::min(valueList.size(), *valueCount);
|
||
|
if (*valueCount > 0) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
value[i] = CefPostDataElementCppToC::Wrap(valueList[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
// Function identified by the "count_func" method attribute.
|
||
|
size_t valueSize = value.size();
|
||
|
size_t valueCount = std::max(GetFunctionCount(), valueSize);
|
||
|
cef_post_data_element_t** valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new cef_post_data_element_t*[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
memset(valueList, 0, sizeof(cef_post_data_element_t*)*valueCount);
|
||
|
if (valueList && valueSize > 0) {
|
||
|
for (size_t i = 0; i < valueSize; ++i) {
|
||
|
valueList[i] = CefPostDataElementCToCpp::Unwrap(value[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
value.clear();
|
||
|
if (valueCount > 0 && valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
value.push_back(CefPostDataElementCToCpp::Wrap(valueList[i]));
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Smart pointer vector const type same boundary side by reference
|
||
|
(refptr_vec_same_byref_const):
|
||
|
C++: const std::vector<CefRefPtr<CefV8Value>>& value
|
||
|
C API: size_t valueCount, const cef_v8value_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t valueCount,
|
||
|
const cef_v8value_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount == 0 || value);
|
||
|
if (valueCount > 0 && !value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefRefPtr<CefV8Value>> valueList;
|
||
|
if (valueCount > 0) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList.push_back(CefV8ValueCppToC::Unwrap(value[i]));
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
const size_t valueCount = value.size();
|
||
|
cef_v8value_t** valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList[i] = CefV8ValueCToCpp::Unwrap(value[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList)
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
|
||
|
Smart pointer vector non-const type different boundary side by reference
|
||
|
(refptr_vec_diff_byref):
|
||
|
C++: std::vector<CefRefPtr<CefPostDataElement>>& value
|
||
|
C API: size_t* valueCount, cef_post_data_element_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t* valueCount,
|
||
|
cef_post_data_element_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount && (*valueCount == 0 || value));
|
||
|
if (!valueCount || (*valueCount > 0 && !value))
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefRefPtr<CefPostDataElement>> valueList;
|
||
|
if (valueCount && *valueCount > 0 && value) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
valueList.push_back(CefPostDataElementCToCpp::Wrap(value[i]));
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueCount && value) {
|
||
|
*valueCount = std::min(valueList.size(), *valueCount);
|
||
|
if (*valueCount > 0) {
|
||
|
for (size_t i = 0; i < *valueCount; ++i)
|
||
|
value[i] = CefPostDataElementCToCpp::Unwrap(valueList[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
// Function identified by the "count_func" method attribute.
|
||
|
size_t valueSize = value.size();
|
||
|
size_t valueCount = std::max(GetFunctionCount(), valueSize);
|
||
|
cef_post_data_element_t** valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new cef_post_data_element_t*[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList)
|
||
|
memset(valueList, 0, sizeof(cef_post_data_element_t*)*valueCount);
|
||
|
if (valueList && valueSize > 0) {
|
||
|
for (size_t i = 0; i < valueSize; ++i) {
|
||
|
valueList[i] = CefPostDataElementCppToC::Wrap(value[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(&valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
value.clear();
|
||
|
if (valueCount > 0 && valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
value.push_back(CefPostDataElementCppToC::Unwrap(valueList[i]));
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Smart pointer vector const type different boundary side by reference
|
||
|
(refptr_vec_diff_byref_const):
|
||
|
C++: const std::vector<CefRefPtr<CefV8Value>>& value
|
||
|
C API: size_t valueCount, const cef_v8value_t** value
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT void cef_function(size_t valueCount,
|
||
|
const cef_v8value_t** value)
|
||
|
{
|
||
|
// Parameter Verification
|
||
|
DCHECK(valueCount == 0 || value);
|
||
|
if (valueCount > 0 && !value)
|
||
|
return;
|
||
|
|
||
|
// Parameter Translation
|
||
|
std::vector<CefRefPtr<CefV8Value>> valueList;
|
||
|
if (valueCount > 0) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList.push_back(CefV8ValueCToCpp::Wrap(value[i]));
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
CefFunction(valueList);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
void CefFunction(const std::vector<bool>& value)
|
||
|
{
|
||
|
// Parameter Translation
|
||
|
const size_t valueCount = value.size();
|
||
|
cef_v8value_t** valueList = NULL;
|
||
|
if (valueCount > 0) {
|
||
|
valueList = new int[valueCount];
|
||
|
DCHECK(valueList);
|
||
|
if (valueList) {
|
||
|
for (size_t i = 0; i < valueCount; ++i)
|
||
|
valueList[i] = CefV8ValueCppToC::Wrap(value[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Execution
|
||
|
cef_function(valueCount, valueList);
|
||
|
|
||
|
// Parameter Restoration
|
||
|
if (valueList)
|
||
|
delete [] valueList;
|
||
|
}
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
Simple/Enumeration type (simple):
|
||
|
C++: int
|
||
|
C API: int
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT int cef_function()
|
||
|
{
|
||
|
// Execution
|
||
|
int _rv = CefFunction();
|
||
|
|
||
|
// Return Translation
|
||
|
return _rv;
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
int CefFunction()
|
||
|
{
|
||
|
// Execution
|
||
|
int _rv = cef_function();
|
||
|
|
||
|
// Return Translation
|
||
|
return _rv;
|
||
|
}
|
||
|
|
||
|
Boolean type (bool):
|
||
|
C++: bool
|
||
|
C API: int
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT int cef_function()
|
||
|
{
|
||
|
// Execution
|
||
|
bool _rv = CefFunction();
|
||
|
|
||
|
// Return Translation
|
||
|
return _rv;
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
bool CefFunction()
|
||
|
{
|
||
|
// Execution
|
||
|
int _rv = cef_function();
|
||
|
|
||
|
// Return Translation
|
||
|
return _rv?true:false;
|
||
|
}
|
||
|
|
||
|
String non-const by reference type (string):
|
||
|
C++: CefString
|
||
|
C API: cef_string_userfree_t
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT cef_string_userfree_t cef_function()
|
||
|
{
|
||
|
// Execution
|
||
|
CefString _rv = CefFunction();
|
||
|
|
||
|
// Return Translation
|
||
|
return _rv.DetachToUserFree();
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
CefString CefFunction()
|
||
|
{
|
||
|
// Execution
|
||
|
cef_string_userfree_t _rv = cef_function();
|
||
|
|
||
|
// Return Translation
|
||
|
CefString _rvStr;
|
||
|
_rvStr.AttachToUserFree(_rv);
|
||
|
return _rvStr;
|
||
|
}
|
||
|
|
||
|
Smart pointer type same boundary side (refptr_same):
|
||
|
C++: CefRefPtr<CefBrowser>
|
||
|
C API: cef_browser_t*
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT cef_browser_t* cef_function()
|
||
|
{
|
||
|
// Execution
|
||
|
CefRefPtr<CefBrowser> _rv = CefFunction();
|
||
|
|
||
|
// Return Translation
|
||
|
return CefBrowserCppToC::Wrap(_rv);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
CefString CefFunction()
|
||
|
{
|
||
|
// Execution
|
||
|
cef_browser_t* _rv = cef_function();
|
||
|
|
||
|
// Return Translation
|
||
|
return CefBrowserCToCpp::Wrap(_rv);
|
||
|
}
|
||
|
|
||
|
Smart pointer type different boundary side (refptr_diff):
|
||
|
C++: CefRefPtr<CefBrowser>
|
||
|
C API: cef_browser_t*
|
||
|
|
||
|
// CppToC Example
|
||
|
CEF_EXPORT cef_browser_t* cef_function()
|
||
|
{
|
||
|
// Execution
|
||
|
CefRefPtr<CefBrowser> _rv = CefFunction();
|
||
|
|
||
|
// Return Translation
|
||
|
return CefBrowserCToCpp::Unwrap(_rv);
|
||
|
}
|
||
|
|
||
|
// CToCpp Example
|
||
|
CefString CefFunction()
|
||
|
{
|
||
|
// Execution
|
||
|
cef_browser_t* _rv = cef_function();
|
||
|
|
||
|
// Return Translation
|
||
|
return CefBrowserCppToC::Unwrap(_rv);
|
||
|
}
|
||
|
|
||
|
|
||
|
Translating Comments
|
||
|
--------------------
|
||
|
|
||
|
Comments from the CEF header file are reproduced in the C API header file with
|
||
|
any referenced C++ types and terminology changed to reflect C API types and
|
||
|
terminology.
|
||
|
|
||
|
C++:
|
||
|
// Create a new CefV8Value object of the specified type. These methods
|
||
|
// should only be called from within the JavaScript context -- either in a
|
||
|
// CefV8Handler::Execute() callback or a CefHandler::HandleJSBinding()
|
||
|
// callback.
|
||
|
|
||
|
C API:
|
||
|
// Create a new cef_v8value_t object of the specified type. These functions
|
||
|
// should only be called from within the JavaScript context -- either in a
|
||
|
// cef_v8handler_t::execute() callback or a cef_handler_t::handle_jsbinding()
|
||
|
// callback.
|
||
|
|
||
|
Situations where the user is responsible for freeing strings allocated and
|
||
|
returned by the library are also noted by comments in the C API header file.
|
||
|
|
||
|
C API:
|
||
|
// The resulting string must be freed by calling cef_string_free().
|
||
|
|
||
|
A comment must occur immediately before the function, class or method that it
|
||
|
documents with no extra space in between. Comments may span multiple lines
|
||
|
but each line must start with the '//' comment identifier.
|
||
|
|
||
|
C++:
|
||
|
// Set focus for the browser window. If |enable| is true focus will be set
|
||
|
// to the window. Otherwise, focus will be removed.
|
||
|
/*--cef()--*/
|
||
|
virtual void SetFocus(bool enable) =0;
|
||
|
|
||
|
If two comments are separated by an empty line it will be assumed that the
|
||
|
higher comment represents a section header and additional space will be added
|
||
|
before it in the translated output.
|
||
|
|
||
|
C++:
|
||
|
// ARRAY METHODS - These methods are only available on arrays.
|
||
|
|
||
|
// Returns the number of elements in the array.
|
||
|
/*--cef()--*/
|
||
|
virtual int GetArrayLength() =0;
|
||
|
|
||
|
Empty lines and lines with the comment identifier but no content are considered
|
||
|
paragraph breaks for the purposes of wrapping the translated text. Any content
|
||
|
indented more than one space is reproduced as-is without content translation
|
||
|
or wrapping.
|
||
|
|
||
|
C++:
|
||
|
// Register a new V8 extension with the specified JavaScript extension code and
|
||
|
// handler. Functions implemented by the handler are prototyped using the
|
||
|
// keyword 'native'. The calling of a native function is restricted to the scope
|
||
|
// in which the prototype of the native function is defined.
|
||
|
//
|
||
|
// Example JavaScript extension code:
|
||
|
//
|
||
|
// // create the 'example' global object if it doesn't already exist.
|
||
|
// if (!example)
|
||
|
// example = {};
|