diff --git a/GUIs.Common/Constants.vb b/GUIs.Common/Constants.vb index 84b11578..00a44065 100644 --- a/GUIs.Common/Constants.vb +++ b/GUIs.Common/Constants.vb @@ -1,4 +1,6 @@ Public Class Constants + Public Const TEMP_PATH_SUBFOLDER = "DigitalData_Common" + Public Const NO_ROW_HANDLE = -1 Public Shared ReadOnly MESSAGE_TOO_MANY_SEARCHES = "You have more than three searches configured. This Window will only show the first three result lists!" diff --git a/GUIs.Common/DocumentResultList/Document.vb b/GUIs.Common/DocumentResultList/Document.vb index 13052367..01b05f21 100644 --- a/GUIs.Common/DocumentResultList/Document.vb +++ b/GUIs.Common/DocumentResultList/Document.vb @@ -13,7 +13,7 @@ Namespace DocumentResultList ''' ''' Extension is needed for determining the type of file - ''' and showing it in the DocumentViewer + ''' and showing it in the DocumentViewer. It is saved without the dot-separator. ''' Public Property Extension As String ''' diff --git a/GUIs.Common/DocumentResultList/Opener.vb b/GUIs.Common/DocumentResultList/Opener.vb index 8e03f5c5..320e631b 100644 --- a/GUIs.Common/DocumentResultList/Opener.vb +++ b/GUIs.Common/DocumentResultList/Opener.vb @@ -1,51 +1,121 @@ Imports DigitalData.Modules.Logging Imports DigitalData.Modules.ZooFlow.Base +Imports DigitalData.Modules.Language.DateTimeEx +Imports System.IO +Imports System.Text +Imports System.Timers Namespace DocumentResultList Public Class Opener Inherits BaseClass + Private WithEvents FileOpenTimer As New Timer + + ' TODO: Hashes for checking if the opened file was modified externally + Private HashOriginalFile As String = Nothing + Private HashOpenedFile As String = Nothing + + Private OpenFiles As New Dictionary(Of Integer, Document) + + Public Event ProcessEnded As EventHandler(Of Document) + Public Sub New(pLogConfig As LogConfig) MyBase.New(pLogConfig) End Sub - Public Sub OpenDocument(pDocument As Document) + Public Function OpenDocument(pDocument As Document) As Boolean Dim oProcessId As Integer = Nothing If pDocument.FullPath Is Nothing OrElse pDocument.FullPath.Trim = String.Empty Then oProcessId = OpenFileFromPath(pDocument) - ElseIf pDocument.Extension IsNot Nothing AndAlso pDocument.Contents IsNot Nothing Then + ElseIf pDocument.Extension IsNot Nothing AndAlso pDocument.Contents IsNot Nothing Then + oProcessId = OpenFileFromByteArry(pDocument) End If + If IsNothing(oProcessId) Then + Logger.Warn("Process Id was empty. Returning false.") + Return False + End If + OpenFiles.Add(oProcessId, pDocument) - - End Sub + Return True + End Function Private Function OpenFileFromByteArry(pDocument As Document) As Integer Try ' TODO: Open file from temp folder - Dim oTempPath = IO.Path.GetTempPath() + Dim oTempPath = Path.Combine(Path.GetTempPath(), Constants.TEMP_PATH_SUBFOLDER) + Dim oDirectory = Directory.CreateDirectory(oTempPath) + Dim oFileName = $"{pDocument.Id}-{Now.UnixTimestamp}.{pDocument.Extension}" + Dim oFilePath = Path.Combine(oTempPath, oFileName) + + Using oMemoryStream As New MemoryStream(pDocument.Contents) + Using oStreamWriter As New StreamWriter(oFilePath, append:=False, Encoding.UTF8) + oMemoryStream.CopyTo(oMemoryStream) + End Using + End Using + + Dim oProcess = OpenFile(oFilePath) + Return oProcess.Id + Catch ex As Exception + Logger.Error(ex) + Return Nothing End Try End Function - Private Function OpenFileFromPath(pDocument As Document) As Integer Try - Dim oProcess = Process.Start(New ProcessStartInfo With { - .FileName = pDocument.FullPath - }) - + Dim oProcess = OpenFile(pDocument.FullPath) Return oProcess.Id + Catch ex As Exception Logger.Error(ex) Return Nothing End Try End Function + + Private Function OpenFile(pFilePath As String) As Process + Dim oProcess = Process.Start(New ProcessStartInfo With { + .FileName = pFilePath + }) + + Return oProcess + End Function + + Private Sub FileOpenTimer_Elapsed() Handles FileOpenTimer.Elapsed + Try + Dim oIds = Process.GetProcesses(). + Select(Function(process) process.Id). + ToList() + + Dim oNewFileOpenList As New Dictionary(Of Integer, Document) + For Each oOpenFile In OpenFiles + If oIds.Contains(oOpenFile.Key) Then + oNewFileOpenList.Add(oOpenFile.Key, oOpenFile.Value) + End If + Next + + If oNewFileOpenList.Count < OpenFiles.Count Then + Dim oClosedFiles = OpenFiles. + Except(oNewFileOpenList). + ToList() + + If oClosedFiles.Count = 1 Then + Dim oOpenFile = oClosedFiles.First() + RaiseEvent ProcessEnded(Me, oOpenFile.Value) + End If + + OpenFiles = oNewFileOpenList + End If + Catch ex As Exception + Logger.Error(ex) + End Try + End Sub End Class End Namespace \ No newline at end of file diff --git a/GUIs.Common/frmDocumentResultList.vb b/GUIs.Common/frmDocumentResultList.vb index 8ec4aaaa..6b95c70e 100644 --- a/GUIs.Common/frmDocumentResultList.vb +++ b/GUIs.Common/frmDocumentResultList.vb @@ -63,12 +63,6 @@ Public Class frmDocumentResultList Private _FileOpenList As New Dictionary(Of Integer, String) Private ReadOnly _Language As String - ' TODO: Hashes for checking if the opened file was modified externally - Private _HashOriginalFile As String = Nothing - Private _HashOpenedFile As String = Nothing - - Private WithEvents _FileOpenTimer As New Timer - Private Property OperationMode As OperationMode Implements IResultForm.OperationMode Public Property ShouldReturnToPreviousForm As Boolean = False Implements IResultForm.ShouldReturnToPreviousForm @@ -609,38 +603,7 @@ Public Class frmDocumentResultList End Function - Public Sub FileOpenTimer_Elapsed() Handles _FileOpenTimer.Tick - Try - Dim oIds = Process.GetProcesses(). - Select(Function(process) process.Id). - ToList() - Dim oNewFileOpenList As New Dictionary(Of Integer, String) - For Each oOpenFile In _FileOpenList - If oIds.Contains(oOpenFile.Key) Then - oNewFileOpenList.Add(oOpenFile.Key, oOpenFile.Value) - End If - Next - - If oNewFileOpenList.Count < _FileOpenList.Count Then - Dim oClosedFiles = _FileOpenList. - Except(oNewFileOpenList). - ToList() - - If oClosedFiles.Count = 1 Then - Dim oOpenFile = oClosedFiles.First() - DocumentViewer1.LoadFile(oOpenFile.Value) - Else - 'ClearGridData() - UpdateGridData() - End If - - _FileOpenList = oNewFileOpenList - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub #Region "Context Menu" Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) Handles GridView2.PopupMenuShowing, GridView3.PopupMenuShowing, GridView1.PopupMenuShowing