예제 #1
0
 private static NamedPropertyDefinition.NamedPropertyKey[] MapiNamedPropToNamedPropertyKey(NamedProp[] namedProps)
 {
     NamedPropertyDefinition.NamedPropertyKey[] array = new NamedPropertyDefinition.NamedPropertyKey[namedProps.Length];
     for (int i = 0; i < namedProps.Length; i++)
     {
         NamedProp namedProp = namedProps[i];
         if (namedProp == null)
         {
             array[i] = null;
         }
         else
         {
             NamedProp namedProp2 = WellKnownNamedProperties.Find(namedProp);
             if (namedProp2 != null)
             {
                 namedProp = namedProp2;
             }
             else
             {
                 namedProp = NamedPropertyDefinition.NamedPropertyKey.GetSingleton(namedProp);
             }
             if (namedProp.Kind == NamedPropKind.Id)
             {
                 array[i] = new GuidIdPropertyDefinition.GuidIdKey(namedProp);
             }
             else
             {
                 array[i] = new GuidNamePropertyDefinition.GuidNameKey(namedProp);
             }
         }
     }
     return(array);
 }
예제 #2
0
        internal void AddMapping(bool addUnresolvedProperties, ICollection <ushort> propIds, ICollection <NamedProp> namedProps)
        {
            ICollection <NamedProp> collection = NamedPropertyDefinition.NamedPropertyKey.AddNamedProps(namedProps);

            try
            {
                this.lockObject.EnterWriteLock();
                IEnumerator <NamedProp> enumerator  = collection.GetEnumerator();
                IEnumerator <ushort>    enumerator2 = propIds.GetEnumerator();
                while (enumerator2.MoveNext() && enumerator.MoveNext())
                {
                    NamedProp namedProp = enumerator.Current;
                    if (namedProp != null)
                    {
                        ushort num = enumerator2.Current;
                        if ((addUnresolvedProperties || num != 0) && !this.namedPropToPropIdMap.ContainsKey(namedProp))
                        {
                            int num2 = 0;
                            this.namedPropToPropIdMap[namedProp] = num;
                            this.perfCounters.NamedPropertyCacheEntries.Increment();
                            num2++;
                            if (num != 0)
                            {
                                this.propIdToNamedPropMap[num] = namedProp;
                                this.perfCounters.NamedPropertyCacheEntries.Increment();
                                num2++;
                            }
                            lock (this.sizeChangedDelegateLock)
                            {
                                if (this.sizeChangedDelegate != null)
                                {
                                    this.sizeChangedDelegate(num2);
                                }
                                this.size += num2;
                            }
                        }
                    }
                }
            }
            finally
            {
                try
                {
                    this.lockObject.ExitWriteLock();
                }
                catch (SynchronizationLockException)
                {
                }
            }
        }
 internal static NamedProp GetSingleton(NamedProp property)
 {
     try
     {
         NamedPropertyDefinition.NamedPropertyKey.lockObject.EnterReadLock();
         WeakReference weakReference;
         if (NamedPropertyDefinition.NamedPropertyKey.namedProps.TryGetValue(property, out weakReference))
         {
             NamedProp namedProp = (NamedProp)weakReference.Target;
             if (namedProp != null)
             {
                 return(namedProp);
             }
         }
     }
     finally
     {
         try
         {
             NamedPropertyDefinition.NamedPropertyKey.lockObject.ExitReadLock();
         }
         catch (SynchronizationLockException)
         {
         }
     }
     try
     {
         NamedPropertyDefinition.NamedPropertyKey.lockObject.EnterWriteLock();
         if (NamedPropertyDefinition.NamedPropertyKey.namedProps.ContainsKey(property))
         {
             NamedPropertyDefinition.NamedPropertyKey.namedProps[property] = new WeakReference(property);
         }
         else
         {
             NamedPropertyDefinition.NamedPropertyKey.namedProps.Add(new NamedProp(property), new WeakReference(property));
         }
     }
     finally
     {
         try
         {
             NamedPropertyDefinition.NamedPropertyKey.lockObject.ExitWriteLock();
         }
         catch (SynchronizationLockException)
         {
         }
     }
     return(property);
 }
