Пример #1
0
        /// <summary>
        /// Process workspace rebuild if required.
        /// </summary>
        private void ProcessKwsRebuildIfNeeded()
        {
            Debug.Assert(m_rebuildStep == KwsRebuildTaskStep.None);

            if (m_cd.CurrentTask != KwsTask.Rebuild)
            {
                return;
            }

            // Sanity check.
            if (m_cd.MainStatus != KwsMainStatus.RebuildRequired)
            {
                KLogging.Log("cannot execute rebuild task, " + KwmStrings.Kws + " status is not RebuildRequired");
                RequestTaskSwitch(KwsTask.Stop);
                return;
            }

            // We cannot rebuild until the applications are stopped and we're
            // logged out.
            if (m_cd.AppStatus != KwsAppStatus.Stopped || m_ks.LoginStatus != KwsLoginStatus.LoggedOut)
            {
                return;
            }

            // Protect against spurious state changes.
            m_rebuildStep = KwsRebuildTaskStep.InProgress;

            try
            {
                // Ask the workspace to prepare for rebuild.
                m_kws.PrepareToRebuild();
                if (m_rebuildStep != KwsRebuildTaskStep.InProgress)
                {
                    return;
                }

                // Tell the applications to prepare for rebuild.
                foreach (KwsApp app in m_kws.AppTree.Values)
                {
                    app.PrepareToRebuild();
                    if (m_rebuildStep != KwsRebuildTaskStep.InProgress)
                    {
                        return;
                    }
                }
            }

            catch (Exception ex)
            {
                HandleMiscFailure(ex);
                return;
            }

            // We have "rebuilt" the workspace. Update the state.
            m_rebuildStep     = KwsRebuildTaskStep.None;
            m_cd.MainStatus   = KwsMainStatus.Good;
            m_cd.RebuildFlags = 0;
            m_cd.Uuid         = Wm.MakeUuid();
            SetLoginType(KwsLoginType.All);
            m_kws.OnStateChange(WmStateChange.Permanent);

            // Switch to the user task.
            SwitchToUserTask();
        }
Пример #2
0
        /// <summary>
        /// Request a switch to the task specified, if possible. 'Ex' is
        /// non-null if the task switch is occurring because an error occurred.
        /// </summary>
        public void RequestTaskSwitch(KwsTask task, Exception ex)
        {
            WmSm.LockNotif();

            try
            {
                // Validate.
                if (m_taskSwitchFlag ||
                    task == KwsTask.Stop && !CanStop() ||
                    task == KwsTask.Spawn && !CanSpawn() ||
                    task == KwsTask.Rebuild && !CanRebuild() ||
                    task == KwsTask.WorkOffline && !CanWorkOffline() ||
                    task == KwsTask.WorkOnline && !CanWorkOnline() ||
                    task == KwsTask.DeleteLocally && !CanDeleteLocally() ||
                    task == KwsTask.DeleteRemotely && !CanDeleteRemotely())
                {
                    KLogging.Log("Request to switch to task " + task + " ignored.");
                    return;
                }

                KLogging.Log("Switching to task " + task + ".");

                // Update some state prior to the task switch.
                if (task == KwsTask.Rebuild)
                {
                    m_cd.MainStatus = KwsMainStatus.RebuildRequired;
                    m_rebuildStep   = KwsRebuildTaskStep.None;
                }

                else if (task == KwsTask.WorkOnline)
                {
                    ResetKcdFailureState();
                }

                else if (task == KwsTask.DeleteLocally)
                {
                    m_cd.MainStatus = KwsMainStatus.OnTheWayOut;
                    m_kws.AddToKwsRemoveTree();
                    m_kws.OnStateChange(WmStateChange.Permanent);
                }

                else if (task == KwsTask.DeleteRemotely)
                {
                    ResetKcdFailureState();
                    m_deleteRemotelyStep = KwsDeleteRemotelyStep.ConnectedAndLoggedOut;
                }

                if (task == KwsTask.Spawn ||
                    task == KwsTask.Rebuild ||
                    task == KwsTask.WorkOffline ||
                    task == KwsTask.WorkOnline)
                {
                    m_cd.LastException = null;
                    m_kws.OnStateChange(WmStateChange.Permanent);
                }

                // Perform the task switch, if required.
                if (task != m_cd.CurrentTask)
                {
                    SwitchTask(task, ex);
                }
            }

            catch (Exception ex2)
            {
                KBase.HandleException(ex2, true);
            }

            finally
            {
                WmSm.UnlockNotif();
            }
        }
Пример #3
0
 /// <summary>
 /// Interrupt any rebuild in progress if needed.
 /// </summary>
 private void StopRebuildIfNeeded()
 {
     m_rebuildStep = KwsRebuildTaskStep.None;
 }
