Windows: Add filedrop class
This commit is contained in:
parent
607f7e6445
commit
c39d0ea794
313
Windows/FileDrop.vb
Normal file
313
Windows/FileDrop.vb
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
Imports System.Text
|
||||||
|
Imports DigitalData.Modules.Base
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
Imports DigitalData.Modules.Language.Utils
|
||||||
|
Imports Microsoft.Office.Interop
|
||||||
|
Imports System.Windows
|
||||||
|
|
||||||
|
Public Class FileDrop
|
||||||
|
Inherits BaseClass
|
||||||
|
|
||||||
|
Public Enum FileFormat
|
||||||
|
OutlookAttachment
|
||||||
|
OutlookMail
|
||||||
|
ThunderbirdAttachment
|
||||||
|
ThunderbirdMail
|
||||||
|
MailWithoutAttachments
|
||||||
|
LocalFile
|
||||||
|
Unknown
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
Public Enum FileSource
|
||||||
|
DragDrop
|
||||||
|
FolderWatch
|
||||||
|
Attachment
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
Public Class DroppedFile
|
||||||
|
Public ReadOnly Property FilePath As String
|
||||||
|
Public Property FileFormat As FileFormat
|
||||||
|
Public Property FileSource As FileSource = FileSource.DragDrop
|
||||||
|
|
||||||
|
Public Sub New(pFilePath As String)
|
||||||
|
FilePath = pFilePath
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub New(pFilePath As String, pDropType As String)
|
||||||
|
MyClass.New(pFilePath)
|
||||||
|
|
||||||
|
Select Case pDropType
|
||||||
|
Case "LOCAL_FILE" ' "|DROPFROMFSYSTEM|"
|
||||||
|
FileFormat = FileFormat.LocalFile
|
||||||
|
|
||||||
|
Case "OUTLOOK_ATTACHMENT" ' "|OUTLOOK_ATTACHMENT|"
|
||||||
|
FileFormat = FileFormat.OutlookAttachment
|
||||||
|
|
||||||
|
Case "OUTLOOK_MAIL" ' "|OUTLOOK_MESSAGE|"
|
||||||
|
FileFormat = FileFormat.OutlookMail
|
||||||
|
|
||||||
|
Case "|MSGONLY|"
|
||||||
|
FileFormat = FileFormat.MailWithoutAttachments
|
||||||
|
|
||||||
|
Case "|FW_OUTLOOK_MESSAGE|"
|
||||||
|
FileFormat = FileFormat.OutlookMail
|
||||||
|
FileSource = FileSource.FolderWatch
|
||||||
|
|
||||||
|
Case "|FW_SIMPLEINDEXER|"
|
||||||
|
FileFormat = FileFormat.LocalFile
|
||||||
|
FileSource = FileSource.FolderWatch
|
||||||
|
|
||||||
|
Case "|ATTMNTEXTRACTED|"
|
||||||
|
FileFormat = FileFormat.LocalFile
|
||||||
|
FileSource = FileSource.Attachment
|
||||||
|
|
||||||
|
End Select
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
|
|
||||||
|
Public Sub New(pLogConfig As LogConfig)
|
||||||
|
MyBase.New(pLogConfig)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function GetFileFormat(pEvent As DragEventArgs) As FileFormat
|
||||||
|
If IsThunderbird(pEvent) Then
|
||||||
|
If IsThunderbirdAttachment(pEvent) Then
|
||||||
|
Return FileFormat.ThunderbirdAttachment
|
||||||
|
|
||||||
|
ElseIf IsThunderbirdMail(pEvent) Then
|
||||||
|
Return FileFormat.ThunderbirdMail
|
||||||
|
|
||||||
|
Else
|
||||||
|
Return FileFormat.Unknown
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
|
||||||
|
If IsOutlook(pEvent) Then
|
||||||
|
If IsOutlookAttachment(pEvent) Then
|
||||||
|
Return FileFormat.OutlookAttachment
|
||||||
|
|
||||||
|
ElseIf IsOutlookMail(pEvent) Then
|
||||||
|
Return FileFormat.OutlookMail
|
||||||
|
|
||||||
|
Else
|
||||||
|
Return FileFormat.Unknown
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
|
||||||
|
If IsNormalFile(pEvent) Then
|
||||||
|
Return FileFormat.LocalFile
|
||||||
|
|
||||||
|
Else
|
||||||
|
Return FileFormat.Unknown
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFilePaths(pEvent As DragEventArgs) As List(Of DroppedFile)
|
||||||
|
Try
|
||||||
|
Dim oFormat = GetFileFormat(pEvent)
|
||||||
|
Dim oFiles As New List(Of DroppedFile)
|
||||||
|
|
||||||
|
Select Case oFormat
|
||||||
|
Case FileFormat.OutlookAttachment, FileFormat.OutlookMail
|
||||||
|
Dim oFilePaths = GetOutlookFilePath(pEvent)
|
||||||
|
|
||||||
|
For Each oPath In oFilePaths
|
||||||
|
oFiles.Add(New DroppedFile(oPath) With {
|
||||||
|
.FileFormat = oFormat
|
||||||
|
})
|
||||||
|
Next
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
Dim oDroppedFiles As String() = GetFormat(pEvent, "FileDrop")
|
||||||
|
|
||||||
|
If oDroppedFiles IsNot Nothing Then
|
||||||
|
For Each oPath In oDroppedFiles
|
||||||
|
oFiles.Add(New DroppedFile(oPath) With {
|
||||||
|
.FileFormat = oFormat
|
||||||
|
})
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
|
||||||
|
End Select
|
||||||
|
|
||||||
|
Return oFiles
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Error(ex)
|
||||||
|
Return Nothing
|
||||||
|
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetOutlookFilePath(pEvent As DragEventArgs) As List(Of String)
|
||||||
|
Dim oTempPath As String = IO.Path.GetTempPath()
|
||||||
|
Dim oFileName As String = GetOutlookFileName(pEvent)
|
||||||
|
Dim oFilePath As String = IO.Path.Combine(oTempPath, oFileName)
|
||||||
|
Dim oContentsList As List(Of Byte()) = GetOutlookFileContents_FromInterop(pEvent)
|
||||||
|
|
||||||
|
If oContentsList Is Nothing Then
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oPathList As New List(Of String)
|
||||||
|
|
||||||
|
For Each oContents In oContentsList
|
||||||
|
Using oFileStream As IO.FileStream = New IO.FileStream(oFilePath, IO.FileMode.Create)
|
||||||
|
oFileStream.Write(oContents, 0, oContents.Length)
|
||||||
|
oFileStream.Close()
|
||||||
|
End Using
|
||||||
|
|
||||||
|
oPathList.Add(oFilePath)
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return oPathList
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetOutlookFileName(pEvent As DragEventArgs) As String
|
||||||
|
Dim oFileDescriptorSize = 512
|
||||||
|
Dim oIndex As Integer = 76
|
||||||
|
Dim oBuilder As New StringBuilder()
|
||||||
|
|
||||||
|
Using oStream As IO.MemoryStream = GetFormat(pEvent, "FileGroupDescriptor")
|
||||||
|
Dim oFileGroupDescriptor As Byte() = New Byte(oFileDescriptorSize) {}
|
||||||
|
oStream.Read(oFileGroupDescriptor, 0, oFileDescriptorSize)
|
||||||
|
|
||||||
|
While oFileGroupDescriptor(oIndex) <> 0
|
||||||
|
Dim oChar = Convert.ToChar(oFileGroupDescriptor(oIndex))
|
||||||
|
oBuilder.Append(oChar)
|
||||||
|
oIndex += 1
|
||||||
|
End While
|
||||||
|
End Using
|
||||||
|
|
||||||
|
Return oBuilder.ToString
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetOutlookFileContents_FromDragEvent(pEvent As DragEventArgs) As List(Of Byte())
|
||||||
|
Using oStream As IO.MemoryStream = pEvent.Data.GetData("FileContents", True)
|
||||||
|
If oStream Is Nothing Then
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oContentLength = Convert.ToInt32(oStream.Length)
|
||||||
|
Dim oContents As Byte() = New Byte(oContentLength) {}
|
||||||
|
|
||||||
|
oStream.Position = 0
|
||||||
|
oStream.Read(oContents, 0, Convert.ToInt32(oContentLength))
|
||||||
|
|
||||||
|
Return New List(Of Byte()) From {oContents}
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetOutlookFileContents_FromInterop(pEvent As DragEventArgs) As List(Of Byte())
|
||||||
|
Dim oApp As Outlook.Application
|
||||||
|
Try
|
||||||
|
oApp = New Outlook.Application()
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Error(ex)
|
||||||
|
Return Nothing
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Dim oResults As New List(Of Byte())
|
||||||
|
Dim oMailItem As Outlook.MailItem
|
||||||
|
For oIndex As Integer = 1 To oApp.ActiveExplorer.Selection.Count
|
||||||
|
Try
|
||||||
|
oMailItem = oApp.ActiveExplorer.Selection.Item(oIndex)
|
||||||
|
|
||||||
|
Dim oSubject As String = ConvertTextToSlug(oMailItem.Subject)
|
||||||
|
If oSubject = "" Then
|
||||||
|
oSubject = "NO_SUBJECT"
|
||||||
|
End If
|
||||||
|
Logger.Info("Subject Slug: [{0}]", oSubject)
|
||||||
|
|
||||||
|
Dim oFileName As String = $"{oSubject}.msg"
|
||||||
|
Dim oTempPath As String = IO.Path.GetTempPath()
|
||||||
|
Dim oFilePath As String = IO.Path.Combine(oTempPath, oFileName)
|
||||||
|
|
||||||
|
oMailItem.SaveAs(oFilePath)
|
||||||
|
|
||||||
|
Using oFileStream As New IO.FileStream(oFilePath, IO.FileMode.Open)
|
||||||
|
|
||||||
|
Dim oContents As Byte() = New Byte(oFileStream.Length) {}
|
||||||
|
oFileStream.Read(oContents, 0, oFileStream.Length)
|
||||||
|
|
||||||
|
oResults.Add(oContents)
|
||||||
|
End Using
|
||||||
|
|
||||||
|
Try
|
||||||
|
IO.File.Delete(oFilePath)
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("Temp file [{0}] could not be deleted!", oFilePath)
|
||||||
|
Logger.Error(ex)
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Return oResults
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Error(ex)
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFormat(pEvent As DragEventArgs, pFormat As String, pAutoConvert As Boolean) As Object
|
||||||
|
If CheckFor(pEvent, pFormat) Then
|
||||||
|
Dim oValue = pEvent.Data.GetData(pFormat, pAutoConvert)
|
||||||
|
Return oValue
|
||||||
|
Else
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFormat(pEvent As DragEventArgs, pFormat As String) As Object
|
||||||
|
Return GetFormat(pEvent, pFormat, False)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function CheckFor(pEvent As DragEventArgs, pFormat As String, pAutoConvert As Boolean) As Boolean
|
||||||
|
Dim oFormatExists = pEvent.Data.GetDataPresent(pFormat)
|
||||||
|
Logger.Debug("Format exists: [{0}]/[{1}]", pFormat, oFormatExists)
|
||||||
|
Return oFormatExists
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function CheckFor(pEvent As DragEventArgs, pFormat As String) As Boolean
|
||||||
|
Return CheckFor(pEvent, pFormat, False)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function IsNormalFile(e As DragEventArgs) As Boolean
|
||||||
|
Return CheckFor(e, DataFormats.FileDrop, False)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function IsOutlook(e As DragEventArgs) As Boolean
|
||||||
|
Return CheckFor(e, "FileGroupDescriptor") AndAlso CheckFor(e, "FileDrop")
|
||||||
|
End Function
|
||||||
|
Public Function IsThunderbird(e As DragEventArgs) As Boolean
|
||||||
|
Return CheckFor(e, "text/x-moz-url") AndAlso CheckFor(e, "FileDrop")
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
#Region "Thunderbird"
|
||||||
|
Private Function IsOutlookMail(e As DragEventArgs) As Boolean
|
||||||
|
Return Not IsOutlookAttachment(e) AndAlso CheckFor(e, "RenPrivateSourceFolder")
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function IsOutlookAttachment(e As DragEventArgs) As Boolean
|
||||||
|
Return IsOutlook(e) AndAlso
|
||||||
|
CheckFor(e, "RenPrivateItem") AndAlso
|
||||||
|
CheckFor(e, "ZoneIdentifier")
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
|
||||||
|
#Region "Outlook"
|
||||||
|
Private Function IsThunderbirdMail(e As DragEventArgs) As Boolean
|
||||||
|
Return Not IsThunderbirdAttachment(e)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function IsThunderbirdAttachment(e As DragEventArgs) As Boolean
|
||||||
|
Return IsThunderbird(e) AndAlso
|
||||||
|
CheckFor(e, "text/x-moz-url-data") AndAlso
|
||||||
|
CheckFor(e, "text/x-moz-url-desc")
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
End Class
|
||||||
@ -83,8 +83,10 @@
|
|||||||
<Compile Include="Animator\frmPopup.vb">
|
<Compile Include="Animator\frmPopup.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="DigitalData\Modules\Language.vb" />
|
||||||
<Compile Include="Drawing.vb" />
|
<Compile Include="Drawing.vb" />
|
||||||
<Compile Include="File.vb" />
|
<Compile Include="File.vb" />
|
||||||
|
<Compile Include="FileDrop.vb" />
|
||||||
<Compile Include="Hotkey.vb" />
|
<Compile Include="Hotkey.vb" />
|
||||||
<Compile Include="NativeMethods.vb" />
|
<Compile Include="NativeMethods.vb" />
|
||||||
<Compile Include="Screen.vb" />
|
<Compile Include="Screen.vb" />
|
||||||
@ -129,10 +131,47 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Modules.Base\Base\Base.vbproj">
|
||||||
|
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
||||||
|
<Name>Base</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\Modules.Language\Language.vbproj">
|
||||||
|
<Project>{d3c8cfed-d6f6-43a8-9bdf-454145d0352f}</Project>
|
||||||
|
<Name>Language</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Modules.Logging\Logging.vbproj">
|
<ProjectReference Include="..\Modules.Logging\Logging.vbproj">
|
||||||
<Project>{903B2D7D-3B80-4BE9-8713-7447B704E1B0}</Project>
|
<Project>{903B2D7D-3B80-4BE9-8713-7447B704E1B0}</Project>
|
||||||
<Name>Logging</Name>
|
<Name>Logging</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<COMReference Include="Microsoft.Office.Core">
|
||||||
|
<Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
|
||||||
|
<VersionMajor>2</VersionMajor>
|
||||||
|
<VersionMinor>8</VersionMinor>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<WrapperTool>primary</WrapperTool>
|
||||||
|
<Isolated>False</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
|
<COMReference Include="Microsoft.Office.Interop.Outlook">
|
||||||
|
<Guid>{00062FFF-0000-0000-C000-000000000046}</Guid>
|
||||||
|
<VersionMajor>9</VersionMajor>
|
||||||
|
<VersionMinor>6</VersionMinor>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<WrapperTool>primary</WrapperTool>
|
||||||
|
<Isolated>False</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
|
<COMReference Include="stdole">
|
||||||
|
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
|
||||||
|
<VersionMajor>2</VersionMajor>
|
||||||
|
<VersionMinor>0</VersionMinor>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<WrapperTool>primary</WrapperTool>
|
||||||
|
<Isolated>False</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
</Project>
|
</Project>
|
||||||
Loading…
x
Reference in New Issue
Block a user