/// <summary>
        /// Parse the AddressBookPropertyRow structure.
        /// </summary>
        /// <param name="s">An stream containing AddressBookPropertyRow structure.</param>
        public override void Parse(Stream s)
        {
            base.Parse(s);
            this.Flags = ReadByte();

            List<object> result = new List<object>();

            if (largePropTagArray is LargePropertyTagArray)
            {
                foreach (var propTag in largePropTagArray.PropertyTags)
                {
                    object addrRowValue = null;
                    if (this.Flags == 0x00)
                    {
                        if (propTag.PropertyType != PropertyDataType.PtypUnspecified)
                        {
                            AddressBookPropertyValue propValue = new AddressBookPropertyValue(propTag.PropertyType, this.ptypMultiCountSize);
                            propValue.Parse(s);
                            addrRowValue = propValue;
                        }
                        else
                        {
                            AddressBookTypedPropertyValue typePropValue = new AddressBookTypedPropertyValue();
                            typePropValue.Parse(s);
                            addrRowValue = typePropValue;
                        }
                    }
                    else if (this.Flags == 0x01)
                    {
                        if (propTag.PropertyType != PropertyDataType.PtypUnspecified)
                        {
                            AddressBookFlaggedPropertyValue flagPropValue = new AddressBookFlaggedPropertyValue(propTag.PropertyType);
                            flagPropValue.Parse(s);
                            addrRowValue = flagPropValue;
                        }
                        else
                        {
                            AddressBookFlaggedPropertyValueWithType flagPropValue = new AddressBookFlaggedPropertyValueWithType();
                            flagPropValue.Parse(s);
                            addrRowValue = flagPropValue;
                        }
                    }

                    result.Add(addrRowValue);
                }
            }

            this.ValueArray = result.ToArray();
        }
 /// <summary>
 /// Parse the AddressBookTypedPropertyValue structure.
 /// </summary>
 /// <param name="s">An stream containing AddressBookTypedPropertyValue structure.</param>
 public override void Parse(Stream s)
 {
     base.Parse(s);
     this.PropertyType = (PropertyDataType)ReadUshort();
     AddressBookPropertyValue addressBookPropValue = new AddressBookPropertyValue(this.PropertyType);
     addressBookPropValue.Parse(s);
     this.PropertyValue = addressBookPropValue;
 }
 /// <summary>
 /// Parse the AddressBookFlaggedPropertyValueWithType structure.
 /// </summary>
 /// <param name="s">An stream containing AddressBookFlaggedPropertyValueWithType structure.</param>
 public override void Parse(Stream s)
 {
     base.Parse(s);
     this.PropertyType = (PropertyDataType)ReadUshort();
     this.Flag = ReadByte();
     if (this.Flag != 0x01)
     {
         if (this.Flag == 0x00)
         {
             AddressBookPropertyValue addressPropValue = new AddressBookPropertyValue(PropertyType);
             addressPropValue.Parse(s);
             this.PropertyValue = addressPropValue;
         }
         else if (this.Flag == 0x0A)
         {
             AddressBookPropertyValue addressPropValueForErrorCode = new AddressBookPropertyValue(PropertyDataType.PtypErrorCode);
             addressPropValueForErrorCode.Parse(s);
             this.PropertyValue = addressPropValueForErrorCode;
         }
     }
 }