/// <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(); }
/// <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(); } }
/// <summary> /// Interrupt any rebuild in progress if needed. /// </summary> private void StopRebuildIfNeeded() { m_rebuildStep = KwsRebuildTaskStep.None; }
/// <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(); }
/// <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(); } }
/// <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(); }
/// <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); } }