public static object Extract(PropValue value, MapiPropertyDefinition propertyDefinition)
        {
            bool isReadOnly     = propertyDefinition.IsReadOnly;
            Type type           = propertyDefinition.Type;
            Type underlyingType = Nullable.GetUnderlyingType(type);

            if (null != underlyingType)
            {
                type = underlyingType;
            }
            if (propertyDefinition.PropertyTag.Id() != value.PropTag.Id())
            {
                throw MapiPropValueConvertor.ConstructExtractingException(value, propertyDefinition, Strings.ExceptionUnmatchedPropTag(propertyDefinition.PropertyTag.ToString(), value.PropTag.ToString()));
            }
            if (PropType.Binary == value.PropType)
            {
                if (typeof(Guid) == type)
                {
                    return(new Guid(value.GetBytes()));
                }
                if (typeof(Schedule) == type)
                {
                    return(Schedule.FromByteArray(value.GetBytes()));
                }
                if (typeof(MapiEntryId) == type)
                {
                    return(new MapiEntryId(value.GetBytes()));
                }
            }
            if (typeof(short) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <short>(isReadOnly, propertyDefinition, value.GetShortArray()));
                }
                return(value.GetShort());
            }
            else if (typeof(int) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <int>(isReadOnly, propertyDefinition, value.GetIntArray()));
                }
                return(value.GetInt());
            }
            else if (typeof(long) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <long>(isReadOnly, propertyDefinition, value.GetLongArray()));
                }
                return(value.GetLong());
            }
            else if (typeof(float) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <float>(isReadOnly, propertyDefinition, value.GetFloatArray()));
                }
                return(value.GetFloat());
            }
            else if (typeof(double) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <double>(isReadOnly, propertyDefinition, value.GetDoubleArray()));
                }
                return(value.GetDouble());
            }
            else if (typeof(DateTime) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    DateTime[]      dateTimeArray = value.GetDateTimeArray();
                    List <DateTime> list          = new List <DateTime>(dateTimeArray.Length);
                    foreach (DateTime dateTime in dateTimeArray)
                    {
                        list.Add(dateTime.ToLocalTime());
                    }
                    return(new MultiValuedProperty <DateTime>(isReadOnly, propertyDefinition, list.ToArray()));
                }
                return(value.GetDateTime().ToLocalTime());
            }
            else if (typeof(bool) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <bool>(isReadOnly, propertyDefinition, value.GetBoolArray()));
                }
                return(value.GetBoolean());
            }
            else if (typeof(string) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <string>(isReadOnly, propertyDefinition, value.GetStringArray()));
                }
                return(value.GetString());
            }
            else if (typeof(Guid) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <Guid>(isReadOnly, propertyDefinition, value.GetGuidArray()));
                }
                return(value.GetGuid());
            }
            else if (typeof(byte[]) == type)
            {
                if (propertyDefinition.IsMultivalued)
                {
                    return(new MultiValuedProperty <byte[]>(isReadOnly, propertyDefinition, value.GetBytesArray()));
                }
                return(value.GetBytes());
            }
            else
            {
                if (typeof(short[]) == type)
                {
                    return(value.GetShortArray());
                }
                if (typeof(int[]) == type)
                {
                    return(value.GetIntArray());
                }
                if (typeof(long[]) == type)
                {
                    return(value.GetLongArray());
                }
                if (typeof(float[]) == type)
                {
                    return(value.GetFloatArray());
                }
                if (typeof(double[]) == type)
                {
                    return(value.GetDoubleArray());
                }
                if (typeof(DateTime[]) == type)
                {
                    DateTime[]      dateTimeArray2 = value.GetDateTimeArray();
                    List <DateTime> list2          = new List <DateTime>(dateTimeArray2.Length);
                    foreach (DateTime dateTime2 in dateTimeArray2)
                    {
                        list2.Add(dateTime2.ToLocalTime());
                    }
                    return(list2.ToArray());
                }
                if (typeof(bool[]) == type)
                {
                    return(value.GetBoolArray());
                }
                if (typeof(string[]) == type)
                {
                    return(value.GetStringArray());
                }
                if (typeof(Guid[]) == type)
                {
                    return(value.GetGuidArray());
                }
                if (typeof(byte[][]) == type)
                {
                    return(value.GetBytesArray());
                }
                if (type.IsAssignableFrom(MapiPropValueConvertor.TypeFromPropType(value.PropType, false)))
                {
                    return(value.RawValue);
                }
                object result = null;
                if (MapiPropValueConvertor.TryCastValueToExtract(value, type, out result))
                {
                    return(result);
                }
                throw MapiPropValueConvertor.ConstructExtractingException(value, propertyDefinition, Strings.ConstantNa);
            }
        }
