Statistics
| Branch: | Revision:

root / trunk / NetSparkle / NetSparkleDownloadProgress.cs @ 049333d2

History | View | Annotate | Download (6.6 kB)

1 46426dbd Panagiotis Kanavos
using System;
2 46426dbd Panagiotis Kanavos
using System.Collections.Generic;
3 46426dbd Panagiotis Kanavos
using System.ComponentModel;
4 46426dbd Panagiotis Kanavos
using System.Data;
5 46426dbd Panagiotis Kanavos
using System.Drawing;
6 46426dbd Panagiotis Kanavos
using System.Linq;
7 46426dbd Panagiotis Kanavos
using System.Text;
8 46426dbd Panagiotis Kanavos
using System.Windows.Forms;
9 46426dbd Panagiotis Kanavos
using System.Threading;
10 46426dbd Panagiotis Kanavos
using System.Net;
11 46426dbd Panagiotis Kanavos
using System.IO;
12 46426dbd Panagiotis Kanavos
using System.Diagnostics;
13 46426dbd Panagiotis Kanavos
using System.Reflection;
14 46426dbd Panagiotis Kanavos
15 46426dbd Panagiotis Kanavos
namespace AppLimit.NetSparkle
16 46426dbd Panagiotis Kanavos
{
17 46426dbd Panagiotis Kanavos
    public partial class NetSparkleDownloadProgress : Form
18 46426dbd Panagiotis Kanavos
    {
19 46426dbd Panagiotis Kanavos
        private String _tempName;
20 46426dbd Panagiotis Kanavos
        private NetSparkleAppCastItem _item;
21 46426dbd Panagiotis Kanavos
        private String _referencedAssembly;
22 46426dbd Panagiotis Kanavos
        private Sparkle _sparkle;
23 46426dbd Panagiotis Kanavos
        private Boolean _unattend;
24 46426dbd Panagiotis Kanavos
25 46426dbd Panagiotis Kanavos
        public NetSparkleDownloadProgress(Sparkle sparkle, NetSparkleAppCastItem item, String referencedAssembly, Image appIcon, Icon windowIcon, Boolean Unattend)
26 46426dbd Panagiotis Kanavos
        {
27 46426dbd Panagiotis Kanavos
            InitializeComponent();
28 46426dbd Panagiotis Kanavos
29 46426dbd Panagiotis Kanavos
            if (appIcon != null)
30 46426dbd Panagiotis Kanavos
                imgAppIcon.Image = appIcon;
31 46426dbd Panagiotis Kanavos
32 46426dbd Panagiotis Kanavos
            if (windowIcon != null)
33 46426dbd Panagiotis Kanavos
                Icon = windowIcon;
34 46426dbd Panagiotis Kanavos
35 46426dbd Panagiotis Kanavos
            // store the item
36 46426dbd Panagiotis Kanavos
            _sparkle = sparkle;
37 46426dbd Panagiotis Kanavos
            _item = item;
38 46426dbd Panagiotis Kanavos
            _referencedAssembly = referencedAssembly;
39 46426dbd Panagiotis Kanavos
            _unattend = Unattend;
40 46426dbd Panagiotis Kanavos
41 46426dbd Panagiotis Kanavos
            // init ui
42 46426dbd Panagiotis Kanavos
            btnInstallAndReLaunch.Visible = false;
43 46426dbd Panagiotis Kanavos
            lblHeader.Text = lblHeader.Text.Replace("APP", item.AppName + " " + item.Version);
44 46426dbd Panagiotis Kanavos
            progressDownload.Maximum = 100;
45 46426dbd Panagiotis Kanavos
            progressDownload.Minimum = 0;
46 46426dbd Panagiotis Kanavos
            progressDownload.Step = 1;
47 46426dbd Panagiotis Kanavos
48 46426dbd Panagiotis Kanavos
            // show the right 
49 46426dbd Panagiotis Kanavos
            Size = new Size(Size.Width, 107);
50 46426dbd Panagiotis Kanavos
            lblSecurityHint.Visible = false;                
51 46426dbd Panagiotis Kanavos
            
52 46426dbd Panagiotis Kanavos
            // get the filename of the download lin
53 46426dbd Panagiotis Kanavos
            String[] segments = item.DownloadLink.Split('/');
54 46426dbd Panagiotis Kanavos
            String fileName = segments[segments.Length - 1];
55 46426dbd Panagiotis Kanavos
56 46426dbd Panagiotis Kanavos
            // get temp path
57 46426dbd Panagiotis Kanavos
            _tempName = Environment.ExpandEnvironmentVariables("%temp%\\" + fileName);
58 46426dbd Panagiotis Kanavos
59 46426dbd Panagiotis Kanavos
            // start async download
60 46426dbd Panagiotis Kanavos
            WebClient Client = new WebClient();
61 46426dbd Panagiotis Kanavos
            Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Client_DownloadProgressChanged);
62 46426dbd Panagiotis Kanavos
            Client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted);
63 46426dbd Panagiotis Kanavos
64 46426dbd Panagiotis Kanavos
            Uri url = new Uri(item.DownloadLink);
65 46426dbd Panagiotis Kanavos
66 46426dbd Panagiotis Kanavos
            Client.DownloadFileAsync(url, _tempName);
67 46426dbd Panagiotis Kanavos
        }
