using System; using System.Web.UI; using CMS.EventLog; using CMS.SettingsProvider; using CMS.UIControls; using CMS.CMSImportExport; using CMS.GlobalHelper; using CMS.DatabaseHelper; public partial class CMSInstall_Controls_WizardSteps_AsyncProgress : CMSUserControl, ICallbackEventHandler { #region "Private class progress messages" /// /// Progress messages parsed from result. /// private class ProgressMessagesHelper { readonly string content; readonly string state; readonly string storageContent; public ProgressMessagesHelper() { storageContent = PersistentStorageHelper.GetValue(STORAGE_KEY) as String; if (!String.IsNullOrEmpty(storageContent)) { string[] items = storageContent.Split(new[] { AbstractImportExportSettings.SEPARATOR }, StringSplitOptions.None); state = items[0]; content = items[1]; } } public void LogInfo(string message, string sourceText, string eventCodeText, bool logToEventLog) { string value = state + AbstractImportExportSettings.SEPARATOR + message + content; PersistentStorageHelper.SetValue(STORAGE_KEY, value); if (logToEventLog) { new EventLogProvider().LogEvent(EventLogProvider.EVENT_TYPE_INFORMATION, DateTime.Now, sourceText, eventCodeText, URLHelper.CurrentURL, message); } } public void LogError(string message, string sourceText, string eventCodeText, bool logToEventLog) { string value = FAILED_SIGN + AbstractImportExportSettings.SEPARATOR + "" + message + "" + content; PersistentStorageHelper.SetValue(STORAGE_KEY, value); if (logToEventLog) { new EventLogProvider().LogEvent(EventLogProvider.EVENT_TYPE_ERROR, DateTime.Now, sourceText, eventCodeText, URLHelper.CurrentURL, message); } } public void LogQuit(string message, string sourceText, string eventCodeText, bool logToEventLog) { string value = QUIT_SIGN + AbstractImportExportSettings.SEPARATOR + message + content; PersistentStorageHelper.SetValue(STORAGE_KEY, value); if (logToEventLog) { new EventLogProvider().LogEvent(EventLogProvider.EVENT_TYPE_INFORMATION, DateTime.Now, sourceText, eventCodeText, URLHelper.CurrentURL, message); } } public string GetContent() { if (SystemHelper.DBSeparationStartedByServer != HTTPHelper.MachineName) { return AbstractImportExportSettings.SEPARATOR + ResHelper.GetString("separationDB.differentserver"); } return storageContent; } } #endregion #region "Variables and constants" private const string FAILED_SIGN = "F"; private const string QUIT_SIGN = "Q"; private const string STORAGE_KEY = "SeparateDBProgressLog"; private const string SEPARATION = "Contact management database separation"; private const string DBJOIN = "Contact management database join"; private const string SEPARATE = "SEPARATE"; private const string JOIN = "JOIN"; #endregion #region "Public properties" /// /// Client ID of 'Next' button of a wizard control. /// public string NextButtonClientID { get; set; } /// /// Client ID of 'Previous' button of a wizard control. /// public string PreviousButtonClientID { get; set; } /// /// Indicates if control is used for separation or DB join. /// public bool IsSeparation { get; set; } /// /// Event log - source text. /// private string SourceText { get { return IsSeparation ? SEPARATION : DBJOIN; } } /// /// Event log - event code text. /// private string EventCodeText { get { return IsSeparation ? SEPARATE : JOIN; } } #endregion #region "Page events" protected void Page_Load(object sender, EventArgs e) { RegisterJS(); } #endregion #region "Public methods" /// /// Logs message to for asynchronous displaying. /// /// Message to be displayed /// Type of a message /// Log to event log public void LogMessage(string line, CMSDatabaseHelper.MessageType type, bool logToEventLog) { if (!line.EndsWith("
") && !line.EndsWith("
")) { line = line + "
"; } ProgressMessagesHelper progressMessages = new ProgressMessagesHelper(); switch (type) { case CMSDatabaseHelper.MessageType.Info: progressMessages.LogInfo(line, SourceText, EventCodeText, logToEventLog); break; case CMSDatabaseHelper.MessageType.Error: progressMessages.LogError(line, SourceText, EventCodeText, logToEventLog); break; case CMSDatabaseHelper.MessageType.Finished: progressMessages.LogQuit(line, SourceText, EventCodeText, logToEventLog); break; } } /// /// Start asynchronous logging. /// public void StartLogging() { ScriptHelper.RegisterStartupScript(Page, typeof(Page), "StartLogging", ScriptHelper.GetScript("StartTimer();")); } /// /// Displays message immediately. /// /// Message to be displayed public void DisplayInfoMessage(string message) { LogMessage(message, CMSDatabaseHelper.MessageType.Info, false); lblProgress.Text = message + lblProgress.Text; } #endregion #region "Private methods" /// /// Javascript functions. /// private void RegisterJS() { string jsFunctions = @" function CallServer(argument){ if (getBusy) return; getBusy = true; setTimeout(""getBusy = false;"", 2000); if(window.Activity) { window.Activity(); } return " + Page.ClientScript.GetCallbackEventReference(this, "argument", "SetProgress", null, true) + @"; } "; jsFunctions += @" function BreakProgress(success) { StopTimer(); if (window.location.href.indexOf('returnurl=') > 0) { BTN_Enable('" + NextButtonClientID + @"'); } else { if (success) { BTN_Enable('" + NextButtonClientID + @"'); BTN_Disable('" + PreviousButtonClientID + @"'); } else { BTN_Disable('" + NextButtonClientID + @"'); BTN_Enable('" + PreviousButtonClientID + @"'); } } } function SetProgress(rValue, context){ var messageElement = document.getElementById('" + lblProgress.ClientID + @"'); getBusy = false; if (rValue != '') { var values = rValue.split('" + AbstractImportExportSettings.SEPARATOR + @"'); messageElement.innerHTML = values[1]; if((values == '') || (values[0] == '" + FAILED_SIGN + @"')) { BreakProgress(false); } if (values[0] == '" + QUIT_SIGN + @"'){ BreakProgress(true); } } } "; ScriptHelper.RegisterClientScriptBlock(this, GetType(), "InstallFunctions", ScriptHelper.GetScript(jsFunctions)); } #endregion #region ICallbackEventHandler Members public string GetCallbackResult() { return new ProgressMessagesHelper().GetContent(); } public void RaiseCallbackEvent(string eventArgument) { } #endregion }