예제 #4
0
        public static NamedProp[] GetNamedPropsFromIds(StoreSession session, MapiProp mapiProp, ICollection <ushort> propIds)
        {
            int count = propIds.Count;

            NamedProp[]   array   = new NamedProp[count];
            List <ushort> list    = new List <ushort>();
            List <int>    list2   = new List <int>();
            NamedPropMap  mapping = NamedPropMapCache.Default.GetMapping(session);
            int           num     = 0;

            foreach (ushort num2 in propIds)
            {
                if (num2 < 32768)
                {
                    throw new ArgumentOutOfRangeException(string.Format("PropId is not in the range of named props.  PropId = 0x{0:x}.", num2));
                }
                NamedProp namedProp = null;
                if (mapping != null && mapping.TryGetNamedPropFromPropId(num2, out namedProp))
                {
                    array[num] = namedProp;
                }
                else
                {
                    list.Add(num2);
                    list2.Add(num);
                }
                num++;
            }
            int num3 = 0;

            while (list.Count > 0)
            {
                int           count2 = Math.Min(list.Count, 256);
                List <ushort> range  = list.GetRange(0, count2);
                NamedProp[]   array2 = NamedPropConverter.MapiGetNamesFromIds(session, mapiProp, range);
                if (mapping != null)
                {
                    mapping.AddMapping(false, range, array2);
                }
                for (int i = 0; i < array2.Length; i++)
                {
                    int num4 = list2[i + num3 * 256];
                    array[num4] = array2[i];
                }
                list.RemoveRange(0, count2);
                num3++;
            }
            return(array);
        }
예제 #5
0
        internal static GuidIdPropertyDefinition InternalCreate(string displayName, Type propertyType, PropType mapiPropType, Guid propertyGuid, int dispId, PropertyFlags flags, NativeStorePropertyDefinition.TypeCheckingFlag typeCheckingFlag, bool isCustom, params PropertyDefinitionConstraint[] constraints)
        {
            if (mapiPropType == PropType.AnsiString)
            {
                mapiPropType = PropType.String;
                propertyType = typeof(string);
            }
            else if (mapiPropType == PropType.AnsiStringArray)
            {
                mapiPropType = PropType.StringArray;
                propertyType = typeof(string[]);
            }
            NamedProp namedProp  = new NamedProp(propertyGuid, dispId);
            NamedProp namedProp2 = WellKnownNamedProperties.Find(namedProp);

            if (namedProp2 != null)
            {
                namedProp = namedProp2;
            }
            else
            {
                namedProp = NamedPropertyDefinition.NamedPropertyKey.GetSingleton(namedProp);
            }
            GuidIdPropertyDefinition.GuidIdKey guidIdKey = new GuidIdPropertyDefinition.GuidIdKey(namedProp);
            bool flag;

            if (propertyGuid == WellKnownPropertySet.InternetHeaders)
            {
                NativeStorePropertyDefinition.OnFailedPropertyTypeCheck(guidIdKey, mapiPropType, typeCheckingFlag, out flag);
                return(null);
            }
            GuidIdPropertyDefinition result;

            if (GuidIdPropertyDefinition.TryFindEquivalentDefinition(guidIdKey, isCustom, mapiPropType, typeCheckingFlag, out result, out flag))
            {
                return(result);
            }
            if (!flag)
            {
                return(null);
            }
            return(new GuidIdPropertyDefinition(displayName, propertyType, mapiPropType, guidIdKey, flags, isCustom, constraints));
        }
