Imports System.ComponentModel Imports System.Runtime.Remoting.Messaging Imports System.Threading.Tasks Imports Connectors.Common Imports DevExpress.XtraEditors.ViewInfo Imports DigitalData.Modules.Config Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Partial Public Class frmMain Private LogConfig As LogConfig Private Logger As Logger Private ConfigManager As ConfigManager(Of Config) Private Database As MSSQLServer Private Sync As ISync Private FilesProcessed As Integer = 0 Private ErrorsOccurred As Integer = 0 Private SyncRunning As Boolean = False Public Enum LogLevel Info Warning [Error] End Enum Private Class LogLine Public Message As String Public Level As LogLevel Public CreatedWhen As Date = Now Public Overrides Function ToString() As String Return $"{CreatedWhen.ToShortDateString} {CreatedWhen.ToShortTimeString} {Message}" End Function End Class Public Sub New() InitializeComponent() End Sub Private Async Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load Try LogConfig = New LogConfig(LogConfig.PathType.CustomPath, IO.Path.Combine(Application.StartupPath, "Log")) ConfigManager = New ConfigManager(Of Config)(LogConfig, Application.StartupPath) LogConfig.Debug = ConfigManager.Config.Debug Logger = LogConfig.GetLogger() AddInfoEntry("Application started.") AddInfoEntry("Version: {0}", Application.ProductVersion) AddDivider() If ConfigManager.Config.ActiveModule = "NONE" Then AddWarnEntry("No ActiveModule selected, check your configuration!") Exit Sub End If Database = New MSSQLServer(LogConfig, ConfigManager.Config.ConnectionString) Sync = InitializeModule(ConfigManager.Config.ActiveModule) If Sync Is Nothing Then AddWarnEntry("ActiveModule '{0}' is not implemented!", ConfigManager.Config.ActiveModule) Exit Sub End If ' Load Form Title from Module Text = Sync.Name TrayIcon.Text = Sync.Name If Database.DBInitialized = False Then AddWarnEntry("Database could not be initialized. Please check connection string.") Exit Sub End If If Sync.TestConfigIsComplete() = False Then AddWarnEntry("Configuration is incomplete, check your configuration!") Exit Sub End If btnForceSync.Enabled = True If ConfigManager.Config.Autostart Then btnForceSync.Enabled = False Await RunSync() btnForceSync.Enabled = True End If If ConfigManager.Config.TimerIntervalMin > 0 Then AddInfoEntry("Timer Interval: {0} min", ConfigManager.Config.TimerIntervalMin.ToString) SyncTimer.Interval = ConfigManager.Config.TimerIntervalMin * 60 * 1_000 StartTimer() Else AddInfoEntry("Timer Interval: Off", ConfigManager.Config.TimerIntervalMin.ToString) End If Catch ex As Exception Logger.Error(ex) AddErrorEntry($"Error while loading the application: {ex.Message}") End Try End Sub Private Function InitializeModule(pActiveModule As String) As ISync Dim oSync As ISync Select Case pActiveModule Case "slt" oSync = New slt.sltSync(LogConfig, Database, ConfigManager.Config) Case "Sharepoint" oSync = New Sharepoint.SharepointSync(LogConfig, Database, ConfigManager.Config) Case Else Return Nothing End Select AddHandler oSync.OnLogEntry, AddressOf Sync_OnLogEntry AddHandler oSync.OnFileError, AddressOf Sync_OnFileError AddHandler oSync.OnFileProcessed, AddressOf Sync_OnFileProcessed Return oSync End Function Private Sub Sync_OnFileProcessed(sender As Object, e As String) FilesProcessed += 1 txtFilesProcessed.Caption = String.Format("{0} Dateien", FilesProcessed) End Sub Private Sub Sync_OnFileError(sender As Object, e As String) ErrorsOccurred += 1 txtErrorsOccurred.Caption = String.Format("{0} Fehler", ErrorsOccurred) End Sub Private Sub Sync_OnLogEntry(sender As Object, e As Tuple(Of String, BaseModule.LogLevel)) Select Case e.Item2 Case BaseModule.LogLevel.Info AddInfoEntry(e.Item1) Case BaseModule.LogLevel.Warn AddWarnEntry(e.Item1) Case BaseModule.LogLevel.Error AddErrorEntry(e.Item1) End Select End Sub Private Async Function frmMain_Closing(sender As Object, e As CancelEventArgs) As Threading.Tasks.Task Handles Me.Closing Try If Sync IsNot Nothing AndAlso Sync.IsLoggedIn Then AddInfoEntry("Logging out..") Await Sync.Cleanup() End If Catch ex As Exception Logger.Error(ex) AddWarnEntry($"Error while closing the application: {ex.Message}") End Try End Function Private Sub StartTimer() AddInfoEntry("Starting timer..") btnStopSync.Enabled = True btnSyncStart.Enabled = False SyncTimer.Enabled = True End Sub Private Sub StopTimer() AddInfoEntry("Stopping timer..") btnStopSync.Enabled = False btnSyncStart.Enabled = True SyncTimer.Enabled = False End Sub Private Async Function RunSync() As Task If SyncRunning = True Then Logger.Debug("Sync still running. Skipping.") Exit Function End If Try SyncRunning = True Await Sync.Run() SyncRunning = False Catch ex As Exception SyncRunning = False Logger.Warn("Error while running sync!") Logger.Error(ex) End Try End Function Private Async Function Timer_Elapsed(sender As Object, e As System.EventArgs) As Threading.Tasks.Task Handles SyncTimer.Tick btnForceSync.Enabled = False Await RunSync() btnForceSync.Enabled = True End Function Private Sub AddInfoEntry(pMessage As String, ParamArray pArgs As Object()) Logger.Info(pMessage, pArgs) Dim oItem = New LogLine With { .Message = String.Format(pMessage, pArgs), .Level = LogLevel.Info } ListBoxControl1.Items.Add(oItem) ListBoxControl1.MakeItemVisible(ListBoxControl1.Items.Count - 1) End Sub Private Sub AddWarnEntry(pMessage As String, ParamArray pArgs As Object()) Logger.Info(pMessage, pArgs) Dim oItem = New LogLine With { .Message = String.Format(pMessage, pArgs), .Level = LogLevel.Warning } ListBoxControl1.Items.Add(oItem) End Sub Private Sub AddErrorEntry(pMessage As String, ParamArray pArgs As Object()) Logger.Info(pMessage, pArgs) Dim oItem = New LogLine With { .Message = String.Format(pMessage, pArgs), .Level = LogLevel.Error } ListBoxControl1.Items.Add(oItem) End Sub Private Sub AddDivider() ListBoxControl1.Items.Add(New LogLine With { .Message = "-------------------------------------", .Level = LogLevel.Info }) End Sub Private Sub btnOpenLog_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnOpenLog.ItemClick Try Dim oPath = LogConfig.LogDirectory Process.Start("explorer.exe", oPath) Catch ex As Exception Logger.Error(ex) End Try End Sub Private Sub btnSyncStart_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSyncStart.ItemClick StartTimer() End Sub Private Sub btnStopSync_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnStopSync.ItemClick StopTimer() End Sub Private Sub btnToggleWindow_Click(sender As Object, e As EventArgs) Handles btnToggleWindow.Click ToggleWindow() End Sub Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Close() End Sub Private Sub TrayIcon_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles TrayIcon.MouseDoubleClick ToggleWindow() End Sub Private Sub ToggleWindow() If Visible = True Then Hide() Else WindowState = FormWindowState.Minimized Show() WindowState = FormWindowState.Normal End If End Sub Private Async Sub btnForceSync_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnForceSync.ItemClick btnForceSync.Enabled = False Await RunSync() btnForceSync.Enabled = True End Sub Private Sub ListBoxControl1_DrawItem(sender As Object, e As DevExpress.XtraEditors.ListBoxDrawItemEventArgs) Handles ListBoxControl1.DrawItem Dim oItem As LogLine = DirectCast(e.Item, LogLine) Select Case oItem.Level Case LogLevel.Warning e.Appearance.ForeColor = Color.DarkOrange e.Appearance.FontStyleDelta = FontStyle.Bold Case LogLevel.Error e.Appearance.ForeColor = Color.DarkRed e.Appearance.FontStyleDelta = FontStyle.Bold End Select End Sub Private Sub btnOpenConfig_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnOpenConfig.ItemClick Try Dim oPath = Application.StartupPath Process.Start("explorer.exe", oPath) Catch ex As Exception Logger.Error(ex) End Try End Sub End Class