Exemplo n.º 1
0
        /// <summary>
        /// Получить ссылку на объект контейнера с заполненными данными
        /// </summary>
        /// <param name="mapXml">Карта</param>
        /// <param name="szv3Xml">Сводная ведомость</param>
        /// <param name="szv2XmlArray">Описи пакетов</param>
        /// <param name="szv1XmlArray">Документы СЗВ-1</param>
        /// <param name="diskKey">Ключ</param>
        /// <param name="diskTable">Таблица</param>
        /// <returns></returns>
        public static CompoundFile MakeContainer(XmlDocument mapXml, XmlDocument szv3Xml,
                                                 IEnumerable <XmlDocument> szv2XmlArray,
                                                 IEnumerable <IEnumerable <XmlDocument> > szv1XmlArray,
                                                 byte[] diskKey, byte[] diskTable)
        {
            XmlElement  rootMap     = mapXml[MapXml.tagTopics];
            XmlElement  svodRootMap = rootMap[MapXml.tagSvod];
            XmlNodeList lists       = rootMap.GetElementsByTagName(MapXml.tagTopics);

            if (lists.Count != szv2XmlArray.Count() || lists.Count != szv1XmlArray.Count())
            {
                return(null);
            }

            CompoundFile container = new CompoundFile(CFSVersion.Ver_3, false, false);
            CFStorage    dir4      = container.RootStorage.AddStorage(rootMap.GetAttribute(MapXml.paramID));

            for (int i = 0; i < szv2XmlArray.Count(); i++)
            {
                XmlElement  curList = lists[i] as XmlElement;
                XmlElement  curOpis = curList[MapXml.tagOpis];
                CFStorage   curDir  = dir4.AddStorage(curList.GetAttribute(MapXml.paramID));
                XmlDocument szv2Xml = szv2XmlArray.ElementAt(i);

                CFStream opisStream = AddStream(curDir, szv2Xml, diskKey, diskTable);
                curOpis[MapXml.tagFilename].InnerText = opisStream.Name;

                XmlNodeList docs = curList.GetElementsByTagName(MapXml.tagTopic);
                if (docs.Count != szv1XmlArray.ElementAt(i).Count())
                {
                    continue;
                }

                for (int j = 0; j < szv1XmlArray.ElementAt(i).Count(); j++)
                {
                    /*if (i >= 10 && j >= 51)
                     * {
                     *  Console.WriteLine("Packet {0}, Doc {1}", i, j);
                     * }*/
                    XmlDocument szv1Xml   = szv1XmlArray.ElementAt(i).ElementAt(j);
                    XmlElement  curDoc    = docs[j] as XmlElement;
                    CFStream    docStream = AddStream(curDir, szv1Xml, diskKey, diskTable);
                    curDoc[MapXml.tagFilename].InnerText = docStream.Name;
                }
            }


            CFStream svod = AddStream(dir4, szv3Xml, diskKey, diskTable);

            svodRootMap[MapXml.tagFilename].InnerText = svod.Name;

            CFStream map = container.RootStorage.AddStream("map");

            SetDataToStream(map, mapXml.InnerXml, diskKey, diskTable);

            CFStorage styleDir        = container.RootStorage.AddStorage("styles");
            CFStream  mapStyleStream  = styleDir.AddStream("map_style");
            CFStream  szv1StyleStream = styleDir.AddStream("szv_style");
            CFStream  szv3StyleStream = styleDir.AddStream("svod_style");
            CFStream  szv2StyleStream = styleDir.AddStream("szv_opis_style");

            SetDataToStream(mapStyleStream, File.ReadAllBytes(MapXml.GetXslUrl()), diskKey, diskTable);
            SetDataToStream(szv1StyleStream, File.ReadAllBytes(Szv1Xml.GetXslUrl()), diskKey, diskTable);
            SetDataToStream(szv3StyleStream, File.ReadAllBytes(Szv3Xml.GetXslUrl()), diskKey, diskTable);
            SetDataToStream(szv2StyleStream, File.ReadAllBytes(Szv2Xml.GetXslUrl()), diskKey, diskTable);
            return(container);
        }