Compare commits
132 Commits
99f954d406
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b9c9d457d | ||
|
|
e5567412a0 | ||
|
|
d03efbe3b3 | ||
|
|
7d91b973ce | ||
| d58bb2302b | |||
|
|
57298369a6 | ||
|
|
b4f0a5ce0b | ||
|
|
4213121b67 | ||
| f3b7a6725c | |||
| 801bb9c5b3 | |||
| 65bb0fce58 | |||
| ff11ae963d | |||
| e8982d1c65 | |||
| d631f0e0ff | |||
| d9f9755d2a | |||
| cae41fbbd3 | |||
| 2d4575cb1f | |||
|
|
c39b4bc2e7 | ||
|
|
ec42ec78ae | ||
|
|
bea3ccf45f | ||
| 061c7d9ec0 | |||
| d008d12ef0 | |||
| db59bfc7dc | |||
| ad9cb46354 | |||
| 32015e5439 | |||
|
|
06e796f54f | ||
|
|
bbe372377a | ||
|
|
7b91aac5e9 | ||
|
|
ceb688fc3f | ||
|
|
aa5742a529 | ||
|
|
79267e6bd9 | ||
|
|
cf63fd8c39 | ||
|
|
ec3a677ca8 | ||
|
|
48406884ca | ||
| 204aaaeb4e | |||
| ec378ba3b4 | |||
| 35b19cde82 | |||
|
|
f7c0a29676 | ||
| 9ae5465c48 | |||
| 82139fc30d | |||
| f4ba4d9e1d | |||
| 0aabc12f49 | |||
| adbd0fe99b | |||
| 2d6a2df48a | |||
| e7ccb74828 | |||
| 05355c93a5 | |||
| 2007bb91f3 | |||
| d7d2ecf8a0 | |||
| 447c7ea600 | |||
| 32bb14db06 | |||
| a5226a8101 | |||
| b534c4c799 | |||
| dc80138311 | |||
| 477bb511c4 | |||
| 0b66b80591 | |||
| 5fd924d413 | |||
| e8ebc30225 | |||
| 262805d112 | |||
| 623807c55d | |||
| aee7997cb3 | |||
| 82a95faaaf | |||
| af7534df48 | |||
| fa2c2a6417 | |||
| 390a524736 | |||
| 0ed996100d | |||
| 2e0ae13a77 | |||
| 267e038725 | |||
| 2673755b14 | |||
| 5052ce4f14 | |||
| 717909d7e8 | |||
| 04a408ab97 | |||
| face3c76fb | |||
| 2d3a1cd25c | |||
| 43e95a20b9 | |||
| 05d0bd60ab | |||
| 7e70c059b6 | |||
|
|
0261d237b6 | ||
| ea7fe74e89 | |||
|
|
f7f4b05df5 | ||
|
|
766737b4b5 | ||
|
|
ffa8850bf1 | ||
|
|
2991b52c17 | ||
| df04b0a706 | |||
| ce65276084 | |||
| 17d5acee9d | |||
| c7afa2f754 | |||
| 4d5ab64904 | |||
| f4c3e9b3e1 | |||
| 9d76b17b1d | |||
| 2ec92511cb | |||
| 8e1b9d21f3 | |||
| 7ac596b930 | |||
| cf9650be50 | |||
|
|
fa00f2ab54 | ||
|
|
5774eb7686 | ||
|
|
ceb618dc57 | ||
|
|
66328bb243 | ||
|
|
ecfe669938 | ||
|
|
5af75cc553 | ||
|
|
c402467b38 | ||
|
|
a420c1a618 | ||
|
|
7ef808d221 | ||
|
|
d09d728f7f | ||
| 7602f2c870 | |||
|
|
c74b778227 | ||
|
|
11b7a196dd | ||
|
|
4c113f19e8 | ||
|
|
a6d3781781 | ||
|
|
d4ce8e2891 | ||
|
|
8c829d490f | ||
|
|
6fb82c20ee | ||
|
|
7c473b9a27 | ||
| b5c470e1b9 | |||
| 4ab924907a | |||
| 32f87e25f5 | |||
|
|
3d388362ec | ||
|
|
bbd97acfc5 | ||
| 35d8021278 | |||
| 7e9ed47ad9 | |||
| 13ff63d6e0 | |||
| 6bcb4dd609 | |||
| f3b370c26f | |||
|
|
bf8a2971ec | ||
|
|
67e6e68394 | ||
| 7100503c4f | |||
| 6c78d6bcc2 | |||
|
|
54ee51b0de | ||
|
|
70765af22b | ||
| c803b4532d | |||
| 47b54562c8 | |||
| 5290d442f9 | |||
| 83c2374b90 |
@@ -46,9 +46,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
@@ -79,6 +76,8 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Base\BaseClass.vb" />
|
<Compile Include="Base\BaseClass.vb" />
|
||||||
<Compile Include="Base\BaseUtils.vb" />
|
<Compile Include="Base\BaseUtils.vb" />
|
||||||
|
<Compile Include="DocumentPathHandler.vb" />
|
||||||
|
<Compile Include="ECM\ECM.vb" />
|
||||||
<Compile Include="Encryption\Compression.vb" />
|
<Compile Include="Encryption\Compression.vb" />
|
||||||
<Compile Include="Encryption\Encryption.vb" />
|
<Compile Include="Encryption\Encryption.vb" />
|
||||||
<Compile Include="Encryption\EncryptionLegacy.vb" />
|
<Compile Include="Encryption\EncryptionLegacy.vb" />
|
||||||
@@ -88,7 +87,9 @@
|
|||||||
<Compile Include="FileWatcher\FileWatcherFilters.vb" />
|
<Compile Include="FileWatcher\FileWatcherFilters.vb" />
|
||||||
<Compile Include="FileWatcher\FileWatcherProperties.vb" />
|
<Compile Include="FileWatcher\FileWatcherProperties.vb" />
|
||||||
<Compile Include="IDB\Constants.vb" />
|
<Compile Include="IDB\Constants.vb" />
|
||||||
|
<Compile Include="Map_Drive.vb" />
|
||||||
<Compile Include="MimeEx.vb" />
|
<Compile Include="MimeEx.vb" />
|
||||||
|
<Compile Include="StringFunctions.vb" />
|
||||||
<Compile Include="WindowsEx.vb" />
|
<Compile Include="WindowsEx.vb" />
|
||||||
<Compile Include="ModuleExtensions.vb" />
|
<Compile Include="ModuleExtensions.vb" />
|
||||||
<Compile Include="FileEx.vb" />
|
<Compile Include="FileEx.vb" />
|
||||||
@@ -133,18 +134,26 @@
|
|||||||
<CustomToolNamespace>My</CustomToolNamespace>
|
<CustomToolNamespace>My</CustomToolNamespace>
|
||||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
<None Include="packages.config" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="README.txt" />
|
<Content Include="README.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NLog">
|
||||||
|
<Version>5.0.5</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="NuGet.CommandLine">
|
||||||
|
<Version>6.13.2</Version>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
<ProjectReference Include="..\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 />
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
|
|||||||
346
Base/DocumentPathHandler.vb
Normal file
346
Base/DocumentPathHandler.vb
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
Imports System.IO
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
''' <summary>
|
||||||
|
''' Zentrale Klasse für Dokumentenpfad-Verwaltung mit optionalem Laufwerks-Mapping und Temp-Kopie
|
||||||
|
''' </summary>
|
||||||
|
Public Class DocumentPathHandler
|
||||||
|
|
||||||
|
Private ReadOnly _Logger As Logger
|
||||||
|
Private ReadOnly _LogConfig As LogConfig
|
||||||
|
Private _mappedDrive As String = ""
|
||||||
|
Private _clsmapDrive As Map_Drive
|
||||||
|
|
||||||
|
Public Sub New(LogConfig As LogConfig)
|
||||||
|
_LogConfig = LogConfig
|
||||||
|
_Logger = LogConfig.GetLogger()
|
||||||
|
_clsmapDrive = New Map_Drive(LogConfig)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Function EnsureTempFolder(ByRef tempFolder As String, ByRef errorMessage As String) As Boolean
|
||||||
|
Try
|
||||||
|
_Logger.Debug($"📂 Überprüfe Temp-Ordner: [{tempFolder}]")
|
||||||
|
If String.IsNullOrWhiteSpace(tempFolder) Then
|
||||||
|
_Logger.Debug("⚠️ Temp-Ordner nicht konfiguriert, verwende TEMP_DOCUMENT_FOLDER aus AppSettings")
|
||||||
|
tempFolder = TEMP_DOCUMENT_FOLDER
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Fallback, falls global nichts konfiguriert ist
|
||||||
|
If String.IsNullOrWhiteSpace(tempFolder) Then
|
||||||
|
tempFolder = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
"Digital Data",
|
||||||
|
"taskFLOW",
|
||||||
|
"DocumentViewer",
|
||||||
|
"Temp")
|
||||||
|
_Logger.Info($"⚠️ TEMP_DOCUMENT_FOLDER war leer - verwende Fallback: [{tempFolder}]")
|
||||||
|
TEMP_DOCUMENT_FOLDER = tempFolder
|
||||||
|
End If
|
||||||
|
|
||||||
|
If Not Directory.Exists(tempFolder) Then
|
||||||
|
Directory.CreateDirectory(tempFolder)
|
||||||
|
_Logger.Info($"📁 Temp-Ordner erstellt: [{tempFolder}]")
|
||||||
|
End If
|
||||||
|
|
||||||
|
If Not Directory.Exists(tempFolder) Then
|
||||||
|
errorMessage = $"Temp-Ordner konnte nicht erstellt werden: [{tempFolder}]"
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
errorMessage = $"Fehler bei Temp-Ordner-Initialisierung: {ex.Message}"
|
||||||
|
_Logger.Error($"❌ {errorMessage}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
''' <summary>
|
||||||
|
''' Verarbeitet einen Dokumentenpfad: Optional Mapping, dann Temp-Kopie
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="sourcePath">Quell-Pfad der Datei (UNC oder lokal)</param>
|
||||||
|
''' <param name="options">Optionen für die Verarbeitung</param>
|
||||||
|
''' <returns>DocumentPathResult mit finalem Pfad und Mapping-Info</returns>
|
||||||
|
Public Function ProcessDocumentPath(sourcePath As String, options As DocumentPathOptions) As DocumentPathResult
|
||||||
|
Dim result As New DocumentPathResult With {
|
||||||
|
.SourcePath = sourcePath,
|
||||||
|
.FinalPath = sourcePath,
|
||||||
|
.Success = False,
|
||||||
|
.WasMapped = False,
|
||||||
|
.WasCopiedToTemp = False
|
||||||
|
}
|
||||||
|
|
||||||
|
Try
|
||||||
|
' Validierung
|
||||||
|
If String.IsNullOrEmpty(sourcePath) Then
|
||||||
|
result.ErrorMessage = "Quell-Pfad ist leer"
|
||||||
|
_Logger.Error("❌ ProcessDocumentPath: Quell-Pfad ist leer")
|
||||||
|
Return result
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim workingPath As String = sourcePath
|
||||||
|
|
||||||
|
' ========== SCHRITT 1: OPTIONALES LAUFWERKS-MAPPING ==========
|
||||||
|
If options.EnableMapping AndAlso Not String.IsNullOrEmpty(options.WMSuffix) Then
|
||||||
|
Dim mappingResult = TryMapNetworkDrive(sourcePath, options)
|
||||||
|
If mappingResult.Success Then
|
||||||
|
workingPath = mappingResult.MappedPath
|
||||||
|
_mappedDrive = mappingResult.DriveLetter
|
||||||
|
result.WasMapped = True
|
||||||
|
result.MappedDrive = _mappedDrive
|
||||||
|
_Logger.Info($"✓ Laufwerk gemappt: {_mappedDrive}")
|
||||||
|
Else
|
||||||
|
_Logger.Warn("⚠️ Laufwerks-Mapping fehlgeschlagen - verwende Original-UNC-Pfad")
|
||||||
|
workingPath = sourcePath
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
|
||||||
|
' ========== SCHRITT 2: PRÜFEN OB DATEI EXISTIERT ==========
|
||||||
|
If Not File.Exists(workingPath) Then
|
||||||
|
result.ErrorMessage = $"Datei nicht gefunden: [{workingPath}]"
|
||||||
|
_Logger.Error($"❌ {result.ErrorMessage}")
|
||||||
|
|
||||||
|
' Cleanup bei Fehler
|
||||||
|
If result.WasMapped Then
|
||||||
|
UnmapDrive()
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return result
|
||||||
|
End If
|
||||||
|
|
||||||
|
' ========== SCHRITT 3: OPTIONALE TEMP-KOPIE ==========
|
||||||
|
If options.CopyToTemp Then
|
||||||
|
_Logger.Debug($"📂 Starte Temp-Kopie für: [{workingPath}]")
|
||||||
|
Dim tempResult = CopyToTempFolder(workingPath, options.TempFolder)
|
||||||
|
If tempResult.Success Then
|
||||||
|
result.FinalPath = tempResult.TempPath
|
||||||
|
result.WasCopiedToTemp = True
|
||||||
|
result.TempPath = tempResult.TempPath
|
||||||
|
_Logger.Info($"✓ Datei in Temp kopiert: [{Path.GetFileName(tempResult.TempPath)}]")
|
||||||
|
|
||||||
|
' Laufwerk unmappen nach erfolgreicher Kopie
|
||||||
|
If result.WasMapped AndAlso options.UnmapAfterCopy Then
|
||||||
|
UnmapDrive()
|
||||||
|
result.WasMapped = False
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
_Logger.Warn($"⚠️ Temp-Kopie fehlgeschlagen: {tempResult.ErrorMessage}")
|
||||||
|
|
||||||
|
' WICHTIG: Nicht den gemappten Pfad behalten, wenn danach ungemappt wird.
|
||||||
|
' Fallback immer auf stabilen Originalpfad (UNC).
|
||||||
|
result.FinalPath = sourcePath
|
||||||
|
result.WasCopiedToTemp = False
|
||||||
|
result.TempPath = String.Empty
|
||||||
|
|
||||||
|
If result.WasMapped Then
|
||||||
|
UnmapDrive()
|
||||||
|
result.WasMapped = False
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
result.FinalPath = workingPath
|
||||||
|
_Logger.Debug($"📄 Verwende Pfad ohne Temp-Kopie: [{workingPath}]")
|
||||||
|
End If
|
||||||
|
|
||||||
|
result.Success = True
|
||||||
|
Return result
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
result.ErrorMessage = $"Unerwarteter Fehler: {ex.Message}"
|
||||||
|
_Logger.Error($"❌ ProcessDocumentPath: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
|
||||||
|
' Cleanup bei Exception
|
||||||
|
If result.WasMapped Then
|
||||||
|
UnmapDrive()
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return result
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Versucht ein Netzlaufwerk zu mappen
|
||||||
|
''' </summary>
|
||||||
|
Private Function TryMapNetworkDrive(sourcePath As String, options As DocumentPathOptions) As MappingResult
|
||||||
|
Dim result As New MappingResult With {.Success = False}
|
||||||
|
|
||||||
|
Try
|
||||||
|
' Prüfen ob Pfad mit WMSUFFIX beginnt
|
||||||
|
If Not sourcePath.StartsWith(options.WMSuffix, StringComparison.OrdinalIgnoreCase) Then
|
||||||
|
_Logger.Debug($"📄 Pfad beginnt nicht mit WMSUFFIX - kein Mapping erforderlich")
|
||||||
|
Return result
|
||||||
|
End If
|
||||||
|
|
||||||
|
_Logger.Debug($"📂 WMSUFFIX erkannt - starte Laufwerks-Mapping")
|
||||||
|
|
||||||
|
' Laufwerk mappen
|
||||||
|
Dim mappedDrive As String = ""
|
||||||
|
|
||||||
|
If Not String.IsNullOrEmpty(options.SpecificDrive) AndAlso options.SpecificDrive.Length = 1 Then
|
||||||
|
' Spezifisches Laufwerk
|
||||||
|
If _clsmapDrive.MapSpecificDrive(options.SpecificDrive, options.DriveBlacklist, options.WMSuffix) Then
|
||||||
|
mappedDrive = options.SpecificDrive & ":"
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
' Automatisches Mapping
|
||||||
|
mappedDrive = _clsmapDrive.MapDriveAutomatic(options.DriveBlacklist, options.WMSuffix)
|
||||||
|
End If
|
||||||
|
|
||||||
|
If String.IsNullOrEmpty(mappedDrive) Then
|
||||||
|
_Logger.Warn("⚠️ Kein Laufwerk gemappt")
|
||||||
|
Return result
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Pfad umschreiben
|
||||||
|
Dim relativePath As String = sourcePath.Substring(options.WMSuffix.Length)
|
||||||
|
If relativePath.StartsWith("\") Then
|
||||||
|
relativePath = relativePath.Substring(1)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim mappedPath As String = mappedDrive.TrimEnd(":"c, "\"c) & ":\" & relativePath
|
||||||
|
|
||||||
|
_Logger.Debug($"📄 Original: [{sourcePath}]")
|
||||||
|
_Logger.Debug($"📄 Gemappt: [{mappedPath}]")
|
||||||
|
|
||||||
|
result.Success = True
|
||||||
|
result.DriveLetter = mappedDrive
|
||||||
|
result.MappedPath = mappedPath
|
||||||
|
Return result
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler beim Mapping: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return result
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function CopyToTempFolder(sourcePath As String, tempFolder As String) As TempCopyResult
|
||||||
|
Dim result As New TempCopyResult With {.Success = False}
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim configuredTempFolder As String = tempFolder
|
||||||
|
Dim globalTempFolder As String = TEMP_DOCUMENT_FOLDER
|
||||||
|
|
||||||
|
' Temp-Ordner validieren/initialisieren (kann tempFolder per ByRef setzen)
|
||||||
|
If Not EnsureTempFolder(tempFolder, result.ErrorMessage) Then
|
||||||
|
_Logger.Warn($"⚠️ {result.ErrorMessage}")
|
||||||
|
_Logger.Warn($"[TempCopy] InputTemp=[{If(String.IsNullOrWhiteSpace(configuredTempFolder), "<leer>", configuredTempFolder)}], GlobalTemp=[{If(String.IsNullOrWhiteSpace(globalTempFolder), "<leer>", globalTempFolder)}]")
|
||||||
|
Return result
|
||||||
|
End If
|
||||||
|
|
||||||
|
' NEU: Effektiven Zielordner immer transparent loggen
|
||||||
|
_Logger.Info($"[TempCopy] Effektiver Temp-Ordner: [{tempFolder}]")
|
||||||
|
_Logger.Debug($"[TempCopy] InputTemp=[{If(String.IsNullOrWhiteSpace(configuredTempFolder), "<leer>", configuredTempFolder)}], GlobalTemp=[{If(String.IsNullOrWhiteSpace(globalTempFolder), "<leer>", globalTempFolder)}]")
|
||||||
|
|
||||||
|
' Eindeutigen Dateinamen generieren
|
||||||
|
Dim originalFileName As String = Path.GetFileName(sourcePath)
|
||||||
|
Dim fileNameWithoutExt As String = Path.GetFileNameWithoutExtension(originalFileName)
|
||||||
|
Dim extension As String = Path.GetExtension(originalFileName)
|
||||||
|
Dim timestamp As String = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff")
|
||||||
|
Dim uniqueFileName As String = $"{fileNameWithoutExt}_{timestamp}{extension}"
|
||||||
|
Dim targetPath As String = Path.Combine(tempFolder, uniqueFileName)
|
||||||
|
|
||||||
|
_Logger.Debug($"📄 Kopiere nach Temp:")
|
||||||
|
_Logger.Debug($" Von: [{sourcePath}]")
|
||||||
|
_Logger.Debug($" Nach: [{targetPath}]")
|
||||||
|
|
||||||
|
File.Copy(sourcePath, targetPath, overwrite:=True)
|
||||||
|
|
||||||
|
result.Success = True
|
||||||
|
result.TempPath = targetPath
|
||||||
|
result.TempFileName = uniqueFileName
|
||||||
|
Return result
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
result.ErrorMessage = $"Fehler beim Kopieren: {ex.Message}"
|
||||||
|
_Logger.Error($"❌ {result.ErrorMessage}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return result
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Trennt das gemappte Laufwerk
|
||||||
|
''' </summary>
|
||||||
|
Public Sub UnmapDrive()
|
||||||
|
If Not String.IsNullOrEmpty(_mappedDrive) Then
|
||||||
|
Try
|
||||||
|
If _clsmapDrive.DisconnectNetworkDrive(_mappedDrive, force:=True) Then
|
||||||
|
_Logger.Info($"🔌 Laufwerk {_mappedDrive} getrennt")
|
||||||
|
Else
|
||||||
|
_Logger.Warn($"⚠️ Warnung beim Trennen von {_mappedDrive}")
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Debug($"Fehler beim Trennen von {_mappedDrive}: {ex.Message}")
|
||||||
|
Finally
|
||||||
|
_mappedDrive = ""
|
||||||
|
End Try
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Cleanup-Methode (z.B. beim Schließen des Forms)
|
||||||
|
''' </summary>
|
||||||
|
Public Sub Cleanup()
|
||||||
|
UnmapDrive()
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
#Region "Nested Classes für Optionen und Ergebnisse"
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Optionen für die Dokumentenpfad-Verarbeitung
|
||||||
|
''' </summary>
|
||||||
|
Public Class DocumentPathOptions
|
||||||
|
''' <summary>Soll Laufwerks-Mapping versucht werden?</summary>
|
||||||
|
Public Property EnableMapping As Boolean = False
|
||||||
|
|
||||||
|
''' <summary>WMSUFFIX für Mapping-Erkennung (z.B. "\\windream\objects")</summary>
|
||||||
|
Public Property WMSuffix As String = ""
|
||||||
|
|
||||||
|
''' <summary>Spezifischer Laufwerksbuchstabe (z.B. "V") oder leer für automatisch</summary>
|
||||||
|
Public Property SpecificDrive As String = ""
|
||||||
|
|
||||||
|
''' <summary>Blacklist für Laufwerksbuchstaben (z.B. "Y,M,V")</summary>
|
||||||
|
Public Property DriveBlacklist As String = ""
|
||||||
|
|
||||||
|
''' <summary>Soll Datei in Temp kopiert werden?</summary>
|
||||||
|
Public Property CopyToTemp As Boolean = False
|
||||||
|
|
||||||
|
''' <summary>Temp-Ordner-Pfad</summary>
|
||||||
|
Public Property TempFolder As String = ""
|
||||||
|
|
||||||
|
''' <summary>Laufwerk nach erfolgreicher Temp-Kopie unmappen?</summary>
|
||||||
|
Public Property UnmapAfterCopy As Boolean = True
|
||||||
|
End Class
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Ergebnis der Dokumentenpfad-Verarbeitung
|
||||||
|
''' </summary>
|
||||||
|
Public Class DocumentPathResult
|
||||||
|
Public Property Success As Boolean
|
||||||
|
Public Property SourcePath As String
|
||||||
|
Public Property FinalPath As String
|
||||||
|
Public Property ErrorMessage As String
|
||||||
|
Public Property WasMapped As Boolean
|
||||||
|
Public Property MappedDrive As String
|
||||||
|
Public Property WasCopiedToTemp As Boolean
|
||||||
|
Public Property TempPath As String
|
||||||
|
End Class
|
||||||
|
|
||||||
|
Private Class MappingResult
|
||||||
|
Public Property Success As Boolean
|
||||||
|
Public Property DriveLetter As String
|
||||||
|
Public Property MappedPath As String
|
||||||
|
End Class
|
||||||
|
|
||||||
|
Private Class TempCopyResult
|
||||||
|
Public Property Success As Boolean
|
||||||
|
Public Property TempPath As String
|
||||||
|
Public Property TempFileName As String
|
||||||
|
Public Property ErrorMessage As String
|
||||||
|
End Class
|
||||||
|
|
||||||
|
#End Region
|
||||||
|
|
||||||
|
End Class
|
||||||
8
Base/ECM/ECM.vb
Normal file
8
Base/ECM/ECM.vb
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Public Class ECM
|
||||||
|
Public Enum Product
|
||||||
|
taskFLOW
|
||||||
|
easyFLOW
|
||||||
|
fileFLOW
|
||||||
|
signFLOW
|
||||||
|
End Enum
|
||||||
|
End Class
|
||||||
559
Base/Map_Drive.vb
Normal file
559
Base/Map_Drive.vb
Normal file
@@ -0,0 +1,559 @@
|
|||||||
|
Imports System.IO
|
||||||
|
Imports System.Runtime.InteropServices
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
Public Class Map_Drive
|
||||||
|
Private ReadOnly _Logger As Logger
|
||||||
|
Private ReadOnly _LogConfig As LogConfig
|
||||||
|
#Region "Windows API Deklarationen"
|
||||||
|
<DllImport("mpr.dll", CharSet:=CharSet.Auto)>
|
||||||
|
Private Shared Function WNetAddConnection2(ByRef lpNetResource As NETRESOURCE,
|
||||||
|
ByVal lpPassword As String,
|
||||||
|
ByVal lpUsername As String,
|
||||||
|
ByVal dwFlags As Integer) As Integer
|
||||||
|
End Function
|
||||||
|
|
||||||
|
<DllImport("mpr.dll", CharSet:=CharSet.Auto)>
|
||||||
|
Private Shared Function WNetCancelConnection2(ByVal lpName As String,
|
||||||
|
ByVal dwFlags As Integer,
|
||||||
|
ByVal fForce As Boolean) As Integer
|
||||||
|
End Function
|
||||||
|
|
||||||
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
|
||||||
|
Private Structure NETRESOURCE
|
||||||
|
Public dwScope As Integer
|
||||||
|
Public dwType As Integer
|
||||||
|
Public dwDisplayType As Integer
|
||||||
|
Public dwUsage As Integer
|
||||||
|
Public lpLocalName As String
|
||||||
|
Public lpRemoteName As String
|
||||||
|
Public lpComment As String
|
||||||
|
Public lpProvider As String
|
||||||
|
End Structure
|
||||||
|
|
||||||
|
Private Const RESOURCETYPE_DISK As Integer = 1
|
||||||
|
Private Const CONNECT_UPDATE_PROFILE As Integer = 1
|
||||||
|
Private Const ERROR_SUCCESS As Integer = 0
|
||||||
|
Private Const ERROR_ALREADY_ASSIGNED As Integer = 85
|
||||||
|
#End Region
|
||||||
|
Public Sub New(LogConfig As LogConfig)
|
||||||
|
_LogConfig = LogConfig
|
||||||
|
_Logger = LogConfig.GetLogger()
|
||||||
|
End Sub
|
||||||
|
''' <summary>
|
||||||
|
''' Struktur für Netzlaufwerk-Informationen
|
||||||
|
''' </summary>
|
||||||
|
Public Structure NetworkDriveInfo
|
||||||
|
Public DriveLetter As String
|
||||||
|
Public NetworkPath As String
|
||||||
|
Public DriveType As IO.DriveType
|
||||||
|
Public IsReady As Boolean
|
||||||
|
Public TotalSize As Long
|
||||||
|
Public FreeSpace As Long
|
||||||
|
End Structure
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Ermittelt den nächsten freien Laufwerksbuchstaben (alphabetisch absteigend von Z bis A)
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="blacklist">Liste der nicht erlaubten Laufwerksbuchstaben (z.B. "Y,M,V")</param>
|
||||||
|
''' <returns>Nächster freier Laufwerksbuchstabe mit Doppelpunkt (z.B. "Z:") oder String.Empty wenn keiner frei</returns>
|
||||||
|
Public Function GetNextFreeDriveLetter(Optional blacklist As String = "") As String
|
||||||
|
Try
|
||||||
|
' Blacklist verarbeiten (Großbuchstaben ohne Doppelpunkte)
|
||||||
|
Dim blacklistArray As New List(Of Char)
|
||||||
|
If Not String.IsNullOrEmpty(blacklist) Then
|
||||||
|
For Each item In blacklist.Split(","c)
|
||||||
|
Dim letter = item.Trim().ToUpper().Replace(":", "")
|
||||||
|
If letter.Length = 1 AndAlso Char.IsLetter(letter(0)) Then
|
||||||
|
blacklistArray.Add(letter(0))
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Alle aktuell verwendeten Laufwerksbuchstaben ermitteln
|
||||||
|
Dim usedDrives As New List(Of Char)
|
||||||
|
For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives()
|
||||||
|
Dim letter As Char = drive.Name(0)
|
||||||
|
usedDrives.Add(Char.ToUpper(letter))
|
||||||
|
Next
|
||||||
|
|
||||||
|
' Alphabetisch absteigend von Z bis A durchgehen
|
||||||
|
For i As Integer = Asc("Z"c) To Asc("A"c) Step -1
|
||||||
|
Dim currentLetter As Char = Chr(i)
|
||||||
|
|
||||||
|
' Prüfen ob Buchstabe verfügbar ist
|
||||||
|
If Not usedDrives.Contains(currentLetter) AndAlso Not blacklistArray.Contains(currentLetter) Then
|
||||||
|
_Logger.Debug($"Nächster freier Laufwerksbuchstabe gefunden: {currentLetter}:")
|
||||||
|
Return currentLetter & ":"
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
_Logger.Warn("Kein freier Laufwerksbuchstabe gefunden!")
|
||||||
|
Return String.Empty
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler beim Ermitteln des nächsten freien Laufwerksbuchstabens: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return String.Empty
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Prüft ob ein Laufwerksbuchstabe verfügbar ist (nicht verwendet und nicht in Blacklist)
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="driveLetter">Zu prüfender Laufwerksbuchstabe</param>
|
||||||
|
''' <param name="blacklist">Liste der nicht erlaubten Laufwerksbuchstaben</param>
|
||||||
|
''' <returns>True wenn verfügbar, False wenn bereits verwendet oder in Blacklist</returns>
|
||||||
|
Public Function IsDriveLetterAvailable(driveLetter As String, Optional blacklist As String = "") As Boolean
|
||||||
|
Try
|
||||||
|
' Formatierung sicherstellen
|
||||||
|
driveLetter = driveLetter.Trim().ToUpper().Replace(":", "")
|
||||||
|
If driveLetter.Length <> 1 OrElse Not Char.IsLetter(driveLetter(0)) Then
|
||||||
|
_Logger.Warn($"Ungültiger Laufwerksbuchstabe: {driveLetter}")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim letter As Char = driveLetter(0)
|
||||||
|
|
||||||
|
' Blacklist prüfen
|
||||||
|
If Not String.IsNullOrEmpty(blacklist) Then
|
||||||
|
For Each item In blacklist.Split(","c)
|
||||||
|
Dim blacklistedLetter = item.Trim().ToUpper().Replace(":", "")
|
||||||
|
If blacklistedLetter.Length = 1 AndAlso blacklistedLetter(0) = letter Then
|
||||||
|
_Logger.Debug($"Laufwerk {letter}: ist in der Blacklist")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Prüfen ob bereits verwendet
|
||||||
|
For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives()
|
||||||
|
If Char.ToUpper(drive.Name(0)) = letter Then
|
||||||
|
_Logger.Debug($"Laufwerk {letter}: ist bereits verwendet")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler beim Prüfen der Laufwerksverfügbarkeit: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Mappt ein Netzlaufwerk mit automatischer Laufwerksbuchstabenwahl oder spezifischem Buchstaben
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="driveLetter">Gewünschter Laufwerksbuchstabe (leer = automatisch den nächsten freien wählen)</param>
|
||||||
|
''' <param name="networkPath">UNC-Pfad des Netzwerkshares</param>
|
||||||
|
''' <param name="blacklist">Komma-getrennte Liste verbotener Laufwerksbuchstaben (z.B. "Y,M,V")</param>
|
||||||
|
''' <param name="userName">Optionaler Benutzername für Authentifizierung</param>
|
||||||
|
''' <param name="password">Optionales Passwort für Authentifizierung</param>
|
||||||
|
''' <param name="persistent">Soll das Mapping persistent sein?</param>
|
||||||
|
''' <returns>Verwendeter Laufwerksbuchstabe bei Erfolg, String.Empty bei Fehler</returns>
|
||||||
|
Public Function MapNetworkDrive(driveLetter As String,
|
||||||
|
networkPath As String,
|
||||||
|
Optional blacklist As String = "",
|
||||||
|
Optional userName As String = Nothing,
|
||||||
|
Optional password As String = Nothing,
|
||||||
|
Optional persistent As Boolean = True) As String
|
||||||
|
Try
|
||||||
|
Dim targetDriveLetter As String = ""
|
||||||
|
|
||||||
|
' Szenario 1: Kein Laufwerksbuchstabe angegeben -> Automatische Auswahl
|
||||||
|
If String.IsNullOrEmpty(driveLetter) Then
|
||||||
|
_Logger.Info("Kein Laufwerksbuchstabe angegeben - suche nächsten freien Buchstaben...")
|
||||||
|
targetDriveLetter = GetNextFreeDriveLetter(blacklist)
|
||||||
|
|
||||||
|
If String.IsNullOrEmpty(targetDriveLetter) Then
|
||||||
|
_Logger.Error("❌ Kein freier Laufwerksbuchstabe verfügbar!")
|
||||||
|
Return String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
_Logger.Info($"Automatisch gewählter Laufwerksbuchstabe: {targetDriveLetter}")
|
||||||
|
Else
|
||||||
|
' Szenario 2: Spezifischer Laufwerksbuchstabe angegeben
|
||||||
|
targetDriveLetter = driveLetter.Trim().ToUpper()
|
||||||
|
If Not targetDriveLetter.EndsWith(":") Then
|
||||||
|
targetDriveLetter &= ":"
|
||||||
|
End If
|
||||||
|
|
||||||
|
' ========== NEU: Prüfen ob Laufwerk verfügbar ist ==========
|
||||||
|
If Not IsDriveLetterAvailable(targetDriveLetter, blacklist) Then
|
||||||
|
_Logger.Warn($"⚠️ Laufwerk {targetDriveLetter} ist nicht verfügbar (bereits verwendet oder in Blacklist)")
|
||||||
|
' NICHT abbrechen - weiter versuchen (alte Logik beibehalten)
|
||||||
|
End If
|
||||||
|
' ========== ENDE NEU ==========
|
||||||
|
End If
|
||||||
|
|
||||||
|
' ========== NEU: Prüfung ob Laufwerk bereits existiert ==========
|
||||||
|
Dim driveExists As Boolean = False
|
||||||
|
Try
|
||||||
|
Dim driveInfo As New System.IO.DriveInfo(targetDriveLetter)
|
||||||
|
driveExists = driveInfo.IsReady
|
||||||
|
Catch
|
||||||
|
' Laufwerk existiert nicht - das ist OK
|
||||||
|
driveExists = False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
' Nur trennen wenn Laufwerk wirklich existiert
|
||||||
|
If driveExists Then
|
||||||
|
_Logger.Debug($"ℹ️ Laufwerk {targetDriveLetter} existiert bereits - wird getrennt")
|
||||||
|
DisconnectNetworkDrive(targetDriveLetter, force:=True)
|
||||||
|
Else
|
||||||
|
_Logger.Debug($"✓ Laufwerk {targetDriveLetter} existiert noch nicht - kein Disconnect nötig")
|
||||||
|
End If
|
||||||
|
' ========== ENDE NEU ==========
|
||||||
|
|
||||||
|
' Laufwerk mappen (bestehende Logik)
|
||||||
|
If MapNetworkDriveInternal(targetDriveLetter, networkPath, userName, password, persistent) Then
|
||||||
|
_Logger.Info($"✓ Netzlaufwerk {targetDriveLetter} erfolgreich gemappt zu {networkPath}")
|
||||||
|
Return targetDriveLetter
|
||||||
|
Else
|
||||||
|
_Logger.Error($"❌ Fehler beim Mappen von {targetDriveLetter}")
|
||||||
|
Return String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"❌ Fehler in MapNetworkDrive: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return String.Empty
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
''' <summary>
|
||||||
|
''' Interne Methode zum tatsächlichen Mappen eines Netzlaufwerks
|
||||||
|
''' </summary>
|
||||||
|
Private Function MapNetworkDriveInternal(driveLetter As String,
|
||||||
|
networkPath As String,
|
||||||
|
userName As String,
|
||||||
|
password As String,
|
||||||
|
persistent As Boolean) As Boolean
|
||||||
|
Try
|
||||||
|
' Erst trennen falls vorhanden (ohne Fehler wenn nicht vorhanden)
|
||||||
|
DisconnectNetworkDrive(driveLetter, True)
|
||||||
|
|
||||||
|
' NETRESOURCE-Struktur vorbereiten
|
||||||
|
Dim netResource As New NETRESOURCE With {
|
||||||
|
.dwType = RESOURCETYPE_DISK,
|
||||||
|
.lpLocalName = driveLetter,
|
||||||
|
.lpRemoteName = networkPath
|
||||||
|
}
|
||||||
|
|
||||||
|
Dim flags As Integer = If(persistent, CONNECT_UPDATE_PROFILE, 0)
|
||||||
|
|
||||||
|
' WICHTIG: Credentials als Nothing übergeben = Verwende aktuelle Windows-Credentials
|
||||||
|
' Wenn der Share öffentlich oder mit aktuellen Credentials erreichbar ist, funktioniert es
|
||||||
|
Dim result As Integer = WNetAddConnection2(netResource, password, userName, flags)
|
||||||
|
|
||||||
|
Select Case result
|
||||||
|
Case ERROR_SUCCESS
|
||||||
|
_Logger.Debug($"✓ Laufwerk {driveLetter} erfolgreich gemappt")
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Case 1326 ' ERROR_LOGON_FAILURE
|
||||||
|
_Logger.Error($"❌ Authentifizierungsfehler (1326): Anmeldung fehlgeschlagen für [{networkPath}]")
|
||||||
|
_Logger.Error($" → Der UNC-Pfad erfordert möglicherweise spezielle Credentials")
|
||||||
|
_Logger.Error($" → Oder der aktuelle Benutzer hat keine Berechtigung")
|
||||||
|
Return False
|
||||||
|
|
||||||
|
Case 53 ' ERROR_BAD_NETPATH
|
||||||
|
_Logger.Error($"❌ Netzwerkpfad nicht gefunden (53): [{networkPath}]")
|
||||||
|
Return False
|
||||||
|
|
||||||
|
Case 67 ' ERROR_BAD_NET_NAME
|
||||||
|
_Logger.Error($"❌ Netzwerkname ungültig (67): [{networkPath}]")
|
||||||
|
Return False
|
||||||
|
|
||||||
|
Case 85 ' ERROR_ALREADY_ASSIGNED
|
||||||
|
_Logger.Warn($"⚠️ Laufwerk {driveLetter} ist bereits zugewiesen (85)")
|
||||||
|
' Versuche es zu trennen und erneut zu verbinden
|
||||||
|
DisconnectNetworkDrive(driveLetter, force:=True)
|
||||||
|
System.Threading.Thread.Sleep(500) ' Kurze Pause
|
||||||
|
result = WNetAddConnection2(netResource, password, userName, flags)
|
||||||
|
If result = ERROR_SUCCESS Then
|
||||||
|
_Logger.Info($"✓ Laufwerk {driveLetter} nach erneutem Versuch erfolgreich gemappt")
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
_Logger.Error($"❌ WNetAddConnection2 Error Code: {result}")
|
||||||
|
Return False
|
||||||
|
End Select
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler in MapNetworkDriveInternal: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
''' <summary>
|
||||||
|
''' Test-Funktion um UNC-Pfad-Zugriff zu prüfen
|
||||||
|
''' </summary>
|
||||||
|
Public Function TestUNCAccess(uncPath As String) As Boolean
|
||||||
|
Try
|
||||||
|
_Logger.Info($"🔍 Teste Zugriff auf UNC-Pfad: [{uncPath}]")
|
||||||
|
|
||||||
|
' Teste ob Pfad existiert und erreichbar ist
|
||||||
|
If System.IO.Directory.Exists(uncPath) Then
|
||||||
|
_Logger.Info($"✓ UNC-Pfad ist direkt erreichbar ohne Mapping")
|
||||||
|
|
||||||
|
' Teste Lese-Berechtigung
|
||||||
|
Try
|
||||||
|
Dim files = System.IO.Directory.GetFiles(uncPath)
|
||||||
|
_Logger.Info($"✓ Lese-Berechtigung vorhanden ({files.Length} Dateien gefunden)")
|
||||||
|
Return True
|
||||||
|
Catch permEx As UnauthorizedAccessException
|
||||||
|
_Logger.Error($"❌ Keine Lese-Berechtigung: {permEx.Message}")
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
Else
|
||||||
|
_Logger.Error($"❌ UNC-Pfad nicht erreichbar oder existiert nicht")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"❌ Fehler beim Testen des UNC-Zugriffs: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
''' <summary>
|
||||||
|
''' Trennt ein Netzlaufwerk mit Windows-API
|
||||||
|
''' </summary>
|
||||||
|
Public Function DisconnectNetworkDrive(driveLetter As String, Optional force As Boolean = True) As Boolean
|
||||||
|
Try
|
||||||
|
' Formatierung sicherstellen
|
||||||
|
driveLetter = driveLetter.Trim().ToUpper()
|
||||||
|
If Not driveLetter.EndsWith(":") Then
|
||||||
|
driveLetter &= ":"
|
||||||
|
End If
|
||||||
|
Dim driveExists As Boolean = False
|
||||||
|
Try
|
||||||
|
Dim driveInfo As New System.IO.DriveInfo(driveLetter)
|
||||||
|
driveExists = driveInfo.IsReady
|
||||||
|
Catch
|
||||||
|
driveExists = False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
If Not driveExists Then
|
||||||
|
_Logger.Debug($"ℹ️ Laufwerk {driveLetter} existiert nicht - Disconnect übersprungen")
|
||||||
|
Return True ' Kein Fehler, da das gewünschte Ergebnis erreicht ist (Laufwerk ist nicht verbunden)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim flags As Integer = CONNECT_UPDATE_PROFILE
|
||||||
|
Dim result As Integer = WNetCancelConnection2(driveLetter, flags, force)
|
||||||
|
|
||||||
|
If result = ERROR_SUCCESS Then
|
||||||
|
_Logger.Debug($"✓ Netzlaufwerk {driveLetter} erfolgreich getrennt")
|
||||||
|
Return True
|
||||||
|
ElseIf result = 2250 Then ' ERROR_NOT_CONNECTED
|
||||||
|
' Von WARN auf DEBUG herabgestuft, da es kein echter Fehler ist
|
||||||
|
_Logger.Debug($"ℹ️ Laufwerk {driveLetter} war nicht verbunden (Code 2250)")
|
||||||
|
Return True
|
||||||
|
ElseIf result = ERROR_ALREADY_ASSIGNED Then
|
||||||
|
_Logger.Debug($"ℹ️ Netzlaufwerk {driveLetter} war nicht verbunden")
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
_Logger.Warn($"⚠️ Warnung beim Trennen von {driveLetter}: Error Code {result}")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Debug($"⚠️ Fehler beim Trennen von {driveLetter} (ignoriert): {ex.Message}")
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Ermittelt alle gemappten Netzlaufwerke
|
||||||
|
''' </summary>
|
||||||
|
Public Function GetMappedNetworkDrives() As List(Of NetworkDriveInfo)
|
||||||
|
Dim mappedDrives As New List(Of NetworkDriveInfo)
|
||||||
|
|
||||||
|
Try
|
||||||
|
For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives()
|
||||||
|
If drive.DriveType = IO.DriveType.Network Then
|
||||||
|
Dim driveInfo As New NetworkDriveInfo With {
|
||||||
|
.DriveLetter = drive.Name,
|
||||||
|
.NetworkPath = GetNetworkPath(drive.Name),
|
||||||
|
.DriveType = drive.DriveType,
|
||||||
|
.IsReady = drive.IsReady
|
||||||
|
}
|
||||||
|
|
||||||
|
If drive.IsReady Then
|
||||||
|
Try
|
||||||
|
driveInfo.TotalSize = drive.TotalSize
|
||||||
|
driveInfo.FreeSpace = drive.AvailableFreeSpace
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Debug($"Konnte Größeninformationen für {drive.Name} nicht ermitteln: {ex.Message}")
|
||||||
|
End Try
|
||||||
|
End If
|
||||||
|
|
||||||
|
mappedDrives.Add(driveInfo)
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
_Logger.Debug($"Insgesamt {mappedDrives.Count} Netzlaufwerk(e) gefunden")
|
||||||
|
Return mappedDrives
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler beim Ermitteln der Netzlaufwerke: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return mappedDrives
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Ermittelt den UNC-Pfad eines gemappten Laufwerks
|
||||||
|
''' </summary>
|
||||||
|
Public Function GetNetworkPath(driveLetter As String) As String
|
||||||
|
Try
|
||||||
|
driveLetter = driveLetter.Trim().ToUpper()
|
||||||
|
If Not driveLetter.EndsWith(":") Then
|
||||||
|
driveLetter &= ":"
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim network As Object = CreateObject("WScript.Network")
|
||||||
|
Dim enumDrives As Object = network.EnumNetworkDrives()
|
||||||
|
|
||||||
|
For i As Integer = 0 To enumDrives.Count - 1 Step 2
|
||||||
|
If enumDrives.Item(i).ToString.Equals(driveLetter, StringComparison.OrdinalIgnoreCase) Then
|
||||||
|
Return enumDrives.Item(i + 1).ToString()
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return String.Empty
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Debug($"Fehler beim Ermitteln des Netzwerkpfads für {driveLetter}: {ex.Message}")
|
||||||
|
Return String.Empty
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Prüft ob ein bestimmtes Laufwerk als Netzlaufwerk gemappt ist
|
||||||
|
''' </summary>
|
||||||
|
Public Shared Function IsDriveMapped(driveLetter As String) As Boolean
|
||||||
|
Try
|
||||||
|
driveLetter = driveLetter.Trim().ToUpper()
|
||||||
|
If Not driveLetter.EndsWith(":") Then
|
||||||
|
driveLetter &= ":"
|
||||||
|
End If
|
||||||
|
If Not driveLetter.EndsWith("\") Then
|
||||||
|
driveLetter &= "\"
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim driveInfo As New IO.DriveInfo(driveLetter)
|
||||||
|
Return driveInfo.DriveType = IO.DriveType.Network AndAlso driveInfo.IsReady
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Gibt eine formatierte Übersicht aller gemappten Netzlaufwerke zurück
|
||||||
|
''' </summary>
|
||||||
|
Public Function GetMappedDrivesInfo() As String
|
||||||
|
Dim result As New System.Text.StringBuilder()
|
||||||
|
Dim drives = GetMappedNetworkDrives()
|
||||||
|
|
||||||
|
If drives.Count = 0 Then
|
||||||
|
Return "Keine Netzlaufwerke gefunden."
|
||||||
|
End If
|
||||||
|
|
||||||
|
result.AppendLine($"Gemappte Netzlaufwerke ({drives.Count}):")
|
||||||
|
result.AppendLine(New String("-"c, 60))
|
||||||
|
|
||||||
|
For Each drive In drives
|
||||||
|
result.AppendLine($"Laufwerk: {drive.DriveLetter}")
|
||||||
|
result.AppendLine($" Pfad: {drive.NetworkPath}")
|
||||||
|
result.AppendLine($" Status: {If(drive.IsReady, "Verfügbar", "Nicht verfügbar")}")
|
||||||
|
|
||||||
|
If drive.IsReady AndAlso drive.TotalSize > 0 Then
|
||||||
|
Dim totalGB As Double = drive.TotalSize / (1024.0 ^ 3)
|
||||||
|
Dim freeGB As Double = drive.FreeSpace / (1024.0 ^ 3)
|
||||||
|
result.AppendLine($" Größe: {totalGB:N2} GB (Frei: {freeGB:N2} GB)")
|
||||||
|
End If
|
||||||
|
|
||||||
|
result.AppendLine()
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return result.ToString()
|
||||||
|
End Function
|
||||||
|
''' <summary>
|
||||||
|
''' Mappt ein spezifisches Laufwerk (z.B. "V") mit Blacklist-Prüfung
|
||||||
|
''' </summary>
|
||||||
|
Public Function MapSpecificDrive(driveLetter As String, blacklist As String, networkPath As String) As Boolean
|
||||||
|
Try
|
||||||
|
' Formatierung sicherstellen
|
||||||
|
driveLetter = driveLetter.Trim().ToUpper().Replace(":", "")
|
||||||
|
|
||||||
|
If String.IsNullOrEmpty(driveLetter) OrElse driveLetter.Length <> 1 Then
|
||||||
|
_Logger.Warn($"⚠️ Ungültiger Laufwerksbuchstabe: [{driveLetter}]")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim driveWithColon As String = driveLetter & ":"
|
||||||
|
|
||||||
|
' Prüfen ob Laufwerk verfügbar ist
|
||||||
|
If Not IsDriveLetterAvailable(driveWithColon, blacklist) Then
|
||||||
|
_Logger.Warn($"⚠️ Laufwerk {driveWithColon} ist nicht verfügbar (bereits verwendet oder in Blacklist)")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
' UNC-Pfad vorbereiten (ohne abschließenden Backslash)
|
||||||
|
Dim uncPath As String = networkPath.TrimEnd("\"c)
|
||||||
|
|
||||||
|
' Laufwerk mappen (OHNE Credentials, persistent=False für temporäres Mapping)
|
||||||
|
Dim result = MapNetworkDrive(driveWithColon, uncPath, blacklist, userName:=Nothing, password:=Nothing, persistent:=False)
|
||||||
|
|
||||||
|
If Not String.IsNullOrEmpty(result) Then
|
||||||
|
_Logger.Debug($"✓ Laufwerk {driveWithColon} erfolgreich gemappt zu [{uncPath}]")
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
_Logger.Error($"❌ Fehler beim Mappen von {driveWithColon}")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler in MapSpecificDrive: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Mappt automatisch den nächsten freien Laufwerksbuchstaben (Z→A)
|
||||||
|
''' </summary>
|
||||||
|
Public Function MapDriveAutomatic(blacklist As String, networkPath As String) As String
|
||||||
|
Try
|
||||||
|
' UNC-Pfad vorbereiten (ohne abschließenden Backslash)
|
||||||
|
Dim uncPath As String = networkPath.TrimEnd("\"c)
|
||||||
|
|
||||||
|
_Logger.Debug($"🔍 Suche automatisch freien Laufwerksbuchstaben...")
|
||||||
|
_Logger.Debug($" Blacklist: [{blacklist}]")
|
||||||
|
_Logger.Debug($" Netzwerkpfad: [{uncPath}]")
|
||||||
|
|
||||||
|
' Automatisches Mapping (leer = automatische Auswahl, persistent=False)
|
||||||
|
Dim result = MapNetworkDrive("", uncPath, blacklist, userName:=Nothing, password:=Nothing, persistent:=False)
|
||||||
|
|
||||||
|
If Not String.IsNullOrEmpty(result) Then
|
||||||
|
_Logger.Debug($"✓ Automatisch gewähltes Laufwerk: {result}")
|
||||||
|
Return result
|
||||||
|
Else
|
||||||
|
_Logger.Error($"❌ Kein freier Laufwerksbuchstabe verfügbar")
|
||||||
|
Return String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error($"Fehler in MapDriveAutomatic: {ex.Message}")
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return String.Empty
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
End Class
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
Imports System.Web
|
Imports System.Web
|
||||||
|
|
||||||
Public Module ModuleExtensions
|
Public Module ModuleExtensions
|
||||||
|
Public TEMP_DOCUMENT_FOLDER As String = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Documents")
|
||||||
Const UnixEraStartTicks As Long = 621355968000000000
|
Const UnixEraStartTicks As Long = 621355968000000000
|
||||||
|
|
||||||
' ======================================================
|
' ======================================================
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ Imports System.Runtime.InteropServices
|
|||||||
|
|
||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Base")>
|
<Assembly: AssemblyTitle("Modules.Base")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("basisfunktionalitäten für DigitalData Anwendungen")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH")>
|
||||||
<Assembly: AssemblyProduct("Base")>
|
<Assembly: AssemblyProduct("Modules.")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("1.3.6.0")>
|
<Assembly: AssemblyTrademark("1.3.9.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' indem Sie "*" wie unten gezeigt eingeben:
|
' indem Sie "*" wie unten gezeigt eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.3.6.0")>
|
<Assembly: AssemblyVersion("1.4.0.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.3.6.0")>
|
<Assembly: AssemblyFileVersion("1.4.0.0")>
|
||||||
|
|||||||
64
Base/StringFunctions.vb
Normal file
64
Base/StringFunctions.vb
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
Imports System.Globalization
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
|
||||||
|
Public Class StringFunctions
|
||||||
|
Public Shared Function SplitText_Length(ByVal input As String, ByVal maxLength As Integer) As List(Of String)
|
||||||
|
Dim result As New List(Of String)
|
||||||
|
|
||||||
|
For i As Integer = 0 To input.Length - 1 Step maxLength
|
||||||
|
' Textabschnitt extrahieren
|
||||||
|
Dim chunk As String = input.Substring(i, Math.Min(maxLength, input.Length - i))
|
||||||
|
result.Add(chunk)
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return result
|
||||||
|
End Function
|
||||||
|
Public Shared Function SplitTextByNewLine(text As String) As List(Of String)
|
||||||
|
If String.IsNullOrEmpty(text) Then
|
||||||
|
Return New List(Of String)()
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Zerlege den Text anhand von Zeilenumbrüchen
|
||||||
|
Dim lines As List(Of String) = text.Split({vbCrLf, vbLf, vbCr}, StringSplitOptions.None).ToList()
|
||||||
|
Return lines
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Shared Function DatetimeStringToGermanStringConverter(pDatetimeString As String, pLogger As Logger) As String
|
||||||
|
|
||||||
|
If pDatetimeString.IsNullOrEmpty() = True Then
|
||||||
|
' Wenn nichts kommt, kommt nichts zurueck
|
||||||
|
Return String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim formatList As List(Of String) = New List(Of String) From {
|
||||||
|
"yyyyMMdd",
|
||||||
|
"MM/dd/yyyy", "M/d/yyyy", "MM/d/yyyy", "M/dd/yyyy",
|
||||||
|
"yyyy-MM-dd", "yyyy-M-d", "yyyy-MM-d", "yyyy-M-dd",
|
||||||
|
"dd.MM.yyyy", "d.M.yyyy", "d.MM.yyyy", "dd.M.yyyy"
|
||||||
|
}
|
||||||
|
|
||||||
|
Dim dateStringResult As Date = Date.MinValue
|
||||||
|
Dim oConvertResult As Boolean = False
|
||||||
|
|
||||||
|
For Each formatStringItem In formatList
|
||||||
|
Try
|
||||||
|
dateStringResult = DateTime.ParseExact(pDatetimeString, formatStringItem, CultureInfo.InvariantCulture)
|
||||||
|
oConvertResult = True
|
||||||
|
Exit For
|
||||||
|
Catch ex As FormatException
|
||||||
|
oConvertResult = False
|
||||||
|
pLogger?.Debug("DatetimeStringToGermanStringConverter() - Could not parse date string {0} ({1})", pDatetimeString, formatStringItem)
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
|
||||||
|
If oConvertResult = True Then
|
||||||
|
' In deutsches Format umwandeln (dd.MM.yyyy)
|
||||||
|
Dim germanDateFormat As String = dateStringResult.ToString("dd.MM.yyyy")
|
||||||
|
Return germanDateFormat
|
||||||
|
Else
|
||||||
|
' Wenn nichts konvertiert werden konnte, geben wir den ursprünglichen Wert zurück
|
||||||
|
Return pDatetimeString
|
||||||
|
End If
|
||||||
|
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
|
||||||
</packages>
|
|
||||||
30
Config/App.config
Normal file
30
Config/App.config
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
||||||
|
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
||||||
|
</configSections>
|
||||||
|
<entityFramework>
|
||||||
|
<providers>
|
||||||
|
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
|
||||||
|
<provider invariantName="FirebirdSql.Data.FirebirdClient" type="EntityFramework.Firebird.FbProviderServices, EntityFramework.Firebird" />
|
||||||
|
</providers>
|
||||||
|
<defaultConnectionFactory type="EntityFramework.Firebird.FbConnectionFactory, EntityFramework.Firebird" />
|
||||||
|
</entityFramework>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
</configuration>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@@ -12,6 +13,8 @@
|
|||||||
<MyType>Windows</MyType>
|
<MyType>Windows</MyType>
|
||||||
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -44,19 +47,29 @@
|
|||||||
<OptionInfer>On</OptionInfer>
|
<OptionInfer>On</OptionInfer>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="DigitalData.Modules.Base">
|
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||||
<HintPath>..\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
|
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="DigitalData.Modules.Database">
|
<Reference Include="EntityFramework.Firebird, Version=6.4.0.0, Culture=neutral, PublicKeyToken=42d22d092898e5f8, processorArchitecture=MSIL">
|
||||||
<HintPath>..\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
|
<HintPath>..\packages\EntityFramework.Firebird.6.4.0\lib\net452\EntityFramework.Firebird.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="FirebirdSql.Data.FirebirdClient, Version=7.5.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Data.Odbc, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Data.Odbc.6.0.1\lib\net461\System.Data.Odbc.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.IO.Compression" />
|
<Reference Include="System.IO.Compression" />
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
@@ -111,6 +124,7 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
<None Include="My Project\Application.myapp">
|
<None Include="My Project\Application.myapp">
|
||||||
<Generator>MyApplicationCodeGenerator</Generator>
|
<Generator>MyApplicationCodeGenerator</Generator>
|
||||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||||
@@ -123,9 +137,13 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Encryption\Encryption.vbproj">
|
<ProjectReference Include="..\Base\Base.vbproj">
|
||||||
<Project>{8a8f20fc-c46e-41ac-bee7-218366cfff99}</Project>
|
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
||||||
<Name>Encryption</Name>
|
<Name>Base</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\Database\Database.vbproj">
|
||||||
|
<Project>{eaf0ea75-5fa7-485d-89c7-b2d843b03a96}</Project>
|
||||||
|
<Name>Database</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
<ProjectReference Include="..\Logging\Logging.vbproj">
|
||||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
||||||
@@ -136,4 +154,12 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
|
||||||
|
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
|
||||||
|
</Target>
|
||||||
|
<Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
|
||||||
</Project>
|
</Project>
|
||||||
@@ -36,8 +36,9 @@ Public Class ConfigDbFunct
|
|||||||
Dim oDatabase As MSSQLServer = New MSSQLServer(pLogConfig, oDecryptedConnectionString)
|
Dim oDatabase As MSSQLServer = New MSSQLServer(pLogConfig, oDecryptedConnectionString)
|
||||||
|
|
||||||
Dim oSql As String = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = '" + pProductName + "' AND ACTIVE = 1 AND VERSION = '" + pVersion + "'"
|
Dim oSql As String = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = '" + pProductName + "' AND ACTIVE = 1 AND VERSION = '" + pVersion + "'"
|
||||||
Dim oLicenseString As String = oDatabase.GetScalarValue(oSql)
|
oLogger.Debug(String.Format("oSql in GetProductLicense: {0}", oSql))
|
||||||
|
|
||||||
|
Dim oLicenseString As String = oDatabase.GetScalarValue(oSql)
|
||||||
Return oLicenseString
|
Return oLicenseString
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ Imports System.Runtime.InteropServices
|
|||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Modules.Config")>
|
<Assembly: AssemblyTitle("Modules.Config")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Stellt Module für die Konfiguration von Produkten bereit")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Modules.Config")>
|
<Assembly: AssemblyProduct("Modules.Config")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
<Assembly: AssemblyCopyright("Copyright © 2026")>
|
||||||
<Assembly: AssemblyTrademark("1.3.0.0")>
|
<Assembly: AssemblyTrademark("1.4.0.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.3.0.0")>
|
<Assembly: AssemblyVersion("1.4.0.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.3.0.0")>
|
<Assembly: AssemblyFileVersion("1.4.0.0")>
|
||||||
|
|||||||
2
Config/My Project/Settings.Designer.vb
generated
2
Config/My Project/Settings.Designer.vb
generated
@@ -15,7 +15,7 @@ Option Explicit On
|
|||||||
Namespace My
|
Namespace My
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0"), _
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
Partial Friend NotInheritable Class MySettings
|
Partial Friend NotInheritable Class MySettings
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="EntityFramework" version="6.4.4" targetFramework="net462" />
|
||||||
|
<package id="EntityFramework.Firebird" version="6.4.0" targetFramework="net462" />
|
||||||
|
<package id="FirebirdSql.Data.FirebirdClient" version="7.5.0" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="System.Data.Odbc" version="6.0.1" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
Imports System.ComponentModel
|
Imports System.ComponentModel
|
||||||
Imports System.Data.SqlClient
|
Imports System.Data.SqlClient
|
||||||
|
Imports System.Threading
|
||||||
Imports DigitalData.Modules.Encryption
|
Imports DigitalData.Modules.Encryption
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
|
|
||||||
@@ -148,7 +149,24 @@ Public Class MSSQLServer
|
|||||||
Public Function GetConnectionStringForId(pConnectionId As Integer) As String
|
Public Function GetConnectionStringForId(pConnectionId As Integer) As String
|
||||||
Return Get_ConnectionStringforID(pConnectionId)
|
Return Get_ConnectionStringforID(pConnectionId)
|
||||||
End Function
|
End Function
|
||||||
|
Public Function GetGDPictureString() As String
|
||||||
|
Using oConnection As SqlConnection = GetSQLConnection()
|
||||||
|
Dim oSQL = Queries.DD_ECM.ThirdPartyModules.GdPictureLicense
|
||||||
|
Dim oGDPicture = GetScalarValueWithConnectionObject(oSQL, oConnection)
|
||||||
|
If oGDPicture = String.Empty Then
|
||||||
|
oSQL = Queries.DD_ECM.ThirdPartyModules.GdPictureLicense_REGULAR
|
||||||
|
oGDPicture = GetScalarValueWithConnectionObject(oSQL, oConnection)
|
||||||
|
End If
|
||||||
|
Return oGDPicture
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
|
Public Function GetDDCatalog() As DataTable
|
||||||
|
Using oConnection As SqlConnection = GetSQLConnection()
|
||||||
|
Dim oSQL = Queries.DD_ECM.DD_SELECTS.TBDD_CATALOG
|
||||||
|
Dim oDT_CATALOG As DataTable = GetDatatable(oSQL)
|
||||||
|
Return oDT_CATALOG
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
Public Function Get_ConnectionStringforID(pConnectionId As Integer) As String
|
Public Function Get_ConnectionStringforID(pConnectionId As Integer) As String
|
||||||
Dim oConnectionString As String = String.Empty
|
Dim oConnectionString As String = String.Empty
|
||||||
|
|
||||||
@@ -296,6 +314,19 @@ Public Class MSSQLServer
|
|||||||
End Using
|
End Using
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDatatableWithoutTransaction(pSqlCommand As String, Optional pTimeout As Integer = 120) As DataTable Implements IDatabase.GetDatatableWithoutTransaction
|
||||||
|
Using oSqlConnection = GetSQLConnection()
|
||||||
|
Return GetDatatableWithConnectionObject(pSqlCommand, oSqlConnection, TransactionMode.NoTransaction, Nothing, pTimeout)
|
||||||
|
End Using
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDatatableWithoutTransaction(pSqlCommand As SqlCommand, Optional pTimeout As Integer = 120) As DataTable Implements IDatabase.GetDatatableWithoutTransaction
|
||||||
|
Using oSqlConnection = GetSQLConnection()
|
||||||
|
Return GetDatatableWithConnectionObject(pSqlCommand, oSqlConnection, TransactionMode.NoTransaction, Nothing, pTimeout)
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
|
|
||||||
''' <summary>
|
''' <summary>
|
||||||
''' Returns a datatable for a SQL Statement
|
''' Returns a datatable for a SQL Statement
|
||||||
''' </summary>
|
''' </summary>
|
||||||
@@ -323,6 +354,10 @@ Public Class MSSQLServer
|
|||||||
Return Await Task.Run(Function() GetDatatable(pSqlCommandObject, pTimeout))
|
Return Await Task.Run(Function() GetDatatable(pSqlCommandObject, pTimeout))
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Public Async Function GetDatatableWithoutTransactionAsync(pSqlCommand As String, Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As Task(Of DataTable)
|
||||||
|
Return Await Task.Run(Function() GetDatatableWithoutTransaction(pSqlCommand, pTimeout))
|
||||||
|
End Function
|
||||||
|
|
||||||
Public Function GetDatatableWithConnection(pSqlCommand As String, pConnectionString As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
Public Function GetDatatableWithConnection(pSqlCommand As String, pConnectionString As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
||||||
Using oConnection = GetConnection(pConnectionString)
|
Using oConnection = GetConnection(pConnectionString)
|
||||||
Return GetDatatableWithConnectionObject(pSqlCommand, oConnection, pTimeout:=Timeout)
|
Return GetDatatableWithConnectionObject(pSqlCommand, oConnection, pTimeout:=Timeout)
|
||||||
@@ -635,6 +670,12 @@ Public Class MSSQLServer
|
|||||||
Select(Function(p) $"({p.ParameterName}={p.Value})").
|
Select(Function(p) $"({p.ParameterName}={p.Value})").
|
||||||
ToList()
|
ToList()
|
||||||
|
|
||||||
Return String.Join(",", oList)
|
Dim oParamString = String.Join(",", oList)
|
||||||
|
If oParamString.Length > 1000 Then
|
||||||
|
oParamString = oParamString.Substring(1, 1000)
|
||||||
|
End If
|
||||||
|
Return oParamString
|
||||||
|
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ Public Class Oracle
|
|||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function GetDatatable(SqlCommand As SqlClient.SqlCommand, Optional Timeout As Integer = 120) As DataTable Implements IDatabase.GetDatatable
|
Public Function GetDatatable(SqlCommand As System.Data.SqlClient.SqlCommand, Optional Timeout As Integer = 120) As DataTable Implements IDatabase.GetDatatable
|
||||||
Throw New NotImplementedException()
|
Throw New NotImplementedException()
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
@@ -251,5 +251,11 @@ Public Class Oracle
|
|||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDatatableWithoutTransaction(SqlCommand As String, Optional Timeout As Integer = 120) As DataTable Implements IDatabase.GetDatatableWithoutTransaction
|
||||||
|
Throw New NotImplementedException()
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDatatableWithoutTransaction(SqlCommand As SqlClient.SqlCommand, Optional Timeout As Integer = 120) As DataTable Implements IDatabase.GetDatatableWithoutTransaction
|
||||||
|
Throw New NotImplementedException()
|
||||||
|
End Function
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<configSections>
|
<configSections>
|
||||||
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
||||||
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
||||||
|
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
|
||||||
</configSections>
|
</configSections>
|
||||||
<entityFramework>
|
<entityFramework>
|
||||||
<defaultConnectionFactory type="EntityFramework.Firebird.FbConnectionFactory, EntityFramework.Firebird" />
|
<defaultConnectionFactory type="EntityFramework.Firebird.FbConnectionFactory, EntityFramework.Firebird" />
|
||||||
@@ -11,13 +12,29 @@
|
|||||||
<provider invariantName="FirebirdSql.Data.FirebirdClient" type="EntityFramework.Firebird.FbProviderServices, EntityFramework.Firebird" />
|
<provider invariantName="FirebirdSql.Data.FirebirdClient" type="EntityFramework.Firebird.FbProviderServices, EntityFramework.Firebird" />
|
||||||
</providers>
|
</providers>
|
||||||
</entityFramework>
|
</entityFramework>
|
||||||
|
|
||||||
<runtime>
|
<runtime>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
|
||||||
|
</startup>
|
||||||
|
<system.data>
|
||||||
|
<DbProviderFactories>
|
||||||
|
<remove invariant="Oracle.ManagedDataAccess.Client" />
|
||||||
|
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
|
||||||
|
</DbProviderFactories>
|
||||||
|
</system.data>
|
||||||
|
</configuration>
|
||||||
@@ -59,24 +59,55 @@
|
|||||||
<Reference Include="FirebirdSql.Data.FirebirdClient, Version=7.5.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
|
<Reference Include="FirebirdSql.Data.FirebirdClient, Version=7.5.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll</HintPath>
|
<HintPath>..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Oracle.ManagedDataAccess">
|
<Reference Include="Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL">
|
||||||
<HintPath>P:\Visual Studio Projekte\Bibliotheken\Oracle.ManagedDataAccess.dll</HintPath>
|
<HintPath>..\packages\Oracle.ManagedDataAccess.21.15.0\lib\net462\Oracle.ManagedDataAccess.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Data.Odbc, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Data.Odbc, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Data.Odbc.6.0.1\lib\net461\System.Data.Odbc.dll</HintPath>
|
<HintPath>..\packages\System.Data.Odbc.6.0.1\lib\net461\System.Data.Odbc.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Formats.Asn1, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Formats.Asn1.8.0.0\lib\net462\System.Formats.Asn1.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.IO.Compression" />
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Text.Encodings.Web, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Encodings.Web.6.0.0\lib\net461\System.Text.Encodings.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Json, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Json.6.0.1\lib\net461\System.Text.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Transactions" />
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -143,6 +174,12 @@
|
|||||||
<CustomToolNamespace>My</CustomToolNamespace>
|
<CustomToolNamespace>My</CustomToolNamespace>
|
||||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="Oracle.DataAccess.Common.Configuration.Section.xsd">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</None>
|
||||||
|
<None Include="Oracle.ManagedDataAccess.Client.Configuration.Section.xsd">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</None>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -162,11 +199,11 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
|
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
|
||||||
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
|
<Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets'))" />
|
<Error Condition="!Exists('..\packages\System.Text.Json.6.0.1\build\System.Text.Json.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Text.Json.6.0.1\build\System.Text.Json.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
<Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
|
<Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.89\build\net462\GdPicture.runtimes.windows.targets')" />
|
<Import Project="..\packages\System.Text.Json.6.0.1\build\System.Text.Json.targets" Condition="Exists('..\packages\System.Text.Json.6.0.1\build\System.Text.Json.targets')" />
|
||||||
</Project>
|
</Project>
|
||||||
@@ -11,6 +11,9 @@ Public Interface IDatabase
|
|||||||
Function GetDatatable(SqlCommand As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
Function GetDatatable(SqlCommand As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
||||||
Function GetDatatable(SqlCommand As SqlCommand, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
Function GetDatatable(SqlCommand As SqlCommand, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
||||||
|
|
||||||
|
Function GetDatatableWithoutTransaction(SqlCommand As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
||||||
|
Function GetDatatableWithoutTransaction(SqlCommand As SqlCommand, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable
|
||||||
|
|
||||||
Function ExecuteNonQuery(SQLCommand As String, Timeout As Integer) As Boolean
|
Function ExecuteNonQuery(SQLCommand As String, Timeout As Integer) As Boolean
|
||||||
Function ExecuteNonQuery(SQLCommand As String) As Boolean
|
Function ExecuteNonQuery(SQLCommand As String) As Boolean
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ Imports System.Runtime.InteropServices
|
|||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Modules.Database")>
|
<Assembly: AssemblyTitle("Modules.Database")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Stellt Funktionen für den Datenbankzugriff zur Verfügung")>
|
||||||
<Assembly: AssemblyCompany("Digital Data")>
|
<Assembly: AssemblyCompany("Digital Data")>
|
||||||
<Assembly: AssemblyProduct("Modules.Database")>
|
<Assembly: AssemblyProduct("Modules.Database")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("2.3.4.0")>
|
<Assembly: AssemblyTrademark("2.3.7.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2.3.5.2")>
|
<Assembly: AssemblyVersion("2.3.7.0")>
|
||||||
<Assembly: AssemblyFileVersion("2.3.5.2")>
|
<Assembly: AssemblyFileVersion("2.3.7.0")>
|
||||||
|
|||||||
2
Database/My Project/Settings.Designer.vb
generated
2
Database/My Project/Settings.Designer.vb
generated
@@ -15,7 +15,7 @@ Option Explicit On
|
|||||||
Namespace My
|
Namespace My
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0"), _
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
Partial Friend NotInheritable Class MySettings
|
Partial Friend NotInheritable Class MySettings
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|||||||
138
Database/Oracle.DataAccess.Common.Configuration.Section.xsd
Normal file
138
Database/Oracle.DataAccess.Common.Configuration.Section.xsd
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||||
|
<xs:simpleType name="parameterDirection">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="Output"/>
|
||||||
|
<xs:enumeration value="InputOutput"/>
|
||||||
|
<xs:enumeration value="ReturnValue"/>
|
||||||
|
<xs:enumeration value="Implicit"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="customBoolean">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="true"/>
|
||||||
|
<xs:enumeration value="false"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="ONSParameters">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="nodeList"/>
|
||||||
|
<!--<xs:enumeration value="walletFile"/>
|
||||||
|
<xs:enumeration value="walletPassword"/>-->
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="ONSModeValues">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="local"/>
|
||||||
|
<xs:enumeration value="remote"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="datatype">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="System.Binary"/>
|
||||||
|
<xs:enumeration value="System.Boolean"/>
|
||||||
|
<xs:enumeration value="System.Byte"/>
|
||||||
|
<xs:enumeration value="System.Byte[]"/>
|
||||||
|
<xs:enumeration value="System.Char"/>
|
||||||
|
<xs:enumeration value="System.DateTime"/>
|
||||||
|
<xs:enumeration value="System.DateTimeOffset"/>
|
||||||
|
<xs:enumeration value="System.Decimal"/>
|
||||||
|
<xs:enumeration value="System.Double"/>
|
||||||
|
<xs:enumeration value="System.Guid"/>
|
||||||
|
<xs:enumeration value="System.Int16"/>
|
||||||
|
<xs:enumeration value="System.Int32"/>
|
||||||
|
<xs:enumeration value="System.Int64"/>
|
||||||
|
<xs:enumeration value="System.SByte"/>
|
||||||
|
<xs:enumeration value="System.Single"/>
|
||||||
|
<xs:enumeration value="System.String"/>
|
||||||
|
<xs:enumeration value="System.TimeSpan"/>
|
||||||
|
<xs:enumeration value="System.UInt16"/>
|
||||||
|
<xs:enumeration value="System.UInt32"/>
|
||||||
|
<xs:enumeration value="System.UInt64"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="providerType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="BFile"/>
|
||||||
|
<xs:enumeration value="BinaryFloat"/>
|
||||||
|
<xs:enumeration value="BinaryDouble"/>
|
||||||
|
<xs:enumeration value="Blob"/>
|
||||||
|
<xs:enumeration value="Byte"/>
|
||||||
|
<xs:enumeration value="Char"/>
|
||||||
|
<xs:enumeration value="Clob"/>
|
||||||
|
<xs:enumeration value="Date"/>
|
||||||
|
<xs:enumeration value="Decimal"/>
|
||||||
|
<xs:enumeration value="Double"/>
|
||||||
|
<xs:enumeration value="Int16"/>
|
||||||
|
<xs:enumeration value="Int32"/>
|
||||||
|
<xs:enumeration value="Int64"/>
|
||||||
|
<xs:enumeration value="IntervalDS"/>
|
||||||
|
<xs:enumeration value="IntervalYM"/>
|
||||||
|
<xs:enumeration value="Long"/>
|
||||||
|
<xs:enumeration value="LongRaw"/>
|
||||||
|
<xs:enumeration value="NChar"/>
|
||||||
|
<xs:enumeration value="NClob"/>
|
||||||
|
<xs:enumeration value="NVarchar2"/>
|
||||||
|
<xs:enumeration value="Object"/>
|
||||||
|
<xs:enumeration value="Raw"/>
|
||||||
|
<xs:enumeration value="Single"/>
|
||||||
|
<xs:enumeration value="TimeStamp"/>
|
||||||
|
<xs:enumeration value="TimeStampLTZ"/>
|
||||||
|
<xs:enumeration value="TimeStampTZ"/>
|
||||||
|
<xs:enumeration value="Varchar2"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="nativeDataType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="BFile"/>
|
||||||
|
<xs:enumeration value="Binary_Float"/>
|
||||||
|
<xs:enumeration value="Binary_Double"/>
|
||||||
|
<xs:enumeration value="Blob"/>
|
||||||
|
<xs:enumeration value="Char"/>
|
||||||
|
<xs:enumeration value="Clob"/>
|
||||||
|
<xs:enumeration value="Date"/>
|
||||||
|
<xs:enumeration value="Number"/>
|
||||||
|
<xs:enumeration value="Interval Day To Second"/>
|
||||||
|
<xs:enumeration value="Interval Year To Month"/>
|
||||||
|
<xs:enumeration value="Long"/>
|
||||||
|
<xs:enumeration value="Long Raw"/>
|
||||||
|
<xs:enumeration value="NChar"/>
|
||||||
|
<xs:enumeration value="NClob"/>
|
||||||
|
<xs:enumeration value="NVarchar2"/>
|
||||||
|
<xs:enumeration value="Raw"/>
|
||||||
|
<xs:enumeration value="Rowid"/>
|
||||||
|
<xs:enumeration value="Timestamp"/>
|
||||||
|
<xs:enumeration value="Timestamp With Local Time Zone"/>
|
||||||
|
<xs:enumeration value="Timestamp With Time Zone"/>
|
||||||
|
<xs:enumeration value="URowid"/>
|
||||||
|
<xs:enumeration value="UserDefinedType"/>
|
||||||
|
<xs:enumeration value="Varchar2"/>
|
||||||
|
<xs:enumeration value="XmlType"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="providerDBType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="AnsiString"/>
|
||||||
|
<xs:enumeration value="AnsiStringFixedLength"/>
|
||||||
|
<xs:enumeration value="Binary"/>
|
||||||
|
<xs:enumeration value="Byte"/>
|
||||||
|
<xs:enumeration value="Date"/>
|
||||||
|
<xs:enumeration value="DateTime"/>
|
||||||
|
<xs:enumeration value="DateTimeOffset"/>
|
||||||
|
<xs:enumeration value="Decimal"/>
|
||||||
|
<xs:enumeration value="Double"/>
|
||||||
|
<xs:enumeration value="Int16"/>
|
||||||
|
<xs:enumeration value="Int32"/>
|
||||||
|
<xs:enumeration value="Int64"/>
|
||||||
|
<xs:enumeration value="Object"/>
|
||||||
|
<xs:enumeration value="Single"/>
|
||||||
|
<xs:enumeration value="String"/>
|
||||||
|
<xs:enumeration value="StringFixedLength"/>
|
||||||
|
<xs:enumeration value="Time"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
|
||||||
|
<xs:include schemaLocation="Oracle.DataAccess.Common.Configuration.Section.xsd"/>
|
||||||
|
<xs:element name="oracle.manageddataaccess.client" >
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xs:element name="version" type="odpmversiontype" minOccurs="0" />
|
||||||
|
</xs:choice>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:complexType name="odpmversiontype">
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="odpmparameters">
|
||||||
|
<xs:attribute name="number" type="xs:string" use="required" />
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="odpmparameters">
|
||||||
|
<xs:all>
|
||||||
|
<xs:element minOccurs="0" name="settings">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="setting">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="value" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="udtMappings">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="udtMapping">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="typeName" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="factoryName" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="dataSource" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="schemaName" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="LDAPsettings">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="LDAPsetting">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="value" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="distributedTransaction">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="setting">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="value" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="dataSources">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="dataSource">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="alias" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="descriptor" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element minOccurs="0" name="connectionPools">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="connectionPool">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="connectionString" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="poolName" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
|
||||||
|
<xs:element minOccurs="0" name="edmMappings">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element minOccurs="0" maxOccurs="unbounded" name="edmMapping">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element minOccurs="0" maxOccurs="unbounded" name="add">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="precision" type="xs:int" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="dataType" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" maxOccurs="unbounded" name="edmNumberMapping">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element minOccurs="0" maxOccurs="unbounded" name="add">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="NETType" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="MinPrecision" type="xs:int" use="required" />
|
||||||
|
<xs:attribute name="MaxPrecision" type="xs:int" use="required" />
|
||||||
|
<xs:attribute name="DBType" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="implicitRefCursor">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="storedProcedure">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="1" name="refCursor">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="1" minOccurs="1" name="bindInfo">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="mode" type="parameterDirection" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element maxOccurs="unbounded" minOccurs="0" name="metadata">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="columnOrdinal" type="xs:int" use="required" />
|
||||||
|
<xs:attribute name="columnName" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="baseColumnName" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="baseSchemaName" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="baseTableName" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="providerType" type="providerType" use="optional" />
|
||||||
|
<xs:attribute name="columnSize" type="xs:int" use="optional" />
|
||||||
|
<xs:attribute name="numericPrecision" type="xs:int" use="optional" />
|
||||||
|
<xs:attribute name="numericScale" type="xs:int" use="optional" />
|
||||||
|
<xs:attribute name="isUnique" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isKey" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isRowID" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="dataType" type="datatype" use="optional" />
|
||||||
|
<xs:attribute name="allowDBNull" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isAliased" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isByteSemantic" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isExpression" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isHidden" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isReadOnly" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="isLong" type="customBoolean" use="optional" />
|
||||||
|
<xs:attribute name="udtTypeName" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="nativeDataType" type="nativeDataType" use="optional" />
|
||||||
|
<xs:attribute name="providerDBType" type="providerDBType" use="optional" />
|
||||||
|
<xs:attribute name="objectName" type="xs:string" use="optional" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="position" type="xs:int" use="optional" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="schema" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" name="onsConfig">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element minOccurs="0" name="settings">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="2" minOccurs="0" name="setting">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required" />
|
||||||
|
<xs:attribute name="value" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element minOccurs="0" maxOccurs="unbounded" name="ons">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element maxOccurs="3" minOccurs="1" name="add">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="ONSParameters" use="required" />
|
||||||
|
<xs:attribute name="value" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="database" type="xs:string" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="configFile" type="xs:string" use="optional" />
|
||||||
|
<xs:attribute name="mode" type="ONSModeValues" use="required" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:schema>
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
Public Class Queries
|
Public Class Queries
|
||||||
Public Class DD_ECM
|
Public Class DD_ECM
|
||||||
Public Class ThirdPartyModules
|
Public Class ThirdPartyModules
|
||||||
Public Const GdPictureLicense As String = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' AND ACTIVE = 1"
|
Public Const GdPictureLicense As String = "SELECT COALESCE(MAX(LICENSE),'') FROM TBDD_3RD_PARTY_MODULES WHERE ACTIVE = 1 AND NAME = 'GDPICTURE' AND [VERSION] = '11.2024'"
|
||||||
|
Public Const GdPictureLicense_REGULAR As String = "SELECT COALESCE(MAX(LICENSE),'') FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' AND ACTIVE = 1"
|
||||||
|
End Class
|
||||||
|
Public Class DD_SELECTS
|
||||||
|
Public Const TBDD_CATALOG As String = "SELECT * FROM TBDD_CATALOG"
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
Public Class Connections
|
Public Class Connections
|
||||||
|
|||||||
@@ -3,8 +3,17 @@
|
|||||||
<package id="EntityFramework" version="6.4.4" targetFramework="net461" />
|
<package id="EntityFramework" version="6.4.4" targetFramework="net461" />
|
||||||
<package id="EntityFramework.Firebird" version="6.4.0" targetFramework="net461" />
|
<package id="EntityFramework.Firebird" version="6.4.0" targetFramework="net461" />
|
||||||
<package id="FirebirdSql.Data.FirebirdClient" version="7.5.0" targetFramework="net461" />
|
<package id="FirebirdSql.Data.FirebirdClient" version="7.5.0" targetFramework="net461" />
|
||||||
<package id="GdPicture" version="14.2.89" targetFramework="net462" />
|
<package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" targetFramework="net462" />
|
||||||
<package id="GdPicture.runtimes.windows" version="14.2.89" targetFramework="net462" />
|
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="Oracle.ManagedDataAccess" version="21.15.0" targetFramework="net462" />
|
||||||
|
<package id="System.Buffers" version="4.5.1" targetFramework="net462" />
|
||||||
<package id="System.Data.Odbc" version="6.0.1" targetFramework="net461" />
|
<package id="System.Data.Odbc" version="6.0.1" targetFramework="net461" />
|
||||||
|
<package id="System.Formats.Asn1" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Memory" version="4.5.5" targetFramework="net462" />
|
||||||
|
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net462" />
|
||||||
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Encodings.Web" version="6.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Json" version="6.0.1" targetFramework="net462" />
|
||||||
|
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net462" />
|
||||||
|
<package id="System.ValueTuple" version="4.5.0" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -44,6 +44,14 @@
|
|||||||
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -8,12 +8,12 @@ Imports System.Runtime.InteropServices
|
|||||||
|
|
||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("DDEncryption")>
|
<Assembly: AssemblyTitle("DDModules.DDEncryption")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Stellt Funktionen zur Entschlüsselung bereit")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data Gmbh, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Encryption")>
|
<Assembly: AssemblyProduct("DDModules.Encryption")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2021")>
|
<Assembly: AssemblyCopyright("Copyright © 2021")>
|
||||||
<Assembly: AssemblyTrademark("1.2.0.0")>
|
<Assembly: AssemblyTrademark("")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' indem Sie "*" wie unten gezeigt eingeben:
|
' indem Sie "*" wie unten gezeigt eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.3.0.0")>
|
<Assembly: AssemblyVersion("1.3.1.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.3.0.0")>
|
<Assembly: AssemblyFileVersion("1.3.1.0")>
|
||||||
|
|||||||
2
Encryption/My Project/Settings.Designer.vb
generated
2
Encryption/My Project/Settings.Designer.vb
generated
@@ -15,7 +15,7 @@ Option Explicit On
|
|||||||
Namespace My
|
Namespace My
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0"), _
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
Partial Friend NotInheritable Class MySettings
|
Partial Friend NotInheritable Class MySettings
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
487
Filesystem/File.vb
Normal file
487
Filesystem/File.vb
Normal file
@@ -0,0 +1,487 @@
|
|||||||
|
Imports System.IO
|
||||||
|
Imports System.Security.Cryptography
|
||||||
|
Imports System.Text
|
||||||
|
Imports System.Text.RegularExpressions
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
|
||||||
|
''' <module>File</module>
|
||||||
|
''' <version>0.0.0.1</version>
|
||||||
|
''' <date>11.10.2018</date>
|
||||||
|
''' <summary>
|
||||||
|
''' Module that provides variouse File operations
|
||||||
|
''' </summary>
|
||||||
|
''' <dependencies>
|
||||||
|
''' NLog, >= 4.5.8
|
||||||
|
''' </dependencies>
|
||||||
|
''' <params>
|
||||||
|
''' LogConfig, DigitalData.Module.Logging.LogConfig
|
||||||
|
''' A LogConfig object
|
||||||
|
''' </params>
|
||||||
|
''' <props>
|
||||||
|
''' </props>
|
||||||
|
''' <example>
|
||||||
|
''' </example>
|
||||||
|
''' <remarks>
|
||||||
|
''' </remarks>
|
||||||
|
Public Class File
|
||||||
|
Private ReadOnly _Logger As Logger
|
||||||
|
Private ReadOnly _LogConfig As LogConfig
|
||||||
|
|
||||||
|
Private ReadOnly _invalidFilenameChars As String
|
||||||
|
Private ReadOnly _invalidPathChars As String
|
||||||
|
|
||||||
|
Private Const REGEX_CLEAN_FILENAME As String = "[\\/:""<>|\b\0\r\n\t]"
|
||||||
|
Private Const REGEX_CLEAN_PATH As String = "[""<>|\b\0\r\n\t]"
|
||||||
|
|
||||||
|
' The limit enforced by windows for filenpaths is 260,
|
||||||
|
' so we use a slightly smaller number to have some Error margin.
|
||||||
|
'
|
||||||
|
' Source: https://docs.microsoft.com/de-de/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maximum-path-length-limitation
|
||||||
|
Private Const MAX_FILE_PATH_LENGTH = 250
|
||||||
|
|
||||||
|
Private Const FILE_NAME_ACCESS_TEST = "accessTest.txt"
|
||||||
|
|
||||||
|
Public Sub New(LogConfig As LogConfig)
|
||||||
|
_LogConfig = LogConfig
|
||||||
|
_Logger = LogConfig.GetLogger()
|
||||||
|
|
||||||
|
_invalidFilenameChars = String.Join("", Path.GetInvalidFileNameChars())
|
||||||
|
_invalidPathChars = String.Join("", Path.GetInvalidPathChars())
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function GetCleanFilename(FileName As String) As String
|
||||||
|
_Logger.Debug("Filename before cleaning: [{0}]", FileName)
|
||||||
|
|
||||||
|
Dim oCleanName As String = FileName
|
||||||
|
oCleanName = Regex.Replace(oCleanName, _invalidFilenameChars, String.Empty)
|
||||||
|
oCleanName = Regex.Replace(oCleanName, REGEX_CLEAN_FILENAME, String.Empty, RegexOptions.Singleline)
|
||||||
|
oCleanName = Regex.Replace(oCleanName, "\s{2,}", " ")
|
||||||
|
oCleanName = Regex.Replace(oCleanName, "\.{2,}", ".")
|
||||||
|
|
||||||
|
_Logger.Debug("Filename after cleaning: [{0}]", oCleanName)
|
||||||
|
|
||||||
|
Return oCleanName
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetCleanPath(FilePath As String) As String
|
||||||
|
_Logger.Debug("Path before cleaning: [{0}]", FilePath)
|
||||||
|
|
||||||
|
Dim oCleanName As String = FilePath
|
||||||
|
oCleanName = Regex.Replace(oCleanName, _invalidPathChars, String.Empty)
|
||||||
|
oCleanName = Regex.Replace(oCleanName, REGEX_CLEAN_PATH, String.Empty, RegexOptions.Singleline)
|
||||||
|
|
||||||
|
_Logger.Debug("Path after cleaning: [{0}]", oCleanName)
|
||||||
|
|
||||||
|
Return oCleanName
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Reads the file at `FilePath` and computes a SHA256 Hash from its contents
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="FilePath"></param>
|
||||||
|
''' <returns></returns>
|
||||||
|
Public Function GetChecksum(FilePath As String) As String
|
||||||
|
Try
|
||||||
|
Using oFileStream = IO.File.OpenRead(FilePath)
|
||||||
|
Using oStream As New BufferedStream(oFileStream, 1200000)
|
||||||
|
Dim oChecksum() As Byte = SHA256.Create.ComputeHash(oStream)
|
||||||
|
Return FormatHash(oChecksum)
|
||||||
|
End Using
|
||||||
|
End Using
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return Nothing
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetChecksumFromString(pStringToCheck As String) As String
|
||||||
|
Dim oBytes() As Byte = Encoding.UTF8.GetBytes(pStringToCheck)
|
||||||
|
Dim oChecksum() As Byte = SHA256.Create.ComputeHash(oBytes)
|
||||||
|
Return FormatHash(oChecksum)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function FormatHash(pChecksum)
|
||||||
|
Return BitConverter.
|
||||||
|
ToString(pChecksum).
|
||||||
|
Replace("-", String.Empty)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Adds file version string to given filename `Destination` if that file already exists.
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="Destination"></param>
|
||||||
|
''' <returns></returns>
|
||||||
|
Public Function GetVersionedFilename(Destination As String) As String
|
||||||
|
Try
|
||||||
|
Dim oFileName As String = Destination
|
||||||
|
Dim oFinalFileName = oFileName
|
||||||
|
|
||||||
|
Dim oDestinationDir = Path.GetDirectoryName(oFileName)
|
||||||
|
Dim oExtension = Path.GetExtension(oFileName)
|
||||||
|
|
||||||
|
Dim oVersionSeparator As Char = "~"c
|
||||||
|
|
||||||
|
' Split Filename without extension at version separator to:
|
||||||
|
' - Check if file is already versioned
|
||||||
|
' - Get the file version of an already versioned file
|
||||||
|
'
|
||||||
|
' Example:
|
||||||
|
' test1.pdf --> test1 --> ['test1'] --> no fileversion
|
||||||
|
' test1~2.pdf --> test1~2 --> ['test1', '2'] --> version 2
|
||||||
|
' test1~12345~2.pdf --> test1~12345~2 --> ['test1', '12345', '2'] --> still version 2
|
||||||
|
'Dim oFileNameWithoutExtension = Path.GetFileNameWithoutExtension(oFileName)
|
||||||
|
'Dim oSplitFilename = oFileNameWithoutExtension.Split(oVersionSeparator).ToList()
|
||||||
|
|
||||||
|
' if file is already versioned, extract file version
|
||||||
|
' else just use the filename and set version to 1
|
||||||
|
'If oSplitFilename.Count > 1 Then
|
||||||
|
' Dim oVersion As Integer = 1
|
||||||
|
' Try
|
||||||
|
' oVersion = Integer.Parse(oSplitFilename.Last())
|
||||||
|
' oFileNameWithoutExtension = String.Join("", oSplitFilename.Take(oSplitFilename.Count - 1))
|
||||||
|
' Catch ex As Exception
|
||||||
|
' ' oFilenameWithoutExtension does NOT change
|
||||||
|
' oFileNameWithoutExtension = oFileNameWithoutExtension
|
||||||
|
' Finally
|
||||||
|
' oFileVersion = oVersion
|
||||||
|
' End Try
|
||||||
|
'Else
|
||||||
|
' oFileVersion = 1
|
||||||
|
'End If
|
||||||
|
|
||||||
|
Dim oFileNameWithoutExtension = Path.GetFileNameWithoutExtension(oFileName)
|
||||||
|
Dim oSplitResult = GetVersionedString(oFileNameWithoutExtension, oVersionSeparator)
|
||||||
|
|
||||||
|
oFileNameWithoutExtension = oSplitResult.Item1
|
||||||
|
Dim oFileVersion = oSplitResult.Item2
|
||||||
|
|
||||||
|
' Shorten the filename (only filename, without extension or version)
|
||||||
|
' by cutting the length in half. This should work no matter how long the path and/or filename are.
|
||||||
|
If oFileName.Length > MAX_FILE_PATH_LENGTH Then
|
||||||
|
_Logger.Info("Filename is too long. Filename will be cut to prevent further errors.")
|
||||||
|
_Logger.Info("Original Filename is: {0}", oFileNameWithoutExtension)
|
||||||
|
Dim oNewLength As Integer = Math.Round(oFileNameWithoutExtension.Length / 2)
|
||||||
|
Dim oNewFileNameWithoutExtension = oFileNameWithoutExtension.Substring(0, oNewLength)
|
||||||
|
_Logger.Info("New Filename will be: {0}", oNewFileNameWithoutExtension)
|
||||||
|
|
||||||
|
oFileNameWithoutExtension = oNewFileNameWithoutExtension
|
||||||
|
End If
|
||||||
|
|
||||||
|
' while file exists, increment version
|
||||||
|
Do
|
||||||
|
oFinalFileName = Path.Combine(oDestinationDir, GetFilenameWithVersion(oFileNameWithoutExtension, oVersionSeparator, oFileVersion, oExtension))
|
||||||
|
_Logger.Debug("Intermediate Filename is {0}", oFinalFileName)
|
||||||
|
_Logger.Debug("File version: {0}", oFileVersion)
|
||||||
|
oFileVersion += 1
|
||||||
|
Loop While (IO.File.Exists(oFinalFileName))
|
||||||
|
|
||||||
|
_Logger.Debug("Final Filename is {0}", oFinalFileName)
|
||||||
|
|
||||||
|
Return oFinalFileName
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Warn("Filename {0} could not be versioned. Original filename will be returned!", Destination)
|
||||||
|
_Logger.Error(ex)
|
||||||
|
Return Destination
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Split String at version separator to:
|
||||||
|
''' check if string is already versioned,
|
||||||
|
''' get the string version of an already versioned string
|
||||||
|
''' </summary>
|
||||||
|
''' <example>
|
||||||
|
''' Examples:
|
||||||
|
''' test1.pdf --> test1 --> ['test1'] --> no fileversion
|
||||||
|
''' test1~2.pdf --> test1~2 --> ['test1', '2'] --> version 2
|
||||||
|
''' test1~12345~2.pdf --> test1~12345~2 --> ['test1', '12345', '2'] --> still version 2
|
||||||
|
''' somestring~3 --> somestring~3 --> ['somestring', '3'] --> version 3
|
||||||
|
''' </example>
|
||||||
|
''' <param name="pString">The string to versioned</param>
|
||||||
|
''' <param name="pSeparator">The character to split at</param>
|
||||||
|
''' <returns>Tuple of string and version</returns>
|
||||||
|
Public Function GetVersionedString(pString As String, pSeparator As Char) As Tuple(Of String, Integer)
|
||||||
|
Dim oSplitString = pString.Split(pSeparator).ToList()
|
||||||
|
Dim oStringVersion As Integer
|
||||||
|
|
||||||
|
' if string is already versioned, extract string version
|
||||||
|
' else just use the string and set version to 1
|
||||||
|
If oSplitString.Count > 1 Then
|
||||||
|
Dim oVersion As Integer = 1
|
||||||
|
Try
|
||||||
|
oVersion = Integer.Parse(oSplitString.Last())
|
||||||
|
pString = String.Join("", oSplitString.Take(oSplitString.Count - 1))
|
||||||
|
Catch ex As Exception
|
||||||
|
' pString does NOT change
|
||||||
|
pString = pString
|
||||||
|
Finally
|
||||||
|
oStringVersion = oVersion
|
||||||
|
End Try
|
||||||
|
Else
|
||||||
|
oStringVersion = 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return New Tuple(Of String, Integer)(pString, oStringVersion)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetAppDataPath(CompanyName As String, ProductName As String)
|
||||||
|
Dim oLocalAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
|
||||||
|
Return Path.Combine(oLocalAppData, CompanyName, ProductName)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetFilenameWithVersion(FileNameWithoutExtension As String, VersionSeparator As Char, FileVersion As Integer, Extension As String) As String
|
||||||
|
If FileVersion <= 1 Then
|
||||||
|
Return $"{FileNameWithoutExtension}{Extension}"
|
||||||
|
Else
|
||||||
|
Return $"{FileNameWithoutExtension}{VersionSeparator}{FileVersion}{Extension}"
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Removes files in a directory filtered by filename, extension and last write date
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="Path">The directory in which files will be deleted</param>
|
||||||
|
''' <param name="FileKeepTime">Only delete files which are older than x days. Must be between 0 and 1000 days.</param>
|
||||||
|
''' <param name="FileBaseName">A filename filter which will be checked</param>
|
||||||
|
''' <param name="FileExtension">A file extension which will be checked</param>
|
||||||
|
''' <param name="ContinueOnError">Should the function continue with deleting when a file could not be deleted?</param>
|
||||||
|
''' <returns>True if all files were deleted or if no files were deleted, otherwise false</returns>
|
||||||
|
Public Function RemoveFiles(Path As String, FileKeepTime As Integer, FileBaseName As String, Optional FileExtension As String = "log", Optional ContinueOnError As Boolean = True) As Boolean
|
||||||
|
If Not TestPathIsDirectory(Path) Then
|
||||||
|
Throw New ArgumentException($"Path {Path} is not a directory!")
|
||||||
|
End If
|
||||||
|
|
||||||
|
If Not Directory.Exists(Path) Then
|
||||||
|
Throw New DirectoryNotFoundException($"Path {Path} does not exist!")
|
||||||
|
End If
|
||||||
|
|
||||||
|
If FileKeepTime < 0 Or FileKeepTime > 1000 Then
|
||||||
|
Throw New ArgumentOutOfRangeException("FileKeepTime must be an integer between 0 and 1000!")
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oUnableToDeleteCounter = 0
|
||||||
|
Dim oDirectory As New DirectoryInfo(Path)
|
||||||
|
Dim oDateLimit As DateTime = DateTime.Now.AddDays(FileKeepTime)
|
||||||
|
Dim oFiles As List(Of FileInfo) = oDirectory.
|
||||||
|
EnumerateFiles($"*{FileBaseName}*").
|
||||||
|
Where(Function(oFileInfo As FileInfo)
|
||||||
|
Return oFileInfo.Extension = FileExtension And oFileInfo.LastWriteTime < oDateLimit
|
||||||
|
End Function).
|
||||||
|
ToList()
|
||||||
|
|
||||||
|
If oFiles.Count = 0 Then
|
||||||
|
_Logger.Debug("No files found that match the criterias.")
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
|
||||||
|
_Logger.Debug("Deleting old files (Found {0}).", oFiles.Count)
|
||||||
|
|
||||||
|
For Each oFile As FileInfo In oFiles
|
||||||
|
Try
|
||||||
|
oFile.Delete()
|
||||||
|
Catch ex As Exception
|
||||||
|
If ContinueOnError = False Then
|
||||||
|
_Logger.Warn("Deleting files was aborted at file {0}.", oFile.FullName)
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
oUnableToDeleteCounter = oUnableToDeleteCounter + 1
|
||||||
|
_Logger.Warn("File {0} could not be deleted!")
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
|
||||||
|
If oUnableToDeleteCounter > 0 Then
|
||||||
|
_Logger.Debug("Old files partially removed. {0} files could not be removed.", oUnableToDeleteCounter)
|
||||||
|
Else
|
||||||
|
_Logger.Debug("Old files removed.")
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return True
|
||||||
|
End Function
|
||||||
|
|
||||||
|
<DebuggerStepThrough>
|
||||||
|
Public Sub MoveTo(FilePath As String, Directory As String)
|
||||||
|
Dim oFileInfo As New FileInfo(FilePath)
|
||||||
|
IO.File.Move(FilePath, Path.Combine(Directory, oFileInfo.Name))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
<DebuggerStepThrough>
|
||||||
|
Public Sub MoveTo(FilePath As String, NewFileName As String, Directory As String)
|
||||||
|
IO.File.Move(FilePath, Path.Combine(Directory, NewFileName))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Copied from https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="SourceDirName"></param>
|
||||||
|
''' <param name="DestDirName"></param>
|
||||||
|
''' <param name="CopySubDirs"></param>
|
||||||
|
Public Sub CopyDirectory(ByVal SourceDirName As String, ByVal DestDirName As String, ByVal CopySubDirs As Boolean)
|
||||||
|
Dim oDirectory As DirectoryInfo = New DirectoryInfo(SourceDirName)
|
||||||
|
|
||||||
|
If Not oDirectory.Exists Then
|
||||||
|
Throw New DirectoryNotFoundException("Source directory does not exist or could not be found: " & SourceDirName)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oDirectories As DirectoryInfo() = oDirectory.GetDirectories()
|
||||||
|
Directory.CreateDirectory(DestDirName)
|
||||||
|
Dim oFiles As FileInfo() = oDirectory.GetFiles()
|
||||||
|
|
||||||
|
For Each oFile As FileInfo In oFiles
|
||||||
|
Dim tempPath As String = Path.Combine(DestDirName, oFile.Name)
|
||||||
|
oFile.CopyTo(tempPath, False)
|
||||||
|
Next
|
||||||
|
|
||||||
|
If CopySubDirs Then
|
||||||
|
For Each oSubDirectory As DirectoryInfo In oDirectories
|
||||||
|
Dim oTempPath As String = Path.Combine(DestDirName, oSubDirectory.Name)
|
||||||
|
CopyDirectory(oSubDirectory.FullName, oTempPath, CopySubDirs)
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Tries to create a directory and returns its path.
|
||||||
|
''' Returns a temp path if `DirectoryPath` can not be created or written to.
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="DirectoryPath">The directory to create</param>
|
||||||
|
''' <param name="TestWriteAccess">Should a write access test be performed?</param>
|
||||||
|
''' <returns>The used path</returns>
|
||||||
|
Public Function CreateDirectory(DirectoryPath As String, Optional TestWriteAccess As Boolean = True) As String
|
||||||
|
Dim oFinalPath As String
|
||||||
|
If Directory.Exists(DirectoryPath) Then
|
||||||
|
_Logger.Debug("Directory {0} already exists. Skipping.", DirectoryPath)
|
||||||
|
oFinalPath = DirectoryPath
|
||||||
|
Else
|
||||||
|
Try
|
||||||
|
Directory.CreateDirectory(DirectoryPath)
|
||||||
|
oFinalPath = DirectoryPath
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error(ex)
|
||||||
|
_Logger.Warn("Directory {0} could not be created. Temp path will be used instead.", DirectoryPath)
|
||||||
|
oFinalPath = Path.GetTempPath()
|
||||||
|
End Try
|
||||||
|
End If
|
||||||
|
|
||||||
|
If TestWriteAccess AndAlso Not TestPathIsWritable(DirectoryPath) Then
|
||||||
|
_Logger.Warn("Directory {0} is not writable. Temp path will be used instead.", DirectoryPath)
|
||||||
|
oFinalPath = Path.GetTempPath()
|
||||||
|
Else
|
||||||
|
oFinalPath = DirectoryPath
|
||||||
|
End If
|
||||||
|
|
||||||
|
_Logger.Debug("Using path {0}", oFinalPath)
|
||||||
|
|
||||||
|
Return oFinalPath
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function TestPathIsWritable(DirectoryPath As String) As Boolean
|
||||||
|
Try
|
||||||
|
Dim fileAccessPath = Path.Combine(DirectoryPath, FILE_NAME_ACCESS_TEST)
|
||||||
|
Using fs As FileStream = IO.File.Create(fileAccessPath)
|
||||||
|
fs.WriteByte(0)
|
||||||
|
End Using
|
||||||
|
|
||||||
|
IO.File.Delete(fileAccessPath)
|
||||||
|
Return True
|
||||||
|
Catch ex As Exception
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Checks if a file is locked, ie. in use by another process.
|
||||||
|
''' </summary>
|
||||||
|
''' <remarks>
|
||||||
|
''' https://docs.microsoft.com/en-us/dotnet/standard/io/handling-io-errors
|
||||||
|
''' https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use
|
||||||
|
''' </remarks>
|
||||||
|
Public Function TestFileIsLocked(pFilePath As String) As Boolean
|
||||||
|
Try
|
||||||
|
Using stream As FileStream = IO.File.Open(pFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
|
||||||
|
stream.Close()
|
||||||
|
End Using
|
||||||
|
Catch ex As Exception When ((ex.HResult And &HFFFF) = 32)
|
||||||
|
Return True
|
||||||
|
Catch ex As Exception
|
||||||
|
Return True
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function TestPathIsDirectory(Path As String) As Boolean
|
||||||
|
If Not Directory.Exists(Path) Then
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oIsDirectory As Boolean = (System.IO.File.GetAttributes(Path) And FileAttributes.Directory) = FileAttributes.Directory
|
||||||
|
Return oIsDirectory
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateDirectory(pBaseDirectory As String, pDate As Date) As String
|
||||||
|
Dim oDateDirectory = GetDateString(pDate)
|
||||||
|
Dim oFinalDirectory As String = IO.Path.Combine(pBaseDirectory, oDateDirectory)
|
||||||
|
Return oFinalDirectory
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateDirectory(pBaseDirectory As String) As String
|
||||||
|
Return GetDateDirectory(pBaseDirectory, Now)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function CreateDateDirectory(pBaseDirectory As String, pDate As Date) As String
|
||||||
|
Dim oDateDirectory = GetDateString(pDate)
|
||||||
|
Dim oFinalDirectory As String = IO.Path.Combine(pBaseDirectory, oDateDirectory)
|
||||||
|
|
||||||
|
If IO.Directory.Exists(oFinalDirectory) = False Then
|
||||||
|
_Logger.Debug("Path does not exist, creating: [{0}]", oFinalDirectory)
|
||||||
|
Try
|
||||||
|
Directory.CreateDirectory(oFinalDirectory)
|
||||||
|
_Logger.Debug("Created folder [{0}]", oFinalDirectory)
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Warn("Final path [{0}] could not be created!", oFinalDirectory)
|
||||||
|
_Logger.Error(ex)
|
||||||
|
End Try
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return oFinalDirectory
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function CreateDateDirectory(pBaseDirectory As String) As String
|
||||||
|
Return CreateDateDirectory(pBaseDirectory, Now)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateString() As String
|
||||||
|
Return $"{Now:yyyy\\MM\\dd}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateString(pDate As Date) As String
|
||||||
|
Return $"{pDate:yyyy\\MM\\dd}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateTimeString() As String
|
||||||
|
Return $"{Now:yyyy-MM-dd_hh-mm-ffff}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetDateTimeString(pDate As Date) As String
|
||||||
|
Return $"{pDate:yyyy-MM-dd_hh-mm-ffff}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFilenameWithSuffix(pFilePath As String, pSuffix As String)
|
||||||
|
Dim oFileInfo = New IO.FileInfo(pFilePath)
|
||||||
|
Return GetFilenameWithSuffix(IO.Path.GetFileNameWithoutExtension(pFilePath), pSuffix, oFileInfo.Extension.Substring(1))
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFilenameWithSuffix(pBaseString As String, pSuffix As String, pExtension As String)
|
||||||
|
Return $"{pBaseString}-{pSuffix}.{pExtension}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFilenameWithPrefix(pFilePath As String, pPrefix As String)
|
||||||
|
Dim oFileInfo = New IO.FileInfo(pFilePath)
|
||||||
|
Return GetFilenameWithSuffix(IO.Path.GetFileNameWithoutExtension(pFilePath), pPrefix, oFileInfo.Extension.Substring(1))
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetFilenameWithPrefix(pBaseString As String, pPrefix As String, pExtension As String)
|
||||||
|
Return $"{pPrefix}-{pBaseString}.{pExtension}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
End Class
|
||||||
18
Filesystem/FileContainer/DocumentObject.vb
Normal file
18
Filesystem/FileContainer/DocumentObject.vb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Imports System.Runtime.Serialization
|
||||||
|
|
||||||
|
<Serializable>
|
||||||
|
Public Class DocumentObject
|
||||||
|
|
||||||
|
<DataMember(Name:="FileName")>
|
||||||
|
Public ReadOnly FileName As String
|
||||||
|
<DataMember(Name:="ContainerId")>
|
||||||
|
Public ReadOnly ContainerId As String
|
||||||
|
<DataMember(Name:="DocumentId")>
|
||||||
|
Public ReadOnly DocumentId As Int64
|
||||||
|
|
||||||
|
Public Sub New(ContainerId As String, DocumentId As Int64, FileName As String)
|
||||||
|
Me.ContainerId = ContainerId
|
||||||
|
Me.DocumentId = DocumentId
|
||||||
|
Me.FileName = FileName
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
193
Filesystem/FileContainer/FileContainer.vb
Normal file
193
Filesystem/FileContainer/FileContainer.vb
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
Imports System.IO
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
Imports DigitalData.Modules.Encryption
|
||||||
|
Imports ProtoBuf
|
||||||
|
|
||||||
|
''' <module>FileContainer</module>
|
||||||
|
''' <version>0.0.0.2</version>
|
||||||
|
''' <date>21.11.2018</date>
|
||||||
|
''' <summary>
|
||||||
|
''' File Container for securely saving files
|
||||||
|
''' </summary>
|
||||||
|
''' <dependencies>
|
||||||
|
''' NLog, >= 4.5.8
|
||||||
|
''' </dependencies>
|
||||||
|
''' <params>
|
||||||
|
''' LogConfig, DigitalData.Module.Logging.LogConfig
|
||||||
|
''' A LogConfig object
|
||||||
|
''' Password, String
|
||||||
|
''' The Password to Encrypt
|
||||||
|
''' Path, String
|
||||||
|
''' The Path to save/load the container
|
||||||
|
''' </params>
|
||||||
|
''' <example>
|
||||||
|
''' dim oContainer = Container.Create(logConfig, "pass", "E:\some.container")
|
||||||
|
''' dim oContainer = Container.Load(logConfig, "pass", "E:\some.container")
|
||||||
|
'''
|
||||||
|
''' dim oContainer = new Container(logConfig, "pass", "E:\some.container")
|
||||||
|
''' oContainer.Save()
|
||||||
|
'''
|
||||||
|
''' dim oContainer = new Container(logConfig, "pass", "E:\some.container")
|
||||||
|
''' oContainer.Contents = oSomeData
|
||||||
|
''' oContainer.Save()
|
||||||
|
'''
|
||||||
|
''' dim oContainer = new Container(logConfig, "pass", "E:\some.container")
|
||||||
|
''' oContainer.Load()
|
||||||
|
''' dim oContents = oContainer.Contents
|
||||||
|
'''
|
||||||
|
''' dim oContainer = new Container(logConfig, "pass", "E:\some.container")
|
||||||
|
''' oContainer.Load()
|
||||||
|
''' oContainer.Contents = oSomeOtherData
|
||||||
|
''' oContainer.Save()
|
||||||
|
''' oContainer.SaveAs("E:\some2.container")
|
||||||
|
''' </example>
|
||||||
|
Public Class FileContainer
|
||||||
|
Private _crypto As Encryption.Encryption
|
||||||
|
Private _compression As Compression
|
||||||
|
Private _inner As FileContainerInner
|
||||||
|
Private _logger As Logger
|
||||||
|
Private _logConfig As LogConfig
|
||||||
|
Private _path As String
|
||||||
|
|
||||||
|
Public Property Contents As Byte()
|
||||||
|
Get
|
||||||
|
Return _inner.Contents
|
||||||
|
End Get
|
||||||
|
Set(value As Byte())
|
||||||
|
_inner.Contents = value
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
Public ReadOnly Property ContainerId As String
|
||||||
|
Get
|
||||||
|
Return _inner.FileId
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Public ReadOnly Property CreatedAt As String
|
||||||
|
Get
|
||||||
|
Return _inner.CreatedAt
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
Public ReadOnly Property UpdatedAt As String
|
||||||
|
Get
|
||||||
|
Return _inner.UpdatedAt
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
|
Public Shared Function Create(LogConfig As LogConfig, Password As String) As FileContainer
|
||||||
|
Dim oContainer = New FileContainer(LogConfig, Password)
|
||||||
|
Return oContainer
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Shared Function Load(LogConfig As LogConfig, Password As String, Path As String) As FileContainer
|
||||||
|
Dim oContainer = New FileContainer(LogConfig, Password, Path)
|
||||||
|
oContainer.Load()
|
||||||
|
Return oContainer
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub New(LogConfig As LogConfig, Password As String)
|
||||||
|
_logger = LogConfig.GetLogger()
|
||||||
|
_crypto = New Encryption.Encryption(LogConfig, Password)
|
||||||
|
_compression = New Compression(LogConfig)
|
||||||
|
_inner = New FileContainerInner()
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub New(LogConfig As LogConfig, Password As String, Path As String)
|
||||||
|
MyClass.New(LogConfig, Password)
|
||||||
|
_path = Path
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub SetFile(Contents As Byte(), FileName As String)
|
||||||
|
_inner.Contents = Contents
|
||||||
|
_inner.UpdatedAt = Date.Now
|
||||||
|
_inner.FileName = FileName
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function GetFile() As FileContainerInner
|
||||||
|
Return _inner
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub Save()
|
||||||
|
If IsNothing(_path) Then
|
||||||
|
Throw New ArgumentException("Path not set")
|
||||||
|
End If
|
||||||
|
|
||||||
|
SaveAs(_path)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub SaveAs(Path As String)
|
||||||
|
Try
|
||||||
|
WriteBytesToFile(TransformToBytes(_inner), Path)
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Throw ex
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub Load()
|
||||||
|
If IsNothing(_path) Then
|
||||||
|
Throw New ArgumentException("Path not set")
|
||||||
|
End If
|
||||||
|
|
||||||
|
LoadFrom(_path)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub LoadFrom(Path As String)
|
||||||
|
Try
|
||||||
|
_inner = TransformToObject(ReadBytesFromFile(_path))
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Throw ex
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Function TransformToBytes([Object] As FileContainerInner) As Byte()
|
||||||
|
Dim oBytes = Serialize([Object])
|
||||||
|
Dim oCompressed = _compression.Compress(oBytes)
|
||||||
|
Dim oEncrypted = _crypto.Encrypt(oCompressed)
|
||||||
|
Return oEncrypted
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function TransformToObject(Bytes As Byte()) As FileContainerInner
|
||||||
|
Dim oDecrypted = _crypto.Decrypt(Bytes)
|
||||||
|
Dim oDecompressed = _compression.Decompress(oDecrypted)
|
||||||
|
Dim oObject = Deserialize(oDecompressed)
|
||||||
|
Return oObject
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function Serialize(InnerData As FileContainerInner) As Byte()
|
||||||
|
Dim oBinaryData As Byte()
|
||||||
|
|
||||||
|
Using oStream As New MemoryStream
|
||||||
|
Serializer.Serialize(oStream, InnerData)
|
||||||
|
oBinaryData = oStream.ToArray()
|
||||||
|
End Using
|
||||||
|
|
||||||
|
Return oBinaryData
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function Deserialize(InnerData As Byte()) As FileContainerInner
|
||||||
|
Dim oObject As FileContainerInner
|
||||||
|
|
||||||
|
Using oStream As New MemoryStream(InnerData)
|
||||||
|
oObject = Serializer.Deserialize(Of FileContainerInner)(oStream)
|
||||||
|
End Using
|
||||||
|
|
||||||
|
Return oObject
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Sub WriteBytesToFile(Data As Byte(), FilePath As String)
|
||||||
|
Using oSourceStream As New FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)
|
||||||
|
oSourceStream.Write(Data, 0, Data.Length)
|
||||||
|
oSourceStream.Flush()
|
||||||
|
End Using
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Function ReadBytesFromFile(FilePath As String) As Byte()
|
||||||
|
Using oFileStream = New FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096)
|
||||||
|
Dim oBuffer As Byte() = New Byte(oFileStream.Length - 1) {}
|
||||||
|
oFileStream.Read(oBuffer, 0, oFileStream.Length)
|
||||||
|
oFileStream.Close()
|
||||||
|
Return oBuffer
|
||||||
|
End Using
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
23
Filesystem/FileContainer/FileContainerInner.vb
Normal file
23
Filesystem/FileContainer/FileContainerInner.vb
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Imports ProtoBuf
|
||||||
|
|
||||||
|
<Serializable>
|
||||||
|
<ProtoContract>
|
||||||
|
Public Class FileContainerInner
|
||||||
|
<ProtoMember(1)>
|
||||||
|
Public FileId As String
|
||||||
|
<ProtoMember(2)>
|
||||||
|
Public Contents As Byte()
|
||||||
|
<ProtoMember(3)>
|
||||||
|
Public CreatedAt As DateTime
|
||||||
|
<ProtoMember(4)>
|
||||||
|
Public UpdatedAt As DateTime
|
||||||
|
<ProtoMember(5)>
|
||||||
|
Public FileName As String
|
||||||
|
|
||||||
|
Public Sub New()
|
||||||
|
FileId = Guid.NewGuid().ToString
|
||||||
|
CreatedAt = Date.Now
|
||||||
|
UpdatedAt = Date.Now
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
End Class
|
||||||
132
Filesystem/FileWatcher/FileWatcher.vb
Normal file
132
Filesystem/FileWatcher/FileWatcher.vb
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
Imports System.IO
|
||||||
|
Imports DigitalData.Modules.Filesystem
|
||||||
|
Imports DigitalData.Modules.Filesystem.FileWatcherFilters
|
||||||
|
Imports DigitalData.Modules.Logging
|
||||||
|
|
||||||
|
|
||||||
|
Public Class FileWatcher
|
||||||
|
' Internals
|
||||||
|
Private ReadOnly _Logger As Logger
|
||||||
|
Private ReadOnly _Watchers As List(Of FileSystemWatcher)
|
||||||
|
Private ReadOnly _Files As Dictionary(Of String, FileWatcherProperties)
|
||||||
|
Private ReadOnly _Filters As List(Of BaseFileFilter)
|
||||||
|
|
||||||
|
' Options
|
||||||
|
Private _Path As String
|
||||||
|
|
||||||
|
' Public Events
|
||||||
|
Public Event FileSaved(ByVal FullName As String, ByVal IsSpecial As Boolean)
|
||||||
|
|
||||||
|
Public Sub New(LogConfig As LogConfig, Path As String, Optional Filters As List(Of BaseFileFilter) = Nothing)
|
||||||
|
_Logger = LogConfig.GetLogger()
|
||||||
|
_Files = New Dictionary(Of String, FileWatcherProperties)
|
||||||
|
_Watchers = New List(Of FileSystemWatcher)
|
||||||
|
_Filters = IIf(IsNothing(Filters), GetDefaultFilters(), Filters)
|
||||||
|
_Path = Path
|
||||||
|
|
||||||
|
For Each oFilePath In Directory.EnumerateFiles(_Path)
|
||||||
|
Try
|
||||||
|
If IO.File.Exists(oFilePath) Then
|
||||||
|
_Files.Add(oFilePath, New FileWatcherProperties With {
|
||||||
|
.CreatedAt = DateTime.Now,
|
||||||
|
.ChangedAt = Nothing
|
||||||
|
})
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
_Logger.Error(ex)
|
||||||
|
_Logger.Warn("File {0} cannot be watched!")
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub Add(Filter As String)
|
||||||
|
_Watchers.Add(CreateWatcher(Filter))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub Start()
|
||||||
|
For Each oWatcher In _Watchers
|
||||||
|
oWatcher.EnableRaisingEvents = True
|
||||||
|
Next
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub [Stop]()
|
||||||
|
For Each oWatcher In _Watchers
|
||||||
|
If Not IsNothing(oWatcher) Then
|
||||||
|
oWatcher.EnableRaisingEvents = False
|
||||||
|
oWatcher.Dispose()
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Function GetDefaultFilters()
|
||||||
|
Return New List(Of BaseFileFilter) From {
|
||||||
|
New TempFileFilter,
|
||||||
|
New OfficeFileFilter
|
||||||
|
}
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function CreateWatcher(Filter As String)
|
||||||
|
Dim oWatcher = New FileSystemWatcher() With {
|
||||||
|
.Path = _Path,
|
||||||
|
.Filter = Filter,
|
||||||
|
.NotifyFilter = NotifyFilters.LastAccess _
|
||||||
|
Or NotifyFilters.LastWrite _
|
||||||
|
Or NotifyFilters.FileName _
|
||||||
|
Or NotifyFilters.Size _
|
||||||
|
Or NotifyFilters.FileName _
|
||||||
|
Or NotifyFilters.Attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
AddHandler oWatcher.Created, AddressOf HandleFileCreated
|
||||||
|
AddHandler oWatcher.Changed, AddressOf HandleFileChanged
|
||||||
|
AddHandler oWatcher.Deleted, AddressOf HandleFileDeleted
|
||||||
|
AddHandler oWatcher.Renamed, AddressOf HandleFileRenamed
|
||||||
|
|
||||||
|
Return oWatcher
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Sub HandleFileCreated(sender As Object, e As FileSystemEventArgs)
|
||||||
|
_Files.Add(e.FullPath, New FileWatcherProperties())
|
||||||
|
_Logger.Debug("[Created] " & e.FullPath)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' This may fire twice for a single save operation,
|
||||||
|
''' see: https://blogs.msdn.microsoft.com/oldnewthing/20140507-00/?p=1053/
|
||||||
|
''' </summary>
|
||||||
|
Private Sub HandleFileChanged(sender As Object, e As FileSystemEventArgs)
|
||||||
|
_Files.Item(e.FullPath).ChangedAt = DateTime.Now
|
||||||
|
_Logger.Debug("[Changed] " & e.FullPath)
|
||||||
|
|
||||||
|
Dim oShouldRaiseSave As Boolean = Not _Filters.Any(Function(oFilter)
|
||||||
|
Return oFilter.ShouldFilter(e)
|
||||||
|
End Function)
|
||||||
|
|
||||||
|
If oShouldRaiseSave Then
|
||||||
|
RaiseEvent FileSaved(e.FullPath, False)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
Private Sub HandleFileDeleted(sender As Object, e As FileSystemEventArgs)
|
||||||
|
_Files.Remove(e.FullPath)
|
||||||
|
_Logger.Debug("[Removed] " & e.FullPath)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub HandleFileRenamed(sender As Object, e As RenamedEventArgs)
|
||||||
|
Dim oProperties = _Files.Item(e.OldFullPath)
|
||||||
|
_Files.Remove(e.OldFullPath)
|
||||||
|
_Files.Add(e.FullPath, oProperties)
|
||||||
|
' Soll eine umbenannte datei als NEU gelten?
|
||||||
|
|
||||||
|
Dim oShouldRaiseSave = _Filters.Any(Function(oFilter)
|
||||||
|
Return oFilter.ShouldRaiseSave(e)
|
||||||
|
End Function)
|
||||||
|
|
||||||
|
If oShouldRaiseSave Then
|
||||||
|
RaiseEvent FileSaved(e.OldFullPath, True)
|
||||||
|
End If
|
||||||
|
|
||||||
|
_Logger.Debug("[Renamed] {0} --> {1}", e.OldFullPath, e.FullPath)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
|
||||||
|
End Class
|
||||||
61
Filesystem/FileWatcher/FileWatcherFilters.vb
Normal file
61
Filesystem/FileWatcher/FileWatcherFilters.vb
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
Imports System.IO
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Built-in filters for FileWatcher that are useful for correctly detecting changes on Office documents (currently Office 2016)
|
||||||
|
''' </summary>
|
||||||
|
Public Class FileWatcherFilters
|
||||||
|
''' <summary>
|
||||||
|
''' Base Filter that all filters must inherit from
|
||||||
|
''' Provides two functions that may be overridden and some useful file extension lists
|
||||||
|
''' </summary>
|
||||||
|
Public MustInherit Class BaseFileFilter
|
||||||
|
Public TempFiles As New List(Of String) From {".tmp", ""}
|
||||||
|
|
||||||
|
Public Overridable Function ShouldFilter(e As FileSystemEventArgs) As Boolean
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
|
Public Overridable Function ShouldRaiseSave(e As RenamedEventArgs) As Boolean
|
||||||
|
Return False
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Simple Filter that filters changes made on temporary files
|
||||||
|
''' </summary>
|
||||||
|
Public Class TempFileFilter
|
||||||
|
Inherits BaseFileFilter
|
||||||
|
|
||||||
|
Public Overrides Function ShouldFilter(e As FileSystemEventArgs) As Boolean
|
||||||
|
Dim oFileInfo As New FileInfo(e.FullPath)
|
||||||
|
Return TempFiles.Contains(oFileInfo.Extension)
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Filter to detect changes on Office files
|
||||||
|
''' </summary>
|
||||||
|
Public Class OfficeFileFilter
|
||||||
|
Inherits BaseFileFilter
|
||||||
|
|
||||||
|
Public OfficeFiles As New List(Of String) From {".docx", ".pptx", ".xlsx"}
|
||||||
|
|
||||||
|
Public Overrides Function ShouldFilter(e As FileSystemEventArgs) As Boolean
|
||||||
|
Dim oFileInfo As New FileInfo(e.FullPath)
|
||||||
|
Return OfficeFiles.Contains(oFileInfo.Extension) And oFileInfo.Name.StartsWith("~")
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Overrides Function ShouldRaiseSave(e As RenamedEventArgs) As Boolean
|
||||||
|
Dim oIsTransform = OfficeFiles.Any(Function(Extension As String)
|
||||||
|
Return e.OldName.EndsWith(Extension)
|
||||||
|
End Function)
|
||||||
|
|
||||||
|
' Check if it is renamed to a temp file
|
||||||
|
Dim oIsTempFile = TempFiles.Any(Function(Extension)
|
||||||
|
Return e.Name.EndsWith(Extension)
|
||||||
|
End Function)
|
||||||
|
|
||||||
|
|
||||||
|
Return oIsTransform And oIsTempFile
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Class
|
||||||
10
Filesystem/FileWatcher/FileWatcherProperties.vb
Normal file
10
Filesystem/FileWatcher/FileWatcherProperties.vb
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Public Class FileWatcherProperties
|
||||||
|
Public Property CreatedAt As DateTime
|
||||||
|
Public Property ChangedAt As DateTime
|
||||||
|
Public ReadOnly Property HasChanged As Boolean
|
||||||
|
Public Sub New()
|
||||||
|
CreatedAt = DateTime.Now
|
||||||
|
ChangedAt = Nothing
|
||||||
|
HasChanged = False
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
134
Filesystem/Filesystem.vbproj
Normal file
134
Filesystem/Filesystem.vbproj
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{991D0231-4623-496D-8BD0-9CA906029CBC}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>DigitalData.Modules.Filesystem</RootNamespace>
|
||||||
|
<AssemblyName>DigitalData.Modules.Filesystem</AssemblyName>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<MyType>Windows</MyType>
|
||||||
|
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DefineDebug>true</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.Filesystem.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<DefineDebug>false</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.Filesystem.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionExplicit>On</OptionExplicit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionCompare>Binary</OptionCompare>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionStrict>Off</OptionStrict>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionInfer>On</OptionInfer>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging, Version=2.6.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="protobuf-net, Version=2.4.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\protobuf-net.2.4.0\lib\net40\protobuf-net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Import Include="Microsoft.VisualBasic" />
|
||||||
|
<Import Include="System" />
|
||||||
|
<Import Include="System.Collections" />
|
||||||
|
<Import Include="System.Collections.Generic" />
|
||||||
|
<Import Include="System.Data" />
|
||||||
|
<Import Include="System.Diagnostics" />
|
||||||
|
<Import Include="System.Linq" />
|
||||||
|
<Import Include="System.Xml.Linq" />
|
||||||
|
<Import Include="System.Threading.Tasks" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="FileContainer\DocumentObject.vb" />
|
||||||
|
<Compile Include="FileContainer\FileContainer.vb" />
|
||||||
|
<Compile Include="File.vb" />
|
||||||
|
<Compile Include="FileContainer\FileContainerInner.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcher.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcherFilters.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcherProperties.vb" />
|
||||||
|
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||||
|
<Compile Include="My Project\Application.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Application.myapp</DependentUpon>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Resources.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Settings.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="My Project\Resources.resx">
|
||||||
|
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||||
|
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="My Project\Application.myapp">
|
||||||
|
<Generator>MyApplicationCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="My Project\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<CustomToolNamespace>My</CustomToolNamespace>
|
||||||
|
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Encryption\Encryption.vbproj">
|
||||||
|
<Project>{8a8f20fc-c46e-41ac-bee7-218366cfff99}</Project>
|
||||||
|
<Name>Encryption</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
|
</Project>
|
||||||
13
Filesystem/My Project/Application.Designer.vb
generated
Normal file
13
Filesystem/My Project/Application.Designer.vb
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
'------------------------------------------------------------------------------
|
||||||
|
' <auto-generated>
|
||||||
|
' Dieser Code wurde von einem Tool generiert.
|
||||||
|
' Laufzeitversion:4.0.30319.42000
|
||||||
|
'
|
||||||
|
' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||||
|
' der Code erneut generiert wird.
|
||||||
|
' </auto-generated>
|
||||||
|
'------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Option Strict On
|
||||||
|
Option Explicit On
|
||||||
|
|
||||||
10
Filesystem/My Project/Application.myapp
Normal file
10
Filesystem/My Project/Application.myapp
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||||
|
<MySubMain>false</MySubMain>
|
||||||
|
<SingleInstance>false</SingleInstance>
|
||||||
|
<ShutdownMode>0</ShutdownMode>
|
||||||
|
<EnableVisualStyles>true</EnableVisualStyles>
|
||||||
|
<AuthenticationMode>0</AuthenticationMode>
|
||||||
|
<ApplicationType>1</ApplicationType>
|
||||||
|
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||||
|
</MyApplicationData>
|
||||||
35
Filesystem/My Project/AssemblyInfo.vb
Normal file
35
Filesystem/My Project/AssemblyInfo.vb
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
Imports System
|
||||||
|
Imports System.Reflection
|
||||||
|
Imports System.Runtime.InteropServices
|
||||||
|
|
||||||
|
' Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
' die einer Assembly zugeordnet sind.
|
||||||
|
|
||||||
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
|
<Assembly: AssemblyTitle("Modules.Filesystem")>
|
||||||
|
<Assembly: AssemblyDescription("Stellt Funktionen für das Filesystem und Container zur Verfügung")>
|
||||||
|
<Assembly: AssemblyCompany("Digital Data")>
|
||||||
|
<Assembly: AssemblyProduct("Modules.Filesystem")>
|
||||||
|
<Assembly: AssemblyCopyright("Copyright © 2022")>
|
||||||
|
<Assembly: AssemblyTrademark("1.3.1.0")>
|
||||||
|
|
||||||
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
|
'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird.
|
||||||
|
<Assembly: Guid("2787495c-e65f-4730-be0c-af87bede4b11")>
|
||||||
|
|
||||||
|
' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
'
|
||||||
|
' Hauptversion
|
||||||
|
' Nebenversion
|
||||||
|
' Buildnummer
|
||||||
|
' Revision
|
||||||
|
'
|
||||||
|
' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||||
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
|
<Assembly: AssemblyVersion("1.3.3.0")>
|
||||||
|
<Assembly: AssemblyFileVersion("1.3.3.0")>
|
||||||
63
Filesystem/My Project/Resources.Designer.vb
generated
Normal file
63
Filesystem/My Project/Resources.Designer.vb
generated
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
'------------------------------------------------------------------------------
|
||||||
|
' <auto-generated>
|
||||||
|
' Dieser Code wurde von einem Tool generiert.
|
||||||
|
' Laufzeitversion:4.0.30319.42000
|
||||||
|
'
|
||||||
|
' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||||
|
' der Code erneut generiert wird.
|
||||||
|
' </auto-generated>
|
||||||
|
'------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Option Strict On
|
||||||
|
Option Explicit On
|
||||||
|
|
||||||
|
Imports System
|
||||||
|
|
||||||
|
Namespace My.Resources
|
||||||
|
|
||||||
|
'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
|
||||||
|
'-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
|
||||||
|
'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
|
||||||
|
'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
|
||||||
|
'''<summary>
|
||||||
|
''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
|
||||||
|
'''</summary>
|
||||||
|
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0"), _
|
||||||
|
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||||
|
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
|
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||||
|
Friend Module Resources
|
||||||
|
|
||||||
|
Private resourceMan As Global.System.Resources.ResourceManager
|
||||||
|
|
||||||
|
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
|
||||||
|
'''</summary>
|
||||||
|
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
|
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||||
|
Get
|
||||||
|
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||||
|
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.Filesystem.Resources", GetType(Resources).Assembly)
|
||||||
|
resourceMan = temp
|
||||||
|
End If
|
||||||
|
Return resourceMan
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
|
||||||
|
'''<summary>
|
||||||
|
''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
|
||||||
|
''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
|
||||||
|
'''</summary>
|
||||||
|
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
|
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||||
|
Get
|
||||||
|
Return resourceCulture
|
||||||
|
End Get
|
||||||
|
Set
|
||||||
|
resourceCulture = value
|
||||||
|
End Set
|
||||||
|
End Property
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
117
Filesystem/My Project/Resources.resx
Normal file
117
Filesystem/My Project/Resources.resx
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
73
Filesystem/My Project/Settings.Designer.vb
generated
Normal file
73
Filesystem/My Project/Settings.Designer.vb
generated
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
'------------------------------------------------------------------------------
|
||||||
|
' <auto-generated>
|
||||||
|
' Dieser Code wurde von einem Tool generiert.
|
||||||
|
' Laufzeitversion:4.0.30319.42000
|
||||||
|
'
|
||||||
|
' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||||
|
' der Code erneut generiert wird.
|
||||||
|
' </auto-generated>
|
||||||
|
'------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Option Strict On
|
||||||
|
Option Explicit On
|
||||||
|
|
||||||
|
|
||||||
|
Namespace My
|
||||||
|
|
||||||
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
|
Partial Friend NotInheritable Class MySettings
|
||||||
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|
||||||
|
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||||
|
|
||||||
|
#Region "Automatische My.Settings-Speicherfunktion"
|
||||||
|
#If _MyType = "WindowsForms" Then
|
||||||
|
Private Shared addedHandler As Boolean
|
||||||
|
|
||||||
|
Private Shared addedHandlerLockObject As New Object
|
||||||
|
|
||||||
|
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
|
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
|
||||||
|
If My.Application.SaveMySettingsOnExit Then
|
||||||
|
My.Settings.Save()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
#End If
|
||||||
|
#End Region
|
||||||
|
|
||||||
|
Public Shared ReadOnly Property [Default]() As MySettings
|
||||||
|
Get
|
||||||
|
|
||||||
|
#If _MyType = "WindowsForms" Then
|
||||||
|
If Not addedHandler Then
|
||||||
|
SyncLock addedHandlerLockObject
|
||||||
|
If Not addedHandler Then
|
||||||
|
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||||
|
addedHandler = True
|
||||||
|
End If
|
||||||
|
End SyncLock
|
||||||
|
End If
|
||||||
|
#End If
|
||||||
|
Return defaultInstance
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
|
|
||||||
|
Namespace My
|
||||||
|
|
||||||
|
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||||
|
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||||
|
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||||
|
Friend Module MySettingsProperty
|
||||||
|
|
||||||
|
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||||
|
Friend ReadOnly Property Settings() As Global.DigitalData.Modules.Filesystem.My.MySettings
|
||||||
|
Get
|
||||||
|
Return Global.DigitalData.Modules.Filesystem.My.MySettings.Default
|
||||||
|
End Get
|
||||||
|
End Property
|
||||||
|
End Module
|
||||||
|
End Namespace
|
||||||
7
Filesystem/My Project/Settings.settings
Normal file
7
Filesystem/My Project/Settings.settings
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
||||||
|
<Profiles>
|
||||||
|
<Profile Name="(Default)" />
|
||||||
|
</Profiles>
|
||||||
|
<Settings />
|
||||||
|
</SettingsFile>
|
||||||
6
Filesystem/packages.config
Normal file
6
Filesystem/packages.config
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="NLog" version="5.0.5" targetFramework="net48" />
|
||||||
|
<package id="NuGet.CommandLine" version="6.13.2" targetFramework="net48" developmentDependency="true" />
|
||||||
|
<package id="protobuf-net" version="2.4.0" targetFramework="net461" />
|
||||||
|
</packages>
|
||||||
@@ -220,10 +220,23 @@ Public Class ActiveDirectoryInterface
|
|||||||
Return oUsers
|
Return oUsers
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
Private Function GetPartFromFirstOU(dnString As String) As String
|
||||||
|
Dim keyword As String = "OU="
|
||||||
|
Dim index As Integer = dnString.IndexOf(keyword)
|
||||||
|
|
||||||
Public Function FindUserWithFilter(User As UserPrincipalEx, Filter As String) As Boolean
|
If index <> -1 Then
|
||||||
|
Return dnString.Substring(index)
|
||||||
|
Else
|
||||||
|
Return "No_Result_from_GetPartFromFirstOU"
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
Public Function FindUserWithFilter(pUser As UserPrincipalEx, pFilter As String) As Boolean
|
||||||
Try
|
Try
|
||||||
Dim oRootPath = String.Join(","c, User.DistinguishedName.Split(","c).Skip(1))
|
'Dim oRootPath = String.Join(","c, pUser.DistinguishedName.Split(","c).Skip(1))
|
||||||
|
Dim oRootPath = GetPartFromFirstOU(pUser.DistinguishedName)
|
||||||
|
_logger.Debug("FindUserWithFilter: pUser.DistinguishedName: [{0}]", pUser.DistinguishedName)
|
||||||
|
_logger.Debug("FindUserWithFilter: oRootPath from User.DistinguishedName: [{0}]", oRootPath)
|
||||||
|
|
||||||
Dim oPlaceholder = "@SAMACCOUNTNAME"
|
Dim oPlaceholder = "@SAMACCOUNTNAME"
|
||||||
Dim oProtocol = "LDAP://"
|
Dim oProtocol = "LDAP://"
|
||||||
Dim oEntry As New DirectoryEntry(oProtocol & oRootPath) With {
|
Dim oEntry As New DirectoryEntry(oProtocol & oRootPath) With {
|
||||||
@@ -231,22 +244,25 @@ Public Class ActiveDirectoryInterface
|
|||||||
.Password = Nothing,
|
.Password = Nothing,
|
||||||
.AuthenticationType = AuthenticationTypes.Secure
|
.AuthenticationType = AuthenticationTypes.Secure
|
||||||
}
|
}
|
||||||
|
_logger.Debug("FindUserWithFilter: got oDirectoryEntry (Path): [{0}]", oProtocol & oRootPath)
|
||||||
If Filter = String.Empty Then
|
If pFilter = String.Empty Then
|
||||||
_logger.Debug("FindUserWithFilter: Filter was empty, returning True for User [{0}]", User.SamAccountName)
|
_logger.Debug("FindUserWithFilter: Filter was empty, returning True for User [{0}]", pUser.SamAccountName)
|
||||||
Return True
|
Return True
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If Filter.Contains(oPlaceholder) Then
|
If pFilter.Contains(oPlaceholder) Then
|
||||||
Filter = Filter.Replace(oPlaceholder, User.SamAccountName)
|
pFilter = pFilter.Replace(oPlaceholder, pUser.SamAccountName)
|
||||||
|
_logger.Debug("FindUserWithFilter: Filter.Contains(oPlaceholder) [{0}]", pFilter)
|
||||||
Else
|
Else
|
||||||
_logger.Warn("FindUserWithFilter: Placeholder [{0}] was not found in filter. Results may not be correct.")
|
_logger.Warn("FindUserWithFilter: Placeholder [{0}] was not found in filter. Results may not be correct.")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Dim oSearcher As New DirectorySearcher(oEntry, Filter)
|
Dim oSearcher As New DirectorySearcher(oEntry, pFilter)
|
||||||
|
_logger.Debug("FindUserWithFilter: oSearcher created! Now executing DirectoryServices.SearchResult with .FindOne ...")
|
||||||
Dim oResult As SearchResult = oSearcher.FindOne()
|
Dim oResult As SearchResult = oSearcher.FindOne()
|
||||||
|
|
||||||
If oResult IsNot Nothing AndAlso oResult.Path.Replace(oProtocol, String.Empty) = User.DistinguishedName Then
|
If oResult IsNot Nothing AndAlso oResult.Path.Replace(oProtocol, String.Empty) = pUser.DistinguishedName Then
|
||||||
|
_logger.Debug("FindUserWithFilter: We have an oResult - oResult.Path: [{0}]", oResult.Path)
|
||||||
Return True
|
Return True
|
||||||
Else
|
Else
|
||||||
Return False
|
Return False
|
||||||
|
|||||||
@@ -46,30 +46,170 @@
|
|||||||
<OptionInfer>On</OptionInfer>
|
<OptionInfer>On</OptionInfer>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="GdPicture.NET.14, Version=14.2.90.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
<Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\GdPicture.14.2.90\lib\net462\GdPicture.NET.14.dll</HintPath>
|
<HintPath>..\packages\BouncyCastle.Cryptography.2.5.0\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Base">
|
||||||
|
<HintPath>..\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Database">
|
||||||
|
<HintPath>..\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging">
|
||||||
|
<HintPath>..\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DocumentFormat.OpenXml, Version=3.2.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DocumentFormat.OpenXml.3.2.0\lib\net46\DocumentFormat.OpenXml.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DocumentFormat.OpenXml.Framework, Version=3.2.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DocumentFormat.OpenXml.Framework.3.2.0\lib\net46\DocumentFormat.OpenXml.Framework.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.barcode.1d.writer, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.barcode.1d.writer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.barcode.2d.writer, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.barcode.2d.writer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.CAD, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.CAD.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.CAD.DWG, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.CAD.DWG.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Common, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Common.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Document, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Document.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Email, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Email.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.HTML, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.HTML.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Formats, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Formats.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Formats.Conversion, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Formats.Conversion.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Rendering, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Rendering.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.MSOfficeBinary, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.MSOfficeBinary.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenDocument, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenDocument.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenXML, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenXML.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenXML.Templating, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenXML.Templating.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.PDF, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.PDF.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.RTF, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.RTF.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.SVG, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.SVG.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.wia.gateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6973b5c22dcf45f7, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.wia.gateway.dll</HintPath>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="OpenMcdf, Version=2.4.1.0, Culture=neutral, PublicKeyToken=fdbb1629d7c00800, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\OpenMcdf.2.4.1\lib\net40\OpenMcdf.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="protobuf-net, Version=3.0.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\protobuf-net.3.2.46\lib\net462\protobuf-net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="protobuf-net.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\protobuf-net.Core.3.2.46\lib\net462\protobuf-net.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="RtfPipe, Version=2.0.7677.4303, Culture=neutral, PublicKeyToken=5f6ab4ce530296d2, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\RtfPipe.2.0.7677.4303\lib\net45\RtfPipe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Buffers, Version=4.0.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Buffers.4.6.0\lib\net462\System.Buffers.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.CodeDom, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.CodeDom.8.0.0\lib\net462\System.CodeDom.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections.Immutable, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Collections.Immutable.8.0.0\lib\net462\System.Collections.Immutable.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.DirectoryServices" />
|
<Reference Include="System.DirectoryServices" />
|
||||||
<Reference Include="System.DirectoryServices.AccountManagement" />
|
<Reference Include="System.DirectoryServices.AccountManagement" />
|
||||||
<Reference Include="System.IO.Compression" />
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.IO.Packaging, Version=8.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.IO.Packaging.8.0.1\lib\net462\System.IO.Packaging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Management" />
|
||||||
|
<Reference Include="System.Memory, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Memory.4.6.0\lib\net462\System.Memory.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Http.Formatting, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.6.0.0\lib\net45\System.Net.Http.Formatting.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Numerics.Vectors, Version=4.1.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Numerics.Vectors.4.6.0\lib\net462\System.Numerics.Vectors.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.0\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.Security" />
|
||||||
|
<Reference Include="System.Security.Cryptography.Pkcs, Version=8.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Security.Cryptography.Pkcs.8.0.1\lib\net462\System.Security.Cryptography.Pkcs.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Json, Version=8.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Json.8.0.6\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Transactions" />
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="WindowsBase" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Import Include="Microsoft.VisualBasic" />
|
<Import Include="Microsoft.VisualBasic" />
|
||||||
@@ -95,6 +235,8 @@
|
|||||||
<Compile Include="GrapQLInterface\LoginData.vb" />
|
<Compile Include="GrapQLInterface\LoginData.vb" />
|
||||||
<Compile Include="GrapQLInterface\LogoutData.vb" />
|
<Compile Include="GrapQLInterface\LogoutData.vb" />
|
||||||
<Compile Include="GrapQLInterface\QueryData.vb" />
|
<Compile Include="GrapQLInterface\QueryData.vb" />
|
||||||
|
<Compile Include="ZUGFeRDInterface\Enums\ErrorCodes.vb" />
|
||||||
|
<Compile Include="ZUGFeRDInterface\Enums\Item_Types.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Exceptions.vb" />
|
<Compile Include="ZUGFeRDInterface\Exceptions.vb" />
|
||||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||||
<Compile Include="My Project\Application.Designer.vb">
|
<Compile Include="My Project\Application.Designer.vb">
|
||||||
@@ -113,8 +255,9 @@
|
|||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ZUGFeRDInterface\PDFConverter.vb" />
|
<Compile Include="ZUGFeRDInterface\PDFConverter.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Peppol_BIS_Billing3017\CreditNoteType.vb" />
|
<Compile Include="ZUGFeRDInterface\Peppol_UBL2.1\CreditNoteType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Peppol_BIS_Billing3017\InvoiceType.vb" />
|
<Compile Include="ZUGFeRDInterface\Peppol_UBL2.1\InvoiceType.vb" />
|
||||||
|
<Compile Include="ZUGFeRDInterface\RejectionStringRow.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Validator.vb" />
|
<Compile Include="ZUGFeRDInterface\Validator.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Version1.0\CrossIndustryDocumentType.vb" />
|
<Compile Include="ZUGFeRDInterface\Version1.0\CrossIndustryDocumentType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface.vb" />
|
<Compile Include="ZUGFeRDInterface.vb" />
|
||||||
@@ -124,7 +267,9 @@
|
|||||||
<Compile Include="ZUGFeRDInterface\Version2.0\CrossIndustryInvoiceType.vb" />
|
<Compile Include="ZUGFeRDInterface\Version2.0\CrossIndustryInvoiceType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Version2.1.1\CrossIndustryInvoiceType.vb" />
|
<Compile Include="ZUGFeRDInterface\Version2.1.1\CrossIndustryInvoiceType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Version2.2_FacturX\CrossIndustryInvoiceType.vb" />
|
<Compile Include="ZUGFeRDInterface\Version2.2_FacturX\CrossIndustryInvoiceType.vb" />
|
||||||
|
<Compile Include="ZUGFeRDInterface\Version2.3_3_FacturX\CrossIndustryInvoiceType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\Version2.3_FacturX\CrossIndustryInvoiceType.vb" />
|
<Compile Include="ZUGFeRDInterface\Version2.3_FacturX\CrossIndustryInvoiceType.vb" />
|
||||||
|
<Compile Include="ZUGFeRDInterface\Version2.4_FacturX\CrossIndustryInvoiceType.vb" />
|
||||||
<Compile Include="ZUGFeRDInterface\XmlItemProperty.vb" />
|
<Compile Include="ZUGFeRDInterface\XmlItemProperty.vb" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -149,14 +294,6 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Base\Base.vbproj">
|
|
||||||
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
|
||||||
<Name>Base</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Database\Database.vbproj">
|
|
||||||
<Project>{eaf0ea75-5fa7-485d-89c7-b2d843b03a96}</Project>
|
|
||||||
<Name>Database</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
<ProjectReference Include="..\Logging\Logging.vbproj">
|
||||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
||||||
<Name>Logging</Name>
|
<Name>Logging</Name>
|
||||||
@@ -167,11 +304,11 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" />
|
<Import Project="..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets')" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets'))" />
|
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
|
|||||||
<Assembly: AssemblyCompany("Digital Data")>
|
<Assembly: AssemblyCompany("Digital Data")>
|
||||||
<Assembly: AssemblyProduct("Modules.Interfaces")>
|
<Assembly: AssemblyProduct("Modules.Interfaces")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("2.2.1.0")>
|
<Assembly: AssemblyTrademark("2.4.3.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2.2.1.0")>
|
<Assembly: AssemblyVersion("2.4.3.0")>
|
||||||
<Assembly: AssemblyFileVersion("2.2.1.0")>
|
<Assembly: AssemblyFileVersion("2.4.3.0")>
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
Imports System.IO
|
Imports System.IO
|
||||||
Imports System.Reflection
|
|
||||||
Imports System.Xml
|
Imports System.Xml
|
||||||
Imports System.Xml.Serialization
|
Imports System.Xml.Serialization
|
||||||
Imports DigitalData.Modules.Interfaces.Exceptions
|
Imports DigitalData.Modules.Interfaces.Exceptions
|
||||||
Imports DigitalData.Modules.Interfaces.PDFEmbeds
|
Imports DigitalData.Modules.Interfaces.PDFEmbeds
|
||||||
Imports DigitalData.Modules.Interfaces.Peppol
|
|
||||||
Imports DigitalData.Modules.Interfaces.ZUGFeRD
|
Imports DigitalData.Modules.Interfaces.ZUGFeRD
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
Imports GdPicture14
|
Imports GdPicture14
|
||||||
@@ -21,16 +19,22 @@ Public Class ZUGFeRDInterface
|
|||||||
Public Const ZUGFERD_SPEC_DEFAULT = "DEFAULT"
|
Public Const ZUGFERD_SPEC_DEFAULT = "DEFAULT"
|
||||||
Public Const ZUGFERD_SPEC_10 = "ZUGFERD_10"
|
Public Const ZUGFERD_SPEC_10 = "ZUGFERD_10"
|
||||||
Public Const ZUGFERD_SPEC_2x = "ZUGFERD_2x"
|
Public Const ZUGFERD_SPEC_2x = "ZUGFERD_2x"
|
||||||
Public Const PEPPOL_SPEC_3x_INVOICE = "PEPPOL_BISBILL_3x_INVOICE"
|
Public Const ZUGFERD_SPEC_2_3x = "ZUGFERD_2_3x"
|
||||||
Public Const PEPPOL_SPEC_3x_CREDITNOTE = "PEPPOL_BISBILL_3x_CREDITNOTE"
|
|
||||||
|
Public Const UBL_SPEC_21 = "UBL_21"
|
||||||
|
|
||||||
Public Const XMLSCHEMA_ZUGFERD_10 = "Version1_0"
|
Public Const XMLSCHEMA_ZUGFERD_10 = "Version1_0"
|
||||||
Public Const XMLSCHEMA_ZUGFERD_20 = "Version2_0"
|
Public Const XMLSCHEMA_ZUGFERD_20 = "Version2_0"
|
||||||
Public Const XMLSCHEMA_ZUGFERD_211 = "Version2_1_1"
|
Public Const XMLSCHEMA_ZUGFERD_211 = "Version2_1_1"
|
||||||
Public Const XMLSCHEMA_ZUGFERD_22 = "Version2_2_FacturX"
|
Public Const XMLSCHEMA_ZUGFERD_22 = "Version2_2_FacturX"
|
||||||
Public Const XMLSCHEMA_ZUGFERD_23 = "Version2_3_FacturX"
|
Public Const XMLSCHEMA_ZUGFERD_23 = "Version2_3_FacturX"
|
||||||
Public Const XMLSCHEMA_PEPPOL_3017_INVOICE = "Version3017_INVOICE"
|
Public Const XMLSCHEMA_ZUGFERD_233 = "Version2_3_3_FacturX"
|
||||||
Public Const XMLSCHEMA_PEPPOL_3017_CREDITNOTE = "Version3017_CREDITNOTE"
|
Public Const XMLSCHEMA_ZUGFERD_24 = "Version2_4_FacturX"
|
||||||
|
Public Const XMLSCHEMA_UBL_21_INVOICE = "UBL2_1_INVOICE"
|
||||||
|
Public Const XMLSCHEMA_UBL_21_CREDITNOTE = "UBL2_1_CREDITNOTE"
|
||||||
|
|
||||||
|
Public Const RECEIPT_TYPE_XML = "XML"
|
||||||
|
Public Const RECEIPT_TYPE_PDF = "PDF"
|
||||||
|
|
||||||
Private ReadOnly ValidFilenames As New List(Of String) From {
|
Private ReadOnly ValidFilenames As New List(Of String) From {
|
||||||
PDFEmbeds.ZUGFERD_XML_FILENAME.ToUpper,
|
PDFEmbeds.ZUGFERD_XML_FILENAME.ToUpper,
|
||||||
@@ -48,17 +52,20 @@ Public Class ZUGFeRDInterface
|
|||||||
UnsupportedFormat
|
UnsupportedFormat
|
||||||
FileTooBig
|
FileTooBig
|
||||||
UnknownError
|
UnknownError
|
||||||
|
NotInUse
|
||||||
End Enum
|
End Enum
|
||||||
|
|
||||||
Public ReadOnly Property FileGroup As FileGroups
|
Public ReadOnly Property FileGroup As FileGroups
|
||||||
Public ReadOnly Property PropertyValues As PropertyValues
|
Public ReadOnly Property PropertyValues As PropertyValues
|
||||||
|
|
||||||
|
|
||||||
Public Class ZugferdOptions
|
Public Class ZugferdOptions
|
||||||
Public Property AllowFacturX_Filename As Boolean = True
|
Public Property AllowFacturX_Filename As Boolean = True
|
||||||
Public Property AllowXRechnung_Filename As Boolean = True
|
Public Property AllowXRechnung_Filename As Boolean = True
|
||||||
Public Property AllowZugferd_1_0_Schema As Boolean = True
|
Public Property AllowZugferd_1_0_Schema As Boolean = True
|
||||||
Public Property AllowZugferd_2_x_Schema As Boolean = True
|
Public Property AllowZugferd_2_x_Schema As Boolean = True
|
||||||
Public Property AllowPeppol_3017_Schema As Boolean = True
|
Public Property AllowZugferd_2_3_x_Schema As Boolean = True
|
||||||
|
Public Property AllowPeppol_3_x_Schema As Boolean = False
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
Public Class ZugferdResult
|
Public Class ZugferdResult
|
||||||
@@ -67,6 +74,10 @@ Public Class ZUGFeRDInterface
|
|||||||
Public Property SchemaObject As Object
|
Public Property SchemaObject As Object
|
||||||
Public Property Specification As String
|
Public Property Specification As String
|
||||||
Public Property UsedXMLSchema As String
|
Public Property UsedXMLSchema As String
|
||||||
|
''' <summary>
|
||||||
|
''' Dateityp des Belegs: PDF oder XML
|
||||||
|
''' </summary>
|
||||||
|
Public Property ReceiptFileType As String
|
||||||
Public Property ValidationErrors As New List(Of ZugferdValidationError)
|
Public Property ValidationErrors As New List(Of ZugferdValidationError)
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
@@ -75,6 +86,7 @@ Public Class ZUGFeRDInterface
|
|||||||
Public ElementValue As String
|
Public ElementValue As String
|
||||||
Public ErrorMessage As String
|
Public ErrorMessage As String
|
||||||
Public ErrorMessageDE As String
|
Public ErrorMessageDE As String
|
||||||
|
Public ErrorMessageToken As String
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
''' <summary>
|
''' <summary>
|
||||||
@@ -124,24 +136,46 @@ Public Class ZUGFeRDInterface
|
|||||||
AllowedFilenames = oAllowedFilenames
|
AllowedFilenames = oAllowedFilenames
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Public Function FilterPropertyMap(pPropertyMap As Dictionary(Of String, XmlItemProperty), pSpecification As String) As Dictionary(Of String, XmlItemProperty)
|
Public Function FilterPropertyMap(pPropertyMapList As List(Of XmlItemProperty), pSpecification As String) As Dictionary(Of String, XmlItemProperty)
|
||||||
_logger.Debug("Filtering Property map for Specification [{0}]", pSpecification)
|
_logger.Debug("Filtering Property map list for Specification [{0}]", pSpecification)
|
||||||
|
|
||||||
If pSpecification = ZUGFERD_SPEC_10 Then
|
If pSpecification = ZUGFERD_SPEC_10 Then
|
||||||
_logger.Debug("Special Case [{0}], including [{1}]", ZUGFERD_SPEC_10, ZUGFERD_SPEC_DEFAULT)
|
Try
|
||||||
Return pPropertyMap.
|
|
||||||
Where(Function(kv) kv.Value.Specification = pSpecification Or kv.Value.Specification = ZUGFERD_SPEC_DEFAULT).
|
_logger.Debug("Special Case [{0}], including [{1}]", ZUGFERD_SPEC_10, ZUGFERD_SPEC_DEFAULT)
|
||||||
ToDictionary(Function(kv) kv.Key, Function(kv) kv.Value)
|
|
||||||
|
Dim countElements As Integer = pPropertyMapList.Where(Function(x) x.Specification = pSpecification Or x.Specification = ZUGFERD_SPEC_DEFAULT).Count
|
||||||
|
_logger.Debug("Property map list contains [{0}] elements for specification [{1}]", countElements, pSpecification)
|
||||||
|
|
||||||
|
Return pPropertyMapList.
|
||||||
|
Where(Function(kv) kv.Specification = pSpecification Or kv.Specification = ZUGFERD_SPEC_DEFAULT).
|
||||||
|
ToDictionary(Function(kv) kv.XMLPath, Function(kv) kv)
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
End Try
|
||||||
Else
|
Else
|
||||||
_logger.Debug("Using Specification [{0}]", pSpecification)
|
|
||||||
Return pPropertyMap.
|
Try
|
||||||
Where(Function(kv) kv.Value.Specification = pSpecification).
|
|
||||||
ToDictionary(Function(kv) kv.Key, Function(kv) kv.Value)
|
Dim countElements As Integer = pPropertyMapList.Where(Function(x) x.Specification = pSpecification).Count
|
||||||
|
_logger.Debug("Property map list contains [{0}] elements for specification [{1}]", countElements, pSpecification)
|
||||||
|
|
||||||
|
Return pPropertyMapList.
|
||||||
|
Where(Function(kv) kv.Specification = pSpecification).
|
||||||
|
ToDictionary(Function(kv) kv.XMLPath, Function(kv) kv)
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
End Try
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
Return Nothing
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function GetSerializedXMLContentFromFile(oFileInfo As FileInfo) As ZugferdResult
|
Public Function GetSerializedXMLContentFromFile(oFileInfo As FileInfo) As ZugferdResult
|
||||||
Dim oResult = New ZugferdResult()
|
Dim oResult = New ZugferdResult()
|
||||||
|
Dim oMessage As String = String.Empty
|
||||||
|
|
||||||
Try
|
Try
|
||||||
Dim oFileSize As Integer = oFileInfo.Length
|
Dim oFileSize As Integer = oFileInfo.Length
|
||||||
@@ -166,7 +200,7 @@ Public Class ZUGFeRDInterface
|
|||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoValidZugferd, "Datei ist eine ungültige XML Datei.")
|
Throw New ZUGFeRDExecption(ErrorCodes.UnsupportedFerdException, "Datei ist eine ungültige XML Datei.")
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
If oResult.ValidationErrors.Any() Then
|
If oResult.ValidationErrors.Any() Then
|
||||||
@@ -182,7 +216,6 @@ Public Class ZUGFeRDInterface
|
|||||||
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
||||||
''' </summary>
|
''' </summary>
|
||||||
''' <param name="Path"></param>
|
''' <param name="Path"></param>
|
||||||
''' <exception cref="ZUGFeRDExecption"></exception>
|
|
||||||
Public Function ExtractZUGFeRDFileWithGDPicture(Path As String) As ZugferdResult
|
Public Function ExtractZUGFeRDFileWithGDPicture(Path As String) As ZugferdResult
|
||||||
Dim oResult = ValidateZUGFeRDFileWithGDPicture(Path)
|
Dim oResult = ValidateZUGFeRDFileWithGDPicture(Path)
|
||||||
oResult = ValidateZUGFeRDDocument(oResult)
|
oResult = ValidateZUGFeRDDocument(oResult)
|
||||||
@@ -200,7 +233,6 @@ Public Class ZUGFeRDInterface
|
|||||||
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
||||||
''' </summary>
|
''' </summary>
|
||||||
''' <param name="Stream"></param>
|
''' <param name="Stream"></param>
|
||||||
''' <exception cref="ZUGFeRDExecption"></exception>
|
|
||||||
Public Function ExtractZUGFeRDFileWithGDPicture(Stream As Stream) As ZugferdResult
|
Public Function ExtractZUGFeRDFileWithGDPicture(Stream As Stream) As ZugferdResult
|
||||||
Dim oResult = ValidateZUGFeRDFileWithGDPicture(Stream)
|
Dim oResult = ValidateZUGFeRDFileWithGDPicture(Stream)
|
||||||
oResult = ValidateZUGFeRDDocument(oResult)
|
oResult = ValidateZUGFeRDDocument(oResult)
|
||||||
@@ -223,7 +255,6 @@ Public Class ZUGFeRDInterface
|
|||||||
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
||||||
''' </summary>
|
''' </summary>
|
||||||
''' <param name="pStream"></param>
|
''' <param name="pStream"></param>
|
||||||
''' <exception cref="ZUGFeRDExecption"></exception>
|
|
||||||
''' <returns>The embedded xml data as an XPath document</returns>
|
''' <returns>The embedded xml data as an XPath document</returns>
|
||||||
Public Function ValidateZUGFeRDFileWithGDPicture(pStream As Stream) As ZugferdResult
|
Public Function ValidateZUGFeRDFileWithGDPicture(pStream As Stream) As ZugferdResult
|
||||||
Dim oEmbedExtractor = New PDFEmbeds(_logConfig)
|
Dim oEmbedExtractor = New PDFEmbeds(_logConfig)
|
||||||
@@ -242,7 +273,7 @@ Public Class ZUGFeRDInterface
|
|||||||
Throw ex
|
Throw ex
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Warn("Error while validating ZUGFeRD file with GDPicture")
|
_logger.Warn("Error while validating eInvoice file with GDPicture")
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
Throw ex
|
Throw ex
|
||||||
End Try
|
End Try
|
||||||
@@ -252,18 +283,23 @@ Public Class ZUGFeRDInterface
|
|||||||
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
''' Validates a ZUGFeRD File and extracts the XML Document from it
|
||||||
''' </summary>
|
''' </summary>
|
||||||
''' <param name="pPath"></param>
|
''' <param name="pPath"></param>
|
||||||
''' <exception cref="ZUGFeRDExecption"></exception>
|
|
||||||
''' <returns>The embedded xml data as an XPath document</returns>
|
''' <returns>The embedded xml data as an XPath document</returns>
|
||||||
Public Function ValidateZUGFeRDFileWithGDPicture(pPath As String) As ZugferdResult
|
Public Function ValidateZUGFeRDFileWithGDPicture(pPath As String, Optional Validate As Boolean = False) As ZugferdResult
|
||||||
Dim oEmbedExtractor = New PDFEmbeds(_logConfig)
|
Dim oEmbedExtractor = New PDFEmbeds(_logConfig)
|
||||||
|
|
||||||
Try
|
Try
|
||||||
' Extract XML attachments only!
|
' Extract XML attachments only!
|
||||||
Dim oFiles = oEmbedExtractor.Extract(pPath, New List(Of String) From {"xml"})
|
Dim oFiles = oEmbedExtractor.Extract(pPath, New List(Of String) From {"xml"})
|
||||||
|
If Validate Then
|
||||||
|
Dim oZugferdResult = HandleEmbeddedFiles(oFiles)
|
||||||
|
Return _Validator.ValidateZUGFeRDDocument(oZugferdResult)
|
||||||
|
Else
|
||||||
|
' Attachments are in this case the files that are embedded into a pdf file,
|
||||||
|
' like for example the zugferd-invoice.xml file
|
||||||
|
Return HandleEmbeddedFiles(oFiles)
|
||||||
|
End If
|
||||||
|
|
||||||
|
|
||||||
' Attachments are in this case the files that are embedded into a pdf file,
|
|
||||||
' like for example the zugferd-invoice.xml file
|
|
||||||
Return HandleEmbeddedFiles(oFiles)
|
|
||||||
|
|
||||||
Catch ex As ZUGFeRDExecption
|
Catch ex As ZUGFeRDExecption
|
||||||
' Don't log ZUGFeRD Exceptions here, they should be handled by the calling code.
|
' Don't log ZUGFeRD Exceptions here, they should be handled by the calling code.
|
||||||
@@ -271,19 +307,15 @@ Public Class ZUGFeRDInterface
|
|||||||
Throw ex
|
Throw ex
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Warn("Error while validating ZUGFeRD file with GDPicture")
|
_logger.Warn("Error while validating eInvoice file with GDPicture")
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
Throw ex
|
Throw ex
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Private Function HandleEmbeddedFiles(pResults As List(Of PDFEmbeds.EmbeddedFile)) As ZugferdResult
|
Private Function HandleEmbeddedFiles(pResults As List(Of PDFEmbeds.EmbeddedFile)) As ZugferdResult
|
||||||
If pResults Is Nothing Then
|
If pResults Is Nothing OrElse pResults.Count = 0 Then
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei, weil die Attachments nicht gelesen werden konnten.")
|
Throw New ZUGFeRDExecption(ErrorCodes.InvalidFerdNoXMLAttachmentFound, "Die Datei ist keine gültige ZUGFeRD-Datei, es wurde kein passender XML-Anhang gefunden.")
|
||||||
End If
|
|
||||||
|
|
||||||
If pResults.Count = 0 Then
|
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei, weil sie keine Attachments enthält.")
|
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' Find the first file which filename matches the valid filenames for embedded invoice files
|
' Find the first file which filename matches the valid filenames for embedded invoice files
|
||||||
@@ -292,7 +324,7 @@ Public Class ZUGFeRDInterface
|
|||||||
FirstOrDefault()
|
FirstOrDefault()
|
||||||
|
|
||||||
If oValidResult Is Nothing Then
|
If oValidResult Is Nothing Then
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei, weil keine entsprechende XML-Datei gefunden wurde.")
|
Throw New ZUGFeRDExecption(ErrorCodes.InvalidFerdNoXMLAttachmentFound, "Die Datei ist keine ZUGFeRD Datei, weil keine passende XML-Datei gefunden wurde.")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' Search the embedded files for the ones which are allowed as per the configuration.
|
' Search the embedded files for the ones which are allowed as per the configuration.
|
||||||
@@ -302,7 +334,7 @@ Public Class ZUGFeRDInterface
|
|||||||
FirstOrDefault()
|
FirstOrDefault()
|
||||||
|
|
||||||
If oAllowedResult Is Nothing Then
|
If oAllowedResult Is Nothing Then
|
||||||
Throw New ZUGFeRDExecption(ErrorType.UnsupportedFormat, "Datei ist eine ZUGFeRD Datei, aber das Format wird nicht unterstützt.", oAllowedResult.FileName)
|
Throw New ZUGFeRDExecption(ErrorCodes.InvalidFerdNoXMLAttachmentFound, "Datei enthält einen XML-Anhang mit einem ungültigen Dateinamen.", oAllowedResult.FileName)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Try
|
Try
|
||||||
@@ -320,7 +352,7 @@ Public Class ZUGFeRDInterface
|
|||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoValidZugferd, "Datei ist eine ungültige ZUGFeRD Datei.")
|
Throw New ZUGFeRDExecption(ErrorCodes.InvalidFerdException, "XML-Datei konnte nicht gelesen werden.")
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
@@ -352,6 +384,7 @@ Public Class ZUGFeRDInterface
|
|||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
'' Reihenfolge 2.0 muss unverändert bleiben. Älteste Version immer zuerst!
|
||||||
If _Options.AllowZugferd_2_x_Schema Then
|
If _Options.AllowZugferd_2_x_Schema Then
|
||||||
oAllowedTypes.AddRange(New List(Of AllowedType) From {
|
oAllowedTypes.AddRange(New List(Of AllowedType) From {
|
||||||
New AllowedType With {
|
New AllowedType With {
|
||||||
@@ -368,26 +401,42 @@ Public Class ZUGFeRDInterface
|
|||||||
.SchemaType = GetType(Version2_2_FacturX.CrossIndustryInvoiceType),
|
.SchemaType = GetType(Version2_2_FacturX.CrossIndustryInvoiceType),
|
||||||
.Specification = ZUGFERD_SPEC_2x,
|
.Specification = ZUGFERD_SPEC_2x,
|
||||||
.XMLSchema = XMLSCHEMA_ZUGFERD_22
|
.XMLSchema = XMLSCHEMA_ZUGFERD_22
|
||||||
|
}
|
||||||
|
})
|
||||||
|
End If
|
||||||
|
|
||||||
|
'' Reihenfolge ab 2.3 geändert. Neuste Version immer zuerst bzw. oben
|
||||||
|
If _Options.AllowZugferd_2_3_x_Schema Then
|
||||||
|
oAllowedTypes.AddRange(New List(Of AllowedType) From {
|
||||||
|
New AllowedType With {
|
||||||
|
.SchemaType = GetType(Version2_4_FacturX.CrossIndustryInvoiceType),
|
||||||
|
.Specification = ZUGFERD_SPEC_2_3x,
|
||||||
|
.XMLSchema = XMLSCHEMA_ZUGFERD_24
|
||||||
|
},
|
||||||
|
New AllowedType With {
|
||||||
|
.SchemaType = GetType(Version2_3_3_FacturX.CrossIndustryInvoiceType),
|
||||||
|
.Specification = ZUGFERD_SPEC_2_3x,
|
||||||
|
.XMLSchema = XMLSCHEMA_ZUGFERD_233
|
||||||
},
|
},
|
||||||
New AllowedType With {
|
New AllowedType With {
|
||||||
.SchemaType = GetType(Version2_3_FacturX.CrossIndustryInvoiceType),
|
.SchemaType = GetType(Version2_3_FacturX.CrossIndustryInvoiceType),
|
||||||
.Specification = ZUGFERD_SPEC_2x,
|
.Specification = ZUGFERD_SPEC_2_3x,
|
||||||
.XMLSchema = XMLSCHEMA_ZUGFERD_23
|
.XMLSchema = XMLSCHEMA_ZUGFERD_23
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If _Options.AllowPeppol_3017_Schema Then
|
If _Options.AllowPeppol_3_x_Schema Then
|
||||||
oAllowedTypes.AddRange(New List(Of AllowedType) From {
|
oAllowedTypes.AddRange(New List(Of AllowedType) From {
|
||||||
New AllowedType With {
|
New AllowedType With {
|
||||||
.SchemaType = GetType(BISBilling30Invoice.InvoiceType),
|
.SchemaType = GetType(UBL_21_Invoice.InvoiceType),
|
||||||
.Specification = PEPPOL_SPEC_3x_INVOICE,
|
.Specification = UBL_SPEC_21,
|
||||||
.XMLSchema = XMLSCHEMA_PEPPOL_3017_INVOICE
|
.XMLSchema = XMLSCHEMA_UBL_21_INVOICE
|
||||||
},
|
},
|
||||||
New AllowedType With {
|
New AllowedType With {
|
||||||
.SchemaType = GetType(BISBilling30CreditNote.CreditNoteType),
|
.SchemaType = GetType(UBL_21_CreditNote.CreditNoteType),
|
||||||
.Specification = PEPPOL_SPEC_3x_CREDITNOTE,
|
.Specification = UBL_SPEC_21,
|
||||||
.XMLSchema = XMLSCHEMA_PEPPOL_3017_CREDITNOTE
|
.XMLSchema = XMLSCHEMA_UBL_21_CREDITNOTE
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
@@ -415,8 +464,7 @@ Public Class ZUGFeRDInterface
|
|||||||
Next
|
Next
|
||||||
|
|
||||||
If oObject Is Nothing Then
|
If oObject Is Nothing Then
|
||||||
'Throw New ApplicationException("No Types matched the given document. Document could not be serialized.")
|
Throw New ZUGFeRDExecption(ErrorCodes.UnsupportedFerdException, "Unsupported Format")
|
||||||
Throw New ZUGFeRDExecption(ErrorType.UnsupportedFormat, "Unsupported Format")
|
|
||||||
End If
|
End If
|
||||||
|
|
||||||
pResult.Specification = oSpecification
|
pResult.Specification = oSpecification
|
||||||
@@ -431,8 +479,8 @@ Public Class ZUGFeRDInterface
|
|||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
Dim oMessage = "Datei ist eine ungültige ZUGFeRD Datei oder das Format wird nicht unterstüzt, oder das Format ist deaktiviert."
|
Dim oMessage = "Datei ist eine ungültige Datei oder das Format wird nicht unterstüzt, oder das Format ist deaktiviert."
|
||||||
Throw New ZUGFeRDExecption(ErrorType.NoValidZugferd, oMessage)
|
Throw New ZUGFeRDExecption(ErrorCodes.UnsupportedFerdException, oMessage)
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
14
Interfaces/ZUGFeRDInterface/Enums/ErrorCodes.vb
Normal file
14
Interfaces/ZUGFeRDInterface/Enums/ErrorCodes.vb
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Public Enum ErrorCodes
|
||||||
|
NotInUse = 0
|
||||||
|
ValidationException = 20001
|
||||||
|
MD5HashException = 20002
|
||||||
|
UnsupportedFerdException = 20003
|
||||||
|
InvalidFerdException = 20004
|
||||||
|
TooMuchFerdsException = 20005
|
||||||
|
InvalidFerdNoXMLAttachmentFound = 20006
|
||||||
|
MissingValueException = 20007
|
||||||
|
FileSizeLimitReachedException = 20008
|
||||||
|
OutOfMemoryException = 20009
|
||||||
|
UnhandledException = 20010
|
||||||
|
FileMoveException = 200011
|
||||||
|
End Enum
|
||||||
8
Interfaces/ZUGFeRDInterface/Enums/Item_Types.vb
Normal file
8
Interfaces/ZUGFeRDInterface/Enums/Item_Types.vb
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Public Enum Item_Types
|
||||||
|
StringType '0
|
||||||
|
DateType '1
|
||||||
|
MoneyType '2
|
||||||
|
FileType '3
|
||||||
|
ListType '4 - vgl. Währung
|
||||||
|
|
||||||
|
End Enum
|
||||||
@@ -4,7 +4,11 @@ Public Class Exceptions
|
|||||||
Public Class ZUGFeRDExecption
|
Public Class ZUGFeRDExecption
|
||||||
Inherits ApplicationException
|
Inherits ApplicationException
|
||||||
|
|
||||||
Public ReadOnly Property ErrorType() As ZUGFeRDInterface.ErrorType
|
Public ReadOnly Property ErrorCode() As ErrorCodes
|
||||||
|
|
||||||
|
Public ReadOnly Property Param1 As String = String.Empty
|
||||||
|
|
||||||
|
Public ReadOnly Property Param2 As String = String.Empty
|
||||||
|
|
||||||
''' <summary>
|
''' <summary>
|
||||||
''' Contains the name of the extracted xml file if already extracted.
|
''' Contains the name of the extracted xml file if already extracted.
|
||||||
@@ -12,18 +16,37 @@ Public Class Exceptions
|
|||||||
''' <returns>A filename like zugferd-invoice.xml</returns>
|
''' <returns>A filename like zugferd-invoice.xml</returns>
|
||||||
Public ReadOnly Property XmlFile As String = String.Empty
|
Public ReadOnly Property XmlFile As String = String.Empty
|
||||||
|
|
||||||
Public Sub New(ErrorType As ZUGFeRDInterface.ErrorType, Message As String)
|
Public Sub New(pErrorCode As ErrorCodes, Message As String)
|
||||||
MyBase.New(Message)
|
MyBase.New(Message)
|
||||||
|
|
||||||
_ErrorType = ErrorType
|
_ErrorCode = pErrorCode
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Public Sub New(ErrorType As ZUGFeRDInterface.ErrorType, Message As String, pXmlFileName As String)
|
Public Sub New(pErrorCode As ErrorCodes, Message As String, pXmlFileName As String)
|
||||||
MyBase.New(Message)
|
MyBase.New(Message)
|
||||||
|
|
||||||
_ErrorType = ErrorType
|
_ErrorCode = pErrorCode
|
||||||
_XmlFile = pXmlFileName
|
_XmlFile = pXmlFileName
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
|
Public Sub New(pErrorCode As ErrorCodes, Param1 As String, Param2 As String, Message As String)
|
||||||
|
MyBase.New(Message)
|
||||||
|
|
||||||
|
_ErrorCode = pErrorCode
|
||||||
|
_Param1 = Param1
|
||||||
|
_Param2 = Param2
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub New(pErrorCode As ErrorCodes, Param1 As String, Param2 As String, Message As String, pXmlFileName As String)
|
||||||
|
MyBase.New(Message)
|
||||||
|
|
||||||
|
_ErrorCode = pErrorCode
|
||||||
|
_Param1 = Param1
|
||||||
|
_Param2 = Param2
|
||||||
|
_XmlFile = pXmlFileName
|
||||||
|
|
||||||
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
Public Class ValidationException
|
Public Class ValidationException
|
||||||
@@ -31,8 +54,13 @@ Public Class Exceptions
|
|||||||
|
|
||||||
Public ValidationErrors As List(Of ZugferdValidationError)
|
Public ValidationErrors As List(Of ZugferdValidationError)
|
||||||
|
|
||||||
|
Public ReadOnly Property ErrorCode() As ErrorCodes
|
||||||
|
|
||||||
Public Sub New()
|
Public Sub New()
|
||||||
MyBase.New("ZUGFeRD document found but validation failed!")
|
MyBase.New("ZUGFeRD document found but validation failed!")
|
||||||
|
|
||||||
|
_ErrorCode = ErrorCodes.ValidationException
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ Public Class PDFEmbeds
|
|||||||
|
|
||||||
Dim oFileData As Byte() = New Byte(oFileSize) {}
|
Dim oFileData As Byte() = New Byte(oFileSize) {}
|
||||||
Dim oStatus As GdPictureStatus = GDPicturePDF.ExtractEmbeddedFile(oIndex, oFileData)
|
Dim oStatus As GdPictureStatus = GDPicturePDF.ExtractEmbeddedFile(oIndex, oFileData)
|
||||||
|
'MsgBox($"FileSize of filename: {oFileName} is bytes: {oFileData.Length}/Filesize: {oFileSize}")
|
||||||
If oStatus = GdPictureStatus.OK Then
|
If oStatus = GdPictureStatus.OK Then
|
||||||
Logger.Debug("Embedded file [{0}] extracted sucessfully!", oFileName)
|
Logger.Debug("Embedded file [{0}] extracted sucessfully!", oFileName)
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
|||||||
Imports System.Reflection
|
Imports System.Globalization
|
||||||
|
Imports System.Reflection
|
||||||
Imports System.Text.RegularExpressions
|
Imports System.Text.RegularExpressions
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ Public Class PropertyValues
|
|||||||
Public IsRequired As Boolean
|
Public IsRequired As Boolean
|
||||||
Public GroupCounter As Integer = -1
|
Public GroupCounter As Integer = -1
|
||||||
|
|
||||||
|
Public EN16931_ID As String
|
||||||
Public Description As String
|
Public Description As String
|
||||||
Public Value As String
|
Public Value As String
|
||||||
Public XMLPath As String
|
Public XMLPath As String
|
||||||
@@ -35,6 +37,7 @@ Public Class PropertyValues
|
|||||||
End Class
|
End Class
|
||||||
|
|
||||||
Public Class MissingProperty
|
Public Class MissingProperty
|
||||||
|
Public EN16931_ID As String
|
||||||
Public Description As String
|
Public Description As String
|
||||||
Public XMLPath As String
|
Public XMLPath As String
|
||||||
|
|
||||||
@@ -54,7 +57,7 @@ Public Class PropertyValues
|
|||||||
ToDictionary(Function(Item) Item.Key,
|
ToDictionary(Function(Item) Item.Key,
|
||||||
Function(Item) Item.Value)
|
Function(Item) Item.Value)
|
||||||
|
|
||||||
_logger.Debug("Found {0} default properties.", oDefaultProperties.Count)
|
_logger.Debug("Found {0} ungrouped properties.", oDefaultProperties.Count)
|
||||||
|
|
||||||
' PropertyMap items with `IsGrouped = True` are grouped by group scope
|
' PropertyMap items with `IsGrouped = True` are grouped by group scope
|
||||||
Dim oGroupedProperties = PropertyMap.
|
Dim oGroupedProperties = PropertyMap.
|
||||||
@@ -68,7 +71,7 @@ Public Class PropertyValues
|
|||||||
Dim oGroupScope As String = oGroup.Key
|
Dim oGroupScope As String = oGroup.Key
|
||||||
|
|
||||||
Dim oPropertyList As New Dictionary(Of XmlItemProperty, List(Of Object))
|
Dim oPropertyList As New Dictionary(Of XmlItemProperty, List(Of Object))
|
||||||
Dim oRowCount = 0
|
Dim oRowCount = 0 ' TODO - Es wird anhand der Anzahl XML-Knoten ermittelt wieviele Rows gelesen werden???????
|
||||||
|
|
||||||
_logger.Debug($"Fetching Property values for group [{oGroupScope}].")
|
_logger.Debug($"Fetching Property values for group [{oGroupScope}].")
|
||||||
|
|
||||||
@@ -84,16 +87,16 @@ Public Class PropertyValues
|
|||||||
oPropertyValues = New List(Of Object)
|
oPropertyValues = New List(Of Object)
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
|
' check the first batch of values to determine the row count
|
||||||
|
If oRowCount = 0 Then '08.04.2025 MS Added as Workaround for Positions Or oGroupScope = "POSITIONS" !
|
||||||
|
oRowCount = oPropertyValues.Count
|
||||||
|
End If
|
||||||
|
|
||||||
' Flatten result value
|
' Flatten result value
|
||||||
oPropertyValues = GetFinalPropValue(oPropertyValues)
|
oPropertyValues = GetFinalPropValue(oPropertyValues)
|
||||||
|
|
||||||
' Add to list
|
' Add to list
|
||||||
oPropertyList.Add(oProperty.Value, oPropertyValues)
|
oPropertyList.Add(oProperty.Value, oPropertyValues)
|
||||||
|
|
||||||
' check the first batch of values to determine the row count
|
|
||||||
If oRowCount = 0 Then
|
|
||||||
oRowCount = oPropertyValues.Count
|
|
||||||
End If
|
|
||||||
Next
|
Next
|
||||||
|
|
||||||
' Structure of oPropertyList
|
' Structure of oPropertyList
|
||||||
@@ -112,32 +115,55 @@ Public Class PropertyValues
|
|||||||
Dim oPropertyDescription As String = oColumn.Key.Description
|
Dim oPropertyDescription As String = oColumn.Key.Description
|
||||||
Dim oPropertyPath As String = oColumn.Key.XMLPath
|
Dim oPropertyPath As String = oColumn.Key.XMLPath
|
||||||
Dim oItemType As Integer = oColumn.Key.ItemType
|
Dim oItemType As Integer = oColumn.Key.ItemType
|
||||||
|
Dim oEN16931Value As String = oColumn.Key.EN16931_ID
|
||||||
|
|
||||||
Dim oRowCounter = oRowIndex + oGlobalGroupCounter + 1
|
Dim oRowCounter = oRowIndex + oGlobalGroupCounter + 1
|
||||||
|
|
||||||
' Returns nothing if oColumn.Value contains an empty list
|
' Returns nothing if oColumn.Value contains an empty list
|
||||||
Dim oPropertyValue = oColumn.Value.ElementAtOrDefault(oRowIndex)
|
Dim oPropertyValue = oColumn.Value.ElementAtOrDefault(oRowIndex)
|
||||||
|
|
||||||
_logger.Debug("Processing itemSpecification *TableColumn* [{0}].", oTableColumn)
|
_logger.Debug("Processing itemColumn *TableColumn* [{0}].", oTableColumn)
|
||||||
If oTableColumn = "INVOICE_SELLER_EMAIL" Then
|
If oTableColumn = "INVOICE_SELLER_EMAIL" Then
|
||||||
Console.WriteLine("INVOICE_SELLER_EMAIL")
|
Console.WriteLine("INVOICE_SELLER_EMAIL")
|
||||||
|
ElseIf oTableColumn = "INVOICE_POSITION_ARTICLE" Then
|
||||||
|
Console.WriteLine("INVOICE_POSITION_ARTICLE")
|
||||||
End If
|
End If
|
||||||
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
|
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
|
||||||
If oColumn.Key.IsRequired Then
|
If oColumn.Key.IsRequired Then
|
||||||
_logger.Warn($"{MessageId} # oPropertyValue for specification [{oTableColumn}] is empty or not found but is required. Continuing with Empty String.")
|
_logger.Warn($"{MessageId} - oPropertyValue for column [{oTableColumn}] is empty or not found but is required. Continuing with Empty String.")
|
||||||
Dim oMissingProperty = New MissingProperty() With {
|
Dim oMissingProperty = New MissingProperty() With {
|
||||||
|
.EN16931_ID = oEN16931Value,
|
||||||
.Description = oPropertyDescription,
|
.Description = oPropertyDescription,
|
||||||
.XMLPath = oPropertyPath
|
.XMLPath = oPropertyPath
|
||||||
}
|
}
|
||||||
oResult.MissingProperties.Add(oMissingProperty)
|
oResult.MissingProperties.Add(oMissingProperty)
|
||||||
Else
|
Else
|
||||||
_logger.Debug($"{MessageId} # oPropertyValue for specification [{oTableColumn}] is empty or not found. Continuing with Empty String.")
|
_logger.Debug($"{MessageId} - oPropertyValue for column [{oTableColumn}] is empty or not found. Continuing with Empty String.")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
oPropertyValue = String.Empty
|
oPropertyValue = String.Empty
|
||||||
End If
|
End If
|
||||||
|
|
||||||
_logger.Debug("ItemSpecification [{0}] has value '{1}'", oTableColumn, oPropertyValue)
|
If (oPropertyValue IsNot Nothing) Then
|
||||||
|
Dim logValue As String = oPropertyValue.ToString()
|
||||||
|
If logValue.Length > 50 Then
|
||||||
|
_logger.Debug("Item [{0}] has value '{1}...'", oTableColumn, logValue.Substring(1, 50))
|
||||||
|
Else
|
||||||
|
_logger.Debug("Item [{0}] has value '{1}'", oTableColumn, oPropertyValue)
|
||||||
|
End If
|
||||||
|
|
||||||
|
End If
|
||||||
|
|
||||||
|
If oTableColumn = "INVOICE_CURRENCY" Or oItemType = 4 Then
|
||||||
|
Dim oValuestring = oPropertyValue.ToString()
|
||||||
|
|
||||||
|
' Bei Listenelementen entfernen wir den String Item, um den Wert zu erhalten
|
||||||
|
If oValuestring.Contains("Item") Then
|
||||||
|
oValuestring = oValuestring.Replace("Item", "")
|
||||||
|
End If
|
||||||
|
|
||||||
|
oPropertyValue = oValuestring
|
||||||
|
End If
|
||||||
|
|
||||||
oResult.ValidProperties.Add(New ValidProperty() With {
|
oResult.ValidProperties.Add(New ValidProperty() With {
|
||||||
.MessageId = MessageId,
|
.MessageId = MessageId,
|
||||||
@@ -148,7 +174,8 @@ Public Class PropertyValues
|
|||||||
.TableColumn = oTableColumn,
|
.TableColumn = oTableColumn,
|
||||||
.IsRequired = oIsRequired,
|
.IsRequired = oIsRequired,
|
||||||
.XMLPath = oPropertyPath,
|
.XMLPath = oPropertyPath,
|
||||||
.ItemType = oItemType
|
.ItemType = oItemType,
|
||||||
|
.EN16931_ID = oEN16931Value
|
||||||
})
|
})
|
||||||
Next
|
Next
|
||||||
Next
|
Next
|
||||||
@@ -167,11 +194,12 @@ Public Class PropertyValues
|
|||||||
Dim oIsRequired = oItem.Value.IsRequired
|
Dim oIsRequired = oItem.Value.IsRequired
|
||||||
Dim oDescription = oItem.Value.Description
|
Dim oDescription = oItem.Value.Description
|
||||||
Dim oItemType = oItem.Value.ItemType
|
Dim oItemType = oItem.Value.ItemType
|
||||||
|
Dim oEN16931_ID = oItem.Value.EN16931_ID
|
||||||
|
|
||||||
Try
|
Try
|
||||||
oPropertyValueList = GetPropValue(pDocument, oItem.Key)
|
oPropertyValueList = GetPropValue(pDocument, oItem.Key)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Warn("{2} # Unknown error occurred while fetching specification [{0}] in group [{1}]:", oPropertyDescription, oItem.Value.GroupScope, MessageId)
|
_logger.Warn("{2} - Unknown error occurred while fetching specification [{0}] in group [{1}]:", oTableColumn, oItem.Value.GroupScope, MessageId)
|
||||||
_logger.Warn("ERROR-MESSAGE [{0}]", ex.Message)
|
_logger.Warn("ERROR-MESSAGE [{0}]", ex.Message)
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
oPropertyValueList = New List(Of Object)
|
oPropertyValueList = New List(Of Object)
|
||||||
@@ -190,37 +218,45 @@ Public Class PropertyValues
|
|||||||
|
|
||||||
' This should hopefully show config errors
|
' This should hopefully show config errors
|
||||||
If TypeOf oPropertyValue Is List(Of Object) Then
|
If TypeOf oPropertyValue Is List(Of Object) Then
|
||||||
_logger.Warn("Item with specification [{0}] may be configured incorrectly", oPropertyDescription)
|
_logger.Warn("Item with specification [{0}] may be configured incorrectly", oTableColumn)
|
||||||
oPropertyValue = Nothing
|
oPropertyValue = Nothing
|
||||||
End If
|
End If
|
||||||
End Select
|
End Select
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Warn("Unknown error occurred while processing specification [{0}]:", oPropertyDescription)
|
_logger.Warn("Unknown error occurred while processing specification [{0}]:", oTableColumn)
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
oPropertyValue = Nothing
|
oPropertyValue = Nothing
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
|
If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then
|
||||||
If oItem.Value.IsRequired Then
|
If oItem.Value.IsRequired Then
|
||||||
_logger.Warn("{0} # Specification [{1}] is empty, but marked as required! Skipping.", MessageId, oPropertyDescription)
|
_logger.Warn("Specification [{0}] is empty, but marked as required! Skipping.", oTableColumn)
|
||||||
Dim oMissingProperty = New MissingProperty With
|
Dim oMissingProperty = New MissingProperty With
|
||||||
{
|
{
|
||||||
|
.EN16931_ID = oEN16931_ID,
|
||||||
.Description = oPropertyDescription,
|
.Description = oPropertyDescription,
|
||||||
.XMLPath = oPropertyPath
|
.XMLPath = oPropertyPath
|
||||||
}
|
}
|
||||||
oResult.MissingProperties.Add(oMissingProperty)
|
oResult.MissingProperties.Add(oMissingProperty)
|
||||||
Continue For
|
Continue For
|
||||||
Else
|
Else
|
||||||
_logger.Debug("{0} # oPropertyValue for specification [{1}] is empty or not found. Skipping.", MessageId, oPropertyDescription)
|
_logger.Debug("oPropertyValue for specification [{0}] is empty or not found. Skipping.", oTableColumn)
|
||||||
|
|
||||||
Continue For
|
Continue For
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' Statt dem Zahlenwert des Enums, wollen wir die Währunsgbezeichnung
|
' Statt dem Zahlenwert des Enums, wollen wir die Währungsbezeichnung
|
||||||
If oTableColumn = "INVOICE_CURRENCY" Then
|
If oTableColumn = "INVOICE_CURRENCY" Or oItemType = 4 Then
|
||||||
oPropertyValue = oPropertyValue.ToString()
|
Dim oValuestring = oPropertyValue.ToString()
|
||||||
|
|
||||||
|
' Bei Listenelementen entfernen wir den String Item, um den Wert zu erhalten
|
||||||
|
If oValuestring.Contains("Item") Then
|
||||||
|
oValuestring = oValuestring.Replace("Item", "")
|
||||||
|
End If
|
||||||
|
|
||||||
|
oPropertyValue = oValuestring
|
||||||
End If
|
End If
|
||||||
|
|
||||||
oResult.ValidProperties.Add(New ValidProperty() With {
|
oResult.ValidProperties.Add(New ValidProperty() With {
|
||||||
@@ -231,7 +267,8 @@ Public Class PropertyValues
|
|||||||
.TableColumn = oTableColumn,
|
.TableColumn = oTableColumn,
|
||||||
.IsRequired = oIsRequired,
|
.IsRequired = oIsRequired,
|
||||||
.XMLPath = oPropertyPath,
|
.XMLPath = oPropertyPath,
|
||||||
.ItemType = oItemType
|
.ItemType = oItemType,
|
||||||
|
.EN16931_ID = oEN16931_ID
|
||||||
})
|
})
|
||||||
Next
|
Next
|
||||||
|
|
||||||
@@ -278,17 +315,11 @@ Public Class PropertyValues
|
|||||||
|
|
||||||
Obj = oInfo.GetValue(Obj, Nothing)
|
Obj = oInfo.GetValue(Obj, Nothing)
|
||||||
|
|
||||||
' TODO: This code should check for array properties by itself
|
|
||||||
' and should not rely on the user to
|
|
||||||
'If oInfo.PropertyType.IsArray Then
|
|
||||||
' Obj = Obj(0)
|
|
||||||
'End If
|
|
||||||
|
|
||||||
If oHasIndex Then
|
If oHasIndex Then
|
||||||
Obj = Obj(0)
|
Obj = Obj(0)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If IsArray(Obj) And Not oHasIndex Then
|
If IsArray(Obj) And Not oHasIndex And oPart <> "Value" Then
|
||||||
Dim oCurrentPart As String = oPart
|
Dim oCurrentPart As String = oPart
|
||||||
Dim oSplitString As String() = New String() {oCurrentPart & "."}
|
Dim oSplitString As String() = New String() {oCurrentPart & "."}
|
||||||
Dim oPathFragments = PropertyName.Split(oSplitString, StringSplitOptions.None)
|
Dim oPathFragments = PropertyName.Split(oSplitString, StringSplitOptions.None)
|
||||||
@@ -308,8 +339,56 @@ Public Class PropertyValues
|
|||||||
Next
|
Next
|
||||||
|
|
||||||
Return oResults
|
Return oResults
|
||||||
End If
|
Else
|
||||||
|
If oPart = "Value" AndAlso Obj IsNot Nothing Then
|
||||||
|
' Der Name des gefundenen Datentyps
|
||||||
|
Dim oObjType = oInfo.PropertyType.FullName
|
||||||
|
|
||||||
|
If oObjType.Equals("System.DateTime", StringComparison.OrdinalIgnoreCase) Then
|
||||||
|
|
||||||
|
Dim d As Date
|
||||||
|
Dim s As String
|
||||||
|
Dim oResult As String
|
||||||
|
|
||||||
|
s = Convert.ToString(Obj)
|
||||||
|
|
||||||
|
If IsDate(s) = True Then
|
||||||
|
' Hier wird das DEFAULT-Format auf yyyyMMdd gesetzt
|
||||||
|
Dim dtfi As DateTimeFormatInfo = CultureInfo.CreateSpecificCulture(CultureInfo.InvariantCulture.Name).DateTimeFormat
|
||||||
|
dtfi.DateSeparator = ""
|
||||||
|
dtfi.ShortDatePattern = "yyyyMMdd"
|
||||||
|
|
||||||
|
d = CDate(s)
|
||||||
|
oResult = d.ToString("d", dtfi)
|
||||||
|
|
||||||
|
'Return New List(Of Object) From {oResult}
|
||||||
|
Dim oRetValue As List(Of Object) = New List(Of Object) From {
|
||||||
|
oResult
|
||||||
|
}
|
||||||
|
|
||||||
|
Return oRetValue
|
||||||
|
|
||||||
|
End If
|
||||||
|
ElseIf oObjType.Equals("System.Decimal", StringComparison.OrdinalIgnoreCase) Then
|
||||||
|
|
||||||
|
Dim oResult As String
|
||||||
|
|
||||||
|
If IsNumeric(Obj) = True Then
|
||||||
|
Dim decValue As Decimal = CDec(Obj)
|
||||||
|
' Es wird immer ein . als Dezimaltrenner verwendet, falls nötig
|
||||||
|
oResult = decValue.ToString(CultureInfo.InvariantCulture)
|
||||||
|
|
||||||
|
'Return New List(Of Object) From {oResult}
|
||||||
|
Dim oRetValue As List(Of Object) = New List(Of Object) From {
|
||||||
|
oResult
|
||||||
|
}
|
||||||
|
|
||||||
|
Return oRetValue
|
||||||
|
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End If
|
||||||
Next
|
Next
|
||||||
|
|
||||||
Return New List(Of Object) From {Obj}
|
Return New List(Of Object) From {Obj}
|
||||||
@@ -337,13 +416,31 @@ Public Class PropertyValues
|
|||||||
Select Case oCount
|
Select Case oCount
|
||||||
Case 0
|
Case 0
|
||||||
Return Nothing
|
Return Nothing
|
||||||
|
Case 1
|
||||||
|
Dim firstElement As Object
|
||||||
|
firstElement = oList.FirstOrDefault()
|
||||||
|
If firstElement IsNot Nothing AndAlso IsArray(firstElement) Then
|
||||||
|
|
||||||
|
' Attachments sind Byte-Arrays und müssen umgewandelt werden
|
||||||
|
Return Convert.ToBase64String(firstElement)
|
||||||
|
|
||||||
|
Else
|
||||||
|
Return DoGetFinalPropValue(oList.First())
|
||||||
|
End If
|
||||||
Case Else
|
Case Else
|
||||||
Return DoGetFinalPropValue(oList.First())
|
Return DoGetFinalPropValue(oList.First())
|
||||||
|
|
||||||
End Select
|
End Select
|
||||||
|
|
||||||
Return DoGetFinalPropValue(Value)
|
Return DoGetFinalPropValue(Value)
|
||||||
Else
|
Else
|
||||||
Return Value.ToString
|
' Nothing kann auch der Default-Wert der Variablen bedeuten. Also auch 0.00
|
||||||
|
If IsNothing(Value) Then
|
||||||
|
Return String.Empty
|
||||||
|
Else
|
||||||
|
Return Value.ToString
|
||||||
|
End If
|
||||||
|
|
||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
|||||||
8
Interfaces/ZUGFeRDInterface/RejectionStringRow.vb
Normal file
8
Interfaces/ZUGFeRDInterface/RejectionStringRow.vb
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Public Class RejectionStringRow
|
||||||
|
Public ModuleName As String
|
||||||
|
Public Title As String
|
||||||
|
Public Caption As String
|
||||||
|
Public Language As String
|
||||||
|
Public String1 As String
|
||||||
|
|
||||||
|
End Class
|
||||||
@@ -14,6 +14,7 @@ Public Class Validator
|
|||||||
ValidateDecimalNodes(pResult)
|
ValidateDecimalNodes(pResult)
|
||||||
ValidateCurrencyNodes(pResult)
|
ValidateCurrencyNodes(pResult)
|
||||||
|
|
||||||
|
'TODO Validate Datumsfelder
|
||||||
Return pResult
|
Return pResult
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
@@ -29,7 +30,8 @@ Public Class Validator
|
|||||||
.ElementName = oNode.Name.LocalName,
|
.ElementName = oNode.Name.LocalName,
|
||||||
.ElementValue = oNode.Value,
|
.ElementValue = oNode.Value,
|
||||||
.ErrorMessage = "Value could not be parsed as Decimal.",
|
.ErrorMessage = "Value could not be parsed as Decimal.",
|
||||||
.ErrorMessageDE = "Der Wert konnte nicht in eine Dezimalzahl umgewandelt werden."
|
.ErrorMessageDE = "Der Wert ist keine Dezimalzahl.",
|
||||||
|
.ErrorMessageToken = "NoDecimalText"
|
||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
@@ -52,7 +54,8 @@ Public Class Validator
|
|||||||
.ElementName = oNode.Name.LocalName,
|
.ElementName = oNode.Name.LocalName,
|
||||||
.ElementValue = oNode.Value,
|
.ElementValue = oNode.Value,
|
||||||
.ErrorMessage = "Invalid CurrencyCode. Only 3-Character codes are allowed.",
|
.ErrorMessage = "Invalid CurrencyCode. Only 3-Character codes are allowed.",
|
||||||
.ErrorMessageDE = "Ungültiger Währungscode. Es sind nur 3-stellige Codes erlaubt."
|
.ErrorMessageDE = "Ungültiger Währungscode. Es sind nur 3-stellige Codes erlaubt.",
|
||||||
|
.ErrorMessageToken = "WrongCurrencyCodeText"
|
||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
@@ -79,7 +82,8 @@ Public Class Validator
|
|||||||
.ElementName = oNode.Name.LocalName,
|
.ElementName = oNode.Name.LocalName,
|
||||||
.ElementValue = oCurrencyID,
|
.ElementValue = oCurrencyID,
|
||||||
.ErrorMessage = "Invalid currencyID. Only 3-Character codes or empty values are allowed.",
|
.ErrorMessage = "Invalid currencyID. Only 3-Character codes or empty values are allowed.",
|
||||||
.ErrorMessageDE = "Ungültige WährungsID. Es sind nur 3-Zeichen lange Codes oder ein leerer Wert erlaubt."
|
.ErrorMessageDE = "Ungültige WährungsID. Es sind nur 3-Zeichen lange Codes oder ein leerer Wert erlaubt.",
|
||||||
|
.ErrorMessageToken = "WrongCurrencyIDText"
|
||||||
})
|
})
|
||||||
End If
|
End If
|
||||||
Next
|
Next
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -567,17 +567,30 @@ Namespace ZUGFeRD.Version2_3_FacturX
|
|||||||
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100")> _
|
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100")> _
|
||||||
Partial Public Class DateTimeType
|
Partial Public Class DateTimeType
|
||||||
|
|
||||||
Private itemField As Object
|
'Private itemField As Object
|
||||||
|
|
||||||
|
''''<remarks/>
|
||||||
|
'<System.Xml.Serialization.XmlElementAttribute("DateTime", GetType(Date)), _
|
||||||
|
' System.Xml.Serialization.XmlElementAttribute("DateTimeString", GetType(DateTimeTypeDateTimeString))> _
|
||||||
|
'Public Property Item() As Object
|
||||||
|
' Get
|
||||||
|
' Return Me.itemField
|
||||||
|
' End Get
|
||||||
|
' Set
|
||||||
|
' Me.itemField = value
|
||||||
|
' End Set
|
||||||
|
'End Property
|
||||||
|
|
||||||
|
Private itemField As DateTimeTypeDateTimeString
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlElementAttribute("DateTime", GetType(Date)), _
|
<System.Xml.Serialization.XmlElementAttribute("DateTimeString")>
|
||||||
System.Xml.Serialization.XmlElementAttribute("DateTimeString", GetType(DateTimeTypeDateTimeString))> _
|
Public Property DateTimeString() As DateTimeTypeDateTimeString
|
||||||
Public Property Item() As Object
|
|
||||||
Get
|
Get
|
||||||
Return Me.itemField
|
Return Me.itemField
|
||||||
End Get
|
End Get
|
||||||
Set
|
Set
|
||||||
Me.itemField = value
|
Me.itemField = Value
|
||||||
End Set
|
End Set
|
||||||
End Property
|
End Property
|
||||||
End Class
|
End Class
|
||||||
@@ -9418,6 +9431,18 @@ Namespace ZUGFeRD.Version2_3_FacturX
|
|||||||
<System.Xml.Serialization.XmlEnumAttribute("870")>
|
<System.Xml.Serialization.XmlEnumAttribute("870")>
|
||||||
Item870 = 870
|
Item870 = 870
|
||||||
|
|
||||||
|
'''<remarks/>
|
||||||
|
<System.Xml.Serialization.XmlEnumAttribute("875")>
|
||||||
|
Item875 = 875
|
||||||
|
|
||||||
|
'''<remarks/>
|
||||||
|
<System.Xml.Serialization.XmlEnumAttribute("876")>
|
||||||
|
Item876 = 876
|
||||||
|
|
||||||
|
'''<remarks/>
|
||||||
|
<System.Xml.Serialization.XmlEnumAttribute("877")>
|
||||||
|
Item877 = 877
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("890")>
|
<System.Xml.Serialization.XmlEnumAttribute("890")>
|
||||||
Item890 = 890
|
Item890 = 890
|
||||||
@@ -20804,431 +20829,786 @@ Namespace ZUGFeRD.Version2_3_FacturX
|
|||||||
End Enum
|
End Enum
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0"), _
|
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0"),
|
||||||
System.SerializableAttribute(), _
|
System.SerializableAttribute(),
|
||||||
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:un:unece:uncefact:codelist:standard:UNECE:AllowanceChargeReasonCode:D22A")> _
|
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:un:unece:uncefact:codelist:standard:UNECE:AllowanceChargeReasonCode:D22A")>
|
||||||
Public Enum AllowanceChargeReasonCodeContentType
|
Public Enum AllowanceChargeReasonCodeContentType
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("1")> _
|
<System.Xml.Serialization.XmlEnumAttribute("1")>
|
||||||
Item1
|
Item1
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("2")> _
|
<System.Xml.Serialization.XmlEnumAttribute("2")>
|
||||||
Item2
|
Item2
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("3")> _
|
<System.Xml.Serialization.XmlEnumAttribute("3")>
|
||||||
Item3
|
Item3
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("4")> _
|
<System.Xml.Serialization.XmlEnumAttribute("4")>
|
||||||
Item4
|
Item4
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("5")> _
|
<System.Xml.Serialization.XmlEnumAttribute("5")>
|
||||||
Item5
|
Item5
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("6")> _
|
<System.Xml.Serialization.XmlEnumAttribute("6")>
|
||||||
Item6
|
Item6
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("7")> _
|
<System.Xml.Serialization.XmlEnumAttribute("7")>
|
||||||
Item7
|
Item7
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("8")> _
|
<System.Xml.Serialization.XmlEnumAttribute("8")>
|
||||||
Item8
|
Item8
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("9")> _
|
<System.Xml.Serialization.XmlEnumAttribute("9")>
|
||||||
Item9
|
Item9
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("10")> _
|
<System.Xml.Serialization.XmlEnumAttribute("10")>
|
||||||
Item10
|
Item10
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("11")> _
|
<System.Xml.Serialization.XmlEnumAttribute("11")>
|
||||||
Item11
|
Item11
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("12")> _
|
<System.Xml.Serialization.XmlEnumAttribute("12")>
|
||||||
Item12
|
Item12
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("13")> _
|
<System.Xml.Serialization.XmlEnumAttribute("13")>
|
||||||
Item13
|
Item13
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("14")> _
|
<System.Xml.Serialization.XmlEnumAttribute("14")>
|
||||||
Item14
|
Item14
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("15")> _
|
<System.Xml.Serialization.XmlEnumAttribute("15")>
|
||||||
Item15
|
Item15
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("16")> _
|
<System.Xml.Serialization.XmlEnumAttribute("16")>
|
||||||
Item16
|
Item16
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("17")> _
|
<System.Xml.Serialization.XmlEnumAttribute("17")>
|
||||||
Item17
|
Item17
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("18")> _
|
<System.Xml.Serialization.XmlEnumAttribute("18")>
|
||||||
Item18
|
Item18
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("19")> _
|
<System.Xml.Serialization.XmlEnumAttribute("19")>
|
||||||
Item19
|
Item19
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("20")> _
|
<System.Xml.Serialization.XmlEnumAttribute("20")>
|
||||||
Item20
|
Item20
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("21")> _
|
<System.Xml.Serialization.XmlEnumAttribute("21")>
|
||||||
Item21
|
Item21
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("22")> _
|
<System.Xml.Serialization.XmlEnumAttribute("22")>
|
||||||
Item22
|
Item22
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("23")> _
|
<System.Xml.Serialization.XmlEnumAttribute("23")>
|
||||||
Item23
|
Item23
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("24")> _
|
<System.Xml.Serialization.XmlEnumAttribute("24")>
|
||||||
Item24
|
Item24
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("25")> _
|
<System.Xml.Serialization.XmlEnumAttribute("25")>
|
||||||
Item25
|
Item25
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("26")> _
|
<System.Xml.Serialization.XmlEnumAttribute("26")>
|
||||||
Item26
|
Item26
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("27")> _
|
<System.Xml.Serialization.XmlEnumAttribute("27")>
|
||||||
Item27
|
Item27
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("28")> _
|
<System.Xml.Serialization.XmlEnumAttribute("28")>
|
||||||
Item28
|
Item28
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("29")> _
|
<System.Xml.Serialization.XmlEnumAttribute("29")>
|
||||||
Item29
|
Item29
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("30")> _
|
<System.Xml.Serialization.XmlEnumAttribute("30")>
|
||||||
Item30
|
Item30
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("31")> _
|
<System.Xml.Serialization.XmlEnumAttribute("31")>
|
||||||
Item31
|
Item31
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("32")> _
|
<System.Xml.Serialization.XmlEnumAttribute("32")>
|
||||||
Item32
|
Item32
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("33")> _
|
<System.Xml.Serialization.XmlEnumAttribute("33")>
|
||||||
Item33
|
Item33
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("34")> _
|
<System.Xml.Serialization.XmlEnumAttribute("34")>
|
||||||
Item34
|
Item34
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("35")> _
|
<System.Xml.Serialization.XmlEnumAttribute("35")>
|
||||||
Item35
|
Item35
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("36")> _
|
<System.Xml.Serialization.XmlEnumAttribute("36")>
|
||||||
Item36
|
Item36
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("37")> _
|
<System.Xml.Serialization.XmlEnumAttribute("37")>
|
||||||
Item37
|
Item37
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("38")> _
|
<System.Xml.Serialization.XmlEnumAttribute("38")>
|
||||||
Item38
|
Item38
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("39")> _
|
<System.Xml.Serialization.XmlEnumAttribute("39")>
|
||||||
Item39
|
Item39
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("40")> _
|
<System.Xml.Serialization.XmlEnumAttribute("40")>
|
||||||
Item40
|
Item40
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("41")> _
|
<System.Xml.Serialization.XmlEnumAttribute("41")>
|
||||||
Item41
|
Item41
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("42")> _
|
<System.Xml.Serialization.XmlEnumAttribute("42")>
|
||||||
Item42
|
Item42
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("43")> _
|
<System.Xml.Serialization.XmlEnumAttribute("43")>
|
||||||
Item43
|
Item43
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("44")> _
|
<System.Xml.Serialization.XmlEnumAttribute("44")>
|
||||||
Item44
|
Item44
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("45")> _
|
<System.Xml.Serialization.XmlEnumAttribute("45")>
|
||||||
Item45
|
Item45
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("46")> _
|
<System.Xml.Serialization.XmlEnumAttribute("46")>
|
||||||
Item46
|
Item46
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("47")> _
|
<System.Xml.Serialization.XmlEnumAttribute("47")>
|
||||||
Item47
|
Item47
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("48")> _
|
<System.Xml.Serialization.XmlEnumAttribute("48")>
|
||||||
Item48
|
Item48
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("49")> _
|
<System.Xml.Serialization.XmlEnumAttribute("49")>
|
||||||
Item49
|
Item49
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("50")> _
|
<System.Xml.Serialization.XmlEnumAttribute("50")>
|
||||||
Item50
|
Item50
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("51")> _
|
<System.Xml.Serialization.XmlEnumAttribute("51")>
|
||||||
Item51
|
Item51
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("52")> _
|
<System.Xml.Serialization.XmlEnumAttribute("52")>
|
||||||
Item52
|
Item52
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("53")> _
|
<System.Xml.Serialization.XmlEnumAttribute("53")>
|
||||||
Item53
|
Item53
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("54")> _
|
<System.Xml.Serialization.XmlEnumAttribute("54")>
|
||||||
Item54
|
Item54
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("55")> _
|
<System.Xml.Serialization.XmlEnumAttribute("55")>
|
||||||
Item55
|
Item55
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("56")> _
|
<System.Xml.Serialization.XmlEnumAttribute("56")>
|
||||||
Item56
|
Item56
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("57")> _
|
<System.Xml.Serialization.XmlEnumAttribute("57")>
|
||||||
Item57
|
Item57
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("58")> _
|
<System.Xml.Serialization.XmlEnumAttribute("58")>
|
||||||
Item58
|
Item58
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("59")> _
|
<System.Xml.Serialization.XmlEnumAttribute("59")>
|
||||||
Item59
|
Item59
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("60")> _
|
<System.Xml.Serialization.XmlEnumAttribute("60")>
|
||||||
Item60
|
Item60
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("61")> _
|
<System.Xml.Serialization.XmlEnumAttribute("61")>
|
||||||
Item61
|
Item61
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("62")> _
|
<System.Xml.Serialization.XmlEnumAttribute("62")>
|
||||||
Item62
|
Item62
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("63")> _
|
<System.Xml.Serialization.XmlEnumAttribute("63")>
|
||||||
Item63
|
Item63
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("64")> _
|
<System.Xml.Serialization.XmlEnumAttribute("64")>
|
||||||
Item64
|
Item64
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("65")> _
|
<System.Xml.Serialization.XmlEnumAttribute("65")>
|
||||||
Item65
|
Item65
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("66")> _
|
<System.Xml.Serialization.XmlEnumAttribute("66")>
|
||||||
Item66
|
Item66
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("67")> _
|
<System.Xml.Serialization.XmlEnumAttribute("67")>
|
||||||
Item67
|
Item67
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("68")> _
|
<System.Xml.Serialization.XmlEnumAttribute("68")>
|
||||||
Item68
|
Item68
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("69")> _
|
<System.Xml.Serialization.XmlEnumAttribute("69")>
|
||||||
Item69
|
Item69
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("70")> _
|
<System.Xml.Serialization.XmlEnumAttribute("70")>
|
||||||
Item70
|
Item70
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("71")> _
|
<System.Xml.Serialization.XmlEnumAttribute("71")>
|
||||||
Item71
|
Item71
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("72")> _
|
<System.Xml.Serialization.XmlEnumAttribute("72")>
|
||||||
Item72
|
Item72
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("73")> _
|
<System.Xml.Serialization.XmlEnumAttribute("73")>
|
||||||
Item73
|
Item73
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("74")> _
|
<System.Xml.Serialization.XmlEnumAttribute("74")>
|
||||||
Item74
|
Item74
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("75")> _
|
<System.Xml.Serialization.XmlEnumAttribute("75")>
|
||||||
Item75
|
Item75
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("76")> _
|
<System.Xml.Serialization.XmlEnumAttribute("76")>
|
||||||
Item76
|
Item76
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("77")> _
|
<System.Xml.Serialization.XmlEnumAttribute("77")>
|
||||||
Item77
|
Item77
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("78")> _
|
<System.Xml.Serialization.XmlEnumAttribute("78")>
|
||||||
Item78
|
Item78
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("79")> _
|
<System.Xml.Serialization.XmlEnumAttribute("79")>
|
||||||
Item79
|
Item79
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("80")> _
|
<System.Xml.Serialization.XmlEnumAttribute("80")>
|
||||||
Item80
|
Item80
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("81")> _
|
<System.Xml.Serialization.XmlEnumAttribute("81")>
|
||||||
Item81
|
Item81
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("82")> _
|
<System.Xml.Serialization.XmlEnumAttribute("82")>
|
||||||
Item82
|
Item82
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("83")> _
|
<System.Xml.Serialization.XmlEnumAttribute("83")>
|
||||||
Item83
|
Item83
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("84")> _
|
<System.Xml.Serialization.XmlEnumAttribute("84")>
|
||||||
Item84
|
Item84
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("85")> _
|
<System.Xml.Serialization.XmlEnumAttribute("85")>
|
||||||
Item85
|
Item85
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("86")> _
|
<System.Xml.Serialization.XmlEnumAttribute("86")>
|
||||||
Item86
|
Item86
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("87")> _
|
<System.Xml.Serialization.XmlEnumAttribute("87")>
|
||||||
Item87
|
Item87
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("88")> _
|
<System.Xml.Serialization.XmlEnumAttribute("88")>
|
||||||
Item88
|
Item88
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("89")> _
|
<System.Xml.Serialization.XmlEnumAttribute("89")>
|
||||||
Item89
|
Item89
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("90")> _
|
<System.Xml.Serialization.XmlEnumAttribute("90")>
|
||||||
Item90
|
Item90
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("91")> _
|
<System.Xml.Serialization.XmlEnumAttribute("91")>
|
||||||
Item91
|
Item91
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("92")> _
|
<System.Xml.Serialization.XmlEnumAttribute("92")>
|
||||||
Item92
|
Item92
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("93")> _
|
<System.Xml.Serialization.XmlEnumAttribute("93")>
|
||||||
Item93
|
Item93
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("94")> _
|
<System.Xml.Serialization.XmlEnumAttribute("94")>
|
||||||
Item94
|
Item94
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("95")> _
|
<System.Xml.Serialization.XmlEnumAttribute("95")>
|
||||||
Item95
|
Item95
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("96")> _
|
<System.Xml.Serialization.XmlEnumAttribute("96")>
|
||||||
Item96
|
Item96
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("97")> _
|
<System.Xml.Serialization.XmlEnumAttribute("97")>
|
||||||
Item97
|
Item97
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("98")> _
|
<System.Xml.Serialization.XmlEnumAttribute("98")>
|
||||||
Item98
|
Item98
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("99")> _
|
<System.Xml.Serialization.XmlEnumAttribute("99")>
|
||||||
Item99
|
Item99
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("100")> _
|
<System.Xml.Serialization.XmlEnumAttribute("100")>
|
||||||
Item100
|
Item100
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("101")> _
|
<System.Xml.Serialization.XmlEnumAttribute("101")>
|
||||||
Item101
|
Item101
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("102")> _
|
<System.Xml.Serialization.XmlEnumAttribute("102")>
|
||||||
Item102
|
Item102
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("103")> _
|
<System.Xml.Serialization.XmlEnumAttribute("103")>
|
||||||
Item103
|
Item103
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.Xml.Serialization.XmlEnumAttribute("104")> _
|
<System.Xml.Serialization.XmlEnumAttribute("104")>
|
||||||
Item104
|
Item104
|
||||||
|
|
||||||
|
'''<remarks/>
|
||||||
|
AA
|
||||||
|
'''<remarks/>
|
||||||
|
AAA
|
||||||
|
'''<remarks/>
|
||||||
|
AAC
|
||||||
|
'''<remarks/>
|
||||||
|
AAD
|
||||||
|
'''<remarks/>
|
||||||
|
AAE
|
||||||
|
'''<remarks/>
|
||||||
|
AAF
|
||||||
|
'''<remarks/>
|
||||||
|
AAH
|
||||||
|
'''<remarks/>
|
||||||
|
AAI
|
||||||
|
'''<remarks/>
|
||||||
|
AAS
|
||||||
|
'''<remarks/>
|
||||||
|
AAT
|
||||||
|
'''<remarks/>
|
||||||
|
AAV
|
||||||
|
'''<remarks/>
|
||||||
|
AAY
|
||||||
|
'''<remarks/>
|
||||||
|
AAZ
|
||||||
|
'''<remarks/>
|
||||||
|
ABA
|
||||||
|
'''<remarks/>
|
||||||
|
ABB
|
||||||
|
'''<remarks/>
|
||||||
|
ABC
|
||||||
|
'''<remarks/>
|
||||||
|
ABD
|
||||||
|
'''<remarks/>
|
||||||
|
ABF
|
||||||
|
'''<remarks/>
|
||||||
|
ABK
|
||||||
|
'''<remarks/>
|
||||||
|
ABL
|
||||||
|
'''<remarks/>
|
||||||
|
ABN
|
||||||
|
'''<remarks/>
|
||||||
|
ABR
|
||||||
|
'''<remarks/>
|
||||||
|
ABS
|
||||||
|
'''<remarks/>
|
||||||
|
ABT
|
||||||
|
'''<remarks/>
|
||||||
|
ABU
|
||||||
|
'''<remarks/>
|
||||||
|
ACF
|
||||||
|
'''<remarks/>
|
||||||
|
ACG
|
||||||
|
'''<remarks/>
|
||||||
|
ACH
|
||||||
|
'''<remarks/>
|
||||||
|
ACI
|
||||||
|
'''<remarks/>
|
||||||
|
ACJ
|
||||||
|
'''<remarks/>
|
||||||
|
ACK
|
||||||
|
'''<remarks/>
|
||||||
|
ACL
|
||||||
|
'''<remarks/>
|
||||||
|
ACM
|
||||||
|
'''<remarks/>
|
||||||
|
ACS
|
||||||
|
'''<remarks/>
|
||||||
|
ADC
|
||||||
|
'''<remarks/>
|
||||||
|
ADE
|
||||||
|
'''<remarks/>
|
||||||
|
ADJ
|
||||||
|
'''<remarks/>
|
||||||
|
ADK
|
||||||
|
'''<remarks/>
|
||||||
|
ADL
|
||||||
|
'''<remarks/>
|
||||||
|
ADM
|
||||||
|
'''<remarks/>
|
||||||
|
ADN
|
||||||
|
'''<remarks/>
|
||||||
|
ADO
|
||||||
|
'''<remarks/>
|
||||||
|
ADP
|
||||||
|
'''<remarks/>
|
||||||
|
ADQ
|
||||||
|
'''<remarks/>
|
||||||
|
ADR
|
||||||
|
'''<remarks/>
|
||||||
|
ADT
|
||||||
|
'''<remarks/>
|
||||||
|
ADW
|
||||||
|
'''<remarks/>
|
||||||
|
ADY
|
||||||
|
'''<remarks/>
|
||||||
|
ADZ
|
||||||
|
'''<remarks/>
|
||||||
|
AEA
|
||||||
|
'''<remarks/>
|
||||||
|
AEB
|
||||||
|
'''<remarks/>
|
||||||
|
AEC
|
||||||
|
'''<remarks/>
|
||||||
|
AED
|
||||||
|
'''<remarks/>
|
||||||
|
AEF
|
||||||
|
'''<remarks/>
|
||||||
|
AEH
|
||||||
|
'''<remarks/>
|
||||||
|
AEI
|
||||||
|
'''<remarks/>
|
||||||
|
AEJ
|
||||||
|
'''<remarks/>
|
||||||
|
AEK
|
||||||
|
'''<remarks/>
|
||||||
|
AEL
|
||||||
|
'''<remarks/>
|
||||||
|
AEM
|
||||||
|
'''<remarks/>
|
||||||
|
AEN
|
||||||
|
'''<remarks/>
|
||||||
|
AEO
|
||||||
|
'''<remarks/>
|
||||||
|
AEP
|
||||||
|
'''<remarks/>
|
||||||
|
AES
|
||||||
|
'''<remarks/>
|
||||||
|
AET
|
||||||
|
'''<remarks/>
|
||||||
|
AEU
|
||||||
|
'''<remarks/>
|
||||||
|
AEV
|
||||||
|
'''<remarks/>
|
||||||
|
AEW
|
||||||
|
'''<remarks/>
|
||||||
|
AEX
|
||||||
|
'''<remarks/>
|
||||||
|
AEY
|
||||||
|
'''<remarks/>
|
||||||
|
AEZ
|
||||||
|
'''<remarks/>
|
||||||
|
AJ
|
||||||
|
'''<remarks/>
|
||||||
|
AU
|
||||||
|
'''<remarks/>
|
||||||
|
CA
|
||||||
|
'''<remarks/>
|
||||||
|
CAB
|
||||||
|
'''<remarks/>
|
||||||
|
CAD
|
||||||
|
'''<remarks/>
|
||||||
|
CAE
|
||||||
|
'''<remarks/>
|
||||||
|
CAF
|
||||||
|
'''<remarks/>
|
||||||
|
CAI
|
||||||
|
'''<remarks/>
|
||||||
|
CAJ
|
||||||
|
'''<remarks/>
|
||||||
|
CAK
|
||||||
|
'''<remarks/>
|
||||||
|
CAL
|
||||||
|
'''<remarks/>
|
||||||
|
CAM
|
||||||
|
'''<remarks/>
|
||||||
|
CAN
|
||||||
|
'''<remarks/>
|
||||||
|
CAO
|
||||||
|
'''<remarks/>
|
||||||
|
CAP
|
||||||
|
'''<remarks/>
|
||||||
|
CAQ
|
||||||
|
'''<remarks/>
|
||||||
|
CAR
|
||||||
|
'''<remarks/>
|
||||||
|
CAS
|
||||||
|
'''<remarks/>
|
||||||
|
CAT
|
||||||
|
'''<remarks/>
|
||||||
|
CAU
|
||||||
|
'''<remarks/>
|
||||||
|
CAV
|
||||||
|
'''<remarks/>
|
||||||
|
CAW
|
||||||
|
'''<remarks/>
|
||||||
|
CAX
|
||||||
|
'''<remarks/>
|
||||||
|
CAY
|
||||||
|
'''<remarks/>
|
||||||
|
CAZ
|
||||||
|
'''<remarks/>
|
||||||
|
CD
|
||||||
|
'''<remarks/>
|
||||||
|
CG
|
||||||
|
'''<remarks/>
|
||||||
|
CS
|
||||||
|
'''<remarks/>
|
||||||
|
CT
|
||||||
|
'''<remarks/>
|
||||||
|
DAB
|
||||||
|
'''<remarks/>
|
||||||
|
DAC
|
||||||
|
'''<remarks/>
|
||||||
|
DAD
|
||||||
|
'''<remarks/>
|
||||||
|
DAF
|
||||||
|
'''<remarks/>
|
||||||
|
DAG
|
||||||
|
'''<remarks/>
|
||||||
|
DAH
|
||||||
|
'''<remarks/>
|
||||||
|
DAI
|
||||||
|
'''<remarks/>
|
||||||
|
DAJ
|
||||||
|
'''<remarks/>
|
||||||
|
DAK
|
||||||
|
'''<remarks/>
|
||||||
|
DAL
|
||||||
|
'''<remarks/>
|
||||||
|
DAM
|
||||||
|
'''<remarks/>
|
||||||
|
DAN
|
||||||
|
'''<remarks/>
|
||||||
|
DAO
|
||||||
|
'''<remarks/>
|
||||||
|
DAP
|
||||||
|
'''<remarks/>
|
||||||
|
DAQ
|
||||||
|
'''<remarks/>
|
||||||
|
DL
|
||||||
|
'''<remarks/>
|
||||||
|
EG
|
||||||
|
'''<remarks/>
|
||||||
|
EP
|
||||||
|
'''<remarks/>
|
||||||
|
ER
|
||||||
|
'''<remarks/>
|
||||||
|
FAA
|
||||||
|
'''<remarks/>
|
||||||
|
FAB
|
||||||
|
'''<remarks/>
|
||||||
|
FAC
|
||||||
|
'''<remarks/>
|
||||||
|
FC
|
||||||
|
'''<remarks/>
|
||||||
|
FH
|
||||||
|
'''<remarks/>
|
||||||
|
FI
|
||||||
|
'''<remarks/>
|
||||||
|
GAA
|
||||||
|
'''<remarks/>
|
||||||
|
HAA
|
||||||
|
'''<remarks/>
|
||||||
|
HD
|
||||||
|
'''<remarks/>
|
||||||
|
HH
|
||||||
|
'''<remarks/>
|
||||||
|
IAA
|
||||||
|
'''<remarks/>
|
||||||
|
IAB
|
||||||
|
'''<remarks/>
|
||||||
|
ID
|
||||||
|
'''<remarks/>
|
||||||
|
[IF]
|
||||||
|
'''<remarks/>
|
||||||
|
IR
|
||||||
|
'''<remarks/>
|
||||||
|
[Is]
|
||||||
|
'''<remarks/>
|
||||||
|
KO
|
||||||
|
'''<remarks/>
|
||||||
|
L1
|
||||||
|
'''<remarks/>
|
||||||
|
LA
|
||||||
|
'''<remarks/>
|
||||||
|
LAA
|
||||||
|
'''<remarks/>
|
||||||
|
LAB
|
||||||
|
'''<remarks/>
|
||||||
|
LF
|
||||||
|
'''<remarks/>
|
||||||
|
MAE
|
||||||
|
'''<remarks/>
|
||||||
|
MI
|
||||||
|
'''<remarks/>
|
||||||
|
ML
|
||||||
|
'''<remarks/>
|
||||||
|
NAA
|
||||||
|
'''<remarks/>
|
||||||
|
OA
|
||||||
|
'''<remarks/>
|
||||||
|
PA
|
||||||
|
'''<remarks/>
|
||||||
|
PAA
|
||||||
|
'''<remarks/>
|
||||||
|
PC
|
||||||
|
'''<remarks/>
|
||||||
|
PL
|
||||||
|
'''<remarks/>
|
||||||
|
PRV
|
||||||
|
'''<remarks/>
|
||||||
|
RAB
|
||||||
|
'''<remarks/>
|
||||||
|
RAC
|
||||||
|
'''<remarks/>
|
||||||
|
RAD
|
||||||
|
'''<remarks/>
|
||||||
|
RAF
|
||||||
|
'''<remarks/>
|
||||||
|
RE
|
||||||
|
'''<remarks/>
|
||||||
|
RF
|
||||||
|
'''<remarks/>
|
||||||
|
RH
|
||||||
|
'''<remarks/>
|
||||||
|
RV
|
||||||
|
'''<remarks/>
|
||||||
|
SA
|
||||||
|
'''<remarks/>
|
||||||
|
SAA
|
||||||
|
'''<remarks/>
|
||||||
|
SAD
|
||||||
|
'''<remarks/>
|
||||||
|
SAE
|
||||||
|
'''<remarks/>
|
||||||
|
SAI
|
||||||
|
'''<remarks/>
|
||||||
|
SG
|
||||||
|
'''<remarks/>
|
||||||
|
SH
|
||||||
|
'''<remarks/>
|
||||||
|
SM
|
||||||
|
'''<remarks/>
|
||||||
|
SU
|
||||||
|
'''<remarks/>
|
||||||
|
TAB
|
||||||
|
'''<remarks/>
|
||||||
|
TAC
|
||||||
|
'''<remarks/>
|
||||||
|
TT
|
||||||
|
'''<remarks/>
|
||||||
|
TV
|
||||||
|
'''<remarks/>
|
||||||
|
V1
|
||||||
|
'''<remarks/>
|
||||||
|
V2
|
||||||
|
'''<remarks/>
|
||||||
|
WH
|
||||||
|
'''<remarks/>
|
||||||
|
XAA
|
||||||
|
'''<remarks/>
|
||||||
|
YY
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
ZZZ
|
ZZZ
|
||||||
End Enum
|
End Enum
|
||||||
|
|
||||||
|
|
||||||
'''<remarks/>
|
'''<remarks/>
|
||||||
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0"), _
|
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0"), _
|
||||||
System.SerializableAttribute(), _
|
System.SerializableAttribute(), _
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,14 @@
|
|||||||
''' 0 = Default / Text
|
''' 0 = Default / Text
|
||||||
''' 1 = Datum
|
''' 1 = Datum
|
||||||
''' 2 = Gleitkomma
|
''' 2 = Gleitkomma
|
||||||
''' 3 = Memo-Feld
|
''' 3 = Attachment-Felder
|
||||||
|
''' 4 = Elemente einer Liste, vgl Currency
|
||||||
''' </summary>
|
''' </summary>
|
||||||
Public ItemType As Integer
|
Public ItemType As Integer
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' BT-Feld-Bezeichnung
|
||||||
|
''' </summary>
|
||||||
|
Public EN16931_ID As String
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
@@ -6,6 +6,42 @@
|
|||||||
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.5.0" newVersion="4.1.5.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Pkcs" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.1" newVersion="8.0.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Packaging" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.1" newVersion="8.0.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.6" newVersion="8.0.0.6" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
|
||||||
|
|||||||
@@ -1,7 +1,32 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="GdPicture" version="14.2.90" targetFramework="net462" />
|
<package id="BouncyCastle.Cryptography" version="2.5.0" targetFramework="net462" />
|
||||||
<package id="GdPicture.runtimes.windows" version="14.2.90" targetFramework="net462" />
|
<package id="DocumentFormat.OpenXml" version="3.2.0" targetFramework="net462" />
|
||||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
|
<package id="DocumentFormat.OpenXml.Framework" version="3.2.0" targetFramework="net462" />
|
||||||
|
<package id="GdPicture" version="14.3.3" targetFramework="net462" />
|
||||||
|
<package id="GdPicture.runtimes.windows" version="14.3.3" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.AspNet.WebApi.Client" version="6.0.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net462" />
|
||||||
|
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" />
|
||||||
|
<package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="OpenMcdf" version="2.4.1" targetFramework="net462" />
|
||||||
|
<package id="protobuf-net" version="3.2.46" targetFramework="net462" />
|
||||||
|
<package id="protobuf-net.Core" version="3.2.46" targetFramework="net462" />
|
||||||
|
<package id="RtfPipe" version="2.0.7677.4303" targetFramework="net462" />
|
||||||
|
<package id="System.Buffers" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.CodeDom" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Collections.Immutable" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.IO.Packaging" version="8.0.1" targetFramework="net462" />
|
||||||
|
<package id="System.Management" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Memory" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.Numerics.Vectors" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.0" targetFramework="net462" />
|
||||||
|
<package id="System.Security.Cryptography.Pkcs" version="8.0.1" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Encodings.Web" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Json" version="8.0.6" targetFramework="net462" />
|
||||||
|
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net462" />
|
||||||
|
<package id="System.ValueTuple" version="4.5.0" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -5,10 +5,56 @@
|
|||||||
</startup>
|
</startup>
|
||||||
<runtime>
|
<runtime>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity name="GdPicture.NET.14" publicKeyToken="f52a2e60ad468dbb" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-14.3.9.0" newVersion="14.3.9.0" />
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
<assemblyIdentity name="FirebirdSql.Data.FirebirdClient" publicKeyToken="3750abcc3150b00c" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-7.5.0.0" newVersion="7.5.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.5.0" newVersion="4.1.5.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Pkcs" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.1" newVersion="8.0.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Packaging" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.1" newVersion="8.0.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.6" newVersion="8.0.0.6" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="GdPicture.NET.14.Common" publicKeyToken="f52a2e60ad468dbb" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-14.3.3.0" newVersion="14.3.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="GdPicture.NET.14" publicKeyToken="f52a2e60ad468dbb" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-14.3.3.0" newVersion="14.3.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
182
Jobs/Jobs.vbproj
182
Jobs/Jobs.vbproj
@@ -66,28 +66,6 @@
|
|||||||
</None>
|
</None>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Base\Base.vbproj">
|
|
||||||
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
|
||||||
<Name>Base</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Config\Config.vbproj">
|
|
||||||
<Project>{44982f9b-6116-44e2-85d0-f39650b1ef99}</Project>
|
|
||||||
<Name>Config</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Database\Database.vbproj">
|
|
||||||
<Project>{eaf0ea75-5fa7-485d-89c7-b2d843b03a96}</Project>
|
|
||||||
<Name>Database</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Interfaces\Interfaces.vbproj">
|
|
||||||
<Project>{ab6f09bf-e794-4f6a-94bb-c97c0ba84d64}</Project>
|
|
||||||
<Name>Interfaces</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
|
||||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
|
||||||
<Name>Logging</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="ADSync\ADSyncArgs.vb" />
|
<Compile Include="ADSync\ADSyncArgs.vb" />
|
||||||
<Compile Include="ADSync\ADSyncJob.vb" />
|
<Compile Include="ADSync\ADSyncJob.vb" />
|
||||||
@@ -122,38 +100,186 @@
|
|||||||
<Compile Include="ZUGFeRD\XRechnungViewDocument.vb" />
|
<Compile Include="ZUGFeRD\XRechnungViewDocument.vb" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\BouncyCastle.Cryptography.2.5.0\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Base">
|
||||||
|
<HintPath>..\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Config">
|
||||||
|
<HintPath>..\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Database">
|
||||||
|
<HintPath>..\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Interfaces">
|
||||||
|
<HintPath>..\Interfaces\bin\Debug\DigitalData.Modules.Interfaces.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging">
|
||||||
|
<HintPath>..\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DocumentFormat.OpenXml, Version=3.2.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DocumentFormat.OpenXml.3.2.0\lib\net46\DocumentFormat.OpenXml.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="DocumentFormat.OpenXml.Framework, Version=3.2.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DocumentFormat.OpenXml.Framework.3.2.0\lib\net46\DocumentFormat.OpenXml.Framework.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="FirebirdSql.Data.FirebirdClient, Version=7.5.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
|
<Reference Include="FirebirdSql.Data.FirebirdClient, Version=7.5.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll</HintPath>
|
<HintPath>..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="GdPicture.NET.14, Version=14.2.90.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
<Reference Include="GdPicture.NET.14, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\GdPicture.14.2.90\lib\net462\GdPicture.NET.14.dll</HintPath>
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.barcode.1d.writer, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.barcode.1d.writer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.barcode.2d.writer, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.barcode.2d.writer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.CAD, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.CAD.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.CAD.DWG, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.CAD.DWG.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Common, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Common.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Document, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Document.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Email, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Email.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.HTML, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.HTML.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Formats, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Formats.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Formats.Conversion, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Formats.Conversion.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.Imaging.Rendering, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.Imaging.Rendering.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.MSOfficeBinary, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.MSOfficeBinary.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenDocument, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenDocument.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenXML, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenXML.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.OpenXML.Templating, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.OpenXML.Templating.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.PDF, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.PDF.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.RTF, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.RTF.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.SVG, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.SVG.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="GdPicture.NET.14.wia.gateway, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6973b5c22dcf45f7, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.wia.gateway.dll</HintPath>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="OpenMcdf, Version=2.4.1.0, Culture=neutral, PublicKeyToken=fdbb1629d7c00800, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\OpenMcdf.2.4.1\lib\net40\OpenMcdf.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="protobuf-net, Version=3.0.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\protobuf-net.3.2.46\lib\net462\protobuf-net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="protobuf-net.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\protobuf-net.Core.3.2.46\lib\net462\protobuf-net.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="RtfPipe, Version=2.0.7677.4303, Culture=neutral, PublicKeyToken=5f6ab4ce530296d2, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\RtfPipe.2.0.7677.4303\lib\net45\RtfPipe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Buffers, Version=4.0.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Buffers.4.6.0\lib\net462\System.Buffers.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.CodeDom, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.CodeDom.8.0.0\lib\net462\System.CodeDom.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections.Immutable, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Collections.Immutable.8.0.0\lib\net462\System.Collections.Immutable.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.IO.Compression" />
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.IO.Packaging, Version=8.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.IO.Packaging.8.0.1\lib\net462\System.IO.Packaging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Management" />
|
||||||
|
<Reference Include="System.Memory, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Memory.4.6.0\lib\net462\System.Memory.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Net.Http.Formatting, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.6.0.0\lib\net45\System.Net.Http.Formatting.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Numerics.Vectors, Version=4.1.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Numerics.Vectors.4.6.0\lib\net462\System.Numerics.Vectors.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.0\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.Security" />
|
||||||
|
<Reference Include="System.Security.Cryptography.Pkcs, Version=8.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Security.Cryptography.Pkcs.8.0.1\lib\net462\System.Security.Cryptography.Pkcs.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Json, Version=8.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Json.8.0.6\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Transactions" />
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="System.XML.Linq" />
|
<Reference Include="System.XML.Linq" />
|
||||||
|
<Reference Include="WindowsBase" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" />
|
<Import Project="..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets" Condition="Exists('..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets')" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.2.90\build\net462\GdPicture.runtimes.windows.targets'))" />
|
<Error Condition="!Exists('..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GdPicture.runtimes.windows.14.3.3\build\net462\GdPicture.runtimes.windows.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -12,8 +12,8 @@ Imports System.Runtime.InteropServices
|
|||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("")>
|
||||||
<Assembly: AssemblyCompany("Digital Data")>
|
<Assembly: AssemblyCompany("Digital Data")>
|
||||||
<Assembly: AssemblyProduct("Modules.Jobs")>
|
<Assembly: AssemblyProduct("Modules.Jobs")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
<Assembly: AssemblyCopyright("Copyright © 2026")>
|
||||||
<Assembly: AssemblyTrademark("2.6.3.0")>
|
<Assembly: AssemblyTrademark("3.5.1.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -30,5 +30,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
' Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2.7.0.0")>
|
<Assembly: AssemblyVersion("3.5.1.0")>
|
||||||
<Assembly: AssemblyFileVersion("2.7.0.0")>
|
<Assembly: AssemblyFileVersion("3.5.1.0")>
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ Namespace ZUGFeRD
|
|||||||
For Each oFile In pAttachmentFiles
|
For Each oFile In pAttachmentFiles
|
||||||
Try
|
Try
|
||||||
Dim oFilePath = _filesystem.GetVersionedFilename(Path.Combine(oAttachmentDirectory, oFile.Name))
|
Dim oFilePath = _filesystem.GetVersionedFilename(Path.Combine(oAttachmentDirectory, oFile.Name))
|
||||||
|
|
||||||
_filesystem.MoveTo(oFile.FullName, oFilePath, oAttachmentDirectory)
|
_filesystem.MoveTo(oFile.FullName, oFilePath, oAttachmentDirectory)
|
||||||
_logger.Info("Attachment moved to {0}", oFilePath)
|
_logger.Info("Attachment moved to {0}", oFilePath)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -98,11 +97,22 @@ Namespace ZUGFeRD
|
|||||||
If Not File.Exists(oAttachmentDirectory) Then
|
If Not File.Exists(oAttachmentDirectory) Then
|
||||||
Directory.CreateDirectory(oAttachmentDirectory)
|
Directory.CreateDirectory(oAttachmentDirectory)
|
||||||
End If
|
End If
|
||||||
|
System.IO.File.WriteAllBytes(oFilePath, oResult.FileContents)
|
||||||
|
If CheckBytes(oFilePath, oResult.FileContents) = True Then
|
||||||
|
If FileOpenwithError(oFilePath) Then
|
||||||
|
_logger.Info("Embedded Attachment moved to {0}", oFilePath)
|
||||||
|
Else
|
||||||
|
_logger.Info("File is corrupt. Deleting the created file ...")
|
||||||
|
File.Delete(oFilePath)
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
_logger.Info("File is corrupt (CheckBytes). Deleting the created file ...")
|
||||||
|
File.Delete(oFilePath)
|
||||||
|
End If
|
||||||
|
'Using oWriter As New FileStream(oFilePath, FileMode.Create)
|
||||||
|
' oWriter.Write(oResult.FileContents, 0, oResult.FileContents.Length)
|
||||||
|
|
||||||
Using oWriter As New FileStream(oFilePath, FileMode.Create)
|
'End Using
|
||||||
oWriter.Write(oResult.FileContents, 0, oResult.FileContents.Length)
|
|
||||||
_logger.Info("Embedded Attachment moved to {0}", oFilePath)
|
|
||||||
End Using
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_logger.Warn("Could not save embedded attachment {0}", oResult.FileName)
|
_logger.Warn("Could not save embedded attachment {0}", oResult.FileName)
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
@@ -111,7 +121,15 @@ Namespace ZUGFeRD
|
|||||||
|
|
||||||
_logger.Info("Finished moving files")
|
_logger.Info("Finished moving files")
|
||||||
End Sub
|
End Sub
|
||||||
|
Private Function CheckBytes(oFilePath As String, oFileContents As IEnumerable(Of Byte)) As Boolean
|
||||||
|
Dim savedBytes() As Byte = System.IO.File.ReadAllBytes(oFilePath)
|
||||||
|
|
||||||
|
If savedBytes.SequenceEqual(oFileContents) Then
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
Public Function MoveAndRenameEmailToRejected(pArgs As WorkerArgs, pMessageId As String) As EmailData
|
Public Function MoveAndRenameEmailToRejected(pArgs As WorkerArgs, pMessageId As String) As EmailData
|
||||||
_logger.Info("Moving Mail with MessageId [{0}] to Rejected folder", pMessageId)
|
_logger.Info("Moving Mail with MessageId [{0}] to Rejected folder", pMessageId)
|
||||||
_logger.Debug("Fetching Email Data")
|
_logger.Debug("Fetching Email Data")
|
||||||
@@ -177,7 +195,19 @@ Namespace ZUGFeRD
|
|||||||
|
|
||||||
Return oEmailData
|
Return oEmailData
|
||||||
End Function
|
End Function
|
||||||
|
Private Function FileOpenwithError(pFilePath As String) As Boolean
|
||||||
|
Try
|
||||||
|
Using fs As FileStream = File.Open(pFilePath, FileMode.Open, FileAccess.Read, FileShare.None)
|
||||||
|
Return True ' Datei kann geöffnet werden
|
||||||
|
End Using
|
||||||
|
Catch ex As IOException
|
||||||
|
_logger.Info("file [{0}] could not be opened! Error IOException: [{1}]", pFilePath, ex.Message)
|
||||||
|
Return False ' Datei ist gesperrt oder existiert nicht
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Info("file [{0}] could not be opened! Error: [{1}]", pFilePath, ex.Message)
|
||||||
|
Return False ' Andere Fehler
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
Public Function GetEmailPathWithSubjectAsName(RejectedEmailDirectory As String, UncleanedSubject As String) As String
|
Public Function GetEmailPathWithSubjectAsName(RejectedEmailDirectory As String, UncleanedSubject As String) As String
|
||||||
Dim oCleanSubject = String.Join("", UncleanedSubject.Split(Path.GetInvalidPathChars()))
|
Dim oCleanSubject = String.Join("", UncleanedSubject.Split(Path.GetInvalidPathChars()))
|
||||||
Dim oAttachmentDirectory = RejectedEmailDirectory
|
Dim oAttachmentDirectory = RejectedEmailDirectory
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ Public Class HashFunctions
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
' Check if Checksum exists in History Table
|
' Check if Checksum exists in History Table
|
||||||
'Dim oCheckCommand = $"SELECT * FROM TBEDM_ZUGFERD_HISTORY_IN WHERE GUID = (SELECT MAX(GUID) FROM TBEDM_ZUGFERD_HISTORY_IN WHERE UPPER(MD5HASH) = UPPER('{oMD5CheckSum}'))"
|
|
||||||
'Dim oTable As DataTable = _firebird.GetDatatable(oCheckCommand, Firebird.TransactionMode.NoTransaction)
|
|
||||||
|
|
||||||
' Check if Checksum exists in History Table
|
|
||||||
' TODO: WHAT THE FUCK IS THIS
|
|
||||||
Dim oCheckCommand = $"SELECT * FROM TBEMLP_HISTORY WHERE GUID = (SELECT MAX(GUID) FROM TBEMLP_HISTORY WHERE UPPER(MD5HASH) = UPPER('{oMD5CheckSum}'))"
|
Dim oCheckCommand = $"SELECT * FROM TBEMLP_HISTORY WHERE GUID = (SELECT MAX(GUID) FROM TBEMLP_HISTORY WHERE UPPER(MD5HASH) = UPPER('{oMD5CheckSum}'))"
|
||||||
Dim oTable As DataTable = Database.GetDatatable(oCheckCommand, MSSQLServer.TransactionMode.NoTransaction)
|
Dim oTable As DataTable = Database.GetDatatable(oCheckCommand, MSSQLServer.TransactionMode.NoTransaction)
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,10 @@ Imports DigitalData.Modules.Config
|
|||||||
Imports DigitalData.Modules.Database
|
Imports DigitalData.Modules.Database
|
||||||
Imports DigitalData.Modules.Interfaces
|
Imports DigitalData.Modules.Interfaces
|
||||||
Imports DigitalData.Modules.Interfaces.Exceptions
|
Imports DigitalData.Modules.Interfaces.Exceptions
|
||||||
|
Imports DigitalData.Modules.Interfaces.PropertyValues
|
||||||
Imports DigitalData.Modules.Jobs.Exceptions
|
Imports DigitalData.Modules.Jobs.Exceptions
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
|
Imports GdPicture14
|
||||||
|
|
||||||
Public Class ImportZUGFeRDFiles
|
Public Class ImportZUGFeRDFiles
|
||||||
Implements IJob
|
Implements IJob
|
||||||
@@ -26,10 +28,35 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
Private Const DIRECTORY_DONT_MOVE = "DIRECTORY_DONT_MOVE"
|
Private Const DIRECTORY_DONT_MOVE = "DIRECTORY_DONT_MOVE"
|
||||||
|
|
||||||
|
Private Const MIME_TYPE_PDF = "application/pdf"
|
||||||
|
Private Const MIME_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
|
Private Const MIME_TYPE_ODT = "application/vnd.oasis.opendocument.spreadsheet"
|
||||||
|
|
||||||
' List of allowed extensions for PDF/A Attachments
|
' List of allowed extensions for PDF/A Attachments
|
||||||
' This list should not contain xml so the zugferd xml file will be filtered out
|
' This list should not contain xml so the zugferd xml file will be filtered out
|
||||||
Private ReadOnly AllowedExtensions As New List(Of String) From {"docx", "doc", "pdf", "xls", "xlsx", "ppt", "pptx", "txt"}
|
Private ReadOnly AllowedExtensions As New List(Of String) From {"docx", "doc", "pdf", "xls", "xlsx", "ppt", "pptx", "txt"}
|
||||||
|
|
||||||
|
' List of the Columns we need to store embedded files on disk and database
|
||||||
|
Private ReadOnly EmbeddedFilesColumnNames As List(Of String) = New List(Of String) From {
|
||||||
|
"ATTACHMENT_FILE_FILENAME", "ATTACHMENT_FILE_VALUE", "ATTACHMENT_FILE_MIMECODE"
|
||||||
|
}
|
||||||
|
|
||||||
|
' List of the allowed MIME-Codes
|
||||||
|
' Allowed Values are:
|
||||||
|
'- application/pdf
|
||||||
|
'- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx)
|
||||||
|
'- application/vnd.oasis.opendocument.spreadsheet (odt)
|
||||||
|
'- image/jpeg
|
||||||
|
'- image/png
|
||||||
|
'- image/tiff (UBL)
|
||||||
|
'- text/csv
|
||||||
|
'- text/xml (UBL)
|
||||||
|
Private ReadOnly AllowedMimeTypesInEmbeddedFiles As List(Of String) = New List(Of String) From {
|
||||||
|
MIME_TYPE_PDF,
|
||||||
|
MIME_TYPE_XLSX,
|
||||||
|
MIME_TYPE_ODT
|
||||||
|
}
|
||||||
|
|
||||||
Private ReadOnly _logger As Logger
|
Private ReadOnly _logger As Logger
|
||||||
Private ReadOnly _logConfig As LogConfig
|
Private ReadOnly _logConfig As LogConfig
|
||||||
Private ReadOnly _filesystem As FilesystemEx
|
Private ReadOnly _filesystem As FilesystemEx
|
||||||
@@ -43,7 +70,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Private SQL_xRechnung_ItemTemplate As String = ""
|
Private SQL_xRechnung_ItemTemplate As String = ""
|
||||||
|
|
||||||
Private ReadOnly _gdpictureLicenseKey As String
|
Private ReadOnly _gdpictureLicenseKey As String
|
||||||
Private _xRechnungCreator As XRechnungViewDocument
|
Private ReadOnly _xRechnungCreator As XRechnungViewDocument
|
||||||
Private _zugferd As ZUGFeRDInterface
|
Private _zugferd As ZUGFeRDInterface
|
||||||
Private _EmailOutAccountId As Integer
|
Private _EmailOutAccountId As Integer
|
||||||
|
|
||||||
@@ -92,16 +119,17 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
_zugferd = New ZUGFeRDInterface(_logConfig, _gdpictureLicenseKey, New ZUGFeRDInterface.ZugferdOptions() With {
|
_zugferd = New ZUGFeRDInterface(_logConfig, _gdpictureLicenseKey, New ZUGFeRDInterface.ZugferdOptions() With {
|
||||||
.AllowFacturX_Filename = oArgs.AllowFacturX,
|
.AllowFacturX_Filename = oArgs.AllowFacturX,
|
||||||
.AllowXRechnung_Filename = oArgs.AllowXRechnung
|
.AllowXRechnung_Filename = oArgs.AllowXRechnung,
|
||||||
|
.AllowPeppol_3_x_Schema = oArgs.AllowPeppolBISBill3x
|
||||||
})
|
})
|
||||||
|
|
||||||
_logger.Debug("Starting Job {0}", [GetType].Name)
|
_logger.Debug("Starting Job {0}", [GetType].Name)
|
||||||
If oArgs.AllowXRechnung Then
|
If oArgs.AllowXRechnung Then
|
||||||
Dim oSQL = "Select SQL_COMMAND from TBDD_SQL_COMMANDS WHERE TITLE = 'VWDD_ZUGFERD_VIEW_RECEIPT_TEMPLATE_ITEMS'"
|
' TODO - Config-Schalter hat NIX mit XRechnung-Dateien u. Sichtbelegen zu tun, sondern nur mit Dateinamen zu tun.
|
||||||
|
Dim oSQL = "SELECT SQL_COMMAND FROM TBDD_SQL_COMMANDS WHERE TITLE = 'VWDD_ZUGFERD_VIEW_RECEIPT_TEMPLATE_ITEMS'"
|
||||||
SQL_xRechnung_ItemTemplate = _mssql.GetScalarValue(oSQL)
|
SQL_xRechnung_ItemTemplate = _mssql.GetScalarValue(oSQL)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
|
||||||
Try
|
Try
|
||||||
'For Each oPath As String In oArgs.WatchDirectory
|
'For Each oPath As String In oArgs.WatchDirectory
|
||||||
Dim oPath As String = oArgs.WatchDirectory
|
Dim oPath As String = oArgs.WatchDirectory
|
||||||
@@ -130,7 +158,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
' Group files by messageId
|
' Group files by messageId
|
||||||
Dim oGrouped As Dictionary(Of String, List(Of FileInfo)) = _zugferd.FileGroup.GroupFiles(oFiles)
|
Dim oGrouped As Dictionary(Of String, List(Of FileInfo)) = _zugferd.FileGroup.GroupFiles(oFiles)
|
||||||
|
|
||||||
_logger.Info("Found {0} file groups", oGrouped.Count)
|
_logger.Info("Found [{0}] file groups", oGrouped.Count)
|
||||||
|
|
||||||
'Process each file group together
|
'Process each file group together
|
||||||
'oGrouped equals one e-invoice
|
'oGrouped equals one e-invoice
|
||||||
@@ -138,8 +166,6 @@ Public Class ImportZUGFeRDFiles
|
|||||||
' Start a new transaction for each file group.
|
' Start a new transaction for each file group.
|
||||||
' This way we can rollback database changes for the whole filegroup in case something goes wrong.
|
' This way we can rollback database changes for the whole filegroup in case something goes wrong.
|
||||||
Dim oSQLConnection As SqlConnection = _mssql.GetConnection()
|
Dim oSQLConnection As SqlConnection = _mssql.GetConnection()
|
||||||
|
|
||||||
|
|
||||||
Dim oSQLTransaction As SqlTransaction = oSQLConnection?.BeginTransaction()
|
Dim oSQLTransaction As SqlTransaction = oSQLConnection?.BeginTransaction()
|
||||||
|
|
||||||
Dim oConnections As New DatabaseConnections() With {
|
Dim oConnections As New DatabaseConnections() With {
|
||||||
@@ -192,7 +218,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
If oResult.ZugferdFileFound = True Then
|
If oResult.ZugferdFileFound = True Then
|
||||||
_logger.Debug("Zugferd File found")
|
_logger.Debug("eInvoice File found")
|
||||||
oMD5CheckSum = oResult.MD5Checksum
|
oMD5CheckSum = oResult.MD5Checksum
|
||||||
oZUGFeRDCount = oResult.ZugferdFileCount
|
oZUGFeRDCount = oResult.ZugferdFileCount
|
||||||
oEmailAttachmentFiles.AddRange(oResult.EmailAttachmentFiles)
|
oEmailAttachmentFiles.AddRange(oResult.EmailAttachmentFiles)
|
||||||
@@ -309,7 +335,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oBody = String.Format(EmailStrings.EMAIL_TOO_MUCH_FERDS, oEmailData.Subject)
|
Dim oBody = String.Format(EmailStrings.EMAIL_TOO_MUCH_FERDS, oEmailData.Subject)
|
||||||
|
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "TooMuchFerdsException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.TooMuchFerdsException, "", "")
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "TooMuchFerdsException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.TooMuchFerdsException, "", "")
|
||||||
AddRejectedState(oMessageId, oRejectionCodeString, "Email enthielt mehr als ein ZUGFeRD-Dokument", "", oSQLTransaction)
|
AddRejectedState(oMessageId, oRejectionCodeString, "Email enthielt mehr als ein eInvoice-Dokument", "", oSQLTransaction)
|
||||||
|
|
||||||
Catch ex As NoFerdsException
|
Catch ex As NoFerdsException
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
@@ -322,7 +348,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oBody = String.Format(EmailStrings.EMAIL_NO_FERDS, oEmailData.Subject)
|
Dim oBody = String.Format(EmailStrings.EMAIL_NO_FERDS, oEmailData.Subject)
|
||||||
|
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "NoFerdsException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.NoFerdsException, "", "")
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "NoFerdsException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.NoFerdsException, "", "")
|
||||||
AddRejectedState(oMessageId, oRejectionCodeString, "Email enthielt keine ZUGFeRD-Dokumente", "", oSQLTransaction)
|
AddRejectedState(oMessageId, oRejectionCodeString, "Email enthielt keine eInvoice-Dokumente", "", oSQLTransaction)
|
||||||
|
|
||||||
Catch ex As MissingValueException
|
Catch ex As MissingValueException
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
@@ -341,7 +367,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oEmailData = _file.MoveAndRenameEmailToRejected(oArgs, oMessageId)
|
Dim oEmailData = _file.MoveAndRenameEmailToRejected(oArgs, oMessageId)
|
||||||
|
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "MissingValueException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.MissingValueException, oOrgFilename, oMissingFieldList)
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "MissingValueException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.MissingValueException, oOrgFilename, oMissingFieldList)
|
||||||
AddRejectedState(oMessageId, oRejectionCodeString, "Es fehlten ZugferdSpezifikationen", "", oSQLTransaction)
|
AddRejectedState(oMessageId, oRejectionCodeString, "Es fehlten eInvoice-Spezifikationen", "", oSQLTransaction)
|
||||||
|
|
||||||
Catch ex As FileSizeLimitReachedException
|
Catch ex As FileSizeLimitReachedException
|
||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
@@ -374,7 +400,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
||||||
Dim oEmailData As New EmailData With {
|
Dim oEmailData As New EmailData With {
|
||||||
.From = oArgs.ExceptionEmailAddress,
|
.From = oArgs.ExceptionEmailAddress,
|
||||||
.Subject = $"OutOfMemoryException im ZUGFeRD-Parser @ {oMessageId}"
|
.Subject = $"OutOfMemoryException im eInvoice-Parser @ {oMessageId}"
|
||||||
}
|
}
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "OutOfMemoryException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "OutOfMemoryException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
||||||
|
|
||||||
@@ -397,7 +423,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
||||||
Dim oEmailData As New EmailData With {
|
Dim oEmailData As New EmailData With {
|
||||||
.From = oArgs.ExceptionEmailAddress,
|
.From = oArgs.ExceptionEmailAddress,
|
||||||
.Subject = $"UnhandledException im ZUGFeRD-Parser @ {oMessageId}"
|
.Subject = $"UnhandledException im eInvoice-Parser @ {oMessageId}"
|
||||||
}
|
}
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "UnhandledException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "UnhandledException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
||||||
|
|
||||||
@@ -406,13 +432,17 @@ Public Class ImportZUGFeRDFiles
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
Finally
|
Finally
|
||||||
|
Dim oxRechnungHandle As Boolean = False
|
||||||
Try
|
Try
|
||||||
Dim oxRechnungHandle As Boolean = False
|
|
||||||
Dim oRegularMove As Boolean = False
|
Dim oRegularMove As Boolean = False
|
||||||
' If an application error occurred, dont move files so they will be processed again later
|
' If an application error occurred, dont move files so they will be processed again later
|
||||||
If oMoveDirectory = DIRECTORY_DONT_MOVE Then
|
If oMoveDirectory = DIRECTORY_DONT_MOVE Then
|
||||||
_logger.Info("Application Error occurred. Files for message Id {0} will not be moved.", oMessageId)
|
_logger.Info("Application Error occurred. Files for message Id {0} will not be moved.", oMessageId)
|
||||||
ElseIf oArgs.AllowXRechnung And oIsSuccess And oEInvoiceFileGroup.Item(0).Extension = ".xml" Then
|
|
||||||
|
ElseIf oArgs.AllowXRechnung And oIsSuccess And
|
||||||
|
oEInvoiceFileGroup.Item(0).Extension.Equals(".xml", StringComparison.OrdinalIgnoreCase) = True Then
|
||||||
|
_logger.Debug("Before Creating the PDF-File from XML data / Before Commit")
|
||||||
|
|
||||||
oxRechnungHandle = True
|
oxRechnungHandle = True
|
||||||
' Hier das neue PDF erzeugen
|
' Hier das neue PDF erzeugen
|
||||||
'but before we need to get all Data we need
|
'but before we need to get all Data we need
|
||||||
@@ -422,11 +452,12 @@ Public Class ImportZUGFeRDFiles
|
|||||||
If oSQLTransaction IsNot Nothing Then
|
If oSQLTransaction IsNot Nothing Then
|
||||||
' Commit Transaction
|
' Commit Transaction
|
||||||
oSQLTransaction.Commit()
|
oSQLTransaction.Commit()
|
||||||
|
_logger.Debug("XML commit triggered")
|
||||||
End If
|
End If
|
||||||
MyTemplateValues_xInvDT = _mssql.GetDatatable(oSQL_MsgIDReplace)
|
MyTemplateValues_xInvDT = _mssql.GetDatatable(oSQL_MsgIDReplace)
|
||||||
|
|
||||||
If Not IsNothing(MyTemplateValues_xInvDT) Then
|
If Not IsNothing(MyTemplateValues_xInvDT) Then
|
||||||
If MyTemplateValues_xInvDT.rows.count > 0 Then
|
If MyTemplateValues_xInvDT.Rows.Count > 0 Then
|
||||||
Dim oViewReceiptFileInfo As FileInfo = _xRechnungCreator.Create_PDFfromXML(oEInvoiceFileGroup.Item(0), MyTemplateValues_xInvDT)
|
Dim oViewReceiptFileInfo As FileInfo = _xRechnungCreator.Create_PDFfromXML(oEInvoiceFileGroup.Item(0), MyTemplateValues_xInvDT)
|
||||||
If Not IsNothing(oViewReceiptFileInfo) Then
|
If Not IsNothing(oViewReceiptFileInfo) Then
|
||||||
oEInvoiceFileGroup.Item(0) = oViewReceiptFileInfo
|
oEInvoiceFileGroup.Item(0) = oViewReceiptFileInfo
|
||||||
@@ -449,7 +480,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
Dim oBody = _email.CreateBodyForUnhandledException(oMessageId, ex)
|
||||||
Dim oEmailData As New EmailData With {
|
Dim oEmailData As New EmailData With {
|
||||||
.From = oArgs.ExceptionEmailAddress,
|
.From = oArgs.ExceptionEmailAddress,
|
||||||
.Subject = $"FileMoveException im ZUGFeRD-Parser @ {oMessageId}"
|
.Subject = $"FileMoveException im eInvoice-Parser @ {oMessageId}"
|
||||||
}
|
}
|
||||||
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "FileMoveException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
_email.AddToEmailQueueMSSQL(oMessageId, oSQLTransaction, oBody, oEmailData, "FileMoveException", _EmailOutAccountId, oArgs.NamePortal, oArgs.RejectionTemplateId, ErrorCode.UnhandledException, ex.Message, ex.StackTrace)
|
||||||
|
|
||||||
@@ -463,9 +494,13 @@ Public Class ImportZUGFeRDFiles
|
|||||||
' finally commit all changes To the Database
|
' finally commit all changes To the Database
|
||||||
' ==================================================================
|
' ==================================================================
|
||||||
If oIsSuccess Or oExpectedError Then
|
If oIsSuccess Or oExpectedError Then
|
||||||
If oSQLTransaction IsNot Nothing Then
|
|
||||||
|
_logger.Debug("Before default sql commit: oxRechnungHandle [{0}]", oxRechnungHandle)
|
||||||
|
|
||||||
|
If oxRechnungHandle = False AndAlso oSQLTransaction IsNot Nothing Then
|
||||||
' Commit Transaction
|
' Commit Transaction
|
||||||
oSQLTransaction.Commit()
|
oSQLTransaction.Commit()
|
||||||
|
_logger.Debug("default commit triggered")
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -475,6 +510,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
Try
|
Try
|
||||||
If oSQLConnection IsNot Nothing Then
|
If oSQLConnection IsNot Nothing Then
|
||||||
|
_logger.Debug("Before default sql close")
|
||||||
oSQLConnection.Close()
|
oSQLConnection.Close()
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
@@ -523,35 +559,46 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
Try
|
Try
|
||||||
oDocument = _zugferd.GetSerializedXMLContentFromFile(pFile)
|
oDocument = _zugferd.GetSerializedXMLContentFromFile(pFile)
|
||||||
|
oDocument.ReceiptFileType = ZUGFeRDInterface.RECEIPT_TYPE_XML
|
||||||
|
|
||||||
Catch ex As ValidationException
|
Catch ex As ValidationException
|
||||||
Throw ex
|
Throw ex
|
||||||
|
|
||||||
Catch ex As ZUGFeRDExecption
|
Catch ex As ZUGFeRDExecption
|
||||||
Select Case ex.ErrorType
|
|
||||||
Case ZUGFeRDInterface.ErrorType.NoZugferd
|
|
||||||
_logger.Info("File [{0}] is not a valid ZUGFeRD document. Skipping.", pFile.Name)
|
|
||||||
|
|
||||||
oResult.EmailAttachmentFiles.Add(pFile)
|
If ex.ErrorCode > 0 Then
|
||||||
Return oResult
|
_logger.Info("New Rejection Logik")
|
||||||
|
|
||||||
Case ZUGFeRDInterface.ErrorType.UnsupportedFormat
|
Select Case ex.ErrorCode
|
||||||
_logger.Info("File [{0}/{1}] is an unsupported ZUFeRD document format!", pFile.Name, ex.XmlFile)
|
Case ErrorCode.NoFerdsException
|
||||||
Throw New UnsupportedFerdException(ex.XmlFile)
|
_logger.Info("File [{0}] is not a valid eInvoice document. Skipping.", pFile.Name)
|
||||||
|
|
||||||
Case ZUGFeRDInterface.ErrorType.NoValidZugferd
|
oResult.EmailAttachmentFiles.Add(pFile)
|
||||||
_logger.Info("File [{0}] is an Incorrectly formatted ZUGFeRD document!", pFile.Name)
|
Return oResult
|
||||||
Throw New InvalidFerdException()
|
|
||||||
|
|
||||||
Case Else
|
Case ErrorCode.UnsupportedFerdException
|
||||||
_logger.Warn("Unexpected Error occurred while extracting ZUGFeRD Information from file {0}", pFile.Name)
|
_logger.Info("File [{0}/{1}] is an unsupported eInvoice document format!", pFile.Name, ex.XmlFile)
|
||||||
Throw ex
|
Throw New UnsupportedFerdException(ex.XmlFile)
|
||||||
End Select
|
|
||||||
|
|
||||||
|
Case ErrorCode.InvalidFerdException
|
||||||
|
_logger.Info("File [{0}] is an incorrectly formatted eInvoice document!", pFile.Name)
|
||||||
|
Throw New InvalidFerdException()
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
_logger.Warn("Unexpected Error occurred while extracting eInvoice Information from file {0}", pFile.Name)
|
||||||
|
Throw ex
|
||||||
|
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
Try
|
Try
|
||||||
Dim sqlResult As Boolean = StoreXMLItemsInDatabase(pMessageId, oDocument, pFile, pConnections, pArgs)
|
Dim sqlResult As Boolean = False
|
||||||
|
|
||||||
|
If oDocument IsNot Nothing Then
|
||||||
|
sqlResult = StoreXMLItemsInDatabase(pMessageId, oDocument, pFile, pConnections, pArgs, oResult)
|
||||||
|
End If
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Throw ex
|
Throw ex
|
||||||
End Try
|
End Try
|
||||||
@@ -594,30 +641,37 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
Try
|
Try
|
||||||
oDocument = _zugferd.ExtractZUGFeRDFileWithGDPicture(pFile.FullName)
|
oDocument = _zugferd.ExtractZUGFeRDFileWithGDPicture(pFile.FullName)
|
||||||
|
oDocument.ReceiptFileType = ZUGFeRDInterface.RECEIPT_TYPE_PDF
|
||||||
|
|
||||||
Catch ex As ValidationException
|
Catch ex As ValidationException
|
||||||
Throw ex
|
Throw ex
|
||||||
|
|
||||||
Catch ex As ZUGFeRDExecption
|
Catch ex As ZUGFeRDExecption
|
||||||
Select Case ex.ErrorType
|
If ex.ErrorCode > 0 Then
|
||||||
Case ZUGFeRDInterface.ErrorType.NoZugferd
|
_logger.Info("New Rejection Logik")
|
||||||
_logger.Info("File [{0}] is not a valid ZUGFeRD document. Skipping.", pFile.Name)
|
|
||||||
|
|
||||||
oResult.EmailAttachmentFiles.Add(pFile)
|
Select Case ex.ErrorCode
|
||||||
Return oResult
|
Case ErrorCode.NoFerdsException
|
||||||
|
_logger.Info("File [{0}] is not a valid eInvoice document. Skipping.", pFile.Name)
|
||||||
|
|
||||||
Case ZUGFeRDInterface.ErrorType.UnsupportedFormat
|
oResult.EmailAttachmentFiles.Add(pFile)
|
||||||
_logger.Info("File [{0}/{1}] is an unsupported ZUFeRD document format!", pFile.Name, ex.XmlFile)
|
Return oResult
|
||||||
Throw New UnsupportedFerdException(ex.XmlFile)
|
|
||||||
|
|
||||||
Case ZUGFeRDInterface.ErrorType.NoValidZugferd
|
Case ErrorCode.UnsupportedFerdException
|
||||||
_logger.Info("File [{0}] is an Incorrectly formatted ZUGFeRD document!", pFile.Name)
|
_logger.Info("File [{0}/{1}] is an unsupported eInvoice document format!", pFile.Name, ex.XmlFile)
|
||||||
Throw New InvalidFerdException()
|
Throw New UnsupportedFerdException(ex.XmlFile)
|
||||||
|
|
||||||
|
Case ErrorCode.InvalidFerdException
|
||||||
|
_logger.Info("File [{0}] is an incorrectly formatted eInvoice document!", pFile.Name)
|
||||||
|
Throw New InvalidFerdException()
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
_logger.Warn("Unexpected Error occurred while extracting eInvoice Information from file {0}", pFile.Name)
|
||||||
|
Throw ex
|
||||||
|
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
|
||||||
Case Else
|
|
||||||
_logger.Warn("Unexpected Error occurred while extracting ZUGFeRD Information from file {0}", pFile.Name)
|
|
||||||
Throw ex
|
|
||||||
End Select
|
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
' Check if there are more than one ZUGFeRD files
|
' Check if there are more than one ZUGFeRD files
|
||||||
@@ -640,7 +694,7 @@ Public Class ImportZUGFeRDFiles
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
Try
|
Try
|
||||||
Dim sqlResult As Boolean = StoreXMLItemsInDatabase(pMessageId, oDocument, pFile, pConnections, pArgs)
|
Dim sqlResult As Boolean = StoreXMLItemsInDatabase(pMessageId, oDocument, pFile, pConnections, pArgs, oResult)
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Throw ex
|
Throw ex
|
||||||
End Try
|
End Try
|
||||||
@@ -657,12 +711,12 @@ Public Class ImportZUGFeRDFiles
|
|||||||
|
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Private Function StoreXMLItemsInDatabase(pMessageId As String, pDocument As ZUGFeRDInterface.ZugferdResult, pFile As FileInfo, pConnections As DatabaseConnections, pArgs As WorkerArgs) As Boolean
|
Private Function StoreXMLItemsInDatabase(pMessageId As String, pDocument As ZUGFeRDInterface.ZugferdResult, pFile As FileInfo, pConnections As DatabaseConnections, pArgs As WorkerArgs, pProcessFileResult As ProcessFileResult) As Boolean
|
||||||
' Check the document against the configured property map and return:
|
' Check the document against the configured property map and return:
|
||||||
' - a List of valid properties
|
' - a List of valid properties
|
||||||
' - a List of missing properties
|
' - a List of missing properties
|
||||||
|
|
||||||
Dim oPropertyMap = _zugferd.FilterPropertyMap(pArgs.PropertyMap, pDocument.Specification)
|
Dim oPropertyMap As Dictionary(Of String, XmlItemProperty) = _zugferd.FilterPropertyMap(pArgs.PropertyMapList, pDocument.Specification)
|
||||||
Dim oCheckResult = _zugferd.PropertyValues.CheckPropertyValues(pDocument.SchemaObject, oPropertyMap, pMessageId)
|
Dim oCheckResult = _zugferd.PropertyValues.CheckPropertyValues(pDocument.SchemaObject, oPropertyMap, pMessageId)
|
||||||
|
|
||||||
_logger.Info("Properties checked: [{0}] missing properties / [{1}] valid properties found.", oCheckResult.MissingProperties.Count, oCheckResult.ValidProperties.Count)
|
_logger.Info("Properties checked: [{0}] missing properties / [{1}] valid properties found.", oCheckResult.MissingProperties.Count, oCheckResult.ValidProperties.Count)
|
||||||
@@ -674,12 +728,374 @@ Public Class ImportZUGFeRDFiles
|
|||||||
_logger.Debug("No missing properties found. Continuing.")
|
_logger.Debug("No missing properties found. Continuing.")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
' Daten in die Datenbank speichern
|
||||||
|
If BulkInsertDataToDatabase(pMessageId, pDocument, pConnections, oCheckResult) = False Then
|
||||||
|
_logger.Error("Bulk Insert for MessageId [{0}] failed!", pMessageId)
|
||||||
|
Throw New Exception("Bulk Insert failed! Exiting.")
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Eingebettete Dateien speichern
|
||||||
|
If HandleEmbeddedAttachments(pMessageId, pDocument, pConnections, oCheckResult, pArgs, pProcessFileResult) = False Then
|
||||||
|
_logger.Debug("Files saving for MessageId [{0}] failed!", pMessageId)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return True
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Hier werden die Dateianhänge behandelt, die im XML als base64 eingetragen wurden.
|
||||||
|
''' Die zusammengehörigen Knoten müssen über "FILES" gruppiert werden!
|
||||||
|
'''
|
||||||
|
''' Die erwarteten Knoten-Namen sind in der List EmbeddedFilesColumnNames enthalten!
|
||||||
|
''' </summary>
|
||||||
|
Private Function HandleEmbeddedAttachments(pMessageId As String, pDocument As ZUGFeRDInterface.ZugferdResult, pConnections As DatabaseConnections,
|
||||||
|
pCheckResult As CheckPropertyValuesResult, pArgs As WorkerArgs, pProcessFileResult As ProcessFileResult) As Boolean
|
||||||
|
|
||||||
|
If (pCheckResult Is Nothing) Then
|
||||||
|
_logger.Debug("pCheckResult is empty!")
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
|
||||||
|
If (CheckEmbeddedAttachmentEntries(pCheckResult) = False) Then
|
||||||
|
_logger.Debug("No embedded Files in XML found!")
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim embAttachmentList As List(Of ValidProperty) = pCheckResult.ValidProperties.Where(
|
||||||
|
Function(z)
|
||||||
|
Return EmbeddedFilesColumnNames.Contains(z.TableColumn)
|
||||||
|
End Function
|
||||||
|
).ToList()
|
||||||
|
|
||||||
|
If embAttachmentList Is Nothing OrElse embAttachmentList.Count <= 0 Then
|
||||||
|
_logger.Debug("No Fields for Embedded Files configured!")
|
||||||
|
Return True
|
||||||
|
End If
|
||||||
|
|
||||||
|
' GroupCounter Werte in Hashset eintragen, um distinct Werte zu erhalten
|
||||||
|
Dim oIndexList As HashSet(Of Integer) = New HashSet(Of Integer)
|
||||||
|
For Each resultItem In embAttachmentList
|
||||||
|
oIndexList.Add(resultItem.GroupCounter)
|
||||||
|
Next
|
||||||
|
|
||||||
|
Dim oOutputPath As String = GetOutputPathForEmbeddedAttachments(pArgs)
|
||||||
|
Dim nextAttachmentIndex As Integer = 0
|
||||||
|
nextAttachmentIndex = GetNextAttachmentIndex(pMessageId)
|
||||||
|
If nextAttachmentIndex <= 0 Then
|
||||||
|
nextAttachmentIndex = 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
For Each groupIndex In oIndexList
|
||||||
|
|
||||||
|
Dim oMimeCodeString As String = String.Empty
|
||||||
|
Dim oOrgFilename As String = String.Empty
|
||||||
|
Dim oBase64String As String = String.Empty
|
||||||
|
|
||||||
|
Dim oMimeTypeProperty As ValidProperty = GetIndexProperty(embAttachmentList, groupIndex, "ATTACHMENT_FILE_MIMECODE")
|
||||||
|
|
||||||
|
If oMimeTypeProperty IsNot Nothing AndAlso oMimeTypeProperty.Value.IsNotNullOrEmpty() Then
|
||||||
|
oMimeCodeString = oMimeTypeProperty.Value.ToLower()
|
||||||
|
Else
|
||||||
|
_logger.Debug("Empty MIME-Code! File can not be stored!")
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oFilenameProperty As ValidProperty = GetIndexProperty(embAttachmentList, groupIndex, "ATTACHMENT_FILE_FILENAME")
|
||||||
|
If oFilenameProperty IsNot Nothing AndAlso oFilenameProperty.Value.IsNotNullOrEmpty() Then
|
||||||
|
oOrgFilename = oFilenameProperty.Value
|
||||||
|
Else
|
||||||
|
_logger.Debug("Empty Filename! File can not be stored!")
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oBase64ValueProperty As ValidProperty = GetIndexProperty(embAttachmentList, groupIndex, "ATTACHMENT_FILE_VALUE")
|
||||||
|
If oBase64ValueProperty IsNot Nothing AndAlso oBase64ValueProperty.Value.IsNotNullOrEmpty() Then
|
||||||
|
oBase64String = oBase64ValueProperty.Value
|
||||||
|
Else
|
||||||
|
_logger.Error("Empty base64 String! File can not be stored!")
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim newAttachmentFilename = pMessageId + "~attm" + nextAttachmentIndex.ToString
|
||||||
|
|
||||||
|
Dim oFileExtension = GetEmbeddedFileExtension(oMimeTypeProperty.Value)
|
||||||
|
If oFileExtension.IsNotNullOrEmpty() Then
|
||||||
|
newAttachmentFilename += "." + oFileExtension
|
||||||
|
Else
|
||||||
|
_logger.Warn("No extension found! File can not be stored!")
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim embeddedFilePath = Path.Combine(oOutputPath, newAttachmentFilename)
|
||||||
|
_logger.Debug("Next Attachment File is [{0}]", embeddedFilePath)
|
||||||
|
If SaveBase64ToDisk(embeddedFilePath, oBase64String) = True Then
|
||||||
|
_logger.Debug("Saved file [{0}] to disk", embeddedFilePath)
|
||||||
|
pProcessFileResult.EmailAttachmentFiles.Add(New FileInfo(embeddedFilePath))
|
||||||
|
Else
|
||||||
|
_logger.Error("Could not save File to Disk!")
|
||||||
|
Dim oReasonString = "Could not save file " + newAttachmentFilename + " to disk."
|
||||||
|
AddRejectedState(pMessageId, oReasonString, "EMBEDDED FILE CONSISTENCY NOT OK", "Info GUI", pConnections.SQLServerTransaction)
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
If TestFileOnDisk(embeddedFilePath, oMimeCodeString) = False Then
|
||||||
|
_logger.Error("Could not save File to Disk!")
|
||||||
|
Dim oReasonString = "Validation of file " + newAttachmentFilename + " on disk was NOT succesfully."
|
||||||
|
AddRejectedState(pMessageId, oReasonString, "EMBEDDED FILE CONSISTENCY NOT OK", "Info GUI", pConnections.SQLServerTransaction)
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
If InsertAttachmentHistoryEntry(pMessageId, oOrgFilename, embeddedFilePath) = False Then
|
||||||
|
_logger.Error("Could not save attachment Data to DB!")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
If InsertEmbeddedFileDataToDB(pMessageId, oBase64String, oOrgFilename, oMimeCodeString, groupIndex) = False Then
|
||||||
|
_logger.Error("Could not save attachment Data to DB!")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
nextAttachmentIndex += 1
|
||||||
|
Next
|
||||||
|
|
||||||
|
Return True
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function TestFileOnDisk(pEmbeddedFilePath As String, pMimeCodeString As String) As Boolean
|
||||||
|
Try
|
||||||
|
If pMimeCodeString = MIME_TYPE_PDF Then
|
||||||
|
Dim oGdPicturePDF As New GdPicturePDF
|
||||||
|
Dim oStatus As GdPictureStatus = oGdPicturePDF.LoadFromFile(pEmbeddedFilePath, True)
|
||||||
|
If oStatus <> GdPictureStatus.OK Then
|
||||||
|
_logger.Error("File [{0}] has no proper state!", pEmbeddedFilePath)
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
|
||||||
|
Else
|
||||||
|
' Test other files
|
||||||
|
Dim fileInfo As FileInfo = New FileInfo(pEmbeddedFilePath)
|
||||||
|
If fileInfo.Exists = False Then
|
||||||
|
_logger.Error("Could not find File [{0}] on Disk!", pEmbeddedFilePath)
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return True
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetEmbeddedFileExtension(pMimeTypeValue As String) As String
|
||||||
|
|
||||||
|
If pMimeTypeValue.IsNullOrEmpty() Then
|
||||||
|
_logger.Warn("Empty MimeCode is not allowed!")
|
||||||
|
Return String.Empty
|
||||||
|
End If
|
||||||
|
|
||||||
|
Select Case pMimeTypeValue.ToLower()
|
||||||
|
Case MIME_TYPE_PDF
|
||||||
|
Return "pdf"
|
||||||
|
Case MIME_TYPE_XLSX
|
||||||
|
Return "xlsx"
|
||||||
|
Case MIME_TYPE_ODT
|
||||||
|
Return "odt"
|
||||||
|
Case "image/jpeg"
|
||||||
|
Return "jpg"
|
||||||
|
Case "image/png"
|
||||||
|
Return "png"
|
||||||
|
Case "image/tiff"
|
||||||
|
Return "tif"
|
||||||
|
Case "text/csv"
|
||||||
|
Return "csv"
|
||||||
|
Case "text/xml"
|
||||||
|
Return "xml"
|
||||||
|
Case Else
|
||||||
|
Return String.Empty
|
||||||
|
End Select
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Shared Function GetIndexProperty(pListResult As List(Of ValidProperty), pGroupIndex As Integer, pTableColumn As String) As ValidProperty
|
||||||
|
Return pListResult.Where(
|
||||||
|
Function(z)
|
||||||
|
Return z.GroupCounter = pGroupIndex AndAlso z.TableColumn = pTableColumn
|
||||||
|
End Function
|
||||||
|
).FirstOrDefault
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Speichert die Daten inkl. base64-String in die Datenbank
|
||||||
|
''' </summary>
|
||||||
|
Private Function InsertEmbeddedFileDataToDB(pMessageId As String, pItemValue As String, pOrgFilename As String, pMimeType As String, pGroupIndex As Integer) As Boolean
|
||||||
|
Try
|
||||||
|
Dim oCommand = New SqlCommand(
|
||||||
|
"INSERT INTO TBEDMI_ITEM_FILES (
|
||||||
|
REFERENCE_GUID,
|
||||||
|
ITEM_VALUE,
|
||||||
|
ORG_FILENAME,
|
||||||
|
MIME_TYPE,
|
||||||
|
GROUP_INDEX,
|
||||||
|
CREATED_WHO
|
||||||
|
) VALUES (
|
||||||
|
@MESSAGE_ID,
|
||||||
|
@ITEM_VALUE,
|
||||||
|
@ORG_FILENAME,
|
||||||
|
@MIME_TYPE,
|
||||||
|
@GROUP_INDEX,
|
||||||
|
@CREATED_WHO
|
||||||
|
)")
|
||||||
|
|
||||||
|
Dim fileBytes As Byte() = Convert.FromBase64String(pItemValue)
|
||||||
|
|
||||||
|
oCommand.Parameters.Add("MESSAGE_ID", SqlDbType.VarChar, 250).Value = pMessageId
|
||||||
|
oCommand.Parameters.Add("ITEM_VALUE", SqlDbType.VarBinary).Value = fileBytes
|
||||||
|
oCommand.Parameters.Add("ORG_FILENAME", SqlDbType.VarChar, 256).Value = pOrgFilename
|
||||||
|
oCommand.Parameters.Add("MIME_TYPE", SqlDbType.VarChar, 256).Value = pMimeType
|
||||||
|
oCommand.Parameters.Add("GROUP_INDEX", SqlDbType.Int).Value = pGroupIndex
|
||||||
|
oCommand.Parameters.Add("CREATED_WHO", SqlDbType.VarChar, 100).Value = "eInvoice Parser"
|
||||||
|
|
||||||
|
_mssql.ExecuteNonQuery(oCommand)
|
||||||
|
|
||||||
|
Return True
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Ermittelt den Ausgabepfad für die eingebetteten Anhänge
|
||||||
|
''' </summary>
|
||||||
|
Private Function GetOutputPathForEmbeddedAttachments(pArgs As WorkerArgs) As String
|
||||||
|
Return pArgs.WatchDirectory
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Prüft, ob Embedded Attachments in den XML-Ergebnissen enthalten sind,
|
||||||
|
''' in dem geprüft wird, ob bestimmte MIME-Codes vorhanden sind.
|
||||||
|
''' </summary>
|
||||||
|
''' <param name="pCheckResult"></param>
|
||||||
|
''' <returns></returns>
|
||||||
|
Private Function CheckEmbeddedAttachmentEntries(pCheckResult As CheckPropertyValuesResult) As Boolean
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim resultList = pCheckResult.ValidProperties.Where(
|
||||||
|
Function(z)
|
||||||
|
Return (z.TableColumn = "ATTACHMENT_FILE_MIMECODE" AndAlso AllowedMimeTypesInEmbeddedFiles.Contains(z.Value.ToLower()))
|
||||||
|
End Function
|
||||||
|
).ToList()
|
||||||
|
|
||||||
|
If resultList.Count > 0 Then
|
||||||
|
_logger.Info("Found [{0}] embedded XML-Attachments.", resultList.Count)
|
||||||
|
Return True
|
||||||
|
Else
|
||||||
|
_logger.Info("No embedded XML-Attachments found.")
|
||||||
|
Return False
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error("Error searching pCheckResult! {0}", ex.Message)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Speichere base64 als Datei auf der Platte ab.
|
||||||
|
''' </summary>
|
||||||
|
Private Function SaveBase64ToDisk(pExportFilePath As String, pBase64String As String) As Boolean
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim oFilename As String = pExportFilePath
|
||||||
|
Dim base64BinaryDataString As String = pBase64String
|
||||||
|
Dim binaryDataString As Byte() = Convert.FromBase64String(base64BinaryDataString)
|
||||||
|
|
||||||
|
' Using verwenden, um blockieren der Datei zu verhindern
|
||||||
|
Using fs = New FileStream(oFilename, FileMode.Create, FileAccess.ReadWrite)
|
||||||
|
fs.Write(binaryDataString, 0, binaryDataString.Length)
|
||||||
|
fs.Flush()
|
||||||
|
fs.Close()
|
||||||
|
End Using
|
||||||
|
|
||||||
|
Return True
|
||||||
|
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error("Could NOT save File [{0}] to Disk! Exception: [{1}]", pExportFilePath, ex.Message)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Die Methode lädt die bisherigen Dateinamen zu einer MessageID
|
||||||
|
''' Die Datei mit dem höchsten Index gibt den folgenden Index vor.
|
||||||
|
''' </summary>
|
||||||
|
''' <returns>Nächster Attachment Index</returns>
|
||||||
|
Private Function GetNextAttachmentIndex(pMessageId As String) As Integer
|
||||||
|
Try
|
||||||
|
Dim oSQL = $"SELECT count(*) FROM TBEMLP_HISTORY_ATTACHMENT WHERE EMAIL_MSGID = '{pMessageId}'"
|
||||||
|
|
||||||
|
Dim sqlResult = _mssql.GetScalarValue(oSQL)
|
||||||
|
If sqlResult = 0 Then
|
||||||
|
sqlResult = 1 ' Kleinster Index = 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
Return sqlResult
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Throw ex
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Speichert die Infos zu einem embedded Dateianhang in die DB.
|
||||||
|
''' Mangels EMail-Daten werden die EMail-Felder (FROM, BODY, usw.) nicht gefüllt
|
||||||
|
''' </summary>
|
||||||
|
''' <returns>true, wenn erfolgreich</returns>
|
||||||
|
Private Function InsertAttachmentHistoryEntry(pMessageId As String, pFileName As String, pNewFileName As String) As Boolean
|
||||||
|
|
||||||
|
Try
|
||||||
|
Dim oCommand = New SqlCommand(
|
||||||
|
"INSERT INTO TBEMLP_HISTORY_ATTACHMENT (
|
||||||
|
WORK_PROCESS,
|
||||||
|
EMAIL_MSGID,
|
||||||
|
EMAIL_ATTMT,
|
||||||
|
EMAIL_ATTMT_INDEX,
|
||||||
|
EMAIL_FROM,
|
||||||
|
EMAIL_BODY
|
||||||
|
) VALUES (
|
||||||
|
@WORK_PROCESS,
|
||||||
|
@MESSAGE_ID,
|
||||||
|
@ATTACHMENT,
|
||||||
|
@ATTACHMENT_INDEX,
|
||||||
|
'-',
|
||||||
|
'-'
|
||||||
|
)")
|
||||||
|
|
||||||
|
oCommand.Parameters.Add("WORK_PROCESS", SqlDbType.VarChar, 100).Value = "Attachment Sniffer (Embedded Files)"
|
||||||
|
oCommand.Parameters.Add("MESSAGE_ID", SqlDbType.VarChar, 500).Value = pMessageId
|
||||||
|
oCommand.Parameters.Add("ATTACHMENT", SqlDbType.VarChar, 500).Value = pFileName
|
||||||
|
oCommand.Parameters.Add("ATTACHMENT_INDEX", SqlDbType.VarChar, 500).Value = pNewFileName
|
||||||
|
|
||||||
|
_mssql.ExecuteNonQuery(oCommand)
|
||||||
|
|
||||||
|
Return True
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Error(ex)
|
||||||
|
Return False
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function BulkInsertDataToDatabase(pMessageId As String, pDocument As ZUGFeRDInterface.ZugferdResult, pConnections As DatabaseConnections, pCheckResults As CheckPropertyValuesResult) As Boolean
|
||||||
If DeleteExistingPropertyValues(pMessageId, pConnections) = False Then
|
If DeleteExistingPropertyValues(pMessageId, pConnections) = False Then
|
||||||
Throw New Exception("Could not cleanup data. Exiting.")
|
Throw New Exception("Could not cleanup data. Exiting.")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' DataTable vorbereiten
|
' DataTable vorbereiten
|
||||||
Dim oDataTable As DataTable = FillDataTable(pMessageId, oCheckResult, pDocument.Specification, pDocument.UsedXMLSchema)
|
Dim oDataTable As DataTable = FillDataTable(pMessageId, pCheckResults, pDocument)
|
||||||
|
|
||||||
' ColumnList initialisieren
|
' ColumnList initialisieren
|
||||||
Dim oColumnNames As List(Of String) = New List(Of String) From {
|
Dim oColumnNames As List(Of String) = New List(Of String) From {
|
||||||
@@ -702,7 +1118,8 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Return True
|
Return True
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Private Function FillDataTable(pMessageId As String, pCheckResult As PropertyValues.CheckPropertyValuesResult, pSpecification As String, pUsedXMLSchema As String) As DataTable
|
|
||||||
|
Private Function FillDataTable(pMessageId As String, pCheckResult As PropertyValues.CheckPropertyValuesResult, pDocument As ZUGFeRDInterface.ZugferdResult) As DataTable
|
||||||
|
|
||||||
Dim oDataTable As DataTable = New DataTable()
|
Dim oDataTable As DataTable = New DataTable()
|
||||||
oDataTable.Columns.Add(New DataColumn("REFERENCE_GUID", GetType(String)))
|
oDataTable.Columns.Add(New DataColumn("REFERENCE_GUID", GetType(String)))
|
||||||
@@ -715,29 +1132,52 @@ Public Class ImportZUGFeRDFiles
|
|||||||
' Erste Zeile enthält die Spezifikation
|
' Erste Zeile enthält die Spezifikation
|
||||||
Dim oFirstRow As DataRow = oDataTable.NewRow()
|
Dim oFirstRow As DataRow = oDataTable.NewRow()
|
||||||
oFirstRow("REFERENCE_GUID") = pMessageId
|
oFirstRow("REFERENCE_GUID") = pMessageId
|
||||||
oFirstRow("ITEM_DESCRIPTION") = "ZUGFeRDSpezifikation"
|
oFirstRow("ITEM_DESCRIPTION") = "Verwendete Spezifikation der E-Rechnung"
|
||||||
oFirstRow("ITEM_VALUE") = pSpecification
|
oFirstRow("ITEM_VALUE") = pDocument.Specification
|
||||||
oFirstRow("GROUP_COUNTER") = 0
|
oFirstRow("GROUP_COUNTER") = 0
|
||||||
oFirstRow("SPEC_NAME") = "ZUGFERD_SPECIFICATION"
|
oFirstRow("SPEC_NAME") = "ZUGFERD_SPECIFICATION"
|
||||||
oFirstRow("IS_REQUIRED") = False
|
oFirstRow("IS_REQUIRED") = False
|
||||||
|
|
||||||
_logger.Debug("Mapping Property [ZUGFERD_SPECIFICATION] with value [{0}]", pSpecification)
|
_logger.Debug("Mapping Property [ZUGFERD_SPECIFICATION] with value [{0}]", pDocument.Specification)
|
||||||
oDataTable.Rows.Add(oFirstRow)
|
oDataTable.Rows.Add(oFirstRow)
|
||||||
|
|
||||||
' Zweite Zeile enthält das verwendete XML Schema
|
' Zweite Zeile enthält das verwendete XML Schema
|
||||||
Dim oSecondRow As DataRow = oDataTable.NewRow()
|
Dim oSecondRow As DataRow = oDataTable.NewRow()
|
||||||
oSecondRow("REFERENCE_GUID") = pMessageId
|
oSecondRow("REFERENCE_GUID") = pMessageId
|
||||||
oSecondRow("ITEM_DESCRIPTION") = "ZUGFeRDXMLSchema"
|
oSecondRow("ITEM_DESCRIPTION") = "Verwendetes XML-Schema (XSD) der E-Rechnung"
|
||||||
oSecondRow("ITEM_VALUE") = pUsedXMLSchema
|
oSecondRow("ITEM_VALUE") = pDocument.UsedXMLSchema
|
||||||
oSecondRow("GROUP_COUNTER") = 0
|
oSecondRow("GROUP_COUNTER") = 0
|
||||||
oSecondRow("SPEC_NAME") = "ZUGFERD_XML_SCHEMA"
|
oSecondRow("SPEC_NAME") = "ZUGFERD_XML_SCHEMA"
|
||||||
oSecondRow("IS_REQUIRED") = False
|
oSecondRow("IS_REQUIRED") = False
|
||||||
|
|
||||||
_logger.Debug("Mapping Property [ZUGFERD_XML_SCHEMA] with value [{0}]", pUsedXMLSchema)
|
_logger.Debug("Mapping Property [ZUGFERD_XML_SCHEMA] with value [{0}]", pDocument.UsedXMLSchema)
|
||||||
oDataTable.Rows.Add(oSecondRow)
|
oDataTable.Rows.Add(oSecondRow)
|
||||||
|
|
||||||
|
' Dritte Zeile enthält das verwendete Datei-Format des Belegs (PDF/XML)
|
||||||
|
Dim oThirdRow As DataRow = oDataTable.NewRow()
|
||||||
|
oThirdRow("REFERENCE_GUID") = pMessageId
|
||||||
|
oThirdRow("ITEM_DESCRIPTION") = "Dateityp der E-Rechnung"
|
||||||
|
oThirdRow("ITEM_VALUE") = pDocument.ReceiptFileType
|
||||||
|
oThirdRow("GROUP_COUNTER") = 0
|
||||||
|
oThirdRow("SPEC_NAME") = "RECEIPT_FILE_TYPE"
|
||||||
|
oThirdRow("IS_REQUIRED") = False
|
||||||
|
|
||||||
|
_logger.Debug("Mapping Property [RECEIPT_FILE_TYPE] with value [{0}]", pDocument.ReceiptFileType)
|
||||||
|
oDataTable.Rows.Add(oThirdRow)
|
||||||
|
|
||||||
For Each oProperty In pCheckResult.ValidProperties
|
For Each oProperty In pCheckResult.ValidProperties
|
||||||
|
|
||||||
|
' ItemType = 3 => eingebettete Datei, nicht den base64 speichern
|
||||||
|
If oProperty.ItemType = 3 Then
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
|
' ItemType = 0 (normale texte) dürfen nicht leer sein
|
||||||
|
If oProperty.ItemType = 0 And oProperty.Value.IsNullOrEmpty Then
|
||||||
|
_logger.Debug("No Mapping for Property [{0}] with empty value, because of ItemType = 0.", oProperty.TableColumn)
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
|
|
||||||
' If GroupCounter is -1, it means this is a default property that can only occur once.
|
' If GroupCounter is -1, it means this is a default property that can only occur once.
|
||||||
' Set the actual inserted value to 0
|
' Set the actual inserted value to 0
|
||||||
Dim oGroupCounterValue As Integer = oProperty.GroupCounter
|
Dim oGroupCounterValue As Integer = oProperty.GroupCounter
|
||||||
@@ -745,19 +1185,27 @@ Public Class ImportZUGFeRDFiles
|
|||||||
oGroupCounterValue = 0
|
oGroupCounterValue = 0
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If oProperty.Value.Length > 900 Then
|
If oProperty.Value.Length > 4000 Then
|
||||||
_logger.Warn("Value for field [{0}] is longer than 900 characters, will be truncated!", oProperty.TableColumn)
|
_logger.Warn("Value for field [{0}] is longer than 4000 characters, will be truncated!", oProperty.TableColumn)
|
||||||
|
oProperty.Value = oProperty.Value.Truncate(4000)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oDescription As String
|
||||||
|
If oProperty.EN16931_ID IsNot Nothing AndAlso oProperty.EN16931_ID.Length > 1 Then
|
||||||
|
oDescription = oProperty.EN16931_ID + " (" + oProperty.Description + ")"
|
||||||
|
Else
|
||||||
|
oDescription = oProperty.Description
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Dim oNewRow As DataRow = oDataTable.NewRow()
|
Dim oNewRow As DataRow = oDataTable.NewRow()
|
||||||
oNewRow("REFERENCE_GUID") = pMessageId
|
oNewRow("REFERENCE_GUID") = pMessageId
|
||||||
oNewRow("ITEM_DESCRIPTION") = oProperty.Description
|
oNewRow("ITEM_DESCRIPTION") = oDescription
|
||||||
oNewRow("ITEM_VALUE") = oProperty.Value.Truncate(900).Replace("'", "''")
|
oNewRow("ITEM_VALUE") = oProperty.Value
|
||||||
oNewRow("GROUP_COUNTER") = oGroupCounterValue
|
oNewRow("GROUP_COUNTER") = oGroupCounterValue
|
||||||
oNewRow("SPEC_NAME") = oProperty.TableColumn
|
oNewRow("SPEC_NAME") = oProperty.TableColumn
|
||||||
oNewRow("IS_REQUIRED") = oProperty.IsRequired
|
oNewRow("IS_REQUIRED") = oProperty.IsRequired
|
||||||
|
|
||||||
_logger.Debug("Mapping Property [{0}] with value [{1}]", oProperty.TableColumn, oProperty.Value.Replace("'", "''"))
|
_logger.Debug("Mapping Property [{0}] with value [{1}]", oProperty.TableColumn, oProperty.Value)
|
||||||
oDataTable.Rows.Add(oNewRow)
|
oDataTable.Rows.Add(oNewRow)
|
||||||
Next
|
Next
|
||||||
|
|
||||||
@@ -775,6 +1223,15 @@ Public Class ImportZUGFeRDFiles
|
|||||||
_logger.Warn("Step [{0}] with SQL [{1}] was not successful.", oStep, oDelSQL)
|
_logger.Warn("Step [{0}] with SQL [{1}] was not successful.", oStep, oDelSQL)
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
|
Try
|
||||||
|
oDelSQL = $"DELETE FROM TBEDMI_ITEM_FILES where REFERENCE_GUID = '{pMessageId}'"
|
||||||
|
oStep = "TBEDMI_ITEM_FILES Delete MessageID Items"
|
||||||
|
Dim retValue As Boolean = _mssql.ExecuteNonQueryWithConnectionObject(oDelSQL, pConnections.SQLServerConnection, MSSQLServer.TransactionMode.ExternalTransaction, pConnections.SQLServerTransaction)
|
||||||
|
Return retValue
|
||||||
|
Catch ex As Exception
|
||||||
|
_logger.Warn("Step [{0}] with SQL [{1}] was not successful.", oStep, oDelSQL)
|
||||||
|
End Try
|
||||||
|
|
||||||
Return False
|
Return False
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
@@ -798,6 +1255,10 @@ Public Class ImportZUGFeRDFiles
|
|||||||
Return True
|
Return True
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
''' <summary>
|
||||||
|
''' Fügt neue Datensätze in Tabelle TBEMLP_HISTORY_STATE ein,
|
||||||
|
''' per Prozedur DD_ECM.[dbo].[PRCUST_ADD_HISTORY_STATE]
|
||||||
|
''' </summary>
|
||||||
Private Sub AddRejectedState(pMessageID As String, pTitle As String, pTitle1 As String, pComment As String, pTransaction As SqlTransaction)
|
Private Sub AddRejectedState(pMessageID As String, pTitle As String, pTitle1 As String, pComment As String, pTransaction As SqlTransaction)
|
||||||
Try
|
Try
|
||||||
'PRCUST_ADD_HISTORY_STATE: @MessageID VARCHAR(250), @TITLE1 VARCHAR(250), @TITLE2 VARCHAR(250)
|
'PRCUST_ADD_HISTORY_STATE: @MessageID VARCHAR(250), @TITLE1 VARCHAR(250), @TITLE2 VARCHAR(250)
|
||||||
@@ -807,4 +1268,5 @@ Public Class ImportZUGFeRDFiles
|
|||||||
_logger.Error(ex)
|
_logger.Error(ex)
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ Public Class WorkerArgs
|
|||||||
Public NonZugferdDirectory As String = Nothing
|
Public NonZugferdDirectory As String = Nothing
|
||||||
|
|
||||||
' Property Parameter
|
' Property Parameter
|
||||||
Public PropertyMap As New Dictionary(Of String, XmlItemProperty)
|
Public PropertyMapList As New List(Of XmlItemProperty)
|
||||||
|
|
||||||
' Email Parameter
|
' Email Parameter
|
||||||
Public EmailOutProfileId As Integer = 0
|
Public EmailOutProfileId As Integer = 0
|
||||||
@@ -31,6 +31,7 @@ Public Class WorkerArgs
|
|||||||
Public AllowXRechnung As Boolean = True
|
Public AllowXRechnung As Boolean = True
|
||||||
Public AllowZugferd10 As Boolean = True
|
Public AllowZugferd10 As Boolean = True
|
||||||
Public AllowZugferd2x As Boolean = True
|
Public AllowZugferd2x As Boolean = True
|
||||||
Public AllowPeppolBISBill3x As Boolean = True
|
Public AllowZugferd23x As Boolean = True
|
||||||
|
Public AllowPeppolBISBill3x As Boolean = False
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
Imports System.Collections.Generic
|
Imports System.Collections.Generic
|
||||||
Imports System.Data
|
Imports System.Data
|
||||||
Imports System.Data.SqlClient
|
|
||||||
Imports System.IO
|
Imports System.IO
|
||||||
Imports DigitalData.Modules.Base
|
Imports DigitalData.Modules.Base
|
||||||
Imports DigitalData.Modules.Database
|
Imports DigitalData.Modules.Database
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
Imports FirebirdSql.Data
|
|
||||||
Imports GdPicture14
|
Imports GdPicture14
|
||||||
|
Imports System.Drawing
|
||||||
|
Imports System.Linq
|
||||||
|
Imports System.Text.RegularExpressions
|
||||||
|
'11.11.2025
|
||||||
|
|
||||||
Public Class XRechnungViewDocument
|
Public Class XRechnungViewDocument
|
||||||
Private ReadOnly _logger As Logger
|
Private ReadOnly _logger As Logger
|
||||||
@@ -14,7 +16,9 @@ Public Class XRechnungViewDocument
|
|||||||
Private ReadOnly _filesystem As FilesystemEx
|
Private ReadOnly _filesystem As FilesystemEx
|
||||||
Private ReadOnly _file As ZUGFeRD.FileFunctions
|
Private ReadOnly _file As ZUGFeRD.FileFunctions
|
||||||
Private ReadOnly _gdpictureLicenseKey As String
|
Private ReadOnly _gdpictureLicenseKey As String
|
||||||
|
Private fontResName As String
|
||||||
|
Private fontResNameBold As String
|
||||||
|
Private fontResNameItalic As String
|
||||||
Public Sub New(LogConfig As LogConfig, MSSQL As MSSQLServer, GDPictureLicenseKey As String)
|
Public Sub New(LogConfig As LogConfig, MSSQL As MSSQLServer, GDPictureLicenseKey As String)
|
||||||
_logConfig = LogConfig
|
_logConfig = LogConfig
|
||||||
_logger = LogConfig.GetLogger()
|
_logger = LogConfig.GetLogger()
|
||||||
@@ -22,66 +26,101 @@ Public Class XRechnungViewDocument
|
|||||||
_file = New ZUGFeRD.FileFunctions(LogConfig, MSSQL)
|
_file = New ZUGFeRD.FileFunctions(LogConfig, MSSQL)
|
||||||
_gdpictureLicenseKey = GDPictureLicenseKey
|
_gdpictureLicenseKey = GDPictureLicenseKey
|
||||||
End Sub
|
End Sub
|
||||||
Public Function Create_PDFfromXML(oxmlFile As FileInfo, pDTItemValues As DataTable) As FileInfo
|
Public Function Create_PDFfromXML(pXmlFile As FileInfo, pDTItemValues As DataTable) As FileInfo
|
||||||
|
|
||||||
|
_logger.Debug("Create_PDFfromXML() Start")
|
||||||
|
|
||||||
Try
|
Try
|
||||||
Dim oXRechnungFile = oxmlFile.FullName
|
Dim LicenseManager = New LicenseManager()
|
||||||
|
LicenseManager.RegisterKEY(_gdpictureLicenseKey)
|
||||||
|
Dim oXRechnungFile = pXmlFile.FullName
|
||||||
Dim oNewFileinfo As FileInfo
|
Dim oNewFileinfo As FileInfo
|
||||||
Dim oxmlFilePath = oxmlFile.FullName
|
Dim oXmlFilePath = pXmlFile.FullName
|
||||||
Dim oViewRecieptFilename = oxmlFile.Name
|
Dim oViewRecieptFilename = pXmlFile.Name
|
||||||
Dim oTempFilePath = Path.GetDirectoryName(oxmlFilePath) + "\Temp"
|
Dim oTempFilePath = Path.Combine(Path.GetDirectoryName(oXmlFilePath), "temp")
|
||||||
If Not Directory.Exists(oTempFilePath) Then
|
If Not Directory.Exists(oTempFilePath) Then
|
||||||
Directory.CreateDirectory(oTempFilePath)
|
Directory.CreateDirectory(oTempFilePath)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
oTempFilePath = oTempFilePath + "\xrechnung.xml"
|
oTempFilePath = Path.Combine(oTempFilePath, "xrechnung.xml")
|
||||||
If File.Exists(oTempFilePath) Then
|
If File.Exists(oTempFilePath) Then
|
||||||
File.Delete(oTempFilePath)
|
File.Delete(oTempFilePath)
|
||||||
End If
|
End If
|
||||||
File.Move(oxmlFilePath, oTempFilePath)
|
|
||||||
oxmlFile = New FileInfo(oTempFilePath)
|
|
||||||
oViewRecieptFilename = oViewRecieptFilename.Replace("xml", "pdf")
|
|
||||||
Dim oOutputPath = Path.GetDirectoryName(oxmlFilePath) + "\" + oViewRecieptFilename
|
|
||||||
|
pXmlFile = New FileInfo(oTempFilePath)
|
||||||
|
|
||||||
|
'oViewRecieptFilename = oViewRecieptFilename.Replace(".xml", ".pdf")
|
||||||
|
oViewRecieptFilename = Regex.Replace(oViewRecieptFilename, ".xml", ".pdf", RegexOptions.IgnoreCase)
|
||||||
|
Dim MyGDPicturePDF = New GdPicturePDF
|
||||||
|
|
||||||
|
Dim oPDFStatus As GdPictureStatus = MyGDPicturePDF.NewPDF(PdfConformance.PDF_A_3a)
|
||||||
|
|
||||||
|
If oPDFStatus <> GdPictureStatus.OK Then
|
||||||
|
_logger.Warn($"Error initializing PDF: {oPDFStatus}")
|
||||||
|
Return Nothing
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim oOutputPath = Path.Combine(Path.GetDirectoryName(oXmlFilePath), oViewRecieptFilename)
|
||||||
|
_logger.Debug("Create_PDFfromXML() Resulting PDF Filepath: [{0}]", oOutputPath)
|
||||||
If File.Exists(oOutputPath) Then
|
If File.Exists(oOutputPath) Then
|
||||||
File.Delete(oOutputPath)
|
File.Delete(oOutputPath)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Dim gdpicturePDF As GdPicturePDF = New GdPicturePDF()
|
|
||||||
gdpicturePDF.NewPDF(PdfConformance.PDF_A_2a)
|
Dim oCreatedString = $"Maschinell erstellt durch / Automatically created by Digital Data E-Rechnung Parser: {Now.ToString}"
|
||||||
Dim ostatus As GdPictureStatus = gdpicturePDF.NewPDF()
|
|
||||||
If ostatus <> GdPictureStatus.OK Then
|
|
||||||
_logger.Warn($"Error initializing PDF: {ostatus}")
|
|
||||||
Return Nothing
|
MyGDPicturePDF.SetOrigin(PdfOrigin.PdfOriginTopLeft)
|
||||||
End If
|
MyGDPicturePDF.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitMillimeter)
|
||||||
gdpicturePDF.SetOrigin(PdfOrigin.PdfOriginTopLeft)
|
MyGDPicturePDF.SetLineWidth(1)
|
||||||
gdpicturePDF.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitMillimeter)
|
fontResName = MyGDPicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelvetica)
|
||||||
gdpicturePDF.SetLineWidth(1)
|
fontResNameBold = MyGDPicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold)
|
||||||
Dim fontResName = gdpicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelvetica)
|
fontResNameItalic = MyGDPicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBoldOblique)
|
||||||
Dim fontResNameBold = gdpicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold)
|
MyGDPicturePDF.SetTitle("xInvoice VisualReceipt")
|
||||||
Dim fontResNameItalic = gdpicturePDF.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBoldOblique)
|
MyGDPicturePDF.SetAuthor("Digital Data GmbH, Ludwig Rinn Str. 16, 35452 Heuchelheim")
|
||||||
gdpicturePDF.SetTitle("xInvoice VisualReceipt")
|
|
||||||
gdpicturePDF.SetAuthor("Digital Data GmbH, Heuchelheim")
|
|
||||||
'Create a New page
|
'Create a New page
|
||||||
gdpicturePDF.NewPage(PdfPageSizes.PdfPageSizeA4)
|
MyGDPicturePDF.NewPage(PdfPageSizes.PdfPageSizeA4)
|
||||||
'Draw content on the PDF
|
' Dim oCurrent As Integer = MyGDPicturePDF.GetCurrentPage()
|
||||||
|
'Den HEader erzeugen
|
||||||
Dim yPosition As Integer = 15
|
Dim yPosition As Integer = 15
|
||||||
gdpicturePDF.SetTextSize(18)
|
MyGDPicturePDF.SetTextSize(18)
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, "xRechnung Sichtbeleg - xInvoice Visual Receipt")
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, "xRechnung Sichtbeleg - xInvoice Visual Receipt")
|
||||||
yPosition += 10
|
yPosition += 10
|
||||||
gdpicturePDF.SetTextSize(10)
|
MyGDPicturePDF.SetTextSize(10)
|
||||||
gdpicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row1)
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row1)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
gdpicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row2)
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row2)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
gdpicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row1)
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row1)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
gdpicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row2)
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row2)
|
||||||
|
'Den Footer erzeugen
|
||||||
|
MyGDPicturePDF.DrawLine(10, 280, 200, 280)
|
||||||
|
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, 285, oCreatedString)
|
||||||
|
|
||||||
|
|
||||||
Dim oArea As String = ""
|
Dim oArea As String = ""
|
||||||
Dim oIsPosition As Boolean = False
|
Dim oIsPosition As Boolean = False
|
||||||
Dim oPosCount = 0
|
Dim oPosCount = 0
|
||||||
Dim oPosTerm As String = ""
|
Dim oPosTerm As String = ""
|
||||||
|
Dim oPosDesc As String = ""
|
||||||
Dim oCurrencySymbol = "€"
|
Dim oCurrencySymbol = "€"
|
||||||
|
Dim oWidthLine = 200
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
|
|
||||||
|
Dim font As New Font("Helvetica", 10)
|
||||||
|
Dim xRight As Integer = 100
|
||||||
Dim oIndex As Integer = 0
|
Dim oIndex As Integer = 0
|
||||||
|
Dim oYPlus As Integer = 0
|
||||||
|
Dim oCreateTextBox As Boolean = False
|
||||||
|
Dim oInvHasDiscount As Boolean = False
|
||||||
|
Dim oYDyn As Integer = 0
|
||||||
|
Dim Former_oItemSPECNAME As String = ""
|
||||||
For Each oRow As DataRow In pDTItemValues.Rows
|
For Each oRow As DataRow In pDTItemValues.Rows
|
||||||
Dim Y_eq_lastrow As Boolean = CBool(oRow.Item("Y_eq_lastrow"))
|
Dim Y_eq_lastrow As Boolean = CBool(oRow.Item("Y_eq_lastrow"))
|
||||||
Dim oRowCaption As String = oRow.Item("Row_Caption")
|
Dim oRowCaption As String = oRow.Item("Row_Caption")
|
||||||
@@ -89,12 +128,55 @@ Public Class XRechnungViewDocument
|
|||||||
Dim oItemValue As String = oRow.Item("ITEM_VALUE")
|
Dim oItemValue As String = oRow.Item("ITEM_VALUE")
|
||||||
Dim oDisplay As Boolean = oRow.Item("Display")
|
Dim oDisplay As Boolean = oRow.Item("Display")
|
||||||
Dim oAreaSwitch As Boolean = False
|
Dim oAreaSwitch As Boolean = False
|
||||||
|
Dim oDescriptionFollowup As Boolean = False
|
||||||
|
If oItemSPECNAME = "RECEIPT_ALLOWANCE_REASON" Then
|
||||||
|
Console.WriteLine("Uiuiu")
|
||||||
|
End If
|
||||||
|
If oRow.Item("Area") = "INTERNAL" Then
|
||||||
|
If oItemSPECNAME = "STATIC_Y_SWITCH" Then
|
||||||
|
yPosition = oItemValue
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
If yPosition >= 270 Then
|
||||||
|
oPDFStatus = MyGDPicturePDF.NewPage(PdfPageSizes.PdfPageSizeA4)
|
||||||
|
If oPDFStatus <> GdPictureStatus.OK Then
|
||||||
|
_logger.Warn($"Could not create a second page. The error was: {oPDFStatus}")
|
||||||
|
Exit For
|
||||||
|
Else
|
||||||
|
'Wieder einen Header und Footer erzeugen
|
||||||
|
yPosition = 15
|
||||||
|
MyGDPicturePDF.SetTextSize(18)
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, "xRechnung Sichtbeleg - xInvoice Visual Receipt")
|
||||||
|
yPosition += 10
|
||||||
|
MyGDPicturePDF.SetTextSize(10)
|
||||||
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row1)
|
||||||
|
yPosition += 5
|
||||||
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_DE_Row2)
|
||||||
|
yPosition += 5
|
||||||
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row1)
|
||||||
|
yPosition += 5
|
||||||
|
MyGDPicturePDF.DrawText(fontResNameItalic, 10, yPosition, XRechnungStrings.CommentSichtbeleg_EN_Row2)
|
||||||
|
|
||||||
|
MyGDPicturePDF.DrawLine(10, 280, 200, 280)
|
||||||
|
'Footer erzeugen
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, 285, oCreatedString)
|
||||||
|
End If
|
||||||
|
'oCurrent = MyGDPicturePDF.GetCurrentPage()
|
||||||
|
End If
|
||||||
|
|
||||||
|
|
||||||
|
If oRow.Item("Area") = "INTERNAL" Then
|
||||||
|
_logger.Debug($"Next Item as Area is internal")
|
||||||
|
Continue For
|
||||||
|
End If
|
||||||
_logger.Debug($"Working on SPEC_NAME: {oItemSPECNAME}")
|
_logger.Debug($"Working on SPEC_NAME: {oItemSPECNAME}")
|
||||||
|
|
||||||
If oArea <> oRow.Item("Area") Then
|
If oArea <> oRow.Item("Area") Then
|
||||||
'########## AREA WECHSEL ###########
|
'########## AREA WECHSEL ###########
|
||||||
oAreaSwitch = True
|
oAreaSwitch = True
|
||||||
|
oCreateTextBox = False
|
||||||
oArea = oRow.Item("Area")
|
oArea = oRow.Item("Area")
|
||||||
|
_logger.Debug($"Area-Switch to: {oArea}")
|
||||||
Dim oAREACaption As String
|
Dim oAREACaption As String
|
||||||
If oArea = "TYPE" Then
|
If oArea = "TYPE" Then
|
||||||
oAREACaption = $"{Return_InvType(oItemValue)} [{oItemValue}]"
|
oAREACaption = $"{Return_InvType(oItemValue)} [{oItemValue}]"
|
||||||
@@ -105,13 +187,28 @@ Public Class XRechnungViewDocument
|
|||||||
ElseIf oArea = "POSITION" Then
|
ElseIf oArea = "POSITION" Then
|
||||||
oAREACaption = "Positionen / Positions:"
|
oAREACaption = "Positionen / Positions:"
|
||||||
oIsPosition = True
|
oIsPosition = True
|
||||||
|
ElseIf oArea = "ALLOWANCE" Then
|
||||||
|
If oItemSPECNAME = "RECEIPT_ALLOWANCE_CHARGE_INDICATOR" Then
|
||||||
|
If oItemValue = "False" Then
|
||||||
|
oAREACaption = "Rabatt/Discount:"
|
||||||
|
oInvHasDiscount = True
|
||||||
|
Else
|
||||||
|
oAREACaption = "Zuschlag/Surcharge:"
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
oAREACaption = "Zu- oder Abschlag/Surcharge or Discount:"
|
||||||
|
End If
|
||||||
|
oIsPosition = True
|
||||||
ElseIf oArea = "AMOUNT" Then
|
ElseIf oArea = "AMOUNT" Then
|
||||||
oAREACaption = "Beträge / Amounts:"
|
oAREACaption = "Beträge / Amounts:"
|
||||||
|
oCreateTextBox = True
|
||||||
ElseIf oArea = "TAXPOS" Then
|
ElseIf oArea = "TAXPOS" Then
|
||||||
oAREACaption = "Steuerbeträge / Tax amounts:"
|
oAREACaption = "Steuerbeträge / Tax amounts:"
|
||||||
oIsPosition = True
|
oIsPosition = True
|
||||||
ElseIf oArea = "PAYMENT" Then
|
ElseIf oArea = "PAYMENT" Then
|
||||||
oAREACaption = "Zahlungsinformationen / Payment details:"
|
oAREACaption = "Zahlungsinformationen / Payment details:"
|
||||||
|
ElseIf oArea = "EXEMPTION" Then
|
||||||
|
oAREACaption = "UST.-Befreiungsgrund / Exemption reason:"
|
||||||
Else
|
Else
|
||||||
oAREACaption = String.Empty
|
oAREACaption = String.Empty
|
||||||
End If
|
End If
|
||||||
@@ -119,17 +216,34 @@ Public Class XRechnungViewDocument
|
|||||||
If Not oAREACaption = String.Empty Then
|
If Not oAREACaption = String.Empty Then
|
||||||
'erste Area-Linie
|
'erste Area-Linie
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
gdpicturePDF.DrawLine(10, yPosition, 125, yPosition)
|
MyGDPicturePDF.DrawLine(10, yPosition, oWidthLine, yPosition)
|
||||||
'gdpicturePDF.DrawText(fontResName, 10, yPosition, XRechnungStrings.Seperator_Line)
|
'gdpicturePDF.DrawText(fontResName, 10, yPosition, XRechnungStrings.Seperator_Line)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
'Area caption
|
'Area caption
|
||||||
gdpicturePDF.DrawText(fontResNameBold, 10, yPosition, oAREACaption)
|
MyGDPicturePDF.DrawText(fontResNameBold, 10, yPosition, oAREACaption)
|
||||||
|
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
If oArea = "TYPE" Then
|
If oArea = "TYPE" Then
|
||||||
gdpicturePDF.DrawLine(10, yPosition, 125, yPosition)
|
MyGDPicturePDF.DrawLine(10, yPosition, oWidthLine, yPosition)
|
||||||
' gdpicturePDF.DrawText(fontResName, 10, yPosition, XRechnungStrings.Seperator_Line)
|
' gdpicturePDF.DrawText(fontResName, 10, yPosition, XRechnungStrings.Seperator_Line)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
|
ElseIf oArea = "POSITION" Then
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, "Pos#")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 19, yPosition, "Anz./am.")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 35, yPosition, "Einh/Unit")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 50, yPosition, "Pos.Text")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 163, yPosition, "Steuer/Tax")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 181, yPosition, "Betrag/Sum")
|
||||||
|
ElseIf oArea = "ALLOWANCE" Then
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, "Pos#")
|
||||||
|
' MyGDPicturePDF.DrawText(fontResName, 20, yPosition, "Betrag/Amount")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 20, yPosition, "Grund/Reason")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 163, yPosition, "Steuer/Tax")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 163, yPosition, "Steuer/Tax")
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 181, yPosition, "Betrag/Sum")
|
||||||
|
yPosition += 5
|
||||||
|
oPosCount = 0
|
||||||
|
ElseIf oArea = "EXEMPTION" Then
|
||||||
|
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
If oArea = "TYPE" Then
|
If oArea = "TYPE" Then
|
||||||
@@ -142,10 +256,31 @@ Public Class XRechnungViewDocument
|
|||||||
oIsPosition = True
|
oIsPosition = True
|
||||||
If oItemSPECNAME = "INVOICE_POSITION_AMOUNT" Then
|
If oItemSPECNAME = "INVOICE_POSITION_AMOUNT" Then
|
||||||
oPosCount += 1
|
oPosCount += 1
|
||||||
oPosTerm = $"{oPosCount}. {oItemValue} * "
|
oYDyn = 0
|
||||||
oItemValue = oPosTerm
|
yPosition += 5
|
||||||
|
oPosTerm = ""
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, oPosCount)
|
||||||
|
'
|
||||||
|
'Dim otextBoxYPos As Integer = yPosition - 3.5
|
||||||
|
'MyGDPicturePDF.DrawTextBox(fontResName, 10, otextBoxYPos, 16, YCoo_TextBoxPlus5(otextBoxYPos),
|
||||||
|
' TextAlignment.TextAlignmentFar, TextAlignment.TextAlignmentNear,
|
||||||
|
' oPosCount)
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 19, yPosition, oItemValue)
|
||||||
|
'Tabellendarstellung Ende
|
||||||
|
oDisplay = False
|
||||||
|
' yPosition -= 5
|
||||||
|
End If
|
||||||
|
ElseIf oArea = "ALLOWANCE" Then
|
||||||
|
oIsPosition = True
|
||||||
|
Dim validNames As String() = {"POSITION_ALLOWANCE_ACTUAL_AMOUNT", "RECEIPT_ALLOWANCE_RECEIPT_ALLOWANCE_CHARGE_INDICATOR"}
|
||||||
|
If validNames.Contains(oItemSPECNAME) Then
|
||||||
|
oPosCount += 1
|
||||||
|
oPosTerm = ""
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, oPosCount)
|
||||||
|
'
|
||||||
|
Dim oCurrTerm = FormatCurrency(oItemValue, oCurrencySymbol)
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 20, yPosition, oCurrTerm)
|
||||||
oDisplay = False
|
oDisplay = False
|
||||||
yPosition -= 5
|
|
||||||
End If
|
End If
|
||||||
ElseIf oArea = "TAXPOS" Then
|
ElseIf oArea = "TAXPOS" Then
|
||||||
oIsPosition = True
|
oIsPosition = True
|
||||||
@@ -156,29 +291,122 @@ Public Class XRechnungViewDocument
|
|||||||
oDisplay = False
|
oDisplay = False
|
||||||
yPosition -= 5
|
yPosition -= 5
|
||||||
End If
|
End If
|
||||||
|
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
'INDIVIDUELLES VERHALTEN BEI Folge-ITEMS
|
'INDIVIDUELLES VERHALTEN BEI Folge-ITEMS
|
||||||
If oArea = "POSITION" Then
|
_logger.Debug($"FollowItem - Area: [{oArea}] - ItemSpecname: [{oItemSPECNAME}] - ItemValue: [{oItemValue}]")
|
||||||
If oItemSPECNAME = "INVOICE_POSITION_AMOUNT" Then
|
'Dim otextBoxYPos As Integer
|
||||||
|
If oArea = "POSITION" Or oArea = "ALLOWANCE" Then
|
||||||
|
If oItemSPECNAME <> Former_oItemSPECNAME And Former_oItemSPECNAME <> "" Then
|
||||||
|
If oItemSPECNAME = "INVOICE_POSITION_ARTICLE_DESCRIPTION" And Former_oItemSPECNAME = "INVOICE_POSITION_ARTICLE" Then
|
||||||
|
oDescriptionFollowup = True
|
||||||
|
Else
|
||||||
|
Former_oItemSPECNAME = oItemSPECNAME
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
Former_oItemSPECNAME = oItemSPECNAME
|
||||||
|
End If
|
||||||
|
If {"INVOICE_POSITION_AMOUNT", "POSITION_ALLOWANCE_ACTUAL_AMOUNT", "RECEIPT_ALLOWANCE_ACTUAL_AMOUNT"}.Contains(oItemSPECNAME) Then
|
||||||
oPosCount += 1
|
oPosCount += 1
|
||||||
oPosTerm = $"{oPosCount}. {oItemValue} * "
|
If Not oDescriptionFollowup Then
|
||||||
|
oYPlus = 0
|
||||||
|
oYDyn = 0
|
||||||
|
End If
|
||||||
|
oPosTerm = ""
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, oPosCount)
|
||||||
|
If oItemSPECNAME = "INVOICE_POSITION_AMOUNT" Then
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 19, yPosition, oItemValue)
|
||||||
|
ElseIf {"POSITION_ALLOWANCE_ACTUAL_AMOUNT", "RECEIPT_ALLOWANCE_ACTUAL_AMOUNT"}.Contains(oItemSPECNAME) Then
|
||||||
|
Dim oTerm = FormatCurrency(oItemValue, oCurrencySymbol)
|
||||||
|
If oInvHasDiscount And oItemSPECNAME = "RECEIPT_ALLOWANCE_ACTUAL_AMOUNT" And Not oTerm.StartsWith("-") Then
|
||||||
|
oTerm = "-" + oTerm
|
||||||
|
End If
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 181, yPosition, oTerm)
|
||||||
|
Else
|
||||||
|
If oYDyn = 0 Then
|
||||||
|
oYDyn = yPosition
|
||||||
|
End If
|
||||||
|
Dim oPartsNL As List(Of String) = StringFunctions.SplitTextByNewLine(oItemValue)
|
||||||
|
For Each olinepart As String In oPartsNL
|
||||||
|
Dim oParts As List(Of String) = StringFunctions.SplitText_Length(olinepart, 64)
|
||||||
|
' Durchlaufen der einzelnen Teile in einer Schleife
|
||||||
|
For Each part As String In oParts
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 19, oYDyn, part)
|
||||||
|
oYDyn += 5
|
||||||
|
oYPlus += 5
|
||||||
|
Next
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
|
||||||
oDisplay = False
|
oDisplay = False
|
||||||
ElseIf oItemSPECNAME = "INVOICE_POSITION_ARTICLE" Then
|
ElseIf oItemSPECNAME = "INVOICE_POSITION_UNIT_TYPE" Then
|
||||||
oPosTerm += $" {oItemValue}"
|
oYPlus = 0
|
||||||
|
Dim oUnit = Return_UnitType(oItemValue)
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 35, yPosition, oUnit)
|
||||||
oDisplay = False
|
oDisplay = False
|
||||||
ElseIf oItemSPECNAME = "INVOICE_TAXPOS_TAX_RATE" Or oItemSPECNAME = "INVOICE_TAXPOS_RATE" Then
|
ElseIf {"POSITION_ALLOWANCE_REASON", "RECEIPT_ALLOWANCE_REASON", "INVOICE_POSITION_ARTICLE", "INVOICE_POSITION_ARTICLE_DESCRIPTION"}.Contains(oItemSPECNAME) Then
|
||||||
oPosTerm += $" - ({oItemValue} %)"
|
'Tabellendarstellung
|
||||||
|
If Not oDescriptionFollowup Then
|
||||||
|
oYPlus = 0
|
||||||
|
End If
|
||||||
|
If oYDyn = 0 Then
|
||||||
|
oYDyn = yPosition
|
||||||
|
End If
|
||||||
|
Dim oX = 50
|
||||||
|
If oItemSPECNAME.Contains("ALLOWANCE") Then
|
||||||
|
oX = 20
|
||||||
|
End If
|
||||||
|
oPosDesc = ""
|
||||||
|
oPosDesc = oItemValue
|
||||||
|
Dim oPartsNL As List(Of String) = StringFunctions.SplitTextByNewLine(oItemValue)
|
||||||
|
|
||||||
|
For Each olinepart As String In oPartsNL
|
||||||
|
Dim oParts As List(Of String) = StringFunctions.SplitText_Length(olinepart, 64)
|
||||||
|
' Durchlaufen der einzelnen Teile in einer Schleife
|
||||||
|
For Each part As String In oParts
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, oX, oYDyn, part)
|
||||||
|
oYDyn += 5
|
||||||
|
oYPlus += 5
|
||||||
|
Next
|
||||||
|
Next
|
||||||
|
oDisplay = False
|
||||||
|
ElseIf oItemSPECNAME = "INVOICE_POSITION_NOTE" Then
|
||||||
|
'Tabellendarstellung
|
||||||
|
Dim cleanedText As String = RemoveNewlinesAndTabs(oItemValue)
|
||||||
|
Dim oParts As List(Of String) = StringFunctions.SplitText_Length(cleanedText, 70)
|
||||||
|
' Durchlaufen der einzelnen Teile in einer Schleife
|
||||||
|
If oYDyn = 0 Then
|
||||||
|
oYDyn = yPosition
|
||||||
|
End If
|
||||||
|
Dim oPartsNL As List(Of String) = StringFunctions.SplitTextByNewLine(oItemValue)
|
||||||
|
For Each olinepart As String In oPartsNL
|
||||||
|
Dim oPartsPN As List(Of String) = StringFunctions.SplitText_Length(olinepart, 70)
|
||||||
|
' Durchlaufen der einzelnen Teile in einer Schleife
|
||||||
|
For Each part As String In oPartsPN
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 50, oYDyn, part)
|
||||||
|
oYDyn += 5
|
||||||
|
oYPlus += 5
|
||||||
|
Next
|
||||||
|
Next
|
||||||
|
|
||||||
|
'oPosTerm += $" {oItemValue}"
|
||||||
|
oDisplay = False
|
||||||
|
ElseIf {"INVOICE_TAXPOS_TAX_RATE", "INVOICE_TAXPOS_RATE", "POSITION_ALLOWANCE_CALCULATION_PERCENT", "RECEIPT_ALLOWANCE_CALCULATION_PERCENT", "RECEIPT_ALLOWANCE_VAT_RATE"}.Contains(oItemSPECNAME) Then
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 163, yPosition, $"{oItemValue} %")
|
||||||
|
oDisplay = False
|
||||||
|
ElseIf {"INVOICE_POSITION_TAX_AMOUNT"}.Contains(oItemSPECNAME) Then
|
||||||
|
|
||||||
|
Dim oYPos = yPosition - 3.5
|
||||||
|
Dim TAXTERM = FormatCurrency(oItemValue, oCurrencySymbol)
|
||||||
|
MyGDPicturePDF.DrawTextBox(fontResName, 177, oYPos, 198, YCoo_TextBoxPlus5(oYPos),
|
||||||
|
TextAlignment.TextAlignmentFar, TextAlignment.TextAlignmentNear,
|
||||||
|
TAXTERM)
|
||||||
End If
|
End If
|
||||||
oItemValue = oPosTerm
|
oItemValue = oPosTerm
|
||||||
If oPosCount >= 9 Then
|
|
||||||
oDisplay = False
|
|
||||||
End If
|
|
||||||
ElseIf oArea = "HEAD" Then
|
ElseIf oArea = "HEAD" Then
|
||||||
If oItemSPECNAME = "INVOICE_DATE" Or oItemSPECNAME = "INVOICE_SERVICE_DATE" Then
|
If {"INVOICE_DATE", "INVOICE_SERVICE_DATE"}.Contains(oItemSPECNAME) Then
|
||||||
Dim oDateString As String = oItemValue
|
oItemValue = StringFunctions.DatetimeStringToGermanStringConverter(oItemValue, _logger)
|
||||||
Dim oParsedDate As DateTime = DateTime.ParseExact(oDateString, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture)
|
|
||||||
oItemValue = oParsedDate.ToString("dd.MM.yyyy")
|
|
||||||
End If
|
End If
|
||||||
ElseIf oArea = "TAXPOS" Then
|
ElseIf oArea = "TAXPOS" Then
|
||||||
If oItemSPECNAME = "INVOICE_TAXPOS_RATE" Then
|
If oItemSPECNAME = "INVOICE_TAXPOS_RATE" Then
|
||||||
@@ -186,36 +414,44 @@ Public Class XRechnungViewDocument
|
|||||||
oPosTerm = $"{oItemValue} %:"
|
oPosTerm = $"{oItemValue} %:"
|
||||||
oDisplay = False
|
oDisplay = False
|
||||||
ElseIf oItemSPECNAME = "INVOICE_TAXPOS_AMOUNT" Then
|
ElseIf oItemSPECNAME = "INVOICE_TAXPOS_AMOUNT" Then
|
||||||
oPosTerm += $" {oItemValue} {oCurrencySymbol}"
|
oPosTerm += FormatCurrency(oItemValue, oCurrencySymbol)
|
||||||
oDisplay = False
|
oDisplay = False
|
||||||
ElseIf oItemSPECNAME = "INVOICE_TAXPOS_TYPE" Then
|
ElseIf oItemSPECNAME = "INVOICE_TAXPOS_TYPE" Then
|
||||||
oPosTerm += $" - {oItemValue}"
|
oPosTerm += $" {oItemValue}"
|
||||||
|
ElseIf oItemValue.Contains("EXEMPTION") Then
|
||||||
|
_logger.Debug($"We got an Exemption: {oItemValue}")
|
||||||
End If
|
End If
|
||||||
oItemValue = oPosTerm
|
oItemValue = oPosTerm
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
If oDisplay = True Then
|
|
||||||
|
If oDisplay = True And Len(oItemValue) > 0 Then
|
||||||
If Y_eq_lastrow = False And oAreaSwitch = False Then
|
If Y_eq_lastrow = False And oAreaSwitch = False Then
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
End If
|
End If
|
||||||
If oArea = "AMOUNT" Then
|
If oArea = "AMOUNT" Or oArea = "ALLOWANCE" Then
|
||||||
If oItemSPECNAME = "INVOICE_TOTAL_NET" Or oItemSPECNAME = "INVOICE_TOTAL_GROSS" Then
|
|
||||||
oItemValue += $" {oCurrencySymbol}"
|
Dim oCURRENCYFORMAT = {"INVOICE_TOTAL_TAX", "INVOICE_TOTAL_NET", "INVOICE_TOTAL_GROSS", "POSITION_ALLOWANCE_ACTUAL_AMOUNT", "RECEIPT_ALLOWANCE_ACTUAL_AMOUNT",
|
||||||
|
"POSITION_ALLOWANCE_CALCULATION_PERCENT", "RECEIPT_ALLOWANCE_CALCULATION_PERCENT"}
|
||||||
|
If oCURRENCYFORMAT.Contains(oItemSPECNAME) Then
|
||||||
|
oItemValue = FormatCurrency(oItemValue, oCurrencySymbol)
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
|
||||||
If oRowCaption <> String.Empty Then
|
If oRowCaption <> String.Empty Then
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, oRowCaption)
|
'Zuerst die RowCaption
|
||||||
gdpicturePDF.DrawText(fontResName, 70, yPosition, oItemValue)
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, oRowCaption)
|
||||||
|
'Dann den Wert
|
||||||
|
If oCreateTextBox Then
|
||||||
|
Dim otextBoxYPos = yPosition - 3
|
||||||
|
MyGDPicturePDF.DrawTextBox(fontResName, 70, otextBoxYPos, 90, YCoo_TextBoxPlus5(otextBoxYPos),
|
||||||
|
TextAlignment.TextAlignmentFar, TextAlignment.TextAlignmentCenter,
|
||||||
|
oItemValue)
|
||||||
|
Else
|
||||||
|
MyGDPicturePDF.DrawText(fontResName, 70, yPosition, oItemValue)
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
If Y_eq_lastrow = True Then
|
If Y_eq_lastrow = True Then
|
||||||
If oIsPosition = True And oPosCount = 9 Then
|
MyGDPicturePDF.DrawText(fontResName, oRow.Item("xPosition"), yPosition, oItemValue)
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, "...es gibt noch mehr Positionen, diese werden aber aus Layoutgründen nicht dargestellt.")
|
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, "...There are more positions, but these are not shown for layout reasons.")
|
|
||||||
Else
|
|
||||||
gdpicturePDF.DrawText(fontResName, oRow.Item("xPosition"), yPosition, oItemValue)
|
|
||||||
End If
|
|
||||||
Else
|
Else
|
||||||
If oItemValue.Length > 112 Then
|
If oItemValue.Length > 112 Then
|
||||||
' Liste zur Speicherung der Teilstrings
|
' Liste zur Speicherung der Teilstrings
|
||||||
@@ -230,40 +466,54 @@ Public Class XRechnungViewDocument
|
|||||||
|
|
||||||
' Ausgabe der Teilstrings
|
' Ausgabe der Teilstrings
|
||||||
For Each teilString As String In teilStrings
|
For Each teilString As String In teilStrings
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, teilString)
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, teilString)
|
||||||
yPosition += 5
|
yPosition += 5
|
||||||
Next
|
Next
|
||||||
Else
|
Else
|
||||||
gdpicturePDF.DrawText(fontResName, 10, yPosition, oItemValue)
|
MyGDPicturePDF.DrawText(fontResName, 10, yPosition, oItemValue)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
End If
|
End If
|
||||||
|
End If
|
||||||
|
Else
|
||||||
|
If oItemSPECNAME = "INVOICE_POSITION_TAX_AMOUNT" And oYPlus > 0 Then
|
||||||
|
yPosition += oYPlus
|
||||||
|
Else
|
||||||
|
|
||||||
|
|
||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
oIndex += 1
|
oIndex += 1
|
||||||
Next
|
Next
|
||||||
Dim oCreated = Now.ToString
|
' Dim oeinv_Format As PdfInvoiceDataFormat = PdfInvoiceDataFormat.ZUGFeRD_2_0
|
||||||
|
Dim oAttString = "E-invoice XML attachment"
|
||||||
gdpicturePDF.DrawLine(10, 280, 200, 280)
|
If File.Exists(oXmlFilePath) Then
|
||||||
Dim oCreatedString = $"Maschinell erstellt durch / Automatically created by Digital Data E-Rechnung Parser: {oCreated}"
|
MyGDPicturePDF.EmbedFile(oXmlFilePath, oAttString)
|
||||||
gdpicturePDF.DrawText(fontResName, 10, 285, oCreatedString)
|
|
||||||
Dim oeinv_Format As PdfInvoiceDataFormat = PdfInvoiceDataFormat.ZUGFeRD_2_0
|
|
||||||
gdpicturePDF.EmbedFile(oTempFilePath, "Rechnungsdaten im ZUGFeRD-XML-Format")
|
|
||||||
'Finalize And save the PDF
|
|
||||||
ostatus = gdpicturePDF.SaveToFile(oOutputPath)
|
|
||||||
If ostatus = GdPictureStatus.OK Then
|
|
||||||
_logger.Info("PDF VisualReceipt generated successfully!")
|
|
||||||
Else
|
Else
|
||||||
_logger.Warn($"Error generating PDF VisualReceipt: {ostatus}")
|
_logger.Info("XML File is not existing and could not be embedded!")
|
||||||
|
Return Nothing
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
MyGDPicturePDF.EnableCompression(True)
|
||||||
|
|
||||||
|
'Finalize And save the PDF
|
||||||
|
oPDFStatus = MyGDPicturePDF.SaveToFile(oOutputPath)
|
||||||
|
If oPDFStatus = GdPictureStatus.OK Then
|
||||||
|
_logger.Info("PDF VisualReceipt generated successfully!")
|
||||||
|
_logger.Debug("Vor MOVE... oxmlFilePath: [{0}] / oTempFilePath: [{1}]", oXmlFilePath, oTempFilePath)
|
||||||
|
File.Move(oXmlFilePath, oTempFilePath)
|
||||||
|
Else
|
||||||
|
_logger.Warn($"Error generating PDF VisualReceipt: {oPDFStatus}")
|
||||||
|
End If
|
||||||
'Release resources
|
'Release resources
|
||||||
gdpicturePDF.CloseDocument()
|
MyGDPicturePDF.CloseDocument()
|
||||||
If ostatus = GdPictureStatus.OK Then
|
If oPDFStatus = GdPictureStatus.OK Then
|
||||||
File.Delete(oXRechnungFile)
|
' File.Delete(oXRechnungFile)
|
||||||
oNewFileinfo = New FileInfo(oOutputPath)
|
oNewFileinfo = New FileInfo(oOutputPath)
|
||||||
|
_logger.Info("Create_PDFfromXML() End successfully. File [{0}] written.", oNewFileinfo.FullName)
|
||||||
Return oNewFileinfo
|
Return oNewFileinfo
|
||||||
Else
|
Else
|
||||||
|
_logger.Warn("Create_PDFfromXML() Ends with nothing")
|
||||||
Return Nothing
|
Return Nothing
|
||||||
End If
|
End If
|
||||||
|
|
||||||
@@ -272,6 +522,86 @@ Public Class XRechnungViewDocument
|
|||||||
Return Nothing
|
Return Nothing
|
||||||
End Try
|
End Try
|
||||||
End Function
|
End Function
|
||||||
|
'Private Function FormatCurrency(ByVal pValue As String, pCurrencySymbol As String) As String
|
||||||
|
' pValue = pValue.Replace(".", ",")
|
||||||
|
' Dim oBetrag As Decimal = pValue
|
||||||
|
' Dim oFormatiert As String = oBetrag.ToString("N2", New Globalization.CultureInfo("de-DE"))
|
||||||
|
' oFormatiert = $"{oFormatiert} {pCurrencySymbol}"
|
||||||
|
' Return oFormatiert
|
||||||
|
'End Function
|
||||||
|
Private Function FormatCurrency(ByVal pValue As String, pCurrencySymbol As String) As String
|
||||||
|
pValue = pValue.Trim()
|
||||||
|
|
||||||
|
Dim oBetrag As Decimal
|
||||||
|
Dim culture As Globalization.CultureInfo
|
||||||
|
|
||||||
|
' Erkennung des Dezimaltrennzeichens
|
||||||
|
If pValue.Contains(",") AndAlso Not pValue.Contains(".") Then
|
||||||
|
culture = New Globalization.CultureInfo("de-DE") ' Komma → deutsches Format
|
||||||
|
ElseIf pValue.Contains(".") AndAlso Not pValue.Contains(",") Then
|
||||||
|
culture = New Globalization.CultureInfo("en-US") ' Punkt → englisches Format
|
||||||
|
Else
|
||||||
|
' Mischformat oder Tausendertrennzeichen → Fallback auf aktuelle Culture
|
||||||
|
culture = Globalization.CultureInfo.CurrentCulture
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Parsen mit gewählter Culture
|
||||||
|
If Not Decimal.TryParse(pValue, Globalization.NumberStyles.Any, culture, oBetrag) Then
|
||||||
|
Throw New FormatException($"Ungültiger Zahlenwert: {pValue}")
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Formatieren mit deutscher Culture
|
||||||
|
Dim oFormatiert As String = oBetrag.ToString("N2", New Globalization.CultureInfo("de-DE"))
|
||||||
|
Return $"{oFormatiert} {pCurrencySymbol}"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
Private Function FormatStringT(ByVal text As String) As String
|
||||||
|
Return text.Replace(vbCr, " - ").Replace(vbLf, "").Replace(vbTab, " ")
|
||||||
|
End Function
|
||||||
|
Private Function RemoveNewlinesAndTabs(ByVal text As String) As String
|
||||||
|
Return text.Replace(vbCr, " - ").Replace(vbLf, "").Replace(vbTab, " ")
|
||||||
|
End Function
|
||||||
|
Private Function YCoo_TextBoxMinus5(yPosition As Integer)
|
||||||
|
Return yPosition - 5
|
||||||
|
End Function
|
||||||
|
Private Function YCoo_TextBoxPlus5(yPosition As Integer)
|
||||||
|
Return yPosition + 5
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
Function SplitTextByNewLine(text As String) As List(Of String)
|
||||||
|
If String.IsNullOrEmpty(text) Then
|
||||||
|
Return New List(Of String)()
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Zerlege den Text anhand von Zeilenumbrüchen
|
||||||
|
Dim lines As List(Of String) = text.Split({vbCrLf, vbLf, vbCr}, StringSplitOptions.None).ToList()
|
||||||
|
Return lines
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Private Function Return_InvType(pType As String) As String
|
Private Function Return_InvType(pType As String) As String
|
||||||
Dim oReturn As String = "Rechnung/invoice"
|
Dim oReturn As String = "Rechnung/invoice"
|
||||||
If pType = "380" Then
|
If pType = "380" Then
|
||||||
@@ -292,5 +622,42 @@ Public Class XRechnungViewDocument
|
|||||||
Return oReturn
|
Return oReturn
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Private Function Return_UnitType(pType As String) As String
|
||||||
|
Dim oReturn As String = "Stück/pc"
|
||||||
|
If pType = "C62" Then
|
||||||
|
oReturn = "Stück/pc"
|
||||||
|
ElseIf pType = "DAY" Then
|
||||||
|
oReturn = "Tag/day"
|
||||||
|
ElseIf pType = "HAR" Then
|
||||||
|
oReturn = "Hek/hec"
|
||||||
|
ElseIf pType = "HUR" Then
|
||||||
|
oReturn = "h"
|
||||||
|
ElseIf pType = "KGM" Then
|
||||||
|
oReturn = "kg"
|
||||||
|
ElseIf pType = "KTM" Then
|
||||||
|
oReturn = "km"
|
||||||
|
ElseIf pType = "KWH" Then
|
||||||
|
oReturn = pType
|
||||||
|
ElseIf pType = "LS" Then
|
||||||
|
oReturn = "pausch/flat"
|
||||||
|
ElseIf pType = "MIN" Then
|
||||||
|
oReturn = "minute"
|
||||||
|
ElseIf pType = "MTK" Then
|
||||||
|
oReturn = "QM/SM"
|
||||||
|
ElseIf pType = "Kubik/CM" Then
|
||||||
|
oReturn = "MTR"
|
||||||
|
ElseIf pType = "Meter" Then
|
||||||
|
oReturn = "minute"
|
||||||
|
ElseIf pType = "P1" Then
|
||||||
|
oReturn = "%"
|
||||||
|
ElseIf pType = "SET" Then
|
||||||
|
oReturn = "Set"
|
||||||
|
ElseIf pType = "TNE" Then
|
||||||
|
oReturn = "Tonne/ton"
|
||||||
|
ElseIf pType = "WEE" Then
|
||||||
|
oReturn = "Woche/week"
|
||||||
|
End If
|
||||||
|
Return oReturn
|
||||||
|
End Function
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -1,8 +1,33 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="BouncyCastle.Cryptography" version="2.5.0" targetFramework="net462" />
|
||||||
|
<package id="DocumentFormat.OpenXml" version="3.2.0" targetFramework="net462" />
|
||||||
|
<package id="DocumentFormat.OpenXml.Framework" version="3.2.0" targetFramework="net462" />
|
||||||
<package id="FirebirdSql.Data.FirebirdClient" version="7.5.0" targetFramework="net461" />
|
<package id="FirebirdSql.Data.FirebirdClient" version="7.5.0" targetFramework="net461" />
|
||||||
<package id="GdPicture" version="14.2.90" targetFramework="net462" />
|
<package id="GdPicture" version="14.3.3" targetFramework="net462" />
|
||||||
<package id="GdPicture.runtimes.windows" version="14.2.90" targetFramework="net462" />
|
<package id="GdPicture.runtimes.windows" version="14.3.3" targetFramework="net462" />
|
||||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
|
<package id="Microsoft.AspNet.WebApi.Client" version="6.0.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net462" />
|
||||||
|
<package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net462" />
|
||||||
|
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" />
|
||||||
|
<package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="OpenMcdf" version="2.4.1" targetFramework="net462" />
|
||||||
|
<package id="protobuf-net" version="3.2.46" targetFramework="net462" />
|
||||||
|
<package id="protobuf-net.Core" version="3.2.46" targetFramework="net462" />
|
||||||
|
<package id="RtfPipe" version="2.0.7677.4303" targetFramework="net462" />
|
||||||
|
<package id="System.Buffers" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.CodeDom" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Collections.Immutable" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.IO.Packaging" version="8.0.1" targetFramework="net462" />
|
||||||
|
<package id="System.Management" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Memory" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.Numerics.Vectors" version="4.6.0" targetFramework="net462" />
|
||||||
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.0" targetFramework="net462" />
|
||||||
|
<package id="System.Security.Cryptography.Pkcs" version="8.0.1" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Encodings.Web" version="8.0.0" targetFramework="net462" />
|
||||||
|
<package id="System.Text.Json" version="8.0.6" targetFramework="net462" />
|
||||||
|
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net462" />
|
||||||
|
<package id="System.ValueTuple" version="4.5.0" targetFramework="net462" />
|
||||||
</packages>
|
</packages>
|
||||||
134
License/Licensebackup.vbproj
Normal file
134
License/Licensebackup.vbproj
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{5EBACBFA-F11A-4BBF-8D02-91461F2293ED}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>DigitalData.Modules.License</RootNamespace>
|
||||||
|
<AssemblyName>DigitalData.Modules.License</AssemblyName>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<MyType>Windows</MyType>
|
||||||
|
<TargetFrameworkVersion>net462</TargetFrameworkVersion>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DefineDebug>true</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.License.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<DefineDebug>false</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.License.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionExplicit>On</OptionExplicit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionCompare>Binary</OptionCompare>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionStrict>Off</OptionStrict>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionInfer>On</OptionInfer>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Import Include="Microsoft.VisualBasic" />
|
||||||
|
<Import Include="System" />
|
||||||
|
<Import Include="System.Collections" />
|
||||||
|
<Import Include="System.Collections.Generic" />
|
||||||
|
<Import Include="System.Data" />
|
||||||
|
<Import Include="System.Diagnostics" />
|
||||||
|
<Import Include="System.Linq" />
|
||||||
|
<Import Include="System.Xml.Linq" />
|
||||||
|
<Import Include="System.Threading.Tasks" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="LicenseCreator.vb" />
|
||||||
|
<Compile Include="LicenseFile.vb" />
|
||||||
|
<Compile Include="LicenseLegacy.vb" />
|
||||||
|
<Compile Include="LicenseManagerLegacy.vb" />
|
||||||
|
<Compile Include="LicenseSchema.vb">
|
||||||
|
<DependentUpon>LicenseSchema.xsd</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="LicensesLegacy.vb" />
|
||||||
|
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||||
|
<Compile Include="My Project\Application.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Application.myapp</DependentUpon>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Resources.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Settings.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="My Project\Resources.resx">
|
||||||
|
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||||
|
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="LicenseSchema.xsd">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</None>
|
||||||
|
<None Include="My Project\Application.myapp">
|
||||||
|
<Generator>MyApplicationCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="My Project\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<CustomToolNamespace>My</CustomToolNamespace>
|
||||||
|
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Logging\Logging.vbproj">
|
||||||
|
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
||||||
|
<Name>Logging</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -9,10 +9,10 @@ Imports System.Runtime.InteropServices
|
|||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Modules.Logging")>
|
<Assembly: AssemblyTitle("Modules.Logging")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Logging Modul from DigitalData.Modules for logging Application-Events. Supports Error, Information and Debug")>
|
||||||
<Assembly: AssemblyCompany("Digital Data")>
|
<Assembly: AssemblyCompany("Digital Data GmbH, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Modules.Logging")>
|
<Assembly: AssemblyProduct("Modules.Logging")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("2.6.4.0")>
|
<Assembly: AssemblyTrademark("2.6.4.0")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2.6.4.0")>
|
<Assembly: AssemblyVersion("2.6.5.0")>
|
||||||
<Assembly: AssemblyFileVersion("2.6.4.0")>
|
<Assembly: AssemblyFileVersion("2.6.5.0")>
|
||||||
|
|||||||
2
Logging/My Project/Settings.Designer.vb
generated
2
Logging/My Project/Settings.Designer.vb
generated
@@ -15,7 +15,7 @@ Option Explicit On
|
|||||||
Namespace My
|
Namespace My
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0"), _
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
Partial Friend NotInheritable Class MySettings
|
Partial Friend NotInheritable Class MySettings
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ Public Class Limilab
|
|||||||
Password = oPassword
|
Password = oPassword
|
||||||
AuthType = oAuthType
|
AuthType = oAuthType
|
||||||
Initialized = True
|
Initialized = True
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
Public Function CloseImap() As Boolean
|
Public Function CloseImap() As Boolean
|
||||||
Try
|
Try
|
||||||
@@ -75,7 +76,6 @@ Public Class Limilab
|
|||||||
''' <returns>True if connection and query were successful. False otherwise.</returns>
|
''' <returns>True if connection and query were successful. False otherwise.</returns>
|
||||||
Public Function IMAPTestLogin() As Boolean
|
Public Function IMAPTestLogin() As Boolean
|
||||||
Logger.Debug("Starting IMAPTestLogin ...")
|
Logger.Debug("Starting IMAPTestLogin ...")
|
||||||
|
|
||||||
If Initialized = False Then
|
If Initialized = False Then
|
||||||
Return False
|
Return False
|
||||||
End If
|
End If
|
||||||
|
|||||||
@@ -135,13 +135,18 @@ Namespace Mail
|
|||||||
Private Function AddAttachments(pMailBuilder As Limilabs.Mail.MailBuilder, pAttachments As List(Of String)) As Limilabs.Mail.MailBuilder
|
Private Function AddAttachments(pMailBuilder As Limilabs.Mail.MailBuilder, pAttachments As List(Of String)) As Limilabs.Mail.MailBuilder
|
||||||
For Each oAttachment In pAttachments
|
For Each oAttachment In pAttachments
|
||||||
Try
|
Try
|
||||||
' Read attachment from disk, add it to Attachments collection
|
If oAttachment <> String.Empty Then
|
||||||
If IO.File.Exists(oAttachment) Then
|
' Read attachment from disk, add it to Attachments collection
|
||||||
Logger.Debug("Adding attachment [{0}] to mail.", oAttachment)
|
If IO.File.Exists(oAttachment) Then
|
||||||
pMailBuilder.AddAttachment(oAttachment)
|
Logger.Debug("Adding attachment [{0}] to mail.", oAttachment)
|
||||||
|
pMailBuilder.AddAttachment(oAttachment)
|
||||||
|
Else
|
||||||
|
Logger.Warn("Attachment [{0}] does not exist. Skipping.", oAttachment)
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
Logger.Warn("Attachment [{0}] does not exist. Skipping.", oAttachment)
|
Logger.Debug("Attachment is String.Empty")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Could not read or add attachment [{0}]!", oAttachment)
|
Logger.Warn("Could not read or add attachment [{0}]!", oAttachment)
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
Imports System.Net.Security
|
Imports System.IdentityModel.Tokens
|
||||||
|
Imports System.Net.Security
|
||||||
Imports DigitalData.Modules.Base
|
Imports DigitalData.Modules.Base
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
Imports Limilabs.Client
|
Imports Limilabs.Client
|
||||||
@@ -11,7 +12,6 @@ Namespace Mail
|
|||||||
Inherits BaseClass
|
Inherits BaseClass
|
||||||
|
|
||||||
Public ReadOnly Client As ClientBase
|
Public ReadOnly Client As ClientBase
|
||||||
Public ReadOnly OAuth2 As OAuth2
|
|
||||||
|
|
||||||
Public Const AUTH_SSL = "SSL"
|
Public Const AUTH_SSL = "SSL"
|
||||||
Public Const AUTH_STARTTLS = "STARTTLS"
|
Public Const AUTH_STARTTLS = "STARTTLS"
|
||||||
@@ -19,9 +19,7 @@ Namespace Mail
|
|||||||
Public Const AUTH_NONE = "NONE"
|
Public Const AUTH_NONE = "NONE"
|
||||||
Public Const AUTH_OAUTH2 = "OAUTH2"
|
Public Const AUTH_OAUTH2 = "OAUTH2"
|
||||||
|
|
||||||
Private Const SMTP_IGNORED_ERRORS As SslPolicyErrors =
|
Private Const SMTP_IGNORED_ERRORS As SslPolicyErrors = SslPolicyErrors.RemoteCertificateChainErrors Or SslPolicyErrors.RemoteCertificateNameMismatch
|
||||||
SslPolicyErrors.RemoteCertificateChainErrors Or ' self-signed
|
|
||||||
SslPolicyErrors.RemoteCertificateNameMismatch ' name mismatch
|
|
||||||
|
|
||||||
Private _Session As SessionInfo
|
Private _Session As SessionInfo
|
||||||
|
|
||||||
@@ -56,7 +54,7 @@ Namespace Mail
|
|||||||
Public Property EnableTls1_1 As Boolean = False
|
Public Property EnableTls1_1 As Boolean = False
|
||||||
Public Property EnableTls1_2 As Boolean = False
|
Public Property EnableTls1_2 As Boolean = False
|
||||||
|
|
||||||
' Not available in .NET 4.6.2
|
' Not available in .NET4.6.2
|
||||||
'Public Property EnableTls1_3 As Boolean = False
|
'Public Property EnableTls1_3 As Boolean = False
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
@@ -71,12 +69,12 @@ Namespace Mail
|
|||||||
''' <returns></returns>
|
''' <returns></returns>
|
||||||
Public Function ConnectToServerWithBasicAuth(pServer As String, pPort As Integer, pUser As String, pPassword As String, pAuthType As String, pOptions As MailSessionOptions) As SessionInfo
|
Public Function ConnectToServerWithBasicAuth(pServer As String, pPort As Integer, pUser As String, pPassword As String, pAuthType As String, pOptions As MailSessionOptions) As SessionInfo
|
||||||
Dim oSession = New SessionInfo With {
|
Dim oSession = New SessionInfo With {
|
||||||
.Server = pServer,
|
.Server = pServer,
|
||||||
.Port = pPort,
|
.Port = pPort,
|
||||||
.User = pUser,
|
.User = pUser,
|
||||||
.Password = pPassword,
|
.Password = pPassword,
|
||||||
.AuthType = pAuthType
|
.AuthType = pAuthType
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Debug("Connecting to Server..")
|
Logger.Debug("Connecting to Server..")
|
||||||
Logger.Debug("Server: [{0}]", oSession.Server)
|
Logger.Debug("Server: [{0}]", oSession.Server)
|
||||||
@@ -92,17 +90,23 @@ Namespace Mail
|
|||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function ConnectToServerWithO365OAuth(pUser As String, pClientId As String, pTenantId As String, pClientSecret As String, pOptions As MailSessionOptions) As SessionInfo
|
Public Function ConnectToServerWithO365OAuth(pUser As String, pClientId As String, pTenantId As String, pClientSecret As String, pOptions As MailSessionOptions) As SessionInfo
|
||||||
|
' Choose server/port based on the client type
|
||||||
|
Dim server As String = If(TypeOf Client Is Smtp, "smtp.office365.com", OAuth2.O365_SERVER)
|
||||||
|
Dim port As Integer = If(TypeOf Client Is Imap, 993, If(TypeOf Client Is Smtp, 587, 993))
|
||||||
|
|
||||||
Dim oSession = New SessionInfo With {
|
Dim oSession = New SessionInfo With {
|
||||||
.Server = OAuth2.O365_SERVER,
|
.Server = server,
|
||||||
.ClientId = pClientId,
|
.Port = port,
|
||||||
.ClientSecret = pClientSecret,
|
.ClientId = pClientId,
|
||||||
.TenantId = pTenantId,
|
.ClientSecret = pClientSecret,
|
||||||
.User = pUser,
|
.TenantId = pTenantId,
|
||||||
.AuthType = AUTH_OAUTH2
|
.User = pUser,
|
||||||
}
|
.AuthType = AUTH_OAUTH2
|
||||||
|
}
|
||||||
|
|
||||||
Logger.Debug("Connecting to Server..")
|
Logger.Debug("Connecting to Server..")
|
||||||
Logger.Debug("Server: [{0}]", oSession.Server)
|
Logger.Debug("Server: [{0}]", oSession.Server)
|
||||||
|
Logger.Debug("Port: [{0}]", oSession.Port)
|
||||||
Logger.Debug("User: [{0}]", oSession.User)
|
Logger.Debug("User: [{0}]", oSession.User)
|
||||||
Logger.Debug("ClientId: [{0}]", oSession.ClientId)
|
Logger.Debug("ClientId: [{0}]", oSession.ClientId)
|
||||||
Logger.Debug("TenantId: [{0}]", oSession.TenantId)
|
Logger.Debug("TenantId: [{0}]", oSession.TenantId)
|
||||||
@@ -120,97 +124,98 @@ Namespace Mail
|
|||||||
|
|
||||||
If pOptions.EnableDefault Then
|
If pOptions.EnableDefault Then
|
||||||
Logger.Debug("Enabling Default TLS Version")
|
Logger.Debug("Enabling Default TLS Version")
|
||||||
Client.SSLConfiguration.EnabledSslProtocols = Security.Authentication.SslProtocols.Default
|
Client.SSLConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Default
|
||||||
Else
|
Else
|
||||||
Logger.Debug("Disabling Default TLS Version")
|
Logger.Debug("Disabling Default TLS Version")
|
||||||
Client.SSLConfiguration.EnabledSslProtocols = Security.Authentication.SslProtocols.None
|
Client.SSLConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.None
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' Set TLS Version manually if requested
|
' Set TLS Version manually if requested
|
||||||
If pOptions.EnableTls1_1 Then
|
If pOptions.EnableTls1_1 Then
|
||||||
Logger.Debug("Enabling TLS Version 1.1")
|
Logger.Debug("Enabling TLS Version1.1")
|
||||||
Client.SSLConfiguration.EnabledSslProtocols = Client.SSLConfiguration.EnabledSslProtocols Or Security.Authentication.SslProtocols.Tls11
|
Client.SSLConfiguration.EnabledSslProtocols = Client.SSLConfiguration.EnabledSslProtocols Or System.Security.Authentication.SslProtocols.Tls11
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If pOptions.EnableTls1_2 Then
|
If pOptions.EnableTls1_2 Then
|
||||||
Logger.Debug("Enabling TLS Version 1.2")
|
Logger.Debug("Enabling TLS Version1.2")
|
||||||
Client.SSLConfiguration.EnabledSslProtocols = Client.SSLConfiguration.EnabledSslProtocols Or Security.Authentication.SslProtocols.Tls12
|
Client.SSLConfiguration.EnabledSslProtocols = Client.SSLConfiguration.EnabledSslProtocols Or System.Security.Authentication.SslProtocols.Tls12
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' This is not available in .NET 4.6.2, only in .NET 4.7/4.8
|
|
||||||
'If pOptions.EnableTls1_3 Then
|
|
||||||
' Logger.Debug("Enabling TLS Version 1.3")
|
|
||||||
' oSession.SSLConfiguration.EnabledSslProtocols = oSession.SSLConfiguration.EnabledSslProtocols Or Security.Authentication.SslProtocols.Tls13
|
|
||||||
'End If
|
|
||||||
|
|
||||||
Logger.Debug("Enabled Encryption Protocols: [{0}]", Client.SSLConfiguration.EnabledSslProtocols)
|
Logger.Debug("Enabled Encryption Protocols: [{0}]", Client.SSLConfiguration.EnabledSslProtocols)
|
||||||
|
|
||||||
If pSession.AuthType = AUTH_OAUTH2 Then
|
If pSession.AuthType = AUTH_OAUTH2 Then
|
||||||
Try
|
Try
|
||||||
If TypeOf Client Is Imap Then
|
If TypeOf Client Is Imap Then
|
||||||
Dim oClient As Imap = Client
|
Dim oClient As Imap = DirectCast(Client, Imap)
|
||||||
|
Logger.Debug("Connecting with [OAuth2/IMAP/ConnectSSL] on [{0}/{1}]", pSession.Server, If(pSession.Port > 0, pSession.Port, 993))
|
||||||
|
oClient.ConnectSSL(pSession.Server) ', If(pSession.Port > 0, pSession.Port, 993)
|
||||||
|
|
||||||
Logger.Debug("Connecting with [OAuth2/ConnectSSL] on [{0}]", pSession.Server)
|
ElseIf TypeOf Client Is Smtp Then
|
||||||
oClient.ConnectSSL(pSession.Server)
|
Dim s As Smtp = DirectCast(Client, Smtp)
|
||||||
Else
|
Logger.Debug("Connecting with [OAuth2/SMTP/STARTTLS] on [{0}/{1}]", pSession.Server, If(pSession.Port > 0, pSession.Port, 587))
|
||||||
Throw New ApplicationException("Only OAuth2 for IMAP is not yet supported!")
|
s.Connect(pSession.Server, If(pSession.Port > 0, pSession.Port, 587))
|
||||||
|
s.StartTLS()
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Error while connecting with Auth type OAuth2!")
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type OAuth2!")
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|
||||||
Session.Error = ex
|
pSession.Error = ex
|
||||||
Return Session
|
Return pSession
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
ElseIf pSession.AuthType = AUTH_SSL Then
|
ElseIf pSession.AuthType = AUTH_SSL Then
|
||||||
Try
|
Try
|
||||||
' Port 465 ist der SMTP-SSL-Port, wird bei der WISAG verwendet, aber veraltet
|
' SSL: always connect with SSL immediately
|
||||||
' Port 993 ist der IMAP-SSL-Port, zum Abholen der Mails
|
Logger.Debug("Connecting with [SSL/ConnectSSL] on [{0}/{1}]", pSession.Server, pSession.Port)
|
||||||
If pSession.Port = 465 Or pSession.Port = 993 Then
|
Client.ConnectSSL(pSession.Server, pSession.Port)
|
||||||
Logger.Debug("Connecting with [SSL/ConnectSSL] on [{0}/{1}]", pSession.Server, pSession.Port)
|
Logger.Debug("Connection (AUTH_SSL) Successful!")
|
||||||
Client.ConnectSSL(pSession.Server, pSession.Port)
|
|
||||||
Else
|
|
||||||
Logger.Debug("Connecting with [SSL/Connect] on [{0}/{1}]", pSession.Server, pSession.Port)
|
|
||||||
Client.Connect(pSession.Server, pSession.Port)
|
|
||||||
End If
|
|
||||||
Logger.Info("Connection Successful!")
|
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Error while connecting with Auth type SSL!")
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type SSL!")
|
||||||
Logger.Warn($"Error-message: {ex.Message}")
|
Logger.Warn($"Error-message: {ex.Message}")
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|
||||||
Session.Error = ex
|
pSession.Error = ex
|
||||||
Return Session
|
Return pSession
|
||||||
End Try
|
End Try
|
||||||
|
|
||||||
ElseIf Session.AuthType = AUTH_SSLTLS Or Session.AuthType = AUTH_STARTTLS Then
|
ElseIf pSession.AuthType = AUTH_SSLTLS Then
|
||||||
|
|
||||||
Try
|
Try
|
||||||
If pSession.Port = 993 Then
|
' SSL/TLS: same as SSL, explicit branch for clarity
|
||||||
Logger.Debug("Connecting with [STARTTLS/ConnectSSL] on [{0}/{1}]", pSession.Server, pSession.Port)
|
Logger.Debug("Connecting with [SSL/TLS/ConnectSSL] on [{0}/{1}]", pSession.Server, pSession.Port)
|
||||||
Client.ConnectSSL(pSession.Server, pSession.Port)
|
Client.ConnectSSL(pSession.Server, pSession.Port)
|
||||||
Else
|
Logger.Debug("Connection (AUTH_SSLTLS) Successful!")
|
||||||
Logger.Debug("Connecting with [STARTTLS/Connect] on [{0}/{1}]", pSession.Server, pSession.Port)
|
|
||||||
Client.Connect(pSession.Server, pSession.Port)
|
Catch ex As Exception
|
||||||
End If
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type SSL/TLS!")
|
||||||
Logger.Info("Connection Successful!")
|
Logger.Error(ex)
|
||||||
|
|
||||||
|
pSession.Error = ex
|
||||||
|
Return pSession
|
||||||
|
End Try
|
||||||
|
|
||||||
|
ElseIf pSession.AuthType = AUTH_STARTTLS Then
|
||||||
|
|
||||||
|
Try
|
||||||
|
' STARTTLS: connect plain and then upgrade
|
||||||
|
Logger.Debug("Connecting with [STARTTLS/Connect] on [{0}/{1}]", pSession.Server, pSession.Port)
|
||||||
|
Client.Connect(pSession.Server, pSession.Port)
|
||||||
|
|
||||||
Dim oSupportsSTARTTLS As Boolean = SupportsSTARTTLS(Client)
|
Dim oSupportsSTARTTLS As Boolean = SupportsSTARTTLS(Client)
|
||||||
Logger.Debug("Server supports STARTTLS: [{0}]", oSupportsSTARTTLS)
|
Logger.Debug("Server supports STARTTLS: [{0}]", oSupportsSTARTTLS)
|
||||||
|
|
||||||
If oSupportsSTARTTLS Then
|
If oSupportsSTARTTLS Then
|
||||||
DoSTARTTLS(Client)
|
DoSTARTTLS(Client)
|
||||||
Logger.Info("STARTTLS Successful!")
|
Logger.Debug("STARTTLS Successful!")
|
||||||
Else
|
Else
|
||||||
Logger.Debug("Server does not support STARTTLS. Enabling TLS1.2 instead.")
|
Throw New ApplicationException("Server does not support STARTTLS on this endpoint.")
|
||||||
Client.SSLConfiguration.EnabledSslProtocols = Security.Authentication.SslProtocols.Tls12
|
|
||||||
End If
|
End If
|
||||||
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Error while connecting with Auth type STARTTLS!")
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type STARTTLS!")
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|
||||||
pSession.Error = ex
|
pSession.Error = ex
|
||||||
@@ -219,11 +224,11 @@ Namespace Mail
|
|||||||
|
|
||||||
Else
|
Else
|
||||||
Try
|
Try
|
||||||
Logger.Debug("Auth type [{0}]. Using PLAINTEXT connection.", Session.AuthType)
|
Logger.Debug("Auth type [{0}]. Using PLAINTEXT connection.", pSession.AuthType)
|
||||||
Client.Connect(pSession.Server, pSession.Port, useSSL:=False)
|
Client.Connect(pSession.Server, pSession.Port, useSSL:=False)
|
||||||
Logger.Info("Connection Successful!")
|
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Error while connecting with Auth type [{0}]!", Session.AuthType)
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type [{0}]!", pSession.AuthType)
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|
||||||
pSession.Error = ex
|
pSession.Error = ex
|
||||||
@@ -237,8 +242,7 @@ Namespace Mail
|
|||||||
Logger.Info("Logging in with user [{0}] and Auth Type [{1}]", pSession.User, pSession.AuthType)
|
Logger.Info("Logging in with user [{0}] and Auth Type [{1}]", pSession.User, pSession.AuthType)
|
||||||
|
|
||||||
If pSession.AuthType = AUTH_OAUTH2 Then
|
If pSession.AuthType = AUTH_OAUTH2 Then
|
||||||
' SessionInfo.Password will be the access token that was obtained
|
' Use OAuth2 token
|
||||||
' in the OAuth2 flow before
|
|
||||||
DoUseBestLogin_OAuth2(Client, pSession)
|
DoUseBestLogin_OAuth2(Client, pSession)
|
||||||
Else
|
Else
|
||||||
DoUseBestLogin_BasicAuth(Client, pSession.User, pSession.Password)
|
DoUseBestLogin_BasicAuth(Client, pSession.User, pSession.Password)
|
||||||
@@ -246,7 +250,7 @@ Namespace Mail
|
|||||||
|
|
||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Warn("Error while connecting with Auth type [{0}]!", pSession.AuthType)
|
Logger.Warn("Unexpected Error in ConnectToServer with Auth type [{0}]!", pSession.AuthType)
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|
||||||
pSession.Error = ex
|
pSession.Error = ex
|
||||||
@@ -293,7 +297,7 @@ Namespace Mail
|
|||||||
End If
|
End If
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Private Function SupportsSTARTTLS(pClient As ClientBase)
|
Private Function SupportsSTARTTLS(pClient As ClientBase) As Boolean
|
||||||
If TypeOf pClient Is Smtp Then
|
If TypeOf pClient Is Smtp Then
|
||||||
Return DirectCast(pClient, Smtp).SupportedExtensions.Contains(SmtpExtension.StartTLS)
|
Return DirectCast(pClient, Smtp).SupportedExtensions.Contains(SmtpExtension.StartTLS)
|
||||||
ElseIf TypeOf pClient Is Imap Then
|
ElseIf TypeOf pClient Is Imap Then
|
||||||
@@ -329,16 +333,61 @@ Namespace Mail
|
|||||||
Private Sub DoUseBestLogin_OAuth2(pClient As ClientBase, pSession As SessionInfo)
|
Private Sub DoUseBestLogin_OAuth2(pClient As ClientBase, pSession As SessionInfo)
|
||||||
Logger.Debug("Logging in with O365 OAuth2")
|
Logger.Debug("Logging in with O365 OAuth2")
|
||||||
|
|
||||||
If TypeOf pClient Is Imap Then
|
Dim oOAuth = New OAuth2(LogConfig, pSession.TenantId, pSession.ClientId, pSession.ClientSecret)
|
||||||
Dim oOAuth = New OAuth2(LogConfig, pSession.TenantId, pSession.ClientId, pSession.ClientSecret)
|
Dim oAccessToken = oOAuth.GetAccessToken()
|
||||||
Dim oAccessToken = oOAuth.GetAccessToken()
|
|
||||||
|
|
||||||
DirectCast(pClient, Imap).LoginOAUTH2(pSession.User, oAccessToken)
|
' Diagnose token shape (delegated vs app-only)
|
||||||
|
Try
|
||||||
|
Dim parts = oAccessToken.Split("."c)
|
||||||
|
If parts.Length = 3 Then
|
||||||
|
Dim payloadJson = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(PadBase64(parts(1))))
|
||||||
|
If payloadJson.Contains("""scp""") Then
|
||||||
|
Logger.Debug("OAuth2 token contains 'scp' (delegated) – IMAP App-only erwartet 'roles'.")
|
||||||
|
ElseIf payloadJson.Contains("""roles""") Then
|
||||||
|
Logger.Debug("OAuth2 token contains 'roles' (application permissions).")
|
||||||
|
Else
|
||||||
|
Logger.Debug("OAuth2 token payload hat weder 'scp' noch 'roles'.")
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Debug("Token-Payload konnte nicht gelesen werden: {0}", ex.Message)
|
||||||
|
End Try
|
||||||
|
|
||||||
|
If TypeOf pClient Is Imap Then
|
||||||
|
Dim i = DirectCast(pClient, Imap)
|
||||||
|
|
||||||
|
' Login mit Hilfsmethode; bei Abbruch explizit SASL XOAUTH2 probieren
|
||||||
|
Try
|
||||||
|
' Direkt versuchen, falls die verwendete Version LoginOAUTH2 unterstützt.
|
||||||
|
i.LoginOAUTH2(pSession.User, oAccessToken)
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("LoginOAUTH2 (IMAP) fehlgeschlagen: {0}", ex.Message)
|
||||||
|
Throw
|
||||||
|
End Try
|
||||||
|
ElseIf TypeOf pClient Is Smtp Then
|
||||||
|
Dim s = DirectCast(pClient, Smtp)
|
||||||
|
Try
|
||||||
|
s.LoginOAUTH2(pSession.User, oAccessToken)
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Warn("LoginOAUTH2 (SMTP) fehlgeschlagen: {0}", ex.Message)
|
||||||
|
Throw
|
||||||
|
End Try
|
||||||
Else
|
Else
|
||||||
Logger.Error("Unknown session type: [{0}]", pClient.GetType.ToString)
|
Logger.Error("Unknown session type: [{0}]", pClient.GetType.ToString)
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
|
Private Shared Function PadBase64(input As String) As String
|
||||||
|
' Normalize Base64 URL-safe and pad to multiple of 4
|
||||||
|
If input Is Nothing Then Return String.Empty
|
||||||
|
Dim normalized As String = input.Replace("-", "+").Replace("_", "/")
|
||||||
|
Dim remainder As Integer = normalized.Length Mod 4
|
||||||
|
If remainder > 0 Then
|
||||||
|
normalized &= New String("="c, 4 - remainder)
|
||||||
|
End If
|
||||||
|
Return normalized
|
||||||
|
End Function
|
||||||
|
|
||||||
Private Sub DoSTARTTLS(pClient As ClientBase)
|
Private Sub DoSTARTTLS(pClient As ClientBase)
|
||||||
If TypeOf pClient Is Smtp Then
|
If TypeOf pClient Is Smtp Then
|
||||||
DirectCast(pClient, Smtp).StartTLS()
|
DirectCast(pClient, Smtp).StartTLS()
|
||||||
|
|||||||
@@ -1,58 +1,96 @@
|
|||||||
Imports DigitalData.Modules.Base
|
Imports DigitalData.Modules.Base
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
Imports DigitalData.Modules.Messaging.Mail.MailSession
|
|
||||||
Imports Limilabs.Client.IMAP
|
|
||||||
Imports Microsoft.Identity.Client
|
Imports Microsoft.Identity.Client
|
||||||
|
|
||||||
Public Class OAuth2
|
Namespace Mail
|
||||||
Inherits BaseClass
|
Public Class OAuth2
|
||||||
|
Inherits BaseClass
|
||||||
|
|
||||||
Private ReadOnly TenantId As String
|
Private ReadOnly _tenantId As String
|
||||||
Private ReadOnly ClientId As String
|
Private ReadOnly _clientId As String
|
||||||
Private ReadOnly ClientSecret As String
|
Private ReadOnly _clientSecret As String
|
||||||
|
|
||||||
Public Const O365_SCOPE = "https://outlook.office365.com/.default"
|
Public Const O365_SERVER As String = "outlook.office365.com"
|
||||||
Public Const O365_SERVER = "outlook.office365.com"
|
Public Const O365_SCOPE As String = "https://outlook.office365.com/.default"
|
||||||
|
Public Const O365_AUTHORITY_PREFIX As String = "https://login.microsoftonline.com/"
|
||||||
|
|
||||||
Private _AccessToken As String
|
Public Sub New(pLogConfig As LogConfig, tenantId As String, clientId As String, clientSecret As String)
|
||||||
Public ReadOnly Property AccessToken
|
MyBase.New(pLogConfig)
|
||||||
Get
|
_tenantId = tenantId
|
||||||
Return _AccessToken
|
_clientId = clientId
|
||||||
End Get
|
_clientSecret = clientSecret
|
||||||
End Property
|
End Sub
|
||||||
|
|
||||||
Public Sub New(pLogConfig As LogConfig, pTenantId As String, pClientId As String, pClientSecret As String)
|
Public Function GetAccessToken() As String
|
||||||
MyBase.New(pLogConfig)
|
' input hardening and better diagnostics
|
||||||
TenantId = pTenantId
|
Dim tenantId = If(_tenantId, String.Empty).Trim()
|
||||||
ClientId = pClientId
|
Dim clientId = If(_clientId, String.Empty).Trim()
|
||||||
ClientSecret = pClientSecret
|
Dim clientSecret = If(_clientSecret, String.Empty).Trim()
|
||||||
End Sub
|
|
||||||
|
|
||||||
Public Function GetAccessToken() As String
|
If String.IsNullOrWhiteSpace(tenantId) Then
|
||||||
Logger.Debug("Fetching Access Token..")
|
Logger.Error("OAuth2: tenantId is empty.")
|
||||||
|
Throw New ArgumentException("tenantId is empty")
|
||||||
|
End If
|
||||||
|
If String.IsNullOrWhiteSpace(clientId) Then
|
||||||
|
Logger.Error("OAuth2: clientId is empty.")
|
||||||
|
Throw New ArgumentException("clientId is empty")
|
||||||
|
End If
|
||||||
|
If String.IsNullOrWhiteSpace(clientSecret) Then
|
||||||
|
Logger.Error("OAuth2: clientSecret is empty.")
|
||||||
|
Throw New ArgumentException("clientSecret is empty")
|
||||||
|
End If
|
||||||
|
|
||||||
Try
|
' common misconfiguration: using the Secret ID (GUID) instead of the Secret VALUE
|
||||||
' Create the application, which is defined in
|
Dim tmpGuid As Guid
|
||||||
' Microsoft.Identity.Client
|
If Guid.TryParse(clientSecret, tmpGuid) Then
|
||||||
Dim oApp = ConfidentialClientApplicationBuilder.
|
Logger.Error("OAuth2: clientSecret looks like a GUID (likely the secret ID). Use the secret VALUE instead.")
|
||||||
Create(ClientId).
|
Throw New ApplicationException("Invalid client secret: looks like Secret ID (GUID), not the secret value.")
|
||||||
WithTenantId(TenantId).
|
End If
|
||||||
WithClientSecret(ClientSecret).
|
|
||||||
Build()
|
|
||||||
|
|
||||||
' Request an access token
|
Try
|
||||||
Dim oScopes = New List(Of String) From {O365_SCOPE}
|
Dim authority = O365_AUTHORITY_PREFIX & tenantId
|
||||||
Dim oResult = oApp.
|
|
||||||
AcquireTokenForClient(oScopes).
|
|
||||||
ExecuteAsync().Result
|
|
||||||
|
|
||||||
Logger.Debug("Access Token fetched.")
|
Dim app = ConfidentialClientApplicationBuilder.Create(clientId).
|
||||||
|
WithClientSecret(clientSecret).
|
||||||
|
WithAuthority(authority).
|
||||||
|
Build()
|
||||||
|
|
||||||
Return oResult.AccessToken
|
Dim scopes = New String() {O365_SCOPE}
|
||||||
Catch ex As Exception
|
Dim result = app.AcquireTokenForClient(scopes).ExecuteAsync().GetAwaiter().GetResult()
|
||||||
Logger.Warn("Could not request access token!")
|
|
||||||
Logger.Error(ex)
|
Logger.Info("OAuth2 token acquired for tenant {0}. ExpiresOn={1:u}", tenantId, result.ExpiresOn.UtcDateTime)
|
||||||
Return Nothing
|
Return result.AccessToken
|
||||||
End Try
|
Catch ex As MsalServiceException
|
||||||
End Function
|
' richer diagnostics without depending on specific MSAL version members
|
||||||
End Class
|
Logger.Error("MSAL service error. Code={0}. Message={1}", ex.ErrorCode, ex.Message)
|
||||||
|
|
||||||
|
' Try to log StatusCode, ResponseBody if available (via reflection to avoid version dependency)
|
||||||
|
Try
|
||||||
|
Dim t = GetType(MsalServiceException)
|
||||||
|
Dim scProp = t.GetProperty("StatusCode")
|
||||||
|
If scProp IsNot Nothing Then
|
||||||
|
Dim sc = scProp.GetValue(ex, Nothing)
|
||||||
|
If sc IsNot Nothing Then Logger.Error("MSAL StatusCode={0}", sc)
|
||||||
|
End If
|
||||||
|
Dim rbProp = t.GetProperty("ResponseBody")
|
||||||
|
If rbProp IsNot Nothing Then
|
||||||
|
Dim rb = rbProp.GetValue(ex, Nothing)
|
||||||
|
If rb IsNot Nothing Then Logger.Error("MSAL ResponseBody={0}", rb)
|
||||||
|
End If
|
||||||
|
Dim ciProp = t.GetProperty("Claims")
|
||||||
|
If ciProp IsNot Nothing Then
|
||||||
|
Dim claims = ciProp.GetValue(ex, Nothing)
|
||||||
|
If claims IsNot Nothing AndAlso claims.ToString().Length > 0 Then Logger.Error("MSAL Claims={0}", claims)
|
||||||
|
End If
|
||||||
|
Catch
|
||||||
|
' ignore reflection diagnostics failures
|
||||||
|
End Try
|
||||||
|
|
||||||
|
Throw
|
||||||
|
Catch ex As Exception
|
||||||
|
Logger.Error(ex)
|
||||||
|
Throw
|
||||||
|
End Try
|
||||||
|
End Function
|
||||||
|
End Class
|
||||||
|
End Namespace
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@@ -44,9 +44,11 @@
|
|||||||
<OptionInfer>On</OptionInfer>
|
<OptionInfer>On</OptionInfer>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging, Version=2.6.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DigitalData.Modules.Logging.2.6.5\lib\net462\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Mail">
|
<Reference Include="Mail">
|
||||||
<HintPath>P:\Visual Studio Projekte\Bibliotheken\Limilabs\Mail.dll\Mail.dll</HintPath>
|
<HintPath>M:\Bibliotheken\3rdParty\Limilabs\Mail.dll</HintPath>
|
||||||
<EmbedInteropTypes>False</EmbedInteropTypes>
|
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="Microsoft.Identity.Client, Version=4.55.0.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Identity.Client, Version=4.55.0.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae, processorArchitecture=MSIL">
|
||||||
@@ -140,10 +142,6 @@
|
|||||||
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
<Project>{6ea0c51f-c2b1-4462-8198-3de0b32b74f8}</Project>
|
||||||
<Name>Base</Name>
|
<Name>Base</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
|
||||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
|
||||||
<Name>Logging</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="MailLicense.xml">
|
<Content Include="MailLicense.xml">
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ Imports System.Runtime.InteropServices
|
|||||||
|
|
||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Messaging")>
|
<Assembly: AssemblyTitle("Modules.Messaging")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Funktionen rund um das Versenden und Empfangen von Emails")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Messaging")>
|
<Assembly: AssemblyProduct("Modules.Messaging")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2024")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("1.9.6.0")>
|
<Assembly: AssemblyTrademark("")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.9.6.0")>
|
<Assembly: AssemblyVersion("2.0.0.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.9.6.0")>
|
<Assembly: AssemblyFileVersion("2.0.0.0")>
|
||||||
|
|||||||
2
Messaging/My Project/Settings.Designer.vb
generated
2
Messaging/My Project/Settings.Designer.vb
generated
@@ -15,7 +15,7 @@ Option Explicit On
|
|||||||
Namespace My
|
Namespace My
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0"), _
|
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0"), _
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||||
Partial Friend NotInheritable Class MySettings
|
Partial Friend NotInheritable Class MySettings
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="DigitalData.Modules.Logging" version="2.6.5" targetFramework="net462" />
|
||||||
<package id="Microsoft.Identity.Client" version="4.55.0" targetFramework="net462" />
|
<package id="Microsoft.Identity.Client" version="4.55.0" targetFramework="net462" />
|
||||||
<package id="Microsoft.IdentityModel.Abstractions" version="6.22.0" targetFramework="net462" />
|
<package id="Microsoft.IdentityModel.Abstractions" version="6.22.0" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
|||||||
152
MigrationBackup/56f77a37/Base/Base.vbproj
Normal file
152
MigrationBackup/56f77a37/Base/Base.vbproj
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{6EA0C51F-C2B1-4462-8198-3DE0B32B74F8}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>DigitalData.Modules.Base</RootNamespace>
|
||||||
|
<AssemblyName>DigitalData.Modules.Base</AssemblyName>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<MyType>Windows</MyType>
|
||||||
|
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DefineDebug>true</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.Base.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<DefineDebug>false</DefineDebug>
|
||||||
|
<DefineTrace>true</DefineTrace>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DocumentationFile>DigitalData.Modules.Base.xml</DocumentationFile>
|
||||||
|
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionExplicit>On</OptionExplicit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionCompare>Binary</OptionCompare>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionStrict>Off</OptionStrict>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<OptionInfer>On</OptionInfer>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging">
|
||||||
|
<HintPath>..\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Transactions" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Import Include="Microsoft.VisualBasic" />
|
||||||
|
<Import Include="System" />
|
||||||
|
<Import Include="System.Collections" />
|
||||||
|
<Import Include="System.Collections.Generic" />
|
||||||
|
<Import Include="System.Data" />
|
||||||
|
<Import Include="System.Diagnostics" />
|
||||||
|
<Import Include="System.Linq" />
|
||||||
|
<Import Include="System.Xml.Linq" />
|
||||||
|
<Import Include="System.Threading.Tasks" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Base\BaseClass.vb" />
|
||||||
|
<Compile Include="Base\BaseUtils.vb" />
|
||||||
|
<Compile Include="ECM\ECM.vb" />
|
||||||
|
<Compile Include="Encryption\Compression.vb" />
|
||||||
|
<Compile Include="Encryption\Encryption.vb" />
|
||||||
|
<Compile Include="Encryption\EncryptionLegacy.vb" />
|
||||||
|
<Compile Include="DatabaseEx.vb" />
|
||||||
|
<Compile Include="FilesystemEx.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcher.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcherFilters.vb" />
|
||||||
|
<Compile Include="FileWatcher\FileWatcherProperties.vb" />
|
||||||
|
<Compile Include="IDB\Constants.vb" />
|
||||||
|
<Compile Include="MimeEx.vb" />
|
||||||
|
<Compile Include="StringFunctions.vb" />
|
||||||
|
<Compile Include="WindowsEx.vb" />
|
||||||
|
<Compile Include="ModuleExtensions.vb" />
|
||||||
|
<Compile Include="FileEx.vb" />
|
||||||
|
<Compile Include="NativeMethods.vb" />
|
||||||
|
<Compile Include="ObjectEx.vb" />
|
||||||
|
<Compile Include="GraphicsEx.vb" />
|
||||||
|
<Compile Include="LanguageEx.vb" />
|
||||||
|
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||||
|
<Compile Include="My Project\Application.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Application.myapp</DependentUpon>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Resources.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="My Project\Settings.Designer.vb">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="ScreenEx.vb" />
|
||||||
|
<Compile Include="StringEx.vb" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="My Project\Resources.resx">
|
||||||
|
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||||
|
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="My Project\Application.myapp">
|
||||||
|
<Generator>MyApplicationCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="My Project\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<CustomToolNamespace>My</CustomToolNamespace>
|
||||||
|
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="README.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<PostBuildEvent>powershell.exe -command "& { &'$(SolutionDir)copy-binary.ps1' '$(TargetPath)' '$(TargetFileName)' '$(ConfigurationName)' '$(ProjectName)' }"</PostBuildEvent>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
163
MigrationBackup/56f77a37/Base/NuGetUpgradeLog.html
Normal file
163
MigrationBackup/56f77a37/Base/NuGetUpgradeLog.html
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<!-- saved from url=(0014)about:internet -->
|
||||||
|
|
||||||
|
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="NuGetUpgradeReportTitle">
|
||||||
|
NuGetMigrationLog
|
||||||
|
</title><style>
|
||||||
|
|
||||||
|
/* Body style, for the entire document */
|
||||||
|
body
|
||||||
|
{
|
||||||
|
background: #F3F3F4;
|
||||||
|
color: #1E1E1F;
|
||||||
|
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header1 style, used for the main title */
|
||||||
|
h1
|
||||||
|
{
|
||||||
|
padding: 10px 0px 10px 10px;
|
||||||
|
font-size: 21pt;
|
||||||
|
background-color: #E2E2E2;
|
||||||
|
border-bottom: 1px #C1C1C2 solid;
|
||||||
|
color: #201F20;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header2 style, used for "Overview" and other sections */
|
||||||
|
h2
|
||||||
|
{
|
||||||
|
font-size: 18pt;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 15px 0 5px 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header3 style, used for sub-sections, such as project name */
|
||||||
|
h3
|
||||||
|
{
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15pt;
|
||||||
|
margin: 0;
|
||||||
|
padding: 15px 0 5px 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-text
|
||||||
|
{
|
||||||
|
margin: 0px 0 0.75em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Color all hyperlinks one color */
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: #1382CE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table styles */
|
||||||
|
table
|
||||||
|
{
|
||||||
|
border-spacing: 0 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-size: 11pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table th
|
||||||
|
{
|
||||||
|
background: #E7E7E8;
|
||||||
|
text-align: left;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 3px 6px 3px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td
|
||||||
|
{
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 3px 6px 5px 5px;
|
||||||
|
margin: 0px;
|
||||||
|
border: 1px solid #E7E7E8;
|
||||||
|
background: #F7F7F8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
|
||||||
|
.localLink
|
||||||
|
{
|
||||||
|
color: #1E1E1F;
|
||||||
|
background: #EEEEED;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.localLink:hover
|
||||||
|
{
|
||||||
|
color: #1382CE;
|
||||||
|
background: #FFFF99;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issueCell
|
||||||
|
{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.packageIssue
|
||||||
|
{
|
||||||
|
margin-left: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Padding around the content after the h1 */
|
||||||
|
#content
|
||||||
|
{
|
||||||
|
padding: 0px 20px 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issues table
|
||||||
|
{
|
||||||
|
width: 97%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All Icons */
|
||||||
|
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
|
||||||
|
{
|
||||||
|
min-width:18px;
|
||||||
|
min-height:18px;
|
||||||
|
background-repeat:no-repeat;
|
||||||
|
background-position:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.IconSuccessEncoded
|
||||||
|
{
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
.IconInfoEncoded
|
||||||
|
{
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
.IconWarningEncoded
|
||||||
|
{
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
|
||||||
|
}
|
||||||
|
|
||||||
|
.IconErrorEncoded
|
||||||
|
{
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style></head><body><h1>
|
||||||
|
NuGet Migration Report - Base</h1><div id="content"><h2 _locID="OverviewTitle">Overview</h2><div class="info-text">Migration to PackageReference was completed successfully. Please build and run your solution to verify that all packages are available.</div><div class="info-text">
|
||||||
|
If you run into any problems, have feedback, questions, or concerns, please
|
||||||
|
<a href="https://github.com/NuGet/Home/issues/">file an issue on the NuGet GitHub repository.</a></div><div class="info-text">
|
||||||
|
Changed files and this report have been backed up here:
|
||||||
|
<a href="E:\SchreiberM\Visual Studio\GIT\2_DLL Projekte\DDModules\MigrationBackup\56f77a37\Base">E:\SchreiberM\Visual Studio\GIT\2_DLL Projekte\DDModules\MigrationBackup\56f77a37\Base</a></div><div class="info-text"><a href="https://aka.ms/nuget-pc2pr-migrator-rollback">Help me rollback to packages.config</a></div><h2 _locID="PackagesTitle">Packages processed</h2><h3 _locID="IncludePackagesTitle">Top-level dependencies:</h3><div class="issues"><table><tr><th class="issueCell">Package Id</th><th>Version</th></tr><tr><td class="issueCell"><span>NLog</span></td><td><span>
|
||||||
|
v5.0.5</span></td></tr><tr><td class="issueCell"><span>NuGet.CommandLine</span></td><td><span>
|
||||||
|
v6.13.2</span></td></tr></table></div><p /><h3 _locID="IncludePackagesTitle">Transitive dependencies:</h3><div class="issues"><table><tr><th class="issueCell">Package Id</th><th>Version</th></tr><tr><td class="issueCell">
|
||||||
|
No transitive dependencies found.
|
||||||
|
</td><td /></tr></table></div><h2 _locID="IssuesTitle">Package compatibility issues</h2><div class="issues"><table><tr><th /><th class="issueCell" _locID="DescriptionTableHeader">Description</th></tr><tr><td class="IconInfoEncoded" /><td class="issueCell">
|
||||||
|
No issues were found.
|
||||||
|
</td></tr></table></div></div></body></html>
|
||||||
5
MigrationBackup/56f77a37/Base/packages.config
Normal file
5
MigrationBackup/56f77a37/Base/packages.config
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="NLog" version="5.0.5" targetFramework="net462" />
|
||||||
|
<package id="NuGet.CommandLine" version="6.13.2" targetFramework="net462" developmentDependency="true" />
|
||||||
|
</packages>
|
||||||
@@ -16,6 +16,9 @@ EndProject
|
|||||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Interfaces", "Interfaces\Interfaces.vbproj", "{AB6F09BF-E794-4F6A-94BB-C97C0BA84D64}"
|
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Interfaces", "Interfaces\Interfaces.vbproj", "{AB6F09BF-E794-4F6A-94BB-C97C0BA84D64}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Jobs", "Jobs\Jobs.vbproj", "{39EC839A-3C30-4922-A41E-6B09D1DDE5C3}"
|
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Jobs", "Jobs\Jobs.vbproj", "{39EC839A-3C30-4922-A41E-6B09D1DDE5C3}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{AB6F09BF-E794-4F6A-94BB-C97C0BA84D64} = {AB6F09BF-E794-4F6A-94BB-C97C0BA84D64}
|
||||||
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "License", "License\License.vbproj", "{5EBACBFA-F11A-4BBF-8D02-91461F2293ED}"
|
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "License", "License\License.vbproj", "{5EBACBFA-F11A-4BBF-8D02-91461F2293ED}"
|
||||||
EndProject
|
EndProject
|
||||||
@@ -35,6 +38,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Messaging", "Messaging\Mess
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Database.Test", "Database.Test\Database.Test.vbproj", "{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}"
|
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Database.Test", "Database.Test\Database.Test.vbproj", "{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Filesystem", "Filesystem\Filesystem.vbproj", "{991D0231-4623-496D-8BD0-9CA906029CBC}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -105,6 +110,10 @@ Global
|
|||||||
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{91B4DFC0-543C-43A7-A9E0-6817DCA277EC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{991D0231-4623-496D-8BD0-9CA906029CBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{991D0231-4623-496D-8BD0-9CA906029CBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{991D0231-4623-496D-8BD0-9CA906029CBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{991D0231-4623-496D-8BD0-9CA906029CBC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ Namespace Modules
|
|||||||
Public Const INT_VALUE_DOMAIN = "DOMAIN"
|
Public Const INT_VALUE_DOMAIN = "DOMAIN"
|
||||||
Public Const INT_VALUE_DATE = "DATE"
|
Public Const INT_VALUE_DATE = "DATE"
|
||||||
|
|
||||||
|
Public Const INT_VALUE_FILENAME_EXT = "FILENAME_EXT"
|
||||||
|
Public Const INT_VALUE_FILENAME = "FILENAME_ONLY"
|
||||||
|
Public Const INT_VALUE_FILE_DATE = "FILE_DATE"
|
||||||
|
Public Const INT_VALUE_FILEEXT = "FILE_EXT"
|
||||||
|
|
||||||
Public Const INT_VALUE_DATE_YYYY = "YYYY"
|
Public Const INT_VALUE_DATE_YYYY = "YYYY"
|
||||||
Public Const INT_VALUE_DATE_MM = "MM"
|
Public Const INT_VALUE_DATE_MM = "MM"
|
||||||
Public Const INT_VALUE_DATE_DD = "DD"
|
Public Const INT_VALUE_DATE_DD = "DD"
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ Imports System.Runtime.InteropServices
|
|||||||
|
|
||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Patterns")>
|
<Assembly: AssemblyTitle("DigitalData.Patterns")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Enthält die Digital Data Struktur von Patterns die zum Ersetzen innerhalb der DD Produkte dienen")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Patterns")>
|
<Assembly: AssemblyProduct("DigitalData.Patterns")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2022")>
|
<Assembly: AssemblyCopyright("")>
|
||||||
<Assembly: AssemblyTrademark("1.3.0.0")>
|
<Assembly: AssemblyTrademark("")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.3.0.0")>
|
<Assembly: AssemblyVersion("1.3.1.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.3.0.0")>
|
<Assembly: AssemblyFileVersion("1.3.1.0")>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
Imports System.Text.RegularExpressions
|
Imports System.IO
|
||||||
|
Imports System.Text.RegularExpressions
|
||||||
Imports System.Windows.Forms
|
Imports System.Windows.Forms
|
||||||
Imports DigitalData.Modules.Logging
|
Imports DigitalData.Modules.Logging
|
||||||
Imports DigitalData.Modules.ZooFlow
|
Imports DigitalData.Modules.ZooFlow
|
||||||
@@ -36,10 +37,21 @@ Public Class ClassPatterns
|
|||||||
Public Const INT_VALUE_DOMAIN = "DOMAIN"
|
Public Const INT_VALUE_DOMAIN = "DOMAIN"
|
||||||
Public Const INT_VALUE_DATE = "DATE"
|
Public Const INT_VALUE_DATE = "DATE"
|
||||||
|
|
||||||
|
Public Const INT_VALUE_FILENAME_EXT = "FILENAME_EXT"
|
||||||
|
Public Const INT_VALUE_FILENAME = "FILENAME"
|
||||||
|
Public Const INT_VALUE_FILEEXT = "FILE_EXT"
|
||||||
|
Public Const INT_VALUE_FILE_DATE = "FILE_DATE"
|
||||||
|
|
||||||
|
|
||||||
Public Const CLIPBOARD_VALUE_DE = "@Zwischenablage"
|
Public Const CLIPBOARD_VALUE_DE = "@Zwischenablage"
|
||||||
Public Const CLIPBOARD_VALUE_EN = "@Clipboard"
|
Public Const CLIPBOARD_VALUE_EN = "@Clipboard"
|
||||||
|
|
||||||
|
Public Const PATTERN_WMDOCID = "{@WMDocID}"
|
||||||
|
Public Const PATTERN_IDBOBJID = "{@IDBObjID}"
|
||||||
|
|
||||||
|
|
||||||
Public Const MAX_TRY_COUNT = 100
|
Public Const MAX_TRY_COUNT = 100
|
||||||
|
Public _handled_File As String = Nothing
|
||||||
|
|
||||||
Public ReadOnly Property PatternRegex As Regex
|
Public ReadOnly Property PatternRegex As Regex
|
||||||
Get
|
Get
|
||||||
@@ -51,7 +63,7 @@ Public Class ClassPatterns
|
|||||||
Private ReadOnly _LogConfig As LogConfig
|
Private ReadOnly _LogConfig As LogConfig
|
||||||
|
|
||||||
Private ReadOnly _Regex As Regex = New Regex("{#(\w+)#([\w\s_-]+)}+")
|
Private ReadOnly _Regex As Regex = New Regex("{#(\w+)#([\w\s_-]+)}+")
|
||||||
Private ReadOnly _AllPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL, PATTERN_USER, PATTERN_INT}
|
Private ReadOnly _AllPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL, PATTERN_USER, PATTERN_INT, PATTERN_WMDOCID, PATTERN_IDBOBJID}
|
||||||
Private ReadOnly _ComplexPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL}
|
Private ReadOnly _ComplexPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL}
|
||||||
Private ReadOnly _SimplePatterns As New List(Of String) From {PATTERN_USER, PATTERN_INT}
|
Private ReadOnly _SimplePatterns As New List(Of String) From {PATTERN_USER, PATTERN_INT}
|
||||||
|
|
||||||
@@ -67,12 +79,13 @@ Public Class ClassPatterns
|
|||||||
_Logger = pLogConfig.GetLogger
|
_Logger = pLogConfig.GetLogger
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Public Function ReplaceAllValues(pInput As String, pUser As State.UserState, pClipboardContents As String) As String
|
Public Function ReplaceAllValues(pInput As String, pUser As State.UserState, pClipboardContents As String, pObjectID As String) As String
|
||||||
Try
|
Try
|
||||||
Dim result = pInput
|
Dim result = pInput
|
||||||
|
|
||||||
result = ReplaceClipboardContents(result, pClipboardContents)
|
result = ReplaceClipboardContents(result, pClipboardContents)
|
||||||
result = ReplaceInternalValues(result)
|
result = ReplaceInternalValues(result)
|
||||||
|
result = ReplaceObjectIDValues(result, pObjectID)
|
||||||
result = ReplaceUserValues(result, pUser)
|
result = ReplaceUserValues(result, pUser)
|
||||||
|
|
||||||
Return result
|
Return result
|
||||||
@@ -95,6 +108,13 @@ Public Class ClassPatterns
|
|||||||
|
|
||||||
Return oResult
|
Return oResult
|
||||||
End Function
|
End Function
|
||||||
|
Public Function ReplaceObjectIDValues(pInput As String, pObjectID As String) As String
|
||||||
|
Dim oResult = pInput
|
||||||
|
|
||||||
|
oResult = oResult.Replace(CLIPBOARD_VALUE_DE, pObjectID)
|
||||||
|
|
||||||
|
Return oResult
|
||||||
|
End Function
|
||||||
|
|
||||||
Public Function ReplaceInternalValues(pInput As String) As String
|
Public Function ReplaceInternalValues(pInput As String) As String
|
||||||
Try
|
Try
|
||||||
@@ -120,6 +140,45 @@ Public Class ClassPatterns
|
|||||||
oResult = ReplacePattern(oResult, PATTERN_INT, Now.ToShortDateString)
|
oResult = ReplacePattern(oResult, PATTERN_INT, Now.ToShortDateString)
|
||||||
End While
|
End While
|
||||||
|
|
||||||
|
While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_FILENAME_EXT)
|
||||||
|
If Not IsNothing(_handled_File) Then
|
||||||
|
If File.Exists(_handled_File) Then
|
||||||
|
Dim oFileName As String = Path.GetFileName(_handled_File)
|
||||||
|
oResult = ReplacePattern(oResult, PATTERN_INT, oFileName)
|
||||||
|
End If
|
||||||
|
|
||||||
|
End If
|
||||||
|
|
||||||
|
End While
|
||||||
|
|
||||||
|
While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_FILENAME)
|
||||||
|
If Not IsNothing(_handled_File) Then
|
||||||
|
If File.Exists(_handled_File) Then
|
||||||
|
Dim oFileName As String = Path.GetFileNameWithoutExtension(_handled_File)
|
||||||
|
oResult = ReplacePattern(oResult, PATTERN_INT, oFileName)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End While
|
||||||
|
While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_FILEEXT)
|
||||||
|
If Not IsNothing(_handled_File) Then
|
||||||
|
If File.Exists(_handled_File) Then
|
||||||
|
Dim oFileExt As String = Path.GetExtension(_handled_File).Substring(1)
|
||||||
|
oResult = ReplacePattern(oResult, PATTERN_INT, oFileExt)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End While
|
||||||
|
While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_FILE_DATE)
|
||||||
|
If Not IsNothing(_handled_File) Then
|
||||||
|
If File.Exists(_handled_File) Then
|
||||||
|
Dim oCreationDate As DateTime = File.GetCreationTime(_handled_File)
|
||||||
|
Dim oDateOnlyString As String = oCreationDate.ToString("yyyy-MM-dd")
|
||||||
|
oResult = ReplacePattern(oResult, PATTERN_INT, oDateOnlyString)
|
||||||
|
End If
|
||||||
|
End If
|
||||||
|
End While
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Return oResult
|
Return oResult
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
_Logger.Error(ex)
|
_Logger.Error(ex)
|
||||||
|
|||||||
@@ -53,8 +53,11 @@
|
|||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\..\DDMonorepo\Controls.LookupGrid\bin\Debug\DigitalData.Controls.LookupGrid.dll</HintPath>
|
<HintPath>..\..\DDMonorepo\Controls.LookupGrid\bin\Debug\DigitalData.Controls.LookupGrid.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="DigitalData.Modules.Logging, Version=2.6.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\DigitalData.Modules.Logging.2.6.5\lib\net462\DigitalData.Modules.Logging.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Interop.WINDREAMLib">
|
<Reference Include="Interop.WINDREAMLib">
|
||||||
<HintPath>P:\Visual Studio Projekte\Bibliotheken\windream\Interop.WINDREAMLib.dll</HintPath>
|
<HintPath>M:\Bibliotheken\3rdParty\windream\Interop.WINDREAMLib.dll</HintPath>
|
||||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
@@ -142,10 +145,6 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
|
||||||
<Project>{903b2d7d-3b80-4be9-8713-7447b704e1b0}</Project>
|
|
||||||
<Name>Logging</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\ZooFlow\ZooFlow.vbproj">
|
<ProjectReference Include="..\ZooFlow\ZooFlow.vbproj">
|
||||||
<Project>{81cac44f-3711-4c8f-ae98-e02a7448782a}</Project>
|
<Project>{81cac44f-3711-4c8f-ae98-e02a7448782a}</Project>
|
||||||
<Name>ZooFlow</Name>
|
<Name>ZooFlow</Name>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="DigitalData.Modules.Logging" version="2.6.5" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="NuGet.CommandLine" version="6.13.2" targetFramework="net462" developmentDependency="true" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -8,12 +8,12 @@ Imports System.Runtime.InteropServices
|
|||||||
|
|
||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Windows")>
|
<Assembly: AssemblyTitle("Modules.Windows")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Stellt Funktionen für windows und Hotkeys bereit")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH, Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Windows")>
|
<Assembly: AssemblyProduct("Modules.Windows")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2022")>
|
<Assembly: AssemblyCopyright("")>
|
||||||
<Assembly: AssemblyTrademark("1.5.0.0")>
|
<Assembly: AssemblyTrademark("")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.5.0.0")>
|
<Assembly: AssemblyVersion("1.5.1.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.5.0.0")>
|
<Assembly: AssemblyFileVersion("1.5.1.0")>
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
<OptionExplicit>On</OptionExplicit>
|
<OptionExplicit>On</OptionExplicit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OptionCompare>Binary</OptionCompare>
|
<OptionCompare>Text</OptionCompare>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OptionStrict>Off</OptionStrict>
|
<OptionStrict>Off</OptionStrict>
|
||||||
@@ -45,9 +45,17 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="Microsoft.Office.Interop.Outlook">
|
||||||
|
<HintPath>M:\Bibliotheken\3rdParty\Office\Microsoft.Office.Interop.Outlook.dll</HintPath>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</Reference>
|
||||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="OFFICE">
|
||||||
|
<HintPath>M:\Bibliotheken\3rdParty\Office\OFFICE.DLL</HintPath>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</Reference>
|
||||||
<Reference Include="PresentationCore" />
|
<Reference Include="PresentationCore" />
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
@@ -139,29 +147,11 @@
|
|||||||
<Name>Base</Name>
|
<Name>Base</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Logging\Logging.vbproj">
|
<ProjectReference Include="..\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>
|
<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">
|
<COMReference Include="stdole">
|
||||||
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
|
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
|
||||||
<VersionMajor>2</VersionMajor>
|
<VersionMajor>2</VersionMajor>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="DigitalData.Modules.Logging" version="2.6.5" targetFramework="net462" />
|
||||||
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
<package id="NLog" version="5.0.5" targetFramework="net461" />
|
||||||
|
<package id="NuGet.CommandLine" version="6.13.2" targetFramework="net462" developmentDependency="true" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
Public Const HISTORY_NEW_FROM_VERSION = "HISTORY_New_From_Version"
|
Public Const HISTORY_NEW_FROM_VERSION = "HISTORY_New_From_Version"
|
||||||
Public Const HISTORY_USER_DEFINED = "HISTORY_User_Defined"
|
Public Const HISTORY_USER_DEFINED = "HISTORY_User_Defined"
|
||||||
|
|
||||||
|
|
||||||
' Entity Types
|
' Entity Types
|
||||||
Public Const ENTITY_TYPE_OBJECTTYPE = 10
|
Public Const ENTITY_TYPE_OBJECTTYPE = 10
|
||||||
|
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
|
|
||||||
' Misc
|
' Misc
|
||||||
Public Const OBJECT_TYPE_DEFAULT = "Standard"
|
Public Const OBJECT_TYPE_DEFAULT = "Standard"
|
||||||
|
Public Const DELETE_ATTRIBUTE_VALUE = "DeleteWMAttributeValue"
|
||||||
|
|
||||||
' File Stream
|
' File Stream
|
||||||
Public Const STREAM_BINARY_OBJECT = "BinaryObject"
|
Public Const STREAM_BINARY_OBJECT = "BinaryObject"
|
||||||
|
|||||||
@@ -16,63 +16,206 @@ Public Class Helpers
|
|||||||
}
|
}
|
||||||
|
|
||||||
Friend Shared Function ConvertVectorType(pIndexType As Integer, pValue As String)
|
Friend Shared Function ConvertVectorType(pIndexType As Integer, pValue As String)
|
||||||
Dim myArray
|
Dim myArray()
|
||||||
ReDim myArray(0)
|
ReDim myArray(0)
|
||||||
Select Case pIndexType
|
Select Case pIndexType
|
||||||
Case INDEX_TYPE_HASH ' 36865
|
Case INDEX_TYPE_HASH ' 36865
|
||||||
'Umwandeln in String
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CStr(pValue)
|
Return String.Empty
|
||||||
Return myArray
|
Else
|
||||||
|
'Umwandeln in String
|
||||||
|
myArray(0) = CStr(pValue)
|
||||||
|
End If
|
||||||
Case INDEX_TYPE_VECTOR_STRING '4097
|
Case INDEX_TYPE_VECTOR_STRING '4097
|
||||||
'Umwandeln in String
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CStr(pValue)
|
Return String.Empty
|
||||||
Return myArray
|
Else
|
||||||
Case 8204 'auch INDEX_TYPE_VECTOR_STRING
|
'Umwandeln in String
|
||||||
'Umwandeln in String
|
myArray(0) = CStr(pValue)
|
||||||
myArray(0) = CStr(pValue)
|
End If
|
||||||
Return myArray
|
|
||||||
Case INDEX_TYPE_VECTOR_INTEGER '4098
|
Case INDEX_TYPE_VECTOR_INTEGER '4098
|
||||||
'Umwandeln in Integer
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CInt(pValue.Replace(" ", ""))
|
Return Nothing
|
||||||
Return myArray
|
Else
|
||||||
|
'Umwandeln in Integer
|
||||||
|
myArray(0) = CInt(pValue.Replace(" ", ""))
|
||||||
|
End If
|
||||||
Case INDEX_TYPE_VECTOR_FLOAT '4099
|
Case INDEX_TYPE_VECTOR_FLOAT '4099
|
||||||
pValue = pValue.
|
pValue = pValue.
|
||||||
Replace(" ", "").
|
Replace(" ", "").
|
||||||
Replace(".", ",")
|
Replace(".", ",")
|
||||||
'Umwandeln in Double
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CDbl(pValue)
|
Return Nothing
|
||||||
Return myArray
|
Else
|
||||||
|
'Umwandeln in Double
|
||||||
|
myArray(0) = CDbl(pValue)
|
||||||
|
End If
|
||||||
Case INDEX_TYPE_VECTOR_BOOLEAN '4100
|
Case INDEX_TYPE_VECTOR_BOOLEAN '4100
|
||||||
'Umwandeln in Boolean
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CBool(pValue)
|
Return Nothing
|
||||||
Return myArray
|
Else
|
||||||
|
'Umwandeln in Boolean
|
||||||
|
myArray(0) = CBool(pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
Case INDEX_TYPE_VECTOR_DATE '4101
|
Case INDEX_TYPE_VECTOR_DATE '4101
|
||||||
'Umwandeln in Date
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
myArray(0) = CDate(pValue)
|
Return Nothing
|
||||||
Return myArray
|
Else
|
||||||
|
'Umwandeln in Date
|
||||||
|
myArray(0) = CDate(pValue)
|
||||||
|
End If
|
||||||
Case INDEX_TYPE_VECTOR_INTEGER_64BIT '4107
|
Case INDEX_TYPE_VECTOR_INTEGER_64BIT '4107
|
||||||
myArray(0) = Convert.ToInt64(pValue)
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
Return myArray
|
Return Nothing
|
||||||
|
Else
|
||||||
|
'Umwandeln in Date
|
||||||
|
myArray(0) = Convert.ToInt64(pValue)
|
||||||
|
End If
|
||||||
Case INDEX_TYPE_VECTOR_DATE_TIME '4103
|
Case INDEX_TYPE_VECTOR_DATE_TIME '4103
|
||||||
'Umwandeln in Datum Uhrzeit
|
Return Convert.ToDateTime(pValue)
|
||||||
Return pValue
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
'Umwandeln in Date
|
||||||
|
myArray(0) = Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
Case 8204
|
Case 8204
|
||||||
'Umwandeln in Integer
|
pValue = pValue.Replace(" ", "")
|
||||||
myArray(0) = CInt(pValue.Replace(" ", ""))
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
Return myArray
|
Return Nothing
|
||||||
|
Else
|
||||||
|
'Umwandeln in Integer
|
||||||
|
myArray(0) = CInt(pValue.Replace(" ", ""))
|
||||||
|
End If
|
||||||
Case Else
|
Case Else
|
||||||
'Umwandeln in String
|
'Umwandeln in String
|
||||||
myArray(0) = CStr(pValue)
|
myArray(0) = CStr(pValue)
|
||||||
Return myArray
|
|
||||||
End Select
|
End Select
|
||||||
|
Return myArray
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Friend Shared Function ConvertIndexValue(Type As Integer, pValue As String) As Object
|
Friend Shared Function ConvertIndexValue(Type As Integer, pValue As String) As Object
|
||||||
' Leerzeichen an Anfang und Ende entfernen
|
|
||||||
|
pValue = pValue.Trim()
|
||||||
If Type > 4095 Then
|
If Type > 4095 Then
|
||||||
Return ConvertVectorType(Type, pValue)
|
Return ConvertVectorType(Type, pValue)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
|
|
||||||
|
Select Case Type
|
||||||
|
Case INDEX_TYPE_HASH
|
||||||
|
Return pValue
|
||||||
|
Case INDEX_TYPE_STRING
|
||||||
|
' Leerzeichen an Anfang und Ende entfernen
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return String.Empty
|
||||||
|
Else
|
||||||
|
Return pValue
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case INDEX_TYPE_VECTOR_STRING
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return String.Empty
|
||||||
|
Else
|
||||||
|
Return pValue
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_INTEGER
|
||||||
|
pValue = pValue.Replace(" ", String.Empty)
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToInt32(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_VECTOR_INTEGER
|
||||||
|
pValue = pValue.Replace(" ", String.Empty)
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToInt32(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_VECTOR_INTEGER_64BIT
|
||||||
|
pValue = pValue.Replace(" ", String.Empty)
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToInt64(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_VECTOR_BOOLEAN
|
||||||
|
Return Convert.ToBoolean(pValue)
|
||||||
|
Case INDEX_TYPE_BOOLEAN
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToBoolean(pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case INDEX_TYPE_DATE
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case INDEX_TYPE_DATE_TIME
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_TIME
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_VECTOR_DATE_TIME
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_VECTOR_DATE
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDateTime(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_FLOAT
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDouble(pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case INDEX_TYPE_VECTOR_FLOAT
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
Return Convert.ToDouble(pValue)
|
||||||
|
End If
|
||||||
|
Case INDEX_TYPE_CURRENCY
|
||||||
|
If pValue = DELETE_ATTRIBUTE_VALUE Then
|
||||||
|
Return Nothing
|
||||||
|
Else
|
||||||
|
'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden
|
||||||
|
Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(pValue))
|
||||||
|
Return aValueWrapper
|
||||||
|
End If
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
Return pValue
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Friend Shared Function ConvertAttrValue(Type As Integer, pValue As String) As Object
|
||||||
|
' Leerzeichen an Anfang und Ende entfernen
|
||||||
pValue = pValue.Trim()
|
pValue = pValue.Trim()
|
||||||
|
If Type > 4095 Then
|
||||||
|
Return ConvertVectorType1(Type, pValue)
|
||||||
|
End If
|
||||||
|
|
||||||
|
|
||||||
Select Case Type
|
Select Case Type
|
||||||
Case INDEX_TYPE_HASH
|
Case INDEX_TYPE_HASH
|
||||||
@@ -116,7 +259,42 @@ Public Class Helpers
|
|||||||
Return pValue
|
Return pValue
|
||||||
End Select
|
End Select
|
||||||
End Function
|
End Function
|
||||||
|
Friend Shared Function ConvertVectorType1(pIndexType As Integer, pValue As String)
|
||||||
|
Select Case pIndexType
|
||||||
|
Case INDEX_TYPE_HASH ' 36865
|
||||||
|
'Umwandeln in String
|
||||||
|
Return CStr(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_STRING '4097
|
||||||
|
'Umwandeln in String
|
||||||
|
Return CStr(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_INTEGER '4098
|
||||||
|
'Umwandeln in Integer
|
||||||
|
Return CInt(pValue.Replace(" ", ""))
|
||||||
|
Case INDEX_TYPE_VECTOR_FLOAT '4099
|
||||||
|
pValue = pValue.
|
||||||
|
Replace(" ", "").
|
||||||
|
Replace(".", ",")
|
||||||
|
'Umwandeln in Double
|
||||||
|
Return CDbl(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_BOOLEAN '4100
|
||||||
|
'Umwandeln in Boolean
|
||||||
|
Return CBool(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_DATE '4101
|
||||||
|
'Umwandeln in Date
|
||||||
|
Return CDate(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_INTEGER_64BIT '4107
|
||||||
|
Return Convert.ToInt64(pValue)
|
||||||
|
Case INDEX_TYPE_VECTOR_DATE_TIME '4103
|
||||||
|
'Umwandeln in Datum Uhrzeit
|
||||||
|
Return pValue
|
||||||
|
Case 8204
|
||||||
|
'Umwandeln in Integer
|
||||||
|
Return CInt(pValue.Replace(" ", ""))
|
||||||
|
Case Else
|
||||||
|
'Umwandeln in String
|
||||||
|
Return CStr(pValue)
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
Friend Shared Function IsVectorIndex(indexType As Integer)
|
Friend Shared Function IsVectorIndex(indexType As Integer)
|
||||||
Return VectorIndicies.Contains(indexType)
|
Return VectorIndicies.Contains(indexType)
|
||||||
End Function
|
End Function
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ Imports System.Runtime.InteropServices
|
|||||||
' Werte der Assemblyattribute überprüfen
|
' Werte der Assemblyattribute überprüfen
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("Modules.Windream")>
|
<Assembly: AssemblyTitle("Modules.Windream")>
|
||||||
<Assembly: AssemblyDescription("")>
|
<Assembly: AssemblyDescription("Stellt Funktionen und Module für die windream Funktionalität zur Verfügung")>
|
||||||
<Assembly: AssemblyCompany("")>
|
<Assembly: AssemblyCompany("Digital Data GmbH. Heuchelheim")>
|
||||||
<Assembly: AssemblyProduct("Modules.Windream")>
|
<Assembly: AssemblyProduct("Modules.Windream")>
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2023")>
|
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||||
<Assembly: AssemblyTrademark("1.9.2.0")>
|
<Assembly: AssemblyTrademark("")>
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
<Assembly: ComVisible(False)>
|
||||||
|
|
||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' übernehmen, indem Sie "*" eingeben:
|
' übernehmen, indem Sie "*" eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("1.9.5.1")>
|
<Assembly: AssemblyVersion("1.9.8.0")>
|
||||||
<Assembly: AssemblyFileVersion("1.9.5.1")>
|
<Assembly: AssemblyFileVersion("1.9.8.0")>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user