blob: 2be478f3600b565396cd03872cc50d94eefe50fc [file] [log] [blame]
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 = {};