[1.6.0] HttpEndpoint added

This commit is contained in:
BlubbFish 2022-01-09 23:01:53 +01:00
parent 528dcabf59
commit 61f26e69af
7 changed files with 583 additions and 332 deletions

View File

@ -0,0 +1,173 @@
# Changelog
## 1.6.0 - 2022-01-09 - HttpEndpoint added
### New Features
* Add HttpEndpoint
### Bugfixes
### Changes
* Change Readme that its link to the normal repo
* Codingstyles
* Fixing history
## 1.5.0 - 2021-04-10 - Add GetEvent so you can call events by string; Add OwnSingeton class
### New Features
* More allowed Chars for Chapters in inifile
* Add Contribution, Licence and readme
* Adding netcore
* Add changelog
* Filedhelper to helpter
* CmdArgs improvements
* Make netcore to default
* Add OwnSingleton
### Bugfixes
* WriteLine in Programmlogger sometimes make nonesense
* Writeline event are wrong
### Changes
* Remove the binary files
* Move all Classes to subfolder
* Codingstyles
## 1.4.0 - 2018-11-27 - Add Helper to Utils
### New Features
* Add Helper
### Bugfixes
### Changes
## 1.1.3 - 2018-10-02 - Improve CmdArgs
### New Features
* CmdArgs now throw extensions if there is something wrong
### Bugfixes
### Changes
## 1.1.2 - 2018-09-11 - Tiny Codingstyles
### New Features
### Bugfixes
### Changes
* Codingstyles
## 1.1.1 - 2018-05-29 - ProgrammLogger neets to cleanup
### New Features
* Delete the Mess behind
### Bugfixes
### Changes
## 1.1.0 - 2018-05-15 - ProgrammLogger
### New Features
* Add Programmlogger
### Bugfixes
### Changes
* Codingstyles
## 1.0.7.0 - 2018-05-08 - Yet another IniReader improvemnt round again
### New Features
### Bugfixes
### Changes
* Move searchpath to its own function
## 1.0.6.0 - 2017-12-22 - Yet another IniReader improvemnt round
### New Features
* Posibillity to add complete sections to an ini file
### Bugfixes
### Changes
## 1.0.5.2 - 2017-09-26 - And Improve IniReader again
### New Features
* IniReader returns the Sections with or without Brackets now
### Bugfixes
### Changes
## 1.0.5.1 - 2017-09-24 - Improve IniReader again
### New Features
### Bugfixes
* IniReader now supports umlaute
* IniReader matches with Brackets and without
### Changes
## 1.0.5.0 - 2017-08-09 - Improve IniReader
### New Features
* IniReader can now return a whole segemt
### Bugfixes
### Changes
## 1.0.4.1 - 2017-08-08 - Cleanup OwnView
### New Features
### Bugfixes
### Changes
* remove Init from OwnView
## 1.0.4.0 - 2017-04-30 - More Updater
### New Features
* continue Development of Updater
### Bugfixes
### Changes
## 1.0.3.2 - 2017-04-26 - Next Updater
### New Features
* continue Development of Updater
### Bugfixes
### Changes
## 1.0.3.1 - 2017-04-25 - EventArgsHelper
### New Features
* Add EventArgsHelper
### Bugfixes
### Changes
* Codingstyles
* Moves LogEventArgs to EventArgsHelper
* Moves UpdaterEventArgs to EventArgsHelper
## 1.0.2.6 - 2017-04-24 - Better Updater
### New Features
* Add Updater
* Add Disposable Interface
* Using LogEventArgs now for Logging
* Make UpdaterEventArgs as Child of EventArgs
* Updater now using Ownobject as Parent
* Add VersionsInfo to Updater
* Updater spawns a Background Task to Check for Updates
### Bugfixes
### Changes
## 1.0.2.5 - 2017-04-19 - Logging in OwnObject
### New Features
* Add Logging to OwnObject
### Bugfixes
* Avoid nullpointer exception in FileMutex
### Changes
* Codingstyles
## 1.0.2.3 - 2017-04-16 - OwnModel better
### New Features
* Add Remove observer on OwnModel
### Bugfixes
### Changes
* Codingstyles
## 1.0.2.2 - 2017-03-09 - Make it nice
### New Features
### Bugfixes
### Changes
* Codingstyles
## 1.0.2.1 - 2017-03-09 - Filemutex
### New Features
* Add Filemutex
### Bugfixes
* Filelogger backet on wrong pos
### Changes
## 1.0.0.1 - 2016-12-03 - Filelogger improvements
### New Features
* Check Directory and if not exist add it
* Now logs with timestamp
* Can select logdir
* Add Abstract dispose to OwnController
### Bugfixes
### Changes
## 1.0.0.0 - 2015-11-16 - Init
### New Features
* Add CmdArgs, FileLogger, IniReader, OwnController, OwnModel, OwnObject, OwnView,
### Bugfixes
### Changes

