Index: vala/valainterfacewriter.vala =================================================================== --- vala/valainterfacewriter.vala (revision 607) +++ vala/valainterfacewriter.vala (working copy) @@ -123,6 +123,10 @@ } } + if (cl.get_cname () != cl.get_default_cname ()) { + write_string ("cname = \"%s\", ".printf (cl.get_cname ())); + } + write_string ("cheader_filename = \"%s\")]".printf (cheaders)); write_newline (); Index: vala/valaclass.vala =================================================================== --- vala/valaclass.vala (revision 607) +++ vala/valaclass.vala (working copy) @@ -346,8 +346,22 @@ } return cname; } - + /** + * Returns the default interface name of this class as it is used in C + * code. + * + * @return the name to be used in C code by default + */ + public virtual string! get_default_cname () { + if (name.has_prefix ("_")) { + return "_%s%s".printf (parent_symbol.get_cprefix (), name.offset (1)); + } else { + return "%s%s".printf (parent_symbol.get_cprefix (), name); + } + } + + /** * Sets the name of this class as it is used in C code. * * @param cname the name to be used in C code Index: vapigen/valagidlparser.vala =================================================================== --- vapigen/valagidlparser.vala (revision 607) +++ vapigen/valagidlparser.vala (working copy) @@ -42,6 +42,10 @@ private Map cname_type_map; + private ArrayList second_pass_idl_nodes; + + private bool is_second_pass; + /** * Parse all source files in the specified code context and build a * code tree. @@ -100,6 +104,7 @@ codenode_attributes_map = new HashMap (str_hash, str_equal); codenode_attributes_patterns = new HashMap (direct_hash, PatternSpec.equal); + second_pass_idl_nodes = new ArrayList (); if (FileUtils.test (metadata_filename, FileTest.EXISTS)) { try { @@ -110,7 +115,8 @@ foreach (string line in metadata.split ("\n")) { var tokens = line.split (" ", 2); - if (null == tokens[0]) { + if (null == tokens[0] || + tokens[0].has_prefix("////")) { continue; } @@ -142,20 +148,54 @@ } } + private string get_real_cname (string! type_name, string[] attributes, Namespace! ns) + { + if (attributes != null) { + foreach (string attr in attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "alias_of") { + return eval(nv[1]); + } + } + } + + return type_name; + } + private string! fix_type_name (string! type_name, Namespace! ns) { - if (type_name.has_prefix (ns.name)) { - return type_name.offset (ns.name.len ()); - } else if (ns.name == "GLib" && type_name.has_prefix ("G")) { - return type_name.offset (1); + var attributes = get_attributes (type_name); + string name = get_real_cname (type_name, attributes, ns); + + if (name.has_prefix (ns.name)) { + return name.offset (ns.name.len ()); + } else if (ns.name == "GLib" && name.has_prefix ("G")) { + return name.offset (1); } else { - foreach (string name in ns.get_cprefixes ()) { - if (type_name.has_prefix (name)) { - return type_name.offset (name.len ()); + if (attributes != null) { + foreach (string attr in attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "name") { + return eval(nv[1]); + } } } + + string best_match = null; + + foreach (string cprefix in ns.get_cprefixes ()) { + if (name.has_prefix (cprefix)) { + if (best_match == null || cprefix.len() > best_match.len()) + best_match = cprefix; + } + } + + if (best_match != null) + { + return name.offset (best_match.len ());; + } } - return type_name; + return name; } private string! fix_const_name (string! const_name, Namespace! ns) { @@ -179,6 +219,9 @@ current_namespace = ns; + is_second_pass = false; + second_pass_idl_nodes.clear (); + var attributes = get_attributes (ns.name); if (attributes != null) { foreach (string attr in attributes) { @@ -195,7 +238,7 @@ } } } - + foreach (weak IdlNode node in module.entries) { if (node.type == IdlNodeTypeId.CALLBACK) { var cb = parse_callback ((IdlNodeFunction) node); @@ -224,7 +267,7 @@ ns.add_constant (c); current_source_file.add_node (c); } else if (node.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) node); + var m = parse_function ((IdlNodeFunction) node, ns.name); if (m != null) { m.instance = false; ns.add_method (m); @@ -233,6 +276,38 @@ } } + + is_second_pass = true; + foreach(weak IdlNode node in second_pass_idl_nodes) + { + if (node.type == IdlNodeTypeId.FUNCTION) { + //find class name + var node_attributes = get_attributes (((IdlNodeFunction) node).symbol); + + if (node_attributes != null) + { + foreach (string attr in node_attributes) + { + var nv = attr.split ("=", 2); + if (nv[0] == "class_name") + { + string cl_name = eval (nv[1]); + string name = fix_type_name(cl_name, ns); + var cl = ns.scope.lookup (name) as Class; + + current_data_type = cl; + parse_member (node, cl_name, cl); + current_data_type = null; + } + } + } + } else if (node.type == IdlNodeTypeId.STRUCT) { + parse_struct ((IdlNodeStruct) node, ns, module); + } else { + Report.error (null, "Type %d not yet supported in second pass".printf(node.type)); + } + } + is_second_pass = false; current_namespace = null; if (sym is Namespace) { @@ -282,6 +357,64 @@ return true; } + private bool is_alias (string! cname) { + var st_attributes = get_attributes (cname); + if (st_attributes != null) { + foreach (string attr in st_attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "alias_of") { + return true; + } + } + } + return false; + } + + private void parse_member (IdlNode! member, string! class_cname, Class! cl) + { + string ref_function = null; + string unref_function = null; + string copy_function = null; + string free_function = null; + + if (member.type == IdlNodeTypeId.FUNCTION) { + string name = fix_function_name(member.name, class_cname); + if (name == "ref") { + ref_function = ((IdlNodeFunction) member).symbol; + } else if (name == "unref") { + unref_function = ((IdlNodeFunction) member).symbol; + } else if (name == "free" || name == "destroy" || name == "delete") { + free_function = ((IdlNodeFunction) member).symbol; + } else { + if (name == "copy") { + copy_function = ((IdlNodeFunction) member).symbol; + } + var m = parse_function ((IdlNodeFunction) member, class_cname); + if (m != null) { + cl.add_method (m); + } + } + } else if (member.type == IdlNodeTypeId.FIELD) { + var f = parse_field ((IdlNodeField) member); + if (f != null) { + cl.add_field (f); + } + } + + if (ref_function != null) { + cl.set_ref_function (ref_function); + } + if (copy_function != null) { + cl.set_dup_function (copy_function); + } + if (unref_function != null) { + cl.set_unref_function (unref_function); + } else if (free_function != null) { + cl.set_free_function (free_function); + } + + } + private void parse_struct (IdlNodeStruct! st_node, Namespace! ns, IdlModule! module) { weak IdlNode node = (IdlNode) st_node; @@ -289,6 +422,13 @@ return; } + if (is_second_pass == false && is_alias(node.name)) { + //if is an alias of another type add + //to second pass nodes + second_pass_idl_nodes.add (node); + return; + } + string name = fix_type_name (node.name, ns); if (!is_reference_type (node.name)) { @@ -319,7 +459,7 @@ foreach (weak IdlNode member in st_node.members) { if (member.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, ns.name); if (m != null) { st.add_method (m); } @@ -354,51 +494,45 @@ ns.add_class (cl); current_source_file.add_node (cl); + if (cl.get_default_cname() != node.name) + { + cl.set_cname(node.name); + } } current_data_type = cl; - string ref_function = null; - string unref_function = null; - string copy_function = null; - string free_function = null; + foreach (weak IdlNode member in st_node.members) { + string symbol; + bool second_pass = false; - foreach (weak IdlNode member in st_node.members) { - if (member.type == IdlNodeTypeId.FUNCTION) { - if (member.name == "ref") { - ref_function = ((IdlNodeFunction) member).symbol; - } else if (member.name == "unref") { - unref_function = ((IdlNodeFunction) member).symbol; - } else if (member.name == "free" || member.name == "destroy") { - free_function = ((IdlNodeFunction) member).symbol; - } else { - if (member.name == "copy") { - copy_function = ((IdlNodeFunction) member).symbol; + if (member.type == IdlNodeTypeId.FUNCTION) + symbol = ((IdlNodeFunction) member).symbol; + else + symbol = member.name; + + var member_attributes = get_attributes (symbol); + + if (member_attributes != null) + { + foreach (string attr in member_attributes) + { + var nv = attr.split ("=", 2); + if (nv[0] == "class_name") + { + if (eval (nv[1]) != node.name) + { + second_pass_idl_nodes.add (member); + second_pass = true; + break; + } } - var m = parse_function ((IdlNodeFunction) member); - if (m != null) { - cl.add_method (m); - } } - } else if (member.type == IdlNodeTypeId.FIELD) { - var f = parse_field ((IdlNodeField) member); - if (f != null) { - cl.add_field (f); - } } - } - if (ref_function != null) { - cl.set_ref_function (ref_function); + if (!second_pass) + parse_member (member, node.name, cl); } - if (copy_function != null) { - cl.set_dup_function (copy_function); - } - if (unref_function != null) { - cl.set_unref_function (unref_function); - } else if (free_function != null) { - cl.set_free_function (free_function); - } current_data_type = null; } @@ -434,7 +568,7 @@ foreach (weak IdlNode member in boxed_node.members) { if (member.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, node.name); if (m != null) { st.add_method (m); } @@ -492,7 +626,7 @@ if (member.name == "copy") { copy_function = ((IdlNodeFunction) member).symbol; } - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, node.name); if (m != null) { cl.add_method (m); } @@ -624,7 +758,7 @@ if (member.type == IdlNodeTypeId.FUNCTION) { bool is_virtual = current_type_vfunc_map.get (member.name) != null; - var m = parse_function ((IdlNodeFunction) member, is_virtual); + var m = parse_function ((IdlNodeFunction) member, node.gtype_name, is_virtual); if (m != null) { cl.add_method (m); } @@ -711,7 +845,7 @@ if (member.type == IdlNodeTypeId.FUNCTION) { bool is_virtual = current_type_vfunc_map.get (member.name) != null; - var m = parse_function ((IdlNodeFunction) member, is_virtual, true); + var m = parse_function ((IdlNodeFunction) member, node.gtype_name, is_virtual, true); if (m != null) { iface.add_method (m); } @@ -952,8 +1086,27 @@ return type; } - - private Method parse_function (IdlNodeFunction! f, bool is_virtual = false, bool is_interface = false) { + + private string fix_function_name(string! function_name, string parent_cname) + { + if (parent_cname != null) + { + var attributes = get_attributes (parent_cname); + if (attributes != null) { + foreach (string attr in attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "function_prefix") { + string prefix = eval(nv[1]); + + return function_name.offset(prefix.len ()); + } + } + } + } + return function_name; + } + + private Method parse_function (IdlNodeFunction! f, string! parent_cname, bool is_virtual = false, bool is_interface = false) { weak IdlNode node = (IdlNode) f; if (f.deprecated) { @@ -966,15 +1119,16 @@ } Method m; - if (!is_interface && (f.is_constructor || node.name.has_prefix ("new"))) { - m = new CreationMethod (node.name, current_source_reference); + string name = fix_function_name(node.name, parent_cname); + if (!is_interface && (f.is_constructor || name.has_prefix ("new"))) { + m = new CreationMethod (name, current_source_reference); if (m.name == "new") { m.name = null; } else if (m.name.has_prefix ("new_")) { m.name = m.name.offset ("new_".len ()); } } else { - m = new Method (node.name, return_type, current_source_reference); + m = new Method (name, return_type, current_source_reference); } m.access = SymbolAccessibility.PUBLIC; @@ -1040,7 +1194,7 @@ current_data_type != null && param.type.is_interface && (param_node.name == "self" || - param type interface has_suffix (current_data_type.get_cname ()))) { + fix_type_name(param type interface, current_namespace).has_suffix (fix_type_name(current_data_type.get_cname (), current_namespace)))) { // instance method if (!current_data_type.is_reference_type () && Index: vapi/packages/gnet-2.0/gnet-2.0-custom.vala =================================================================== --- vapi/packages/gnet-2.0/gnet-2.0-custom.vala (revision 607) +++ vapi/packages/gnet-2.0/gnet-2.0-custom.vala (working copy) @@ -1,4 +1,4 @@ -[CCode (cprefix = "G")] +[CCode (cprefix = "Gnet", cheader_filename ="gnet.h")] namespace GNet { public class NetTOS {} public class InetAddrGetNameAsyncID {} @@ -7,11 +7,20 @@ public class TcpSocketConnectAsyncID {} public class TcpSocketNewAsyncID {} + [Import] + public void init(); +} + +[CCode (cprefix = "G", cheader_filename = "glib.h")] +namespace GLib +{ /* Deprecated glib API */ + [CCode (cprefix = "G_IO_ERROR_")] public enum IOError { NONE, AGAIN, INVAL, UNKNOWN } + } Index: vapi/packages/gnet-2.0/gnet-2.0.metadata =================================================================== --- vapi/packages/gnet-2.0/gnet-2.0.metadata (revision 607) +++ vapi/packages/gnet-2.0/gnet-2.0.metadata (working copy) @@ -1,5 +1,45 @@ -GNet cprefix="Gnet,G" +GNet cprefix="Gnet,G" cheader_filename="gnet.h" + + +//TcpSocket overrides +gnet_tcp_socket_new name="from_inetaddr" + +GnetTcp alias_of="GTcpSocket" function_prefix="socket_" + +gnet_tcp_socket_server_new_with_port transfer_ownership="1" +gnet_tcp_socket_get_local_inetaddr transfer_ownership="1" +gnet_tcp_socket_server_accept transfer_ownership="1" +gnet_tcp_socket_get_remote_inetaddr transfer_ownership="1" + + +//InetAddr overrides +GnetInetaddr alias_of="GInetAddr" + + +//Conn overrides +GnetConn name="Conn" gnet_conn_new_inetaddr name="from_inetaddr" gnet_conn_new_socket name="from_socket" +//Uri overrides +GnetUri alias_of="GURI" + +GnetSha alias_of="GSHA" + +GnetIo name="IO" +bytes_readp is_value_type="0" + +GnetServer alias_of="GServer" + +GnetMcast alias_of="GMcastSocket" function_prefix="socket_" + +GnetUdp alias_of="GUdpSocket" function_prefix="socket_" + +GnetUnix alias_of="GUnixSocket" function_prefix="socket_" + +GnetConnHttp alias_of="GConnHttp" function_prefix="http_" +gnet_conn_http_* class_name="GnetConnHttp" + +GIOError name="IOError" + G* cprefix="G"