public void ReadDelegates(string file, DelegateCollection delegates, string apiname, string apiversions) { var specs = new XPathDocument(file); // The pre-GL4.4 spec format does not distinguish between // different apinames (it is assumed that different APIs // are stored in distinct signature.xml files). // To maintain compatibility, we detect the version of the // signatures.xml file and ignore apiname if it is version 1. var specversion = GetSpecVersion(specs); if (specversion == "1") { apiname = null; } foreach (var apiversion in apiversions.Split('|')) { string xpath_add, xpath_delete; GetSignaturePaths(apiname, apiversion, out xpath_add, out xpath_delete); foreach (XPathNavigator nav in specs.CreateNavigator().Select(xpath_delete)) { foreach (XPathNavigator node in nav.SelectChildren("function", String.Empty)) { delegates.Remove(node.GetAttribute("name", String.Empty)); } } foreach (XPathNavigator nav in specs.CreateNavigator().Select(xpath_add)) { delegates.AddRange(ReadDelegates(nav, apiversion)); } } }
public void ReadDelegates(string file, DelegateCollection delegates, string apiname, string apiversions) { var specs = new XPathDocument(file); // The pre-GL4.4 spec format does not distinguish between // different apinames (it is assumed that different APIs // are stored in distinct signature.xml files). // To maintain compatibility, we detect the version of the // signatures.xml file and ignore apiname if it is version 1. var specversion = GetSpecVersion(specs); if (specversion == "1") { apiname = null; } foreach (var apiversion in apiversions.Split('|')) { string xpath_add, xpath_delete; GetSignaturePaths(apiname, apiversion, out xpath_add, out xpath_delete); foreach (XPathNavigator nav in specs.CreateNavigator().Select(xpath_delete)) { foreach (XPathNavigator node in nav.SelectChildren("function", String.Empty)) delegates.Remove(node.GetAttribute("name", String.Empty)); } foreach (XPathNavigator nav in specs.CreateNavigator().Select(xpath_add)) { delegates.AddRange(ReadDelegates(nav, apiversion)); } } }
public FunctionCollection Process(EnumProcessor enum_processor, DelegateCollection delegates, EnumCollection enums, string apiname, string apiversion) { Console.WriteLine("Processing delegates."); var nav = new XPathDocument(Overrides).CreateNavigator(); foreach (var version in apiversion.Split('|')) { // Translate each delegate: // 1st using the <replace> elements in overrides.xml // 2nd using the hardcoded rules in FuncProcessor (e.g. char* -> string) foreach (var signatures in delegates.Values) { foreach (var d in signatures) { TranslateExtension(d); TranslateReturnType(enum_processor, nav, d, enums, apiname, version); TranslateParameters(enum_processor, nav, d, enums, apiname, version); TranslateAttributes(nav, d, enums, apiname, version); } } // Create overloads for backwards compatibility, // by resolving <overload> elements var overload_list = new List<Delegate>(); foreach (var d in delegates.Values.Select(v => v.First())) { var overload_element = GetFuncOverload(nav, d, apiname, apiversion); if (overload_element != null) { var overload = new Delegate(d); ApplyParameterReplacement(overload, overload_element); ApplyReturnTypeReplacement(overload, overload_element); overload_list.Add(overload); } } foreach (var overload in overload_list) { delegates.Add(overload); } } Console.WriteLine("Generating convenience overloads."); delegates.AddRange(CreateConvenienceOverloads(delegates)); Console.WriteLine("Generating wrappers."); var wrappers = CreateWrappers(delegates, enums); Console.WriteLine("Generating CLS compliant overloads."); wrappers = CreateCLSCompliantWrappers(wrappers, enums); Console.WriteLine("Removing non-CLS compliant duplicates."); wrappers = MarkCLSCompliance(wrappers); Console.WriteLine("Removing overloaded delegates."); RemoveOverloadedDelegates(delegates, wrappers); return wrappers; }
public FunctionCollection Process(EnumProcessor enum_processor, DelegateCollection delegates, EnumCollection enums, string apiname, string apiversion) { Console.WriteLine("Processing delegates."); var nav = new XPathDocument(Overrides).CreateNavigator(); foreach (var version in apiversion.Split('|')) { // Translate each delegate: // 1st using the <replace> elements in overrides.xml // 2nd using the hardcoded rules in FuncProcessor (e.g. char* -> string) foreach (var signatures in delegates.Values) { foreach (var d in signatures) { var replace = GetFuncOverride(nav, d, apiname, apiversion); TranslateExtension(d); TranslateReturnType(d, replace, nav, enum_processor, enums, apiname, version); TranslateParameters(d, replace, nav, enum_processor, enums, apiname, version); TranslateAttributes(d, replace, nav, apiname, version); } } // Create overloads for backwards compatibility, // by resolving <overload> elements var overload_list = new List <Delegate>(); foreach (var d in delegates.Values.Select(v => v.First())) { var overload_elements = GetFuncOverload(nav, d, apiname, apiversion); foreach (XPathNavigator overload_element in overload_elements) { var overload = new Delegate(d); TranslateReturnType(overload, overload_element, nav, enum_processor, enums, apiname, version); TranslateParameters(overload, overload_element, nav, enum_processor, enums, apiname, version); TranslateAttributes(overload, overload_element, nav, apiname, version); overload_list.Add(overload); } } foreach (var overload in overload_list) { delegates.Add(overload); } } Console.WriteLine("Generating convenience overloads."); delegates.AddRange(CreateConvenienceOverloads(delegates)); Console.WriteLine("Generating wrappers."); var wrappers = CreateWrappers(delegates, enums); Console.WriteLine("Generating CLS compliant overloads."); wrappers = CreateCLSCompliantWrappers(wrappers, enums); Console.WriteLine("Removing non-CLS compliant duplicates."); wrappers = MarkCLSCompliance(wrappers); Console.WriteLine("Removing overloaded delegates."); RemoveOverloadedDelegates(delegates, wrappers); return(wrappers); }