Completed feedback form
[pithos-ms-client] / trunk / Pithos.Client.WPF / Shell / FeedbackViewModel.cs
index ed8379c..94c980e 100644 (file)
@@ -5,7 +5,12 @@
 // -----------------------------------------------------------------------
 
 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
 {
@@ -19,18 +24,111 @@ 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();
         }
     }
 }