List <FolderRec> IMailbox.EnumerateFolderHierarchy(EnumerateFolderHierarchyFlags flags, PropTag[] additionalPtagsToLoad) { MrsTracer.Provider.Function("StorageMailbox.EnumerateFolderHierarchy({0})", new object[] { flags }); base.VerifyMailboxConnection(VerifyMailboxConnectionFlags.None); List <FolderRec> list = new List <FolderRec>(50); using (base.RHTracker.Start()) { bool flag = flags.HasFlag(EnumerateFolderHierarchyFlags.WellKnownPublicFoldersOnly); NativeStorePropertyDefinition[] propertiesToLoad; if (additionalPtagsToLoad == null || additionalPtagsToLoad.Length == 0) { propertiesToLoad = this.FolderPropertyDefinitionsToLoad; } else { List <NativeStorePropertyDefinition> list2 = new List <NativeStorePropertyDefinition>(); list2.AddRange(this.ConvertPropTagsToDefinitions(additionalPtagsToLoad)); list2.AddRange(this.FolderPropertyDefinitionsToLoad); propertiesToLoad = list2.ToArray(); } if (!flag) { this.LoadFolderHierarchy(this.GetFolderId(null), propertiesToLoad, list); } else { PublicFolderSession publicFolderSession = this.GetPublicFolderSession(); list.Add(this.GetFolderRec(this.GetFolderId(null), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetIpmSubtreeFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetNonIpmSubtreeFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetEFormsRegistryFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetAsyncDeleteStateFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetDumpsterRootFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetInternalSubmissionFolderId(), propertiesToLoad)); list.Add(this.GetFolderRec(publicFolderSession.GetTombstonesRootFolderId(), propertiesToLoad)); } } MrsTracer.Provider.Debug("Loaded {0} folders", new object[] { list.Count }); return(list); }
private static PublicFolderMailboxMonitoringInfo LoadMailboxInfo <TValue>(PublicFolderSession session, string stateInfoConfigurationName, string logInfoConfigurationName) where TValue : PublicFolderMailboxMonitoringInfo, new() { TValue tvalue = Activator.CreateInstance <TValue>(); using (Folder folder = Folder.Bind(session, session.GetTombstonesRootFolderId())) { using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName(stateInfoConfigurationName, ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary)) { tvalue.LastAttemptedSyncTime = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastAttemptedSyncTime") as ExDateTime?); tvalue.LastFailedSyncTime = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastFailedSyncTime") as ExDateTime?); tvalue.LastSuccessfulSyncTime = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastSuccessfulSyncTime") as ExDateTime?); tvalue.LastSyncFailure = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "LastSyncFailure") as string); tvalue.NumberofAttemptsAfterLastSuccess = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberofAttemptsAfterLastSuccess") as int?); tvalue.FirstFailedSyncTimeAfterLastSuccess = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "FirstFailedSyncTimeAfterLastSuccess") as ExDateTime?); PublicFolderMailboxSynchronizerInfo publicFolderMailboxSynchronizerInfo = tvalue as PublicFolderMailboxSynchronizerInfo; if (publicFolderMailboxSynchronizerInfo != null) { publicFolderMailboxSynchronizerInfo.NumberOfBatchesExecuted = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfBatchesExecuted") as int?); publicFolderMailboxSynchronizerInfo.NumberOfFoldersToBeSynced = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfFoldersToBeSynced") as int?); publicFolderMailboxSynchronizerInfo.NumberOfFoldersSynced = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "NumberOfFoldersSynced") as int?); publicFolderMailboxSynchronizerInfo.BatchSize = (PublicFolderMailboxDiagnosticsInfo.GetMetadataValue(configuration, "BatchSize") as int?); } } using (UserConfiguration configuration2 = UserConfiguration.GetConfiguration(folder, new UserConfigurationName(logInfoConfigurationName, ConfigurationNameKind.Name), UserConfigurationTypes.Stream)) { using (Stream stream = configuration2.GetStream()) { using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress, true)) { using (MemoryStream memoryStream = new MemoryStream()) { gzipStream.CopyTo(memoryStream); tvalue.LastSyncCycleLog = Encoding.ASCII.GetString(memoryStream.ToArray()); } } } } } return(tvalue); }
// Token: 0x06000F1B RID: 3867 RVA: 0x0005A338 File Offset: 0x00058538 public static bool IsSyncRequired(Guid mailboxGuid, OrganizationId organizationId, out bool isLongRunningOp, IXSOFactory xsoFactory, IPublicFolderMailboxLoggerBase logger) { isLongRunningOp = false; bool flag = true; using (PublicFolderSession publicFolderSession = PublicFolderSession.OpenAsAdmin(organizationId, null, mailboxGuid, null, CultureInfo.CurrentCulture, string.Format("{0};Action={1}", "Client=TBA", "PublicFolderSplitHelper"), null)) { using (Folder folder = xsoFactory.BindToFolder(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId()) as Folder) { using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName("PublicFolderSyncInfo", ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary)) { IDictionary dictionary = configuration.GetDictionary(); int? num = dictionary.Contains("NumberOfFoldersToBeSynced") ? ((int?)dictionary["NumberOfFoldersToBeSynced"]) : null; int? num2 = dictionary.Contains("NumberOfFoldersSynced") ? ((int?)dictionary["NumberOfFoldersSynced"]) : null; int? num3 = (num == null) ? null : (num - (num2 ?? 0)); flag = (num3 == null || num3 > 0); isLongRunningOp = (flag && (num3 == null || num3 > PublicFolderSplitConfig.Instance.LongRunningSyncChangeCount)); logger.LogEvent(LogEventType.Statistics, string.Format("PublicFolderSplitHelper::IsSyncRequired - FTBS={0},FS={1},FTBSN={2}", num, num2, num3)); } } } return(flag); }
protected override void InternalProcessRecord() { TaskLogger.LogEnter(); try { ADUser aduser = this.DataObject as ADUser; if (aduser == null || aduser.RecipientTypeDetails != RecipientTypeDetails.PublicFolderMailbox) { base.WriteError(new ObjectNotFoundException(Strings.PublicFolderMailboxNotFound), ExchangeErrorCategory.Client, aduser); } ExchangePrincipal exchangePrincipal = ExchangePrincipal.FromADUser(base.SessionSettings, aduser); string serverFqdn = exchangePrincipal.MailboxInfo.Location.ServerFqdn; if (this.InvokeSynchronizer) { TenantPublicFolderConfiguration value = TenantPublicFolderConfigurationCache.Instance.GetValue(aduser.OrganizationId); Organization orgContainer = this.ConfigurationSession.GetOrgContainer(); if (orgContainer.DefaultPublicFolderMailbox.HierarchyMailboxGuid != value.GetHierarchyMailboxInformation().HierarchyMailboxGuid || value.GetLocalMailboxRecipient(aduser.ExchangeGuid) == null) { TenantPublicFolderConfigurationCache.Instance.RemoveValue(aduser.OrganizationId); } if (aduser.ExchangeGuid == value.GetHierarchyMailboxInformation().HierarchyMailboxGuid) { base.WriteError(new TaskArgumentException(Strings.ErrorSecondaryMailboxIdRequired), ExchangeErrorCategory.Client, exchangePrincipal); } if (this.FullSync) { using (PublicFolderSession publicFolderSession = PublicFolderSession.OpenAsAdmin(this.DataObject.OrganizationId, null, aduser.ExchangeGuid, null, CultureInfo.CurrentCulture, "Client=Management;Action=UpdatePublicFolderMailbox", null)) { using (Folder folder = Folder.Bind(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId())) { using (UserConfiguration configuration = UserConfiguration.GetConfiguration(folder, new UserConfigurationName("PublicFolderSyncInfo", ConfigurationNameKind.Name), UserConfigurationTypes.Dictionary)) { IDictionary dictionary = configuration.GetDictionary(); dictionary["SyncState"] = null; configuration.Save(); } } } } PublicFolderSyncJobState publicFolderSyncJobState = PublicFolderSyncJobRpc.StartSyncHierarchy(exchangePrincipal, this.ReconcileFolders); if (!this.SuppressStatus) { base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageStartUpdatePublicFolderMailbox(this.Identity.ToString()))); int num = 0; while (publicFolderSyncJobState.JobStatus != PublicFolderSyncJobState.Status.Completed && publicFolderSyncJobState.LastError == null && num++ < UpdatePublicFolderMailbox.timeToWaitInMilliseconds / UpdatePublicFolderMailbox.QueryIntervalInMilliseconds) { base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageUpdatePublicFolderMailboxUnderProgress(publicFolderSyncJobState.JobStatus.ToString()))); Thread.Sleep(UpdatePublicFolderMailbox.QueryIntervalInMilliseconds); publicFolderSyncJobState = PublicFolderSyncJobRpc.QueryStatusSyncHierarchy(exchangePrincipal); } if (publicFolderSyncJobState.LastError != null) { base.WriteError(publicFolderSyncJobState.LastError, ExchangeErrorCategory.ServerOperation, publicFolderSyncJobState); } if (publicFolderSyncJobState.JobStatus == PublicFolderSyncJobState.Status.Completed) { base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageUpdatePublicFolderMailboxCompleted)); } else { base.WriteObject(new UpdatePublicFolderMailboxResult(Strings.StatusMessageSynchronizerRunningInBackground)); } } } else if (aduser.ExchangeGuid != Guid.Empty) { MailboxDatabase mailboxDatabase = base.GlobalConfigSession.Read <MailboxDatabase>(aduser.Database); if (mailboxDatabase == null) { base.WriteError(new TaskArgumentException(Strings.ElcMdbNotFound(this.Identity.ToString())), ExchangeErrorCategory.Client, null); } this.EnsureMailboxExistsOnDatabase(aduser.ExchangeGuid); AssistantsRpcClient assistantsRpcClient = new AssistantsRpcClient(serverFqdn); try { assistantsRpcClient.Start("PublicFolderAssistant", aduser.ExchangeGuid, mailboxDatabase.Guid); } catch (RpcException ex) { base.WriteError(new TaskException(RpcUtility.MapRpcErrorCodeToMessage(ex.ErrorCode, serverFqdn)), ExchangeErrorCategory.Client, null); } } } finally { TaskLogger.LogExit(); } }
private void ExecuteSyncStateOperation(Action <StoreSession, CoreFolder> operation) { using (base.RHTracker.Start()) { if (base.IsPublicFolderMove || base.IsPublicFolderMailboxRestore) { PublicFolderSession publicFolderSession = this.GetPublicFolderSession(); using (CoreFolder coreFolder = CoreFolder.Bind(publicFolderSession, publicFolderSession.GetTombstonesRootFolderId())) { operation(publicFolderSession, coreFolder); goto IL_A9; } } MailboxSession mailboxSession = null; bool flag = false; try { if (base.UseHomeMDB) { mailboxSession = this.GetMailboxSession(); } else { mailboxSession = this.OpenSystemMailbox(); flag = true; } using (CoreFolder coreFolder2 = CoreFolder.Create(mailboxSession, mailboxSession.GetDefaultFolderId(DefaultFolderType.Configuration), false, "MailboxReplicationService SyncStates", CreateMode.OpenIfExists)) { coreFolder2.Save(SaveMode.FailOnAnyConflict); operation(mailboxSession, coreFolder2); } } finally { if (flag && mailboxSession != null) { mailboxSession.Dispose(); } } IL_A9 :; } }