diff --git a/GUIs.ZooFlow/ClassFileDrop.vb b/GUIs.ZooFlow/ClassFileDrop.vb new file mode 100644 index 00000000..35bc37a9 --- /dev/null +++ b/GUIs.ZooFlow/ClassFileDrop.vb @@ -0,0 +1,150 @@ +Imports System.IO +Imports DigitalData.Modules.Logging +Imports Microsoft.Office.Interop + +Public Class ClassFileDrop + Public Shared files_dropped As String() + Private _LOGGER As Logger + Private clsFilehandle As ClassFilehandle + Public Sub New(LogConfig As LogConfig) + _LOGGER = LogConfig.GetLogger() + clsFilehandle = New ClassFilehandle(LogConfig) + End Sub + Public Function Drop_File(e As DragEventArgs) + Try + _LOGGER.Info("Available Drop Formats:") + + For Each oFormat As String In e.Data.GetFormats() + _LOGGER.Info(oFormat) + Next + + _LOGGER.Info(">> Drop_File") + files_dropped = Nothing + If e.Data.GetDataPresent(DataFormats.FileDrop) Then + Dim MyFiles() As String + Dim i As Integer + ' Assign the files to an array. + MyFiles = e.Data.GetData(DataFormats.FileDrop) + ' Loop through the array and add the files to the list. + For i = 0 To MyFiles.Length - 1 + _LOGGER.Info(">> Simple FileDrop - File: " & MyFiles(i)) + ReDim Preserve files_dropped(i) + files_dropped(i) = "|DROPFROMFSYSTEM|" & MyFiles(i) + ' ListBox1.Items.Add(MyFiles(i)) + Next + Return True + ElseIf (e.Data.GetDataPresent("FileGroupDescriptor")) AndAlso (e.Data.GetDataPresent("FileContents")) Then + '// the first step here is to get the stbFileName + '// of the attachment and + '// build a full-path name so we can store it + '// in the temporary folder + '// + '// set up to obtain the aryFileGroupDescriptor + '// and extract the file name + Dim stmInput As IO.Stream = CType(e.Data.GetData("FileGroupDescriptor"), IO.Stream) + Dim aryFileGroupDescriptor(512) As Byte ' = new byte[512] + stmInput.Read(aryFileGroupDescriptor, 0, 512) + '// used to build the stbFileName from the aryFileGroupDescriptor block + Dim stbFileName As System.Text.StringBuilder = New System.Text.StringBuilder("") + '// this trick gets the stbFileName of the passed attached file + Dim intCnt As Integer = 76 + Do While aryFileGroupDescriptor(intCnt) <> 0 + stbFileName.Append(Convert.ToChar(aryFileGroupDescriptor(intCnt), System.Globalization.CultureInfo.CreateSpecificCulture("de-DE"))) + intCnt += 1 + Loop + stmInput.Close() + 'Sonderzeichen entfernen + Dim Tempfilename = clsFilehandle.InvalidCharacters(stbFileName.ToString) + Dim anhaenge = e.Data.GetDataPresent("FileContents") + 'Dim path As String = "C:\VBProjekte\Dateien" + '// put the zip file into the temp directory + Dim strOutFile As String = Path.GetTempPath() & Tempfilename + '// create the full-path name + '// + '// Second step: we have the file name. + '// Now we need to get the actual raw + '// data for the attached file and copy it to disk so we work on it. + '// + '// get the actual raw file into memory + Dim msInput As IO.MemoryStream = CType(e.Data.GetData("FileContents", True), IO.MemoryStream) 'This returns nothing for an Email + If msInput Is Nothing = False Then + '// allocate enough bytes to hold the raw date + Dim aryFileBytes(CType(msInput.Length, Int32)) As Byte + '// set starting position at first byte and read in the raw data + msInput.Position = 0 + msInput.Read(aryFileBytes, 0, CType(msInput.Length, Int32)) + '// create a file and save the raw zip file to it + Dim fsOutput As IO.FileStream = New IO.FileStream(strOutFile, IO.FileMode.Create) '; + fsOutput.Write(aryFileBytes, 0, aryFileBytes.Length) + fsOutput.Close() ' // close the file + Dim resultVersion = clsFilehandle.Versionierung_Datei(strOutFile) + If resultVersion <> "" Then + strOutFile = resultVersion + End If + Dim finTemp As IO.FileInfo = New IO.FileInfo(strOutFile) + '// always good to make sure we actually created the file + If (finTemp.Exists = True) Then + ReDim Preserve files_dropped(0) + files_dropped(0) = "|OUTLOOK_ATTACHMENT|" & strOutFile + _LOGGER.Info(">> Drop an Attachment - File: " & strOutFile) + Return True + Else + _LOGGER.Info(">> Attachment File from Outlook could not be created") + End If + End If + End If + If e.Data.GetDataPresent("FileGroupDescriptor") Then + Dim oApp + Try + oApp = New Outlook.Application() + Catch ex As Exception + MsgBox("Unexpected error in Initialisieren von Outlook-API:" & vbNewLine & ex.Message & vbNewLine & vbNewLine & "Evtl ist Outlook nicht in der dafür vorgesehenen For") + End Try + + _LOGGER.Info(">> Drop of msg") + 'supports a drop of a Outlook message + Dim myobj As Object + For i As Integer = 1 To oApp.ActiveExplorer.Selection.Count + myobj = oApp.ActiveExplorer.Selection.Item(i) + Dim subj As String = myobj.Subject + If subj = "" Then + subj = "NO_SUBJECT" + End If + If subj.Contains("\") Then + subj = subj.Replace("\", "-") + End If + If subj.Contains("/") Then + subj = subj.Replace("/", "-") + End If + 'Sonderzeichen entfernen + subj = clsFilehandle.InvalidCharacters(subj) + 'hardcode a destination path for testing + Dim strFile As String = IO.Path.Combine(Path.GetTempPath, subj + ".msg") + strFile = strFile.Replace("?", "") + strFile = strFile.Replace("!", "") + strFile = strFile.Replace("%", "") + strFile = strFile.Replace("$", "") + _LOGGER.Info(">> Drop of msg - File:" & strFile) + Try + myobj.SaveAs(strFile) + Catch ex As Exception + MsgBox("Error in Save Email2Tempfile" & vbNewLine & ex.Message, MsgBoxStyle.Critical) + Return False + End Try + + ReDim Preserve files_dropped(i) + files_dropped(i) = "|OUTLOOK_MESSAGE|" & strFile + Next + Return True + 'Drop eines Outlook Attachments + End If + Catch ex As Exception + MsgBox("Error in Drop-File" & vbNewLine & ex.Message, MsgBoxStyle.Critical) + Return False + End Try + End Function + + + + +End Class diff --git a/GUIs.ZooFlow/ClassFilehandle.vb b/GUIs.ZooFlow/ClassFilehandle.vb new file mode 100644 index 00000000..bb52e953 --- /dev/null +++ b/GUIs.ZooFlow/ClassFilehandle.vb @@ -0,0 +1,239 @@ +Imports System.IO +Imports System.Text.RegularExpressions +Imports DigitalData.Modules.Logging +Imports Independentsoft + +Public Class ClassFilehandle + Private _LOGGER As Logger + Public Sub New(LogConfig As LogConfig) + _LOGGER = LogConfig.GetLogger() + End Sub + ''' + ''' Diese Funktion entfernt alle Zeichen aus dem übergebenen String + ''' die in Dateinamen nicht erlaubt sind. + ''' + ''' Der zu prüfende String + ''' String ohne nichterlaubte Zeichen + Public Function InvalidCharacters(Input As String) As String + Dim replacement = "" + 'Return System.Text.RegularExpressions.Regex.Replace(Input, "[\\/:*?""<>|\r\n]", "", System.Text.RegularExpressions.RegexOptions.Singleline) + Dim regexSearch = New String(Path.GetInvalidFileNameChars()) & New String(Path.GetInvalidPathChars()) + Dim r = New Regex(String.Format("[{0}]", Regex.Escape(regexSearch))) + Return r.Replace(Input, replacement) + End Function + Public Function Decide_FileHandle(filename As String, handletype As String) + Try + If filename.EndsWith(".msg") Then + My.Application.CurrMessageID = "" + Dim _msg As New Msg.Message(filename) + If _msg.Attachments.Count > 0 Then + Dim result As MsgBoxResult + + If My.Application.User.Language = "de-DE" Then + result = MessageBox.Show(New Form With {.TopMost = True}, "Achtung: Die Email enthält Anhänge!" & vbNewLine & "Wollen Sie die Anhänge separat indexieren und herauslösen?", "Nachfrage zur Indexierung:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + Else + result = MessageBox.Show(New Form With {.TopMost = True}, "Attention: This Email contains Attachments!" & vbNewLine & "Do you want to extract the attachments and index them seperately?", "Question about Indexing:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + End If + + If result = MsgBoxResult.Yes Then + If handletype.StartsWith("|FW") Then + Return Email_Decay(filename, True) + Else + Return Email_Decay(filename) + End If + End If + End If + End If + + If filename.ToUpper.EndsWith(".LNK") Then + If My.Application.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(filename, handletype) + Catch ex As Exception + MsgBox("Unexpected Error in Decide_FileHandle: " & ex.Message, MsgBoxStyle.Critical) + Return False + End Try + End Function + Private 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 Not msg.InternetMessageId Is Nothing Then + My.Application.CurrMessageID = msg.InternetMessageId + Else + _LOGGER.Info(">> Email_Decay: Es konnte keine Message-ID gelesen werden. Eine GUID wird erzeugt!") + Dim sGUID As String + sGUID = System.Guid.NewGuid.ToString() + My.Application.CurrMessageID = 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 + My.Application.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 = InvalidCharacters(attachment_name) + tempfile = Path.Combine(Path.GetTempPath, attachment_name & ".msg") + tempfile = CType(Versionierung_Datei(tempfile), String) + + If tempfile <> String.Empty Then + Dim oMessage = attachment.EmbeddedMessage + oMessage.Save(tempfile) + My.Application.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 = InvalidCharacters(attachment_name) + tempfile = Path.Combine(Path.GetTempPath, attachment_name) + tempfile = Versionierung_Datei(tempfile) + If tempfile <> "" Then + attachment.Save(tempfile) + 'Datei in Array zum Templöschen speichern + My.Application.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 Function Insert_GI_File(filename As String, handleType As String) + Try + filename = filename.Replace("'", "''") + + Dim filename_only As String = Path.GetFileName(filename) + Dim ins As String = "INSERT INTO TBGI_FILES_USER (FILENAME2WORK, USER@WORK,HANDLE_TYPE,FILENAME_ONLY) VALUES ('" & filename & "','" & Environment.UserName & "','" & handleType & "','" & filename_only & "')" + Return My.Database.ExecuteNonQuery(ins, True) + + Catch ex As Exception + Return False + End Try + End Function + Public 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 System.IO.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 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) + 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.Message) + 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 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, My.Application.GI_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 diff --git a/GUIs.ZooFlow/ClassInit.vb b/GUIs.ZooFlow/ClassInit.vb index 885dc878..48080dbd 100644 --- a/GUIs.ZooFlow/ClassInit.vb +++ b/GUIs.ZooFlow/ClassInit.vb @@ -37,7 +37,7 @@ Public Class ClassInit oInit.AddStep("Initializing User..", AddressOf InitializeUser, True) oInit.AddStep("Initializing IDB..", AddressOf InitializeIDB, True) oInit.AddStep("Loading 3rd-party licenses", AddressOf Initialize3rdParty, False) - + oInit.AddStep("Loading basic Configs", AddressOf Initialize3rdParty, False) ' === Init Schritte definieren AddHandler oInit.ProgressChanged, AddressOf ProgressChanged @@ -113,6 +113,19 @@ Public Class ClassInit Throw New InitException("Fehler beim Laden der Konfiguration!") End Try End Sub + Private Sub InitBasicData(MyApplication As My.MyApplication) + Try + Dim oSql = "SELECT * FROM TBGI_FUNCTION_REGEX" + My.Application.GI_DT_FUNCTION_REGEX = My.Database.GetDatatable(oSql) + + + + + Catch ex As Exception + _Logger.Error(ex) + Throw New InitException("Error in InitBasicData") + End Try + End Sub Private Sub InitializeIDB(MyApplication As My.MyApplication) If MyApplication.ModulesActive.Contains(MODULE_ZOOFLOW) Then diff --git a/GUIs.ZooFlow/MyApplication.vb b/GUIs.ZooFlow/MyApplication.vb index da5279b3..a4c7eea3 100644 --- a/GUIs.ZooFlow/MyApplication.vb +++ b/GUIs.ZooFlow/MyApplication.vb @@ -46,6 +46,11 @@ Namespace My Public Property ModulesActive As New List(Of String) Public Property ClipboardWatcher As New ClipboardWatcher.State Public Property IDB_ConnectionString As String + Public Property CurrMessageID As String + + Public Property GI_DT_FUNCTION_REGEX As DataTable + Public Property GI_REGEX_CLEAN_FILENAME As String = "[?*^""<>|]" + Public Property TEMP_FILES As List(Of String) = New List(Of String) End Class End Namespace diff --git a/GUIs.ZooFlow/ZooFlow.vbproj b/GUIs.ZooFlow/ZooFlow.vbproj index fb237e46..f6b3b44f 100644 --- a/GUIs.ZooFlow/ZooFlow.vbproj +++ b/GUIs.ZooFlow/ZooFlow.vbproj @@ -55,10 +55,17 @@ - - False + ..\GUIs.Common\bin\Debug\DigitalData.GUIs.Common.dll + + P:\Visual Studio Projekte\Bibliotheken\MSG .NET\Bin\Independentsoft.Msg.2.0.570.21482.dll + + + False + True + C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Outlook\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Outlook.dll + ..\packages\NLog.4.7.0\lib\net45\NLog.dll @@ -97,6 +104,8 @@ + + @@ -230,10 +239,6 @@ {B7D465A2-AE31-4CDF-A8B2-34B42D3EA84E} ClipboardWatcher - - {D20A6BF2-C7C6-4A7A-B34D-FA27D775A049} - Common - {44982F9B-6116-44E2-85D0-F39650B1EF99} Config @@ -326,6 +331,9 @@ + + +