Beispiel #1
0
            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);
            }
Beispiel #2
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 { }
        }