merged from work

This commit is contained in:
Holger Börchers 2023-05-06 13:23:42 +02:00
parent 11e3a02511
commit 4e8c500fb2
592 changed files with 5577 additions and 71276 deletions

2
.gitignore vendored
View File

@ -116,3 +116,5 @@ nsis/*
/KattekerCreator/contrib/AppStub.exe
/KattekerCreator/contrib/AppStub.exe.config
/.idea
/app-stub/target
/nupkg

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" />
<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>{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AppStub</RootNamespace>
<AssemblyName>AppStub</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\KattekerCreator\contrib\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\KattekerCreator\contrib\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Katteker\Common\SemVersion.cs">
<Link>SemVersion.cs</Link>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<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\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props'))" />
</Target>
</Project>

View File

@ -1,77 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using Semver;
namespace AppStub
{
internal static class Program
{
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
var commandline = string.Join(" ", args);
var location = new FileInfo(Assembly.GetExecutingAssembly().Location);
var directory = location.Directory;
if (directory == null) return;
var files = directory.EnumerateFiles(location.Name, SearchOption.AllDirectories)
.Where(x => x.Directory?.Name.StartsWith("app-") == true);
var entries = new SortedList<SemVersion, FileInfo>();
foreach (var file in files)
{
var version = SemVersion.TryParse(file.Directory?.Name.Replace("app-", ""), out var value)
? value
: new SemVersion(0);
entries.Add(version, file);
}
var latestVersion = entries.LastOrDefault().Value;
if (latestVersion == null) throw new FileNotFoundException();
DeleteOldVersionDirectories(entries.Where(x => x.Value != latestVersion));
using (var process = new Process())
{
process.StartInfo =
new ProcessStartInfo(latestVersion.FullName)
{
Arguments = commandline,
WorkingDirectory = latestVersion.DirectoryName ?? Assembly.GetExecutingAssembly().Location,
UseShellExecute = false
};
process.Start();
process.WaitForExit();
}
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private static void DeleteOldVersionDirectories(IEnumerable<KeyValuePair<SemVersion, FileInfo>> dirEntries)
{
if (Debugger.IsAttached) return;
foreach (var directoryInfo in dirEntries)
{
try
{
directoryInfo.Value.Directory?.Delete(true);
}
catch
{
// silently ignore
}
}
}
}
}

View File

@ -1,35 +0,0 @@
using System.Reflection;
using 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.
[assembly: AssemblyTitle("AppStub")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AppStub")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("e746ae0f-beea-4c18-9ed8-2e708ed00a5b")]
// 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.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Net.Compilers" version="2.10.0" targetFramework="net45" developmentDependency="true" />
</packages>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup>
</configuration>

View File

@ -1,19 +0,0 @@
using System;
using System.IO;
namespace Katteker.AppStub
{
public class AppEntry : IComparable<AppEntry>
{
public AppEntry(DirectoryInfo info)
{
DirInfo = info;
Version = SemanticVersion.Parse(info.Name.Replace("app-", ""));
}
public SemanticVersion Version { get; }
public DirectoryInfo DirInfo { get; }
public int CompareTo(AppEntry other) => Version.CompareTo(other.Version);
}
}

View File

@ -1,70 +0,0 @@
<?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>{AF7579CC-C0B2-4E5A-B052-00D2991DC715}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Katteker.AppStubEx</RootNamespace>
<AssemblyName>AppStubEx</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AppEntry.cs" />
<Compile Include="IniFile.cs" />
<Compile Include="InstallerUx.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="InstallerUx.designer.cs">
<DependentUpon>InstallerUx.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SemanticVersion.cs" />
<Compile Include="Taskbar.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="InstallerUx.resx">
<DependentUpon>InstallerUx.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -1,50 +0,0 @@
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
namespace Katteker.AppStub
{
public class IniFile // revision 11
{
private readonly FileInfo _path;
private readonly string _exe = Assembly.GetExecutingAssembly().GetName().Name;
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern int GetPrivateProfileString(string section, string key, string Default, StringBuilder retVal, int size, string filePath);
public IniFile(string iniPath = null)
{
_path = new FileInfo(iniPath ?? _exe + ".ini");
}
public string Read(string key, string section = null)
{
var retVal = new StringBuilder(255);
GetPrivateProfileString(section ?? _exe, key, "", retVal, 255, _path.FullName);
return retVal.ToString();
}
public void Write(string key, string value, string section = null)
{
WritePrivateProfileString(section ?? _exe, key, value, _path.FullName);
}
public void DeleteKey(string key, string section = null)
{
Write(key, null, section ?? _exe);
}
public void DeleteSection(string section = null)
{
Write(null, null, section ?? _exe);
}
public bool Exists => _path.Exists;
public bool KeyExists(string key, string section = null) => Read(key, section).Length > 0;
}
}

View File

@ -1,73 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Katteker.AppStub
{
public sealed partial class InstallerUx : Form
{
private int _autoCloseCountdown = 10;
public InstallerUx(string appName)
{
Font = SystemFonts.MessageBoxFont;
InitializeComponent();
SetLocationAndShow();
this.appName.Text = appName;
}
private void SetLocationAndShow()
{
var taskBar = new Taskbar();
switch (taskBar.Position)
{
case TaskbarPosition.Unknown:
break;
case TaskbarPosition.Left:
Location = new Point(taskBar.Bounds.Left + taskBar.Bounds.Width, taskBar.Bounds.Bottom - Size.Height);
break;
case TaskbarPosition.Top:
Location = new Point(taskBar.Bounds.Right - Size.Width, taskBar.Bounds.Bottom);
break;
case TaskbarPosition.Right:
Location = new Point(taskBar.Bounds.Left - Size.Width, taskBar.Bounds.Bottom - Size.Height);
break;
case TaskbarPosition.Bottom:
Location = new Point(taskBar.Bounds.Right - Size.Width, taskBar.Bounds.Top - Size.Height);
break;
default:
break;
}
Show();
}
private void closeBtn_Click(object sender, EventArgs e)
{
Close();
}
private void installBtn_Click(object sender, EventArgs e)
{
_autoCloseCountdown = 0;
MessageBox.Show("Hallo Welt");
}
private void autoCloseTimer_Tick(object sender, EventArgs e)
{
switch (_autoCloseCountdown)
{
case 1:
Close();
break;
case 0:
countDownLbl.Text = string.Empty;
autoCloseTimer.Enabled = false;
break;
default:
countDownLbl.Tag = --_autoCloseCountdown;
countDownLbl.Text = _autoCloseCountdown.ToString();
break;
}
}
}
}

View File

@ -1,149 +0,0 @@
namespace Katteker.AppStub
{
sealed partial class InstallerUx
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.closeBtn = new System.Windows.Forms.Button();
this.installBtn = new System.Windows.Forms.Button();
this.messageLbl = new System.Windows.Forms.Label();
this.appName = new System.Windows.Forms.Label();
this.countDownLbl = new System.Windows.Forms.Label();
this.autoCloseTimer = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// closeBtn
//
this.closeBtn.AutoSize = true;
this.closeBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.closeBtn.FlatAppearance.BorderSize = 0;
this.closeBtn.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(122)))), ((int)(((byte)(204)))));
this.closeBtn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(65)))));
this.closeBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.closeBtn.Font = new System.Drawing.Font("Marlett", 10F);
this.closeBtn.Location = new System.Drawing.Point(249, 0);
this.closeBtn.Margin = new System.Windows.Forms.Padding(0);
this.closeBtn.Name = "closeBtn";
this.closeBtn.Size = new System.Drawing.Size(31, 26);
this.closeBtn.TabIndex = 1;
this.closeBtn.TabStop = false;
this.closeBtn.Text = "r";
this.closeBtn.UseVisualStyleBackColor = true;
this.closeBtn.Click += new System.EventHandler(this.closeBtn_Click);
//
// installBtn
//
this.installBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.installBtn.FlatAppearance.BorderSize = 0;
this.installBtn.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(122)))), ((int)(((byte)(204)))));
this.installBtn.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(65)))));
this.installBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.installBtn.Location = new System.Drawing.Point(192, 59);
this.installBtn.Margin = new System.Windows.Forms.Padding(0);
this.installBtn.Name = "installBtn";
this.installBtn.Size = new System.Drawing.Size(77, 30);
this.installBtn.TabIndex = 2;
this.installBtn.TabStop = false;
this.installBtn.Text = "Install";
this.installBtn.UseVisualStyleBackColor = true;
this.installBtn.Click += new System.EventHandler(this.installBtn_Click);
//
// messageLbl
//
this.messageLbl.AutoSize = true;
this.messageLbl.Location = new System.Drawing.Point(11, 68);
this.messageLbl.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.messageLbl.Name = "messageLbl";
this.messageLbl.Size = new System.Drawing.Size(93, 13);
this.messageLbl.TabIndex = 3;
this.messageLbl.Text = "Upgrade available";
//
// appName
//
this.appName.AutoSize = true;
this.appName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.appName.Location = new System.Drawing.Point(13, 13);
this.appName.Name = "appName";
this.appName.Size = new System.Drawing.Size(80, 20);
this.appName.TabIndex = 4;
this.appName.Text = "AppName";
//
// countDownLbl
//
this.countDownLbl.AutoSize = true;
this.countDownLbl.BackColor = System.Drawing.Color.Transparent;
this.countDownLbl.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.countDownLbl.ForeColor = System.Drawing.SystemColors.ControlDark;
this.countDownLbl.Location = new System.Drawing.Point(229, 5);
this.countDownLbl.Name = "countDownLbl";
this.countDownLbl.Size = new System.Drawing.Size(24, 17);
this.countDownLbl.TabIndex = 5;
this.countDownLbl.Tag = 10;
this.countDownLbl.Text = "10";
this.countDownLbl.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// autoCloseTimer
//
this.autoCloseTimer.Enabled = true;
this.autoCloseTimer.Interval = 1000;
this.autoCloseTimer.Tick += new System.EventHandler(this.autoCloseTimer_Tick);
//
// InstallerUx
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(48)))));
this.ClientSize = new System.Drawing.Size(278, 98);
this.ControlBox = false;
this.Controls.Add(this.countDownLbl);
this.Controls.Add(this.appName);
this.Controls.Add(this.messageLbl);
this.Controls.Add(this.installBtn);
this.Controls.Add(this.closeBtn);
this.ForeColor = System.Drawing.SystemColors.Control;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Location = new System.Drawing.Point(30, 0);
this.Name = "InstallerUx";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.TopMost = true;
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button closeBtn;
private System.Windows.Forms.Button installBtn;
private System.Windows.Forms.Label messageLbl;
private System.Windows.Forms.Label appName;
private System.Windows.Forms.Label countDownLbl;
private System.Windows.Forms.Timer autoCloseTimer;
}
}

View File

@ -1,126 +0,0 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="autoCloseTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>167, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>87</value>
</metadata>
</root>

View File

@ -1,102 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Katteker.AppStub
{
internal class Program
{
private Program()
{
CurrentDir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
ConfigFile = new IniFile(Path.Combine(CurrentDir.FullName, "app.ini"));
}
private DirectoryInfo CurrentDir { get; }
private IniFile ConfigFile { get; }
private Process MainProcess { get; set; }
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var p = new Program();
p.Run(args);
}
private void Run(string[] args)
{
StartExecutable(args);
StartUpdateInfo();
}
private static void StartUpdateInfo()
{
Application.Run(new InstallerUx("TestProgramm"));
}
private void StartExecutable(string[] args)
{
var dirEntries = CurrentDir.EnumerateDirectories().Where(x => x.Name.StartsWith("app-"))
.Select(x => new AppEntry(x)).ToList();
var latestVersion = dirEntries.OrderByDescending(x => x).FirstOrDefault();
if (latestVersion != null && ConfigFile.Exists)
{
try
{
var executable = ConfigFile.Read("Executable", "Main");
var a = args.Aggregate(string.Empty, (current, s) => current + s + " ").TrimEnd(' ');
MainProcess = new Process
{
StartInfo =
new ProcessStartInfo($"{latestVersion.DirInfo.FullName}\\{executable}")
{
Arguments = a,
WorkingDirectory = latestVersion.DirInfo.FullName,
UseShellExecute = false
}
};
MainProcess.Start();
Task.Run(() =>
DeleteOldVersionDirectories(dirEntries.Where(x =>
x.DirInfo.Name != latestVersion.DirInfo.Name)));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("Error, File not found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private static void DeleteOldVersionDirectories(IEnumerable<AppEntry> dirEntries)
{
#if !DEBUG
foreach (var directoryInfo in dirEntries)
{
try
{
directoryInfo.DirInfo.Delete(true);
}
catch (Exception)
{
// silently ignore
}
}
#endif
}
}
}

View File

@ -1,42 +0,0 @@
using System.Reflection;
using 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.
//[assembly: AssemblyTitle("AppStub")]
//[assembly: AssemblyDescription("")]
//[assembly: AssemblyConfiguration("")]
//[assembly: AssemblyCompany("")]
//[assembly: AssemblyProduct("AppStub")]
//[assembly: AssemblyCopyright("Copyright © 2016")]
//[assembly: AssemblyTrademark("")]
//[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("af7579cc-c0b2-4e5a-b052-00d2991dc715")]
[assembly: AssemblyTitle("Katteker.AppStubEx")]
[assembly: AssemblyDescription("Katteker.AppStubEx")]
[assembly: AssemblyCompany("Holger Börchers")]
[assembly: AssemblyProduct("Katteker.AppStubEx")]
[assembly: AssemblyCopyright("Holger Börchers")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
// 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.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,117 +0,0 @@
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace Katteker.AppStub
{
public enum TaskbarPosition
{
Unknown = -1,
Left,
Top,
Right,
Bottom
}
public sealed class Taskbar
{
private const string ClassName = "Shell_TrayWnd";
public Taskbar()
{
var taskbarHandle = User32.FindWindow(ClassName, null);
var data = new APPBARDATA
{
cbSize = (uint) Marshal.SizeOf(typeof(APPBARDATA)),
hWnd = taskbarHandle
};
var result = Shell32.SHAppBarMessage(ABM.GetTaskbarPos, ref data);
if (result == IntPtr.Zero)
throw new InvalidOperationException();
Position = (TaskbarPosition) data.uEdge;
Bounds = Rectangle.FromLTRB(data.rc.left, data.rc.top, data.rc.right, data.rc.bottom);
data.cbSize = (uint) Marshal.SizeOf(typeof(APPBARDATA));
result = Shell32.SHAppBarMessage(ABM.GetState, ref data);
var state = result.ToInt32();
AlwaysOnTop = (state & ABS.AlwaysOnTop) == ABS.AlwaysOnTop;
AutoHide = (state & ABS.Autohide) == ABS.Autohide;
}
public Rectangle Bounds { get; }
public TaskbarPosition Position { get; private set; }
public Point Location => Bounds.Location;
public Size Size => Bounds.Size;
//Always returns false under Windows 7
public bool AlwaysOnTop { get; private set; }
public bool AutoHide { get; private set; }
}
public enum ABM : uint
{
New = 0x00000000,
Remove = 0x00000001,
QueryPos = 0x00000002,
SetPos = 0x00000003,
GetState = 0x00000004,
GetTaskbarPos = 0x00000005,
Activate = 0x00000006,
GetAutoHideBar = 0x00000007,
SetAutoHideBar = 0x00000008,
WindowPosChanged = 0x00000009,
SetState = 0x0000000A
}
public enum ABE : uint
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
public static class ABS
{
public const int Autohide = 0x0000001;
public const int AlwaysOnTop = 0x0000002;
}
public static class Shell32
{
[DllImport("shell32.dll", SetLastError = true)]
public static extern IntPtr SHAppBarMessage(ABM dwMessage, [In] ref APPBARDATA pData);
}
public static class User32
{
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}
[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public ABE uEdge;
public RECT rc;
public int lParam;
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.8.1.0" newVersion="4.8.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Prism" publicKeyToken="40ee6c3a2184dc59" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.2.0.1422" newVersion="7.2.0.1422" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Prism.Wpf" publicKeyToken="40ee6c3a2184dc59" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.2.0.1422" newVersion="7.2.0.1422" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,15 +0,0 @@
<dryioc:PrismApplication x:Class="Example.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dryioc="http://prismlibrary.com/">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</dryioc:PrismApplication>

View File

@ -1,18 +0,0 @@
using System.Windows;
using Prism.Ioc;
namespace Example
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//nothing
}
protected override Window CreateShell() => Container.Resolve<MainWindow>();
}
}

View File

@ -1,165 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" />
<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>{DE9CFDEB-40B8-447D-9959-31BA78512CED}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Example</RootNamespace>
<AssemblyName>Example</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>nsis3-install.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<StartupObject>Example.App</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="CommonServiceLocator, Version=2.0.5.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0">
<HintPath>..\packages\CommonServiceLocator.2.0.5\lib\net45\CommonServiceLocator.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="DryIoc, Version=4.0.7.0, Culture=neutral, PublicKeyToken=dfbf2bd50fcf7768">
<HintPath>..\packages\DryIoc.dll.4.0.7\lib\net45\DryIoc.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MaterialDesignColors, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\MaterialDesignColors.1.2.1\lib\net45\MaterialDesignColors.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MaterialDesignThemes.Wpf, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MaterialDesignThemes.3.0.0\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Prism, Version=7.2.0.1422, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL">
<HintPath>..\packages\Prism.Core.7.2.0.1422\lib\net45\Prism.dll</HintPath>
</Reference>
<Reference Include="Prism.DryIoc.Wpf, Version=7.2.0.1422, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Prism.DryIoc.7.2.0.1422\lib\net45\Prism.DryIoc.Wpf.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Prism.Wpf, Version=7.2.0.1422, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL">
<HintPath>..\packages\Prism.Wpf.7.2.0.1422\lib\net45\Prism.Wpf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Prism.Wpf.7.2.0.1422\lib\net45\System.Windows.Interactivity.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="Annotations.cs" />
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="MainWindowViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="changelog.md">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Katteker.Gui\Katteker.UserInterface.csproj">
<Project>{07e2de31-80a0-43da-b307-1ca47cd930a1}</Project>
<Name>Katteker.UserInterface</Name>
</ProjectReference>
<ProjectReference Include="..\Katteker\Katteker.csproj">
<Project>{4cd50166-c3ab-4cc4-9694-951a3f33addb}</Project>
<Name>Katteker</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="nsis3-install.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<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\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('..\packages\MaterialDesignThemes.3.0.0\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MaterialDesignThemes.3.0.0\build\MaterialDesignThemes.targets'))" />
</Target>
<Import Project="..\packages\MaterialDesignThemes.3.0.0\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.3.0.0\build\MaterialDesignThemes.targets')" />
</Project>

View File

@ -1,105 +0,0 @@
<Window
x:Class="Example.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:Example"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:prism="http://prismlibrary.com/"
Title="MainWindow"
Width="800"
Height="450"
d:DataContext="{d:DesignInstance local:MainWindowViewModel}"
prism:ViewModelLocator.AutoWireViewModel="True"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{DynamicResource MaterialDesignFont}"
TextElement.FontSize="13"
TextElement.FontWeight="Regular"
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
TextOptions.TextFormattingMode="Ideal"
TextOptions.TextRenderingMode="Auto"
mc:Ignorable="d">
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding UpdateCommand}" CommandParameter="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<md:DialogHost IsOpen="{Binding ShowRestartAppDialog}">
<md:DialogHost.DialogContent>
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"
Text="The update was installed successful. Do you want to restart?" />
<Button
Grid.Row="1"
Grid.Column="0"
Command="{Binding RestartAppDialogCommand}"
IsCancel="False"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean xmlns:system="clr-namespace:System;assembly=mscorlib">
True
</system:Boolean>
</Button.CommandParameter>
YES
</Button>
<Button
Grid.Row="1"
Grid.Column="1"
Command="{Binding RestartAppDialogCommand}"
IsCancel="True"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean xmlns:system="clr-namespace:System;assembly=mscorlib">
False
</system:Boolean>
</Button.CommandParameter>
NO
</Button>
</Grid>
</md:DialogHost.DialogContent>
<DockPanel>
<md:Snackbar
Margin="10,0"
HorizontalAlignment="Stretch"
DockPanel.Dock="Bottom"
MessageQueue="{Binding MessageQueue}" />
<StackPanel>
<Button
Height="45"
Margin="10"
Command="{Binding UpdateCommand}"
CommandParameter="False"
Content="Update"
FontSize="24" />
<TextBlock
Margin="20"
HorizontalAlignment="Center"
FontSize="60"
RenderTransformOrigin="0.5,0.5"
Text=":-)">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform Angle="90" />
<TranslateTransform />
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</StackPanel>
</DockPanel>
</md:DialogHost>
</Window>

View File

@ -1,22 +0,0 @@
using System;
using System.Reflection;
using System.Windows;
namespace Example
{
/// <inheritdoc cref="Window" />
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
var version = GetType().Assembly.GetName().Version.ToString();
var a = Assembly.GetExecutingAssembly();
a.ManifestModule.GetPEKind(out var peKind, out var machine);
Title = $"{version} | {peKind} | {machine}";
}
}
}

View File

@ -1,91 +0,0 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Input;
using Katteker;
using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Mvvm;
namespace Example
{
[JetBrains.Annotations.UsedImplicitly]
public class MainWindowViewModel : BindableBase, IDisposable
{
private bool _showRestartAppDialog;
private readonly UpdateManager _updateManager;
public MainWindowViewModel()
{
UpdateManager.TryCreate(out _updateManager);
UpdateCommand = new DelegateCommand<string>(async x => await UpdateAsync(x).ConfigureAwait(false));
RestartAppDialogCommand = new DelegateCommand<object>(RestartApp);
}
private void RestartApp(object obj)
{
if (obj is bool restart && restart)
{
_updateManager.RestartApp();
}
ShowRestartAppDialog = false;
}
private async Task UpdateAsync(string startup)
{
var openFile = new FolderBrowserDialog();
if (openFile.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(openFile.SelectedPath, "Example Core");
}
var silent = bool.Parse(startup);
try
{
var releases = (await _updateManager.CheckForUpdateAsync().ConfigureAwait(false)).ToList();
if (releases.Any())
{
MessageQueue.Enqueue("Update available", "Update now", ActionHandler);
}
else if (!silent)
{
MessageQueue.Enqueue("No Update available.", true);
}
}
catch (Exception e)
{
if (silent)
{
MessageQueue.Enqueue(e.Message);
}
}
}
private async void ActionHandler()
{
if (await _updateManager.UpdateAppAsync().ConfigureAwait(false))
{
ShowRestartAppDialog = true;
}
}
public ICommand UpdateCommand { get; }
public SnackbarMessageQueue MessageQueue { get; } = new SnackbarMessageQueue();
public bool ShowRestartAppDialog
{
get => _showRestartAppDialog;
set => SetProperty(ref _showRestartAppDialog, value);
}
public ICommand RestartAppDialogCommand { get; }
public void Dispose()
{
MessageQueue?.Dispose();
}
}
}

View File

@ -1,53 +0,0 @@
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Example")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Enercon GmbH")]
[assembly: AssemblyProduct("Example")]
[assembly: AssemblyCopyright("Copyright © Enercon GmbH 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.3")]
[assembly: AssemblyFileVersion("1.2.3")]
[assembly: Guid("549EEC1D-D014-41C1-9442-F449911B1B50")]

View File

@ -1,63 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Example.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Example.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -1,117 +0,0 @@
<?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>

View File

@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Example.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonServiceLocator" version="2.0.5" targetFramework="net45" />
<package id="DryIoc.dll" version="4.0.7" targetFramework="net45" />
<package id="MaterialDesignColors" version="1.2.1" targetFramework="net45" />
<package id="MaterialDesignThemes" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.Net.Compilers" version="2.10.0" targetFramework="net45" developmentDependency="true" />
<package id="Prism.Core" version="7.2.0.1422" targetFramework="net45" />
<package id="Prism.DryIoc" version="7.2.0.1422" targetFramework="net45" />
<package id="Prism.Wpf" version="7.2.0.1422" targetFramework="net45" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net45" />
</packages>

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,15 @@
<dryioc:PrismApplication x:Class="ExampleCore.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dryioc="http://prismlibrary.com/">
<dryioc:PrismApplication
x:Class="ExampleCore.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dryioc="http://prismlibrary.com/"
xmlns:ui="http://schemas.modernwpf.com/2019">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
<ui:ThemeResources />
<ui:XamlControlsResources />
<!-- Other merged dictionaries here -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

View File

@ -1,5 +1,6 @@
using Prism.Ioc;
using System.Windows;
using System.Windows.Forms;
namespace ExampleCore
{
@ -8,6 +9,12 @@ namespace ExampleCore
/// </summary>
public partial class App
{
public App()
{
System.Windows.Forms.Application.SetHighDpiMode(HighDpiMode.SystemAware);
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//nothing

View File

@ -1,12 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>net5.0-windows10.0.18362.0</TargetFramework>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>nsis3-install.ico</ApplicationIcon>
<Version>1.1.5</Version>
<Version>1.3.14</Version>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
@ -14,17 +16,15 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommonServiceLocator" Version="2.0.5" />
<PackageReference Include="DryIoc.dll" Version="4.0.7" />
<PackageReference Include="MaterialDesignColors" Version="1.2.1" />
<PackageReference Include="MaterialDesignThemes" Version="3.0.0" />
<PackageReference Include="Prism.Core" Version="7.2.0.1233-pre" />
<PackageReference Include="Prism.DryIoc" Version="7.2.0.1233-pre" />
<PackageReference Include="Prism.Wpf" Version="7.2.0.1233-pre" />
<PackageReference Include="Emoji.Wpf" Version="0.3.0" />
<PackageReference Include="ModernWpfUI" Version="0.9.3" />
<PackageReference Include="Prism.Core" Version="8.0.0.1909" />
<PackageReference Include="Prism.DryIoc" Version="8.0.0.1909" />
<PackageReference Include="Prism.Wpf" Version="8.0.0.1909" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Katteker\Katteker.csproj" />
<ProjectReference Include="..\src\Katteker\Katteker.csproj" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1 @@
{"Publish":"\\\\srv-lsimctrl01\\e$\\Squirrel\\TT","Changelog":null,"Channel":" Dev"}

View File

@ -1,105 +1,62 @@
<Window x:Class="ExampleCore.MainWindow"
<Window
x:Class="ExampleCore.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
xmlns:local="clr-namespace:ExampleCore"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:prism="http://prismlibrary.com/"
Title="MainWindow"
xmlns:system="clr-namespace:System;assembly=System.Runtime"
xmlns:ui="http://schemas.modernwpf.com/2019"
Title="{x:Static local:MainWindowViewModel.WindowTitle}"
Width="800"
Height="450"
Height="500"
d:DataContext="{d:DesignInstance local:MainWindowViewModel}"
prism:ViewModelLocator.AutoWireViewModel="True"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{DynamicResource MaterialDesignFont}"
TextElement.FontSize="13"
TextElement.FontWeight="Regular"
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
TextOptions.TextFormattingMode="Ideal"
ui:WindowHelper.UseModernWindowStyle="True"
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="Auto"
mc:Ignorable="d">
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding UpdateCommand}" CommandParameter="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<md:DialogHost IsOpen="{Binding ShowRestartAppDialog}">
<md:DialogHost.DialogContent>
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Window.Resources>
<system:Boolean x:Key="True">True</system:Boolean>
<system:Boolean x:Key="False">False</system:Boolean>
</Window.Resources>
<b:Interaction.Triggers>
<b:EventTrigger EventName="ContentRendered">
<b:InvokeCommandAction Command="{Binding UpdateCommand}" CommandParameter="{StaticResource True}" />
</b:EventTrigger>
</b:Interaction.Triggers>
<ScrollViewer>
<StackPanel>
<StackPanel.Resources>
<Style BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
<Setter Property="Height" Value="45" />
<Setter Property="Margin" Value="10" />
<Setter Property="FontSize" Value="24" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
</Style>
</StackPanel.Resources>
<Button
Command="{Binding UpdateCommand}"
CommandParameter="{StaticResource False}"
Content="Update" />
<Button Command="{Binding OpenFolderDialogCommand}" Content="Open Folder Dialog" />
<Button Command="{Binding OpenFileDialogCommand}" Content="Open File Dialog" />
<emoji:TextBlock
Margin="20"
HorizontalAlignment="Center"
FontSize="60"
Text="😂" />
<GroupBox Margin="10" Header="Command line parameters">
<TextBlock
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"
Text="The update was installed successful. Do you want to restart?" />
<Button
Grid.Row="1"
Grid.Column="0"
Command="{Binding RestartAppDialogCommand}"
IsCancel="False"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean xmlns:system="clr-namespace:System;assembly=mscorlib">
True
</system:Boolean>
</Button.CommandParameter>
YES
</Button>
<Button
Grid.Row="1"
Grid.Column="1"
Command="{Binding RestartAppDialogCommand}"
IsCancel="True"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean xmlns:system="clr-namespace:System;assembly=mscorlib">
False
</system:Boolean>
</Button.CommandParameter>
NO
</Button>
</Grid>
</md:DialogHost.DialogContent>
<DockPanel>
<md:Snackbar
Margin="10,0"
HorizontalAlignment="Stretch"
DockPanel.Dock="Bottom"
MessageQueue="{Binding MessageQueue}" />
<StackPanel>
<Button
Height="45"
Margin="10"
Command="{Binding UpdateCommand}"
CommandParameter="False"
Content="Update"
FontSize="24" />
<Button Content="Open File Dialog" Command="{Binding OpenFileDialogCommand}" />
<TextBlock
Margin="20"
HorizontalAlignment="Center"
FontSize="60"
RenderTransformOrigin="0.5,0.5"
Text=":-)">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform Angle="90" />
<TranslateTransform />
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</StackPanel>
</DockPanel>
</md:DialogHost>
Background="WhiteSmoke"
FontFamily="Consolas"
Text="{Binding CommandLineParameters}"
TextWrapping="Wrap" />
</GroupBox>
</StackPanel>
</ScrollViewer>
</Window>

View File

@ -1,102 +1,86 @@
using System;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Input;
using Katteker;
using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Mvvm;
namespace ExampleCore
{
[JetBrains.Annotations.UsedImplicitly]
public class MainWindowViewModel : BindableBase, IDisposable
public class MainWindowViewModel : BindableBase
{
private bool _showRestartAppDialog;
private readonly UpdateManager _updateManager;
public static string WindowTitle { get; } = "Example Core " + Assembly.GetExecutingAssembly().GetName().Version?.ToString(3);
public MainWindowViewModel()
{
UpdateManager.TryCreate(out _updateManager);
UpdateCommand = new DelegateCommand<string>(async x => await UpdateAsync(x).ConfigureAwait(false));
RestartAppDialogCommand = new DelegateCommand<object>(RestartApp);
OpenFileDialogCommand = new DelegateCommand(OpenFileCommand);
UpdateCommand = new DelegateCommand<bool?>(async x => await UpdateAsync(x.GetValueOrDefault()).ConfigureAwait(false));
OpenFolderDialogCommand = new DelegateCommand(OpenFolder);
OpenFileDialogCommand = new DelegateCommand(OpenFile);
}
private void OpenFileCommand()
private static void OpenFile()
{
var openFile = new FolderBrowserDialog();
using var openFile = new OpenFileDialog();
if (openFile.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(openFile.SelectedPath, "Example Core");
MessageBox.Show(openFile.FileName, WindowTitle);
}
}
private void RestartApp(object obj)
private static void OpenFolder()
{
if (obj is bool restart && restart)
using var folderBrowser = new FolderBrowserDialog();
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
_updateManager.RestartApp();
MessageBox.Show(folderBrowser.SelectedPath, WindowTitle);
}
ShowRestartAppDialog = false;
}
private async Task UpdateAsync(string startup)
private async Task UpdateAsync(bool startup)
{
if (_updateManager == null) return;
var silent = bool.Parse(startup);
try
{
var releases = (await _updateManager.CheckForUpdateAsync().ConfigureAwait(false)).ToList();
if (releases.Any())
var updates = await _updateManager.CheckForUpdatesAsync().ConfigureAwait(false);
if (updates.Any())
{
MessageQueue.Enqueue("Update available", "Update now", ActionHandler);
var dialogResult = MessageBox.Show("Update available, update now?", WindowTitle,
MessageBoxButtons.YesNo,
MessageBoxIcon.Information);
if (dialogResult == DialogResult.Yes && await _updateManager.UpdateAppAsync().ConfigureAwait(false))
{
dialogResult = MessageBox.Show("The update is ready to install. Do you want to install it now?",
WindowTitle,
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes) System.Windows.Application.Current.Shutdown();
}
}
else if (!silent)
else if (!startup)
{
MessageQueue.Enqueue("No Update available.", true);
MessageBox.Show("No Update available.", WindowTitle, MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
catch (Exception e)
{
if (silent)
if (startup)
{
MessageQueue.Enqueue(e.Message);
MessageBox.Show(e.Message, WindowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private async void ActionHandler()
{
if (await _updateManager.UpdateAppAsync().ConfigureAwait(false))
{
ShowRestartAppDialog = true;
}
}
public ICommand UpdateCommand { get; }
public SnackbarMessageQueue MessageQueue { get; } = new SnackbarMessageQueue();
public ICommand OpenFolderDialogCommand { get; }
public bool ShowRestartAppDialog
{
get => _showRestartAppDialog;
set => SetProperty(ref _showRestartAppDialog, value);
}
public ICommand OpenFileDialogCommand { get; }
public ICommand RestartAppDialogCommand { get; }
public ICommand OpenFileDialogCommand
{
get;
}
public void Dispose()
{
MessageQueue?.Dispose();
}
public string CommandLineParameters => Environment.CommandLine;
}
}

View File

@ -7,10 +7,13 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PublishProtocol>FileSystem</PublishProtocol>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PublishDir>bin\Release\netcoreapp3.0\publish\</PublishDir>
<TargetFramework>net5.0-windows10.0.18362.0</TargetFramework>
<PublishDir>..\publish\</PublishDir>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<_IsPortable>false</_IsPortable>
<PublishSingleFile>True</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishTrimmed>False</PublishTrimmed>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,8 @@
{
"profiles": {
"ExampleCore": {
"commandName": "Project",
"commandLineArgs": "Dangerous Mouse"
}
}
}

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Net.Compilers" version="2.10.0" targetFramework="net45" developmentDependency="true" />
</packages>

View File

@ -1,37 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.421
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker", "Katteker\Katteker.csproj", "{A45E1C59-BA9E-452C-A5E2-50DE49D53E92}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.UserInterface", "Katteker.Gui\Katteker.UserInterface.csproj", "{07E2DE31-80A0-43DA-B307-1CA47CD930A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.Test", "Katteker.Test\Katteker.Test.csproj", "{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A45E1C59-BA9E-452C-A5E2-50DE49D53E92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A45E1C59-BA9E-452C-A5E2-50DE49D53E92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A45E1C59-BA9E-452C-A5E2-50DE49D53E92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A45E1C59-BA9E-452C-A5E2-50DE49D53E92}.Release|Any CPU.Build.0 = Release|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Release|Any CPU.Build.0 = Release|Any CPU
{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EAAA54E0-C857-4C5C-BD5D-14A21D462081}
EndGlobalSection
EndGlobal

View File

@ -1,141 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Katteker.Test</RootNamespace>
<AssemblyName>Katteker.Test</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="nunit.framework, Version=3.12.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="KattekerLibTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="testdata\Autofac.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Autofac.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Example.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Example.vshost.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Katteker.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Katteker.UserInterface.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Katteker.UserInterface.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Microsoft.Practices.ServiceLocation.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Microsoft.Practices.ServiceLocation.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.Autofac.Wpf.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.Autofac.Wpf.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.Wpf.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.Wpf.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\Prism.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="testdata\System.Windows.Interactivity.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="testdata\changelog.md">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="testdata\Example.exe.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="testdata\Katteker.UserInterface.dll.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="testdata\Prism.Autofac.Wpf.dll.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="testdata\squirrelHelperInfo.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Katteker\Katteker.csproj">
<Project>{4cd50166-c3ab-4cc4-9694-951a3f33addb}</Project>
<Name>Katteker</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<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\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.10.0\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
</Target>
</Project>

View File

@ -1,19 +0,0 @@
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("Katteker.Test")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Katteker.Test")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("76e9e47e-c810-4c13-bac3-1f53cf4bcb92")]
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Net.Compilers" version="2.10.0" targetFramework="net462" developmentDependency="true" />
<package id="NUnit" version="3.12.0" targetFramework="net462" />
<package id="NUnit3TestAdapter" version="3.15.1" targetFramework="net462" />
</packages>

View File

@ -1,5 +0,0 @@
# Changelog
## 1.0.0
- Hello World

View File

@ -3,27 +3,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28606.126
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppStub", "AppStub\AppStub.csproj", "{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.UserInterface", "src\Katteker.Gui\Katteker.UserInterface.csproj", "{07E2DE31-80A0-43DA-B307-1CA47CD930A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example", "Example\Example.csproj", "{DE9CFDEB-40B8-447D-9959-31BA78512CED}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.Test", "src\Katteker.Test\Katteker.Test.csproj", "{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.UserInterface", "Katteker.Gui\Katteker.UserInterface.csproj", "{07E2DE31-80A0-43DA-B307-1CA47CD930A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.Test", "Katteker.Test\Katteker.Test.csproj", "{76E9E47E-C810-4C13-BAC3-1F53CF4BCB92}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KattekerCreator", "KattekerCreator\KattekerCreator.csproj", "{0B728D86-CAB8-4259-925B-3CB37BE111ED}"
ProjectSection(ProjectDependencies) = postProject
{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B} = {E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}
EndProjectSection
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KattekerCreator", "src\KattekerCreator\KattekerCreator.csproj", "{0B728D86-CAB8-4259-925B-3CB37BE111ED}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{148E4735-4CF1-4A24-B689-063DCD6B9A5B}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Katteker", "Katteker\Katteker.csproj", "{4CD50166-C3AB-4CC4-9694-951A3F33ADDB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Katteker", "src\Katteker\Katteker.csproj", "{4CD50166-C3AB-4CC4-9694-951A3F33ADDB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleCore", "ExampleCore\ExampleCore.csproj", "{39AF52DA-AD79-46DD-87FC-A19D13CEB2AB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExampleCore", "ExampleCore\ExampleCore.csproj", "{39AF52DA-AD79-46DD-87FC-A19D13CEB2AB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IconExtractor", "src\IconExtractor\IconExtractor.csproj", "{C65A4554-4EBB-4CEE-A73F-DBC3B07F001B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Katteker.Changelog", "src\Katteker.Changelog\Katteker.Changelog.csproj", "{7004EBBD-87AA-49E6-BF1C-FF933BA028FE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -31,14 +28,6 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E746AE0F-BEEA-4C18-9ED8-2E708ED00A5B}.Release|Any CPU.Build.0 = Release|Any CPU
{DE9CFDEB-40B8-447D-9959-31BA78512CED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE9CFDEB-40B8-447D-9959-31BA78512CED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE9CFDEB-40B8-447D-9959-31BA78512CED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE9CFDEB-40B8-447D-9959-31BA78512CED}.Release|Any CPU.Build.0 = Release|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07E2DE31-80A0-43DA-B307-1CA47CD930A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -59,6 +48,14 @@ Global
{39AF52DA-AD79-46DD-87FC-A19D13CEB2AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{39AF52DA-AD79-46DD-87FC-A19D13CEB2AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{39AF52DA-AD79-46DD-87FC-A19D13CEB2AB}.Release|Any CPU.Build.0 = Release|Any CPU
{C65A4554-4EBB-4CEE-A73F-DBC3B07F001B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C65A4554-4EBB-4CEE-A73F-DBC3B07F001B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C65A4554-4EBB-4CEE-A73F-DBC3B07F001B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C65A4554-4EBB-4CEE-A73F-DBC3B07F001B}.Release|Any CPU.Build.0 = Release|Any CPU
{7004EBBD-87AA-49E6-BF1C-FF933BA028FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7004EBBD-87AA-49E6-BF1C-FF933BA028FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7004EBBD-87AA-49E6-BF1C-FF933BA028FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7004EBBD-87AA-49E6-BF1C-FF933BA028FE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,102 +0,0 @@
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
namespace Katteker
{
/// <summary>
/// Helps handle the Changelog.
/// </summary>
public static class ChangelogHelper
{
/// <summary>
/// Format the Changelog as Html compilant file.s
/// </summary>
/// <param name="text"></param>
/// <param name="extension"></param>
/// <returns></returns>
public static string ChangelogAsHtml(this string text, string extension)
{
string result;
switch (extension)
{
case ".txt":
var plainText = WebUtility.HtmlEncode(text);
result = plainText.Replace(Environment.NewLine, "<br />");
break;
case ".md":
result = new MarkdownSharp.Markdown().Transform(text);
break;
default:
result = text;
break;
}
return result;
}
/// <summary>
/// Load changelog from Web or use the local file, if it fails.
/// </summary>
/// <param name="filename"></param>
/// <param name="path"></param>
/// <returns></returns>
public static async Task<string> LoadChangelogAsync(string filename, string path)
{
if (!string.IsNullOrEmpty(filename) || !string.IsNullOrEmpty(path))
{
if (!path.EndsWith("/", StringComparison.Ordinal))
path += "/";
var changelog = await ReadFromRemoteFile(path + filename) ?? ReadFromLocalFile(filename);
return changelog;
}
return null;
}
private static async Task<string> ReadFromRemoteFile(string path)
{
var webReq = WebRequest.Create(path);
try
{
using (var response = await webReq.GetResponseAsync().ConfigureAwait(false))
{
var responseStream = response.GetResponseStream();
if (responseStream == null) return null;
using (var sr = new StreamReader(responseStream))
{
return await sr.ReadToEndAsync().ConfigureAwait(false);
}
}
}
catch (Exception)
{
// ignore;
}
return null;
}
private static string ReadFromLocalFile(string filename)
{
try
{
var changelogFilename = Path.GetFileName(filename);
if (changelogFilename == null) return null;
var currentChangelogPath = Path.Combine(Environment.CurrentDirectory, changelogFilename);
if (File.Exists(currentChangelogPath))
{
return File.ReadAllText(currentChangelogPath);
}
}
catch (Exception)
{
// ignore;
}
return null;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,536 +0,0 @@
using System;
#if !NETSTANDARD
using System.Globalization;
using System.Runtime.Serialization;
using System.Security.Permissions;
#endif
using System.Text.RegularExpressions;
namespace Semver
{
/// <summary>
/// A semantic version implementation.
/// Conforms to v2.0.0 of http://semver.org/
/// </summary>
#if NETSTANDARD
public sealed class SemVersion : IComparable<SemVersion>, IComparable
#else
[Serializable]
public sealed class SemVersion : IComparable<SemVersion>, IComparable, ISerializable
#endif
{
static Regex _parseEx =
new Regex(@"^(?<major>\d+)" +
@"(\.(?<minor>\d+))?" +
@"(\.(?<patch>\d+))?" +
@"(\-(?<pre>[0-9A-Za-z\-\.]+))?" +
@"(\+(?<build>[0-9A-Za-z\-\.]+))?$",
#if NETSTANDARD
RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture);
#else
RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.ExplicitCapture);
#endif
#if !NETSTANDARD
/// <summary>
/// Initializes a new instance of the <see cref="SemVersion" /> class.
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
/// <exception cref="ArgumentNullException"></exception>
private SemVersion(SerializationInfo info, StreamingContext context)
{
if (info == null) throw new ArgumentNullException(nameof(info));
var semVersion = Parse(info.GetString("SemVersion"));
Major = semVersion.Major;
Minor = semVersion.Minor;
Patch = semVersion.Patch;
Prerelease = semVersion.Prerelease;
Build = semVersion.Build;
}
#endif
/// <summary>
/// Initializes a new instance of the <see cref="SemVersion" /> class.
/// </summary>
/// <param name="major">The major version.</param>
/// <param name="minor">The minor version.</param>
/// <param name="patch">The patch version.</param>
/// <param name="prerelease">The prerelease version (eg. "alpha").</param>
/// <param name="build">The build eg ("nightly.232").</param>
public SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "", string build = "")
{
this.Major = major;
this.Minor = minor;
this.Patch = patch;
this.Prerelease = prerelease ?? "";
this.Build = build ?? "";
}
/// <summary>
/// Initializes a new instance of the <see cref="SemVersion"/> class.
/// </summary>
/// <param name="version">The <see cref="System.Version"/> that is used to initialize
/// the Major, Minor, Patch and Build properties.</param>
public SemVersion(Version version)
{
if (version == null)
throw new ArgumentNullException(nameof(version));
this.Major = version.Major;
this.Minor = version.Minor;
if (version.Revision >= 0)
{
this.Patch = version.Revision;
}
this.Prerelease = string.Empty;
if (version.Build > 0)
{
this.Build = version.Build.ToString();
}
else
{
this.Build = string.Empty;
}
}
/// <summary>
/// Parses the specified string to a semantic version.
/// </summary>
/// <param name="version">The version string.</param>
/// <param name="strict">If set to <c>true</c> minor and patch version are required, else they default to 0.</param>
/// <returns>The SemVersion object.</returns>
/// <exception cref="System.InvalidOperationException">When a invalid version string is passed.</exception>
public static SemVersion Parse(string version, bool strict = false)
{
var match = _parseEx.Match(version);
if (!match.Success)
throw new ArgumentException("Invalid version.", nameof(version));
#if NETSTANDARD
var major = int.Parse(match.Groups["major"].Value);
#else
var major = int.Parse(match.Groups["major"].Value, CultureInfo.InvariantCulture);
#endif
var minorMatch = match.Groups["minor"];
var minor = 0;
if (minorMatch.Success)
{
#if NETSTANDARD
minor = int.Parse(minorMatch.Value);
#else
minor = int.Parse(minorMatch.Value, CultureInfo.InvariantCulture);
#endif
}
else if (strict)
{
throw new InvalidOperationException("Invalid version (no minor version given in strict mode)");
}
var patchMatch = match.Groups["patch"];
var patch = 0;
if (patchMatch.Success)
{
#if NETSTANDARD
patch = int.Parse(patchMatch.Value);
#else
patch = int.Parse(patchMatch.Value, CultureInfo.InvariantCulture);
#endif
}
else if (strict)
{
throw new InvalidOperationException("Invalid version (no patch version given in strict mode)");
}
var prerelease = match.Groups["pre"].Value;
var build = match.Groups["build"].Value;
return new SemVersion(major, minor, patch, prerelease, build);
}
/// <summary>
/// Parses the specified string to a semantic version.
/// </summary>
/// <param name="version">The version string.</param>
/// <param name="semver">When the method returns, contains a SemVersion instance equivalent
/// to the version string passed in, if the version string was valid, or <c>null</c> if the
/// version string was not valid.</param>
/// <param name="strict">If set to <c>true</c> minor and patch version are required, else they default to 0.</param>
/// <returns><c>False</c> when a invalid version string is passed, otherwise <c>true</c>.</returns>
public static bool TryParse(string version, out SemVersion semver, bool strict = false)
{
try
{
semver = Parse(version, strict);
return true;
}
catch (Exception)
{
semver = null;
return false;
}
}
/// <summary>
/// Tests the specified versions for equality.
/// </summary>
/// <param name="versionA">The first version.</param>
/// <param name="versionB">The second version.</param>
/// <returns>If versionA is equal to versionB <c>true</c>, else <c>false</c>.</returns>
public static bool Equals(SemVersion versionA, SemVersion versionB)
{
if (ReferenceEquals(versionA, null))
return ReferenceEquals(versionB, null);
return versionA.Equals(versionB);
}
/// <summary>
/// Compares the specified versions.
/// </summary>
/// <param name="versionA">The version to compare to.</param>
/// <param name="versionB">The version to compare against.</param>
/// <returns>If versionA &lt; versionB <c>&lt; 0</c>, if versionA &gt; versionB <c>&gt; 0</c>,
/// if versionA is equal to versionB <c>0</c>.</returns>
public static int Compare(SemVersion versionA, SemVersion versionB)
{
if (ReferenceEquals(versionA, null))
return ReferenceEquals(versionB, null) ? 0 : -1;
return versionA.CompareTo(versionB);
}
/// <summary>
/// Make a copy of the current instance with optional altered fields.
/// </summary>
/// <param name="major">The major version.</param>
/// <param name="minor">The minor version.</param>
/// <param name="patch">The patch version.</param>
/// <param name="prerelease">The prerelease text.</param>
/// <param name="build">The build text.</param>
/// <returns>The new version object.</returns>
public SemVersion Change(int? major = null, int? minor = null, int? patch = null,
string prerelease = null, string build = null)
{
return new SemVersion(
major ?? this.Major,
minor ?? this.Minor,
patch ?? this.Patch,
prerelease ?? this.Prerelease,
build ?? this.Build);
}
/// <summary>
/// Gets the major version.
/// </summary>
/// <value>
/// The major version.
/// </value>
public int Major { get; }
/// <summary>
/// Gets the minor version.
/// </summary>
/// <value>
/// The minor version.
/// </value>
public int Minor { get; }
/// <summary>
/// Gets the patch version.
/// </summary>
/// <value>
/// The patch version.
/// </value>
public int Patch { get; }
/// <summary>
/// Gets the pre-release version.
/// </summary>
/// <value>
/// The pre-release version.
/// </value>
public string Prerelease { get; }
/// <summary>
/// Gets the build version.
/// </summary>
/// <value>
/// The build version.
/// </value>
public string Build { get; }
/// <summary>
/// Returns a <see cref="System.String" /> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String" /> that represents this instance.
/// </returns>
public override string ToString()
{
var version = "" + Major + "." + Minor + "." + Patch;
if (!string.IsNullOrEmpty(Prerelease))
version += "-" + Prerelease;
if (!string.IsNullOrEmpty(Build))
version += "+" + Build;
return version;
}
/// <summary>
/// Compares the current instance with another object of the same type and returns an integer that indicates
/// whether the current instance precedes, follows, or occurs in the same position in the sort order as the
/// other object.
/// </summary>
/// <param name="obj">An object to compare with this instance.</param>
/// <returns>
/// A value that indicates the relative order of the objects being compared.
/// The return value has these meanings: Value Meaning Less than zero
/// This instance precedes <paramref name="obj" /> in the sort order.
/// Zero This instance occurs in the same position in the sort order as <paramref name="obj" />. i
/// Greater than zero This instance follows <paramref name="obj" /> in the sort order.
/// </returns>
public int CompareTo(object obj)
{
return CompareTo((SemVersion)obj);
}
/// <summary>
/// Compares the current instance with another object of the same type and returns an integer that indicates
/// whether the current instance precedes, follows, or occurs in the same position in the sort order as the
/// other object.
/// </summary>
/// <param name="other">An object to compare with this instance.</param>
/// <returns>
/// A value that indicates the relative order of the objects being compared.
/// The return value has these meanings: Value Meaning Less than zero
/// This instance precedes <paramref name="other" /> in the sort order.
/// Zero This instance occurs in the same position in the sort order as <paramref name="other" />. i
/// Greater than zero This instance follows <paramref name="other" /> in the sort order.
/// </returns>
public int CompareTo(SemVersion other)
{
if (ReferenceEquals(other, null))
return 1;
var r = this.CompareByPrecedence(other);
if (r != 0)
return r;
r = CompareComponent(this.Build, other.Build);
return r;
}
/// <summary>
/// Compares to semantic versions by precedence. This does the same as a Equals, but ignores the build information.
/// </summary>
/// <param name="other">The semantic version.</param>
/// <returns><c>true</c> if the version precedence matches.</returns>
public bool PrecedenceMatches(SemVersion other)
{
return CompareByPrecedence(other) == 0;
}
/// <summary>
/// Compares to semantic versions by precedence. This does the same as a Equals, but ignores the build information.
/// </summary>
/// <param name="other">The semantic version.</param>
/// <returns>
/// A value that indicates the relative order of the objects being compared.
/// The return value has these meanings: Value Meaning Less than zero
/// This instance precedes <paramref name="other" /> in the version precedence.
/// Zero This instance has the same precedence as <paramref name="other" />. i
/// Greater than zero This instance has creater precedence as <paramref name="other" />.
/// </returns>
public int CompareByPrecedence(SemVersion other)
{
if (ReferenceEquals(other, null))
return 1;
var r = this.Major.CompareTo(other.Major);
if (r != 0) return r;
r = this.Minor.CompareTo(other.Minor);
if (r != 0) return r;
r = this.Patch.CompareTo(other.Patch);
if (r != 0) return r;
r = CompareComponent(this.Prerelease, other.Prerelease, true);
return r;
}
private static int CompareComponent(string a, string b, bool lower = false)
{
var aEmpty = string.IsNullOrEmpty(a);
var bEmpty = string.IsNullOrEmpty(b);
if (aEmpty && bEmpty)
return 0;
if (aEmpty)
return lower ? 1 : -1;
if (bEmpty)
return lower ? -1 : 1;
var aComps = a.Split('.');
var bComps = b.Split('.');
var minLen = Math.Min(aComps.Length, bComps.Length);
for (var i = 0; i < minLen; i++)
{
var ac = aComps[i];
var bc = bComps[i];
var isanum = int.TryParse(ac, out var anum);
var isbnum = int.TryParse(bc, out var bnum);
int r;
if (isanum && isbnum)
{
r = anum.CompareTo(bnum);
if (r != 0) return anum.CompareTo(bnum);
}
else
{
if (isanum)
return -1;
if (isbnum)
return 1;
r = string.CompareOrdinal(ac, bc);
if (r != 0)
return r;
}
}
return aComps.Length.CompareTo(bComps.Length);
}
/// <summary>
/// Determines whether the specified <see cref="System.Object" /> is equal to this instance.
/// </summary>
/// <param name="obj">The <see cref="System.Object" /> to compare with this instance.</param>
/// <returns>
/// <c>true</c> if the specified <see cref="System.Object" /> is equal to this instance; otherwise, <c>false</c>.
/// </returns>
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null))
return false;
if (ReferenceEquals(this, obj))
return true;
var other = (SemVersion)obj;
return this.Major == other.Major &&
this.Minor == other.Minor &&
this.Patch == other.Patch &&
string.Equals(this.Prerelease, other.Prerelease, StringComparison.Ordinal) &&
string.Equals(this.Build, other.Build, StringComparison.Ordinal);
}
/// <summary>
/// Returns a hash code for this instance.
/// </summary>
/// <returns>
/// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
/// </returns>
public override int GetHashCode()
{
unchecked
{
var result = Major.GetHashCode();
result = (result * 31) + Minor.GetHashCode();
result = (result * 31) + Patch.GetHashCode();
result = (result * 31) + Prerelease.GetHashCode();
result = (result * 31) + Build.GetHashCode();
return result;
}
}
#if !NETSTANDARD
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null) throw new ArgumentNullException(nameof(info));
info.AddValue("SemVersion", ToString());
}
#endif
/// <summary>
/// Implicit conversion from string to SemVersion.
/// </summary>
/// <param name="version">The semantic version.</param>
/// <returns>The SemVersion object.</returns>
public static implicit operator SemVersion(string version)
{
return Parse(version);
}
/// <summary>
/// The override of the equals operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is equal to right <c>true</c>, else <c>false</c>.</returns>
public static bool operator ==(SemVersion left, SemVersion right)
{
return Equals(left, right);
}
/// <summary>
/// The override of the un-equal operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is not equal to right <c>true</c>, else <c>false</c>.</returns>
public static bool operator !=(SemVersion left, SemVersion right)
{
return !Equals(left, right);
}
/// <summary>
/// The override of the greater operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is greater than right <c>true</c>, else <c>false</c>.</returns>
public static bool operator >(SemVersion left, SemVersion right)
{
return Compare(left, right) > 0;
}
/// <summary>
/// The override of the greater than or equal operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is greater than or equal to right <c>true</c>, else <c>false</c>.</returns>
public static bool operator >=(SemVersion left, SemVersion right)
{
return left == right || left > right;
}
/// <summary>
/// The override of the less operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is less than right <c>true</c>, else <c>false</c>.</returns>
public static bool operator <(SemVersion left, SemVersion right)
{
return Compare(left, right) < 0;
}
/// <summary>
/// The override of the less than or equal operator.
/// </summary>
/// <param name="left">The left value.</param>
/// <param name="right">The right value.</param>
/// <returns>If left is less than or equal to right <c>true</c>, else <c>false</c>.</returns>
public static bool operator <=(SemVersion left, SemVersion right)
{
return left == right || left < right;
}
}
}

View File

@ -1,9 +0,0 @@

// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0046:Convert to conditional expression", Justification = "<Pending>", Scope = "member", Target = "~M:Katteker.ReleaseEntry.CompareTo(Katteker.ReleaseEntry)~System.Int32")]
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0046:Convert to conditional expression", Justification = "<Pending>", Scope = "member", Target = "~M:Katteker.VersionUtils.GetCurrentVersion(System.Reflection.Assembly)~Semver.SemVersion")]

View File

@ -1,16 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<LangVersion>latest</LangVersion>
<Version>1.1.5</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers" Version="2.10.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

View File

@ -1,155 +0,0 @@
using Semver;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
namespace Katteker
{
/// <inheritdoc cref="IComparable" />
/// <summary>
/// Entry of a Release.
/// </summary>
public class ReleaseEntry : IComparable<ReleaseEntry>, IComparable
{
private const string FilenameRegex = @"(^.*)-((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?).*-(full|delta)";
private const char Separator = '|';
/// <summary>
/// Creates an instance of <see cref="ReleaseEntry"/>.
/// </summary>
public ReleaseEntry(string filename, SemVersion version, long fileSize, bool isDelta, string sha1)
{
Filename = filename;
Version = version;
FileSize = fileSize;
IsDelta = isDelta;
SHA1 = sha1;
}
/// <summary>
/// Create an instance of <see cref="ReleaseEntry"/> from string.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Argument 'line' has not the right format.</exception>
/// <exception cref="ArgumentNullException">Argument 'line' is null.</exception>
/// <exception cref="FileLoadException">Filename is not compliant.</exception>
public ReleaseEntry(string line)
{
if (line == null) throw new ArgumentNullException(nameof(line));
var elements = line.Split(Separator);
if (elements.Length != 3)
{
throw new ArgumentOutOfRangeException(nameof(line), elements.Length, "The release entry has not the right format.");
}
SHA1 = elements[0];
Filename = elements[1];
FileSize = long.Parse(elements[2]);
var fileSegments = Regex.Match(Filename, FilenameRegex);
if (fileSegments.Groups.Count < 3) throw new FileLoadException("Filename is not compilant.");
ApplicationName = fileSegments.Groups[1].Value;
Version = SemVersion.Parse(fileSegments.Groups[2].Value);
IsDelta = fileSegments.Groups[3].Value != "full";
}
/// <summary>
/// cunstruct release entry from application name and version.
/// </summary>
/// <param name="applicationName"></param>
/// <param name="version"></param>
public ReleaseEntry(string applicationName, SemVersion version)
{
ApplicationName = applicationName;
Version = version;
}
/// <summary>
/// Version
/// </summary>
public SemVersion Version { get; }
/// <summary>
/// Hashsum of the file.
/// </summary>
public string SHA1 { get; }
/// <summary>
/// filename
/// </summary>
public string Filename { get; }
/// <summary>
/// Size of the file.
/// </summary>
public long FileSize { get; }
/// <summary>
/// Is true if the update is delta file. False otherwise.
/// </summary>
public bool IsDelta { get; }
/// <summary>
/// Name of the application.
/// </summary>
public string ApplicationName { get; }
/// <summary>
/// Format the release entry as line for release file.
/// </summary>
public string EntryAsString => $"{SHA1}{Separator}{Filename}{Separator}{FileSize}";
/// <inheritdoc />
public override string ToString() => $"{ApplicationName} {Version}";
/// <inheritdoc />
public int CompareTo(object obj) => CompareTo(obj as ReleaseEntry);
/// <inheritdoc />
public int CompareTo(ReleaseEntry other)
{
if (ReferenceEquals(this, other)) return 0;
if (other is null) return 1;
var versionComparison = Comparer<SemVersion>.Default.Compare(Version, other.Version);
if (versionComparison != 0) return versionComparison;
return string.Compare(Filename, other.Filename, StringComparison.Ordinal);
}
/// <inheritdoc />
public override bool Equals(object obj) => Equals(obj as ReleaseEntry);
/// <summary>
/// Returns true if the instances are equal. False otherwise.
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
protected bool Equals(ReleaseEntry other)
{
return Equals(Version, other.Version) && string.Equals(SHA1, other.SHA1) && string.Equals(Filename, other.Filename) && FileSize == other.FileSize && IsDelta == other.IsDelta;
}
/// <inheritdoc />
public override int GetHashCode()
{
unchecked
{
var hashCode = Version != null ? Version.GetHashCode() : 0;
hashCode = (hashCode * 397) ^ (SHA1 != null ? SHA1.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (Filename != null ? Filename.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ FileSize.GetHashCode();
hashCode = (hashCode * 397) ^ IsDelta.GetHashCode();
return hashCode;
}
}
/// <summary>
/// Returns true if the left and right instances are equal.
/// </summary>
public static bool operator ==(ReleaseEntry left, ReleaseEntry right) => Equals(left, right);
/// <summary>
/// Returns true if the left and right instances are not equal.
/// </summary>
public static bool operator !=(ReleaseEntry left, ReleaseEntry right) => !Equals(left, right);
}
}

View File

@ -1,38 +0,0 @@
using System;
using System.Reflection;
using Semver;
namespace Katteker
{
/// <summary>
/// Utils for the App-Version.
/// </summary>
public static class VersionUtils
{
/// <summary>
/// Get the current Version of Application.
/// </summary>
public static SemVersion GetCurrentVersion(Assembly assembly = null)
{
var a = assembly ?? Assembly.GetEntryAssembly();
var assemblyVersion = a.GetName().Version.ToString(3);
var getCurrentVersion = SemVersion.Parse(assemblyVersion);
var informalVersion = a.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
if (informalVersion != null && SemVersion.TryParse(informalVersion, out var semVersion))
return semVersion;
return getCurrentVersion;
}
/// <summary>
/// Get the System.Version representation of a semantic version.
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static Version ToSystemVersion(this SemVersion value) => new Version(value.Major, value.Minor, value.Patch, 0);
/// <summary>
/// Get the current Version of Application.
/// </summary>
public static string GetFullVersion => GetCurrentVersion().ToString();
}
}

View File

@ -1,58 +0,0 @@
using System;
namespace KattekerCreator.Helper
{
public static class Log
{
private const string Info = "INFO";
private const string Error = "ERROR";
public static void WriteInfoLine(string text)
{
using (new ConsoleWithOtherColor())
{
ConsoleWithOtherColor.WriteLine($"{Info} [{DateTime.Now:G}] {text}");
}
}
public static void WriteErrorLine(string text)
{
using (new ConsoleWithOtherColor(ConsoleColor.DarkRed))
{
ConsoleWithOtherColor.WriteLine($"{Error} [{DateTime.Now:G}] {text}");
}
}
}
public class ConsoleWithOtherColor : IDisposable
{
public ConsoleWithOtherColor()
{
}
private readonly ConsoleColor? _defaultColor;
public ConsoleWithOtherColor(ConsoleColor color)
{
_defaultColor = Console.ForegroundColor;
Console.ForegroundColor = color;
}
public static void WriteLine(string text)
{
Console.WriteLine(text);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!disposing) return;
if (_defaultColor != null) Console.ForegroundColor = _defaultColor.Value;
}
}
}

View File

@ -1,157 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using KattekerCreator.Exceptions;
using Minimatch;
using Vestris.ResourceLib;
namespace KattekerCreator.Helper
{
public static class Utils
{
public static bool CheckFileExistens(string filePath)
{
if (File.Exists(filePath)) return true;
var file = filePath.Replace(Directory.GetParent(filePath) + "\\", "");
Console.WriteLine("Checking the prerequisites has failed.");
Console.WriteLine($"{file} is missing. Program exits now.");
Console.ReadKey();
return false;
}
public static bool IsFilesizeWrong(string filename)
{
var file = new FileInfo(filename);
return !file.Exists || file.Length < 524288;
}
public static void CopyResources(string inFile, string outFile)
{
using (var ri = new ResourceInfo())
{
ri.Load(inFile);
if (ri.ResourceTypes.Any(x => x.ResourceType == Kernel32.ResourceTypes.RT_GROUP_ICON))
{
var groupIcon = ri[Kernel32.ResourceTypes.RT_GROUP_ICON];
var iconDictionary = groupIcon.FirstOrDefault() as IconDirectoryResource;
iconDictionary?.SaveTo(outFile);
}
if (ri.ResourceTypes.Any(x => x.ResourceType == Kernel32.ResourceTypes.RT_VERSION))
{
var versionResource = (VersionResource)ri[Kernel32.ResourceTypes.RT_VERSION].First();
versionResource.Language = 0;
versionResource.SaveTo(outFile);
}
}
}
/// <summary>
/// Get the signtool.exe command line. Returns "" if no certificate string is provided.
/// </summary>
/// <param name="certificate"></param>
/// <param name="password"></param>
/// <param name="filename"></param>
/// <returns></returns>
public static string GetSignToolCommandLine(string certificate, string password, string filename)
{
return string.IsNullOrWhiteSpace(certificate)
? string.Empty
: $"\"{GetSignTool()}\" {GetSignToolParameters(certificate, password, filename)}";
}
public static string GetSignToolParameters(string certificate, string password, string filename)
{
return $"sign /fd SHA256 /t http://timestamp.digicert.com /f \"{certificate}\" /p {password} {filename}";
}
public static string GetSignTool()
{
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "contrib", "signtool.exe");
}
public static void DeleteTempDir(string tempDir)
{
#if !DEBUG
try
{
Directory.Delete(tempDir, true);
}
catch
{
//silently ignore
}
#endif
}
public static IList<FileInfo> EnumerateFiles(string path, IEnumerable<string> userdefinedFileExclusions = null)
{
if (string.IsNullOrWhiteSpace(path)) throw new ArgumentNullException(nameof(path));
var result = new DirectoryInfo(path).EnumerateFiles("*.*", SearchOption.AllDirectories).ToList();
var minimatchOptions = new Options { AllowWindowsPaths = true };
foreach (var pattern in FileExclusions(userdefinedFileExclusions))
{
var matcher = new Minimatcher(pattern, minimatchOptions);
for (var index = result.Count - 1; index >= 0; index--)
{
if (matcher.IsMatch(result[index].Name))
{
result.Remove(result[index]);
}
}
}
return result;
}
private static IEnumerable<string> FileExclusions(IEnumerable<string> userdefinedfileExclusions = null)
{
yield return "*.pdb";
yield return "*.tmp";
yield return "*.obj";
yield return "*.pch";
yield return "*.vshost.exe*";
yield return "squirrelHelperInfo.json";
yield return "Katteker.config";
if (userdefinedfileExclusions == null) yield break;
foreach (var fileExclusion in userdefinedfileExclusions)
{
yield return fileExclusion;
}
}
public static void SignExecutable(string certificate, string password, string filename)
{
if (!string.IsNullOrWhiteSpace(certificate))
{
var exitCode = ExecuteProcess(GetSignTool(), GetSignToolParameters(certificate, password, filename));
if (exitCode != 0) throw new KattekerCreatorException("AppStub could not signed.");
}
}
public static int ExecuteProcess(string executable, string arguments)
{
int exitCode;
using (var p = new Process())
{
p.StartInfo = new ProcessStartInfo
{
FileName = executable,
Arguments = arguments,
UseShellExecute = false
};
var sw = Stopwatch.StartNew();
p.Start();
p.WaitForExit();
exitCode = p.ExitCode;
Log.WriteInfoLine($"{Path.GetFileName(executable)} has exited with exit code: {exitCode} (Took: {sw.ElapsedMilliseconds}ms)");
}
return exitCode;
}
}
}

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View File

@ -1,178 +0,0 @@
using Katteker;
using KattekerCreator.Helper;
using KattekerCreator.Types;
using McMaster.Extensions.CommandLineUtils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace KattekerCreator
{
internal class Program : ProgramArguments
{
private static readonly string BaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
private static string MakeNsis => Path.Combine(BaseDirectory, "nsis", "makensis.exe");
private AssemblyFileInfo _assemblyFileInfo;
private TemporaryDirectory _tempDir;
private Releases _releases;
static int Main(string[] args)
{
return CommandLineApplication.Execute<Program>(args);
}
protected override int OnExecute(CommandLineApplication app)
{
//Override commandline arguments, if 'ConfigurationPath' is set.
if (TryReadConfigFile(ConfigurationPath, out var dictionary))
{
OverridePropertyValues(this, dictionary);
}
//Create temp-dir
using (_tempDir = TemporaryDirectory.Create())
{
_releases = new Releases(OutputDir);
//Modify AppStub
var appStubFile = ModifyAppStub();
//Acquire infos from Executable.
_assemblyFileInfo = new AssemblyFileInfo(ProgramFile, Version, _tempDir.Path);
var configFile = CreateConfigFile();
//Generate NSIS-Script
var additionalFiles = new[]
{
new PhysicalFile(appStubFile, Path.GetFileName(ProgramFile)),
new PhysicalFile(configFile, Path.Combine($"app-{_assemblyFileInfo.AssemblyVersion}", Path.GetFileName(configFile) ?? string.Empty))
};
var templateFile = GenerateNsisTemplate(additionalFiles);
//Start makensis.exe
var setupFilePath = CompileSetupScript(templateFile);
//TODO Sign setup
Utils.SignExecutable(CertificatePath, CertificatePassword, setupFilePath);
//Copy to Output-Folder
CopyToOutputFolder(setupFilePath);
//Create/Modify RELEASE File
var releaseEntry = AddPackageToReleaseFile(setupFilePath);
//Copy installer as setup.exe
CopyAsSetup(setupFilePath, releaseEntry);
return 0;
}
}
private void CopyToOutputFolder(string setupFilePath)
{
if (setupFilePath == null) throw new ArgumentNullException(nameof(setupFilePath));
var setupFile = Path.GetFileName(setupFilePath);
if (string.IsNullOrEmpty(setupFile)) throw new ArgumentException();
if (!File.Exists(setupFilePath)) throw new FileNotFoundException(setupFile);
if (!Directory.Exists(OutputDir)) Directory.CreateDirectory(OutputDir);
if (!string.IsNullOrEmpty(ChangeLog))
{
var changeLogFilename = Path.GetFileName(ChangeLog);
if (!File.Exists(ChangeLog)) throw new FileNotFoundException(ChangeLog);
File.Copy(ChangeLog, Path.Combine(OutputDir, changeLogFilename), true);
}
File.Copy(setupFilePath, Path.Combine(OutputDir, setupFile), true);
}
private string ModifyAppStub()
{
var baseFile = Path.Combine(BaseDirectory, "contrib", Constants.ExecutionStub);
var targetFile = Path.Combine(_tempDir.Path, Constants.ExecutionStub);
File.Copy(baseFile, targetFile);
Utils.CopyResources(ProgramFile, targetFile);
Utils.SignExecutable(CertificatePath, CertificatePassword, targetFile);
return targetFile;
}
private string CreateConfigFile()
{
var pathToFile = Path.Combine(_tempDir.Path, Constants.KattekerConfig);
var kattekerConfig = new KattekerConfig
{
Publish = PublishDir ?? OutputDir,
Changelog = Path.GetFileName(ChangeLog),
Channel = Channel
};
kattekerConfig.WriteToFile(pathToFile);
return pathToFile;
}
private static string GenerateFilename(string name, string version, string extension, bool isDelta = false) => $"{name}-{version}-{(isDelta ? "delta" : "full")}.{extension}";
private string GenerateNsisTemplate(IEnumerable<PhysicalFile> additionalFiles)
{
try
{
var assemblyName = Path.GetFileNameWithoutExtension(_assemblyFileInfo.FileInfo.Name);
var outFile = Path.Combine(_tempDir.Path, GenerateFilename(assemblyName, _assemblyFileInfo.AssemblyVersion.ToString(), "nsi"));
var setupTemplate = new SetupTemplate
{
Executable = _assemblyFileInfo.FileInfo.Name,
AssemblyName = assemblyName,
AppName = _assemblyFileInfo.ProductName,
CompanyName = _assemblyFileInfo.Company,
Description = _assemblyFileInfo.Description,
IconPath = _assemblyFileInfo.AssemblyIconPath,
Version = _assemblyFileInfo.AssemblyVersion,
HelpUrl = "http://example.org", //Not used at the moment.
UserInterface = Path.Combine(BaseDirectory, "contrib", "LoadingBar_Icon.exe"),
UninstallIcon = Path.Combine(BaseDirectory, "contrib", "uninstall.ico"),
OutFile = Path.GetFileName(Path.ChangeExtension(outFile, "exe")),
ReleaseChannel = Channel
};
var path = Path.GetDirectoryName(ProgramFile) ?? string.Empty;
setupTemplate.Files.AddRange(additionalFiles);
var files = Utils.EnumerateFiles(path, Filter).ToArray();
setupTemplate.InstallSize = (long)Math.Floor(files.Sum(x => x.Length) / 1024f);
setupTemplate.Files.AddRange(files.Select(x => new PhysicalFile(x.FullName, x.FullName.Replace(path, $"app-{_assemblyFileInfo.AssemblyVersion}"))));
var transformText = setupTemplate.TransformText();
File.WriteAllText(outFile, transformText);
return outFile;
}
catch (Exception e)
{
Log.WriteErrorLine(e.Message);
throw;
}
}
private static string CompileSetupScript(string templateFile)
{
if (!File.Exists(MakeNsis)) throw new FileNotFoundException("NSIS not installed properly.");
var exitCode = Utils.ExecuteProcess(MakeNsis, $"\"{templateFile}\"");
if (exitCode != 0) throw new Exception($"{Path.GetFileName(MakeNsis)} has exited with exit code: {exitCode}");
return Path.ChangeExtension(templateFile, "exe");
}
private ReleaseEntry AddPackageToReleaseFile(string setupFilePath)
{
try
{
var result = _releases.Add(setupFilePath, _assemblyFileInfo.AssemblyVersion);
_releases.WriteReleaseFile();
return result;
}
catch (Exception e)
{
Log.WriteErrorLine(e.Message);
throw;
}
}
private void CopyAsSetup(string setupFilePath, ReleaseEntry releaseEntry)
{
if (!_releases.IsLatestEntry(releaseEntry)) return;
var target = Path.Combine(OutputDir, Constants.SetupFile);
File.Delete(target);
File.Copy(setupFilePath, target);
}
}
}

View File

@ -1,8 +0,0 @@
{
"profiles": {
"KattekerCreator": {
"commandName": "Project",
"commandLineArgs": "\"E:\\BuildTools\\Katteker\\KattekerCreator.exe\" \"$(build.artifactstagingdirectory)\\bin\\$(BuildConfiguration)\\TfsMigrationTool.exe\" -O \"\\\\srv-lsimctrl01\\Squirrel\\TfsMigrationTool\" -P \"https://srv-lsimctrl01.enercon.de/squirrel/TfsMigrationTool\" -F \"**\\*.xml\" -S \"E:\\BuildTools\\certificate\\WRD_Code_Signing_Certificate_2019.pfx\" -Sp dpLRlzn7.Q,S"
}
}
}

View File

@ -1,53 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Katteker;
using KattekerCreator.Types;
using Semver;
namespace KattekerCreator
{
public partial class SetupTemplate
{
public string AppName
{
get => _appName + ReleaseChannel;
set => _appName = value;
}
public string Executable { get; set; }
public string CompanyName { get; set; }
public string Description { get; set; }
public SemVersion Version { get; set; }
public Version LegacyVersion => Version.ToSystemVersion();
public string HelpUrl { get; set; }
public long InstallSize { get; set; }
public bool IsManaged { get; set; }
public string IconPath { get; set; }
public string SourcePath { get; set; } = string.Empty;
public List<PhysicalFile> Files { get; set; } = new List<PhysicalFile>();
private IEnumerable<string> Directories => DirectoriesToCreate();
public string UserInterface { get; set; }
public string OutFile { get; set; }
public string UninstallIcon { get; set; }
public string ReleaseChannel { get; set; }
public string AssemblyName { get; set; }
private readonly List<PathFragments> _directoriesList = new List<PathFragments>();
private string _appName;
private IEnumerable<string> DirectoriesToCreate()
{
foreach (var physicalFile in Files)
{
var dirSplit = new PathFragments(physicalFile.Target);
if (dirSplit.FragmentLength > 1 && !_directoriesList.Contains(dirSplit))
{
_directoriesList.Add(dirSplit);
}
}
return _directoriesList.Select(x => x.ToString());
}
}
}

View File

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Reflection;
namespace KattekerCreator
{
internal static class T4Extensions
{
public static MethodInfo GetMethod(this Type type, string method, params Type[] parameters)
{
return type.GetRuntimeMethod(method, parameters);
}
}
}
namespace System.CodeDom.Compiler
{
public class CompilerErrorCollection : List<CompilerError>
{
}
public class CompilerError
{
public string ErrorText { get; set; }
public bool IsWarning { get; set; }
}
}

View File

@ -1,87 +0,0 @@
using System;
using System.Drawing;
using System.IO;
using System.Linq;
using Semver;
using TsudaKageyu;
using Vestris.ResourceLib;
namespace KattekerCreator.Types
{
public class AssemblyFileInfo
{
private readonly string _company;
private readonly string _copyright;
private readonly string _description;
private readonly string _productName;
public AssemblyFileInfo(string programFile, string version, string tempDir)
{
FileInfo = new FileInfo(programFile);
using var resourceInfo = new ResourceInfo();
resourceInfo.Load(programFile);
if (resourceInfo.ResourceTypes.All(x => x.ResourceType != Kernel32.ResourceTypes.RT_VERSION)) return;
var versionResource = (VersionResource)resourceInfo[Kernel32.ResourceTypes.RT_VERSION][0];
var stringFileInfo = ((StringFileInfo)versionResource[nameof(StringFileInfo)]).Strings
.FirstOrDefault().Value;
AssemblyIconPath = GetAssemblyIcon(programFile, tempDir);
if (stringFileInfo.Strings.ContainsKey("CompanyName"))
_company = stringFileInfo.Strings["CompanyName"].StringValue.TrimEnd('\0');
if (stringFileInfo.Strings.ContainsKey("FileDescription"))
_description = stringFileInfo.Strings["FileDescription"].StringValue.TrimEnd('\0');
if (stringFileInfo.Strings.ContainsKey("LegalCopyright"))
_copyright = stringFileInfo.Strings["LegalCopyright"].StringValue.TrimEnd('\0');
if (stringFileInfo.Strings.ContainsKey("ProductName"))
_productName = stringFileInfo.Strings["ProductName"].StringValue.TrimEnd('\0');
if (!stringFileInfo.Strings.ContainsKey("ProductVersion")) return;
AssemblyVersion = version != null ? GetSemanticVersion(version) : GetSemanticVersion(stringFileInfo.Strings["ProductVersion"].StringValue.TrimEnd('\0'));
}
public string AssemblyIconPath { get; }
public SemVersion AssemblyVersion { get; }
public string Company => _company ?? string.Empty;
public string Copyright => _copyright ?? string.Empty;
public string Description => _description ?? string.Empty;
public FileInfo FileInfo { get; }
public string ProductName => _productName ?? Description;
private static string GetAssemblyIcon(string programFile, string tempDir)
{
var applicationIcon = Path.Combine(tempDir, "application.ico");
if (string.IsNullOrWhiteSpace(programFile)) throw new ApplicationException("Program not set.");
if (!File.Exists(programFile)) throw new ApplicationException("Program not found.");
if (File.Exists(applicationIcon)) File.Delete(applicationIcon);
using (var fileStream = new FileStream(applicationIcon, FileMode.CreateNew))
{
try
{
var ie = new IconExtractor(programFile);
using var icon = ie.GetIcon(0);
icon?.Save(fileStream);
}
catch (Exception)
{
using var icon = Icon.ExtractAssociatedIcon(programFile);
icon?.Save(fileStream);
}
}
return applicationIcon;
}
private static SemVersion GetSemanticVersion(string productVersion)
{
productVersion = productVersion.Replace(',', '.');
if (SemVersion.TryParse(productVersion, out var semanticVersion))
return semanticVersion?.Change(build: string.Empty);
Version.TryParse(productVersion, out var version);
return SemVersion.Parse(version.ToString(3));
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
using System.IO;
using System.Linq;
namespace KattekerCreator.Types
{
public struct PathFragments
{
private readonly string[] _fragments;
public PathFragments(string path)
{
_fragments = path.Split(Path.DirectorySeparatorChar);
}
public int FragmentLength => _fragments.Length;
public override bool Equals(object obj) => string.Equals(ToString(), obj?.ToString());
public override int GetHashCode() => _fragments != null ? _fragments.GetHashCode() : 0;
public override string ToString() => string.Join(Path.DirectorySeparatorChar.ToString(), _fragments.Take(_fragments.Length - 1));
}
}

View File

@ -1,13 +0,0 @@
namespace KattekerCreator.Types
{
public struct PhysicalFile
{
public PhysicalFile(string source, string target)
{
Source = source;
Target = target;
}
public readonly string Source, Target;
}
}

View File

@ -1,42 +0,0 @@
using System;
using System.IO;
using System.Threading;
namespace KattekerCreator.Types
{
public class TemporaryDirectory : IDisposable
{
public string Path { get; }
public TemporaryDirectory(string path)
{
Path = path;
}
void IDisposable.Dispose()
{
try
{
Thread.Sleep(100);
Directory.Delete(Path, true);
}
catch
{
//Try it, catch it, forget it.
}
}
public static TemporaryDirectory Create()
{
string result;
do
{
result = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp", Environment.UserName,
System.IO.Path.GetRandomFileName());
} while (Directory.Exists(result));
Directory.CreateDirectory(result);
return new TemporaryDirectory(result);
}
}
}

View File

@ -1,144 +0,0 @@
COPYRIGHT
---------
Copyright (C) 1999-2018 Contributors
More detailed copyright information can be found in the individual source code files.
APPLICABLE LICENSES
-------------------
* All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license.
* The zlib compression module for NSIS is licensed under the zlib/libpng license.
* The bzip2 compression module for NSIS is licensed under the bzip2 license.
* The LZMA compression module for NSIS is licensed under the Common Public License version 1.0.
ZLIB/LIBPNG LICENSE
-------------------
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
BZIP2 LICENSE
-------------
This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2000 Julian R Seward. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Julian Seward, Cambridge, UK.
jseward@acm.org
COMMON PUBLIC LICENSE VERSION 1.0
---------------------------------
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
"Program" means the Contributions distributed in accordance with this Agreement.
"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the Program.
Contributors may not remove or alter any copyright notices contained within the Program.
Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
SPECIAL EXCEPTION FOR LZMA COMPRESSION MODULE
---------------------------------------------
Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Some files were not shown because too many files have changed in this diff Show More