Release für ewa
This commit is contained in:
@@ -5,6 +5,131 @@ Imports Microsoft.Office.Interop.Outlook
|
||||
Public Class ClassDragDrop
|
||||
Public Shared files_dropped As String()
|
||||
Public Shared Event FilesDroppedReady(ByVal files As String())
|
||||
|
||||
''' <summary>
|
||||
''' Eindeutiges Drag-Format für DocID-Transfers zwischen frmNodeNavigation-Instanzen.
|
||||
''' Muss mit frmNodeNavigation.DRAGDROP_FORMAT_DOCID identisch sein.
|
||||
''' </summary>
|
||||
Public Shared ReadOnly DRAGDROP_FORMAT_DOCID As String = "DD_RecordOrganizer_DocID"
|
||||
''' <summary>
|
||||
''' Zeichen, die im Dateinamen Probleme bei DB-Import und Dateihandling verursachen können.
|
||||
''' </summary>
|
||||
Private Shared ReadOnly ProblematicChars As Char() = {
|
||||
"'"c, "`"c, ";"c, "%"c, "&"c, "+"c, "#"c, "~"c,
|
||||
"{"c, "}"c, "["c, "]"c, "^"c, "="c, "@"c
|
||||
}
|
||||
|
||||
Private Shared Function CheckAndSanitizeFilename(filePath As String) As String
|
||||
Try
|
||||
Dim dir As String = Path.GetDirectoryName(filePath)
|
||||
Dim originalName As String = Path.GetFileNameWithoutExtension(filePath)
|
||||
Dim ext As String = Path.GetExtension(filePath)
|
||||
|
||||
' ── 1) Unicode-Normalisierung NFD → NFC ──────────────────────────────
|
||||
Dim normalizedName As String = originalName.Normalize(System.Text.NormalizationForm.FormC)
|
||||
Dim hadNormalizationIssue As Boolean = (normalizedName <> originalName)
|
||||
|
||||
If hadNormalizationIssue Then
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: NFD-Encoding erkannt in [{originalName}{ext}]")
|
||||
|
||||
Dim normMsg As String
|
||||
If USER_LANGUAGE <> "de-DE" Then
|
||||
normMsg = $"The filename contains Unicode characters in decomposed form (NFD encoding)." &
|
||||
vbCrLf & vbCrLf &
|
||||
$"File: {originalName}{ext}" & vbCrLf & vbCrLf &
|
||||
"This causes garbled characters in the database (e.g. ü → Ru¨ckbau)." & vbCrLf & vbCrLf &
|
||||
"Please rename the file and try again." & vbCrLf &
|
||||
"The import of this file has been aborted."
|
||||
Else
|
||||
normMsg = $"Der Dateiname enthält nicht sichtbare Unicode-Zeichen in dekomponiierter Form (NFD-Kodierung)." &
|
||||
vbCrLf & vbCrLf &
|
||||
$"Datei: {originalName}{ext}" & vbCrLf & vbCrLf &
|
||||
"Dies kann zu kryptischen Zeichen in der Datenbank (z.B. ü → Ru¨ckbau) oder Problemen beim Import nach windream führen." & vbCrLf & vbCrLf &
|
||||
"Ursache dafür kann sein, das die Datei aus einer NICHT Windows Umgebung erstellt wurde. (MacOS, Linux etc)" & vbCrLf &
|
||||
"Bitte benennen Sie die Datei um und versuchen Sie es erneut." & vbCrLf &
|
||||
"Der Import dieser Datei wurde abgebrochen."
|
||||
End If
|
||||
|
||||
Dim normCaption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname")
|
||||
MessageBox.Show(normMsg, normCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen wegen NFD-Problem [{originalName}{ext}].")
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
' ── 2) Leerzeichen-Probleme prüfen (führend, abschließend, doppelt) ──
|
||||
Dim hasLeadingOrTrailingSpace As Boolean = (originalName <> originalName.Trim())
|
||||
Dim hasDoubleSpace As Boolean = originalName.Contains(" ") ' zwei aufeinanderfolgende Leerzeichen
|
||||
|
||||
If hasLeadingOrTrailingSpace OrElse hasDoubleSpace Then
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: Leerzeichen-Problem in [{originalName}{ext}]")
|
||||
|
||||
Dim spaceMsg As String
|
||||
If USER_LANGUAGE <> "de-DE" Then
|
||||
spaceMsg = $"The filename contains leading, trailing or consecutive spaces:" &
|
||||
vbCrLf & vbCrLf &
|
||||
$"File: ""{originalName}{ext}""" & vbCrLf & vbCrLf &
|
||||
"This can cause problems during database import or file comparisons." & vbCrLf & vbCrLf &
|
||||
"Please rename the file (remove extra spaces) and try again." & vbCrLf &
|
||||
"The import of this file has been aborted."
|
||||
Else
|
||||
spaceMsg = $"Der Dateiname enthält führende, abschließende oder doppelte Leerzeichen:" &
|
||||
vbCrLf & vbCrLf &
|
||||
$"Datei: ""{originalName}{ext}""" & vbCrLf & vbCrLf &
|
||||
"Dies kann beim Datenbankimport oder Dateivergleichen zu Problemen führen." & vbCrLf & vbCrLf &
|
||||
"Bitte benennen Sie die Datei um (Leerzeichen entfernen) und versuchen Sie es erneut." & vbCrLf &
|
||||
"Der Import dieser Datei wurde abgebrochen."
|
||||
End If
|
||||
|
||||
Dim spaceCaption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname")
|
||||
MessageBox.Show(spaceMsg, spaceCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen wegen Leerzeichen-Problem [{originalName}{ext}].")
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
' ── 3) Problematische Sonderzeichen prüfen ───────────────────────────
|
||||
Dim found As New System.Text.StringBuilder()
|
||||
For Each c As Char In ProblematicChars
|
||||
If originalName.IndexOf(c) >= 0 Then
|
||||
If found.Length > 0 Then found.Append(" ")
|
||||
found.Append($"'{c}'")
|
||||
End If
|
||||
Next
|
||||
|
||||
If found.Length = 0 Then
|
||||
Return filePath
|
||||
End If
|
||||
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: Problematische Zeichen in [{originalName}{ext}]: {found}")
|
||||
|
||||
Dim msg As String
|
||||
If USER_LANGUAGE <> "de-DE" Then
|
||||
msg = $"The filename contains characters that cause problems during database import or file handling:" &
|
||||
vbCrLf & vbCrLf &
|
||||
$"File: {originalName}{ext}" & vbCrLf &
|
||||
$"Problematic chars: {found}" & vbCrLf & vbCrLf &
|
||||
"Please rename the file and try again." & vbCrLf &
|
||||
"The import of this file has been aborted."
|
||||
Else
|
||||
msg = $"Der Dateiname enthält nicht sichtbare Zeichen, die beim Datenbankimport oder späteren Dateihandling in windream Probleme verursachen:" &
|
||||
vbCrLf & vbCrLf &
|
||||
$"Datei: {originalName}{ext}" & vbCrLf &
|
||||
$"Problematische Zeichen: {found}" & vbCrLf & vbCrLf &
|
||||
"Ursache dafür kann sein, das die Datei aus einer NICHT Windows Umgebung erstellt wurde. (MacOS, Linux etc)" & vbCrLf &
|
||||
"Bitte benennen Sie die Datei um und versuchen Sie es erneut." & vbCrLf &
|
||||
"Der Import dieser Datei wurde abgebrochen."
|
||||
End If
|
||||
|
||||
Dim caption As String = If(USER_LANGUAGE <> "de-DE", "Invalid Filename", "Ungültiger Dateiname")
|
||||
MessageBox.Show(msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
LOGGER?.Warn($"CheckAndSanitizeFilename: Import abgebrochen für [{originalName}{ext}].")
|
||||
Return Nothing
|
||||
|
||||
Catch ex As System.Exception
|
||||
LOGGER?.Warn("CheckAndSanitizeFilename Fehler: " & ex.Message)
|
||||
Return filePath
|
||||
End Try
|
||||
End Function
|
||||
|
||||
Public Shared Function Drop_File(e As DragEventArgs)
|
||||
Try
|
||||
LOGGER.Debug("In Drop_File....")
|
||||
@@ -12,10 +137,6 @@ Public Class ClassDragDrop
|
||||
|
||||
files_dropped = New String() {}
|
||||
|
||||
' WICHTIG: DB-Löschung NICHT im UI-Thread erzwingen.
|
||||
' => Verschiebe in aufrufenden Code per BeginInvoke/Task.Run (siehe Kommentar unten).
|
||||
' MYDB_ECM?.ExecuteNonQuery(Sql)
|
||||
|
||||
Dim hasOutlookUnicode As Boolean = e.Data.GetDataPresent("FileGroupDescriptorW")
|
||||
Dim hasOutlookAnsi As Boolean = e.Data.GetDataPresent("FileGroupDescriptor")
|
||||
Dim hasOutlookContents As Boolean = e.Data.GetDataPresent("FileContents")
|
||||
@@ -30,16 +151,14 @@ Public Class ClassDragDrop
|
||||
End If
|
||||
|
||||
'2) ATTACHMENT oder komplette Mail aus Outlook/WebView2: KEIN Descriptor+Contents, ABER FileDrop vorhanden
|
||||
' => zuerst FileDrop verarbeiten. Wenn leer (delayed rendering), dann Fallback über Outlook COM Selection/Inspector
|
||||
If hasFileDrop AndAlso (hasChromiumMime OrElse hasFileNameW) AndAlso Not hasOutlookContents Then
|
||||
LOGGER?.Debug("WebView2/Outlook Attachment or Mail: try FileDrop, skip Outlook COM initially")
|
||||
Dim ok As Boolean = HandleFileDrop(e)
|
||||
If ok Then Return True
|
||||
|
||||
' FileDrop leer -> Fallback: versuche ausgewählte Mail via Outlook COM zu speichern
|
||||
LOGGER?.Warn("FileDrop vorhanden, aber leer. Fallback auf Outlook COM für komplette Mail.")
|
||||
ScheduleOutlookComFallback()
|
||||
Return True ' Wichtig: UI-Thread nicht blockieren; wir verarbeiten asynchron.
|
||||
Return True
|
||||
End If
|
||||
|
||||
'3) Outlook Mail (.msg): Descriptor ohne Contents ODER Chromium/WebView2 Indikatoren – nur wenn KEIN FileDrop vorhanden
|
||||
@@ -70,7 +189,6 @@ Public Class ClassDragDrop
|
||||
Return True
|
||||
Else
|
||||
LOGGER?.Warn("Outlook: Keine Auswahl im Explorer und kein ActiveInspector.CurrentItem verfügbar.")
|
||||
' Namen loggen – aber zurück zum FileDrop-Fallback
|
||||
If hasFileNameW Then
|
||||
Dim namesObj As Object = e.Data.GetData(If(e.Data.GetDataPresent("FileNameW"), "FileNameW", "FileName"), True)
|
||||
Dim names As String() = TryCast(namesObj, String())
|
||||
@@ -116,13 +234,11 @@ CheckFileDrop:
|
||||
|
||||
LOGGER?.Warn("Drop_File: Kein extrahierbarer Inhalt. Bitte Attachment aus der Nachrichtenliste ziehen oder zunächst speichern.")
|
||||
Return False
|
||||
|
||||
|
||||
End Function
|
||||
|
||||
' FileDrop defensiv behandeln – erst ohne, dann mit autoConvert
|
||||
Private Shared Function HandleFileDrop(e As DragEventArgs) As Boolean
|
||||
Try
|
||||
' Versuch1: ohne AutoConvert
|
||||
Dim rawObj As Object = e.Data.GetData(DataFormats.FileDrop)
|
||||
Dim rawFiles As String() = TryCast(rawObj, String())
|
||||
If Not (rawFiles Is Nothing OrElse rawFiles.Length = 0) Then
|
||||
@@ -133,7 +249,6 @@ CheckFileDrop:
|
||||
Return True
|
||||
End If
|
||||
|
||||
' Versuch2: mit AutoConvert (delayed rendering)
|
||||
Dim convObj As Object = e.Data.GetData(DataFormats.FileDrop, True)
|
||||
Dim convFiles As String() = TryCast(convObj, String())
|
||||
If Not (convFiles Is Nothing OrElse convFiles.Length = 0) Then
|
||||
@@ -151,11 +266,21 @@ CheckFileDrop:
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
Private Shared Sub AppendDroppedFile(prefix As String, filePath As String)
|
||||
|
||||
''' <summary>
|
||||
''' Hängt eine Datei an files_dropped an – mit vorheriger Sonderzeichen-Prüfung.
|
||||
''' Gibt False zurück wenn der Dateiname ungültig ist.
|
||||
''' </summary>
|
||||
Private Shared Function AppendDroppedFile(prefix As String, filePath As String) As Boolean
|
||||
Dim checkedPath As String = CheckAndSanitizeFilename(filePath)
|
||||
If checkedPath Is Nothing Then
|
||||
Return False
|
||||
End If
|
||||
Dim idx As Integer = files_dropped.Length
|
||||
ReDim Preserve files_dropped(idx)
|
||||
files_dropped(idx) = prefix & filePath
|
||||
End Sub
|
||||
files_dropped(idx) = prefix & checkedPath
|
||||
Return True
|
||||
End Function
|
||||
|
||||
Private Shared Sub SaveMailItemToTemp(ByVal mailObj As Object)
|
||||
Dim subj As String = ""
|
||||
@@ -197,7 +322,6 @@ CheckFileDrop:
|
||||
Next
|
||||
|
||||
If saved Then
|
||||
' UI-Thread benachrichtigen
|
||||
Dim uiForm = If(System.Windows.Forms.Application.OpenForms.Count > 0, System.Windows.Forms.Application.OpenForms(0), Nothing)
|
||||
If uiForm IsNot Nothing Then
|
||||
uiForm.BeginInvoke(
|
||||
@@ -209,7 +333,6 @@ CheckFileDrop:
|
||||
End Try
|
||||
End Sub)
|
||||
Else
|
||||
' Falls kein Form verfügbar, zumindest Event auslösen (Listener müssen ggf. selbst marshalen)
|
||||
RaiseEvent FilesDroppedReady(files_dropped)
|
||||
End If
|
||||
Else
|
||||
@@ -270,6 +393,12 @@ CheckFileDrop:
|
||||
Public Shared Sub Drag_enter(e As DragEventArgs)
|
||||
Try
|
||||
My.Settings.WD_INDEXDOKART_SAVE = ""
|
||||
' ✅ DocID-Format hat Vorrang – Early Exit
|
||||
If e.Data.GetDataPresent(DRAGDROP_FORMAT_DOCID) Then
|
||||
e.Effect = DragDropEffects.Copy
|
||||
LOGGER?.Debug("DragEnter ... DocID-Format erkannt (Inter-Instance Transfer)")
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim hasOutlookUnicode As Boolean = e.Data.GetDataPresent("FileGroupDescriptorW")
|
||||
Dim hasOutlookAnsi As Boolean = e.Data.GetDataPresent("FileGroupDescriptor")
|
||||
@@ -297,5 +426,4 @@ CheckFileDrop:
|
||||
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
End Class
|
||||
Reference in New Issue
Block a user