68 46426dbd Panagiotis Kanavos
69 46426dbd Panagiotis Kanavos
        private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
70 46426dbd Panagiotis Kanavos
        {
71 46426dbd Panagiotis Kanavos
            progressDownload.Visible = false;
72 46426dbd Panagiotis Kanavos
            btnInstallAndReLaunch.Visible = true;            
73 46426dbd Panagiotis Kanavos
74 46426dbd Panagiotis Kanavos
            // report message            
75 46426dbd Panagiotis Kanavos
            _sparkle.ReportDiagnosticMessage("Finished downloading file to: " + _tempName);
76 46426dbd Panagiotis Kanavos
77 46426dbd Panagiotis Kanavos
            // check if we have a dsa signature in appcast            
78 46426dbd Panagiotis Kanavos
            if (_item.DSASignature == null || _item.DSASignature.Length == 0)
79 46426dbd Panagiotis Kanavos
            {
80 46426dbd Panagiotis Kanavos
                _sparkle.ReportDiagnosticMessage("No DSA check needed");
81 46426dbd Panagiotis Kanavos
            }
82 46426dbd Panagiotis Kanavos
            else
83 46426dbd Panagiotis Kanavos
            {
84 46426dbd Panagiotis Kanavos
                Boolean bDSAOk = false;
85 46426dbd Panagiotis Kanavos
86 46426dbd Panagiotis Kanavos
            // report
87 46426dbd Panagiotis Kanavos
            _sparkle.ReportDiagnosticMessage("Performing DSA check");
88 46426dbd Panagiotis Kanavos
89 46426dbd Panagiotis Kanavos
            // get the assembly
90 46426dbd Panagiotis Kanavos
            if (File.Exists(_tempName))
91 46426dbd Panagiotis Kanavos
            {
92 46426dbd Panagiotis Kanavos
                // check if the file was downloaded successfully
93 46426dbd Panagiotis Kanavos
                String absolutePath = Path.GetFullPath(_tempName);
94 46426dbd Panagiotis Kanavos
                if (!File.Exists(absolutePath))
95 46426dbd Panagiotis Kanavos
                    throw new FileNotFoundException();
96 46426dbd Panagiotis Kanavos
97 46426dbd Panagiotis Kanavos
                // get the assembly reference from which we start the update progress
98 46426dbd Panagiotis Kanavos
                // only from this trusted assembly the public key can be used
99 46426dbd Panagiotis Kanavos
                Assembly refassembly = System.Reflection.Assembly.GetEntryAssembly();
100 46426dbd Panagiotis Kanavos
                if (refassembly != null)
101 46426dbd Panagiotis Kanavos
                {
102 46426dbd Panagiotis Kanavos
                    // Check if we found the public key in our entry assembly
103 46426dbd Panagiotis Kanavos
                    if (NetSparkleDSAVerificator.ExistsPublicKey("NetSparkle_DSA.pub"))
104 46426dbd Panagiotis Kanavos
                    {
105 46426dbd Panagiotis Kanavos
                        // check the DSA Code and modify the back color            
106 46426dbd Panagiotis Kanavos
                        NetSparkleDSAVerificator dsaVerifier = new NetSparkleDSAVerificator("NetSparkle_DSA.pub");
107 46426dbd Panagiotis Kanavos
                        bDSAOk = dsaVerifier.VerifyDSASignature(_item.DSASignature, _tempName);
108 46426dbd Panagiotis Kanavos
                    }
109 46426dbd Panagiotis Kanavos
                }
110 46426dbd Panagiotis Kanavos
            }
111 46426dbd Panagiotis Kanavos
112 46426dbd Panagiotis Kanavos
                if (!bDSAOk)
113 46426dbd Panagiotis Kanavos
            {
114 46426dbd Panagiotis Kanavos
                Size = new Size(Size.Width, 137);
115 46426dbd Panagiotis Kanavos
                lblSecurityHint.Visible = true;
116 46426dbd Panagiotis Kanavos
                BackColor = Color.Tomato;
117 46426dbd Panagiotis Kanavos
        }
118 46426dbd Panagiotis Kanavos
            }
119 46426dbd Panagiotis Kanavos
               
120 46426dbd Panagiotis Kanavos
            // Check the unattended mode
121 46426dbd Panagiotis Kanavos
            if (_unattend)
122 46426dbd Panagiotis Kanavos
                btnInstallAndReLaunch_Click(null, null);
123 46426dbd Panagiotis Kanavos
        }