Пример #4
0
        /// <summary>
        /// Process workspace rebuild if required.
        /// </summary>
        private void ProcessKwsRebuildIfNeeded()
        {
            Debug.Assert(m_rebuildStep == KwsRebuildTaskStep.None);

            if (m_cd.CurrentTask != KwsTask.Rebuild) return;

            // Sanity check.
            if (m_cd.MainStatus != KwsMainStatus.RebuildRequired)
            {
                KLogging.Log("cannot execute rebuild task, " + KwmStrings.Kws + " status is not RebuildRequired");
                RequestTaskSwitch(KwsTask.Stop);
                return;
            }

            // We cannot rebuild until the applications are stopped and we're
            // logged out.
            if (m_cd.AppStatus != KwsAppStatus.Stopped || m_ks.LoginStatus != KwsLoginStatus.LoggedOut)
                return;

            // Protect against spurious state changes.
            m_rebuildStep = KwsRebuildTaskStep.InProgress;

            try
            {
                // Ask the workspace to prepare for rebuild.
                m_kws.PrepareToRebuild();
                if (m_rebuildStep != KwsRebuildTaskStep.InProgress) return;

                // Tell the applications to prepare for rebuild.
                foreach (KwsApp app in m_kws.AppTree.Values)
                {
                    app.PrepareToRebuild();
                    if (m_rebuildStep != KwsRebuildTaskStep.InProgress) return;
                }
            }

            catch (Exception ex)
            {
                HandleMiscFailure(ex);
                return;
            }

            // We have "rebuilt" the workspace. Update the state.
            m_rebuildStep = KwsRebuildTaskStep.None;
            m_cd.MainStatus = KwsMainStatus.Good;
            m_cd.RebuildFlags = 0;
            m_cd.Uuid = Wm.MakeUuid();
            SetLoginType(KwsLoginType.All);
            m_kws.OnStateChange(WmStateChange.Permanent);

            // Switch to the user task.
            SwitchToUserTask();
        }
Пример #5
0
        /// <summary>
        /// Request a switch to the task specified, if possible. 'Ex' is 
        /// non-null if the task switch is occurring because an error occurred.
        /// </summary>
        public void RequestTaskSwitch(KwsTask task, Exception ex)
        {
            WmSm.LockNotif();

            try
            {
                // Validate.
                if (m_taskSwitchFlag ||
                    task == KwsTask.Stop && !CanStop() ||
                    task == KwsTask.Spawn && !CanSpawn() ||
                    task == KwsTask.Rebuild && !CanRebuild() ||
                    task == KwsTask.WorkOffline && !CanWorkOffline() ||
                    task == KwsTask.WorkOnline && !CanWorkOnline() ||
                    task == KwsTask.DeleteLocally && !CanDeleteLocally() ||
                    task == KwsTask.DeleteRemotely && !CanDeleteRemotely())
                {
                    KLogging.Log("Request to switch to task " + task + " ignored.");
                    return;
                }

                KLogging.Log("Switching to task " + task + ".");

                // Update some state prior to the task switch.
                if (task == KwsTask.Rebuild)
                {
                    m_cd.MainStatus = KwsMainStatus.RebuildRequired;
                    m_rebuildStep = KwsRebuildTaskStep.None;
                }

                else if (task == KwsTask.WorkOnline)
                {
                    ResetKcdFailureState();
                }

                else if (task == KwsTask.DeleteLocally)
                {
                    m_cd.MainStatus = KwsMainStatus.OnTheWayOut;
                    m_kws.AddToKwsRemoveTree();
                    m_kws.OnStateChange(WmStateChange.Permanent);
                }

                else if (task == KwsTask.DeleteRemotely)
                {
                    ResetKcdFailureState();
                    m_deleteRemotelyStep = KwsDeleteRemotelyStep.ConnectedAndLoggedOut;
                }

                if (task == KwsTask.Spawn ||
                    task == KwsTask.Rebuild ||
                    task == KwsTask.WorkOffline ||
                    task == KwsTask.WorkOnline)
                {
                    m_cd.LastException = null;
                    m_kws.OnStateChange(WmStateChange.Permanent);
                }

                // Perform the task switch, if required.
                if (task != m_cd.CurrentTask) SwitchTask(task, ex);
            }

            catch (Exception ex2)
            {
                KBase.HandleException(ex2, true);
            }

            finally
            {
                WmSm.UnlockNotif();
            }
        }
Пример #6
0
 /// <summary>
 /// Interrupt any rebuild in progress if needed.
 /// </summary>
 private void StopRebuildIfNeeded()
 {
     m_rebuildStep = KwsRebuildTaskStep.None;
 }