View File

@ -43,7 +43,7 @@ namespace BlubbFish.Utils
_ = Directory.CreateDirectory(v); _ = Directory.CreateDirectory(v);
logDir = v; logDir = v;
} }
if (logDir.Substring(logDir.Length - 1) != Path.DirectorySeparatorChar.ToString()) { if (logDir[^1..] != Path.DirectorySeparatorChar.ToString()) {
logDir += Path.DirectorySeparatorChar; logDir += Path.DirectorySeparatorChar;
} }
} }

59
Utils/HttpEndpoint.cs Normal file
View File

@ -0,0 +1,59 @@
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace BlubbFish.Utils {
public class HttpEndpoint {
private readonly HttpClient client = new HttpClient();
private readonly String server = "";
public enum RequestMethod {
GET,
POST,
PUT
}
public HttpEndpoint(String server, String auth = null) {
this.server = server;
if(auth != null) {
this.client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(auth);
}
}
public HttpEndpoint(String server, (String scheme, String parameter) auth) {
this.server = server;
this.client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(auth.scheme, auth.parameter);
}
public async Task<String> RequestString(String address, String json = "", Boolean withoutput = true, RequestMethod method = RequestMethod.GET) {
String ret = null;
try {
HttpResponseMessage response = null;
if(method == RequestMethod.POST || method == RequestMethod.PUT) {
HttpContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
//content.Headers.Add("Content-Type", "application/json");
if(method == RequestMethod.POST) {
response = await this.client.PostAsync(this.server + address, content);
} else if(method == RequestMethod.PUT) {
response = await this.client.PutAsync(this.server + address, content);
}
content.Dispose();
} else if(method == RequestMethod.GET) {
response = await this.client.GetAsync(this.server + address);
}
if(!response.IsSuccessStatusCode) {
throw new Exception(response.StatusCode + ": " + response.ReasonPhrase);
}
if(withoutput && response != null) {
ret = await response.Content.ReadAsStringAsync();
}
} catch(Exception e) {
throw new WebException(String.Format("Error while opening resource: \"{0}\" Method {1} Data {2} Fehler {3}", this.server + address, method, json, e.Message));
}
return ret;
}
}
}

View File