124 46426dbd Panagiotis Kanavos
               
125 46426dbd Panagiotis Kanavos
        private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
126 46426dbd Panagiotis Kanavos
        {
127 46426dbd Panagiotis Kanavos
            progressDownload.Value = e.ProgressPercentage;            
128 46426dbd Panagiotis Kanavos
        }
129 46426dbd Panagiotis Kanavos
130 46426dbd Panagiotis Kanavos
        private void btnInstallAndReLaunch_Click(object sender, EventArgs e)
131 46426dbd Panagiotis Kanavos
        {
132 46426dbd Panagiotis Kanavos
            // get the commandline 
133 46426dbd Panagiotis Kanavos
            String cmdLine = Environment.CommandLine;
134 46426dbd Panagiotis Kanavos
            String workingDir = Environment.CurrentDirectory;
135 46426dbd Panagiotis Kanavos
136 46426dbd Panagiotis Kanavos
            // generate the batch file path
137 46426dbd Panagiotis Kanavos
            String cmd = Environment.ExpandEnvironmentVariables("%temp%\\" + Guid.NewGuid() + ".cmd");
138 46426dbd Panagiotis Kanavos
            String installerCMD;
139 46426dbd Panagiotis Kanavos
140 46426dbd Panagiotis Kanavos
            // get the file type
141 46426dbd Panagiotis Kanavos
            if (Path.GetExtension(_tempName).ToLower().Equals(".exe"))
142 46426dbd Panagiotis Kanavos
            {
143 46426dbd Panagiotis Kanavos
                // build the command line 
144 46426dbd Panagiotis Kanavos
                installerCMD = _tempName;
145 46426dbd Panagiotis Kanavos
            }
146 46426dbd Panagiotis Kanavos
            else if (Path.GetExtension(_tempName).ToLower().Equals(".msi"))
147 46426dbd Panagiotis Kanavos
            {                
148 46426dbd Panagiotis Kanavos
                // buid the command line
149 46426dbd Panagiotis Kanavos
                installerCMD = "msiexec /i \"" + _tempName + "\"";                
150 46426dbd Panagiotis Kanavos
            }
151 46426dbd Panagiotis Kanavos
            else
152 46426dbd Panagiotis Kanavos
            {
153 46426dbd Panagiotis Kanavos
                MessageBox.Show("Updater not supported, please execute " + _tempName + " manually", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
154 46426dbd Panagiotis Kanavos
                Environment.Exit(-1);
155 46426dbd Panagiotis Kanavos
                return;
156 46426dbd Panagiotis Kanavos
            }
157 46426dbd Panagiotis Kanavos
158 46426dbd Panagiotis Kanavos
            // generate the batch file                
159 46426dbd Panagiotis Kanavos
            _sparkle.ReportDiagnosticMessage("Generating MSI batch in " + Path.GetFullPath(cmd));
160 46426dbd Panagiotis Kanavos
161 46426dbd Panagiotis Kanavos
            StreamWriter write = new StreamWriter(cmd);
162 46426dbd Panagiotis Kanavos
            write.WriteLine(installerCMD);
163 46426dbd Panagiotis Kanavos
            write.WriteLine("cd " + workingDir);
164 46426dbd Panagiotis Kanavos
            write.WriteLine(cmdLine);
165 46426dbd Panagiotis Kanavos
            write.Close();
166 46426dbd Panagiotis Kanavos
167 46426dbd Panagiotis Kanavos
            // report
168 46426dbd Panagiotis Kanavos
            _sparkle.ReportDiagnosticMessage("Going to execute batch: " + cmd);
169 46426dbd Panagiotis Kanavos
170 46426dbd Panagiotis Kanavos
            // start the installer helper
171 46426dbd Panagiotis Kanavos
            Process process = new Process();
172 46426dbd Panagiotis Kanavos
            process.StartInfo.FileName = cmd;
173 46426dbd Panagiotis Kanavos
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
174 46426dbd Panagiotis Kanavos
            process.Start();
175 46426dbd Panagiotis Kanavos
            
176 46426dbd Panagiotis Kanavos
177 46426dbd Panagiotis Kanavos
            // quit the app
178 46426dbd Panagiotis Kanavos
            Environment.Exit(0);
179 46426dbd Panagiotis Kanavos
        }
180 46426dbd Panagiotis Kanavos
    }
181 46426dbd Panagiotis Kanavos
}