// -----------------------------------------------------------------------
using System.ComponentModel.Composition;
+using System.IO;
+using System.Net;
+using System.Reflection;
+using System.Windows;
using Caliburn.Micro;
+using Pithos.Client.WPF.Properties;
namespace Pithos.Client.WPF.Shell
{
/// </summary>
[Export(typeof(FeedbackViewModel))]
public class FeedbackViewModel:Screen
- {
-
+ {
public string Message { get; set; }
public string Data { get; set; }
+ private IWindowManager _windowManager;
+
+ private static readonly log4net.ILog Log = log4net.LogManager.GetLogger("Pithos");
+
+
+ [ImportingConstructor]
+ public FeedbackViewModel(IWindowManager windowManager)
+ {
+ _windowManager = windowManager;
+ Data = GetBasicData() ;
+ }
+
+ public void AppendData(string data)
+ {
+ Data = Data + "\r\n" + data;
+ }
+
+ private string GetBasicData()
+ {
+ var assembly = Assembly.GetExecutingAssembly();
+ var attributes = assembly.GetCustomAttributes(false);
+ var versionAtt = attributes.OfType<AssemblyInformationalVersionAttribute>().First();
+ var fileVersion = attributes.OfType<AssemblyFileVersionAttribute>().First();
+
- public bool CanSend{get { return (!String.IsNullOrWhiteSpace(Message)); }}
+ var builder = new StringBuilder();
+
+ builder.AppendLine("Pithos Windows Client")
+ .Append('-', 30)
+ .AppendLine()
+ .AppendFormat("Released: {0}\r\n", versionAtt.InformationalVersion)
+ .AppendFormat("File Version: {0}\r\n", fileVersion.Version)
+ .AppendFormat("Assembly Version: {0}\r\n", assembly.GetName().Version)
+ .AppendFormat("OS: {0} 64Bit: {1}\r\n",Environment.OSVersion,Environment.Is64BitOperatingSystem)
+ .AppendFormat("Wokring Set: {0} bytes\r\n", Environment.WorkingSet)
+ .AppendFormat("Processors: {0} \r\n", Environment.ProcessorCount)
+ .Append('=', 30)
+ .AppendLine();
+ var basicData = builder.ToString();
+ return basicData;
+ }
+
public void Send()
{
+ var message = "Pithos Windows Client Feedback:\r\n" +Message;
+ var fields = new Dictionary<string, string> { { "feedback-msg", message }, { "feedback-data", Data } };
+ try
+ {
+ PostForm(Settings.Default.FeedbackUri, fields);
+ }
+ catch (Exception exc)
+ {
+ Log.Error("Failed to submit feedback",exc);
+ MessageBox.Show("There was an error while submitting your feedback. The error was logged", "Failed to submit feedback",
+ MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+
+ TryClose();
+ }
+
+ private async void PostForm(string formUrl, Dictionary<string, string> fields)
+ {
+ var request = WebRequest.Create(formUrl);
+ request.Method = "POST";
+
+ var builder = new StringBuilder();
+ foreach (var field in fields)
+ {
+ builder.AppendFormat("{0}={1}&", field.Key, Uri.EscapeDataString(field.Value));
+ }
+
+ var postData = builder.ToString().TrimEnd('&');
+ var byteArray = Encoding.UTF8.GetBytes(postData);
+
+ request.ContentType = "application/x-www-form-urlencoded";
+ request.ContentLength = byteArray.Length;
+ using (var stream = request.GetRequestStream())
+ {
+ stream.Write(byteArray, 0, byteArray.Length);
+ }
+
+ // Get the response.
+ var response = await request.GetResponseAsync();
+
+
+ var webResponse = ((HttpWebResponse)response);
+ var result=webResponse.StatusCode;
+ if (result != HttpStatusCode.OK)
+ {
+ // Get the stream containing content returned by the server.
+ using (var responseStream = webResponse.GetResponseStream())
+ using (var reader = new StreamReader(responseStream))
+ {
+ var responseFromServer = reader.ReadToEnd();
+ Log.WarnFormat("Unexpected status returned from feedback form: {0} - {1}\r\n{2}",result,webResponse.StatusDescription, responseFromServer);
+ }
+ }
+ response.Close();
}
}
}