1
////////////////////////////////////////////////////////////////////////////////
2
// Copyright (c) CitizenLab, 2006. All Rights Reserved.
3
// The latest version of this code is available at http://psiphon.civisec.org/
5
// This software is open source; you can redistribute it and/or modify it
6
// under the terms of the GNU General Public License as published by the
7
// Free Software Foundation; either version 2 of the License, or (at your
8
// option) any later version.
10
// This program is distributed WITHOUT ANY WARRANTY; without even the
11
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
// See the GNU General Public License for more details at:
13
// http://psiphon.civisec.org/
15
// This General Public License does NOT permit incorporating this software
16
// into proprietary programs.
17
////////////////////////////////////////////////////////////////////////////////
20
#include "resources.h"
21
#include "UpdateDlg.h"
23
#include "DownloadFile.h"
29
wxString wxUpdateDlg::GetUpdateFileName(const wxString& sVersion)
31
return wxString::Format(_T("psiphon-%s.msi"), sVersion.c_str());
34
wxString wxUpdateDlg::GetUpdatePath(const wxString& sVersion)
36
return wxString::Format(_T("http://psiphon.ca/download/%s"), GetUpdateFileName(sVersion).c_str());
39
bool wxUpdateDlg::CheckForUpdates(wxWindow* parent, bool bShowNoUpdates)
43
wxString sLatestVersion = GetLatestVersion();
44
wxString sCurrentVersion = PSIPHON_VERSION;
46
if(sLatestVersion == _T(""))
49
if(sLatestVersion > sCurrentVersion)
51
wxUpdateDlg dlg(sLatestVersion, sCurrentVersion, parent);
54
nRes = dlg.ShowModal();
59
wxString sFile = GetUpdateFileName(sLatestVersion);
60
::ShellExecute(NULL, _T("open"), sFile, NULL, NULL, SW_SHOWNORMAL);
65
else if(bShowNoUpdates)
67
wxString sMess = wxString::Format(_("Your software is up to date."));
68
wxMessageBox(sMess, _("Checking for updates"));
74
IMPLEMENT_DYNAMIC_CLASS(wxUpdateDlg, wxDialog)
78
IDC_GET_UPDATE = 10001,
83
wxUpdateDlg::wxUpdateDlg()
87
wxUpdateDlg::wxUpdateDlg(const wxString& _sLatestVersion, const wxString& _sCurrentVersion, wxWindow* parent)
89
m_sLatestVersion = _sLatestVersion;
90
m_sCurrentVersion = _sCurrentVersion;
92
m_sFile = GetUpdateFileName(m_sLatestVersion);
93
m_sPath = GetUpdatePath(m_sLatestVersion);
95
m_pDownloadFile = NULL;
96
m_bDownloading = false;
101
wxUpdateDlg::~wxUpdateDlg()
105
bool wxUpdateDlg::Create(wxWindow* parent)
107
SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
108
wxDialog::Create(parent, IDD_UPDATE, _("Checking for updates"), wxDefaultPosition, wxSize(400, 300), wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX|wxDIALOG_MODAL);
114
GetSizer()->SetSizeHints(this);
123
void wxUpdateDlg::CreateControls()
125
wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
126
SetSizer(itemBoxSizer2);
128
wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
129
itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
131
wxString sMess = wxString::Format(_("Newer version of psiphon is available.\n"
132
"Would you like to download it?"));
134
m_stMessage = new wxStaticText(this, IDC_MESSAGE, sMess, wxDefaultPosition, wxDefaultSize, 0);
135
itemBoxSizer3->Add(m_stMessage, 0, wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
137
wxSize mine = wxDefaultSize;
141
m_Progress = new wxGauge(this, IDC_PROGRESS, 100, wxDefaultPosition, mine);
142
itemBoxSizer3->Add(m_Progress, 0, wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
144
wxBoxSizer* itemBoxSizerButtons = new wxBoxSizer(wxHORIZONTAL);
145
itemBoxSizer3->Add(itemBoxSizerButtons, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
147
m_btnGetUpdate = new wxButton(this, IDC_GET_UPDATE, _("&Get update"), wxDefaultPosition, wxDefaultSize, 0);
148
m_btnGetUpdate->SetDefault();
149
itemBoxSizerButtons->Add(m_btnGetUpdate, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
151
wxButton* itemButton18 = new wxButton(this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0);
152
itemBoxSizerButtons->Add(itemButton18, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
156
void wxUpdateDlg::CreateControls()
158
wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
159
SetSizer(itemBoxSizer2);
161
wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
162
itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
164
wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxVERTICAL);
165
itemBoxSizer3->Add(itemBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
168
wxString sMess = wxString::Format(
169
_("Checking if a newer version of psiphon is available...\n\n"
170
"Your current version is %s\n"
171
"Latest version is %s."), m_sCurrentVersion.c_str(), m_sLatestVersion.c_str());
173
wxStaticText* itemStaticText11 = new wxStaticText(this, wxID_STATIC, sMess, wxDefaultPosition, wxDefaultSize, 0);
174
itemBoxSizer4->Add(itemStaticText11, 0, wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
176
wxBoxSizer* itemBoxSizerLink = new wxBoxSizer(wxHORIZONTAL);
177
itemBoxSizer4->Add(itemBoxSizerLink, 0, wxALIGN_LEFT | wxALL, 5);
179
wxStaticText* itemStaticText12 = new wxStaticText(this, wxID_STATIC, _("Please go to"), wxDefaultPosition, wxDefaultSize, 0);
180
itemBoxSizerLink->Add(itemStaticText12, 0, wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
182
wxString sLink = _T("http://psiphon.civisec.org/");
183
wxHyperlinkCtrl* pHyperlink = new wxHyperlinkCtrl(this, wxID_STATIC, sLink, sLink, wxDefaultPosition, wxDefaultSize, wxHL_CONTEXTMENU | wxNO_BORDER | wxHL_ALIGN_LEFT);
184
itemBoxSizerLink->Add(pHyperlink, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
186
wxStaticText* itemStaticText13 = new wxStaticText(this, wxID_STATIC, _("to download the current version."), wxDefaultPosition, wxDefaultSize, 0);
187
itemBoxSizer4->Add(itemStaticText13, 0, wxALIGN_CENTER_VERTICAL | wxALL | wxADJUST_MINSIZE, 5);
189
wxButton* itemButton17 = new wxButton(this, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0);
190
itemButton17->SetDefault();
191
itemBoxSizer3->Add(itemButton17, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
195
BEGIN_EVENT_TABLE(wxUpdateDlg, wxDialog)
196
EVT_BUTTON(IDC_GET_UPDATE, wxUpdateDlg::OnGetUpdate)
197
EVT_BUTTON(wxID_CANCEL, wxUpdateDlg::OnCancel)
198
EVT_DOWNLOAD(wxUpdateDlg::OnDownloadEvent)
201
void wxUpdateDlg::OnGetUpdate(wxCommandEvent&)
203
m_btnGetUpdate->Enable(false);
205
wxRemoveFile(m_sFile);
207
m_pDownloadFile = new wxDownloadFile(this, m_sPath, m_sFile, true, 1024*100);
212
sMessage = wxString::Format(_("downloading '%s'..."), m_sFile.c_str());
213
m_bDownloading = true;
217
sMessage = wxString::Format(_("downloading '%s' failed."), m_sFile.c_str());
218
m_bDownloading = false;
219
m_btnGetUpdate->Enable(true);
222
m_stMessage->SetLabel(sMessage);
226
void wxUpdateDlg::OnCancel(wxCommandEvent&)
228
if(m_pDownloadFile && m_bDownloading)
230
m_bDownloading = false;
231
m_pDownloadFile->CancelDownload();
235
EndModal(wxID_CANCEL);
239
void wxUpdateDlg::OnDownloadEvent(wxDownloadEvent &event)
241
if(event.GetDownLoadStatus() == DOWNLOAD_COMPLETE)
243
m_bDownloading = false;
248
if(event.GetDownLoadStatus() == DOWNLOAD_CANCELLED)
250
wxRemoveFile(m_sFile);
251
m_bDownloading = false;
252
EndModal(wxID_CANCEL);
258
if(event.GetDownLoadStatus() == DOWNLOAD_FAIL)
260
wxRemoveFile(m_sFile);
261
m_bDownloading = false;
262
m_btnGetUpdate->Enable(true);
263
sMessage = wxString::Format(_("downloading '%s' failed."));
266
if(event.GetDownLoadStatus() == DOWNLOAD_INPROGRESS)
268
wxInt64 nFileSize = event.GetFileSize();
269
wxInt64 nDownloaded = event.GetDownLoadedBytesCount();
273
int percent = nDownloaded*100/nFileSize;
274
m_Progress->SetValue(percent);
276
double nFileSizeMB = nFileSize/(1024.0*1024.0);
277
double nDownloadedMB = nDownloaded/(1024.0*1024.0);
279
sMessage = wxString::Format(_("downloading '%s'...\n%.1f of %.1f MB."), m_sFile.c_str(), nDownloadedMB, nFileSizeMB);
283
int percent = m_Progress->GetValue();
285
m_Progress->SetValue(percent%100);
286
sMessage = wxString::Format(_("downloading '%s'..."), m_sFile.c_str());
290
m_stMessage->SetLabel(sMessage);