├── App.ico ├── Debug ├── SyncThingTray.exe ├── SyncThingTray.pdb ├── System.Net.Http.Formatting.dll └── SyncThingTray.exe.config ├── Releases ├── SyncThingTray.exe └── System.Net.Http.Formatting.dll ├── App.config ├── packages.config ├── Properties ├── Settings.settings ├── Settings.Designer.cs ├── AssemblyInfo.cs ├── Resources.Designer.cs └── Resources.resx ├── ProjectInstaller.cs ├── SyncThingTray.csproj.user ├── frmMessage.cs ├── SyngThingService.Designer.cs ├── API.cs ├── ProjectInstaller.Designer.cs ├── frmMessage.Designer.cs ├── frmMain.cs ├── SyngThingService.cs ├── SyngThingService.resx ├── ProjectInstaller.resx ├── SyncThingTray.csproj ├── frmMain.Designer.cs ├── frmInstall.cs ├── Program.cs ├── frmInstall.resx ├── frmMessage.resx ├── frmMain.resx └── frmInstall.Designer.cs /App.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/App.ico -------------------------------------------------------------------------------- /Debug/SyncThingTray.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/Debug/SyncThingTray.exe -------------------------------------------------------------------------------- /Debug/SyncThingTray.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/Debug/SyncThingTray.pdb -------------------------------------------------------------------------------- /Releases/SyncThingTray.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/Releases/SyncThingTray.exe -------------------------------------------------------------------------------- /Debug/System.Net.Http.Formatting.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/Debug/System.Net.Http.Formatting.dll -------------------------------------------------------------------------------- /Releases/System.Net.Http.Formatting.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bloones/SyncThingWin/HEAD/Releases/System.Net.Http.Formatting.dll -------------------------------------------------------------------------------- /App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/SyncThingTray.exe.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ProjectInstaller.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Configuration.Install; 6 | using System.Linq; 7 | 8 | namespace SyncThingTray 9 | { 10 | [RunInstaller(true)] 11 | public partial class ProjectInstaller : System.Configuration.Install.Installer 12 | { 13 | public ProjectInstaller() 14 | { 15 | InitializeComponent(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /SyncThingTray.csproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | configure 5 | 6 | 7 | uninstall 8 | 9 | -------------------------------------------------------------------------------- /frmMessage.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace SyncThingTray 12 | { 13 | public partial class frmMessage : Form 14 | { 15 | public frmMessage() 16 | { 17 | InitializeComponent(); 18 | } 19 | 20 | public frmMessage(string Message) 21 | : this() 22 | { 23 | lblMessage.Text = Message; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SyngThingService.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SyncThingTray 2 | { 3 | partial class SyngThingService 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | // 32 | // SyngThingService 33 | // 34 | this.ServiceName = "SyncThingService"; 35 | 36 | } 37 | 38 | #endregion 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34014 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SyncThingTray.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SyncThingTray")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SyncThingTray")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("3662dc53-7a84-4452-8e72-59781c8c244b")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /API.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http; 5 | using System.Net.Http.Headers; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace SyncThingTray 10 | { 11 | static class API 12 | { 13 | public static async Task CallAPIPost(string Query) 14 | { 15 | if (string.IsNullOrWhiteSpace(Program.APIUrl)) return "Syncthing address unavailable"; 16 | try 17 | { 18 | HttpClient client = new HttpClient(); 19 | client.BaseAddress = new Uri(Program.APIUrl); 20 | client.DefaultRequestHeaders.Accept.Clear(); 21 | client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 22 | client.DefaultRequestHeaders.Add("X-API-Key", Program.APIKey); 23 | HttpContent cnt = new ByteArrayContent(new byte[0]); 24 | var res = await client.PostAsync("rest/" + Query, cnt); 25 | return res.IsSuccessStatusCode ? null : "Error: " + res.ToString(); 26 | } 27 | catch (HttpRequestException x) 28 | { 29 | var i = x.InnerException; 30 | if (i != null) return "Exception: " + i.Message; 31 | return "Exception: " + x.Message; 32 | } 33 | } 34 | 35 | public static string CallAPIPostSync(string Query, int Timeout, string Default) 36 | { 37 | var res = CallAPIPost(Query); 38 | if (res.Wait(Timeout)) 39 | return res.Result; 40 | else 41 | return Default; 42 | } 43 | 44 | public static bool IsAvailable 45 | { 46 | get 47 | { 48 | var res = CallAPIPost("ping"); 49 | if (!res.Wait(1000)) return false; 50 | return res.Result == null; 51 | } 52 | } 53 | 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /ProjectInstaller.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SyncThingTray 2 | { 3 | partial class ProjectInstaller 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); 32 | this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); 33 | // 34 | // serviceProcessInstaller1 35 | // 36 | this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; 37 | this.serviceProcessInstaller1.Password = null; 38 | this.serviceProcessInstaller1.Username = null; 39 | // 40 | // serviceInstaller1 41 | // 42 | this.serviceInstaller1.Description = "Start the SyncThing executable in the background and allow monitoring"; 43 | this.serviceInstaller1.DisplayName = "SyncThing synchronization launcher"; 44 | this.serviceInstaller1.ServiceName = "SyncThingService"; 45 | this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 46 | // 47 | // ProjectInstaller 48 | // 49 | this.Installers.AddRange(new System.Configuration.Install.Installer[] { 50 | this.serviceProcessInstaller1, 51 | this.serviceInstaller1}); 52 | 53 | } 54 | 55 | #endregion 56 | 57 | private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1; 58 | private System.ServiceProcess.ServiceInstaller serviceInstaller1; 59 | } 60 | } -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34014 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SyncThingTray.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SyncThingTray.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /frmMessage.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SyncThingTray 2 | { 3 | partial class frmMessage 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMessage)); 32 | this.lblMessage = new System.Windows.Forms.Label(); 33 | this.lblImage = new System.Windows.Forms.Label(); 34 | this.SuspendLayout(); 35 | // 36 | // lblMessage 37 | // 38 | this.lblMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 39 | | System.Windows.Forms.AnchorStyles.Left) 40 | | System.Windows.Forms.AnchorStyles.Right))); 41 | this.lblMessage.Font = new System.Drawing.Font("Cambria", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 42 | this.lblMessage.Location = new System.Drawing.Point(66, 9); 43 | this.lblMessage.Name = "lblMessage"; 44 | this.lblMessage.Size = new System.Drawing.Size(284, 88); 45 | this.lblMessage.TabIndex = 0; 46 | // 47 | // lblImage 48 | // 49 | this.lblImage.Image = ((System.Drawing.Image)(resources.GetObject("lblImage.Image"))); 50 | this.lblImage.Location = new System.Drawing.Point(12, 9); 51 | this.lblImage.Name = "lblImage"; 52 | this.lblImage.Size = new System.Drawing.Size(48, 48); 53 | this.lblImage.TabIndex = 1; 54 | // 55 | // frmMessage 56 | // 57 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 58 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 59 | this.ClientSize = new System.Drawing.Size(362, 106); 60 | this.Controls.Add(this.lblImage); 61 | this.Controls.Add(this.lblMessage); 62 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 63 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 64 | this.MaximizeBox = false; 65 | this.MinimizeBox = false; 66 | this.Name = "frmMessage"; 67 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 68 | this.Text = "SynthingTray"; 69 | this.ResumeLayout(false); 70 | 71 | } 72 | 73 | #endregion 74 | 75 | private System.Windows.Forms.Label lblMessage; 76 | private System.Windows.Forms.Label lblImage; 77 | } 78 | } -------------------------------------------------------------------------------- /frmMain.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.IO; 8 | using System.Linq; 9 | using System.Net.Http; 10 | using System.Net.Http.Headers; 11 | using System.Text; 12 | using System.Threading.Tasks; 13 | using System.Windows.Forms; 14 | using System.Xml; 15 | 16 | namespace SyncThingTray 17 | { 18 | public partial class frmMain : Form 19 | { 20 | bool allowclose = false; 21 | public frmMain() 22 | { 23 | InitializeComponent(); 24 | } 25 | 26 | private void frmMain_Load(object sender, EventArgs e) 27 | { 28 | if (!Program.IsInstalled || !Program.IsConfigured) 29 | { 30 | if (!frmInstall.TryInstall()) { allowclose = true; Application.Exit(); return; } 31 | } 32 | } 33 | 34 | private void frmMain_FormClosing(object sender, FormClosingEventArgs e) 35 | { 36 | if ((e.CloseReason == CloseReason.UserClosing) && !allowclose) 37 | { 38 | e.Cancel = !allowclose; 39 | Hide(); 40 | return; 41 | } 42 | } 43 | 44 | private void showConsoleToolStripMenuItem_Click(object sender, EventArgs e) 45 | { 46 | Show(); 47 | } 48 | 49 | private void showGuiToolStripMenuItem_Click(object sender, EventArgs e) 50 | { 51 | if (!string.IsNullOrWhiteSpace(Program.GuiUrl)) Process.Start(Program.GuiUrl); 52 | } 53 | 54 | private void stopServiceToolStripMenuItem_Click(object sender, EventArgs e) 55 | { 56 | if (Program.IsUserAdministrator) 57 | Program.StopService(); 58 | else 59 | Program.RunAsAdministrator("stop"); 60 | } 61 | 62 | private void startServiceToolStripMenuItem_Click(object sender, EventArgs e) 63 | { 64 | if (Program.IsUserAdministrator) 65 | Program.StartService(); 66 | else 67 | Program.RunAsAdministrator("start"); 68 | } 69 | 70 | private void exitToolStripMenuItem_Click(object sender, EventArgs e) 71 | { 72 | allowclose = true; 73 | Close(); 74 | } 75 | 76 | private void icoTray_DoubleClick(object sender, EventArgs e) 77 | { 78 | Show(); 79 | } 80 | 81 | private void timReferesh_Tick(object sender, EventArgs e) 82 | { 83 | txtContent.Text = File.Exists(Program.MonitorFile) ? File.ReadAllText(Program.MonitorFile) : string.Empty; 84 | txtContent.SelectionStart = txtContent.Text.Length; 85 | txtContent.SelectionLength = 0; 86 | } 87 | 88 | private void frmMain_VisibleChanged(object sender, EventArgs e) 89 | { 90 | if (Visible) 91 | txtContent.Text = File.Exists(Program.MonitorFile) ? File.ReadAllText(Program.MonitorFile) : string.Empty; 92 | txtContent.SelectionStart = txtContent.Text.Length; 93 | txtContent.SelectionLength = 0; 94 | timReferesh.Enabled = Visible; 95 | } 96 | 97 | private void mnuTray_Opening(object sender, CancelEventArgs e) 98 | { 99 | SetServiceStatus(true); 100 | Program.ReadConfiguration(); 101 | showGuiToolStripMenuItem.Enabled = !string.IsNullOrWhiteSpace(Program.GuiUrl); 102 | if (string.IsNullOrWhiteSpace(Program.APIUrl) || string.IsNullOrWhiteSpace(Program.APIKey) || (!Program.IsRunning && !API.IsAvailable)) 103 | { 104 | mnuRestart.Enabled = false; 105 | mnuShutdown.Enabled = false; 106 | mnuUpgrade.Enabled = false; 107 | } 108 | else 109 | { 110 | mnuRestart.Enabled = true; 111 | mnuShutdown.Enabled = true; 112 | mnuUpgrade.Enabled = true; 113 | } 114 | } 115 | 116 | private async void mnuShutdown_Click(object sender, EventArgs e) 117 | { 118 | var res = await API.CallAPIPost("shutdown"); 119 | if (res != null) icoTray.ShowBalloonTip(1000, "Syncthing", res, ToolTipIcon.Error); 120 | } 121 | 122 | private async void mnuUpgrade_Click(object sender, EventArgs e) 123 | { 124 | var res = await API.CallAPIPost("upgrade"); 125 | if (res != null) icoTray.ShowBalloonTip(1000, "Syncthing", res, ToolTipIcon.Error); 126 | } 127 | 128 | private async void mnuRestart_Click(object sender, EventArgs e) 129 | { 130 | var res = await API.CallAPIPost("restart"); 131 | if (res != null) icoTray.ShowBalloonTip(1000, "Syncthing", res, ToolTipIcon.Error); 132 | } 133 | 134 | private void frmMain_Shown(object sender, EventArgs e) 135 | { 136 | SetServiceStatus(false); 137 | timStatus.Enabled = true; 138 | } 139 | 140 | private void timStatus_Tick(object sender, EventArgs e) 141 | { 142 | SetServiceStatus(true); 143 | } 144 | 145 | void SetServiceStatus(bool Update) 146 | { 147 | if (Program.IsRunning) 148 | { 149 | if (!Update) 150 | icoTray.ShowBalloonTip(500, "Syncthing", "The service is running", ToolTipIcon.Info); 151 | else if (startServiceToolStripMenuItem.Enabled) 152 | icoTray.ShowBalloonTip(500, "Syncthing", "The service has started", ToolTipIcon.Info); 153 | startServiceToolStripMenuItem.Enabled = false; 154 | stopServiceToolStripMenuItem.Enabled = true; 155 | } 156 | else 157 | { 158 | if (!Update) 159 | icoTray.ShowBalloonTip(500, "Syncthing", "The service is stopped", ToolTipIcon.Error); 160 | else if (!startServiceToolStripMenuItem.Enabled) 161 | icoTray.ShowBalloonTip(500, "Syncthing", "The service has stopped", ToolTipIcon.Error); 162 | startServiceToolStripMenuItem.Enabled = true; 163 | stopServiceToolStripMenuItem.Enabled = false; 164 | } 165 | } 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /SyngThingService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Net.Http; 9 | using System.Net.Http.Headers; 10 | using System.Runtime.InteropServices; 11 | using System.ServiceProcess; 12 | using System.Text; 13 | using System.Xml; 14 | 15 | namespace SyncThingTray 16 | { 17 | public partial class SyngThingService : ServiceBase 18 | { 19 | Process syncthing; 20 | List shutdowns; 21 | public SyngThingService() 22 | { 23 | InitializeComponent(); 24 | } 25 | 26 | public void TestStart() { OnStart(null); } 27 | 28 | protected override void OnStart(string[] args) 29 | { 30 | if (Program.IsConfigured) 31 | { 32 | shutdowns = null; 33 | StartSyncThing(); 34 | } 35 | } 36 | 37 | void StartSyncThing() 38 | { 39 | ProcessStartInfo pinfo = new ProcessStartInfo(Program.SyncExePath, "-home=\"" + Program.SyncConfigPath + "\""); 40 | pinfo.WindowStyle = ProcessWindowStyle.Hidden; 41 | pinfo.RedirectStandardOutput = true; 42 | pinfo.RedirectStandardInput = true; 43 | pinfo.UseShellExecute = false; 44 | syncthing = new Process(); 45 | syncthing.EnableRaisingEvents = true; 46 | syncthing.OutputDataReceived += syncthing_OutputDataReceived; 47 | syncthing.Exited += syncthing_Exited; 48 | syncthing.StartInfo = pinfo; 49 | syncthing.Start(); 50 | syncthing.BeginOutputReadLine(); 51 | syncthing.PriorityClass = Program.SyncPriority; 52 | } 53 | 54 | void syncthing_Exited(object sender, EventArgs e) 55 | { 56 | string reason; 57 | if (Program.AutoRestart) 58 | { 59 | if (Program.AutoRestartCount > 0) 60 | { 61 | if (shutdowns == null) shutdowns = new List(); 62 | shutdowns.Add(DateTime.Now); 63 | shutdowns.RemoveAll(d => d < (DateTime.Now - Program.AutoRestartPeriod)); 64 | reason = shutdowns.Count <= Program.AutoRestartCount ? null : "The maximum number of shutdown has been reached"; 65 | } 66 | else 67 | reason = null; 68 | } 69 | else 70 | reason = "The service is not configured to restart"; 71 | if (reason == null) 72 | { 73 | EventLog.WriteEntry("Syncthing has stopped and is being restarted", EventLogEntryType.Warning); 74 | syncthing.OutputDataReceived -= syncthing_OutputDataReceived; 75 | syncthing.Exited -= syncthing_Exited; 76 | syncthing.Dispose(); 77 | StartSyncThing(); 78 | } 79 | else 80 | { 81 | EventLog.WriteEntry("Syncthing has stopped and will not be restarted:\n" + reason, EventLogEntryType.Warning); 82 | Stop(); 83 | } 84 | } 85 | 86 | void syncthing_OutputDataReceived(object sender, DataReceivedEventArgs e) 87 | { 88 | File.AppendAllLines(Program.MonitorFile, new string[] { e.Data }); 89 | } 90 | 91 | protected override void OnStop() 92 | { 93 | if (!syncthing.HasExited) 94 | { 95 | syncthing.CancelOutputRead(); 96 | syncthing.OutputDataReceived -= syncthing_OutputDataReceived; 97 | syncthing.Exited -= syncthing_Exited; 98 | 99 | var res = ShutdownProgram(); 100 | if (res == null) 101 | { 102 | syncthing.WaitForExit(2000); 103 | } 104 | else 105 | { 106 | this.EventLog.WriteEntry("An error occured when trying to shutdown the syncthing.exe process.\n" + res, EventLogEntryType.Error); 107 | } 108 | 109 | if (!syncthing.HasExited) 110 | { 111 | try 112 | { 113 | StopProgram(syncthing); 114 | } 115 | catch (Exception x) 116 | { 117 | this.EventLog.WriteEntry("An error occured when trying to stop the syncthing.exe process.\nException: (" + x.GetType().ToString() + ") " + x.Message, EventLogEntryType.Error); 118 | } 119 | if (!syncthing.HasExited) 120 | { 121 | syncthing.Kill(); 122 | foreach (var proc in Process.GetProcesses().Where(p => p.StartInfo.FileName == Program.SyncExePath)) 123 | if (!proc.HasExited) 124 | proc.Kill(); 125 | this.EventLog.WriteEntry("The syncthing.exe process could not be stopped gracefully and had to be killed", EventLogEntryType.Error); 126 | syncthing.WaitForExit(1500); 127 | } 128 | else 129 | this.EventLog.WriteEntry("The syncthing.exe process could not be shutdown and had to be closed gracefully", EventLogEntryType.Warning); 130 | } 131 | } 132 | syncthing.Dispose(); 133 | File.Delete(Program.MonitorFile); 134 | } 135 | 136 | enum CtrlTypes : uint 137 | { 138 | CTRL_C_EVENT = 0, 139 | CTRL_BREAK_EVENT, 140 | CTRL_CLOSE_EVENT, 141 | CTRL_LOGOFF_EVENT = 5, 142 | CTRL_SHUTDOWN_EVENT 143 | } 144 | 145 | [DllImport("kernel32.dll")] 146 | [return: MarshalAs(UnmanagedType.Bool)] 147 | private static extern bool GenerateConsoleCtrlEvent(CtrlTypes dwCtrlEvent, uint dwProcessGroupId); 148 | [DllImport("kernel32.dll", SetLastError = true)] 149 | static extern bool AttachConsole(uint dwProcessId); 150 | [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] 151 | static extern bool FreeConsole(); 152 | [DllImport("Kernel32")] 153 | private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add); 154 | 155 | 156 | static void StopProgram(Process proc) 157 | { 158 | if (AttachConsole((uint)proc.Id)) 159 | { 160 | SetConsoleCtrlHandler(null, true); 161 | GenerateConsoleCtrlEvent(CtrlTypes.CTRL_C_EVENT, 0); 162 | proc.WaitForExit(2000); 163 | FreeConsole(); 164 | SetConsoleCtrlHandler(null, false); 165 | } 166 | } 167 | 168 | static string ShutdownProgram() 169 | { 170 | string res= Program.ReadConfiguration(); 171 | if (res != null) return res; 172 | var apires = API.CallAPIPost("shutdown"); 173 | if (!apires.Wait(2000)) return null; 174 | return apires.Result; 175 | } 176 | 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /SyngThingService.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | False 122 | 123 | -------------------------------------------------------------------------------- /ProjectInstaller.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 56 122 | 123 | 124 | 196, 17 125 | 126 | 127 | False 128 | 129 | -------------------------------------------------------------------------------- /SyncThingTray.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {11C06352-3180-44F8-9A79-3C410BD6622D} 8 | WinExe 9 | Properties 10 | SyncThingTray 11 | SyncThingTray 12 | v4.5.1 13 | 512 14 | 15 | 16 | 17 | 18 | AnyCPU 19 | true 20 | full 21 | false 22 | bin\Debug\ 23 | DEBUG;TRACE 24 | prompt 25 | 4 26 | false 27 | 28 | 29 | AnyCPU 30 | pdbonly 31 | true 32 | bin\Release\ 33 | TRACE 34 | prompt 35 | 4 36 | false 37 | 38 | 39 | App.ico 40 | 41 | 42 | 43 | False 44 | ..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | False 53 | ..\packages\Microsoft.AspNet.WebApi.Client.5.2.2\lib\net45\System.Net.Http.Formatting.dll 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | Form 68 | 69 | 70 | frmInstall.cs 71 | 72 | 73 | Form 74 | 75 | 76 | frmMain.cs 77 | 78 | 79 | Form 80 | 81 | 82 | frmMessage.cs 83 | 84 | 85 | 86 | Component 87 | 88 | 89 | ProjectInstaller.cs 90 | 91 | 92 | 93 | Component 94 | 95 | 96 | SyngThingService.cs 97 | 98 | 99 | frmInstall.cs 100 | 101 | 102 | frmMain.cs 103 | 104 | 105 | frmMessage.cs 106 | 107 | 108 | ProjectInstaller.cs 109 | 110 | 111 | ResXFileCodeGenerator 112 | Resources.Designer.cs 113 | Designer 114 | 115 | 116 | True 117 | Resources.resx 118 | True 119 | 120 | 121 | SyngThingService.cs 122 | 123 | 124 | 125 | SettingsSingleFileGenerator 126 | Settings.Designer.cs 127 | 128 | 129 | True 130 | Settings.settings 131 | True 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 148 | -------------------------------------------------------------------------------- /frmMain.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SyncThingTray 2 | { 3 | partial class frmMain 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); 33 | this.txtContent = new System.Windows.Forms.TextBox(); 34 | this.mnuTray = new System.Windows.Forms.ContextMenuStrip(this.components); 35 | this.showConsoleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 36 | this.showGuiToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 37 | this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); 38 | this.stopServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 39 | this.startServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 40 | this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); 41 | this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 42 | this.icoTray = new System.Windows.Forms.NotifyIcon(this.components); 43 | this.timReferesh = new System.Windows.Forms.Timer(this.components); 44 | this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); 45 | this.mnuShutdown = new System.Windows.Forms.ToolStripMenuItem(); 46 | this.mnuUpgrade = new System.Windows.Forms.ToolStripMenuItem(); 47 | this.mnuRestart = new System.Windows.Forms.ToolStripMenuItem(); 48 | this.timStatus = new System.Windows.Forms.Timer(this.components); 49 | this.mnuTray.SuspendLayout(); 50 | this.SuspendLayout(); 51 | // 52 | // txtContent 53 | // 54 | this.txtContent.BackColor = System.Drawing.Color.Black; 55 | this.txtContent.Dock = System.Windows.Forms.DockStyle.Fill; 56 | this.txtContent.Font = new System.Drawing.Font("Consolas", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 57 | this.txtContent.ForeColor = System.Drawing.Color.White; 58 | this.txtContent.Location = new System.Drawing.Point(0, 0); 59 | this.txtContent.Multiline = true; 60 | this.txtContent.Name = "txtContent"; 61 | this.txtContent.ReadOnly = true; 62 | this.txtContent.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; 63 | this.txtContent.Size = new System.Drawing.Size(621, 544); 64 | this.txtContent.TabIndex = 0; 65 | // 66 | // mnuTray 67 | // 68 | this.mnuTray.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 69 | this.showConsoleToolStripMenuItem, 70 | this.showGuiToolStripMenuItem, 71 | this.toolStripSeparator3, 72 | this.mnuRestart, 73 | this.mnuUpgrade, 74 | this.mnuShutdown, 75 | this.toolStripSeparator1, 76 | this.stopServiceToolStripMenuItem, 77 | this.startServiceToolStripMenuItem, 78 | this.toolStripSeparator2, 79 | this.exitToolStripMenuItem}); 80 | this.mnuTray.Name = "mnuTray"; 81 | this.mnuTray.Size = new System.Drawing.Size(150, 198); 82 | this.mnuTray.Opening += new System.ComponentModel.CancelEventHandler(this.mnuTray_Opening); 83 | // 84 | // showConsoleToolStripMenuItem 85 | // 86 | this.showConsoleToolStripMenuItem.Name = "showConsoleToolStripMenuItem"; 87 | this.showConsoleToolStripMenuItem.Size = new System.Drawing.Size(149, 22); 88 | this.showConsoleToolStripMenuItem.Text = "Show &Console"; 89 | this.showConsoleToolStripMenuItem.Click += new System.EventHandler(this.showConsoleToolStripMenuItem_Click); 90 | // 91 | // showGuiToolStripMenuItem 92 | // 93 | this.showGuiToolStripMenuItem.Name = "showGuiToolStripMenuItem"; 94 | this.showGuiToolStripMenuItem.Size = new System.Drawing.Size(149, 22); 95 | this.showGuiToolStripMenuItem.Text = "Show &Gui"; 96 | this.showGuiToolStripMenuItem.Click += new System.EventHandler(this.showGuiToolStripMenuItem_Click); 97 | // 98 | // toolStripSeparator1 99 | // 100 | this.toolStripSeparator1.Name = "toolStripSeparator1"; 101 | this.toolStripSeparator1.Size = new System.Drawing.Size(146, 6); 102 | // 103 | // stopServiceToolStripMenuItem 104 | // 105 | this.stopServiceToolStripMenuItem.Name = "stopServiceToolStripMenuItem"; 106 | this.stopServiceToolStripMenuItem.Size = new System.Drawing.Size(149, 22); 107 | this.stopServiceToolStripMenuItem.Text = "Sto&p Service"; 108 | this.stopServiceToolStripMenuItem.Click += new System.EventHandler(this.stopServiceToolStripMenuItem_Click); 109 | // 110 | // startServiceToolStripMenuItem 111 | // 112 | this.startServiceToolStripMenuItem.Name = "startServiceToolStripMenuItem"; 113 | this.startServiceToolStripMenuItem.Size = new System.Drawing.Size(149, 22); 114 | this.startServiceToolStripMenuItem.Text = "S&tart Service"; 115 | this.startServiceToolStripMenuItem.Click += new System.EventHandler(this.startServiceToolStripMenuItem_Click); 116 | // 117 | // toolStripSeparator2 118 | // 119 | this.toolStripSeparator2.Name = "toolStripSeparator2"; 120 | this.toolStripSeparator2.Size = new System.Drawing.Size(146, 6); 121 | // 122 | // exitToolStripMenuItem 123 | // 124 | this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; 125 | this.exitToolStripMenuItem.Size = new System.Drawing.Size(149, 22); 126 | this.exitToolStripMenuItem.Text = "E&xit"; 127 | this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); 128 | // 129 | // icoTray 130 | // 131 | this.icoTray.BalloonTipTitle = "SyncThing"; 132 | this.icoTray.ContextMenuStrip = this.mnuTray; 133 | this.icoTray.Icon = ((System.Drawing.Icon)(resources.GetObject("icoTray.Icon"))); 134 | this.icoTray.Text = "SyncThing"; 135 | this.icoTray.Visible = true; 136 | this.icoTray.DoubleClick += new System.EventHandler(this.icoTray_DoubleClick); 137 | // 138 | // timReferesh 139 | // 140 | this.timReferesh.Interval = 2000; 141 | this.timReferesh.Tick += new System.EventHandler(this.timReferesh_Tick); 142 | // 143 | // toolStripSeparator3 144 | // 145 | this.toolStripSeparator3.Name = "toolStripSeparator3"; 146 | this.toolStripSeparator3.Size = new System.Drawing.Size(146, 6); 147 | // 148 | // mnuShutdown 149 | // 150 | this.mnuShutdown.Name = "mnuShutdown"; 151 | this.mnuShutdown.Size = new System.Drawing.Size(149, 22); 152 | this.mnuShutdown.Text = "Shut&down"; 153 | this.mnuShutdown.Click += new System.EventHandler(this.mnuShutdown_Click); 154 | // 155 | // mnuUpgrade 156 | // 157 | this.mnuUpgrade.Name = "mnuUpgrade"; 158 | this.mnuUpgrade.Size = new System.Drawing.Size(149, 22); 159 | this.mnuUpgrade.Text = "&Upgrade"; 160 | this.mnuUpgrade.Click += new System.EventHandler(this.mnuUpgrade_Click); 161 | // 162 | // mnuRestart 163 | // 164 | this.mnuRestart.Name = "mnuRestart"; 165 | this.mnuRestart.Size = new System.Drawing.Size(149, 22); 166 | this.mnuRestart.Text = "&Restart"; 167 | this.mnuRestart.Click += new System.EventHandler(this.mnuRestart_Click); 168 | // 169 | // timStatus 170 | // 171 | this.timStatus.Interval = 200; 172 | this.timStatus.Tick += new System.EventHandler(this.timStatus_Tick); 173 | // 174 | // frmMain 175 | // 176 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 177 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 178 | this.ClientSize = new System.Drawing.Size(621, 544); 179 | this.Controls.Add(this.txtContent); 180 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 181 | this.Name = "frmMain"; 182 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 183 | this.Text = "SyncThing"; 184 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing); 185 | this.Load += new System.EventHandler(this.frmMain_Load); 186 | this.Shown += new System.EventHandler(this.frmMain_Shown); 187 | this.VisibleChanged += new System.EventHandler(this.frmMain_VisibleChanged); 188 | this.mnuTray.ResumeLayout(false); 189 | this.ResumeLayout(false); 190 | this.PerformLayout(); 191 | 192 | } 193 | 194 | #endregion 195 | 196 | private System.Windows.Forms.TextBox txtContent; 197 | private System.Windows.Forms.ContextMenuStrip mnuTray; 198 | private System.Windows.Forms.ToolStripMenuItem showConsoleToolStripMenuItem; 199 | private System.Windows.Forms.ToolStripMenuItem showGuiToolStripMenuItem; 200 | private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; 201 | private System.Windows.Forms.ToolStripMenuItem stopServiceToolStripMenuItem; 202 | private System.Windows.Forms.ToolStripMenuItem startServiceToolStripMenuItem; 203 | private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; 204 | private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; 205 | private System.Windows.Forms.NotifyIcon icoTray; 206 | private System.Windows.Forms.Timer timReferesh; 207 | private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; 208 | private System.Windows.Forms.ToolStripMenuItem mnuRestart; 209 | private System.Windows.Forms.ToolStripMenuItem mnuUpgrade; 210 | private System.Windows.Forms.ToolStripMenuItem mnuShutdown; 211 | private System.Windows.Forms.Timer timStatus; 212 | } 213 | } 214 | 215 | -------------------------------------------------------------------------------- /frmInstall.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.IO; 8 | using System.Linq; 9 | using System.ServiceProcess; 10 | using System.Text; 11 | using System.Windows.Forms; 12 | using Microsoft.Win32; 13 | 14 | namespace SyncThingTray 15 | { 16 | public partial class frmInstall : Form 17 | { 18 | bool installed = false; 19 | 20 | public frmInstall() 21 | { 22 | InitializeComponent(); 23 | } 24 | 25 | public static bool TryInstall() 26 | { 27 | if (!Program.IsUserAdministrator) { Program.RunAsAdministrator(); return false; } 28 | frmInstall frm = new frmInstall(); 29 | frm.SetForm(); 30 | 31 | frm.ShowDialog(); 32 | return frm.installed; 33 | } 34 | 35 | public void SetForm() 36 | { 37 | 38 | if (Program.IsInstalled) 39 | { 40 | txtCurrent.Enabled = false; 41 | cmbAccount.Enabled = false; 42 | cmbStartup.Enabled = false; 43 | } 44 | else 45 | { 46 | btnUninstall.Enabled = false; 47 | cmbAccount.SelectedItem = "Local System"; 48 | cmbStartup.SelectedItem = "Automatic"; 49 | } 50 | if (Program.IsConfigured) 51 | { 52 | txtCurrent.Text = ""; 53 | txtExecutable.Text = Program.SyncExePath; 54 | txtNew.Text = Program.SyncConfigPath; 55 | switch (Program.SyncPriority) 56 | { 57 | case ProcessPriorityClass.RealTime: cmbPriority.SelectedItem = "Real Time"; break; 58 | case ProcessPriorityClass.High: cmbPriority.SelectedItem = "High"; break; 59 | case ProcessPriorityClass.AboveNormal: cmbPriority.SelectedItem = "Above Normal"; break; 60 | case ProcessPriorityClass.Normal: cmbPriority.SelectedItem = "Normal"; break; 61 | case ProcessPriorityClass.BelowNormal: cmbPriority.SelectedItem = "Below Normal"; break; 62 | case ProcessPriorityClass.Idle: cmbPriority.SelectedItem = "Idle"; break; 63 | default: cmbPriority.SelectedItem = "Normal"; break; 64 | } 65 | cmbPriority.SelectedItem = Program.SyncPriority.ToString(); 66 | if (Program.IsInstalled) 67 | { 68 | btnInstall.Visible = false; 69 | btnSave.Visible = true; 70 | } 71 | } 72 | else 73 | { 74 | string res = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 75 | if (Directory.Exists(Path.Combine(res, "Syncthing"))) 76 | if (File.Exists(Path.Combine(res, "Syncthing", "config.xml"))) 77 | txtCurrent.Text = Path.Combine(res, "Syncthing"); 78 | res = Path.Combine(Application.StartupPath, "syncthing.exe"); 79 | if (File.Exists(res)) 80 | txtExecutable.Text = res; 81 | else 82 | { 83 | res = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "syncthing.exe"); 84 | if (File.Exists(res)) 85 | txtExecutable.Text = res; 86 | else 87 | { 88 | res = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Syncthing", "syncthing.exe"); 89 | if (File.Exists(res)) 90 | txtExecutable.Text = res; 91 | else 92 | { 93 | res = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "syncthing.exe"); 94 | if (File.Exists(res)) 95 | txtExecutable.Text = res; 96 | else 97 | { 98 | res = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Syncthing", "syncthing.exe"); 99 | if (File.Exists(res)) 100 | txtExecutable.Text = res; 101 | } 102 | } 103 | } 104 | } 105 | txtNew.Text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Syncthing", "Data"); 106 | cmbPriority.SelectedItem = "Normal"; 107 | } 108 | 109 | if (Program.AutoRestart) 110 | { 111 | chkAutoRestart.Checked = true; 112 | numMaxAutoCount.Value = Program.AutoRestartCount; 113 | if (Program.AutoRestartPeriod.Hours > 0) 114 | { 115 | numMaxAutoDuration.Value = Program.AutoRestartPeriod.Hours; 116 | cmbMaxAutoDuration.SelectedItem = "hours"; 117 | } 118 | else if (Program.AutoRestartPeriod.Minutes > 0) 119 | { 120 | numMaxAutoDuration.Value = Program.AutoRestartPeriod.Minutes; 121 | cmbMaxAutoDuration.SelectedItem = "minutes"; 122 | } 123 | else if (Program.AutoRestartPeriod.Seconds > 0) 124 | { 125 | numMaxAutoDuration.Value = Program.AutoRestartPeriod.Seconds; 126 | cmbMaxAutoDuration.SelectedItem = "seconds"; 127 | } 128 | else 129 | { 130 | numMaxAutoDuration.Value = 0; 131 | cmbMaxAutoDuration.SelectedItem = null; 132 | } 133 | } 134 | } 135 | 136 | void CheckInstallEnabled() 137 | { 138 | if (!string.IsNullOrWhiteSpace(txtCurrent.Text) && (!Directory.Exists(txtCurrent.Text) || (!File.Exists(Path.Combine(txtCurrent.Text, "config.xml"))))) { btnInstall.Enabled = false; btnSave.Enabled = false; return; } 139 | if (string.IsNullOrWhiteSpace(txtNew.Text)) { btnInstall.Enabled = false; btnSave.Enabled = false; return; } 140 | if (string.IsNullOrWhiteSpace(txtExecutable.Text)) { btnInstall.Enabled = false; btnSave.Enabled = false; return; } 141 | if (string.IsNullOrWhiteSpace(txtCurrent.Text) && (!Directory.Exists(txtNew.Text) || (!File.Exists(Path.Combine(txtNew.Text, "config.xml"))))) { btnInstall.Enabled = false; btnSave.Enabled = false; return; } 142 | if (!File.Exists(txtExecutable.Text)) { btnInstall.Enabled = false; btnSave.Enabled = false; return; } 143 | btnInstall.Enabled = true; 144 | btnSave.Enabled = true; 145 | } 146 | 147 | private void txtCurrent_TextChanged(object sender, EventArgs e) 148 | { 149 | CheckInstallEnabled(); 150 | } 151 | 152 | private void txtNew_TextChanged(object sender, EventArgs e) 153 | { 154 | CheckInstallEnabled(); 155 | } 156 | 157 | private void txtExecutable_TextChanged(object sender, EventArgs e) 158 | { 159 | CheckInstallEnabled(); 160 | } 161 | 162 | private void btnCurrent_Click(object sender, EventArgs e) 163 | { 164 | dlgSelectFolder.ShowNewFolderButton = false; 165 | dlgSelectFolder.Description = "Select the folder containig the current configuration"; 166 | if (dlgSelectFolder.ShowDialog() == DialogResult.OK) 167 | txtCurrent.Text = dlgSelectFolder.SelectedPath; 168 | } 169 | 170 | private void btnNew_Click(object sender, EventArgs e) 171 | { 172 | dlgSelectFolder.ShowNewFolderButton = true; 173 | dlgSelectFolder.Description = "Select the folder where the new configuration should be placed or is already placed"; 174 | if (dlgSelectFolder.ShowDialog() == DialogResult.OK) 175 | txtNew.Text = dlgSelectFolder.SelectedPath; 176 | } 177 | 178 | private void btnExecutable_Click(object sender, EventArgs e) 179 | { 180 | if (dlgOpenFile.ShowDialog() == DialogResult.OK) 181 | txtExecutable.Text = dlgOpenFile.SafeFileName; 182 | } 183 | 184 | private void btnInstall_Click(object sender, EventArgs e) 185 | { 186 | // Copy the configuration files, Write the values to the registry, install the service, start the service and set the installed to true! 187 | if (!string.IsNullOrWhiteSpace(txtCurrent.Text)) 188 | CopyDirectory(txtCurrent.Text, txtNew.Text); 189 | 190 | bool saved = SaveConfig(); 191 | 192 | ServiceStartMode StartMode; 193 | ServiceAccount Account; 194 | bool DelayedStart; 195 | 196 | switch (cmbAccount.SelectedItem as string) 197 | { 198 | case "Local System": Account = ServiceAccount.LocalSystem; break; 199 | case "Local Service": Account = ServiceAccount.LocalService; break; 200 | case "Network Service": Account = ServiceAccount.NetworkService; break; 201 | case "User": Account = ServiceAccount.User; break; 202 | default: Account = ServiceAccount.LocalSystem; break; 203 | } 204 | switch (cmbStartup.SelectedItem as string) 205 | { 206 | case "Automatic (Delayed Start)": StartMode = ServiceStartMode.Automatic; DelayedStart = true; break; 207 | case "Automatic": StartMode = ServiceStartMode.Automatic; DelayedStart = false; break; 208 | case "Manual": StartMode = ServiceStartMode.Manual; DelayedStart = false; break; 209 | case "Disabled": StartMode = ServiceStartMode.Disabled; DelayedStart = false; break; 210 | default: StartMode = ServiceStartMode.Automatic; DelayedStart = false; break; 211 | } 212 | 213 | Program.InstallService(StartMode, DelayedStart, Account, txtLogin.Text, txtPassword.Text); 214 | Program.StartService(); 215 | installed = true; 216 | if(saved) Close(); 217 | } 218 | 219 | void CopyDirectory(string Source, string Destination) 220 | { 221 | if (!Directory.Exists(Destination)) Directory.CreateDirectory(Destination); 222 | foreach (string dir in Directory.EnumerateDirectories(Source)) 223 | CopyDirectory(dir, dir.Replace(Source, Destination)); 224 | foreach (string src in Directory.EnumerateFiles(Source)) 225 | { 226 | string dst = src.Replace(Source, Destination); 227 | if (File.Exists(dst)) File.Delete(dst); 228 | File.Copy(src, dst); 229 | } 230 | } 231 | 232 | private void chkAdvanced_CheckedChanged(object sender, EventArgs e) 233 | { 234 | this.Height = chkAdvanced.Checked ? 307 : 194; 235 | } 236 | 237 | private void btnSave_Click(object sender, EventArgs e) 238 | { 239 | if(SaveConfig()) Close(); 240 | } 241 | 242 | bool SaveConfig() 243 | { 244 | RegistryKey klm = Registry.LocalMachine; 245 | if (klm == null) return false; 246 | using (RegistryKey ksoft = klm.CreateSubKey("SOFTWARE")) 247 | { 248 | if (ksoft == null) return false; 249 | using (RegistryKey ksync = ksoft.CreateSubKey("Syncthing Service")) 250 | { 251 | if (ksync == null) return false; 252 | ksync.SetValue("Executable", txtExecutable.Text); 253 | ksync.SetValue("Configuration", txtNew.Text); 254 | ksync.SetValue("Priority", string.IsNullOrWhiteSpace(cmbPriority.SelectedItem as string) ? "Normal" : cmbPriority.SelectedItem); 255 | if (chkAutoRestart.Checked) 256 | { 257 | string val = "Yes:"; 258 | if ((numMaxAutoCount.Value == 0) || (numMaxAutoDuration.Value == 0) || (cmbMaxAutoDuration.SelectedItem == null)) 259 | val += "unlimited"; 260 | else 261 | { 262 | val += ((int)numMaxAutoCount.Value).ToString()+","; 263 | switch (cmbMaxAutoDuration.SelectedItem as string) 264 | { 265 | case "seconds": val += (new TimeSpan(0, 0, (int)numMaxAutoDuration.Value)).ToString("h\\:m\\:s"); break; 266 | case "minutes": val += (new TimeSpan(0, (int)numMaxAutoDuration.Value, 0)).ToString("h\\:m\\:s"); break; 267 | case "hours": val += (new TimeSpan( (int)numMaxAutoDuration.Value,0, 0)).ToString("h\\:m\\:s"); break; 268 | } 269 | } 270 | ksync.SetValue("Autorestart", val); 271 | } 272 | else 273 | ksync.SetValue("Autorestart", "No"); 274 | } 275 | } 276 | return true; 277 | } 278 | 279 | private void cmbPriority_SelectedIndexChanged(object sender, EventArgs e) 280 | { 281 | CheckInstallEnabled(); 282 | } 283 | 284 | private void btnUninstall_Click(object sender, EventArgs e) 285 | { 286 | Program.StopService(); 287 | Program.UninstallService(); 288 | installed = true; 289 | Close(); 290 | } 291 | 292 | private void cmbAccount_SelectedIndexChanged(object sender, EventArgs e) 293 | { 294 | if (cmbAccount.SelectedItem as string == "User") 295 | { 296 | txtLogin.Enabled = true; 297 | txtPassword.Enabled = true; 298 | } 299 | else 300 | { 301 | txtLogin.Enabled = false; 302 | txtPassword.Enabled = false; 303 | } 304 | } 305 | 306 | private void chkAutoRestart_CheckedChanged(object sender, EventArgs e) 307 | { 308 | numMaxAutoCount.Enabled = chkAutoRestart.Checked; 309 | numMaxAutoDuration.Enabled = chkAutoRestart.Checked; 310 | cmbMaxAutoDuration.Enabled = chkAutoRestart.Checked; 311 | } 312 | } 313 | } 314 | -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.ServiceProcess; 5 | using System.Windows.Forms; 6 | using System.Configuration.Install; 7 | using System.Collections; 8 | using Microsoft.Win32; 9 | using System.IO; 10 | using System.Security.Principal; 11 | using System.Diagnostics; 12 | using System.Reflection; 13 | using System.Xml; 14 | 15 | namespace SyncThingTray 16 | { 17 | static class Program 18 | { 19 | public const string SERVICENAME = "SyncThingService"; 20 | /// 21 | /// The main entry point for the application. 22 | /// 23 | [STAThread] 24 | static void Main(string[] Args) 25 | { 26 | Application.EnableVisualStyles(); 27 | Application.SetCompatibleTextRenderingDefault(false); 28 | if (Args.Length > 0) 29 | { 30 | if (Args[0].ToLower() == "install") 31 | { 32 | if (!IsUserAdministrator) { RunAsAdministrator(Args); return; } 33 | InstallService(); 34 | return; 35 | } 36 | else if (Args[0].ToLower() == "uninstall") 37 | { 38 | if (!IsUserAdministrator) { RunAsAdministrator(Args); return; } 39 | UninstallService(); 40 | return; 41 | } 42 | else if (Args[0].ToLower() == "start") 43 | { 44 | if (!IsUserAdministrator) { RunAsAdministrator(Args); return; } 45 | StartService(); 46 | return; 47 | } 48 | else if (Args[0].ToLower() == "stop") 49 | { 50 | if (!IsUserAdministrator) { RunAsAdministrator(Args); return; } 51 | StopService(); 52 | return; 53 | } 54 | else if (Args[0].ToLower() == "configure") 55 | { 56 | if (!IsUserAdministrator) { RunAsAdministrator(Args); return; } 57 | var f = new frmInstall(); 58 | f.SetForm(); 59 | Application.Run(f); 60 | return; 61 | } 62 | else if (Args[0].ToLower() == "shutdown") 63 | { 64 | if (IsConfigured) 65 | { 66 | string res = ReadConfiguration(); 67 | if (res != null) 68 | Application.Run(new frmMessage(res)); 69 | else 70 | { 71 | res = API.CallAPIPostSync("shutdown", 2000, "Tineout occured: No response was received from syncthing"); 72 | if (res != null) 73 | Application.Run(new frmMessage(res)); 74 | } 75 | return; 76 | } 77 | } 78 | else if (Args[0].ToLower() == "restart") 79 | { 80 | if (IsConfigured) 81 | { 82 | string res = ReadConfiguration(); 83 | if (res != null) 84 | Application.Run(new frmMessage(res)); 85 | else 86 | { 87 | res = API.CallAPIPostSync("restart", 2000, "Tineout occured: No response was received from syncthing"); 88 | if (res != null) 89 | Application.Run(new frmMessage(res)); 90 | } 91 | return; 92 | } 93 | } 94 | else if (Args[0].ToLower() == "upgrade") 95 | { 96 | if (IsConfigured) 97 | { 98 | string res = ReadConfiguration(); 99 | if (res != null) 100 | Application.Run(new frmMessage(res)); 101 | else 102 | { 103 | res = API.CallAPIPostSync("upgrade", 2000, "Tineout occured: No response was received from syncthing"); 104 | if (res != null) 105 | Application.Run(new frmMessage(res)); 106 | } 107 | return; 108 | } 109 | } 110 | } 111 | if (Environment.UserInteractive) 112 | Application.Run(new frmMain()); 113 | else 114 | ServiceBase.Run(new SyngThingService()); 115 | } 116 | 117 | public static bool IsInstalled { get { using (ServiceController s = new ServiceController(SERVICENAME)) return GetIsInstalled(s); } } 118 | public static bool GetIsInstalled(ServiceController Controller) 119 | { 120 | try { var status = Controller.Status; } 121 | catch { return false; } 122 | return true; 123 | } 124 | 125 | public static bool IsRunning { get { using (ServiceController s = new ServiceController(SERVICENAME)) return GetIsRunning(s); } } 126 | public static bool GetIsRunning(ServiceController Controller) 127 | { 128 | if (!GetIsInstalled(Controller)) return false; 129 | return Controller.Status == ServiceControllerStatus.Running; 130 | } 131 | 132 | public static void InstallService() 133 | { 134 | InstallService(ServiceStartMode.Automatic, false, ServiceAccount.LocalSystem, null, null); 135 | } 136 | 137 | public static void InstallService(ServiceStartMode StartMode, bool DelayedStart, ServiceAccount Account, string UserName, string Password) 138 | { 139 | if (IsInstalled) return; 140 | try 141 | { 142 | string path = "/assemblypath=" + Assembly.GetEntryAssembly().Location; 143 | using (var iGbl = new TransactedInstaller()) 144 | using (var iSP = new System.ServiceProcess.ServiceProcessInstaller()) 145 | using (var iS = new System.ServiceProcess.ServiceInstaller()) 146 | { 147 | iSP.Account = Account; 148 | iSP.Password = Password; 149 | iSP.Username = UserName; 150 | iS.Description = "Start the SyncThing executable in the background and allow monitoring"; 151 | iS.DisplayName = "SyncThing synchronization launcher"; 152 | iS.ServiceName = "SyncThingService"; 153 | iS.StartType = StartMode; 154 | iS.DelayedAutoStart = DelayedStart; 155 | iGbl.Installers.AddRange(new System.Configuration.Install.Installer[] { iSP, iS }); 156 | iGbl.Context = new InstallContext(null, new[] { path }); 157 | iGbl.Install(new Hashtable()); 158 | } 159 | } 160 | catch { throw; } 161 | } 162 | 163 | public static void UninstallService() 164 | { 165 | if (!IsInstalled) return; 166 | try 167 | { 168 | string path = "/assemblypath=" + Assembly.GetEntryAssembly().Location; 169 | using (var iGbl = new TransactedInstaller()) 170 | using (var iSP = new System.ServiceProcess.ServiceProcessInstaller()) 171 | using (var iS = new System.ServiceProcess.ServiceInstaller()) 172 | { 173 | iS.ServiceName = "SyncThingService"; 174 | iGbl.Installers.AddRange(new System.Configuration.Install.Installer[] { iSP, iS }); 175 | iGbl.Context = new InstallContext(null, new[] { path }); 176 | iGbl.Uninstall(null); 177 | } 178 | } 179 | catch { throw; } 180 | } 181 | 182 | public static void StartService() 183 | { 184 | if (!IsUserAdministrator) { RunAsAdministrator("start"); return; } 185 | using (ServiceController controller = 186 | new ServiceController(SERVICENAME)) 187 | { 188 | if (!GetIsInstalled(controller)) return; 189 | try 190 | { 191 | if (controller.Status != ServiceControllerStatus.Running) 192 | { 193 | controller.Start(); 194 | controller.WaitForStatus(ServiceControllerStatus.Running, 195 | TimeSpan.FromSeconds(10)); 196 | 197 | } 198 | } 199 | catch { throw; } 200 | } 201 | } 202 | 203 | public static void StopService() 204 | { 205 | if (!IsUserAdministrator) { RunAsAdministrator("stop"); return; } 206 | using (ServiceController controller = 207 | new ServiceController(SERVICENAME)) 208 | { 209 | if (!GetIsInstalled(controller)) return; 210 | try 211 | { 212 | if (controller.Status != ServiceControllerStatus.Stopped) 213 | { 214 | controller.Stop(); 215 | controller.WaitForStatus(ServiceControllerStatus.Stopped, 216 | TimeSpan.FromSeconds(10)); 217 | } 218 | } 219 | catch { throw; } 220 | } 221 | } 222 | 223 | public static bool IsUserAdministrator 224 | { 225 | get 226 | { 227 | try 228 | { 229 | WindowsIdentity user = WindowsIdentity.GetCurrent(); 230 | WindowsPrincipal principal = new WindowsPrincipal(user); 231 | return principal.IsInRole(WindowsBuiltInRole.Administrator); 232 | } 233 | catch (UnauthorizedAccessException) { return false; } 234 | catch (Exception) { return false; } 235 | } 236 | } 237 | 238 | public static void RunAsAdministrator() 239 | { 240 | ProcessStartInfo sinfo = new ProcessStartInfo(Application.ExecutablePath); 241 | sinfo.Verb = "runas"; 242 | Process.Start(sinfo); 243 | } 244 | 245 | public static void RunAsAdministrator(params string[] Params) 246 | { 247 | ProcessStartInfo sinfo = new ProcessStartInfo(Application.ExecutablePath, "\"" + string.Join("\" \"", Params) + "\""); 248 | sinfo.Verb = "runas"; 249 | Process.Start(sinfo); 250 | } 251 | 252 | public static string MonitorFile { get; private set; } 253 | public static string SyncExePath { get; private set; } 254 | public static string SyncConfigPath { get; private set; } 255 | public static ProcessPriorityClass SyncPriority { get; private set; } 256 | public static bool AutoRestart { get; private set; } 257 | public static int AutoRestartCount { get; private set; } 258 | public static TimeSpan AutoRestartPeriod { get; private set; } 259 | 260 | public static bool IsConfigured 261 | { 262 | get 263 | { 264 | MonitorFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData, Environment.SpecialFolderOption.Create); 265 | MonitorFile = Path.Combine(MonitorFile, "Syncthing Service"); 266 | if (!Directory.Exists(MonitorFile)) Directory.CreateDirectory(MonitorFile); 267 | MonitorFile = Path.Combine(MonitorFile, "Std.out"); 268 | 269 | // Check the configuration 270 | RegistryKey klm = Registry.LocalMachine; 271 | if (klm == null) return false; 272 | using (RegistryKey ksoft = klm.OpenSubKey("SOFTWARE")) 273 | { 274 | if (ksoft == null) return false; 275 | using (RegistryKey ksync = ksoft.OpenSubKey("Syncthing Service")) 276 | { 277 | if (ksync == null) return false; 278 | SyncExePath = ksync.GetValue("Executable", "") as string; 279 | SyncConfigPath = ksync.GetValue("Configuration", "") as string; 280 | string priority = ksync.GetValue("Priority", "") as string; 281 | switch (priority) 282 | { 283 | case "Real Time": SyncPriority = ProcessPriorityClass.RealTime; break; 284 | case "High": SyncPriority = ProcessPriorityClass.High; break; 285 | case "Above Normal": SyncPriority = ProcessPriorityClass.AboveNormal; break; 286 | case "Normal": SyncPriority = ProcessPriorityClass.Normal; break; 287 | case "Below Normal": SyncPriority = ProcessPriorityClass.BelowNormal; break; 288 | case "Idle": SyncPriority = ProcessPriorityClass.Idle; break; 289 | default: SyncPriority = ProcessPriorityClass.Normal; break; 290 | } 291 | string[] autos = (ksync.GetValue("Autorestart", "") as string).Split(new char[] { ':' }, 2); 292 | if ((autos.Length < 2) || (autos[0] != "Yes")) 293 | AutoRestart = false; 294 | else if (autos[1] == "unlimited") 295 | { 296 | AutoRestart = true; 297 | AutoRestartCount = 0; 298 | AutoRestartPeriod = TimeSpan.Zero; 299 | } 300 | else 301 | { 302 | string[] opts = autos[1].Split(','); 303 | int t; TimeSpan d; 304 | if (!int.TryParse(opts[0], out t)) 305 | t = 0; 306 | if ((opts.Length<2)|| !TimeSpan.TryParse(opts[1], out d)) 307 | d = TimeSpan.Zero; 308 | if ((t == 0) || (d == TimeSpan.Zero)) 309 | { 310 | AutoRestart = false; 311 | } 312 | else 313 | { 314 | AutoRestart = true; 315 | AutoRestartCount = t; 316 | AutoRestartPeriod = d; 317 | } 318 | } 319 | return !string.IsNullOrEmpty(SyncExePath) && !string.IsNullOrEmpty(SyncConfigPath); 320 | } 321 | } 322 | } 323 | } 324 | 325 | public static string GuiUrl { get; private set; } 326 | public static string APIUrl { get; private set; } 327 | public static string APIKey { get; private set; } 328 | 329 | public static string ReadConfiguration() 330 | { 331 | string cfgpath = Path.Combine(Program.SyncConfigPath, "config.xml"); 332 | if (File.Exists(cfgpath)) 333 | { 334 | XmlDocument xml = new XmlDocument(); 335 | xml.Load(cfgpath); 336 | XmlElement xr = xml.DocumentElement; 337 | var xgs = xr.GetElementsByTagName("gui"); 338 | if (xgs.Count == 1) 339 | { 340 | XmlElement xg = (XmlElement)xgs[0]; 341 | string tls = xg.GetAttribute("tls"); 342 | var xas = xg.GetElementsByTagName("address"); 343 | if (xas.Count == 1) 344 | { 345 | GuiUrl = (tls == "true" ? "https://" : "http://") + xas[0].InnerText; 346 | APIUrl = "http://" + xas[0].InnerText; 347 | } 348 | else 349 | return "The http address of Syncthing could not be found in the configuration"; 350 | xas = xg.GetElementsByTagName("apikey"); 351 | if (xas.Count == 1) 352 | APIKey = xas[0].InnerText; 353 | else 354 | return "Could not find the API Key in the configuration: Ensure that an API key was generated in the syncthing GUI"; 355 | return null; 356 | } 357 | else 358 | return "The Syncthing configuration cannot be retreived as the gui element could not be found"; 359 | } 360 | else 361 | return "The configuration file could not be found: " + cfgpath; 362 | } 363 | } 364 | } 365 | -------------------------------------------------------------------------------- /frmInstall.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 186, 17 125 | 126 | 127 | 128 | 129 | iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 130 | JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEaklE 131 | QVRIS7WVXUxbZRjHEbeJVyZ6oXOXerUbNV7IxcymxiXTZPFOlxiz+JHNaGK2izkZTtiiaER0EORDWray 132 | BRjQDRBBkI+2UGltC6UwWGmBQku/S8vpaXvac/r4PC+0AT2Ju8CLH+flec/5/9/neZ/3bQEA/K8U1A0Y 133 | H5Kb2Ctkgzsg84eRfcj+bWhMsQdamGywZ3pp39CMq6hTP3ewadD08s0Ry5F2jfUoQWOMHVEMWQ53GReK 134 | uk3OIjmNHLv+6ZlaLmz8w/R4p8F+okqt/aa2R992fWSq/ZbWNtw2YdMRt3RWo0ozrVONWLUqne1ui9b2 135 | ncEZLOaS4qGdWjnyA9yLp8pUvx0rVfZfQQPDlDuy5o4LYUGSYmI2m0qIUgrHYjwtSgFOSK2EeM6wHFjv 136 | tSzNKIdN49+rdXfGHYHn0ZBKuNugdsBwqKJ1tHpwdtWxGOTj2WwW/snZC01QfLICflBqIJwQwZdIg5tL 137 | Z5fCqYxpJZzus65E0aQP+ahFM1uYN0Dhg2eqWr6yB3mOE8R/CROYARx9px7e+mwMGjpmwMunYWUjBYsh 138 | Hu4FET8P+D0s+HhAg96T5ytPoe4jzODzxt6SUbsvKidMSEga4dMSRAUJ/PE0rMUEcAYTMOfjwOKJgHkt 139 | DJa1CNi8m8yIMjnx8ZXnmEF1t17t4TKy4hkkLWXhxeNfMF59txlKr42z1c8HNmHavcHEzStogEZz3jhD 140 | bbLDh5Ut5VsGfXoTliaUkiQmSE+GKEE8g+CqYwgZvHGmBy6hgZNK44+hQQSMKM4yQAPKgMpl9cTIoI0Z 141 | YPcYMQOBsoikRNhIIriJURojse1nzqC0egJckSSWIg6z3hgrDYlb16P5DCj2wbfNncwAO2gS20uk2jkj 142 | KSAjIpTIQIAXIYA1D/KZvMGX1ePgxhIth5JwP5RgKyZR2mzaZHqOLfh3GXQ0D5v9I3Z3ll7ENgVHOAmr 143 | 0RTrFn9CgNAugwlY3xTY/BIuyBHht77BZ76TOjXJ964qrjGDc7Udxytuj2rwBAvYTax+9CIeMmYQwEyw 144 | 1fMGl2v0mJ0IfszOG8/AKodmCC0qiO+iDmBnOrFNn2AGOHj0XF3Xa4hZMTQFeNhY2qtcEsW36v/KqV/g 145 | 9dOtDDJRqK0Qwb0iQS9mRyWlut/QzvCo8+fl5n7WosyA/uDEAbwmXsJsaq62DdtUY5b7d/5aTOgdQVaK 146 | JHYUh53ESEnAoyleGXQO/KN2t6d9ct6F3zlQvOv9CuXTOfG8QQ68R/aXXR8oPl+vbrjQoB4pU/YvVt4e 147 | c3mwTz1Yd+dGEqZXI0J9vzFUrvrdcanxV+PZH282onD5Jz+1HsPyPIbXBF3l8gY5bK5gYfOQ+dkbg+bD 148 | JU3di1RrH2LDVqy6q/NcrOv4VDFgfLO2b/KFn/sMz2CrPymnQ8gGt2E/Nqe/Vujo4LlwTy42dd/DGN3/ 149 | B2hu+x25b/PIBneC/aylTcTSzcvN/xeywZ28XVIzi5s/Kzf3IMgG9xLZ4N4BBX8DkiAEaZStrZoAAAAA 150 | SUVORK5CYII= 151 | 152 | 153 | 154 | 398, 17 155 | 156 | 157 | 304, 17 158 | 159 | 160 | 161 | iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 162 | JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEaklE 163 | QVRIS7WVXUxbZRjHEbeJVyZ6oXOXerUbNV7IxcymxiXTZPFOlxiz+JHNaGK2izkZTtiiaER0EORDWray 164 | BRjQDRBBkI+2UGltC6UwWGmBQku/S8vpaXvac/r4PC+0AT2Ju8CLH+flec/5/9/neZ/3bQEA/K8U1A0Y 165 | H5Kb2Ctkgzsg84eRfcj+bWhMsQdamGywZ3pp39CMq6hTP3ewadD08s0Ry5F2jfUoQWOMHVEMWQ53GReK 166 | uk3OIjmNHLv+6ZlaLmz8w/R4p8F+okqt/aa2R992fWSq/ZbWNtw2YdMRt3RWo0ozrVONWLUqne1ui9b2 167 | ncEZLOaS4qGdWjnyA9yLp8pUvx0rVfZfQQPDlDuy5o4LYUGSYmI2m0qIUgrHYjwtSgFOSK2EeM6wHFjv 168 | tSzNKIdN49+rdXfGHYHn0ZBKuNugdsBwqKJ1tHpwdtWxGOTj2WwW/snZC01QfLICflBqIJwQwZdIg5tL 169 | Z5fCqYxpJZzus65E0aQP+ahFM1uYN0Dhg2eqWr6yB3mOE8R/CROYARx9px7e+mwMGjpmwMunYWUjBYsh 170 | Hu4FET8P+D0s+HhAg96T5ytPoe4jzODzxt6SUbsvKidMSEga4dMSRAUJ/PE0rMUEcAYTMOfjwOKJgHkt 171 | DJa1CNi8m8yIMjnx8ZXnmEF1t17t4TKy4hkkLWXhxeNfMF59txlKr42z1c8HNmHavcHEzStogEZz3jhD 172 | bbLDh5Ut5VsGfXoTliaUkiQmSE+GKEE8g+CqYwgZvHGmBy6hgZNK44+hQQSMKM4yQAPKgMpl9cTIoI0Z 173 | YPcYMQOBsoikRNhIIriJURojse1nzqC0egJckSSWIg6z3hgrDYlb16P5DCj2wbfNncwAO2gS20uk2jkj 174 | KSAjIpTIQIAXIYA1D/KZvMGX1ePgxhIth5JwP5RgKyZR2mzaZHqOLfh3GXQ0D5v9I3Z3ll7ENgVHOAmr 175 | 0RTrFn9CgNAugwlY3xTY/BIuyBHht77BZ76TOjXJ964qrjGDc7Udxytuj2rwBAvYTax+9CIeMmYQwEyw 176 | 1fMGl2v0mJ0IfszOG8/AKodmCC0qiO+iDmBnOrFNn2AGOHj0XF3Xa4hZMTQFeNhY2qtcEsW36v/KqV/g 177 | 9dOtDDJRqK0Qwb0iQS9mRyWlut/QzvCo8+fl5n7WosyA/uDEAbwmXsJsaq62DdtUY5b7d/5aTOgdQVaK 178 | JHYUh53ESEnAoyleGXQO/KN2t6d9ct6F3zlQvOv9CuXTOfG8QQ68R/aXXR8oPl+vbrjQoB4pU/YvVt4e 179 | c3mwTz1Yd+dGEqZXI0J9vzFUrvrdcanxV+PZH282onD5Jz+1HsPyPIbXBF3l8gY5bK5gYfOQ+dkbg+bD 180 | JU3di1RrH2LDVqy6q/NcrOv4VDFgfLO2b/KFn/sMz2CrPymnQ8gGt2E/Nqe/Vujo4LlwTy42dd/DGN3/ 181 | B2hu+x25b/PIBneC/aylTcTSzcvN/xeywZ28XVIzi5s/Kzf3IMgG9xLZ4N4BBX8DkiAEaZStrZoAAAAA 182 | SUVORK5CYII= 183 | 184 | 185 | 186 | 187 | iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 188 | JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEaklE 189 | QVRIS7WVXUxbZRjHEbeJVyZ6oXOXerUbNV7IxcymxiXTZPFOlxiz+JHNaGK2izkZTtiiaER0EORDWray 190 | BRjQDRBBkI+2UGltC6UwWGmBQku/S8vpaXvac/r4PC+0AT2Ju8CLH+flec/5/9/neZ/3bQEA/K8U1A0Y 191 | H5Kb2Ctkgzsg84eRfcj+bWhMsQdamGywZ3pp39CMq6hTP3ewadD08s0Ry5F2jfUoQWOMHVEMWQ53GReK 192 | uk3OIjmNHLv+6ZlaLmz8w/R4p8F+okqt/aa2R992fWSq/ZbWNtw2YdMRt3RWo0ozrVONWLUqne1ui9b2 193 | ncEZLOaS4qGdWjnyA9yLp8pUvx0rVfZfQQPDlDuy5o4LYUGSYmI2m0qIUgrHYjwtSgFOSK2EeM6wHFjv 194 | tSzNKIdN49+rdXfGHYHn0ZBKuNugdsBwqKJ1tHpwdtWxGOTj2WwW/snZC01QfLICflBqIJwQwZdIg5tL 195 | Z5fCqYxpJZzus65E0aQP+ahFM1uYN0Dhg2eqWr6yB3mOE8R/CROYARx9px7e+mwMGjpmwMunYWUjBYsh 196 | Hu4FET8P+D0s+HhAg96T5ytPoe4jzODzxt6SUbsvKidMSEga4dMSRAUJ/PE0rMUEcAYTMOfjwOKJgHkt 197 | DJa1CNi8m8yIMjnx8ZXnmEF1t17t4TKy4hkkLWXhxeNfMF59txlKr42z1c8HNmHavcHEzStogEZz3jhD 198 | bbLDh5Ut5VsGfXoTliaUkiQmSE+GKEE8g+CqYwgZvHGmBy6hgZNK44+hQQSMKM4yQAPKgMpl9cTIoI0Z 199 | YPcYMQOBsoikRNhIIriJURojse1nzqC0egJckSSWIg6z3hgrDYlb16P5DCj2wbfNncwAO2gS20uk2jkj 200 | KSAjIpTIQIAXIYA1D/KZvMGX1ePgxhIth5JwP5RgKyZR2mzaZHqOLfh3GXQ0D5v9I3Z3ll7ENgVHOAmr 201 | 0RTrFn9CgNAugwlY3xTY/BIuyBHht77BZ76TOjXJ964qrjGDc7Udxytuj2rwBAvYTax+9CIeMmYQwEyw 202 | 1fMGl2v0mJ0IfszOG8/AKodmCC0qiO+iDmBnOrFNn2AGOHj0XF3Xa4hZMTQFeNhY2qtcEsW36v/KqV/g 203 | 9dOtDDJRqK0Qwb0iQS9mRyWlut/QzvCo8+fl5n7WosyA/uDEAbwmXsJsaq62DdtUY5b7d/5aTOgdQVaK 204 | JHYUh53ESEnAoyleGXQO/KN2t6d9ct6F3zlQvOv9CuXTOfG8QQ68R/aXXR8oPl+vbrjQoB4pU/YvVt4e 205 | c3mwTz1Yd+dGEqZXI0J9vzFUrvrdcanxV+PZH282onD5Jz+1HsPyPIbXBF3l8gY5bK5gYfOQ+dkbg+bD 206 | JU3di1RrH2LDVqy6q/NcrOv4VDFgfLO2b/KFn/sMz2CrPymnQ8gGt2E/Nqe/Vujo4LlwTy42dd/DGN3/ 207 | B2hu+x25b/PIBneC/aylTcTSzcvN/xeywZ28XVIzi5s/Kzf3IMgG9xLZ4N4BBX8DkiAEaZStrZoAAAAA 208 | SUVORK5CYII= 209 | 210 | 211 | 212 | 213 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 214 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 215 | AAAAAAAAc0sE/5tmBv+7egf/x4II/8eCCP+9ewf/nmcG/3ZNBP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 216 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 217 | AAB1TQX/w4EJ/82HCf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8yHCf/Gggn/e1EF/wAA 218 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 219 | AABlQwX/yYYK/8qGCv/Jhgr/yYYK/8mGCv/JhQn/yIMF/8iDBf/IgwX/yIMF/8mFCP/Jhgr/yYYK/8mG 220 | Cv/Jhgr/y4gK/25JBf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 221 | AAAAAAAApW8J/8yJC//KiAv/yogL/8mHCf/Jhwn/1J04/+G8d//r0aH/79q0/+/atP/r0qP/4r56/9Wf 222 | PP/Jhwv/yYcJ/8qIC//Jhwj/y4gK/6xzCf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 223 | AAAAAAAAAAAAALl9C//LiQz/y4kM/8uJC//Lig//4bt0//fu3f////////////79+//79+7/+/bu//78 224 | +v////////////jw4f/ivnr/16RD/+XFh//csFz/yokL/7+CDP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 225 | AAAAAAAAAAAAAAAAAAC5fwv/y4sN/8uLDf/KiQr/16VE//jv3v//////+fHj/+bHif/Woz7/zpEa/8uL 226 | Dv/Liw7/zpEZ/9WhO//lxIP/+O/e///////////////////////pzpr/yokJ/8CDDP8AAAAAAAAAAAAA 227 | AAAAAAAAAAAAAAAAAAAAAAAAo3EL/8yMDv/MjA7/y4oK/+G7cP/+/fv//Pjw/+G7cP/MjQ7/y4sL/8yM 228 | Dv/MjA7/zIwO/8yMDv/MjA7/zIwO/8uLC//KiQn/9erT//////////////////38+f/Okhr/zIwO/613 229 | C/8AAAAAAAAAAAAAAAAAAAAAAAAAAGFDB//OkA//zI4P/8uMC//hvHD///////bs1//Smij/zI0M/8yO 230 | D//Mjg//zI4P/8yOD//Mjg//zI4P/8yOD//Mjg//zI4P/8uLCP/y4cD//////////////////fr2/86S 231 | F//Mjg//zo8P/29NCP8AAAAAAAAAAAAAAAAAAAAAyo0P/82QEP/Mjw//2KhF//79+//27Nf/z5Qa/82Q 232 | D//NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zI4M/+jLkP////////////// 233 | ///+/v3/269S/8yPDv/NkBD/z5EQ/wAAAAAAAAAAAAAAAHBPCf/OkhH/zpER/86SE//4793//Pjw/9Od 234 | Kf/OkRD/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REP/VojX//fv2//br 235 | 1P/ft2P/2q1M//r16f/69Of/0JUY/86REf/OkRH/flkK/wAAAAAAAAAAwosR/82SD//Tnin/6c6T//// 236 | ///ivnD/zZIP/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS//br 237 | 0//9+/f/1qQ3/86TEf/NkhD/3rhi///////mx4X/zZIP/86TEv/KkRH/AAAAAAAAAADTmBL/3LJV//37 238 | +P///////////+G8a//Okw//z5US/8+VE//PlRP/z5UT/8+VE//PlRP/z5UT/8+VE//PlBL/zpMQ/9GY 239 | G//ozI///////+TEfP/Okw//z5UT/8+VE//OkxD/9+3X//r05//PlhT/z5UT/9KXE/8AAAAAbE4K/8+U 240 | Dv/269L/////////////////+/br/+PCdv/fuF//2q1H/9akM//TnSP/0JgX/8+VEP/Okw3/zpMM/9en 241 | Of/37dj//v37//7+/f/z5cX/z5UR/8+WFP/PlhT/z5YU/8+VEv/kxXz//////9uuSv/PlhT/z5YU/3pZ 242 | C/+ZcA//z5cQ//jw3f////////////////////////////////////////////7+/f/8+fL/+fLh//Xp 243 | zf/w3rT/+fPk//////////////////Hguf/Plg//0JgU/9CYFP/QmBT/0JgU/9enN///////6MyL/8+X 244 | Ev/QmBT/oXYP/8CNE//QmBP/5cZ8/////////////////+rSl//Zqz3/3bZW/+LAbv/oy4f/7Nag//De 245 | s//058n/+PDd//z47////v7/////////////////+fHg/9CYEf/RmRX/0ZkV/9GZFf/RmRX/0pwb//36 246 | 9P/v3bH/0JYP/9GZFf+/jBP/0JoW/9GbFv/PmA//8uO///389//hvWb/0JoU/9GbFv/Rmxb/0ZsW/9Ca 247 | FP/QmRL/0JgQ/8+YD//QmRL/0ZoU//Pkwf/////////////////79+z/2Kk4/9CaFP/Rmxb/0ZsW/9Gb 248 | Fv/QmhP/+vPk//PlxP/PmA//0ZsW/8mWFf/QnBf/0p0X/9GaEf/x4Lb//Pjv/9KeGP/SnRf/0p0X/9Kd 249 | F//SnRf/0p0X/9KdF//SnRf/0p0X/9KdF//SnRf/1aQm//Ddr//48Nv/8N6x//379v/8+fL/37lY/9Gb 250 | E//SnRf/0p0X/9GcFP/68+T/9ObE/9CaEP/SnRf/ypgW/8CQFv/Snhj/0ZwT/+7ap//+/fv/1aMk/9Ke 251 | GP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0ZwT/9GcE//RmxH/27JF//r1 252 | 6P/+/vz/5sl+/9GcFP/Snhj/06Ad//368//w37P/0ZsS/9KeGP+/kBb/mHMS/9OgGf/SoBj/58p+//// 253 | ///cskb/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9Og 254 | Gf/ToBj/16gs//ft1P//////7tml/9WkIv/fulf//////+rRj//Snxf/06AZ/6F6E/9sUg3/1KIa/9Sh 255 | Gv/cs0T//////+nQjP/ToBf/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9Sh 256 | Gv/UoRr/1KEa/9ShGv/UoRr/1KMd//Dgs////////fv2////////////582D/9OgGP/UoRr/e14P/wAA 257 | AADZpxz/1KMb/9OjGv/58uD/+fLg/9SjGv/Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/1KMb/9Sj 258 | G//Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/06AU//XqzP/////////////////8+fD/1aYh/9im 259 | HP8AAAAAAAAAAMWZGf/VpRz/1KQa/+jNgf//////5cdx/9SkGv/VpRz/1aUc/9WlHP/VpRz/1aUc/9Wl 260 | HP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/UoxX/9erL//////////////////7+ 261 | /f/YrCz/zqAb/wAAAAAAAAAAblYP/9anHf/Vph3/1qgh//r05P/7+O3/2a0v/9WmHf/Vph3/1aYd/9Wm 262 | Hf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WlG//ozX////////// 263 | ////////9OfB/9WlGf98YRD/AAAAAAAAAAAAAAAAz6Md/9aoHv/VqB3/4L5X//7+/f/37tL/16oj/9ao 264 | Hv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qkf//Xp 265 | xv///v7/8+a9/+zWlP/XqyX/1agd/wAAAAAAAAAAAAAAAAAAAABdSQ3/2qwf/9eqH//WqRv/6dCD//// 266 | ///37dH/2rAv/9apHf/Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//1qod/9mu 267 | Kv/16sj//////+vVkP/Vpxb/1qkc/9msH/9rVA//AAAAAAAAAAAAAAAAAAAAAAAAAACkghj/16sg/9er 268 | IP/Wqhz/6dGF//7+/f/7+Oz/5clu/9eqHf/Wqx7/16sg/9erIP/XqyD/16sg/9erIP/XqyD/1qse/9aq 269 | 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 304 | 305 | 306 | -------------------------------------------------------------------------------- /frmMessage.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | 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 205 | E6r1PJkxIJTAAAAAAElFTkSuQmCC 206 | 207 | 208 | 209 | 210 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 212 | AAAAAAAAc0sE/5tmBv+7egf/x4II/8eCCP+9ewf/nmcG/3ZNBP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 213 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 214 | AAB1TQX/w4EJ/82HCf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8yHCf/Gggn/e1EF/wAA 215 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 216 | AABlQwX/yYYK/8qGCv/Jhgr/yYYK/8mGCv/JhQn/yIMF/8iDBf/IgwX/yIMF/8mFCP/Jhgr/yYYK/8mG 217 | Cv/Jhgr/y4gK/25JBf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 218 | AAAAAAAApW8J/8yJC//KiAv/yogL/8mHCf/Jhwn/1J04/+G8d//r0aH/79q0/+/atP/r0qP/4r56/9Wf 219 | PP/Jhwv/yYcJ/8qIC//Jhwj/y4gK/6xzCf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 220 | AAAAAAAAAAAAALl9C//LiQz/y4kM/8uJC//Lig//4bt0//fu3f////////////79+//79+7/+/bu//78 221 | +v////////////jw4f/ivnr/16RD/+XFh//csFz/yokL/7+CDP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 222 | AAAAAAAAAAAAAAAAAAC5fwv/y4sN/8uLDf/KiQr/16VE//jv3v//////+fHj/+bHif/Woz7/zpEa/8uL 223 | Dv/Liw7/zpEZ/9WhO//lxIP/+O/e///////////////////////pzpr/yokJ/8CDDP8AAAAAAAAAAAAA 224 | AAAAAAAAAAAAAAAAAAAAAAAAo3EL/8yMDv/MjA7/y4oK/+G7cP/+/fv//Pjw/+G7cP/MjQ7/y4sL/8yM 225 | Dv/MjA7/zIwO/8yMDv/MjA7/zIwO/8uLC//KiQn/9erT//////////////////38+f/Okhr/zIwO/613 226 | C/8AAAAAAAAAAAAAAAAAAAAAAAAAAGFDB//OkA//zI4P/8uMC//hvHD///////bs1//Smij/zI0M/8yO 227 | D//Mjg//zI4P/8yOD//Mjg//zI4P/8yOD//Mjg//zI4P/8uLCP/y4cD//////////////////fr2/86S 228 | F//Mjg//zo8P/29NCP8AAAAAAAAAAAAAAAAAAAAAyo0P/82QEP/Mjw//2KhF//79+//27Nf/z5Qa/82Q 229 | D//NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zI4M/+jLkP////////////// 230 | ///+/v3/269S/8yPDv/NkBD/z5EQ/wAAAAAAAAAAAAAAAHBPCf/OkhH/zpER/86SE//4793//Pjw/9Od 231 | Kf/OkRD/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REP/VojX//fv2//br 232 | 1P/ft2P/2q1M//r16f/69Of/0JUY/86REf/OkRH/flkK/wAAAAAAAAAAwosR/82SD//Tnin/6c6T//// 233 | ///ivnD/zZIP/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS//br 234 | 0//9+/f/1qQ3/86TEf/NkhD/3rhi///////mx4X/zZIP/86TEv/KkRH/AAAAAAAAAADTmBL/3LJV//37 235 | +P///////////+G8a//Okw//z5US/8+VE//PlRP/z5UT/8+VE//PlRP/z5UT/8+VE//PlBL/zpMQ/9GY 236 | G//ozI///////+TEfP/Okw//z5UT/8+VE//OkxD/9+3X//r05//PlhT/z5UT/9KXE/8AAAAAbE4K/8+U 237 | Dv/269L/////////////////+/br/+PCdv/fuF//2q1H/9akM//TnSP/0JgX/8+VEP/Okw3/zpMM/9en 238 | Of/37dj//v37//7+/f/z5cX/z5UR/8+WFP/PlhT/z5YU/8+VEv/kxXz//////9uuSv/PlhT/z5YU/3pZ 239 | C/+ZcA//z5cQ//jw3f////////////////////////////////////////////7+/f/8+fL/+fLh//Xp 240 | zf/w3rT/+fPk//////////////////Hguf/Plg//0JgU/9CYFP/QmBT/0JgU/9enN///////6MyL/8+X 241 | Ev/QmBT/oXYP/8CNE//QmBP/5cZ8/////////////////+rSl//Zqz3/3bZW/+LAbv/oy4f/7Nag//De 242 | s//058n/+PDd//z47////v7/////////////////+fHg/9CYEf/RmRX/0ZkV/9GZFf/RmRX/0pwb//36 243 | 9P/v3bH/0JYP/9GZFf+/jBP/0JoW/9GbFv/PmA//8uO///389//hvWb/0JoU/9GbFv/Rmxb/0ZsW/9Ca 244 | FP/QmRL/0JgQ/8+YD//QmRL/0ZoU//Pkwf/////////////////79+z/2Kk4/9CaFP/Rmxb/0ZsW/9Gb 245 | Fv/QmhP/+vPk//PlxP/PmA//0ZsW/8mWFf/QnBf/0p0X/9GaEf/x4Lb//Pjv/9KeGP/SnRf/0p0X/9Kd 246 | F//SnRf/0p0X/9KdF//SnRf/0p0X/9KdF//SnRf/1aQm//Ddr//48Nv/8N6x//379v/8+fL/37lY/9Gb 247 | E//SnRf/0p0X/9GcFP/68+T/9ObE/9CaEP/SnRf/ypgW/8CQFv/Snhj/0ZwT/+7ap//+/fv/1aMk/9Ke 248 | GP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0ZwT/9GcE//RmxH/27JF//r1 249 | 6P/+/vz/5sl+/9GcFP/Snhj/06Ad//368//w37P/0ZsS/9KeGP+/kBb/mHMS/9OgGf/SoBj/58p+//// 250 | ///cskb/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9Og 251 | Gf/ToBj/16gs//ft1P//////7tml/9WkIv/fulf//////+rRj//Snxf/06AZ/6F6E/9sUg3/1KIa/9Sh 252 | Gv/cs0T//////+nQjP/ToBf/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9Sh 253 | Gv/UoRr/1KEa/9ShGv/UoRr/1KMd//Dgs////////fv2////////////582D/9OgGP/UoRr/e14P/wAA 254 | AADZpxz/1KMb/9OjGv/58uD/+fLg/9SjGv/Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/1KMb/9Sj 255 | G//Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/06AU//XqzP/////////////////8+fD/1aYh/9im 256 | HP8AAAAAAAAAAMWZGf/VpRz/1KQa/+jNgf//////5cdx/9SkGv/VpRz/1aUc/9WlHP/VpRz/1aUc/9Wl 257 | HP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/UoxX/9erL//////////////////7+ 258 | /f/YrCz/zqAb/wAAAAAAAAAAblYP/9anHf/Vph3/1qgh//r05P/7+O3/2a0v/9WmHf/Vph3/1aYd/9Wm 259 | Hf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WlG//ozX////////// 260 | ////////9OfB/9WlGf98YRD/AAAAAAAAAAAAAAAAz6Md/9aoHv/VqB3/4L5X//7+/f/37tL/16oj/9ao 261 | Hv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qkf//Xp 262 | xv///v7/8+a9/+zWlP/XqyX/1agd/wAAAAAAAAAAAAAAAAAAAABdSQ3/2qwf/9eqH//WqRv/6dCD//// 263 | ///37dH/2rAv/9apHf/Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//1qod/9mu 264 | Kv/16sj//////+vVkP/Vpxb/1qkc/9msH/9rVA//AAAAAAAAAAAAAAAAAAAAAAAAAACkghj/16sg/9er 265 | IP/Wqhz/6dGF//7+/f/7+Oz/5clu/9eqHf/Wqx7/16sg/9erIP/XqyD/16sg/9erIP/XqyD/1qse/9aq 266 | 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 301 | 302 | 303 | -------------------------------------------------------------------------------- /frmMain.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 116, 17 125 | 126 | 127 | 128 | 129 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 130 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 131 | AAAAAAAAc0sE/5tmBv+7egf/x4II/8eCCP+9ewf/nmcG/3ZNBP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 132 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 133 | AAB1TQX/w4EJ/82HCf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8yHCf/Gggn/e1EF/wAA 134 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 135 | AABlQwX/yYYK/8qGCv/Jhgr/yYYK/8mGCv/JhQn/yIMF/8iDBf/IgwX/yIMF/8mFCP/Jhgr/yYYK/8mG 136 | Cv/Jhgr/y4gK/25JBf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAApW8J/8yJC//KiAv/yogL/8mHCf/Jhwn/1J04/+G8d//r0aH/79q0/+/atP/r0qP/4r56/9Wf 138 | PP/Jhwv/yYcJ/8qIC//Jhwj/y4gK/6xzCf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 139 | AAAAAAAAAAAAALl9C//LiQz/y4kM/8uJC//Lig//4bt0//fu3f////////////79+//79+7/+/bu//78 140 | +v////////////jw4f/ivnr/16RD/+XFh//csFz/yokL/7+CDP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 141 | AAAAAAAAAAAAAAAAAAC5fwv/y4sN/8uLDf/KiQr/16VE//jv3v//////+fHj/+bHif/Woz7/zpEa/8uL 142 | Dv/Liw7/zpEZ/9WhO//lxIP/+O/e///////////////////////pzpr/yokJ/8CDDP8AAAAAAAAAAAAA 143 | AAAAAAAAAAAAAAAAAAAAAAAAo3EL/8yMDv/MjA7/y4oK/+G7cP/+/fv//Pjw/+G7cP/MjQ7/y4sL/8yM 144 | Dv/MjA7/zIwO/8yMDv/MjA7/zIwO/8uLC//KiQn/9erT//////////////////38+f/Okhr/zIwO/613 145 | C/8AAAAAAAAAAAAAAAAAAAAAAAAAAGFDB//OkA//zI4P/8uMC//hvHD///////bs1//Smij/zI0M/8yO 146 | D//Mjg//zI4P/8yOD//Mjg//zI4P/8yOD//Mjg//zI4P/8uLCP/y4cD//////////////////fr2/86S 147 | F//Mjg//zo8P/29NCP8AAAAAAAAAAAAAAAAAAAAAyo0P/82QEP/Mjw//2KhF//79+//27Nf/z5Qa/82Q 148 | D//NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zI4M/+jLkP////////////// 149 | ///+/v3/269S/8yPDv/NkBD/z5EQ/wAAAAAAAAAAAAAAAHBPCf/OkhH/zpER/86SE//4793//Pjw/9Od 150 | Kf/OkRD/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REP/VojX//fv2//br 151 | 1P/ft2P/2q1M//r16f/69Of/0JUY/86REf/OkRH/flkK/wAAAAAAAAAAwosR/82SD//Tnin/6c6T//// 152 | ///ivnD/zZIP/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS//br 153 | 0//9+/f/1qQ3/86TEf/NkhD/3rhi///////mx4X/zZIP/86TEv/KkRH/AAAAAAAAAADTmBL/3LJV//37 154 | +P///////////+G8a//Okw//z5US/8+VE//PlRP/z5UT/8+VE//PlRP/z5UT/8+VE//PlBL/zpMQ/9GY 155 | G//ozI///////+TEfP/Okw//z5UT/8+VE//OkxD/9+3X//r05//PlhT/z5UT/9KXE/8AAAAAbE4K/8+U 156 | Dv/269L/////////////////+/br/+PCdv/fuF//2q1H/9akM//TnSP/0JgX/8+VEP/Okw3/zpMM/9en 157 | Of/37dj//v37//7+/f/z5cX/z5UR/8+WFP/PlhT/z5YU/8+VEv/kxXz//////9uuSv/PlhT/z5YU/3pZ 158 | C/+ZcA//z5cQ//jw3f////////////////////////////////////////////7+/f/8+fL/+fLh//Xp 159 | zf/w3rT/+fPk//////////////////Hguf/Plg//0JgU/9CYFP/QmBT/0JgU/9enN///////6MyL/8+X 160 | Ev/QmBT/oXYP/8CNE//QmBP/5cZ8/////////////////+rSl//Zqz3/3bZW/+LAbv/oy4f/7Nag//De 161 | s//058n/+PDd//z47////v7/////////////////+fHg/9CYEf/RmRX/0ZkV/9GZFf/RmRX/0pwb//36 162 | 9P/v3bH/0JYP/9GZFf+/jBP/0JoW/9GbFv/PmA//8uO///389//hvWb/0JoU/9GbFv/Rmxb/0ZsW/9Ca 163 | FP/QmRL/0JgQ/8+YD//QmRL/0ZoU//Pkwf/////////////////79+z/2Kk4/9CaFP/Rmxb/0ZsW/9Gb 164 | Fv/QmhP/+vPk//PlxP/PmA//0ZsW/8mWFf/QnBf/0p0X/9GaEf/x4Lb//Pjv/9KeGP/SnRf/0p0X/9Kd 165 | F//SnRf/0p0X/9KdF//SnRf/0p0X/9KdF//SnRf/1aQm//Ddr//48Nv/8N6x//379v/8+fL/37lY/9Gb 166 | E//SnRf/0p0X/9GcFP/68+T/9ObE/9CaEP/SnRf/ypgW/8CQFv/Snhj/0ZwT/+7ap//+/fv/1aMk/9Ke 167 | GP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0ZwT/9GcE//RmxH/27JF//r1 168 | 6P/+/vz/5sl+/9GcFP/Snhj/06Ad//368//w37P/0ZsS/9KeGP+/kBb/mHMS/9OgGf/SoBj/58p+//// 169 | ///cskb/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9Og 170 | Gf/ToBj/16gs//ft1P//////7tml/9WkIv/fulf//////+rRj//Snxf/06AZ/6F6E/9sUg3/1KIa/9Sh 171 | Gv/cs0T//////+nQjP/ToBf/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9Sh 172 | Gv/UoRr/1KEa/9ShGv/UoRr/1KMd//Dgs////////fv2////////////582D/9OgGP/UoRr/e14P/wAA 173 | AADZpxz/1KMb/9OjGv/58uD/+fLg/9SjGv/Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/1KMb/9Sj 174 | G//Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/06AU//XqzP/////////////////8+fD/1aYh/9im 175 | HP8AAAAAAAAAAMWZGf/VpRz/1KQa/+jNgf//////5cdx/9SkGv/VpRz/1aUc/9WlHP/VpRz/1aUc/9Wl 176 | HP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/UoxX/9erL//////////////////7+ 177 | /f/YrCz/zqAb/wAAAAAAAAAAblYP/9anHf/Vph3/1qgh//r05P/7+O3/2a0v/9WmHf/Vph3/1aYd/9Wm 178 | Hf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WlG//ozX////////// 179 | ////////9OfB/9WlGf98YRD/AAAAAAAAAAAAAAAAz6Md/9aoHv/VqB3/4L5X//7+/f/37tL/16oj/9ao 180 | Hv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qkf//Xp 181 | xv///v7/8+a9/+zWlP/XqyX/1agd/wAAAAAAAAAAAAAAAAAAAABdSQ3/2qwf/9eqH//WqRv/6dCD//// 182 | ///37dH/2rAv/9apHf/Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//1qod/9mu 183 | Kv/16sj//////+vVkP/Vpxb/1qkc/9msH/9rVA//AAAAAAAAAAAAAAAAAAAAAAAAAACkghj/16sg/9er 184 | IP/Wqhz/6dGF//7+/f/7+Oz/5clu/9eqHf/Wqx7/16sg/9erIP/XqyD/16sg/9erIP/XqyD/1qse/9aq 185 | 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 220 | 221 | 222 | 223 | 206, 17 224 | 225 | 226 | 323, 17 227 | 228 | 229 | 230 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 231 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 232 | AAAAAAAAc0sE/5tmBv+7egf/x4II/8eCCP+9ewf/nmcG/3ZNBP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 233 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 234 | AAB1TQX/w4EJ/82HCf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8mECf/JhAn/yYQJ/8yHCf/Gggn/e1EF/wAA 235 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 236 | AABlQwX/yYYK/8qGCv/Jhgr/yYYK/8mGCv/JhQn/yIMF/8iDBf/IgwX/yIMF/8mFCP/Jhgr/yYYK/8mG 237 | Cv/Jhgr/y4gK/25JBf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 238 | AAAAAAAApW8J/8yJC//KiAv/yogL/8mHCf/Jhwn/1J04/+G8d//r0aH/79q0/+/atP/r0qP/4r56/9Wf 239 | PP/Jhwv/yYcJ/8qIC//Jhwj/y4gK/6xzCf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 240 | AAAAAAAAAAAAALl9C//LiQz/y4kM/8uJC//Lig//4bt0//fu3f////////////79+//79+7/+/bu//78 241 | +v////////////jw4f/ivnr/16RD/+XFh//csFz/yokL/7+CDP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 242 | AAAAAAAAAAAAAAAAAAC5fwv/y4sN/8uLDf/KiQr/16VE//jv3v//////+fHj/+bHif/Woz7/zpEa/8uL 243 | Dv/Liw7/zpEZ/9WhO//lxIP/+O/e///////////////////////pzpr/yokJ/8CDDP8AAAAAAAAAAAAA 244 | AAAAAAAAAAAAAAAAAAAAAAAAo3EL/8yMDv/MjA7/y4oK/+G7cP/+/fv//Pjw/+G7cP/MjQ7/y4sL/8yM 245 | Dv/MjA7/zIwO/8yMDv/MjA7/zIwO/8uLC//KiQn/9erT//////////////////38+f/Okhr/zIwO/613 246 | C/8AAAAAAAAAAAAAAAAAAAAAAAAAAGFDB//OkA//zI4P/8uMC//hvHD///////bs1//Smij/zI0M/8yO 247 | D//Mjg//zI4P/8yOD//Mjg//zI4P/8yOD//Mjg//zI4P/8uLCP/y4cD//////////////////fr2/86S 248 | F//Mjg//zo8P/29NCP8AAAAAAAAAAAAAAAAAAAAAyo0P/82QEP/Mjw//2KhF//79+//27Nf/z5Qa/82Q 249 | D//NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zZAQ/82QEP/NkBD/zI4M/+jLkP////////////// 250 | ///+/v3/269S/8yPDv/NkBD/z5EQ/wAAAAAAAAAAAAAAAHBPCf/OkhH/zpER/86SE//4793//Pjw/9Od 251 | Kf/OkRD/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REf/OkRH/zpER/86REP/VojX//fv2//br 252 | 1P/ft2P/2q1M//r16f/69Of/0JUY/86REf/OkRH/flkK/wAAAAAAAAAAwosR/82SD//Tnin/6c6T//// 253 | ///ivnD/zZIP/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS/86TEv/OkxL/zpMS//br 254 | 0//9+/f/1qQ3/86TEf/NkhD/3rhi///////mx4X/zZIP/86TEv/KkRH/AAAAAAAAAADTmBL/3LJV//37 255 | +P///////////+G8a//Okw//z5US/8+VE//PlRP/z5UT/8+VE//PlRP/z5UT/8+VE//PlBL/zpMQ/9GY 256 | G//ozI///////+TEfP/Okw//z5UT/8+VE//OkxD/9+3X//r05//PlhT/z5UT/9KXE/8AAAAAbE4K/8+U 257 | Dv/269L/////////////////+/br/+PCdv/fuF//2q1H/9akM//TnSP/0JgX/8+VEP/Okw3/zpMM/9en 258 | Of/37dj//v37//7+/f/z5cX/z5UR/8+WFP/PlhT/z5YU/8+VEv/kxXz//////9uuSv/PlhT/z5YU/3pZ 259 | C/+ZcA//z5cQ//jw3f////////////////////////////////////////////7+/f/8+fL/+fLh//Xp 260 | zf/w3rT/+fPk//////////////////Hguf/Plg//0JgU/9CYFP/QmBT/0JgU/9enN///////6MyL/8+X 261 | Ev/QmBT/oXYP/8CNE//QmBP/5cZ8/////////////////+rSl//Zqz3/3bZW/+LAbv/oy4f/7Nag//De 262 | s//058n/+PDd//z47////v7/////////////////+fHg/9CYEf/RmRX/0ZkV/9GZFf/RmRX/0pwb//36 263 | 9P/v3bH/0JYP/9GZFf+/jBP/0JoW/9GbFv/PmA//8uO///389//hvWb/0JoU/9GbFv/Rmxb/0ZsW/9Ca 264 | FP/QmRL/0JgQ/8+YD//QmRL/0ZoU//Pkwf/////////////////79+z/2Kk4/9CaFP/Rmxb/0ZsW/9Gb 265 | Fv/QmhP/+vPk//PlxP/PmA//0ZsW/8mWFf/QnBf/0p0X/9GaEf/x4Lb//Pjv/9KeGP/SnRf/0p0X/9Kd 266 | F//SnRf/0p0X/9KdF//SnRf/0p0X/9KdF//SnRf/1aQm//Ddr//48Nv/8N6x//379v/8+fL/37lY/9Gb 267 | E//SnRf/0p0X/9GcFP/68+T/9ObE/9CaEP/SnRf/ypgW/8CQFv/Snhj/0ZwT/+7ap//+/fv/1aMk/9Ke 268 | GP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0p4Y/9KeGP/Snhj/0ZwT/9GcE//RmxH/27JF//r1 269 | 6P/+/vz/5sl+/9GcFP/Snhj/06Ad//368//w37P/0ZsS/9KeGP+/kBb/mHMS/9OgGf/SoBj/58p+//// 270 | ///cskb/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9OgGf/ToBn/06AZ/9Og 271 | Gf/ToBj/16gs//ft1P//////7tml/9WkIv/fulf//////+rRj//Snxf/06AZ/6F6E/9sUg3/1KIa/9Sh 272 | Gv/cs0T//////+nQjP/ToBf/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9ShGv/UoRr/1KEa/9Sh 273 | Gv/UoRr/1KEa/9ShGv/UoRr/1KMd//Dgs////////fv2////////////582D/9OgGP/UoRr/e14P/wAA 274 | AADZpxz/1KMb/9OjGv/58uD/+fLg/9SjGv/Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/1KMb/9Sj 275 | G//Uoxv/1KMb/9SjG//Uoxv/1KMb/9SjG//Uoxv/06AU//XqzP/////////////////8+fD/1aYh/9im 276 | HP8AAAAAAAAAAMWZGf/VpRz/1KQa/+jNgf//////5cdx/9SkGv/VpRz/1aUc/9WlHP/VpRz/1aUc/9Wl 277 | HP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/VpRz/1aUc/9WlHP/UoxX/9erL//////////////////7+ 278 | /f/YrCz/zqAb/wAAAAAAAAAAblYP/9anHf/Vph3/1qgh//r05P/7+O3/2a0v/9WmHf/Vph3/1aYd/9Wm 279 | Hf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WmHf/Vph3/1aYd/9WlG//ozX////////// 280 | ////////9OfB/9WlGf98YRD/AAAAAAAAAAAAAAAAz6Md/9aoHv/VqB3/4L5X//7+/f/37tL/16oj/9ao 281 | Hv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qge/9aoHv/WqB7/1qkf//Xp 282 | xv///v7/8+a9/+zWlP/XqyX/1agd/wAAAAAAAAAAAAAAAAAAAABdSQ3/2qwf/9eqH//WqRv/6dCD//// 283 | ///37dH/2rAv/9apHf/Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//16of/9eqH//Xqh//1qod/9mu 284 | Kv/16sj//////+vVkP/Vpxb/1qkc/9msH/9rVA//AAAAAAAAAAAAAAAAAAAAAAAAAACkghj/16sg/9er 285 | IP/Wqhz/6dGF//7+/f/7+Oz/5clu/9eqHf/Wqx7/16sg/9erIP/XqyD/16sg/9erIP/XqyD/1qse/9aq 286 | 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 321 | 322 | 323 | -------------------------------------------------------------------------------- /frmInstall.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SyncThingTray 2 | { 3 | partial class frmInstall 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmInstall)); 33 | this.label1 = new System.Windows.Forms.Label(); 34 | this.btnCurrent = new System.Windows.Forms.Button(); 35 | this.txtCurrent = new System.Windows.Forms.TextBox(); 36 | this.btnNew = new System.Windows.Forms.Button(); 37 | this.txtNew = new System.Windows.Forms.TextBox(); 38 | this.label2 = new System.Windows.Forms.Label(); 39 | this.label3 = new System.Windows.Forms.Label(); 40 | this.btnExecutable = new System.Windows.Forms.Button(); 41 | this.txtExecutable = new System.Windows.Forms.TextBox(); 42 | this.btnInstall = new System.Windows.Forms.Button(); 43 | this.dlgSelectFolder = new System.Windows.Forms.FolderBrowserDialog(); 44 | this.dlgOpenFile = new System.Windows.Forms.OpenFileDialog(); 45 | this.label4 = new System.Windows.Forms.Label(); 46 | this.imlHelp = new System.Windows.Forms.ImageList(this.components); 47 | this.label6 = new System.Windows.Forms.Label(); 48 | this.label7 = new System.Windows.Forms.Label(); 49 | this.btnUninstall = new System.Windows.Forms.Button(); 50 | this.chkAdvanced = new System.Windows.Forms.CheckBox(); 51 | this.label5 = new System.Windows.Forms.Label(); 52 | this.cmbStartup = new System.Windows.Forms.ComboBox(); 53 | this.label8 = new System.Windows.Forms.Label(); 54 | this.cmbAccount = new System.Windows.Forms.ComboBox(); 55 | this.label9 = new System.Windows.Forms.Label(); 56 | this.label10 = new System.Windows.Forms.Label(); 57 | this.label11 = new System.Windows.Forms.Label(); 58 | this.cmbPriority = new System.Windows.Forms.ComboBox(); 59 | this.txtLogin = new System.Windows.Forms.TextBox(); 60 | this.txtPassword = new System.Windows.Forms.TextBox(); 61 | this.btnSave = new System.Windows.Forms.Button(); 62 | this.tipHelp = new System.Windows.Forms.ToolTip(this.components); 63 | this.chkAutoRestart = new System.Windows.Forms.CheckBox(); 64 | this.label12 = new System.Windows.Forms.Label(); 65 | this.numMaxAutoDuration = new System.Windows.Forms.NumericUpDown(); 66 | this.cmbMaxAutoDuration = new System.Windows.Forms.ComboBox(); 67 | this.label15 = new System.Windows.Forms.Label(); 68 | this.numMaxAutoCount = new System.Windows.Forms.NumericUpDown(); 69 | ((System.ComponentModel.ISupportInitialize)(this.numMaxAutoDuration)).BeginInit(); 70 | ((System.ComponentModel.ISupportInitialize)(this.numMaxAutoCount)).BeginInit(); 71 | this.SuspendLayout(); 72 | // 73 | // label1 74 | // 75 | this.label1.AutoSize = true; 76 | this.label1.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 77 | this.label1.Location = new System.Drawing.Point(12, 16); 78 | this.label1.Name = "label1"; 79 | this.label1.Size = new System.Drawing.Size(133, 14); 80 | this.label1.TabIndex = 0; 81 | this.label1.Text = "Existing Configuration:"; 82 | // 83 | // btnCurrent 84 | // 85 | this.btnCurrent.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 86 | this.btnCurrent.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 87 | this.btnCurrent.Location = new System.Drawing.Point(599, 12); 88 | this.btnCurrent.Name = "btnCurrent"; 89 | this.btnCurrent.Size = new System.Drawing.Size(24, 23); 90 | this.btnCurrent.TabIndex = 1; 91 | this.btnCurrent.Text = "..."; 92 | this.btnCurrent.UseVisualStyleBackColor = true; 93 | this.btnCurrent.Click += new System.EventHandler(this.btnCurrent_Click); 94 | // 95 | // txtCurrent 96 | // 97 | this.txtCurrent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 98 | | System.Windows.Forms.AnchorStyles.Right))); 99 | this.txtCurrent.Location = new System.Drawing.Point(181, 12); 100 | this.txtCurrent.Name = "txtCurrent"; 101 | this.txtCurrent.Size = new System.Drawing.Size(412, 23); 102 | this.txtCurrent.TabIndex = 0; 103 | this.txtCurrent.TextChanged += new System.EventHandler(this.txtCurrent_TextChanged); 104 | // 105 | // btnNew 106 | // 107 | this.btnNew.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 108 | this.btnNew.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 109 | this.btnNew.Location = new System.Drawing.Point(599, 41); 110 | this.btnNew.Name = "btnNew"; 111 | this.btnNew.Size = new System.Drawing.Size(24, 23); 112 | this.btnNew.TabIndex = 3; 113 | this.btnNew.Text = "..."; 114 | this.btnNew.UseVisualStyleBackColor = true; 115 | this.btnNew.Click += new System.EventHandler(this.btnNew_Click); 116 | // 117 | // txtNew 118 | // 119 | this.txtNew.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 120 | | System.Windows.Forms.AnchorStyles.Right))); 121 | this.txtNew.Location = new System.Drawing.Point(181, 41); 122 | this.txtNew.Name = "txtNew"; 123 | this.txtNew.Size = new System.Drawing.Size(412, 23); 124 | this.txtNew.TabIndex = 2; 125 | this.txtNew.TextChanged += new System.EventHandler(this.txtNew_TextChanged); 126 | // 127 | // label2 128 | // 129 | this.label2.AutoSize = true; 130 | this.label2.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 131 | this.label2.Location = new System.Drawing.Point(12, 45); 132 | this.label2.Name = "label2"; 133 | this.label2.Size = new System.Drawing.Size(86, 14); 134 | this.label2.TabIndex = 0; 135 | this.label2.Text = "Configuration:"; 136 | // 137 | // label3 138 | // 139 | this.label3.AutoSize = true; 140 | this.label3.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 141 | this.label3.Location = new System.Drawing.Point(12, 74); 142 | this.label3.Name = "label3"; 143 | this.label3.Size = new System.Drawing.Size(125, 14); 144 | this.label3.TabIndex = 0; 145 | this.label3.Text = "Syncthing Executable:"; 146 | // 147 | // btnExecutable 148 | // 149 | this.btnExecutable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 150 | this.btnExecutable.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 151 | this.btnExecutable.Location = new System.Drawing.Point(599, 70); 152 | this.btnExecutable.Name = "btnExecutable"; 153 | this.btnExecutable.Size = new System.Drawing.Size(24, 23); 154 | this.btnExecutable.TabIndex = 5; 155 | this.btnExecutable.Text = "..."; 156 | this.btnExecutable.UseVisualStyleBackColor = true; 157 | this.btnExecutable.Click += new System.EventHandler(this.btnExecutable_Click); 158 | // 159 | // txtExecutable 160 | // 161 | this.txtExecutable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 162 | | System.Windows.Forms.AnchorStyles.Right))); 163 | this.txtExecutable.Location = new System.Drawing.Point(181, 70); 164 | this.txtExecutable.Name = "txtExecutable"; 165 | this.txtExecutable.Size = new System.Drawing.Size(412, 23); 166 | this.txtExecutable.TabIndex = 4; 167 | this.txtExecutable.TextChanged += new System.EventHandler(this.txtExecutable_TextChanged); 168 | // 169 | // btnInstall 170 | // 171 | this.btnInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 172 | this.btnInstall.Enabled = false; 173 | this.btnInstall.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 174 | this.btnInstall.Location = new System.Drawing.Point(474, 99); 175 | this.btnInstall.Name = "btnInstall"; 176 | this.btnInstall.Size = new System.Drawing.Size(149, 23); 177 | this.btnInstall.TabIndex = 8; 178 | this.btnInstall.Text = "Save and Install Service"; 179 | this.btnInstall.UseVisualStyleBackColor = true; 180 | this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click); 181 | // 182 | // dlgOpenFile 183 | // 184 | this.dlgOpenFile.DefaultExt = "exe"; 185 | this.dlgOpenFile.FileName = "syncthing.exe"; 186 | this.dlgOpenFile.Filter = "Executable|*.exe"; 187 | this.dlgOpenFile.Title = "Select the syncthing executable"; 188 | // 189 | // label4 190 | // 191 | this.label4.Image = ((System.Drawing.Image)(resources.GetObject("label4.Image"))); 192 | this.label4.Location = new System.Drawing.Point(151, 12); 193 | this.label4.Name = "label4"; 194 | this.label4.Size = new System.Drawing.Size(24, 23); 195 | this.label4.TabIndex = 9; 196 | this.tipHelp.SetToolTip(this.label4, "Path to directory where the current configuration used by syncthing is located. F" + 197 | "ill this information ONLY if you plan to move your configuration"); 198 | // 199 | // imlHelp 200 | // 201 | this.imlHelp.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; 202 | this.imlHelp.ImageSize = new System.Drawing.Size(23, 23); 203 | this.imlHelp.TransparentColor = System.Drawing.Color.Transparent; 204 | // 205 | // label6 206 | // 207 | this.label6.Image = ((System.Drawing.Image)(resources.GetObject("label6.Image"))); 208 | this.label6.Location = new System.Drawing.Point(151, 70); 209 | this.label6.Name = "label6"; 210 | this.label6.Size = new System.Drawing.Size(24, 23); 211 | this.label6.TabIndex = 9; 212 | this.tipHelp.SetToolTip(this.label6, "Path to the syncthing executable"); 213 | // 214 | // label7 215 | // 216 | this.label7.Image = ((System.Drawing.Image)(resources.GetObject("label7.Image"))); 217 | this.label7.Location = new System.Drawing.Point(151, 41); 218 | this.label7.Name = "label7"; 219 | this.label7.Size = new System.Drawing.Size(24, 23); 220 | this.label7.TabIndex = 9; 221 | this.tipHelp.SetToolTip(this.label7, "Path to the directory where the syncthing configuration will be copied to or wher" + 222 | "e the syncthing configuration already exist"); 223 | // 224 | // btnUninstall 225 | // 226 | this.btnUninstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 227 | this.btnUninstall.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 228 | this.btnUninstall.Location = new System.Drawing.Point(543, 159); 229 | this.btnUninstall.Name = "btnUninstall"; 230 | this.btnUninstall.Size = new System.Drawing.Size(80, 23); 231 | this.btnUninstall.TabIndex = 8; 232 | this.btnUninstall.Text = "Uninstall"; 233 | this.btnUninstall.UseVisualStyleBackColor = true; 234 | this.btnUninstall.Click += new System.EventHandler(this.btnUninstall_Click); 235 | // 236 | // chkAdvanced 237 | // 238 | this.chkAdvanced.Appearance = System.Windows.Forms.Appearance.Button; 239 | this.chkAdvanced.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold); 240 | this.chkAdvanced.Location = new System.Drawing.Point(354, 99); 241 | this.chkAdvanced.Name = "chkAdvanced"; 242 | this.chkAdvanced.Size = new System.Drawing.Size(114, 23); 243 | this.chkAdvanced.TabIndex = 10; 244 | this.chkAdvanced.Text = "Advanced Options"; 245 | this.chkAdvanced.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 246 | this.chkAdvanced.UseVisualStyleBackColor = true; 247 | this.chkAdvanced.CheckedChanged += new System.EventHandler(this.chkAdvanced_CheckedChanged); 248 | // 249 | // label5 250 | // 251 | this.label5.AutoSize = true; 252 | this.label5.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 253 | this.label5.Location = new System.Drawing.Point(12, 163); 254 | this.label5.Name = "label5"; 255 | this.label5.Size = new System.Drawing.Size(93, 14); 256 | this.label5.TabIndex = 0; 257 | this.label5.Text = "Service Startup:"; 258 | // 259 | // cmbStartup 260 | // 261 | this.cmbStartup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 262 | this.cmbStartup.FormattingEnabled = true; 263 | this.cmbStartup.Items.AddRange(new object[] { 264 | "Automatic (Delayed Start)", 265 | "Automatic", 266 | "Manual", 267 | "Disabled"}); 268 | this.cmbStartup.Location = new System.Drawing.Point(128, 159); 269 | this.cmbStartup.Name = "cmbStartup"; 270 | this.cmbStartup.Size = new System.Drawing.Size(190, 23); 271 | this.cmbStartup.TabIndex = 11; 272 | // 273 | // label8 274 | // 275 | this.label8.AutoSize = true; 276 | this.label8.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 277 | this.label8.Location = new System.Drawing.Point(12, 192); 278 | this.label8.Name = "label8"; 279 | this.label8.Size = new System.Drawing.Size(98, 14); 280 | this.label8.TabIndex = 0; 281 | this.label8.Text = "Service Account:"; 282 | // 283 | // cmbAccount 284 | // 285 | this.cmbAccount.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 286 | this.cmbAccount.FormattingEnabled = true; 287 | this.cmbAccount.Items.AddRange(new object[] { 288 | "Local System", 289 | "Local Service", 290 | "Network Service", 291 | "User"}); 292 | this.cmbAccount.Location = new System.Drawing.Point(128, 188); 293 | this.cmbAccount.Name = "cmbAccount"; 294 | this.cmbAccount.Size = new System.Drawing.Size(190, 23); 295 | this.cmbAccount.TabIndex = 11; 296 | this.cmbAccount.SelectedIndexChanged += new System.EventHandler(this.cmbAccount_SelectedIndexChanged); 297 | // 298 | // label9 299 | // 300 | this.label9.AutoSize = true; 301 | this.label9.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 302 | this.label9.Location = new System.Drawing.Point(324, 192); 303 | this.label9.Name = "label9"; 304 | this.label9.Size = new System.Drawing.Size(41, 14); 305 | this.label9.TabIndex = 0; 306 | this.label9.Text = "Login:"; 307 | // 308 | // label10 309 | // 310 | this.label10.AutoSize = true; 311 | this.label10.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 312 | this.label10.Location = new System.Drawing.Point(324, 221); 313 | this.label10.Name = "label10"; 314 | this.label10.Size = new System.Drawing.Size(65, 14); 315 | this.label10.TabIndex = 0; 316 | this.label10.Text = "Password:"; 317 | // 318 | // label11 319 | // 320 | this.label11.AutoSize = true; 321 | this.label11.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 322 | this.label11.Location = new System.Drawing.Point(12, 243); 323 | this.label11.Name = "label11"; 324 | this.label11.Size = new System.Drawing.Size(110, 14); 325 | this.label11.TabIndex = 0; 326 | this.label11.Text = "Syncthing Priority:"; 327 | // 328 | // cmbPriority 329 | // 330 | this.cmbPriority.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 331 | this.cmbPriority.FormattingEnabled = true; 332 | this.cmbPriority.Items.AddRange(new object[] { 333 | "Real Time", 334 | "High", 335 | "Above Normal", 336 | "Normal", 337 | "Below Normal", 338 | "Idle"}); 339 | this.cmbPriority.Location = new System.Drawing.Point(128, 239); 340 | this.cmbPriority.Name = "cmbPriority"; 341 | this.cmbPriority.Size = new System.Drawing.Size(190, 23); 342 | this.cmbPriority.TabIndex = 11; 343 | this.cmbPriority.SelectedIndexChanged += new System.EventHandler(this.cmbPriority_SelectedIndexChanged); 344 | // 345 | // txtLogin 346 | // 347 | this.txtLogin.Enabled = false; 348 | this.txtLogin.Location = new System.Drawing.Point(395, 188); 349 | this.txtLogin.Name = "txtLogin"; 350 | this.txtLogin.Size = new System.Drawing.Size(228, 23); 351 | this.txtLogin.TabIndex = 2; 352 | this.txtLogin.TextChanged += new System.EventHandler(this.txtNew_TextChanged); 353 | // 354 | // txtPassword 355 | // 356 | this.txtPassword.Enabled = false; 357 | this.txtPassword.Location = new System.Drawing.Point(395, 217); 358 | this.txtPassword.Name = "txtPassword"; 359 | this.txtPassword.Size = new System.Drawing.Size(228, 23); 360 | this.txtPassword.TabIndex = 2; 361 | this.txtPassword.TextChanged += new System.EventHandler(this.txtNew_TextChanged); 362 | // 363 | // btnSave 364 | // 365 | this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 366 | this.btnSave.Enabled = false; 367 | this.btnSave.Font = new System.Drawing.Font("Cambria", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 368 | this.btnSave.Location = new System.Drawing.Point(474, 99); 369 | this.btnSave.Name = "btnSave"; 370 | this.btnSave.Size = new System.Drawing.Size(149, 23); 371 | this.btnSave.TabIndex = 8; 372 | this.btnSave.Text = "Save Configuration"; 373 | this.btnSave.UseVisualStyleBackColor = true; 374 | this.btnSave.Visible = false; 375 | this.btnSave.Click += new System.EventHandler(this.btnSave_Click); 376 | // 377 | // tipHelp 378 | // 379 | this.tipHelp.AutomaticDelay = 0; 380 | this.tipHelp.AutoPopDelay = 0; 381 | this.tipHelp.InitialDelay = 25; 382 | this.tipHelp.IsBalloon = true; 383 | this.tipHelp.ReshowDelay = 0; 384 | this.tipHelp.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; 385 | // 386 | // chkAutoRestart 387 | // 388 | this.chkAutoRestart.AutoSize = true; 389 | this.chkAutoRestart.Location = new System.Drawing.Point(16, 101); 390 | this.chkAutoRestart.Name = "chkAutoRestart"; 391 | this.chkAutoRestart.Size = new System.Drawing.Size(147, 19); 392 | this.chkAutoRestart.TabIndex = 12; 393 | this.chkAutoRestart.Text = "Auto restart syncthing"; 394 | this.chkAutoRestart.UseVisualStyleBackColor = true; 395 | this.chkAutoRestart.CheckedChanged += new System.EventHandler(this.chkAutoRestart_CheckedChanged); 396 | // 397 | // label12 398 | // 399 | this.label12.AutoSize = true; 400 | this.label12.Location = new System.Drawing.Point(238, 130); 401 | this.label12.Name = "label12"; 402 | this.label12.Size = new System.Drawing.Size(175, 15); 403 | this.label12.TabIndex = 16; 404 | this.label12.Text = "shutdown occur in a period of "; 405 | // 406 | // numMaxAutoDuration 407 | // 408 | this.numMaxAutoDuration.Enabled = false; 409 | this.numMaxAutoDuration.Location = new System.Drawing.Point(419, 127); 410 | this.numMaxAutoDuration.Maximum = new decimal(new int[] { 411 | 240, 412 | 0, 413 | 0, 414 | 0}); 415 | this.numMaxAutoDuration.Name = "numMaxAutoDuration"; 416 | this.numMaxAutoDuration.Size = new System.Drawing.Size(45, 23); 417 | this.numMaxAutoDuration.TabIndex = 14; 418 | // 419 | // cmbMaxAutoDuration 420 | // 421 | this.cmbMaxAutoDuration.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 422 | this.cmbMaxAutoDuration.Enabled = false; 423 | this.cmbMaxAutoDuration.FormattingEnabled = true; 424 | this.cmbMaxAutoDuration.Items.AddRange(new object[] { 425 | "seconds", 426 | "minutes", 427 | "hours"}); 428 | this.cmbMaxAutoDuration.Location = new System.Drawing.Point(470, 127); 429 | this.cmbMaxAutoDuration.Name = "cmbMaxAutoDuration"; 430 | this.cmbMaxAutoDuration.Size = new System.Drawing.Size(86, 23); 431 | this.cmbMaxAutoDuration.TabIndex = 15; 432 | // 433 | // label15 434 | // 435 | this.label15.AutoSize = true; 436 | this.label15.Location = new System.Drawing.Point(13, 129); 437 | this.label15.Name = "label15"; 438 | this.label15.Size = new System.Drawing.Size(166, 15); 439 | this.label15.TabIndex = 16; 440 | this.label15.Text = "Stop the service if more than "; 441 | // 442 | // numMaxAutoCount 443 | // 444 | this.numMaxAutoCount.Enabled = false; 445 | this.numMaxAutoCount.Location = new System.Drawing.Point(185, 127); 446 | this.numMaxAutoCount.Maximum = new decimal(new int[] { 447 | 20, 448 | 0, 449 | 0, 450 | 0}); 451 | this.numMaxAutoCount.Name = "numMaxAutoCount"; 452 | this.numMaxAutoCount.Size = new System.Drawing.Size(47, 23); 453 | this.numMaxAutoCount.TabIndex = 13; 454 | // 455 | // frmInstall 456 | // 457 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 458 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 459 | this.ClientSize = new System.Drawing.Size(635, 155); 460 | this.Controls.Add(this.cmbMaxAutoDuration); 461 | this.Controls.Add(this.numMaxAutoDuration); 462 | this.Controls.Add(this.chkAutoRestart); 463 | this.Controls.Add(this.label15); 464 | this.Controls.Add(this.cmbPriority); 465 | this.Controls.Add(this.label12); 466 | this.Controls.Add(this.numMaxAutoCount); 467 | this.Controls.Add(this.cmbAccount); 468 | this.Controls.Add(this.cmbStartup); 469 | this.Controls.Add(this.chkAdvanced); 470 | this.Controls.Add(this.label6); 471 | this.Controls.Add(this.label7); 472 | this.Controls.Add(this.label4); 473 | this.Controls.Add(this.txtExecutable); 474 | this.Controls.Add(this.txtPassword); 475 | this.Controls.Add(this.txtLogin); 476 | this.Controls.Add(this.txtNew); 477 | this.Controls.Add(this.txtCurrent); 478 | this.Controls.Add(this.btnUninstall); 479 | this.Controls.Add(this.btnInstall); 480 | this.Controls.Add(this.btnExecutable); 481 | this.Controls.Add(this.btnNew); 482 | this.Controls.Add(this.label11); 483 | this.Controls.Add(this.label10); 484 | this.Controls.Add(this.label9); 485 | this.Controls.Add(this.label8); 486 | this.Controls.Add(this.label5); 487 | this.Controls.Add(this.label3); 488 | this.Controls.Add(this.btnCurrent); 489 | this.Controls.Add(this.label2); 490 | this.Controls.Add(this.label1); 491 | this.Controls.Add(this.btnSave); 492 | this.Font = new System.Drawing.Font("Calibri", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 493 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 494 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 495 | this.MaximizeBox = false; 496 | this.Name = "frmInstall"; 497 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 498 | this.Text = "Syncthing Service Configuration"; 499 | ((System.ComponentModel.ISupportInitialize)(this.numMaxAutoDuration)).EndInit(); 500 | ((System.ComponentModel.ISupportInitialize)(this.numMaxAutoCount)).EndInit(); 501 | this.ResumeLayout(false); 502 | this.PerformLayout(); 503 | 504 | } 505 | 506 | #endregion 507 | 508 | private System.Windows.Forms.Label label1; 509 | private System.Windows.Forms.Button btnCurrent; 510 | private System.Windows.Forms.TextBox txtCurrent; 511 | private System.Windows.Forms.Button btnNew; 512 | private System.Windows.Forms.TextBox txtNew; 513 | private System.Windows.Forms.Label label2; 514 | private System.Windows.Forms.Label label3; 515 | private System.Windows.Forms.Button btnExecutable; 516 | private System.Windows.Forms.TextBox txtExecutable; 517 | private System.Windows.Forms.Button btnInstall; 518 | private System.Windows.Forms.FolderBrowserDialog dlgSelectFolder; 519 | private System.Windows.Forms.OpenFileDialog dlgOpenFile; 520 | private System.Windows.Forms.Label label4; 521 | private System.Windows.Forms.ImageList imlHelp; 522 | private System.Windows.Forms.Label label6; 523 | private System.Windows.Forms.Label label7; 524 | private System.Windows.Forms.Button btnUninstall; 525 | private System.Windows.Forms.CheckBox chkAdvanced; 526 | private System.Windows.Forms.Label label5; 527 | private System.Windows.Forms.ComboBox cmbStartup; 528 | private System.Windows.Forms.Label label8; 529 | private System.Windows.Forms.ComboBox cmbAccount; 530 | private System.Windows.Forms.Label label9; 531 | private System.Windows.Forms.Label label10; 532 | private System.Windows.Forms.Label label11; 533 | private System.Windows.Forms.ComboBox cmbPriority; 534 | private System.Windows.Forms.TextBox txtLogin; 535 | private System.Windows.Forms.TextBox txtPassword; 536 | private System.Windows.Forms.Button btnSave; 537 | private System.Windows.Forms.ToolTip tipHelp; 538 | private System.Windows.Forms.CheckBox chkAutoRestart; 539 | private System.Windows.Forms.Label label12; 540 | private System.Windows.Forms.NumericUpDown numMaxAutoDuration; 541 | private System.Windows.Forms.ComboBox cmbMaxAutoDuration; 542 | private System.Windows.Forms.Label label15; 543 | private System.Windows.Forms.NumericUpDown numMaxAutoCount; 544 | } 545 | } --------------------------------------------------------------------------------