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 @@
+
+
+