@ -1,261 +1,261 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace BlubbFish.Utils { namespace BlubbFish.Utils {
public class InIReader : IDisposable public class InIReader : IDisposable
{ {
private Dictionary<String, Dictionary<String, String>> inifile; private Dictionary<String, Dictionary<String, String>> inifile;
private readonly FileSystemWatcher k; private readonly FileSystemWatcher k;
private readonly String filename; private readonly String filename;
private static readonly List<String> search_path = new List<String>() { private static readonly List<String> search_path = new List<String>() {
Directory.GetCurrentDirectory() Directory.GetCurrentDirectory()
}; };
private static readonly Dictionary<String, InIReader> instances = new Dictionary<String, InIReader>(); private static readonly Dictionary<String, InIReader> instances = new Dictionary<String, InIReader>();
public static void SetSearchPath(List<String> directorys) => search_path.AddRange(directorys); public static void SetSearchPath(List<String> directorys) => search_path.AddRange(directorys);
public static Boolean ConfigExist(String filename) { public static Boolean ConfigExist(String filename) {
foreach (String path in search_path) { foreach (String path in search_path) {
if (File.Exists(path + Path.DirectorySeparatorChar + filename)) { if (File.Exists(path + Path.DirectorySeparatorChar + filename)) {
return true; return true;
} else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".ini")) { } else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".ini")) {
return true; return true;
} else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".conf")) { } else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".conf")) {
return true; return true;
} }
} }
return false; return false;
} }
private InIReader(String filename) private InIReader(String filename)
{ {
foreach (String path in search_path) { foreach (String path in search_path) {
if (File.Exists(path + Path.DirectorySeparatorChar + filename)) { if (File.Exists(path + Path.DirectorySeparatorChar + filename)) {
this.filename = path + Path.DirectorySeparatorChar + filename; this.filename = path + Path.DirectorySeparatorChar + filename;
this.k = new FileSystemWatcher(path, filename); this.k = new FileSystemWatcher(path, filename);
break; break;
} else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".ini")) { } else if (File.Exists(path + Path.DirectorySeparatorChar + filename + ".ini")) {
this.filename = path + Path.DirectorySeparatorChar + filename + ".ini"; this.filename = path + Path.DirectorySeparatorChar + filename + ".ini";
this.k = new FileSystemWatcher(path, filename + ".ini"); this.k = new FileSystemWatcher(path, filename + ".ini");
break; break;
} else if(File.Exists(path + Path.DirectorySeparatorChar + filename + ".conf")) { } else if(File.Exists(path + Path.DirectorySeparatorChar + filename + ".conf")) {
this.filename = path + Path.DirectorySeparatorChar + filename + ".conf"; this.filename = path + Path.DirectorySeparatorChar + filename + ".conf";
this.k = new FileSystemWatcher(path, filename + ".conf"); this.k = new FileSystemWatcher(path, filename + ".conf");
break; break;
} }
} }
if(this.filename == null) { if(this.filename == null) {
throw new ArgumentException(filename + " not found!"); throw new ArgumentException(filename + " not found!");
} }
this.k.Changed += new FileSystemEventHandler(this.ReadAgain); this.k.Changed += new FileSystemEventHandler(this.ReadAgain);
this.LoadFile(); this.LoadFile();
} }
/// <summary> /// <summary>
/// Gibt eine InIReader-Instanz zu einer Datei zurück /// Gibt eine InIReader-Instanz zu einer Datei zurück
/// </summary> /// </summary>
/// <param name="filename">Dateiname</param> /// <param name="filename">Dateiname</param>
/// <returns></returns> /// <returns></returns>
public static InIReader GetInstance(String filename) public static InIReader GetInstance(String filename)
{ {
if (!instances.Keys.Contains(filename)) { if (!instances.Keys.Contains(filename)) {
instances.Add(filename, new InIReader(filename)); instances.Add(filename, new InIReader(filename));
} }
return instances[filename]; return instances[filename];
} }
private void ReadAgain(Object sender, EventArgs e) => this.LoadFile(); private void ReadAgain(Object sender, EventArgs e) => this.LoadFile();
private void LoadFile() private void LoadFile()
{ {
this.inifile = new Dictionary<String, Dictionary<String, String>>(); this.inifile = new Dictionary<String, Dictionary<String, String>>();
StreamReader file = new StreamReader(this.filename); StreamReader file = new StreamReader(this.filename);
List<String> buf = new List<String>(); List<String> buf = new List<String>();
String fline = ""; String fline = "";
while (fline != null) { while (fline != null) {
fline = file.ReadLine(); fline = file.ReadLine();
if (fline != null && fline.Length > 0 && fline.Substring(0, 1) != ";") { if (fline != null && fline.Length > 0 && fline.Substring(0, 1) != ";") {
buf.Add(fline); buf.Add(fline);
} }
} }
file.Close(); file.Close();
Dictionary<String, String> sub = new Dictionary<String, String>(); Dictionary<String, String> sub = new Dictionary<String, String>();
String cap = ""; String cap = "";
foreach (String line in buf) { foreach (String line in buf) {
Match match = Regex.Match(line, @"^\[[a-zA-ZäöüÄÖÜ0-9\-\._/ ]+\]\w*$", RegexOptions.IgnoreCase); Match match = Regex.Match(line, @"^\[[a-zA-ZäöüÄÖÜ0-9\-\._/ ]+\]\w*$", RegexOptions.IgnoreCase);
if (match.Success) { if (match.Success) {
if (sub.Count != 0 && cap != "") { if (sub.Count != 0 && cap != "") {
this.inifile.Add(cap, sub); this.inifile.Add(cap, sub);
} }
cap = line; cap = line;
sub = new Dictionary<String, String>(); sub = new Dictionary<String, String>();
} else { } else {
if (line != "" && cap != "") { if (line != "" && cap != "") {
String key = line.Substring(0, line.IndexOf('=')); String key = line.Substring(0, line.IndexOf('='));
String value = line.Substring(line.IndexOf('=') + 1); String value = line[(line.IndexOf('=') + 1)..];
sub.Add(key, value); sub.Add(key, value);
} }
} }
} }
if (sub.Count != 0 && cap != "") { if (sub.Count != 0 && cap != "") {
this.inifile.Add(cap, sub); this.inifile.Add(cap, sub);
} }
} }
/// <summary> /// <summary>
/// Gibt eine Liste an Sektionen zurück /// Gibt eine Liste an Sektionen zurück
/// </summary> /// </summary>
/// <param name="withBrackets">Default = true; false, wenn die Liste ohne Klammern sein soll.</param> /// <param name="withBrackets">Default = true; false, wenn die Liste ohne Klammern sein soll.</param>
/// <returns></returns> /// <returns></returns>
public List<String> GetSections(Boolean withBrackets = true) public List<String> GetSections(Boolean withBrackets = true)
{ {
if(withBrackets) { if(withBrackets) {
return this.inifile.Keys.ToList(); return this.inifile.Keys.ToList();
} else { } else {
List<String> ret = new List<String>(); List<String> ret = new List<String>();
foreach (String item in this.inifile.Keys) { foreach (String item in this.inifile.Keys) {
ret.Add(item[1..^1]); ret.Add(item[1..^1]);
} }
return ret; return ret;
} }
} }
/// <summary> /// <summary>
/// Überschreibt eine InI-Datei mit der Kompletten neuen Configuration /// Überschreibt eine InI-Datei mit der Kompletten neuen Configuration
/// </summary> /// </summary>
/// <param name="config">Neue Konfiguration</param> /// <param name="config">Neue Konfiguration</param>
public void SetSections(Dictionary<String, Dictionary<String, String>> config) { public void SetSections(Dictionary<String, Dictionary<String, String>> config) {
this.inifile.Clear(); this.inifile.Clear();
foreach (KeyValuePair<String, Dictionary<String, String>> item in config) { foreach (KeyValuePair<String, Dictionary<String, String>> item in config) {
String key = item.Key; String key = item.Key;
if(!key.StartsWith("[")) { if(!key.StartsWith("[")) {
key = "[" + key + "]"; key = "[" + key + "]";
} }
if (Regex.Match(key, @"^\[[a-zA-ZäöüÄÖÜ0-9\-\._/ ]+\]\w*$", RegexOptions.IgnoreCase).Success) { if (Regex.Match(key, @"^\[[a-zA-ZäöüÄÖÜ0-9\-\._/ ]+\]\w*$", RegexOptions.IgnoreCase).Success) {
this.inifile.Add(key, item.Value); this.inifile.Add(key, item.Value);
} }
} }
this.Changed(); this.Changed();
} }
public Dictionary<String, String> GetSection(String section) => this.inifile.Keys.Contains(section) ? public Dictionary<String, String> GetSection(String section) => this.inifile.Keys.Contains(section) ?
this.inifile[section] : this.inifile.Keys.Contains("[" + section + "]") ? this.inifile[section] : this.inifile.Keys.Contains("[" + section + "]") ?
this.inifile["[" + section + "]"] : new Dictionary<String, String>(); this.inifile["[" + section + "]"] : new Dictionary<String, String>();
/// <summary> /// <summary>
/// Gibt einen einzelnen Wert zurück /// Gibt einen einzelnen Wert zurück
/// </summary> /// </summary>
/// <param name="section">Name der Sektion</param> /// <param name="section">Name der Sektion</param>
/// <param name="key">Name des Wertes</param> /// <param name="key">Name des Wertes</param>
/// <returns></returns> /// <returns></returns>
public String GetValue(String section, String key) public String GetValue(String section, String key)
{ {
if (!section.StartsWith("[")) { if (!section.StartsWith("[")) {
section = "[" + section + "]"; section = "[" + section + "]";
} }
return this.inifile.Keys.Contains(section) && this.inifile[section].Keys.Contains(key) ? this.inifile[section][key] : null; return this.inifile.Keys.Contains(section) && this.inifile[section].Keys.Contains(key) ? this.inifile[section][key] : null;
} }
/// <summary> /// <summary>
/// Setzt einen Wert in einer Sektion /// Setzt einen Wert in einer Sektion
/// </summary> /// </summary>
/// <param name="section">Name der Sektion</param> /// <param name="section">Name der Sektion</param>
/// <param name="key">Name des Wertes</param> /// <param name="key">Name des Wertes</param>
/// <param name="value">Wert</param> /// <param name="value">Wert</param>
public void SetValue(String section, String key, String value) public void SetValue(String section, String key, String value)
{ {
if (!section.StartsWith("[")) { if (!section.StartsWith("[")) {
section = "[" + section + "]"; section = "[" + section + "]";
} }
if (this.inifile.Keys.Contains(section)) { if (this.inifile.Keys.Contains(section)) {
if (this.inifile[section].Keys.Contains(key)) { if (this.inifile[section].Keys.Contains(key)) {
this.inifile[section][key] = value; this.inifile[section][key] = value;
} else { } else {
this.inifile[section].Add(key, value); this.inifile[section].Add(key, value);
} }
} else { } else {
Dictionary<String, String> sub = new Dictionary<String, String> { Dictionary<String, String> sub = new Dictionary<String, String> {
{ key, value } { key, value }
}; };
this.inifile.Add(section, sub); this.inifile.Add(section, sub);
} }
this.Changed(); this.Changed();
} }
private void Changed() private void Changed()
{ {
this.k.Changed -= null; this.k.Changed -= null;
this.SaveSettings(); this.SaveSettings();
this.LoadFile(); this.LoadFile();
this.k.Changed += new FileSystemEventHandler(this.ReadAgain); this.k.Changed += new FileSystemEventHandler(this.ReadAgain);
} }
private void SaveSettings() private void SaveSettings()
{ {
StreamWriter file = new StreamWriter(this.filename); StreamWriter file = new StreamWriter(this.filename);
file.BaseStream.SetLength(0); file.BaseStream.SetLength(0);
file.BaseStream.Flush(); file.BaseStream.Flush();
_ = file.BaseStream.Seek(0, SeekOrigin.Begin); _ = file.BaseStream.Seek(0, SeekOrigin.Begin);
foreach (KeyValuePair<String, Dictionary<String, String>> cap in this.inifile) { foreach (KeyValuePair<String, Dictionary<String, String>> cap in this.inifile) {
file.WriteLine(cap.Key); file.WriteLine(cap.Key);
foreach (KeyValuePair<String, String> sub in cap.Value) { foreach (KeyValuePair<String, String> sub in cap.Value) {
file.WriteLine(sub.Key + "=" + sub.Value); file.WriteLine(sub.Key + "=" + sub.Value);
} }
file.WriteLine(); file.WriteLine();
} }
file.Flush(); file.Flush();
file.Close(); file.Close();
} }
/// <summary> /// <summary>
/// Fügt eine neue Sektion in der Ini-Datei ein. /// Fügt eine neue Sektion in der Ini-Datei ein.
/// </summary> /// </summary>
/// <param name="name">Sektionsname</param> /// <param name="name">Sektionsname</param>
/// <returns>true if added, false if error</returns> /// <returns>true if added, false if error</returns>
public Boolean AddSection(String name) public Boolean AddSection(String name)
{ {
if (!name.StartsWith("[")) { if (!name.StartsWith("[")) {
name = "[" + name + "]"; name = "[" + name + "]";
} }
if (this.inifile.Keys.Contains(name)) { if (this.inifile.Keys.Contains(name)) {
return false; return false;
} }
this.inifile.Add(name, new Dictionary<String, String>()); this.inifile.Add(name, new Dictionary<String, String>());
this.Changed(); this.Changed();
return true; return true;
} }
/// <summary> /// <summary>
/// Löscht eine Sektion inklusive Unterpunkte aus der Ini-Datei. /// Löscht eine Sektion inklusive Unterpunkte aus der Ini-Datei.
/// </summary> /// </summary>
/// <param name="name">Sektionsname</param> /// <param name="name">Sektionsname</param>
/// <returns>true if removed, false if error</returns> /// <returns>true if removed, false if error</returns>
public Boolean RemoveSection(String name) public Boolean RemoveSection(String name)
{ {
if (!name.StartsWith("[")) { if (!name.StartsWith("[")) {
name = "[" + name + "]"; name = "[" + name + "]";
} }
if (!this.inifile.Keys.Contains(name)) { if (!this.inifile.Keys.Contains(name)) {
return false; return false;
} }
_ = this.inifile.Remove(name); _ = this.inifile.Remove(name);
this.Changed(); this.Changed();
return false; return false;
} }
protected virtual void Dispose(Boolean disposing) { protected virtual void Dispose(Boolean disposing) {
if (disposing) { if (disposing) {
this.k.Dispose(); this.k.Dispose();
} }
} }
public void Dispose() { public void Dispose() {
this.Dispose(true); this.Dispose(true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
} }
} }

