From a9f48c2830faabe73e39bdc13c33b3b0251d2936 Mon Sep 17 00:00:00 2001 From: aorzelskiGH Date: Mon, 21 Aug 2023 09:51:09 +0200 Subject: [PATCH] Download files Load files from package or from remote --- .gitignore | 4 + src/AasxCsharpLibrary/AdminShellPackageEnv.cs | 98 +++++++++++++++++++ .../AnyUI/AnyUiMagickHelper.cs | 4 +- .../Controllers/ImageController.cs | 16 ++- src/BlazorExplorer/proxy.txt | 1 + .../Properties/AssemblyInfo.cs | 12 +-- src/WpfMtpControl/Properties/AssemblyInfo.cs | 12 +-- .../Properties/AssemblyInfo.cs | 12 +-- src/WpfXamlTool/Properties/AssemblyInfo.cs | 12 +-- 9 files changed, 143 insertions(+), 28 deletions(-) create mode 100644 src/BlazorExplorer/proxy.txt diff --git a/.gitignore b/.gitignore index 7ecbcdd4..931ac6ba 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,7 @@ sample-aasx/ /.vs/aasx-package-explorer/v16/.suo /.vs/slnx.sqlite /.vs/aasx-package-explorer/v17/.suo +/src/WpfXamlTool/Properties/AssemblyInfo.cs +/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs +/src/WpfMtpControl/Properties/AssemblyInfo.cs +/src/MsaglWpfControl/Properties/AssemblyInfo.cs diff --git a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs index 5315aa1e..dfe265e9 100644 --- a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs +++ b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs @@ -9,15 +9,19 @@ This source code may use other Open Source software components (see LICENSE.txt) using Extensions; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.IO.Packaging; using System.Linq; +using System.Net; +using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; +using static AasCore.Aas3_0.Reporting; namespace AdminShellNS { @@ -1155,8 +1159,102 @@ public bool IsLocalFile(string uriString) return isLocal; } + private static WebProxy proxy = null; + public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) { + // Check, if remote + if (uriString.ToLower().Substring(0, 4) == "http") + { + if (proxy == null) + { + string proxyAddress = ""; + string username = ""; + string password = ""; + + string proxyFile = "proxy.txt"; + if (System.IO.File.Exists(proxyFile)) + { + try + { // Open the text file using a stream reader. + using (StreamReader sr = new StreamReader(proxyFile)) + { + proxyFile = sr.ReadLine(); + } + } + catch (IOException e) + { + Console.WriteLine("proxy.txt could not be read:"); + Console.WriteLine(e.Message); + } + } + + try + { + using (StreamReader sr = new StreamReader(proxyFile)) + { + proxyAddress = sr.ReadLine(); + username = sr.ReadLine(); + password = sr.ReadLine(); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine(proxyFile + " not found!"); + } + + if (proxyAddress != "") + { + proxy = new WebProxy(); + Uri newUri = new Uri(proxyAddress); + proxy.Address = newUri; + proxy.Credentials = new NetworkCredential(username, password); + Console.WriteLine("Using proxy: " + proxyAddress); + } + } + + var handler = new HttpClientHandler(); + + if (proxy != null) + handler.Proxy = proxy; + else + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var hc = new HttpClient(handler); + + var response = hc.GetAsync(uriString).GetAwaiter().GetResult(); + + // if you call response.EnsureSuccessStatusCode here it will throw an exception + if (response.StatusCode == HttpStatusCode.Moved + || response.StatusCode == HttpStatusCode.Found) + { + var location = response.Headers.Location; + response = hc.GetAsync(location).GetAwaiter().GetResult(); + } + + response.EnsureSuccessStatusCode(); + var s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); + + if (s.Length < 500) // indirect load? + { + StreamReader reader = new StreamReader(s); + string json = reader.ReadToEnd(); + var parsed = JObject.Parse(json); + try + { + string url = parsed.SelectToken("url").Value(); + response = hc.GetAsync(url).GetAwaiter().GetResult(); + response.EnsureSuccessStatusCode(); + s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); + } + catch + { + } + } + + return s; + } + // access if (_openPackage == null) throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); diff --git a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs index 705cfd6d..5cbeefae 100644 --- a/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs +++ b/src/AasxIntegrationBaseGdi/AnyUI/AnyUiMagickHelper.cs @@ -124,7 +124,7 @@ public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( try { System.IO.Stream thumbStream = null; - if (true == package?.IsLocalFile(path)) + if (true /*= package?.IsLocalFile(path)*/) thumbStream = package.GetLocalStreamFromPackage(path); else { @@ -133,6 +133,7 @@ public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( var wc = new WebClient(); thumbStream = wc.OpenRead(path); #else + /* // upgrade to HttpClient and follow re-directs var hc = new HttpClient(); var response = hc.GetAsync(path).GetAwaiter().GetResult(); @@ -147,6 +148,7 @@ public static AnyUiBitmapInfo MakePreviewFromPackageOrUrl( response.EnsureSuccessStatusCode(); thumbStream = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); + */ #endif } diff --git a/src/BlazorExplorer/Controllers/ImageController.cs b/src/BlazorExplorer/Controllers/ImageController.cs index c84088e3..d5e53599 100644 --- a/src/BlazorExplorer/Controllers/ImageController.cs +++ b/src/BlazorExplorer/Controllers/ImageController.cs @@ -8,6 +8,7 @@ This source code may use other Open Source software components (see LICENSE.txt) */ using System.Collections.Generic; +using System.Drawing; using System.IO; using System.Reflection; using AnyUi; @@ -50,12 +51,21 @@ public ActionResult Get(string id) .GetExecutingAssembly() .GetManifestResourceStream("BlazorUI.Resources.sample.png")) { - if (stream == null) - return NotFound(); + // if (stream == null) + // return NotFound(); using (MemoryStream ms = new MemoryStream()) { - stream.CopyTo(ms); + if (stream!= null) + { + stream.CopyTo(ms); + } + else + { + var b = new Bitmap(1, 1); + b.SetPixel(0, 0, Color.White); + b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); + } var bb = ms.ToArray(); return base.File(bb, "image/png"); } diff --git a/src/BlazorExplorer/proxy.txt b/src/BlazorExplorer/proxy.txt new file mode 100644 index 00000000..c5a28ea0 --- /dev/null +++ b/src/BlazorExplorer/proxy.txt @@ -0,0 +1 @@ +c:/dat/proxy.dat diff --git a/src/MsaglWpfControl/Properties/AssemblyInfo.cs b/src/MsaglWpfControl/Properties/AssemblyInfo.cs index cdab63cd..6163af16 100644 --- a/src/MsaglWpfControl/Properties/AssemblyInfo.cs +++ b/src/MsaglWpfControl/Properties/AssemblyInfo.cs @@ -32,12 +32,12 @@ [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) )] diff --git a/src/WpfMtpControl/Properties/AssemblyInfo.cs b/src/WpfMtpControl/Properties/AssemblyInfo.cs index 0737c8c4..05f930c8 100644 --- a/src/WpfMtpControl/Properties/AssemblyInfo.cs +++ b/src/WpfMtpControl/Properties/AssemblyInfo.cs @@ -32,12 +32,12 @@ [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) )] diff --git a/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs b/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs index df0947b3..a0aac0e7 100644 --- a/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs +++ b/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs @@ -32,12 +32,12 @@ [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) )] diff --git a/src/WpfXamlTool/Properties/AssemblyInfo.cs b/src/WpfXamlTool/Properties/AssemblyInfo.cs index 34252062..83ac8125 100644 --- a/src/WpfXamlTool/Properties/AssemblyInfo.cs +++ b/src/WpfXamlTool/Properties/AssemblyInfo.cs @@ -32,12 +32,12 @@ [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) + ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) + ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs + //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, + // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) )]