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); }
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); }
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); }
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)); }
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)); }
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); }
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; }
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); }
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); }
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); }
internal GuidNameKey(NamedProp namedProp) : base(namedProp) { }
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); }