315 lines
10 KiB
C#
315 lines
10 KiB
C#
using BeWo.ServiceProxy;
|
|
using BeWo.View;
|
|
using BeWo.ViewModel;
|
|
using BS.Shared;
|
|
using BS.Shared.Core;
|
|
using BS.Shared.DataContracts;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Threading;
|
|
|
|
namespace BeWo.Core
|
|
{
|
|
public class DocumentWatcher
|
|
{
|
|
|
|
private FileSystemWatcher watcher;
|
|
|
|
private List<DocumentWatcherInfo> ueberwachteDateien = new List<DocumentWatcherInfo>();
|
|
|
|
private Dictionary<String, bool> offeneDialoge = new Dictionary<String, bool>();
|
|
|
|
private int x = 1;
|
|
|
|
private UploadPackage lUlPackage;
|
|
|
|
public delegate void FileCreatedDelegate(long? folderOid, long? objectOid, TableID objectTid, FileAttachmentDC fileAttachment);
|
|
|
|
public delegate void FileDeletedDelegate(long? folderOid, long? objectOid, TableID objectTid, long fileAttachmentOid);
|
|
|
|
public event FileCreatedDelegate FileCreated;
|
|
|
|
public event FileDeletedDelegate FileDeleted;
|
|
|
|
public void StoppeDateiUeberwachung(String fileName)
|
|
{
|
|
var dwi = GetDocumentWatcherInfo(fileName);
|
|
|
|
if (dwi != null)
|
|
{
|
|
ueberwachteDateien.Remove(dwi);
|
|
// watcher.EnableRaisingEvents = false;
|
|
// watcher.Dispose();
|
|
}
|
|
}
|
|
|
|
public void StarteDateiUeberwachung(DocumentWatcherInfo dwi)
|
|
{
|
|
try
|
|
{
|
|
if (!WirdDateiUeberwacht(dwi.FileName))
|
|
{
|
|
ueberwachteDateien.Add(dwi);
|
|
}
|
|
if (watcher == null)
|
|
{
|
|
FileInfo fi = new FileInfo(dwi.FileName);
|
|
watcher = new FileSystemWatcher(fi.DirectoryName);
|
|
|
|
watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite | NotifyFilters.CreationTime;
|
|
//watcher.NotifyFilter = NotifyFilters.Attributes
|
|
// | NotifyFilters.CreationTime
|
|
// | NotifyFilters.DirectoryName
|
|
// | NotifyFilters.FileName
|
|
// | NotifyFilters.LastAccess
|
|
// | NotifyFilters.LastWrite
|
|
// | NotifyFilters.Security
|
|
// | NotifyFilters.Size;
|
|
|
|
|
|
watcher.Changed += new FileSystemEventHandler(OnChanged);
|
|
watcher.EnableRaisingEvents = true;
|
|
watcher.IncludeSubdirectories = false;
|
|
|
|
}
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine("Fehler: " + e.StackTrace);
|
|
}
|
|
|
|
}
|
|
|
|
private void OnChanged(object source, FileSystemEventArgs e)
|
|
{
|
|
if (WirdDateiUeberwacht(e.FullPath))
|
|
{
|
|
if (!offeneDialoge.ContainsKey(e.FullPath) )
|
|
{
|
|
BeWoApp.CurrentBeWo.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate
|
|
{
|
|
var dialog = new UploadDialog(e.FullPath, x);
|
|
|
|
if (!offeneDialoge.ContainsKey(e.FullPath))
|
|
{
|
|
offeneDialoge.Add(e.FullPath, true);
|
|
|
|
dialog.ShowDialog();
|
|
|
|
|
|
if (dialog.Upload)
|
|
{
|
|
bool wert = true;
|
|
while (wert)
|
|
{
|
|
wert = UpdateDocument(e.FullPath);
|
|
}
|
|
dialog.Upload = false;
|
|
}
|
|
offeneDialoge.Remove(e.FullPath);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Console.WriteLine("Datei " + e.FullPath + " hat sich geändert. Veränderungstyp: " + e.ChangeType);
|
|
}
|
|
|
|
private bool WirdDateiUeberwacht(string fileName)
|
|
{
|
|
foreach (var dwi in ueberwachteDateien)
|
|
{
|
|
if (dwi.FileName == fileName)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private DocumentWatcherInfo GetDocumentWatcherInfo(string fileName)
|
|
{
|
|
foreach (var dwi in ueberwachteDateien)
|
|
{
|
|
if (dwi.FileName == fileName)
|
|
{
|
|
return dwi;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public bool UpdateDocument(String file)
|
|
{
|
|
var dwi = GetDocumentWatcherInfo(file);
|
|
|
|
if (dwi != null)
|
|
{
|
|
try
|
|
{
|
|
var upload = new ProgressStream(File.OpenRead(file));
|
|
|
|
lUlPackage = new UploadPackage(dwi.BeWoFolderOid, 0, dwi.FileName, dwi.FileDescription, (int)dwi.ObjectOid, (int)dwi.ObjectTid, upload);
|
|
|
|
ServiceFacade.DoStreamingServiceAsync(
|
|
s => s.UploadDocument(lUlPackage),
|
|
r =>
|
|
{
|
|
file = null;
|
|
|
|
upload.Dispose();
|
|
|
|
if (FileCreated != null)
|
|
{
|
|
FileCreated(dwi.BeWoFolderOid, dwi.ObjectOid, dwi.ObjectTid, r.Attachment);
|
|
}
|
|
ueberwachteDateien.Remove(dwi);
|
|
LoescheTempDatei(dwi.FileName);
|
|
},
|
|
() =>
|
|
{
|
|
upload.Dispose();
|
|
});
|
|
DeletOldOneMaybe(dwi);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
int i = 2;
|
|
var dialog = new UploadDialog(file, i);
|
|
dialog.ShowDialog();
|
|
if (dialog.erneutversuchen == true)
|
|
{
|
|
dialog.erneutversuchen = false;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
dialog.erneutversuchen = false;
|
|
return false;
|
|
}
|
|
}
|
|
} return false;
|
|
}
|
|
|
|
private void DeletOldOneMaybe(DocumentWatcherInfo dwi)
|
|
{
|
|
try
|
|
{
|
|
string file = "Möchten Sie das vorhandene Dokument überschreiben? Wenn Sie auf 'Behalten' klicken, wird eine neuer Datensatz für das aktuelle Dokument angelegt.";
|
|
int i = 3;
|
|
|
|
var dialog = new UploadDialog(file, i);
|
|
dialog.ShowDialog();
|
|
if (dialog.Upload)
|
|
{
|
|
DeletOldDatai(dwi);
|
|
|
|
if (FileDeleted != null && dwi.FileAttachmentOid.HasValue)
|
|
{
|
|
FileDeleted(dwi.BeWoFolderOid, dwi.ObjectOid, dwi.ObjectTid, dwi.FileAttachmentOid.Value);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine();
|
|
}
|
|
}
|
|
|
|
private void DeletOldDatai(DocumentWatcherInfo dwi)
|
|
{
|
|
try
|
|
{
|
|
if (dwi.FileAttachmentOid.HasValue)
|
|
{
|
|
//if (System.Windows.MessageBox.Show("ACHTUNG: Das Löschen von Dateien kann nicht rückgängig gemacht werden!\nWollen Sie das Dokument '" + dwi.FileName + "' wirklich löschen?", "Löschen bestätigen", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
|
|
//{
|
|
// return;
|
|
//}
|
|
ServiceFacade.DoOperationsServiceAsync(s => s.DeleteFileAttachment(dwi.FileAttachmentOid.Value, dwi.FileAttachmentVersion.Value));
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
System.Windows.MessageBox.Show(e.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|
}
|
|
}
|
|
|
|
|
|
internal void LoescheAlleTempDateien()
|
|
{
|
|
foreach (var file in ueberwachteDateien)
|
|
{
|
|
|
|
LoescheTempDatei(file.FileName);
|
|
}
|
|
ueberwachteDateien.Clear();
|
|
if (watcher != null)
|
|
{
|
|
watcher.EnableRaisingEvents = false;
|
|
watcher.Dispose();
|
|
watcher = null;
|
|
}
|
|
}
|
|
|
|
|
|
internal void LoescheTempDateien()
|
|
{
|
|
foreach (var file in ueberwachteDateien)
|
|
{
|
|
LoescheTempDatei(file.FileName);
|
|
}
|
|
}
|
|
|
|
internal void LoescheTempDatei(String fileName)
|
|
{
|
|
|
|
try
|
|
{
|
|
File.Delete(fileName);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
//ignorieren
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public class DocumentWatcherInfo
|
|
{
|
|
public String FileName { get; set; }
|
|
|
|
public String FileDescription { get; set; }
|
|
|
|
public long? BeWoFolderOid { get; set; }
|
|
|
|
public long? FileAttachmentOid { get; set; }
|
|
|
|
public long? FileAttachmentVersion { get; set; }
|
|
|
|
public long? ObjectOid { get; set; }
|
|
|
|
public TableID ObjectTid { get; set; }
|
|
|
|
public DocumentWatcherInfo(String filename, String fileDescription, long? bewoFolderOid, long? fileAttschmentOid, long? fileAttachmentVersion, long? objectOid, TableID objectTid)
|
|
{
|
|
this.FileName = filename;
|
|
this.FileDescription = fileDescription;
|
|
this.BeWoFolderOid = bewoFolderOid;
|
|
this.FileAttachmentOid = fileAttschmentOid;
|
|
this.FileAttachmentVersion = fileAttachmentVersion;
|
|
this.ObjectOid = objectOid;
|
|
this.ObjectTid = objectTid;
|
|
}
|
|
|
|
}
|
|
}
|