예제 #6
0
        internal static GuidNamePropertyDefinition InternalCreate(string displayName, Type propertyType, PropType mapiPropType, Guid propertyGuid, string propertyName, PropertyFlags flags, NativeStorePropertyDefinition.TypeCheckingFlag typeCheckingFlag, bool isCustom, params PropertyDefinitionConstraint[] constraints)
        {
            if (!GuidNamePropertyDefinition.IsValidName(propertyGuid, propertyName))
            {
                throw new ArgumentException("Invalid property name for property", "propertyName");
            }
            if (mapiPropType == PropType.AnsiString)
            {
                mapiPropType = PropType.String;
                propertyType = typeof(string);
            }
            else if (mapiPropType == PropType.AnsiStringArray)
            {
                mapiPropType = PropType.StringArray;
                propertyType = typeof(string[]);
            }
            NamedProp namedProp  = new NamedProp(propertyGuid, propertyName);
            NamedProp namedProp2 = WellKnownNamedProperties.Find(namedProp);

            if (namedProp2 != null)
            {
                namedProp = namedProp2;
            }
            else
            {
                namedProp = NamedPropertyDefinition.NamedPropertyKey.GetSingleton(namedProp);
            }
            GuidNamePropertyDefinition.GuidNameKey guidNameKey = new GuidNamePropertyDefinition.GuidNameKey(namedProp);
            GuidNamePropertyDefinition             result;
            bool flag;

            if (GuidNamePropertyDefinition.TryFindEquivalentDefinition(guidNameKey, isCustom, mapiPropType, typeCheckingFlag, out result, out flag))
            {
                return(result);
            }
            if (!flag)
            {
                return(null);
            }
            return(new GuidNamePropertyDefinition(displayName, propertyType, mapiPropType, guidNameKey, flags, isCustom, constraints));
        }
예제 #7
0
        internal bool TryGetNamedPropFromPropId(ushort propId, out NamedProp namedProp)
        {
            bool result;

            try
            {
                this.lockObject.EnterReadLock();
                result = this.propIdToNamedPropMap.TryGetValue(propId, out namedProp);
            }
            finally
            {
                try
                {
                    this.lockObject.ExitReadLock();
                }
                catch (SynchronizationLockException)
                {
                }
            }
            return(result);
        }
예제 #8
0
        private RequestJobNamedPropertySet(MapiStore systemMailbox)
        {
            NamedProp[] array = new NamedProp[26];
            int         num   = 0;

            foreach (NamedPropertyData namedPropertyData in RequestJobNamedPropertySet.npData)
            {
                array[num] = new NamedProp(namedPropertyData.NPGuid, namedPropertyData.NPName);
                num++;
            }
            PropTag[] idsFromNames = systemMailbox.GetIDsFromNames(true, array);
            this.PropTags = new PropTag[28];
            num           = 0;
            foreach (NamedPropertyData namedPropertyData2 in RequestJobNamedPropertySet.npData)
            {
                this.PropTags[num] = PropTagHelper.PropTagFromIdAndType(idsFromNames[num].Id(), namedPropertyData2.NPType);
                num++;
            }
            this.PropTags[26] = PropTag.ReplyTemplateID;
            this.PropTags[27] = PropTag.EntryId;
        }
예제 #9
0
        internal bool TryGetPropIdFromNamedProp(NamedProp namedProp, out ushort propId)
        {
            bool result;

            try
            {
                this.lockObject.EnterReadLock();
                result = this.namedPropToPropIdMap.TryGetValue(namedProp, out propId);
            }
            finally
            {
                try
                {
                    this.lockObject.ExitReadLock();
                }
                catch (SynchronizationLockException)
                {
                }
            }
            return(result);
        }
