public static SearchFolder Bind(MailboxSession session, DefaultFolderType defaultFolderType, ICollection <PropertyDefinition> propsToReturn) { EnumValidator.ThrowIfInvalid <DefaultFolderType>(defaultFolderType, "defaultFolderType"); DefaultFolder defaultFolder = session.InternalGetDefaultFolder(defaultFolderType); if (defaultFolder.StoreObjectType != StoreObjectType.OutlookSearchFolder && defaultFolder.StoreObjectType != StoreObjectType.SearchFolder) { throw new ArgumentOutOfRangeException("defaultFolderType"); } StoreObjectId folderId = session.SafeGetDefaultFolderId(defaultFolderType); ObjectNotFoundException ex = null; for (int i = 0; i < 2; i++) { try { return(SearchFolder.Bind(session, folderId, propsToReturn)); } catch (ObjectNotFoundException ex2) { ex = ex2; ExTraceGlobals.StorageTracer.Information <DefaultFolderType>(0L, "SearchFolder::Bind(defaultFolderType): attempting to recreate {0}.", defaultFolderType); if (!session.TryFixDefaultFolderId(defaultFolderType, out folderId)) { throw; } } } throw ex; }
internal StoreObjectId RefreshDefaultFolder(DefaultFolderType defaultFolderType) { DefaultFolder defaultFolder = this.GetDefaultFolder(defaultFolderType); defaultFolder.Refresh(); StoreObjectId result; defaultFolder.TryGetFolderId(out result); return(result); }
internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData) { if (defaultFolderData.FolderId != null) { using (Folder folder = Folder.Bind(defaultFolder.Session, defaultFolderData.FolderId)) { defaultFolder.SetProperties(folder); } } }
public new static OutlookSearchFolder Bind(MailboxSession session, DefaultFolderType defaultFolderType, ICollection <PropertyDefinition> propsToReturn) { EnumValidator.ThrowIfInvalid <DefaultFolderType>(defaultFolderType, "defaultFolderType"); DefaultFolder defaultFolder = session.InternalGetDefaultFolder(defaultFolderType); if (defaultFolder.StoreObjectType != StoreObjectType.OutlookSearchFolder) { throw new ArgumentOutOfRangeException("defaultFolderType"); } return(OutlookSearchFolder.Bind(session, session.SafeGetDefaultFolderId(defaultFolderType), propsToReturn)); }
internal StoreObjectId CreateDefaultSystemFolder() { DefaultFolder defaultFolder = this.GetDefaultFolder(DefaultFolderType.System); defaultFolder.Create(); StoreObjectId result; if (!defaultFolder.TryGetFolderId(out result)) { throw new AccessDeniedException(ServerStrings.DefaultFolderAccessDenied(defaultFolder.ToString())); } return(result); }
internal StoreObjectId CreateDefaultFolder(DefaultFolderType defaultFolderType) { EnumValidator.ThrowIfInvalid <DefaultFolderType>(defaultFolderType, DefaultFolderManager.validFolderTypesForCreateDefaultFolder); DefaultFolder defaultFolder = this.GetDefaultFolder(defaultFolderType); defaultFolder.Create(); StoreObjectId result; if (!defaultFolder.TryGetFolderId(out result)) { throw new AccessDeniedException(ServerStrings.DefaultFolderAccessDenied(defaultFolder.ToString())); } return(result); }
internal StoreObjectId this[DefaultFolderType defaultFolderType] { get { EnumValidator.AssertValid <DefaultFolderType>(defaultFolderType); DefaultFolder defaultFolder = this.defaultFolders[(int)defaultFolderType]; if (defaultFolder != null) { StoreObjectId result; defaultFolder.TryGetFolderId(out result); return(result); } return(null); } }
internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData) { try { defaultFolder.RemoveForRecover(ref defaultFolderData); defaultFolder.CreateInternal(ref defaultFolderData); } catch (StoragePermanentException innerException) { throw new CorruptDataException(ServerStrings.ExCorruptDataRecoverError(defaultFolder.ToString()), innerException); } catch (StorageTransientException innerException2) { throw new CorruptDataException(ServerStrings.ExCorruptDataRecoverError(defaultFolder.ToString()), innerException2); } }
internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData) { if (e is DefaultFolderPropertyValidationException && defaultFolderData.FolderId != null) { using (Folder folder = Folder.Bind(defaultFolder.Session, defaultFolderData.FolderId)) { defaultFolder.SetProperties(folder); } return; } COWSettings cowsettings = new COWSettings(defaultFolder.Session); if (cowsettings.HoldEnabled()) { CorruptDataRecoveryStrategy.Throw.Recover(defaultFolder, e, ref defaultFolderData); return; } CorruptDataRecoveryStrategy.Recreate.Recover(defaultFolder, e, ref defaultFolderData); }
private void VerifyFromFavoriteSendersFolderEntryId(DefaultFolderContext context) { CultureInfo defaultFoldersCulture = context.Session.SharedDataManager.DefaultFoldersCulture; DefaultFolder defaultFolder = this.DefaultFolders[54]; if (defaultFolder == null || defaultFolder.FolderId == null) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug((long)this.GetHashCode(), "DefaultFolderManager::VerifyFromFavoriteSendersFolderEntryId. MyContacts folder information or the folder id is null. Returning."); return; } DefaultFolder defaultFolder2 = this.DefaultFolders[63]; if (defaultFolder2 == null || defaultFolder2.FolderId == null) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug((long)this.GetHashCode(), "DefaultFolderManager::VerifyFromFavoriteSendersFolderEntryId. FromFavoriteSenders folder or the folder id is null. Returning."); return; } if (!defaultFolder.FolderId.Equals(defaultFolder2.FolderId)) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug((long)this.GetHashCode(), "DefaultFolderManager::VerifyFromFavoriteSendersFolderEntryId. FromFavoriteSenders folder id doesn't match MyContacts folder id. Returning."); return; } string localizableDisplayName = DefaultFolderManager.GetLocalizableDisplayName(DefaultFolderType.MyContacts, defaultFoldersCulture); string localizableDisplayName2 = DefaultFolderManager.GetLocalizableDisplayName(DefaultFolderType.FromFavoriteSenders, defaultFoldersCulture); if (localizableDisplayName.Equals(localizableDisplayName2, StringComparison.OrdinalIgnoreCase)) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug <string, CultureInfo>((long)this.GetHashCode(), "DefaultFolderManager::VerifyFromFavoriteSendersFolderEntryId. FromFavoriteSenders display name matches MyContacts display name '{0}' in culture {1}. Returning.", localizableDisplayName, defaultFoldersCulture); return; } ExTraceGlobals.DefaultFoldersTracer.TraceDebug((long)this.GetHashCode(), "DefaultFolderManager::VerifyFromFavoriteSendersFolderEntryId. Deleting and recreating FromFavoriteSenders and MyContacts folders to fix folder id conflict."); defaultFolder.RemoveForRecover(); defaultFolder2.RemoveForRecover(); DefaultFolderType[] foldersToInit = new DefaultFolderType[] { DefaultFolderType.MyContacts, DefaultFolderType.FromFavoriteSenders }; this.CacheDefaultFolders(context, foldersToInit); }
internal bool TryFixDefaultFolderId(DefaultFolderType defaultFolderType, out StoreObjectId id) { EnumValidator.ThrowIfInvalid <DefaultFolderType>(defaultFolderType); DefaultFolder defaultFolder = this.GetDefaultFolder(defaultFolderType); try { defaultFolder.RemoveForRecover(); defaultFolder.Create(); } catch (ObjectNotFoundException) { id = null; return(false); } catch (NotSupportedException) { id = null; return(false); } return(defaultFolder.TryGetFolderId(out id)); }
internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData) { defaultFolder.RemoveForRecover(ref defaultFolderData); }
internal abstract void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData);
internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData) { throw e; }
private bool Initialize(ref DefaultFolderData data) { bool flag = true; Exception ex = null; if (!data.IdInitialized) { DefaultFolderData defaultFolderData = this.InitializeFolderIdPrivate(); if (defaultFolderData != null) { data = defaultFolderData; } } ExTraceGlobals.DefaultFoldersTracer.TraceDebug <DefaultFolder>((long)this.GetHashCode(), "DefaultFolder::Initialize. The default folder is about to be initialized. defaultFolder = {0}.", this); if (this.defaultFolderInfo.DefaultFolderType == DefaultFolderType.None) { if (!data.HasInitialized) { data = new DefaultFolderData(true); } return(true); } try { if (DefaultFolder.TestInjectInitFailure != null) { DefaultFolder.TestInjectInitFailure(this); } bool flag2 = true; if (data.FolderId != null && !this.Validate(data)) { flag2 = false; data = new DefaultFolderData(null, data.IdInitialized, data.HasInitialized); } if (data.FolderId == null && (this.IsOwnerSession || (!flag2 && this.context.Session.Capabilities.MustHideDefaultFolders)) && (this.defaultFolderInfo.Behavior & DefaultFolderBehavior.CreateIfMissing) == DefaultFolderBehavior.CreateIfMissing) { flag = this.CreateInternal(ref data); } if (flag && data.FolderId != null && this.HideUnderNonIpmSubtree) { using (Folder folder = Folder.Bind(this.context.Session, data.FolderId)) { if (!this.IsParentFolderConfigurationFolder(folder)) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug <DefaultFolder>((long)this.GetHashCode(), "DefaultFolder::Initialize. defaultFolder={0} is not under the non-IPM subtree(aka. Configuration folder). Move it to the non-IPM subtree.", this); AggregateOperationResult aggregateOperationResult = this.context.Session.Move(this.context[DefaultFolderType.Configuration], new StoreId[] { data.FolderId }); if (aggregateOperationResult.OperationResult != OperationResult.Succeeded) { LocalizedException exception = aggregateOperationResult.GroupOperationResults[0].Exception; ExTraceGlobals.DefaultFoldersTracer.TraceDebug <DefaultFolder, LocalizedException>((long)this.GetHashCode(), "DefaultFolder::Initialize. Moving defaultFolder={0} to the non-IPM subtree(aka. Configuration folder) fails with exception={1}.", this, exception); if (exception.ErrorCode == -2146233088 && exception is ObjectExistedException) { folder.PropertyBag.Reload(); if (this.IsParentFolderConfigurationFolder(folder)) { ExTraceGlobals.DefaultFoldersTracer.TraceDebug <DefaultFolder>((long)this.GetHashCode(), "DefaultFolder::Initialize. After reloading, defaultFolder={0} is under the non-IPM subtree(aka. Configuration folder).", this); } else { data = new DefaultFolderData(null, data.IdInitialized, data.HasInitialized); flag = false; ExTraceGlobals.DefaultFoldersTracer.TraceError <DefaultFolder>((long)this.GetHashCode(), "DefaultFolder::Initialize. After reloading, defaultFolder={0} is still NOT under the non-IPM subtree(aka. Configuration folder).", this); } } else { data = new DefaultFolderData(null, data.IdInitialized, data.HasInitialized); flag = false; ExTraceGlobals.DefaultFoldersTracer.TraceError <DefaultFolder, LocalizedException>((long)this.GetHashCode(), "DefaultFolder::Initialize. Unable to move defaultFolder={0} to the Configuration node. Exception={1}.", this, exception); } } } } } if (flag && data.FolderId != null && this.context.Session.MailboxOwner.RecipientTypeDetails == RecipientTypeDetails.TeamMailbox && this.IsHiddenTeamMailboxFolder) { using (Folder folder2 = Folder.Bind(this.context.Session, data.FolderId)) { folder2.PropertyBag[FolderSchema.IsHidden] = true; folder2.Save(); } } if (this.CheckShouldRefreshFolderId(data)) { data = this.InitializeFolderIdPrivate(); if (data.FolderId != null) { if (this.Validate(data)) { flag = true; } else { data = new DefaultFolderData(null, data.IdInitialized, data.HasInitialized); } } } } catch (CorruptDataException ex2) { ex = ex2; } this.SetDefaultFolderData(data); if (ex != null) { this.defaultFolderInfo.CorruptDataRecoveryStrategy.Recover(this, ex, ref data); } if (!data.HasInitialized) { data = new DefaultFolderData(data.FolderId, data.IdInitialized, true); this.SetDefaultFolderData(data); } return(flag); }