Beispiel #2
0
            // Token: 0x0600135F RID: 4959 RVA: 0x00070F58 File Offset: 0x0006F158
            protected object SortValues(PropValue propValue)
            {
                object value;

                try
                {
                    PropType propType = propValue.PropType;
                    if (propType <= PropType.LongArray)
                    {
                        switch (propType)
                        {
                        case PropType.ShortArray:
                        {
                            short[] shortArray = propValue.GetShortArray();
                            if (shortArray != null)
                            {
                                Array.Sort <short>(shortArray);
                                return(shortArray);
                            }
                            return(propValue.Value);
                        }

                        case PropType.IntArray:
                        {
                            int[] intArray = propValue.GetIntArray();
                            if (intArray != null)
                            {
                                Array.Sort <int>(intArray);
                                return(intArray);
                            }
                            return(propValue.Value);
                        }

                        case PropType.FloatArray:
                        {
                            float[] floatArray = propValue.GetFloatArray();
                            if (floatArray != null)
                            {
                                Array.Sort <float>(floatArray);
                                return(floatArray);
                            }
                            return(propValue.Value);
                        }

                        case PropType.DoubleArray:
                        {
                            double[] doubleArray = propValue.GetDoubleArray();
                            if (doubleArray != null)
                            {
                                Array.Sort <double>(doubleArray);
                                return(doubleArray);
                            }
                            return(propValue.Value);
                        }

                        default:
                            if (propType == PropType.LongArray)
                            {
                                long[] longArray = propValue.GetLongArray();
                                if (longArray != null)
                                {
                                    Array.Sort <long>(longArray);
                                    return(longArray);
                                }
                                return(propValue.Value);
                            }
                            break;
                        }
                    }
                    else
                    {
                        switch (propType)
                        {
                        case PropType.AnsiStringArray:
                        case PropType.StringArray:
                        {
                            string[] stringArray = propValue.GetStringArray();
                            if (stringArray != null)
                            {
                                Array.Sort <string>(stringArray);
                                return(stringArray);
                            }
                            return(propValue.Value);
                        }

                        default:
                            if (propType != PropType.GuidArray)
                            {
                                if (propType == PropType.BinaryArray)
                                {
                                    byte[][] bytesArray = propValue.GetBytesArray();
                                    if (bytesArray != null)
                                    {
                                        Array.Sort <byte[]>(bytesArray, ArrayComparer <byte> .Comparer);
                                        return(bytesArray);
                                    }
                                    return(propValue.Value);
                                }
                            }
                            else
                            {
                                Guid[] guidArray = propValue.GetGuidArray();
                                if (guidArray != null)
                                {
                                    Array.Sort <Guid>(guidArray);
                                    return(guidArray);
                                }
                                return(propValue.Value);
                            }
                            break;
                        }
                    }
                    OABLogger.LogRecord(TraceType.ErrorTrace, "MultivaluedProperty.SortValues: don't know how to deal with type {0}", new object[]
                    {
                        propValue.PropType
                    });
                    value = propValue.Value;
                }
                catch (InvalidCastException)
                {
                    OABLogger.LogRecord(TraceType.ErrorTrace, "MultivaluedProperty.SortValues: InvalidCastException while handling property {0} of stated type {1}", new object[]
                    {
                        this.propertyDefinition.Name,
                        propValue.PropType
                    });
                    value = propValue.Value;
                }
                return(value);
            }