예제 #10
0
        private static NativeStorePropertyDefinition GetPropDefByMapiNamedProp(NamedProp prop, PropType type, NativeStorePropertyDefinition.TypeCheckingFlag propertyTypeCheckingFlag)
        {
            if (prop == null)
            {
                return(null);
            }
            switch (prop.Kind)
            {
            case NamedPropKind.Id:
                return(GuidIdPropertyDefinition.InternalCreateCustom(string.Empty, type, prop.Guid, prop.Id, PropertyFlags.None, propertyTypeCheckingFlag, new PropertyDefinitionConstraint[0]));

            case NamedPropKind.String:
                if (GuidNamePropertyDefinition.IsValidName(prop.Guid, prop.Name))
                {
                    return(GuidNamePropertyDefinition.InternalCreate(string.Empty, InternalSchema.ClrTypeFromPropTagType(type), type, prop.Guid, prop.Name, PropertyFlags.None, propertyTypeCheckingFlag, true, PropertyDefinitionConstraint.None));
                }
                return(null);

            default:
                throw new ArgumentOutOfRangeException("prop.Kind");
            }
        }
            private PropTag GetPropertyTagFromNamedProperty(NamedPropertyDefinition propertyDefinition)
            {
                NamedProp    namedProp        = propertyDefinition.GetKey().NamedProp;
                NamedPropMap namedPropertyMap = this.parent.NamedPropertyMap;
                ushort       num;

                if (!namedPropertyMap.TryGetPropIdFromNamedProp(namedProp, out num) && (!this.parent.ResolveAllNamedProperties(this.currentIndex) || !namedPropertyMap.TryGetPropIdFromNamedProp(namedProp, out num)))
                {
                    num = 0;
                }
                if (num != 0)
                {
                    return(PropTagHelper.PropTagFromIdAndType((int)num, propertyDefinition.MapiPropertyType));
                }
                if (!this.parent.storeSession.Capabilities.IsReadOnly && (!this.parent.allowUnresolvedHeaders || namedProp.Guid != WellKnownPropertySet.InternetHeaders || (namedProp.Guid == WellKnownPropertySet.InternetHeaders && PropertyDefinitionToPropTagCollection.PromotableInternetHeaders.Contains(namedProp.Name))))
                {
                    LocalizedString localizedString = ServerStrings.ExInvalidNamedProperty(propertyDefinition.ToString());
                    ExTraceGlobals.StorageTracer.TraceError(0L, localizedString);
                    throw new StoragePermanentException(localizedString);
                }
                return(PropTag.Unresolved);
            }
        internal static PropTag GetNeverClutterTag(object mapiThis, StoreSession session)
        {
            PropertyDefinition inferenceNeverClutterOverrideApplied = ItemSchema.InferenceNeverClutterOverrideApplied;
            NamedProp          namedProp  = new NamedProp(WellKnownPropertySet.Inference, inferenceNeverClutterOverrideApplied.Name);
            NamedProp          namedProp2 = WellKnownNamedProperties.Find(namedProp);
            NamedProp          namedProp3 = namedProp2 ?? namedProp;

            NamedProp[] np = new NamedProp[]
            {
                namedProp3
            };
            PropTag[] array = null;
            bool      flag  = false;

            try
            {
                if (session != null)
                {
                    session.BeginMapiCall();
                    session.BeginServerHealthCall();
                    flag = true;
                }
                if (StorageGlobals.MapiTestHookBeforeCall != null)
                {
                    StorageGlobals.MapiTestHookBeforeCall(MethodBase.GetCurrentMethod());
                }
                array = session.Mailbox.MapiStore.GetIDsFromNames(true, np);
            }
            catch (MapiPermanentException ex)
            {
                throw StorageGlobals.TranslateMapiException(ServerStrings.MapiRulesError, ex, session, mapiThis, "{0}. MapiException = {1}.", new object[]
                {
                    string.Format("ClutterOverrideManager::GetNeverClutterTag", new object[0]),
                    ex
                });
            }
            catch (MapiRetryableException ex2)
            {
                throw StorageGlobals.TranslateMapiException(ServerStrings.MapiRulesError, ex2, session, mapiThis, "{0}. MapiException = {1}.", new object[]
                {
                    string.Format("ClutterOverrideManager::GetNeverClutterTag", new object[0]),
                    ex2
                });
            }
            finally
            {
                try
                {
                    if (session != null)
                    {
                        session.EndMapiCall();
                        if (flag)
                        {
                            session.EndServerHealthCall();
                        }
                    }
                }
                finally
                {
                    if (StorageGlobals.MapiTestHookAfterCall != null)
                    {
                        StorageGlobals.MapiTestHookAfterCall(MethodBase.GetCurrentMethod());
                    }
                }
            }
            return((array.Length > 0) ? (array[0] | (PropTag)11U) : PropTag.Null);
        }
