Beispiel #1
0
        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);
        }
Beispiel #3
0
 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);
         }
     }
 }
Beispiel #4
0
        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);
        }
Beispiel #7
0
 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));
        }
Beispiel #12
0
 internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData)
 {
     defaultFolder.RemoveForRecover(ref defaultFolderData);
 }
Beispiel #13
0
 internal abstract void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData);
Beispiel #14
0
 internal override void Recover(DefaultFolder defaultFolder, Exception e, ref DefaultFolderData defaultFolderData)
 {
     throw e;
 }
Beispiel #15
0
        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);
        }