Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Shell / FeedbackViewModel.cs @ 2c27cdd0

History | View | Annotate | Download (4.8 kB)

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
}