Option Strict Off

Imports System.IO
Imports DigitalData.Modules.Logging
Imports Microsoft.Office.Interop

Public Class ClassFileDrop
    Inherits Base.BaseClass

    Public Property files_dropped As List(Of String)
    Private ReadOnly FileHandle As ClassFilehandle

    Public Class DroppedFile
        Public FilePath As String
        Public Enum DropType
            Filesystem
            OutlookAttachment
            OutlookMessage
        End Enum
    End Class

    Public Sub New(pLogConfig As LogConfig)
        MyBase.New(pLogConfig)
        FileHandle = New ClassFilehandle(pLogConfig)
    End Sub
    Public Function Drop_File(e As DragEventArgs) As Boolean
        Try
            Logger.Info("Available Drop Formats:")

            For Each oFormat As String In e.Data.GetFormats()
                Logger.Debug(oFormat)
            Next

            Logger.Info(">> Drop_File")
            files_dropped = New List(Of String)

            If e.Data.GetDataPresent(DataFormats.FileDrop) Then
                Dim MyFiles() As String
                Dim i As Integer
                ' Assign the files to an array. 
                MyFiles = DirectCast(e.Data.GetData(DataFormats.FileDrop), String())
                ' 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))
                    files_dropped.Add("|DROPFROMFSYSTEM|" & 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 = FileHandle.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 = FileHandle.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
                        files_dropped.Add("|OUTLOOK_ATTACHMENT|" & strOutFile)

                        '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 As Outlook.Application
                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 = FileHandle.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
                    files_dropped.Add("|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