예제 #13
0
 public static bool IsValidName(Guid propertyNamespace, string propertyName)
 {
     return(!string.IsNullOrEmpty(propertyName) && (!(propertyNamespace == WellKnownNamedPropertyGuid.InternetHeaders) || NamedProp.IsValidInternetHeadersName(propertyName)) && propertyName.Length <= StorageLimits.Instance.NamedPropertyNameMaximumLength);
 }
 protected NamedPropertyKey(NamedProp namedProp)
 {
     this.namedProp = namedProp;
 }
            internal static ICollection <NamedProp> AddNamedProps(ICollection <NamedProp> props)
            {
                NamedProp[]             array      = new NamedProp[props.Count];
                int                     num        = 0;
                IEnumerator <NamedProp> enumerator = props.GetEnumerator();

                try
                {
                    NamedPropertyDefinition.NamedPropertyKey.lockObject.EnterReadLock();
                    while (enumerator.MoveNext())
                    {
                        NamedProp namedProp = enumerator.Current;
                        if (namedProp == null || namedProp.IsSingleInstanced)
                        {
                            array[num++] = namedProp;
                        }
                        else
                        {
                            WeakReference weakReference;
                            if (!NamedPropertyDefinition.NamedPropertyKey.namedProps.TryGetValue(namedProp, out weakReference))
                            {
                                break;
                            }
                            NamedProp namedProp2 = (NamedProp)weakReference.Target;
                            if (namedProp2 == null)
                            {
                                break;
                            }
                            array[num++] = namedProp2;
                        }
                    }
                }
                finally
                {
                    try
                    {
                        NamedPropertyDefinition.NamedPropertyKey.lockObject.ExitReadLock();
                    }
                    catch (SynchronizationLockException)
                    {
                    }
                }
                if (num == props.Count)
                {
                    return(array);
                }
                try
                {
                    NamedPropertyDefinition.NamedPropertyKey.lockObject.EnterWriteLock();
                    do
                    {
                        NamedProp     namedProp3 = enumerator.Current;
                        WeakReference weakReference;
                        if (namedProp3 == null || namedProp3.IsSingleInstanced)
                        {
                            array[num++] = namedProp3;
                        }
                        else if (NamedPropertyDefinition.NamedPropertyKey.namedProps.TryGetValue(namedProp3, out weakReference))
                        {
                            NamedProp namedProp4 = (NamedProp)weakReference.Target;
                            if (namedProp4 != null)
                            {
                                array[num++] = namedProp4;
                            }
                            else
                            {
                                NamedPropertyDefinition.NamedPropertyKey.namedProps[namedProp3] = new WeakReference(namedProp3);
                                array[num++] = namedProp3;
                            }
                        }
                        else
                        {
                            NamedPropertyDefinition.NamedPropertyKey.namedProps.Add(new NamedProp(namedProp3), new WeakReference(namedProp3));
                            array[num++] = namedProp3;
                        }
                    }while (enumerator.MoveNext());
                }
                finally
                {
                    try
                    {
                        NamedPropertyDefinition.NamedPropertyKey.lockObject.ExitWriteLock();
                    }
                    catch (SynchronizationLockException)
                    {
                    }
                }
                return(array);
            }
예제 #16
0
 internal GuidNameKey(NamedProp namedProp) : base(namedProp)
 {
 }
