From 740b9152b5d84415302f41543a1e8e85a034220c Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Mon, 24 Apr 2017 21:55:40 +0000 Subject: [PATCH] Automatic Cronjob Checkin: 20170424-235538 --- Properties/AssemblyInfo.cs | 6 ++-- Updater.cs | 72 ++++++++++++++++++++++++++++++++----- bin/Release/Utils.dll | Bin 17920 -> 22016 bytes 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index d5aa52e..96a6ef3 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Utils")] -[assembly: AssemblyCopyright("Copyright © 2014 - 16.04.2017")] +[assembly: AssemblyCopyright("Copyright © 2014 - 24.04.2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.2.5")] -[assembly: AssemblyFileVersion("1.0.2.5")] +[assembly: AssemblyVersion("1.0.2.6")] +[assembly: AssemblyFileVersion("1.0.2.6")] diff --git a/Updater.cs b/Updater.cs index 4a7a776..784b191 100644 --- a/Updater.cs +++ b/Updater.cs @@ -1,12 +1,18 @@  using System; using System.IO; +using System.Net; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Xml; namespace BlubbFish.Utils { public class Updater : OwnObject { private static Updater instances; private String url; - private String[] versions; + private VersionInfo[] versions; public class UpdaterEventArgs : EventArgs { public UpdaterEventArgs(Boolean hasUpdates, String message) { @@ -18,6 +24,26 @@ namespace BlubbFish.Utils { public Boolean HasUpdates { get; private set; } } + public struct VersionInfo { + public VersionInfo(String name, String version, String filename, String guid) { + this.Name = name; + this.Version = version; + this.Filename = filename; + this.GUID = guid; + } + public VersionInfo(Type type) { + this.Name = type.Assembly.GetName().Name; + this.Version = type.Assembly.GetName().Version.ToString(); + this.Filename = type.Assembly.ManifestModule.Name; + this.GUID = ((GuidAttribute)type.Assembly.GetCustomAttribute(typeof(GuidAttribute))).Value; + } + + public String Name { get; private set; } + public String Version { get; private set; } + public String Filename { get; private set; } + public String GUID { get; private set; } + } + public delegate void UpdateStatus(Object sender, UpdaterEventArgs e); public event UpdateStatus UpdateResult; @@ -47,16 +73,27 @@ namespace BlubbFish.Utils { /// Set Path to check for Updates /// /// HTTP URI - public void SetPath(String url, String[] versions) { + public void SetUpdateInfo(String url, VersionInfo[] versions) { this.url = url; this.versions = versions; - StreamWriter file = new StreamWriter("version.txt"); - file.BaseStream.SetLength(0); - file.BaseStream.Flush(); - file.BaseStream.Seek(0, SeekOrigin.Begin); - foreach (String version in versions) { - file.WriteLine(version); + FileStream file = new FileStream("version.xml",FileMode.Create); + XmlTextWriter xml = new XmlTextWriter(file, Encoding.UTF8); + xml.WriteStartDocument(); + xml.WriteWhitespace("\n"); + xml.WriteStartElement("filelist"); + xml.WriteWhitespace("\n"); + foreach (VersionInfo version in versions) { + xml.WriteWhitespace("\t"); + xml.WriteStartElement("file"); + xml.WriteAttributeString("Version", version.Version); + xml.WriteAttributeString("Filename", version.Filename); + xml.WriteAttributeString("GUID", version.GUID); + xml.WriteString(version.Name); + xml.WriteEndElement(); + xml.WriteWhitespace("\n"); } + xml.WriteEndElement(); + xml.Flush(); file.Flush(); file.Close(); } @@ -75,6 +112,23 @@ namespace BlubbFish.Utils { if(this.UpdateResult == null) { throw new ArgumentNullException("You must attach an event first."); } + Thread t = new Thread(this.Runner); + t.Start(); + } + + private void Runner() { + Thread.Sleep(1000); + WebRequest request = WebRequest.Create(this.url + "version.xml"); + WebResponse response = null; + try { + response = request.GetResponse(); + } catch(WebException e) { + this.UpdateResult(this, new UpdaterEventArgs(false, e.Message)); + return; + } + Stream stream = response.GetResponseStream(); + StreamReader reader = new StreamReader(stream); + String content = reader.ReadToEnd(); } /// @@ -84,7 +138,7 @@ namespace BlubbFish.Utils { /// The url of the sourcefile /// Updates the Programm after it has been closed /// - public Boolean Update(String filename, String url, Boolean afterExit = true) { + public Boolean Update(Boolean afterExit = true) { return true; } } diff --git a/bin/Release/Utils.dll b/bin/Release/Utils.dll index 56cacae95d9f01ae366df0af1b1333f16edd2861..b21d53cec5e6330b8eab1caded4e0f6ce44f56a2 100644 GIT binary patch literal 22016 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 literal 17920 zcmeHvdw3kxmFKxt)zvS#t!~MZZCQ33EYs+PWE;OQwq&=2h2;m9`~n%dC6(pItuDE$ zWh{)0JlG~4APWg0gvqx91inl%BqUi9U}i#quzAc*5;8kq5;hEh8Il<`kAVzfvXjK@ z@0_ZZT3}$ayMOF{GbQ@m^SJlibI(2Z+*=Q`_3ArFCn5vCx85Rp93@|E0^b`|{oggPDBZE+hx6q%)RJX7kDP_MYU3J!Cb{niW~% ztKQK;)U9-S?DjYJ7JGY%E=WdI3(Cz{eh3j+I5N&7V08xP*@%C$ys0_SgR}(FGyX?K_BvGhD9s<3≷Za#|ofB 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