View File

@ -1,25 +1,25 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace BlubbFish.Utils { namespace BlubbFish.Utils {
public abstract class OwnModel<T> where T : class public abstract class OwnModel<T> where T : class
{ {
private static readonly Lazy<T> _instance = new Lazy<T>(() => CreateInstanceOfT()); private static readonly Lazy<T> _instance = new Lazy<T>(() => CreateInstanceOfT());
private readonly List<OwnView> observer = new List<OwnView>(); private readonly List<OwnView> observer = new List<OwnView>();
public static T Instance => _instance.Value; public static T Instance => _instance.Value;
private static T CreateInstanceOfT() => Activator.CreateInstance(typeof(T), true) as T; private static T CreateInstanceOfT() => Activator.CreateInstance(typeof(T), true) as T;
public void SetObserver(OwnView view) public void SetObserver(OwnView view)
{ {
this.observer.Add(view); this.observer.Add(view);
view.Update(); view.Update();
} }
public void RemoveObserver(OwnView view) => _ = this.observer.Remove(view); public void RemoveObserver(OwnView view) => _ = this.observer.Remove(view);
protected void Update() => this.observer.ForEach(delegate (OwnView view) { protected void Update() => this.observer.ForEach(delegate (OwnView view) {
view.Update(); view.Update();
}); });
abstract protected void Init(); abstract protected void Init();
abstract public void Dispose(); abstract public void Dispose();
} }
} }