Пример #7
0
        /// <summary>
        /// Process workspace rebuild if required.
        /// </summary>
        private void ProcessKwsRebuildIfNeeded()
        {
            Debug.Assert(m_rebuildStep == KwsRebuildTaskStep.None);

            if (m_currentTask != KwsTask.Rebuild) return;

            // Sanity check.
            if (m_kws.MainStatus != KwsMainStatus.RebuildRequired)
            {
                Logging.Log("cannot execute rebuild task, " + Base.GetKwsString() + " status is not RebuildRequired");
                RequestTaskSwitch(KwsTask.Stop);
                return;
            }

            // We cannot rebuild until the applications are stopped and we're logged out.
            if (m_kws.AppStatus != KwsAppStatus.Stopped || m_kws.LoginStatus != KwsLoginStatus.LoggedOut)
                return;

            // Protect against spurious state changes.
            m_rebuildStep = KwsRebuildTaskStep.InProgress;

            // Clear the selected user in the UI.
            m_wm.UiBroker.ClearSelectedUserOnRebuild(m_kws);

            // Delete the events and update the KANP state.
            if (m_kws.CoreData.RebuildInfo.DeleteCachedEventsFlag)
            {
                m_kws.DeleteEventsFromDb();
                m_kws.KAnpState.CaughtUpFlag = false;
                m_kws.KAnpState.RebuildFlag = true;
                m_kws.KAnpState.LastReceivedEventId = 0;
                m_kws.KAnpState.LoginLatestEventId = 0;
                m_kws.KAnpState.NbUnprocessedEvent = 0;
            }

            // Tell the applications to prepare for rebuild.
            foreach (KwsApp app in m_kws.AppTree.Values)
            {
                if (m_rebuildStep != KwsRebuildTaskStep.InProgress) return;

                try
                {
                    app.PrepareForRebuild(m_kws.CoreData.RebuildInfo);
                }

                catch (Exception ex)
                {
                    HandleAppFailure(app, ex);
                    return;
                }
            }

            if (m_rebuildStep != KwsRebuildTaskStep.InProgress) return;

            // Clear the rebuild info flags.
            m_kws.CoreData.RebuildInfo.DeleteCachedEventsFlag = false;
            m_kws.CoreData.RebuildInfo.DeleteLocalDataFlag = false;
            m_kws.CoreData.RebuildInfo.UpgradeFlag = false;

            // We have "rebuilt" the workspace. Switch to the user task.
            m_rebuildStep = KwsRebuildTaskStep.None;
            m_kws.MainStatus = KwsMainStatus.Good;
            m_kws.SetDirty();
            SetLoginType(KwsLoginType.NoPwdPrompt);
            SwitchToUserTask();
        }
Пример #8
0
        /// <summary>
        /// Request a switch to the task specified, if possible.
        /// </summary>
        public void RequestTaskSwitch(KwsTask task)
        {
            try
            {
                // Validate.
                if (m_taskSwitchFlag ||
                    task == KwsTask.Stop && !CanStop() ||
                    task == KwsTask.Spawn && !CanSpawn() ||
                    task == KwsTask.Rebuild && !CanRebuild() ||
                    task == KwsTask.WorkOffline && !CanWorkOffline() ||
                    task == KwsTask.WorkOnline && !CanWorkOnline() ||
                    task == KwsTask.Remove && !CanRemove() ||
                    task == KwsTask.DeleteOnServer && !CanDeleteOnServer())
                {
                    Logging.Log("Request to switch to task " + task + " ignored.");
                    return;
                }

                Logging.Log("Switching to task " + task + ".");

                // Update some state prior to the task switch.
                if (task == KwsTask.Rebuild)
                {
                    m_kws.MainStatus = KwsMainStatus.RebuildRequired;
                    m_rebuildStep = KwsRebuildTaskStep.None;
                }

                else if (task == KwsTask.WorkOnline)
                {
                    ResetKasFailureState();
                }

                else if (task == KwsTask.Remove)
                {
                    m_kws.MainStatus = KwsMainStatus.OnTheWayOut;
                    m_kws.AddToKwsRemoveTree();
                    m_kws.SetDirty();
                }

                else if (task == KwsTask.DeleteOnServer)
                {
                    ResetKasFailureState();
                    m_deleteOnServerStep = KwsDeleteOnServerStep.ConnectedAndLoggedOut;
                }

                if (task == KwsTask.Spawn ||
                    task == KwsTask.Rebuild ||
                    task == KwsTask.WorkOffline ||
                    task == KwsTask.WorkOnline)
                {
                    m_kws.AppException = null;
                }

                // Perform the task switch, if required.
                if (task != m_currentTask) SwitchTask(task);

                // Update some state after the task switch.
                if (task == KwsTask.Spawn)
                {
                    m_kws.NormalizeAppState();
                }
            }

            catch (Exception ex)
            {
                Base.HandleException(ex, true);
            }
        }