Files
JenkinsStatusWindow/WindowSource.cs
2017-02-01 11:50:47 -05:00

180 lines
5.7 KiB
C#

using CredentialManagement;
using FloatingStatusWindowLibrary;
using JenkinsStatusWindow.Properties;
using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Threading;
namespace JenkinsStatusWindow
{
public class TextResult
{
public StringBuilder WindowText { get; set; } = new StringBuilder();
public StringBuilder TooltipText { get; set; } = new StringBuilder();
}
public class WindowSource : IWindowSource, IDisposable
{
private readonly FloatingStatusWindow _floatingStatusWindow;
private readonly Timer _refreshTimer;
private readonly Dispatcher _dispatcher;
private readonly JenkinsProjects _jenkinsProjects;
internal WindowSource()
{
_dispatcher = Dispatcher.CurrentDispatcher;
_floatingStatusWindow = new FloatingStatusWindow(this);
_floatingStatusWindow.SetText(Resources.Loading);
_jenkinsProjects = JenkinsProjects.Load();
_refreshTimer = new Timer(60000) { AutoReset = false };
_refreshTimer.Elapsed += HandleTimerElapsed;
Task.Factory.StartNew(UpdateText);
}
public void Dispose()
{
_refreshTimer.Dispose();
_floatingStatusWindow.Save();
_floatingStatusWindow.Dispose();
}
public string Name => Resources.Name;
public Icon Icon => Resources.ApplicationIcon;
public string WindowSettings
{
get
{
return Settings.Default.WindowSettings;
}
set
{
Settings.Default.WindowSettings = value;
Settings.Default.Save();
}
}
private void HandleTimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
UpdateText();
}
private void UpdateText()
{
try
{
var textResult = GetText();
// Update the window on the main thread
_dispatcher.Invoke(() =>
{
_floatingStatusWindow.SetText(textResult.WindowText.ToString());
_floatingStatusWindow.IconToolTipText = textResult.TooltipText.ToString();
});
}
catch (Exception exception)
{
_dispatcher.Invoke(() =>
{
_floatingStatusWindow.SetText(exception.Message);
_floatingStatusWindow.IconToolTipText = exception.Message;
});
}
finally
{
_refreshTimer.Start();
}
}
private TextResult GetText()
{
var textResult = new TextResult();
if (_jenkinsProjects.Count == 0)
return textResult;
textResult.WindowText.AppendLine(Resources.LastBuildNumberHeader);
foreach (var jenkinsProject in _jenkinsProjects)
{
if (textResult.WindowText.Length > 0)
textResult.WindowText.AppendLine();
if (textResult.TooltipText.Length > 0)
textResult.TooltipText.AppendLine();
var buildNumberUrl = string.Format(Settings.Default.JenkinsUrlTemplate, jenkinsProject.Url);
var buildNumberUri = new Uri(buildNumberUrl);
var credential = new Credential
{
Target = buildNumberUri.Host,
PersistanceType = PersistanceType.Enterprise,
Type = CredentialType.Generic
};
credential.Load();
var httpWebRequest = (HttpWebRequest)WebRequest.Create(buildNumberUrl);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
var credentialBuffer = new UTF8Encoding().GetBytes(credential.Username + ":" + credential.Password);
httpWebRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
httpWebRequest.PreAuthenticate = true;
try
{
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
var stream = httpResponse.GetResponseStream();
if (stream == null)
continue;
string lastBuildNumber;
using (var streamReader = new StreamReader(stream))
lastBuildNumber = streamReader.ReadToEnd();
textResult.WindowText.AppendFormat(Resources.LastBuildNumberWindowTemplate, jenkinsProject.Name, lastBuildNumber);
textResult.TooltipText.AppendFormat(Resources.LastBuildNumberTooltipTemplate, jenkinsProject.Name, lastBuildNumber);
}
catch (WebException excp)
{
var stream = excp.Response.GetResponseStream();
if (stream == null)
continue;
using (var streamReader = new StreamReader(stream))
{
var errorText = streamReader.ReadToEnd();
textResult.WindowText.AppendFormat(Resources.LastBuildNumberWindowTemplate, jenkinsProject.Name, errorText);
textResult.TooltipText.AppendFormat(Resources.LastBuildNumberTooltipTemplate, jenkinsProject.Name, errorText);
}
}
}
return textResult;
}
}
}