Imports System.IO
Imports System.Guid
Imports System.Text.RegularExpressions
Imports DevExpress.XtraEditors
Imports DigitalData.Modules.Language
Imports Limilabs.Mail
Public Class ClassFilehandle
Public Shared Function Decide_FileHandle(pFilename As String, pHandletype As String)
Try
If pFilename.ToUpper.EndsWith(".MSG") Or pFilename.ToUpper.EndsWith(".EML") Then
CURRENT_MESSAGEID = ""
Dim oMail As IMail = EMAIL.Load_Email(pFilename)
If oMail.Attachments.Count > 0 Then
Dim oTitle As String
Dim oMessage As String
If USER_LANGUAGE = "de-DE" Then
oTitle = "Nachfrage zur Indexierung:"
oMessage = "Achtung: Die Email enthält Anhänge!" & vbNewLine & "Wollen Sie die Anhänge separat indexieren und herauslösen?"
Else
oTitle = "Question about Indexing:"
oMessage = "Attention: This Email contains Attachments!" & vbNewLine & "Do you want to extract the attachments and index them seperately?"
End If
Dim oResult As DialogResult
' Weird hack to force messagebox to be topmost
' https://stackoverflow.com/questions/1220882/keep-messagebox-show-on-top-of-other-application-using-c-sharp
oResult = MessageBox.Show(oMessage, oTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
If oResult = MsgBoxResult.Yes Then
Dim oIsFolderWatch = pHandletype.StartsWith("|FW")
Return Save_EmailAndAttachmentsToDisk(pFilename, oIsFolderWatch)
End If
End If
End If
If pFilename.ToUpper.EndsWith(".LNK") Then
If USER_LANGUAGE = "de-DE" Then
MsgBox("Verknüpfungen können nicht abgelegt werden!", MsgBoxStyle.Critical, "Global Indexer")
Else
MsgBox("Shortcuts cannot be droppped!", MsgBoxStyle.Critical, "Global Indexer")
End If
Return False
End If
Return Insert_GI_File(pFilename, pHandletype)
Catch ex As Exception
MsgBox("Unexpected Error in Decide_FileHandle: " & ex.Message, MsgBoxStyle.Critical)
Return False
End Try
End Function
Private Shared Function Save_EmailAndAttachmentsToDisk(pEmailFilePath As String, Optional pFolderWatch As Boolean = False) As Boolean
Try
Dim oMessageOnlyMarker As String = "|MSGONLY|"
Dim oExtractedAttachmentMarker As String = "|ATTMNTEXTRACTED|"
If pFolderWatch = True Then
oMessageOnlyMarker = "|FW_MSGONLY|"
oExtractedAttachmentMarker = "|FW_ATTMNTEXTRACTED|"
End If
Dim oSuccess As Boolean = False
LOGGER.Info("Converting file to Eml if needed: [{0}]", pEmailFilePath)
Dim oEmail As IMail = EMAIL.Load_Email(pEmailFilePath)
If oEmail.MessageID IsNot Nothing Then
CURRENT_MESSAGEID = oEmail.MessageID
Else
LOGGER.Info("Es konnte keine Message-ID gelesen werden. Eine GUID wird erzeugt!")
CURRENT_MESSAGEID = NewGuid.ToString()
End If
Dim oEmailFilePathWithoutAttachments = EMAIL.Remove_AttachmentsFromEmail(pEmailFilePath, "_excl_attachments")
TEMP_FILES.Add(oEmailFilePathWithoutAttachments)
If Insert_GI_File(oEmailFilePathWithoutAttachments, oMessageOnlyMarker) = True Then
oSuccess = True
Dim oAttachments As List(Of String) = EMAIL.Save_AttachmentsToDisk(pEmailFilePath)
LOGGER.Debug("Saved [{0}] attachments to disk.", oAttachments.Count)
For Each oAttachment In oAttachments
TEMP_FILES.Add(oAttachment)
LOGGER.Debug("Saved attachment [{0}].", oAttachment)
oSuccess = Insert_GI_File(oAttachment, oExtractedAttachmentMarker)
If oSuccess = False Then
LOGGER.Warn("Saving attachment to disk failed: [{0}]", oAttachment)
Exit For
End If
Next
End If
Return oSuccess
Catch ex As Exception
LOGGER.Warn("Saving email to disk failed (Email_Decay)")
LOGGER.Error(ex)
Return False
End Try
End Function
'Private Shared Function Email_Decay(msgname As String, Optional FW As Boolean = False)
' Try
' Dim msgonly As String = "|MSGONLY|"
' Dim ATT_EXTR As String = "|ATTMNTEXTRACTED|"
' If FW = True Then
' msgonly = "|FW_MSGONLY|"
' ATT_EXTR = "|FW_ATTMNTEXTRACTED|"
' End If
' Dim erfolgreich As Boolean = False
' Dim msg As New MSG.Message(msgname)
' If msg.InternetMessageId IsNot Nothing Then
' CURRENT_MESSAGEID = msg.InternetMessageId
' Else
' LOGGER.Info("Es konnte keine Message-ID gelesen werden. Eine GUID wird erzeugt!")
' Dim sGUID As String
' sGUID = System.Guid.NewGuid.ToString()
' CURRENT_MESSAGEID = sGUID
' End If
' 'Nur die MSGDatei ablegen
' Dim tempfile As String = Path.Combine(Path.GetTempPath, Path.GetFileNameWithoutExtension(msgname) & "_excl_att.msg")
' If File.Exists(tempfile) Then
' File.Delete(tempfile)
' End If
' Dim _msgEXAtt As New Msg.Message(msgname)
' _msgEXAtt.Attachments.Clear()
' _msgEXAtt.Save(tempfile)
' 'Datei in Array zum Templöschen speichern
' TEMP_FILES.Add(tempfile)
' If Insert_GI_File(tempfile, msgonly) = True Then
' erfolgreich = True
' 'Hier nun die Anhänge herauslösen
' Dim _msg As New Msg.Message(msgname)
' Dim i1 As Integer = 1
' LOGGER.Info(">> Anzahl der Attachments: " & _msg.Attachments.Count)
' For Each attachment As Independentsoft.Msg.Attachment In _msg.Attachments
' If erfolgreich = False Then
' Exit For
' End If
' Dim attachment_name As String
' If attachment.LongFileName Is Nothing Then
' attachment_name = attachment.DisplayName
' Else
' attachment_name = attachment.LongFileName
' End If
' If attachment.EmbeddedMessage IsNot Nothing Then
' attachment_name = Utils.RemoveInvalidCharacters(attachment_name)
' tempfile = Path.Combine(Path.GetTempPath, attachment_name & ".msg")
' tempfile = ClassFilehandle.Versionierung_Datei(tempfile)
' If tempfile <> String.Empty Then
' Dim oMessage = attachment.EmbeddedMessage
' oMessage.IsEmbedded = False
' oMessage.Save(tempfile)
' TEMP_FILES.Add(tempfile)
' LOGGER.Info(">> Attachment (" & i1 & "):" & tempfile)
' erfolgreich = Insert_GI_File(tempfile, ATT_EXTR)
' i1 += 1
' End If
' ElseIf Not attachment_name.Contains("inline") Then
' 'Sonderzeichen entfernen
' attachment_name = Utils.RemoveInvalidCharacters(attachment_name)
' tempfile = Path.Combine(Path.GetTempPath, attachment_name)
' tempfile = ClassFilehandle.Versionierung_Datei(tempfile)
' If tempfile <> "" Then
' attachment.Save(tempfile)
' 'Datei in Array zum Templöschen speichern
' TEMP_FILES.Add(tempfile)
' LOGGER.Info(">> Attachment (" & i1 & "):" & tempfile)
' 'nun der Insert des Anhanges
' erfolgreich = Insert_GI_File(tempfile, ATT_EXTR)
' i1 += 1
' End If
' End If
' Next
' End If
' Return erfolgreich
' Catch ex As Exception
' MsgBox("Error in Email_Decay: " & ex.Message, MsgBoxStyle.Critical)
' End Try
'End Function
Private Shared Function Insert_GI_File(filename As String, handleType As String)
Try
filename = filename.Replace("'", "''")
Dim oHash As String = String.Empty
If File.Exists(filename) Then
If (filename.ToUpper.EndsWith(".MSG") Or filename.ToUpper.EndsWith(".EML")) And (handleType = "|OUTLOOK_MESSAGE|" Or handleType = "|MSGONLY|") Then
oHash = FILESYSTEM.GetChecksumFromString(filename)
Else
oHash = FILESYSTEM.GetChecksum(filename)
End If
End If
Dim filename_only As String = Path.GetFileName(filename)
Dim ins As String = $"INSERT INTO TBGI_FILES_USER (FILENAME2WORK, USER@WORK, HANDLE_TYPE, FILENAME_ONLY, FILE_HASH) VALUES ('{filename}','{Environment.UserName}','{handleType}','{filename_only}', '{oHash}')"
Return ClassDatabase.Execute_non_Query(ins, True)
Catch ex As Exception
Return False
End Try
End Function
Public Shared Function IsFileInUse(ByVal fullFilePath As String) As Boolean
' Gibt zurück, ob die übergebene Datei momentan exklusiv zu haben ist.
' Prüft, ob die angegeben Datei aktuell durch eine
' andere Anwendung in Benutzung ist
Dim ff As Integer = FreeFile()
If File.Exists(fullFilePath) Then
Try
' Versuchen, die Datei mit *exklusiven* Lese- und
' Schreibrechten zu öffnen
FileOpen(ff, fullFilePath, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
Catch ex As Exception
' Ist ein Fehler aufgetreten, so wird nach außen hin generell
' davon ausgegangen, dass die Datei in Benutzung ist (obwohl
' auch andere Ursachen, etwa Rechteprobleme, möglich sind).
LOGGER.Info(">> FileInUse Message: " & ex.Message)
IsFileInUse = True
Finally
' Die eventuell geöffnete Datei schließen
FileClose(ff)
End Try
Return False
End If
End Function
Public Shared Function Versionierung_Datei(Dateiname As String)
Dim extension
Dim _NewFileString
Try
Dim version As Integer = 1
Dim Stammname As String = Path.GetDirectoryName(Dateiname) & "\" & Path.GetFileNameWithoutExtension(Dateiname).Trim()
extension = Path.GetExtension(Dateiname)
Dim _neuername As String = Stammname
'Dim MoveFilename As String = DATEINAME.Replace(element.Value, "")
'Überprüfen ob File existiert
If File.Exists(_neuername & extension) = False Then
_NewFileString = _neuername
Else
Do While File.Exists(_neuername & extension)
version = version + 1
_neuername = Stammname & "~" & version
_NewFileString = _neuername
Loop
End If
Return _NewFileString & extension
Catch ex As Exception
LOGGER.Info(" - Error in versioning file - error: " & vbNewLine & ex.Message)
LOGGER.Error(ex)
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in versioning file:")
Return ""
End Try
End Function
''
''' Ersetzt alle nicht zulässigen Zeichen im angegebenen Dateinamen
'''
''' Dateiname ohne Pfadangabe
''' Ersatzzeichen für alle unzulässigen Zeichen
''' im Dateinamen
Public Shared Function CleanFilename(ByVal sFilename As String, Optional ByVal REPLACEChar As String = "") As String
LOGGER.Info(" >> Filename before CleanFilename: '" & sFilename & "'")
If sFilename.Contains(".\") Then
sFilename = sFilename.Replace(".\", "\")
End If
'If sFilename.Contains("'") Then
' sFilename = sFilename.Replace("'", "")
'End If
'If sFilename.Contains("..") Then
' sFilename = sFilename.Replace("..", ".")
'End If
' alle nicht zulässigen Zeichen ersetzen
sFilename = System.Text.RegularExpressions.Regex.Replace(sFilename, REGEX_CLEAN_FILENAME, REPLACEChar)
sFilename = System.Text.RegularExpressions.Regex.Replace(sFilename, "[\\/:*?""<>|\r\n]", "", System.Text.RegularExpressions.RegexOptions.Singleline)
'Dim oCleanFileName As String = String.Join(REPLACEChar, sFilename.Split(Path.GetInvalidFileNameChars()))
Dim oCleanFileName As New System.IO.FileInfo(System.Text.RegularExpressions.Regex.Replace(sFilename, String.Format("[{0}]", String.Join(String.Empty, Path.GetInvalidFileNameChars)), REPLACEChar))
LOGGER.Info(" >> Filename after CleanFilename: '" & sFilename & "'")
Return sFilename
End Function
End Class