FileFlow/Global_Indexer/frmStart.vb
2022-02-16 16:02:59 +01:00

607 lines
25 KiB
VB.net

Imports System.IO
Imports Microsoft.Office.Interop
Imports DLLLicenseManager
Imports System.Text
Imports System.Globalization
Imports System.Threading
Imports System.Runtime.InteropServices
Imports DigitalData.Modules.Language
Imports DigitalData.Modules.Windows
Imports DigitalData.Modules.License
Public Class frmStart
Public LicenseManager As LicenseManagerLegacy
Private Const WM_WINDOWPOSCHANGING As Integer = &H46
Private IndexForm As frmIndex
Private FileDrop As FileDrop
'Private DroppedFiles As List(Of FileDrop.DroppedFile)
Protected Overrides Sub WndProc(ByRef m As Message)
' Listen for operating system messages
Select Case m.Msg
Case WM_WINDOWPOSCHANGING
Window.SnapToDesktopBorder(Me, m.LParam)
End Select
MyBase.WndProc(m)
End Sub
Public Sub New()
Dim splash As New frmSplash()
splash.ShowDialog()
Thread.CurrentThread.CurrentUICulture = New CultureInfo(USER_LANGUAGE)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
End Sub
#Region "=== FORM EVENTS ==="
Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles Me.Load
Cursor = Cursors.WaitCursor
Try
IndexForm = New frmIndex()
FileDrop = New FileDrop(LOGCONFIG, "GLOBIX")
'Lizenz abgellaufen, überprüfen ob User Admin ist
If LICENSE_COUNT < USERCOUNT_LOGGED_IN Then
If USER_IS_ADMIN = True Then
LOGGER.Info(">> User is Admin - Timer will be started")
If USER_LANGUAGE = "de-DE" Then
MsgBox("Sie haben nun 3 Minuten Zeit eine neue Lizenz zu vergeben!", MsgBoxStyle.Information)
Else
MsgBox("You now got 3 minutes to update the license!", MsgBoxStyle.Information)
End If
'Timer starten
If TimerClose3Minutes.Enabled = False Then
TimerClose3Minutes.Start()
End If
End If
End If
If DOCTYPE_COUNT_ACTUAL > LICENSE_DOCTYPE_COUNT Then
If USER_IS_ADMIN = True Then
LOGGER.Info(">> User is Admin - Timer will be started")
If USER_LANGUAGE = "de-DE" Then
MsgBox("Sie haben nun 3 Minuten Zeit eine neue Lizenz zu vergeben!", MsgBoxStyle.Information)
Else
MsgBox("You now got 3 minutes to update the license!", MsgBoxStyle.Information)
End If
'Timer starten
If TimerClose3Minutes.Enabled = False Then
TimerClose3Minutes.Start()
End If
End If
End If
' SetLanguage()
If USER_IS_ADMIN = True Then
ToolStripSeparator1.Visible = True
AdministrationToolStripMenuItem.Visible = True
Else
ToolStripSeparator1.Visible = False
AdministrationToolStripMenuItem.Visible = False
End If
DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')")
TopMost = True
Catch ex As Exception
MsgBox("Unexpected Error in Load-Form" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
End Try
Cursor = Cursors.Default
End Sub
Private Sub frmStart_Shown(sender As Object, e As EventArgs) Handles Me.Shown
' SetLanguage()
If START_INCOMPLETE = True Then
If LICENSE_COUNT = 0 And LICENSE_EXPIRED = True Then
Else
Me.Close()
End If
Else
TimerFolderWatch.Start()
End If
Opacity = 0.7
CURRENT_DT_REGEX = DATABASE_ECM.GetDatatable("SELECT * FROM TBGI_FUNCTION_REGEX")
Start_Folderwatch()
ClassWindowLocation.LoadFormLocationSize(Me, LoadSize:=False)
Try
Me.LabelControl1.Location = New Point(13, 37)
Catch ex As Exception
Me.btnChoosefiles.Location = New Point(269, 37)
End Try
End Sub
Private Sub frmStart_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Try
If START_INCOMPLETE = False Then
Dim Sql = "DELETE FROM TBDD_USER_MODULE_LOG_IN WHERE USER_ID = " & USER_ID & " AND UPPER(MODULE) = UPPER('Global-Indexer')"
DATABASE_ECM.ExecuteNonQuery(Sql)
End If
ClassWindowLocation.SaveFormLocationSize(Me)
Catch ex As Exception
MsgBox("Unexpected Error in Closing Application: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
End Try
Try
IndexForm.DisposeViewer()
IndexForm.Dispose()
Catch ex As Exception
LOGGER.Error(ex)
End Try
End Sub
#End Region
#Region "=== DRAG DROP ==="
Private Sub frmMain_DragDrop(sender As Object, e As DragEventArgs) Handles MyBase.DragDrop
DragDropForm(e)
End Sub
Private Sub LabelControl1_DragDrop(sender As Object, e As DragEventArgs) Handles LabelControl1.DragDrop, btnChoosefiles.DragDrop
DragDropForm(e)
End Sub
Private Sub frmMain_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
Drag_Enter(sender, e)
End Sub
Private Sub LabelControl1_DragEnter(sender As Object, e As DragEventArgs) Handles LabelControl1.DragEnter, btnChoosefiles.DragEnter
Drag_Enter(sender, e)
End Sub
Sub DragDropForm(e As DragEventArgs)
Dim frmCollection = Application.OpenForms
If frmCollection.OfType(Of frmIndexFileList).Any Then
MsgBox("Please index the active file/mail first!", MsgBoxStyle.Exclamation, "Drag 'n Drop not allowed!")
Exit Sub
End If
'Erstmal alles löschen
DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')")
Dim oDroppedFiles = FileDrop.GetFiles(e)
If oDroppedFiles.Count > 0 Then
Check_Dropped_Files(oDroppedFiles)
End If
' TODO: REMOVE
'If ClassFileDrop.Drop_File(e) = True Then
' TimerCheckDroppedFiles.Start()
'End If
End Sub
Sub Drag_Enter(sender As Object, e As DragEventArgs)
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.All
' Console.WriteLine("DragEnter ...DragDrop")
ElseIf e.Data.GetDataPresent("FileGroupDescriptor") Then
'handle a message dragged from Outlook
e.Effect = DragDropEffects.Copy
' Console.WriteLine("DragEnter ...OutlookMessage")
ElseIf e.Data.GetDataPresent("aryFileGroupDescriptor") AndAlso (e.Data.GetDataPresent("FileContents")) Then
e.Effect = DragDropEffects.Copy
' Console.WriteLine("DragEnter ...Attachment from Outlook")
Else
'otherwise, do not handle
e.Effect = DragDropEffects.None
End If
End Sub
Sub Check_Dropped_Files(pDroppedFiles As List(Of FileDrop.DroppedFile))
Try
DATABASE_ECM.ExecuteNonQuery($"DELETE FROM TBGI_FILES_USER WHERE WORKED = 1 AND UPPER(USER@WORK) = UPPER('{Environment.UserName}')")
For Each oDroppedFile In pDroppedFiles
LOGGER.Info("Checking Dropped File: [{0}]", oDroppedFile.FilePath)
Dim oDropType = oDroppedFile.DropType
Dim oFileName = oDroppedFile.FilePath
If ClassIndexFunctions.CheckDuplicateFiles(oFileName, "Manuelle Ablage", oDropType) Then
FILE_HANDLER.Decide_FileHandle(oFileName, oDropType)
End If
Next
'For Each oFiledropString As String In ClassFileDrop.FilesDropped
' If oFiledropString IsNot Nothing Then
' LOGGER.Info(">> Check Drop-File: " & oFiledropString.ToString)
' Dim oLastPipe = oFiledropString.LastIndexOf("|")
' Dim oHandleType As String = oFiledropString.Substring(0, oLastPipe + 1)
' Dim oFilename As String = oFiledropString.Substring(oLastPipe + 1)
' If ClassIndexFunctions.CheckDuplicateFiles(oFilename, "Manuelle Ablage", oHandleType) Then
' ClassFilehandle.Decide_FileHandle(oFilename, oHandleType)
' End If
' End If
'Next
Dim sql As String = $"SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('{Environment.UserName}')"
DTACTUAL_FILES = Nothing
DTACTUAL_FILES = DATABASE_ECM.GetDatatable(sql)
ABORT_INDEXING = False
Dim oOnlyFilesFromFilesystem = True
For Each oRow As DataRow In DTACTUAL_FILES.Rows
If oRow.Item("HANDLE_TYPE") <> "|DROPFROMFSYSTEM|" Then
oOnlyFilesFromFilesystem = False
Exit For
End If
Next
If DTACTUAL_FILES.Rows.Count > 1 And oOnlyFilesFromFilesystem = False Then
frmIndexFileList.ShowDialog()
LOGGER.Debug("Email Indexing Dialog closed, checking for files to be indexed")
DTACTUAL_FILES = Nothing
DTACTUAL_FILES = DATABASE_ECM.GetDatatable(sql)
End If
If DTACTUAL_FILES.Rows.Count = 0 Then
LOGGER.Debug("No files to be indexed, aborting!")
If USER_LANGUAGE = "de-DE" Then
MessageBox.Show("Es wurden keine Dateien für die Indexierung ausgewählt. Der Indexierungsvorgang wird beendet.", Text, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
Else
MessageBox.Show("You did not select any files for indexing. Indexing will be stopped.", Text, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
End If
End If
For Each Filerow As DataRow In DTACTUAL_FILES.Rows
Dim oFileString As String = Filerow.Item("FILENAME2WORK")
Dim oFileGuid = Filerow.Item("GUID")
Dim oFileHash = Utils.NotNull(Filerow.Item("FILE_HASH"), "")
LOGGER.Info("Processing user file {0}", oFileString)
CURRENT_FILENAME = oFileString
CURRENT_WORKFILE_GUID = oFileGuid
CURRENT_WORKFILE = oFileString
CURRENT_WORKFILE_HASH = oFileHash
LOGGER.Info(">> CURRENT_WORKFILE: " & CURRENT_WORKFILE)
If IO.File.Exists(CURRENT_WORKFILE) = True And DTACTUAL_FILES.Rows.Count > 0 Then
Open_IndexDialog()
Else
LOGGER.Warn("Trying to index non-existent file [{0}]", CURRENT_WORKFILE)
End If
' If multi-indexing is active, all files have been indexed by now, so we can leave the loop
If MULTIINDEXING_ACTIVE Then
Exit For
End If
Next
Show()
Catch ex As Exception
LOGGER.Error(ex)
MsgBox("Unexpected Error in Check_Dropped_Files:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
Finally
' Clear all temp files after indexing
FILE_HANDLER.Clear_Tempfiles()
EMAIL.Clear_TempFiles()
FileDrop.RemoveTempDirectory()
End Try
End Sub
'Private Sub TimerCheckDroppedFiles_Tick(sender As Object, e As EventArgs) Handles TimerCheckDroppedFiles.Tick
' TimerCheckDroppedFiles.Stop()
' Check_Dropped_Files()
'End Sub
Private Sub btnChoosefiles_Click(sender As Object, e As EventArgs) Handles btnChoosefiles.Click
Try
Dim oFileName As String
Dim oOpenFileDialog As New OpenFileDialog With {
.RestoreDirectory = True,
.Multiselect = True
}
If oOpenFileDialog.ShowDialog() = DialogResult.OK Then
'TODO: REMOVE
'ClassFileDrop.FilesDropped.Clear()
Dim oDroppedFiles As New List(Of FileDrop.DroppedFile)
For Each oFileName In oOpenFileDialog.FileNames
LOGGER.Info(">> Chosen File: " & oFileName)
'TODO: REMOVE
'ClassFileDrop.FilesDropped.Add("|DROPFROMFSYSTEM|" & oFileName)
Dim oFile = New FileDrop.DroppedFile(oFileName) With {
.FileFormat = FileDrop.FileFormat.LocalFile
}
oDroppedFiles.Add(oFile)
Next
'TimerCheckDroppedFiles.Start()
Check_Dropped_Files(oDroppedFiles)
End If
Catch ex As Exception
MsgBox("Unexpected Error in Choose Files for Indexing:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
#End Region
#Region "=== MENU ==="
Private Sub GlobalIndexerEinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs)
Try
Me.Hide()
frmAdministration.ShowDialog()
Me.Show()
Catch ex As Exception
MsgBox("Fehler in der Administration:" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical, Text)
LOGGER.Error(ex)
End Try
End Sub
Private Sub HistoryIndexierteDateienToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HistoryIndexierteDateienToolStripMenuItem.Click
frmHistory.ShowDialog()
End Sub
Private Sub InfoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles InfoToolStripMenuItem.Click
Me.TopMost = False
frmAbout.ShowDialog()
Me.TopMost = True
End Sub
Private Sub AdministrationToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AdministrationToolStripMenuItem.Click
Try
Me.Hide()
frmAdministration.ShowDialog()
Me.Show()
Catch ex As Exception
MsgBox("Fehler in der Administration:" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical, Text)
LOGGER.Error(ex)
End Try
End Sub
Private Sub GrundeinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles GrundeinstellungenToolStripMenuItem.Click
Me.TopMost = False
frmConfig_Basic.ShowDialog()
'Wurde die Sprache in der Konfiguration geändert
If LANGUAGE_CHANGED = True Then
Try
If USER_LANGUAGE = "de-DE" Then
MsgBox("Zur letzendlichen Neukonfiguration der Sprache ist ein Neustart notwendig!", MsgBoxStyle.Information, Text)
Else
MsgBox("For the final changing of language, a restart is required!", MsgBoxStyle.Information, Text)
End If
Application.Restart()
Catch ex As Exception
LOGGER.Error(ex)
MsgBox("Please restart the application manually.", MsgBoxStyle.Information, Text)
End Try
Else
Start_Folderwatch()
Me.TopMost = True
End If
End Sub
#End Region
#Region "=== FOLDERWATCH ==="
Sub Start_Folderwatch()
If CURRENT_FOLDERWATCH = String.Empty Then
FW_started = False
End If
If CURRENT_SCAN_FOLDERWATCH = String.Empty Then
CONFIG.Config.FolderWatchScanStarted = False
CONFIG.Save()
End If
If CURRENT_FOLDERWATCH <> "" Or CURRENT_SCAN_FOLDERWATCH <> "" Then
If FWFunction_STARTED = True Then
tslblFW.Visible = True
Else
tslblFW.Visible = False
End If
Try
If CONFIG.Config.FolderWatchScanStarted = True Then
LOGGER.Info(">> FWSCAN started - Checking file:" & CURRENT_SCAN_FOLDERWATCH)
Dim fileEntries As String() = Directory.GetFiles(CURRENT_SCAN_FOLDERWATCH)
' Process the list of files found in the directory.
Dim oFileName As String
For Each oFileName In fileEntries
LOGGER.Info(">> Scanfolder after startup: Checking file:" & oFileName)
For Each row As DataRow In DTEXCLUDE_FILES.Rows
Dim content As String = row.Item(0).ToString.ToLower
If oFileName.ToLower.Contains(content) Then
Exit Sub
End If
Next
Dim oHandleType As String
If oFileName.ToLower.EndsWith(".msg") Then
oHandleType = "|FW_OUTLOOK_MESSAGE|"
Else
oHandleType = "|FW_SIMPLEINDEXER|"
End If
'Die Datei übergeben
LOGGER.Info(">> Adding file from Scanfolder after startup:" & oFileName)
If ClassIndexFunctions.CheckDuplicateFiles(oFileName, "FolderWatch/Scan") Then
FILE_HANDLER.Decide_FileHandle(oFileName, oHandleType)
End If
Next oFileName
Else
LOGGER.Info(">> FWSCAN not started")
End If
Catch ex As Exception
LOGGER.Info(">> Error while starting folderwatch scan: " & ex.Message)
LOGGER.Error(ex)
End Try
Try
If FW_started = True Then
LOGGER.Info(">> FW_started started - Checking file:" & CURRENT_FOLDERWATCH)
Dim fileEntries As String() = Directory.GetFiles(CURRENT_FOLDERWATCH)
' Process the list of files found in the directory.
Dim oFileName As String
For Each oFileName In fileEntries
LOGGER.Info(">> Folderwach after startup: Checking file:" & oFileName)
For Each row As DataRow In DTEXCLUDE_FILES.Rows
Dim content As String = row.Item(0).ToString.ToLower
If oFileName.ToLower.Contains(content) Then
Exit Sub
End If
Next
Dim handleType As String
If oFileName.ToLower.EndsWith(".msg") Then
handleType = "|FW_OUTLOOK_MESSAGE|"
Else
handleType = "|FW_SIMPLEINDEXER|"
End If
'Die Datei übergeben
LOGGER.Info(">> Adding file from Folderwatch after startup:" & oFileName)
If ClassIndexFunctions.CheckDuplicateFiles(oFileName, "FolderWatch/Scan") Then
FILE_HANDLER.Decide_FileHandle(oFileName, handleType)
End If
Next oFileName
Else
LOGGER.Info(">> FW_started not started")
End If
Catch ex As Exception
LOGGER.Info(">> Error while starting folderwatch: " & ex.Message)
LOGGER.Error(ex)
End Try
If TimerFolderWatch.Enabled = False Then
TimerFolderWatch.Start()
End If
End If
End Sub
Private Sub TimerFolderWatch_Tick(sender As Object, e As EventArgs) Handles TimerFolderWatch.Tick
If DATABASE_ECM.DBInitialized = False Then
TimerFolderWatch.Enabled = False
Dim title = "Critical Error"
Dim message = $"Database could not be reached. Global Indexer will NOT work without a database!{vbCrLf}{vbCrLf}Please check your connection.{vbCrLf}The Application will exit now."
If USER_LANGUAGE = "de-DE" Then
title = "Kritischer Fehler"
message = $"Die Datenbank konnte nicht erreicht werden. Global Indexer funktioniert NICHT ohne Datenbankverbindung{vbCrLf}{vbCrLf}Bitte überprüfen Sie Ihre Netzwerkverbindung oder benachrichtigen Sie Ihren Administrator.{vbCrLf}Die Anwendung wird nun geschlossen."
End If
Dim result = MsgBox(message, MsgBoxStyle.Critical, title)
If result = MsgBoxResult.Ok Then
Application.ExitThread()
End If
Else
Try
' JenneJ, 11.02.2019:
' Keine Folderwatch Dateien verarbeiten, wenn gerade Indexiert wird,
' dadurch würden die Globalen Variablen überschrieben
' und in Folge die falschen Dateien Indexiert!
If INDEXING_ACTIVE Or MULTIINDEXING_ACTIVE Then
Exit Sub
End If
If FW_started = True Or CONFIG.Config.FolderWatchScanStarted = True Then
'Prüfen ob alle Files abgearbeitet wurden
Dim sql = "SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND HANDLE_TYPE like '%|FW%' AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')"
DTACTUAL_FILES = DATABASE_ECM.GetDatatable(sql)
If DTACTUAL_FILES.Rows.Count > 0 Then
ABORT_INDEXING = False
' Dim fil As String
Me.TimerFolderWatch.Stop()
For Each row As DataRow In DTACTUAL_FILES.Rows
Dim FILEGUID = row.Item("GUID")
If ABORT_INDEXING = True Then
Exit For
End If
Dim FileForWork As String = row.Item(1)
LOGGER.Info(">> In Timer Folderwatch - File: " & FileForWork)
Dim fileInUse As Boolean = FILE_HANDLER.IsFileInUse(FileForWork)
Dim fileexists As Boolean = System.IO.File.Exists(FileForWork)
If fileInUse = False Then
If fileexists = True Then
CURRENT_FILENAME = FileForWork
CURRENT_WORKFILE = FileForWork
CURRENT_WORKFILE_GUID = row.Item("GUID")
CURRENT_WORKFILE_HASH = row.Item("FILE_HASH")
Open_IndexDialog()
Else
LOGGER.Info(">> File not existing - Row will be deleted!")
Dim del = String.Format("DELETE FROM TBGI_FILES_USER WHERE GUID = {0}", FILEGUID)
DATABASE_ECM.ExecuteNonQuery(del)
End If
Else
LOGGER.Info(">> file '" & row.Item(1) & "' could not be opened exclusively - fileInUse!")
End If
Next
Me.TimerFolderWatch.Start()
End If
tslblFW.Visible = True
Else
tslblFW.Visible = False
End If
Catch ex As Exception
If ex.Message.Contains("Sammlung wurde geändert") Or ex.Message.Contains("Enumeration") Then
Else
MsgBox("Error in Work FolderWatch-File:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
End If
End Try
End If
End Sub
#End Region
Sub Open_IndexDialog()
Try
Hide()
IndexForm.ShowDialog()
Catch ex As Exception
LOGGER.Error(ex)
MsgBox(ex.Message, MsgBoxStyle.Critical)
Finally
Show()
End Try
End Sub
Private Sub TimerClose3Minutes_Tick(sender As Object, e As EventArgs) Handles TimerClose3Minutes.Tick
If LICENSE_EXPIRED = True Or LICENSE_COUNT < USERCOUNT_LOGGED_IN Then
If USER_LANGUAGE = "de-DE" Then
MsgBox("Global Indexer wird nun geschlossen, weil keine neue Lizenzdaten eingegeben wurden!", MsgBoxStyle.Information)
Else
MsgBox("Global Indexer will now be closed, cause no new license was updated!", MsgBoxStyle.Information)
End If
Me.Close()
Else
TimerClose3Minutes.Stop()
End If
End Sub
Private Sub frmStart_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
If e.KeyCode = Keys.F12 Then
If START_INCOMPLETE Then
frmLicense.ShowDialog()
End If
End If
End Sub
End Class