private void WriteCopyStatusResultIfAppropriate(DatabaseCopyStatusEntry statusEntry)
 {
     if (!this.Active || statusEntry.ActiveCopy)
     {
         this.WriteResult(statusEntry);
     }
 }
        private static void UpdateBackupInfo(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus)
        {
            entry.m_latestFullBackupTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestFullBackupTime);
            DateTime?dateTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestIncrementalBackupTime);

            if (dateTime != null && dateTime.Value >= entry.m_latestFullBackupTime)
            {
                entry.m_latestIncrementalBackupTime = dateTime;
            }
            dateTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestDifferentialBackupTime);
            if (dateTime != null && dateTime.Value >= entry.m_latestFullBackupTime)
            {
                entry.m_latestDifferentialBackupTime = dateTime;
            }
            entry.m_latestCopyBackupTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestCopyBackupTime);
            if (entry.m_latestFullBackupTime != null)
            {
                entry.m_snapshotLatestFullBackup = new bool?(copyStatus.SnapshotLatestFullBackup);
                entry.m_snapshotBackup           = new bool?(copyStatus.SnapshotLatestFullBackup);
            }
            if (entry.m_latestIncrementalBackupTime != null)
            {
                entry.m_snapshotLatestIncrementalBackup = new bool?(copyStatus.SnapshotLatestIncrementalBackup);
            }
            if (entry.m_latestDifferentialBackupTime != null)
            {
                entry.m_snapshotLatestDifferentialBackup = new bool?(copyStatus.SnapshotLatestDifferentialBackup);
            }
            if (entry.m_latestCopyBackupTime != null)
            {
                entry.m_snapshotLatestCopyBackup = new bool?(copyStatus.SnapshotLatestCopyBackup);
            }
        }
 private static void UpdateDatabaseSeedStatus(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus)
 {
     if (copyStatus.CopyStatus == CopyStatusEnum.Seeding)
     {
         DatabaseSeedStatus dbSeedStatus = new DatabaseSeedStatus(copyStatus.DbSeedingPercent, copyStatus.DbSeedingKBytesRead, copyStatus.DbSeedingKBytesWritten, copyStatus.DbSeedingKBytesReadPerSec, copyStatus.DbSeedingKBytesWrittenPerSec);
         entry.m_dbSeedStatus = dbSeedStatus;
     }
 }
 private static void UpdateReplayLagStatus(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus)
 {
     if (copyStatus.ReplayLagEnabled != ReplayLagEnabledEnum.Unknown)
     {
         ReplayLagStatus replayLagStatus = new ReplayLagStatus(copyStatus.ReplayLagEnabled == ReplayLagEnabledEnum.Enabled, copyStatus.ConfiguredReplayLagTime, copyStatus.ActualReplayLagTime, copyStatus.ReplayLagPercentage, GetMailboxDatabaseCopyStatus.ConvertLagPlayDownReason(copyStatus.ReplayLagPlayDownReason), copyStatus.ReplayLagDisabledReason);
         entry.m_replayLagStatus = replayLagStatus;
     }
 }
        private void UpdateCopyStatusNoReplicaInstance(DatabaseCopyStatusEntry status)
        {
            status.Status = CopyStatus.Unknown;
            Exception ex = new ReplayServiceRpcUnknownInstanceException();

            status.m_extendedErrorInfo = new ExtendedErrorInfo(ex);
            status.m_errorMessage      = ex.Message;
        }
 private void UpdateMisconfiguredCopyStatusEntry(DatabaseCopyStatusEntry status, DatabaseCopy databaseCopy)
 {
     status.Status = CopyStatus.Misconfigured;
     ValidationError[] array = databaseCopy.ValidateRead();
     if (array.Length > 0)
     {
         Exception ex = new DataValidationException(array[0]);
         status.m_extendedErrorInfo = new ExtendedErrorInfo(ex);
         status.m_errorMessage      = ex.Message;
     }
 }
        private static void UpdateDumpsterRequests(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus)
        {
            List <DumpsterRequestEntry> list = new List <DumpsterRequestEntry>();

            if (copyStatus.DumpsterRequired && !string.IsNullOrEmpty(copyStatus.DumpsterServers))
            {
                string[] array = copyStatus.DumpsterServers.Split(new char[]
                {
                    ','
                });
                if (array != null && array.Length > 0)
                {
                    foreach (string server in array)
                    {
                        list.Add(new DumpsterRequestEntry(server, copyStatus.DumpsterStartTime, copyStatus.DumpsterEndTime));
                    }
                }
            }
            entry.m_outstandingDumpsterRequests = new DumpsterRequestEntry[list.Count];
            list.CopyTo(entry.m_outstandingDumpsterRequests);
        }
        internal static void GetEntryFromStatus(RpcDatabaseCopyStatus2 copyStatus, DatabaseCopyStatusEntry entry)
        {
            CopyStatusEnum copyStatus2 = copyStatus.CopyStatus;
            CopyStatus     copyStatus3 = GetMailboxDatabaseCopyStatus.TranslateRpcStatusToTaskStatus(copyStatus2);

            entry.Status = copyStatus3;
            entry.m_statusRetrievedTime      = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.StatusRetrievedTime);
            entry.m_lastStatusTransitionTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastStatusTransitionTime);
            entry.InstanceStartTime          = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.InstanceStartTime);
            entry.m_errorMessage             = copyStatus.ErrorMessage;
            entry.m_errorEventId             = ((copyStatus.ErrorEventId != 0U) ? new uint?(copyStatus.ErrorEventId) : null);
            entry.m_extendedErrorInfo        = copyStatus.ExtendedErrorInfo;
            if (copyStatus3 == CopyStatus.Suspended || copyStatus3 == CopyStatus.FailedAndSuspended || copyStatus3 == CopyStatus.Seeding)
            {
                entry.m_suspendMessage = copyStatus.SuspendComment;
            }
            entry.m_singlePageRestore  = copyStatus.SinglePageRestoreNumber;
            entry.m_mailboxServer      = copyStatus.MailboxServer;
            entry.m_activeDatabaseCopy = copyStatus.ActiveDatabaseCopy;
            entry.m_actionInitiator    = copyStatus.ActionInitiator;
            entry.ActiveCopy           = copyStatus.IsActiveCopy();
            if (copyStatus.ActivationPreference > 0)
            {
                entry.ActivationPreference = new int?(copyStatus.ActivationPreference);
            }
            entry.IsLastCopyAvailabilityChecksPassed   = new bool?(copyStatus.IsLastCopyAvailabilityChecksPassed);
            entry.IsLastCopyRedundancyChecksPassed     = new bool?(copyStatus.IsLastCopyRedundancyChecksPassed);
            entry.LastCopyAvailabilityChecksPassedTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyAvailabilityChecksPassedTime);
            entry.LastCopyRedundancyChecksPassedTime   = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyRedundancyChecksPassedTime);
            entry.DiskFreeSpacePercent                 = copyStatus.DiskFreeSpacePercent;
            entry.DiskFreeSpace                        = ByteQuantifiedSize.FromBytes(copyStatus.DiskFreeSpaceBytes);
            entry.DiskTotalSpace                       = ByteQuantifiedSize.FromBytes(copyStatus.DiskTotalSpaceBytes);
            entry.ExchangeVolumeMountPoint             = copyStatus.ExchangeVolumeMountPoint;
            entry.DatabaseVolumeMountPoint             = copyStatus.DatabaseVolumeMountPoint;
            entry.DatabaseVolumeName                   = copyStatus.DatabaseVolumeName;
            entry.DatabasePathIsOnMountedFolder        = new bool?(copyStatus.DatabasePathIsOnMountedFolder);
            entry.LogVolumeMountPoint                  = copyStatus.LogVolumeMountPoint;
            entry.LogVolumeName                        = copyStatus.LogVolumeName;
            entry.LogPathIsOnMountedFolder             = new bool?(copyStatus.LogPathIsOnMountedFolder);
            entry.LastDatabaseVolumeName               = copyStatus.LastDatabaseVolumeName;
            entry.LastDatabaseVolumeNameTransitionTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastDatabaseVolumeNameTransitionTime);
            entry.VolumeInfoError                      = copyStatus.VolumeInfoLastError;
            entry.m_activationSuspended                = copyStatus.ActivationSuspended;
            if (copyStatus.ActivationSuspended)
            {
                entry.m_suspendMessage = copyStatus.SuspendComment;
            }
            entry.m_latestAvailableLogTime           = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestAvailableLogTime);
            entry.m_latestCopyNotificationTime       = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyNotifiedLogTime);
            entry.m_latestCopyTime                   = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopiedLogTime);
            entry.m_latestInspectorTime              = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastInspectedLogTime);
            entry.m_latestReplayTime                 = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastReplayedLogTime);
            entry.m_latestLogGenerationNumber        = copyStatus.LastLogGenerated;
            entry.m_copyNotificationGenerationNumber = copyStatus.LastLogCopyNotified;
            entry.m_copyGenerationNumber             = copyStatus.LastLogCopied;
            entry.m_inspectorGenerationNumber        = copyStatus.LastLogInspected;
            entry.m_replayGenerationNumber           = copyStatus.LastLogReplayed;
            entry.m_contentIndexState                = copyStatus.ContentIndexStatus;
            entry.m_contentIndexErrorMessage         = copyStatus.ContentIndexErrorMessage;
            entry.m_contentIndexErrorCode            = copyStatus.ContentIndexErrorCode;
            entry.m_contentIndexVersion              = copyStatus.ContentIndexVersion;
            entry.m_contentIndexBacklog              = copyStatus.ContentIndexBacklog;
            entry.m_contentIndexRetryQueueSize       = copyStatus.ContentIndexRetryQueueSize;
            entry.m_contentIndexMailboxesToCrawl     = copyStatus.ContentIndexMailboxesToCrawl;
            entry.m_contentIndexSeedingPercent       = copyStatus.ContentIndexSeedingPercent;
            entry.m_contentIndexSeedingSource        = copyStatus.ContentIndexSeedingSource;
            entry.m_logCopyQueueIncreasing           = new bool?(copyStatus.CopyQueueNotKeepingUp);
            entry.m_logReplayQueueIncreasing         = new bool?(copyStatus.ReplayQueueNotKeepingUp);
            entry.m_replaySuspended                  = new bool?(copyStatus.ReplaySuspended);
            entry.ResumeBlocked = new bool?(copyStatus.ResumeBlocked);
            entry.ReseedBlocked = new bool?(copyStatus.ReseedBlocked);
            if (copyStatus.WorkerProcessId != 0)
            {
                entry.m_workerProcessId = new int?(copyStatus.WorkerProcessId);
            }
            entry.LastLogInfoIsStale               = copyStatus.LastLogInfoIsStale;
            entry.LastLogInfoFromCopierTime        = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastLogInfoFromCopierTime);
            entry.LastLogInfoFromClusterTime       = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastLogInfoFromClusterTime);
            entry.LastLogInfoFromClusterGen        = copyStatus.LastLogInfoFromClusterGen;
            entry.LowestLogPresent                 = copyStatus.LowestLogPresent;
            entry.m_logsReplayedSinceInstanceStart = new long?(copyStatus.LogsReplayedSinceInstanceStart);
            entry.m_logsCopiedSinceInstanceStart   = new long?(copyStatus.LogsCopiedSinceInstanceStart);
            entry.ReplicationIsInBlockMode         = copyStatus.ReplicationIsInBlockMode;
            entry.ActivationDisabledAndMoveNow     = copyStatus.ActivationDisabledAndMoveNow;
            entry.AutoActivationPolicy             = (DatabaseCopyAutoActivationPolicyType)copyStatus.AutoActivationPolicy;
            int num = copyStatus.MinimumSupportedDatabaseSchemaVersion;

            if (num > 0)
            {
                entry.MinimumSupportedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535);
            }
            num = copyStatus.MaximumSupportedDatabaseSchemaVersion;
            if (num > 0)
            {
                entry.MaximumSupportedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535);
            }
            num = copyStatus.RequestedDatabaseSchemaVersion;
            if (num > 0)
            {
                entry.RequestedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535);
            }
            GetMailboxDatabaseCopyStatus.UpdateReplayLagStatus(entry, copyStatus);
            GetMailboxDatabaseCopyStatus.UpdateDatabaseSeedStatus(entry, copyStatus);
            GetMailboxDatabaseCopyStatus.UpdateBackupInfo(entry, copyStatus);
            GetMailboxDatabaseCopyStatus.UpdateDumpsterRequests(entry, copyStatus);
            if (copyStatus.OutgoingConnections != null)
            {
                entry.m_outgoingConnections = (ConnectionStatus[])Serialization.BytesToObject(copyStatus.OutgoingConnections);
            }
            if (copyStatus.IncomingLogCopyingNetwork != null)
            {
                entry.m_incomingLogCopyingNetwork = (ConnectionStatus)Serialization.BytesToObject(copyStatus.IncomingLogCopyingNetwork);
            }
            if (copyStatus.SeedingNetwork != null)
            {
                entry.m_seedingNetwork = (ConnectionStatus)Serialization.BytesToObject(copyStatus.SeedingNetwork);
            }
            entry.MaxLogToReplay = copyStatus.MaxLogToReplay;
        }
        private DatabaseCopyStatusEntry[] PrepareStatusEntryFromRpc(Server server, Collection <DatabaseCopy> databaseCopies)
        {
            DatabaseCopyStatusEntry[] array = new DatabaseCopyStatusEntry[databaseCopies.Count];
            Guid[] array2 = new Guid[databaseCopies.Count];
            for (int i = 0; i < databaseCopies.Count; i++)
            {
                DatabaseCopy databaseCopy3 = databaseCopies[i];
                Database     database      = databaseCopy3.GetDatabase <Database>();
                array2[i] = database.Guid;
                array[i]  = this.ConstructNewSatusEntry(databaseCopy3);
            }
            RpcGetDatabaseCopyStatusFlags2 rpcGetDatabaseCopyStatusFlags = RpcGetDatabaseCopyStatusFlags2.None;

            if (!this.UseServerCache)
            {
                rpcGetDatabaseCopyStatusFlags |= RpcGetDatabaseCopyStatusFlags2.ReadThrough;
            }
            try
            {
                IEnumerable <string> source = from databaseCopy in databaseCopies
                                              select databaseCopy.DatabaseName;
                base.WriteVerbose(Strings.GetDbcsRpcQuery(server.Fqdn, string.Join(",", source.ToArray <string>())));
                RpcDatabaseCopyStatus2[] copyStatus = ReplayRpcClientHelper.GetCopyStatus(server.Fqdn, rpcGetDatabaseCopyStatusFlags, array2);
                if (copyStatus != null && copyStatus.Length > 0)
                {
                    base.WriteVerbose(Strings.GetDbcsRpcQueryAllDone(copyStatus.Length));
                    Dictionary <Guid, RpcDatabaseCopyStatus2> dictionary = new Dictionary <Guid, RpcDatabaseCopyStatus2>(copyStatus.Length);
                    for (int j = 0; j < copyStatus.Length; j++)
                    {
                        dictionary[copyStatus[j].DBGuid] = copyStatus[j];
                    }
                    for (int k = 0; k < array2.Length; k++)
                    {
                        RpcDatabaseCopyStatus2 copyStatus2;
                        if (dictionary.TryGetValue(array2[k], out copyStatus2))
                        {
                            GetMailboxDatabaseCopyStatus.GetEntryFromStatus(copyStatus2, array[k]);
                        }
                        else if (!databaseCopies[k].IsValid)
                        {
                            ExTraceGlobals.CmdletsTracer.TraceDebug <Guid, string>((long)this.GetHashCode(), "GetCopyStatus() didn't find replica instance for database {0} on server {1}. The DatabaseCopy is misconfigured in the Active Directory!", array2[k], server.Fqdn);
                            this.UpdateMisconfiguredCopyStatusEntry(array[k], databaseCopies[k]);
                        }
                        else
                        {
                            ExTraceGlobals.CmdletsTracer.TraceDebug <Guid, string>((long)this.GetHashCode(), "GetCopyStatus() didn't find replica instance for database {0} on server {1}.", array2[k], server.Fqdn);
                            this.UpdateCopyStatusNoReplicaInstance(array[k]);
                        }
                    }
                }
            }
            catch (ArgumentException ex)
            {
                ExTraceGlobals.CmdletsTracer.TraceError <ArgumentException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ArgumentException: {0}", ex);
                this.WriteError(ex, ErrorCategory.ReadError, null, false);
            }
            catch (TaskServerTransientException ex2)
            {
                ExTraceGlobals.CmdletsTracer.TraceError <TaskServerTransientException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ArgumentException: {0}", ex2);
                this.WriteError(ex2, ErrorCategory.ReadError, null, false);
            }
            catch (TaskServerException ex3)
            {
                ExTraceGlobals.CmdletsTracer.TraceError <TaskServerException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ReplayServiceRpcException: {0}", ex3);
                if (ex3 is ReplayServiceDownException)
                {
                    base.WriteVerbose(Strings.GetDbcsDetectReplayServiceDown(server.Fqdn, ex3.Message));
                    for (int l = 0; l < array.Length; l++)
                    {
                        DatabaseCopyStatusEntry databaseCopyStatusEntry = array[l];
                        DatabaseCopy            databaseCopy2           = databaseCopies[l];
                        if (!databaseCopy2.IsValid)
                        {
                            this.UpdateMisconfiguredCopyStatusEntry(databaseCopyStatusEntry, databaseCopy2);
                        }
                        else
                        {
                            databaseCopyStatusEntry.Status              = CopyStatus.ServiceDown;
                            databaseCopyStatusEntry.m_errorMessage      = ex3.Message;
                            databaseCopyStatusEntry.m_extendedErrorInfo = new ExtendedErrorInfo(ex3);
                        }
                    }
                }
                else if (ex3 is ReplayServiceRpcUnknownInstanceException)
                {
                    ExTraceGlobals.CmdletsTracer.TraceDebug <string>((long)this.GetHashCode(), "GetCopyStatus() was not able to find any replica instances on server {0}.", server.Fqdn);
                    for (int m = 0; m < array.Length; m++)
                    {
                        if (!databaseCopies[m].IsValid)
                        {
                            this.UpdateMisconfiguredCopyStatusEntry(array[m], databaseCopies[m]);
                        }
                        else
                        {
                            this.UpdateCopyStatusNoReplicaInstance(array[m]);
                        }
                    }
                }
                else
                {
                    this.WriteError(ex3, ErrorCategory.ReadError, null, false);
                }
            }
            return(array);
        }
        protected override void WriteResult <T>(IEnumerable <T> dataObjects)
        {
            TaskLogger.LogEnter(new object[]
            {
                dataObjects
            });
            Dictionary <string, Collection <DatabaseCopy> > dictionary = new Dictionary <string, Collection <DatabaseCopy> >();

            foreach (T t in dataObjects)
            {
                IConfigurable configurable = t;
                DatabaseCopy  databaseCopy = configurable as DatabaseCopy;
                string        key;
                if (this.m_server != null)
                {
                    key = this.m_server.Name;
                }
                else
                {
                    key = databaseCopy.HostServerName;
                }
                Collection <DatabaseCopy> collection;
                if (!dictionary.TryGetValue(key, out collection))
                {
                    collection = new Collection <DatabaseCopy>();
                    dictionary.Add(key, collection);
                }
                collection.Add(databaseCopy);
            }
            using (Dictionary <string, Collection <DatabaseCopy> > .KeyCollection.Enumerator enumerator2 = dictionary.Keys.GetEnumerator())
            {
                while (enumerator2.MoveNext())
                {
                    string dbCopyServerName = enumerator2.Current;
                    Collection <DatabaseCopy> collection2 = dictionary[dbCopyServerName];
                    Server server2;
                    if (this.m_server != null)
                    {
                        server2 = this.m_server;
                    }
                    else
                    {
                        MailboxServerIdParameter mailboxServerIdParameter = MailboxServerIdParameter.Parse(dbCopyServerName);
                        IEnumerable <Server>     objects = mailboxServerIdParameter.GetObjects <Server>(this.RootId, this.ConfigurationSession);
                        server2 = objects.FirstOrDefault((Server server) => server.Name.Equals(dbCopyServerName, StringComparison.OrdinalIgnoreCase));
                    }
                    if (server2 != null)
                    {
                        if (ReplayRpcVersionControl.IsGetCopyStatusEx2RpcSupported(server2.AdminDisplayVersion))
                        {
                            DatabaseCopyStatusEntry[] array = this.PrepareStatusEntryFromRpc(server2, collection2);
                            for (int i = 0; i < array.Length; i++)
                            {
                                this.WriteCopyStatusResultIfAppropriate(array[i]);
                            }
                        }
                        else
                        {
                            this.WriteError(new InvalidOperationException(Strings.GetDbcsRpcNotSupported(server2.Name, server2.AdminDisplayVersion.ToString(), ReplayRpcVersionControl.GetCopyStatusEx2SupportVersion.ToString())), ErrorCategory.InvalidOperation, server2.Identity, false);
                        }
                    }
                    else
                    {
                        foreach (DatabaseCopy databaseCopy2 in collection2)
                        {
                            DatabaseCopyStatusEntry databaseCopyStatusEntry = this.ConstructNewSatusEntry(databaseCopy2);
                            this.UpdateMisconfiguredCopyStatusEntry(databaseCopyStatusEntry, databaseCopy2);
                            this.WriteCopyStatusResultIfAppropriate(databaseCopyStatusEntry);
                        }
                    }
                }
            }
            TaskLogger.LogExit();
        }