View File

@ -1,45 +1,45 @@
#if !NETCOREAPP #if !NETCOREAPP
using System.Reflection; using System.Reflection;
using System.Resources; using System.Resources;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden // Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die mit einer Assembly verknüpft sind. // die mit einer Assembly verknüpft sind.
[assembly: AssemblyTitle("Utils")] [assembly: AssemblyTitle("Utils")]
[assembly: AssemblyDescription("Provides useful classes for other projects")] [assembly: AssemblyDescription("Provides useful classes for other projects")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("BlubbFish")] [assembly: AssemblyCompany("BlubbFish")]
[assembly: AssemblyProduct("Utils")] [assembly: AssemblyProduct("Utils")]
[assembly: AssemblyCopyright("Copyright © BlubbFish 2014 - 10.04.2021")] [assembly: AssemblyCopyright("Copyright © BlubbFish 2014 - 10.04.2021")]
[assembly: AssemblyTrademark("BlubbFish")] [assembly: AssemblyTrademark("BlubbFish")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("de-DE")] [assembly: NeutralResourcesLanguage("de-DE")]
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("6f20376a-5c71-4979-9932-13c105d1c6e6")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.0")]
[assembly: AssemblyFileVersion("1.5.0")]
#endif
/**
* 1.5.0 Add GetEvent so you can call events by string; Add OwnSingeton class // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
* 1.4.0 Add Helper to Utils // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("6f20376a-5c71-4979-9932-13c105d1c6e6")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.0")]
[assembly: AssemblyFileVersion("1.5.0")]
#endif
/**
* 1.5.0 Add GetEvent so you can call events by string; Add OwnSingeton class
* 1.4.0 Add Helper to Utils
*/ */

