KeePassLib.Serialization.Kdb4File.WriteDocument C# (CSharp) Метод

WriteDocument() приватный Метод

private WriteDocument ( PwGroup pgDataSource ) : void
pgDataSource PwGroup
Результат void
        private void WriteDocument(PwGroup pgDataSource)
        {
            Debug.Assert(m_xmlWriter != null);
            if(m_xmlWriter == null) throw new InvalidOperationException();

            PwGroup pgRoot = (pgDataSource ?? m_pwDatabase.RootGroup);

            uint uNumGroups, uNumEntries, uCurEntry = 0;
            pgRoot.GetCounts(true, out uNumGroups, out uNumEntries);

            BinPoolBuild(pgRoot);

            m_xmlWriter.Formatting = Formatting.Indented;
            m_xmlWriter.IndentChar = '\t';
            m_xmlWriter.Indentation = 1;

            m_xmlWriter.WriteStartDocument(true);
            m_xmlWriter.WriteStartElement(ElemDocNode);

            WriteMeta();

            m_xmlWriter.WriteStartElement(ElemRoot);
            StartGroup(pgRoot);

            Stack<PwGroup> groupStack = new Stack<PwGroup>();
            groupStack.Push(pgRoot);

            GroupHandler gh = delegate(PwGroup pg)
            {
                Debug.Assert(pg != null);
                if(pg == null) throw new ArgumentNullException("pg");

                while(true)
                {
                    if(pg.ParentGroup == groupStack.Peek())
                    {
                        groupStack.Push(pg);
                        StartGroup(pg);
                        break;
                    }
                    else
                    {
                        groupStack.Pop();
                        if(groupStack.Count <= 0) return false;

                        EndGroup();
                    }
                }

                return true;
            };

            EntryHandler eh = delegate(PwEntry pe)
            {
                Debug.Assert(pe != null);
                WriteEntry(pe, false);

                ++uCurEntry;
                if(m_slLogger != null)
                    if(!m_slLogger.SetProgress((100 * uCurEntry) / uNumEntries))
                        return false;

                return true;
            };

            if(!pgRoot.TraverseTree(TraversalMethod.PreOrder, gh, eh))
                throw new InvalidOperationException();

            while(groupStack.Count > 1)
            {
                m_xmlWriter.WriteEndElement();
                groupStack.Pop();
            }

            EndGroup();

            WriteList(ElemDeletedObjects, m_pwDatabase.DeletedObjects);
            m_xmlWriter.WriteEndElement(); // Root

            m_xmlWriter.WriteEndElement(); // ElemDocNode
            m_xmlWriter.WriteEndDocument();
        }