예제 #17
0
        internal static ushort[] GetIdsFromNamedProps(StoreSession session, MapiProp mapiProp, bool createNamedProperties, List <NamedProp> namedProps)
        {
            int count = namedProps.Count;

            ushort[]         array   = new ushort[count];
            List <NamedProp> list    = new List <NamedProp>(count);
            List <NamedProp> list2   = new List <NamedProp>(count);
            List <int>       list3   = new List <int>(count);
            List <int>       list4   = new List <int>(count);
            NamedPropMap     mapping = NamedPropMapCache.Default.GetMapping(session);

            for (int i = 0; i < count; i++)
            {
                NamedProp namedProp = namedProps[i];
                bool      flag      = false;
                ushort    num;
                if (mapping != null && mapping.TryGetPropIdFromNamedProp(namedProp, out num))
                {
                    array[i] = num;
                    flag     = true;
                }
                if (!flag)
                {
                    if (namedProp.Guid == WellKnownPropertySet.InternetHeaders)
                    {
                        list2.Add(namedProp);
                        list4.Add(i);
                    }
                    else
                    {
                        list.Add(namedProp);
                        list3.Add(i);
                    }
                }
            }
            list.AddRange(list2);
            list3.AddRange(list4);
            if (list.Count > 0)
            {
                PropTag[] array2 = NamedPropConverter.MapiGetIdsFromNames(session, mapiProp, createNamedProperties, list);
                ushort[]  array3 = new ushort[array2.Length];
                for (int j = 0; j < array2.Length; j++)
                {
                    PropTag propTag = array2[j];
                    if (propTag == PropTag.Unresolved)
                    {
                        array3[j] = 0;
                    }
                    else
                    {
                        array3[j] = (ushort)propTag.Id();
                    }
                }
                if (mapping != null)
                {
                    mapping.AddMapping(createNamedProperties, array3, list);
                }
                for (int k = 0; k < array3.Length; k++)
                {
                    array[list3[k]] = array3[k];
                }
            }
            return(array);
        }
        private bool ResolveAllNamedProperties(int startFrom)
        {
            if (this.resolved)
            {
                return(false);
            }
            this.resolved = true;
            NamedPropMap namedPropMap = this.NamedPropertyMap;
            IEnumerator <NativeStorePropertyDefinition> enumerator = this.properties.GetEnumerator();

            for (int i = 0; i < startFrom - 1; i++)
            {
                enumerator.MoveNext();
            }
            List <NamedProp> list  = null;
            List <NamedProp> list2 = null;

            while (enumerator.MoveNext())
            {
                NativeStorePropertyDefinition nativeStorePropertyDefinition = enumerator.Current;
                if (nativeStorePropertyDefinition.SpecifiedWith != PropertyTypeSpecifier.PropertyTag)
                {
                    NamedProp namedProp = ((NamedPropertyDefinition)nativeStorePropertyDefinition).GetKey().NamedProp;
                    ushort    num;
                    if (!namedPropMap.TryGetPropIdFromNamedProp(namedProp, out num))
                    {
                        if (namedProp.Guid == WellKnownPropertySet.InternetHeaders && !PropertyDefinitionToPropTagCollection.PromotableInternetHeaders.Contains(namedProp.Name))
                        {
                            if (list2 == null)
                            {
                                list2 = new List <NamedProp>(20);
                            }
                            list2.Add(namedProp);
                        }
                        else
                        {
                            if (list == null)
                            {
                                list = new List <NamedProp>(20);
                            }
                            list.Add(namedProp);
                        }
                    }
                }
            }
            if (this.allowCreate == this.allowCreateHeaders && list2 != null)
            {
                if (list == null)
                {
                    list = list2;
                }
                else
                {
                    list.AddRange(list2);
                }
                list2 = null;
            }
            this.GetIdsFromNamedPropsWithRetry(this.allowCreate, list);
            this.GetIdsFromNamedPropsWithRetry(this.allowCreateHeaders, list2);
            return(true);
        }