static private int VerbCheck(CheckOptions opts) { string lFileName = Path.ChangeExtension(opts.XmlFileName, "xml"); Console.WriteLine("Reading and resolving xml file {0}", lFileName); ProcessInclude lResult = ProcessInclude.Factory(opts.XmlFileName, "", ""); lResult.LoadAdvanced(lFileName); return(ProcessSanityChecks(lResult.GetDocument()) ? 0 : 1); }
static private int VerbCreate(CreateOptions opts) { WriteVersion(); string lHeaderFileName = Path.ChangeExtension(opts.XmlFileName, "h"); if (opts.HeaderFileName != "") { lHeaderFileName = opts.HeaderFileName; } Console.WriteLine("Processing xml file {0}", opts.XmlFileName); ProcessInclude lResult = ProcessInclude.Factory(opts.XmlFileName, lHeaderFileName, opts.Prefix); lResult.Expand(); // We restore the original namespace in File lResult.SetNamespace(); XmlDocument lXml = lResult.GetDocument(); bool lSuccess = ProcessSanityChecks(lXml); string lTempXmlFileName = Path.GetTempFileName(); File.Delete(lTempXmlFileName); if (opts.Debug) { lTempXmlFileName = opts.XmlFileName; } lTempXmlFileName = Path.ChangeExtension(lTempXmlFileName, "debug.xml"); if (opts.Debug) { Console.WriteLine("Writing debug file to {0}", lTempXmlFileName); } lXml.Save(lTempXmlFileName); Console.WriteLine("Writing header file to {0}", lHeaderFileName); File.WriteAllText(lHeaderFileName, lResult.HeaderGenerated); string lOutputFileName = Path.ChangeExtension(opts.OutputFile, "knxprod"); if (opts.OutputFile == "") { lOutputFileName = Path.ChangeExtension(opts.XmlFileName, "knxprod"); } if (lSuccess) { string lEtsPath = FindEtsPath(lTempXmlFileName); ExportKnxprod(lEtsPath, lTempXmlFileName, lOutputFileName); } else { Console.WriteLine("--> Skipping creation of {0} due to check errors! <--", lOutputFileName); } if (!opts.Debug) { File.Delete(lTempXmlFileName); } return(0); }
/// <summary> /// Resolves Includes inside xml document /// </summary> /// <param name="iCurrentDir">Directory to use for relative href expressions</param> public void ResolveIncludes(string iCurrentDir) { nsmgr = new XmlNamespaceManager(mDocument.NameTable); nsmgr.AddNamespace("mc", cOwnNamespace); // process define node XmlNodeList lDefineNodes = mDocument.SelectNodes("//mc:define", nsmgr); if (lDefineNodes != null && lDefineNodes.Count > 0) { foreach (XmlNode lDefineNode in lDefineNodes) { DefineContent.Factory(lDefineNode); } } //find all XIncludes in a copy of the document XmlNodeList lIncludeNodes = mDocument.SelectNodes("//mc:include", nsmgr); // get all <include> nodes foreach (XmlNode lIncludeNode in lIncludeNodes) // try { //Load document... string lIncludeName = lIncludeNode.Attributes.GetNamedItemValueOrEmpty("href"); string lHeaderPrefixName = lIncludeNode.Attributes.GetNamedItemValueOrEmpty("prefix"); DefineContent lDefine = DefineContent.GetDefineContent(lHeaderPrefixName); bool lIsTemplate = (lIncludeNode.Attributes.GetNamedItemValueOrEmpty("type") == "template"); bool lIsParameter = (lIncludeNode.Attributes.GetNamedItemValueOrEmpty("type") == "parameter"); ProcessInclude lInclude = ProcessInclude.Factory(lIncludeName, lDefine.header, lHeaderPrefixName); lHeaderPrefixName = lInclude.mHeaderPrefixName; lDefine = DefineContent.GetDefineContent(lHeaderPrefixName.Trim('_')); string lTargetPath = Path.Combine(iCurrentDir, lIncludeName); lInclude.LoadAdvanced(lTargetPath); //...find include in real document... XmlNode lParent = lIncludeNode.ParentNode; string lXPath = lIncludeNode.Attributes.GetNamedItemValueOrEmpty("xpath"); XmlNodeList lChildren = lInclude.SelectNodes(lXPath); string lHeaderFileName = Path.Combine(iCurrentDir, lDefine.header); // if (lIsParameter) { // ExportHeader(lHeaderFileName, lHeaderPrefixName, lInclude, lChildren); // } if (lIsTemplate) { if (lChildren.Count > 0 && "Parameter | Union | ComObject".Contains(lChildren[0].LocalName)) { // at this point we are including a template file // ChannelCount and KoOffset are taken from correct prefix lInclude.ChannelCount = lDefine.NumChannels; lInclude.KoOffset = lDefine.KoOffset; ExportHeader(lHeaderFileName, lHeaderPrefixName, lInclude, lChildren); } } // here we do template processing and repeat the template as many times as // the Channels parameter in header file for (int lChannel = 1; lChannel <= lInclude.ChannelCount; lChannel++) { foreach (XmlNode lChild in lChildren) { //necessary for move between XmlDocument contexts XmlNode lImportNode = lParent.OwnerDocument.ImportNode(lChild, true); // for any Parameter node we do offset recalculation // if there is no prefixname, we do no template replacement if (lHeaderPrefixName != "") { ProcessTemplate(lChannel, lImportNode, lInclude); } lParent.InsertBefore(lImportNode, lIncludeNode); } } lParent.RemoveChild(lIncludeNode); if (lInclude.ChannelCount > 1) { ReplaceDocumentStrings("%N%", lInclude.ChannelCount.ToString()); } // if (lHeaderPrefixName != "") ProcessIncludeFinish(lChildren); //if this fails, something is wrong } if (lDefineNodes != null && lDefineNodes.Count > 0) { foreach (XmlNode lDefineNode in lDefineNodes) { lDefineNode.ParentNode.RemoveChild(lDefineNode); } } // catch { } }