View File

@ -8,26 +8,45 @@
<Company>BlubbFish</Company> <Company>BlubbFish</Company>
<Authors>BlubbFish</Authors> <Authors>BlubbFish</Authors>
<PackageId>Utils.BlubbFish</PackageId> <PackageId>Utils.BlubbFish</PackageId>
<Copyright>Copyright © BlubbFish 2014 - 10.04.2021</Copyright> <Copyright>Copyright © BlubbFish 2014 - 09.01.2022</Copyright>
<AssemblyVersion>1.5.0</AssemblyVersion> <Version>1.6.0</Version>
<FileVersion>1.5.0</FileVersion>
<NeutralLanguage>de-DE</NeutralLanguage> <NeutralLanguage>de-DE</NeutralLanguage>
<PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils</PackageProjectUrl> <PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils</PackageProjectUrl>
<RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils.git</RepositoryUrl> <RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils.git</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<Version>1.5.0</Version>
<PackageReleaseNotes> <PackageReleaseNotes>
1.5.0 Add GetEvent so you can call events by string; Add OwnSingeton class 1.6.0 HttpEndpoint added
1.4.0 Add Helper to Utils 1.5.0 Add GetEvent so you can call events by string; Add OwnSingeton class
</PackageReleaseNotes> 1.4.0 Add Helper to Utils
1.1.3 Improve CmdArgs
1.1.2 Tiny Codingstyles
1.1.1 ProgrammLogger neets to cleanup
1.1.0 ProgrammLogger
1.0.7.0 Yet another IniReader improvemnt round again
1.0.6.0 Yet another IniReader improvemnt round
1.0.5.2 And Improve IniReader again
1.0.5.1 Improve IniReader again
1.0.5.0 Improve IniReader
1.0.4.1 Cleanup OwnView
1.0.4.0 More Updater
1.0.3.2 Next Updater
1.0.3.1 EventArgsHelper
1.0.2.6 Better Updater
1.0.2.5 Logging in OwnObject
1.0.2.3 OwnModel better
1.0.2.2 Make it nice
1.0.2.1 Filemutex
1.0.0.1 Filelogger improvements
1.0.0.0 Init
</PackageReleaseNotes>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Content Include="../CHANGELOG.md" /> <Content Include="../CHANGELOG.md" />
<Content Include="../CONTRIBUTING.md" /> <Content Include="../CONTRIBUTING.md" />
<Content Include="../LICENSE" /> <Content Include="../LICENSE" />
<Content Include="../README.md" /> <Content Include="../README.md" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\LICENSE"> <None Include="..\LICENSE">