internal override SecurityTimestamp ReadTimestamp(XmlDictionaryReader reader, string digestAlgorithm, SignatureResourcePool resourcePool)
            {
                bool       canonicalize = digestAlgorithm != null && reader.CanCanonicalize;
                HashStream hashStream   = null;

                reader.MoveToStartElement(XD.UtilityDictionary.Timestamp, XD.UtilityDictionary.Namespace);
                if (canonicalize)
                {
                    hashStream = resourcePool.TakeHashStream(digestAlgorithm);
                    reader.StartCanonicalization(hashStream, false, null);
                }
                string id = reader.GetAttribute(XD.UtilityDictionary.IdAttribute, XD.UtilityDictionary.Namespace);

                reader.ReadStartElement();

                reader.ReadStartElement(XD.UtilityDictionary.CreatedElement, XD.UtilityDictionary.Namespace);
                DateTime creationTimeUtc = reader.ReadContentAsDateTime().ToUniversalTime();

                reader.ReadEndElement();

                DateTime expiryTimeUtc;

                if (reader.IsStartElement(XD.UtilityDictionary.ExpiresElement, XD.UtilityDictionary.Namespace))
                {
                    reader.ReadStartElement();
                    expiryTimeUtc = reader.ReadContentAsDateTime().ToUniversalTime();
                    reader.ReadEndElement();
                }
                else
                {
                    expiryTimeUtc = SecurityUtils.MaxUtcDateTime;
                }

                reader.ReadEndElement();

                byte[] digest;
                if (canonicalize)
                {
                    reader.EndCanonicalization();
                    digest = hashStream.FlushHashAndGetValue();
                }
                else
                {
                    digest = null;
                }
                return(new SecurityTimestamp(creationTimeUtc, expiryTimeUtc, id, digestAlgorithm, digest));
            }
            internal override SecurityTimestamp ReadTimestamp(XmlDictionaryReader reader, string digestAlgorithm, SignatureResourcePool resourcePool)
            {
                DateTime maxUtcDateTime;

                byte[]     buffer;
                bool       flag   = (digestAlgorithm != null) && reader.CanCanonicalize;
                HashStream stream = null;

                reader.MoveToStartElement(System.ServiceModel.XD.UtilityDictionary.Timestamp, System.ServiceModel.XD.UtilityDictionary.Namespace);
                if (flag)
                {
                    stream = resourcePool.TakeHashStream(digestAlgorithm);
                    reader.StartCanonicalization(stream, false, null);
                }
                string attribute = reader.GetAttribute(System.ServiceModel.XD.UtilityDictionary.IdAttribute, System.ServiceModel.XD.UtilityDictionary.Namespace);

                reader.ReadStartElement();
                reader.ReadStartElement(System.ServiceModel.XD.UtilityDictionary.CreatedElement, System.ServiceModel.XD.UtilityDictionary.Namespace);
                DateTime creationTimeUtc = reader.ReadContentAsDateTime().ToUniversalTime();

                reader.ReadEndElement();
                if (reader.IsStartElement(System.ServiceModel.XD.UtilityDictionary.ExpiresElement, System.ServiceModel.XD.UtilityDictionary.Namespace))
                {
                    reader.ReadStartElement();
                    maxUtcDateTime = reader.ReadContentAsDateTime().ToUniversalTime();
                    reader.ReadEndElement();
                }
                else
                {
                    maxUtcDateTime = System.ServiceModel.Security.SecurityUtils.MaxUtcDateTime;
                }
                reader.ReadEndElement();
                if (flag)
                {
                    reader.EndCanonicalization();
                    buffer = stream.FlushHashAndGetValue();
                }
                else
                {
                    buffer = null;
                }
                return(new SecurityTimestamp(creationTimeUtc, maxUtcDateTime, attribute, digestAlgorithm, buffer));
            }
        public static LinkItem ReadLinkItem(XmlDictionaryReader reader)
        {
            LinkItem linkItem = new LinkItem();

            if (reader.IsStartElement("Id", ns))
            {
                reader.MoveToContent();
                linkItem.Id = int.Parse(reader.ReadString());
                reader.MoveToContent();
                reader.ReadEndElement();
            }
            else
            {
                throw new XmlException("ExpectedElementMissing: Id element was expected.");
            }

            if (reader.IsStartElement("Title", ns))
            {
                reader.MoveToContent();
                linkItem.Title = reader.ReadString();
                reader.MoveToContent();
                reader.ReadEndElement();
            }
            else
            {
                throw new XmlException("ExpectedElementMissing: Title element was expected.");
            }

            if (reader.IsStartElement("Description", ns))
            {
                reader.MoveToContent();
                linkItem.Description = reader.ReadString();
                reader.MoveToContent();
                reader.ReadEndElement();
            }
            else
            {
                throw new XmlException("ExpectedElementMissing: Description element was expected.");
            }

            if (reader.IsStartElement("DateStart", ns))
            {
                reader.MoveToContent();
                reader.Read();
                linkItem.DateStart = reader.ReadContentAsDateTime();
                reader.MoveToContent();
                reader.ReadEndElement();
            }
            else
            {
                throw new XmlException("ExpectedElementMissing: DateStart element was expected.");
            }

            if (reader.IsStartElement("DateEnd", ns))
            {
                reader.MoveToContent();
                reader.Read();
                linkItem.DateEnd = reader.ReadContentAsDateTime();
                reader.MoveToContent();
                reader.ReadEndElement();
            }
            // optional

            if (reader.IsStartElement("Url", ns))
            {
                reader.MoveToContent();
                linkItem.Url = reader.ReadString();

                reader.MoveToContent();
                reader.ReadEndElement();
            }
            else
            {
                throw new XmlException("ExpectedElementMissing: Url element was expected.");
            }

            return(linkItem);
        }