public static DefineContent Factory(XmlNode iDefineNode) { DefineContent lResult; int lChannelCount = 1; int lKoOffset = 1; string lPrefix = ""; string lHeader = ""; lPrefix = iDefineNode.Attributes.GetNamedItemValueOrEmpty("prefix"); if (lPrefix == "") { lPrefix = "LOG"; // backward compatibility } if (sDefines.ContainsKey(lPrefix)) { lResult = sDefines[lPrefix]; } else { lHeader = iDefineNode.Attributes.GetNamedItemValueOrEmpty("header"); lChannelCount = int.Parse(iDefineNode.Attributes.GetNamedItemValueOrEmpty("NumChannels")); lKoOffset = int.Parse(iDefineNode.Attributes.GetNamedItemValueOrEmpty("KoOffset")); lResult = new DefineContent(lPrefix, lHeader, lKoOffset, lChannelCount); sDefines.Add(lPrefix, lResult); } return(lResult); }
/// <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 { } }