Completed feedback form
[pithos-ms-client] / trunk / Pithos.Client.WPF / Shell / FeedbackViewModel.cs
1 // -----------------------------------------------------------------------
2 // <copyright file="FeedbackViewModel.cs" company="Microsoft">
3 // TODO: Update copyright text.
4 // </copyright>
5 // -----------------------------------------------------------------------
6
7 using System.ComponentModel.Composition;
8 using System.IO;
9 using System.Net;
10 using System.Reflection;
11 using System.Windows;
12 using Caliburn.Micro;
13 using Pithos.Client.WPF.Properties;
14
15 namespace Pithos.Client.WPF.Shell
16 {
17     using System;
18     using System.Collections.Generic;
19     using System.Linq;
20     using System.Text;
21
22     /// <summary>
23     /// TODO: Update summary.
24     /// </summary>
25     [Export(typeof(FeedbackViewModel))]
26     public class FeedbackViewModel:Screen
27     {        
28         public string Message { get; set; }
29
30         public string Data { get; set; }
31
32         private IWindowManager _windowManager;
33
34         private static readonly log4net.ILog Log = log4net.LogManager.GetLogger("Pithos");
35
36
37         [ImportingConstructor]
38         public FeedbackViewModel(IWindowManager windowManager)
39         {
40             _windowManager = windowManager;
41             Data = GetBasicData() ;
42         }
43
44         public void AppendData(string data)
45         {
46             Data = Data + "\r\n" + data;
47         }
48
49         private string GetBasicData()
50         {
51             var assembly = Assembly.GetExecutingAssembly();
52             var attributes = assembly.GetCustomAttributes(false);
53             var versionAtt = attributes.OfType<AssemblyInformationalVersionAttribute>().First();
54             var fileVersion = attributes.OfType<AssemblyFileVersionAttribute>().First();
55
56
57             var builder = new StringBuilder();
58             
59             builder.AppendLine("Pithos Windows Client")
60                 .Append('-', 30)
61                 .AppendLine()
62                 .AppendFormat("Released: {0}\r\n", versionAtt.InformationalVersion)
63                 .AppendFormat("File Version: {0}\r\n", fileVersion.Version)
64                 .AppendFormat("Assembly Version: {0}\r\n", assembly.GetName().Version)
65                 .AppendFormat("OS: {0} 64Bit: {1}\r\n",Environment.OSVersion,Environment.Is64BitOperatingSystem)
66                 .AppendFormat("Wokring Set: {0} bytes\r\n", Environment.WorkingSet)
67                 .AppendFormat("Processors: {0} \r\n", Environment.ProcessorCount)                
68                 .Append('=', 30)
69                 .AppendLine();
70             var basicData = builder.ToString();
71             return basicData;
72
73         }
74         
75         public void Send()
76         {
77             var message = "Pithos Windows Client Feedback:\r\n" +Message;
78             var fields = new Dictionary<string, string> { { "feedback-msg", message }, { "feedback-data", Data } };
79             try
80             {
81                 PostForm(Settings.Default.FeedbackUri, fields);
82             }
83             catch (Exception exc)
84             {
85                 Log.Error("Failed to submit feedback",exc);
86                 MessageBox.Show("There was an error while submitting your feedback. The error was logged", "Failed to submit feedback",
87                                 MessageBoxButton.OK, MessageBoxImage.Error);
88             }
89             
90             TryClose();
91         }
92
93         private async void PostForm(string formUrl, Dictionary<string, string> fields)
94         {
95             var request = WebRequest.Create(formUrl);
96             request.Method = "POST";
97
98             var builder = new StringBuilder();
99             foreach (var field in fields)
100             {
101                 builder.AppendFormat("{0}={1}&", field.Key, Uri.EscapeDataString(field.Value));
102             }
103
104             var postData = builder.ToString().TrimEnd('&');
105             var byteArray = Encoding.UTF8.GetBytes(postData);
106
107             request.ContentType = "application/x-www-form-urlencoded";
108             request.ContentLength = byteArray.Length;
109             using (var stream = request.GetRequestStream())
110             {
111                 stream.Write(byteArray, 0, byteArray.Length);
112             }
113             
114
115             // Get the response.
116             var response = await request.GetResponseAsync();
117
118
119             var webResponse = ((HttpWebResponse)response);
120             var result=webResponse.StatusCode;
121             if (result != HttpStatusCode.OK)
122             {
123                 // Get the stream containing content returned by the server.
124                 using (var responseStream = webResponse.GetResponseStream())
125                 using (var reader = new StreamReader(responseStream))
126                 {
127                     var responseFromServer = reader.ReadToEnd();
128                     Log.WarnFormat("Unexpected status returned from feedback form: {0} - {1}\r\n{2}",result,webResponse.StatusDescription, responseFromServer);                    
129                 }
130             }
131             response.Close();
132         }
133     }
134 }