Esempio n. 1
0
        public FtMeta CreateCopy()
        {
            FtMeta meta = MetaFactory.CreateMeta();

            meta.Assign(this);
            return(meta);
        }
Esempio n. 2
0
 public static FtMeta Create()
 {
     return(MetaFactory.CreateMeta());
 }
Esempio n. 3
0
        internal protected virtual FtMeta Read(XmlReader reader)
        {
            if (!reader.ReadToFollowing(MetaElementTypeFormatter.ToElementName(MetaElementType.FieldedText)))
            {
                return(null);
            }
            else
            {
                bool emptyElement = reader.IsEmptyElement;
                FieldedTextReadElement rootElement = ReadElement.CreateFieldedTextXmlReadElement();
                ReadAttributes(reader, rootElement);

                if (!emptyElement)
                {
                    ReadElement activeElement       = rootElement;
                    Stack       parentStack         = new Stack();
                    int         foreignElementDepth = 0;

                    while (activeElement != null)
                    {
                        if (!reader.Read())
                        {
                            throw new FtMetaSerializationException(Properties.Resources.XmlMetaSerializationReader_Read_IncompleteXmlStream);
                        }

                        switch (reader.NodeType)
                        {
                        case XmlNodeType.Element:
                            emptyElement = reader.IsEmptyElement;

                            if (foreignElementDepth > 0)
                            {
                                if (!emptyElement)
                                {
                                    foreignElementDepth++;
                                }
                            }
                            else
                            {
                                MetaElementType elementType;
                                if (!MetaElementTypeFormatter.TryParseElementName(reader.Name, out elementType))
                                {
                                    if (!emptyElement)
                                    {
                                        foreignElementDepth++;
                                    }
                                }
                                else
                                {
                                    ReadElement newActiveElement;
                                    if (activeElement.TryCreate(elementType, out newActiveElement))
                                    {
                                        parentStack.Push(activeElement);
                                        activeElement = newActiveElement;

                                        ReadAttributes(reader, activeElement);

                                        if (emptyElement)
                                        {
                                            if (parentStack.Count > 0)
                                            {
                                                activeElement = parentStack.Pop();
                                            }
                                            else
                                            {
                                                activeElement = null;
                                            }
                                        }
                                    }
                                }
                            }
                            break;

                        case XmlNodeType.EndElement:
                            if (foreignElementDepth > 0)
                            {
                                foreignElementDepth--;
                            }
                            else
                            {
                                if (parentStack.Count > 0)
                                {
                                    activeElement = parentStack.Pop();
                                }
                                else
                                {
                                    activeElement = null;
                                }
                            }
                            break;
                        }
                    }
                }

                string errorDescription;
                FtMeta result = MetaFactory.CreateMeta();
                if (!rootElement.ResolveTo(result, out errorDescription))
                {
                    throw new FtMetaSerializationException(errorDescription);
                }
                return(result);
            }
        }