def make_impl_tmpl_file(cls): body = [] body.append('using System;') body.append('using System.Collections.Generic;') body.append('using System.Diagnostics;') body.append('using System.Runtime.InteropServices;') # body.append('using System.Diagnostics.CodeAnalysis;') body.append('using %s;' % schema.interop_namespace) body.append('') append_xmldoc(body, cls.get_comment()) if schema.is_proxy(cls): body.append('public sealed unsafe partial class %s' % schema.cpp2csname(cls.get_name())) body.append('{') body.append( indent + ('\n' + indent + indent).join( make_proxy_impl_tmpl_body(cls) ) ) body.append('}') if schema.is_handler(cls): body.append('public abstract unsafe partial class %s' % schema.cpp2csname(cls.get_name())) body.append('{') body.append( indent + ('\n' + indent + indent).join( make_handler_impl_tmpl_body(cls) ) ) body.append('}') return \ """namespace %(namespace)s { %(body)s } """ % { 'namespace': schema.namespace, 'body': indent + ('\n'+indent).join(body) }
def make_wrapper_g_file(cls): body = [] body.append('using System;') body.append('using System.Collections.Generic;') body.append('using System.Diagnostics;') body.append('using System.Runtime.InteropServices;') # body.append('using System.Diagnostics.CodeAnalysis;') body.append('using %s;' % schema.interop_namespace) body.append('') for line in schema.get_overview(cls): body.append('// %s' % line) if schema.is_proxy(cls): body.append('public sealed unsafe partial class %s : IDisposable' % schema.cpp2csname(cls.get_name())) body.append('{') body.append( indent + ('\n' + indent + indent).join( make_proxy_g_body(cls) ) ) body.append('}') if schema.is_handler(cls): body.append('public abstract unsafe partial class %s' % schema.cpp2csname(cls.get_name())) body.append('{') body.append( indent + ('\n' + indent + indent).join( make_handler_g_body(cls) ) ) body.append('}') return make_file_header() + \ """namespace %(namespace)s { %(body)s } """ % { 'namespace': schema.namespace, 'body': indent + ('\n'+indent).join(body) }
def write_interop(header, filepath, backup, schema_name, cppheaderdir): writect = 0 schema.load(schema_name, header) # validate: class role must be defined for all header classes for cls in header.get_classes(): if not schema.is_handler(cls) and not schema.is_proxy(cls): msg = 'Class role must be defined. Class name %s.' % cls.get_name() sys.stdout.write('ERROR! %s\n' % msg) raise Exception(msg) # structs for cls in header.get_classes(): content = make_struct_file(cls) writect += update_file(filepath + '/' + schema.struct_path, cls.get_capi_name() + ".g.cs", content, backup) # libcef.g.cs writect += update_file(filepath + '/' + schema.libcef_path, schema.libcef_filename, make_libcef_file(header), backup) # wrapper for cls in header.get_classes(): content = make_wrapper_g_file(cls) writect += update_file(filepath + '/' + schema.wrapper_g_path, schema.cpp2csname(cls.get_name()) + ".g.cs", content, backup) # userdata userdatacls = obj_class(header, 'CefUserData', '', 'CefUserData', 'CefBaseRefCounted', '', '', '', []) content = make_struct_file(userdatacls) writect += update_file(filepath + '/' + schema.struct_path, userdatacls.get_capi_name() + ".g.cs", content, backup) content = make_wrapper_g_file(userdatacls) writect += update_file(filepath + '/' + schema.wrapper_g_path, schema.cpp2csname(userdatacls.get_name()) + ".g.cs", content, backup) # impl template for cls in header.get_classes(): content = make_impl_tmpl_file(cls) tmplpath = schema.handler_tmpl_path if schema.is_proxy(cls): tmplpath = schema.proxy_tmpl_path writect += update_file( './' + tmplpath, schema.cpp2csname(cls.get_name()) + ".tmpl.g.cs", content, backup) # process cef_version_h content = make_version_cs(read_file(cppheaderdir + '/' + 'cef_version.h')) writect += update_file(filepath + '/' + schema.libcef_path, schema.libcef_version_filename, content, backup) return writect
def make_wrapper_g_file(cls): body = [] body.append('using System;') body.append('using System.Collections.Generic;') body.append('using System.Diagnostics;') body.append('using System.Runtime.InteropServices;') # body.append('using System.Diagnostics.CodeAnalysis;') body.append('using %s;' % schema.interop_namespace) body.append('') for line in schema.get_overview(cls): body.append('// %s' % line) isRefCounted = cls.get_parent_capi_name() == "cef_base_ref_counted_t" isScoped = cls.get_parent_capi_name() == "cef_base_scoped_t" if schema.is_proxy(cls): proxyBase = None if isRefCounted: proxyBase = " : IDisposable" elif isScoped: proxyBase = "" else: raise Exception("Unknown base class type.") body.append(('public sealed unsafe partial class %s' + proxyBase) % schema.cpp2csname(cls.get_name())) body.append('{') body.append(indent + ('\n' + indent + indent).join(make_proxy_g_body(cls))) body.append('}') if schema.is_handler(cls): body.append('public abstract unsafe partial class %s' % schema.cpp2csname(cls.get_name())) body.append('{') body.append(indent + ('\n' + indent + indent).join(make_handler_g_body(cls))) body.append('}') return make_file_header() + \ """namespace %(namespace)s { %(body)s } """ % { 'namespace': schema.namespace, 'body': indent + ('\n'+indent).join(body) }
def write_interop(header, filepath, backup, schema_name, cppheaderdir): writect = 0 schema.load(schema_name, header) # validate: class role must be defined for all header classes for cls in header.get_classes(): if not schema.is_handler(cls) and not schema.is_proxy(cls): msg = 'Class role must be defined. Class name %s.' % cls.get_name() sys.stdout.write('ERROR! %s\n' % msg) raise Exception(msg) # structs for cls in header.get_classes(): content = make_struct_file(cls) writect += update_file(filepath + '/' + schema.struct_path, cls.get_capi_name() + ".g.cs", content, backup) # libcef.g.cs writect += update_file(filepath + '/' + schema.libcef_path, schema.libcef_filename, make_libcef_file(header), backup) # wrapper for cls in header.get_classes(): content = make_wrapper_g_file(cls) writect += update_file(filepath + '/' + schema.wrapper_g_path, schema.cpp2csname(cls.get_name()) + ".g.cs", content, backup) # userdata userdatacls = obj_class(header, 'CefUserData', '', 'CefUserData', '', '', '') content = make_struct_file(userdatacls) writect += update_file(filepath + '/' + schema.struct_path, userdatacls.get_capi_name() + ".g.cs", content, backup) content = make_wrapper_g_file(userdatacls) writect += update_file(filepath + '/' + schema.wrapper_g_path, schema.cpp2csname(userdatacls.get_name()) + ".g.cs", content, backup) # impl template for cls in header.get_classes(): content = make_impl_tmpl_file(cls) tmplpath = schema.handler_tmpl_path if schema.is_proxy(cls): tmplpath = schema.proxy_tmpl_path writect += update_file('./' + tmplpath, schema.cpp2csname(cls.get_name()) + ".tmpl.g.cs", content, backup) # process cef_version_h content = make_version_cs(read_file(cppheaderdir + '/' + 'cef_version.h')) writect += update_file(filepath + '/' + schema.libcef_path, schema.libcef_version_filename, content, backup) return writect
def make_struct_members(cls): result = [] static_funcs = [] funcs = get_funcs(cls) delegate_visibility = "internal" if schema.is_proxy(cls): delegate_visibility = "private" for func in cls.get_static_funcs(): static_funcs.append(get_func_parts(func, 0)) parentClassName = cls.get_parent_capi_name() if (parentClassName != "cef_base_ref_counted_t" and parentClassName != "cef_base_scoped_t"): message = "Error: Generation for base class \"" + cls.get_parent_name( ) + "\" is not supported." raise Exception(message) result.append('internal {0} _base;'.format(parentClassName)) for func in funcs: if not func['basefunc']: result.append('internal IntPtr %(field_name)s;' % func) result.append('') for func in static_funcs: append_dllimport(result, func) for func in funcs: postfixs = schema.get_platform_retval_postfixs(func['csn_retval']) for px in postfixs: func['px'] = px result.append('[UnmanagedFunctionPointer(%s)]' % schema.CEF_CALLBACK) result.append('#if !DEBUG') result.append('[SuppressUnmanagedCodeSecurity]') result.append('#endif') result.append( delegate_visibility + ' delegate %(csn_retval)s%(px)s %(delegate_type)s%(px)s(%(csn_args_proto)s);' % func) result.append('') for func in funcs: if schema.is_proxy(cls): postfixs = schema.get_platform_retval_postfixs(func['csn_retval']) for px in postfixs: func['px'] = px result.append('// %(name)s' % func) result.append('private static IntPtr _p%(slot)s%(px)s;' % func) result.append( 'private static %(delegate_type)s%(px)s _d%(slot)s%(px)s;' % func) result.append('') result.append( 'public static %(csn_retval)s%(px)s %(csn_name)s%(px)s(%(csn_args_proto)s)' % func) result.append('{') result.append(' %(delegate_type)s%(px)s d;' % func) result.append(' var p = self->%(field_name)s;' % func) result.append( ' if (p == _p%(slot)s%(px)s) { d = _d%(slot)s%(px)s; }' % func) result.append(' else') result.append(' {') result.append( ' d = (%(delegate_type)s%(px)s)Marshal.GetDelegateForFunctionPointer(p, typeof(%(delegate_type)s%(px)s));' % func) result.append( ' if (_p%(slot)s%(px)s == IntPtr.Zero) { _d%(slot)s%(px)s = d; _p%(slot)s%(px)s = p; }' % func) result.append(' }') args = ', '.join(map(lambda x: x['name'], func['csn_args'])) if func['csn_retval'] == 'void': result.append(' d(%s);' % args) else: result.append(' return d(%s);' % args) result.append('}') result.append('') if schema.is_handler(cls): iname = schema.get_iname(cls) result.append('private static int _sizeof;') result.append('') result.append('static %s()' % iname) result.append('{') result.append(indent + '_sizeof = Marshal.SizeOf(typeof(%s));' % iname) result.append('}') result.append('') result.append('internal static %s* Alloc()' % iname) result.append('{') result.append(indent + 'var ptr = (%s*)Marshal.AllocHGlobal(_sizeof);' % iname) result.append(indent + '*ptr = new %s();' % iname) result.append(indent + 'ptr->_base._size = (UIntPtr)_sizeof;') result.append(indent + 'return ptr;') result.append('}') result.append('') result.append('internal static void Free(%s* ptr)' % iname) result.append('{') result.append(indent + 'Marshal.FreeHGlobal((IntPtr)ptr);') result.append('}') result.append('') return result
def make_struct_members(cls): result = [] static_funcs = [] funcs = get_funcs(cls) delegate_visibility = "internal" if schema.is_proxy(cls): delegate_visibility = "private" for func in cls.get_static_funcs(): static_funcs.append( get_func_parts(func, 0) ) result.append('internal cef_base_t _base;') for func in funcs: if not func['basefunc']: result.append('internal IntPtr %(field_name)s;' % func) result.append('') for func in static_funcs: append_dllimport(result, func) for func in funcs: postfixs = schema.get_platform_retval_postfixs(func['csn_retval']) for px in postfixs: func['px'] = px result.append('[UnmanagedFunctionPointer(%s)]' % schema.CEF_CALLBACK) result.append('#if !DEBUG') result.append('[SuppressUnmanagedCodeSecurity]') result.append('#endif') result.append(delegate_visibility + ' delegate %(csn_retval)s%(px)s %(delegate_type)s%(px)s(%(csn_args_proto)s);' % func) result.append('') for func in funcs: if schema.is_proxy(cls): postfixs = schema.get_platform_retval_postfixs(func['csn_retval']) for px in postfixs: func['px'] = px result.append('// %(name)s' % func) result.append('private static IntPtr _p%(slot)s%(px)s;' % func) result.append('private static %(delegate_type)s%(px)s _d%(slot)s%(px)s;' % func) result.append('') result.append('public static %(csn_retval)s%(px)s %(csn_name)s%(px)s(%(csn_args_proto)s)' % func) result.append('{') result.append(' %(delegate_type)s%(px)s d;' % func) result.append(' var p = self->%(field_name)s;' % func) result.append(' if (p == _p%(slot)s%(px)s) { d = _d%(slot)s%(px)s; }' % func) result.append(' else') result.append(' {') result.append(' d = (%(delegate_type)s%(px)s)Marshal.GetDelegateForFunctionPointer(p, typeof(%(delegate_type)s%(px)s));' % func) result.append(' if (_p%(slot)s%(px)s == IntPtr.Zero) { _d%(slot)s%(px)s = d; _p%(slot)s%(px)s = p; }' % func) result.append(' }') args = ', '.join(map(lambda x: x['name'], func['csn_args'])) if func['csn_retval'] == 'void': result.append(' d(%s);' % args) else: result.append(' return d(%s);' % args) result.append('}') result.append('') if schema.is_handler(cls): iname = schema.get_iname(cls) result.append('private static int _sizeof;') result.append('') result.append('static %s()' % iname) result.append('{') result.append(indent + '_sizeof = Marshal.SizeOf(typeof(%s));' % iname) result.append('}') result.append('') result.append('internal static %s* Alloc()' % iname) result.append('{') result.append(indent + 'var ptr = (%s*)Marshal.AllocHGlobal(_sizeof);' % iname) result.append(indent + '*ptr = new %s();' % iname) result.append(indent + 'ptr->_base._size = (UIntPtr)_sizeof;') result.append(indent + 'return ptr;') result.append('}') result.append('') result.append('internal static void Free(%s* ptr)' % iname) result.append('{') result.append(indent + 'Marshal.FreeHGlobal((IntPtr)ptr);') result.append('}') result.append('') return result