From 85ca326bc96b6f4488fb71783cd0efd4ba8f400d Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sun, 7 Jan 2007 23:03:05 +0000 Subject: [PATCH] Ops, forgot to commit the new files. Originally committed to SVN as r737. --- aegisub/dialog_version_check.cpp | 295 +++++++++++++++++++++++++++++++ aegisub/dialog_version_check.h | 93 ++++++++++ 2 files changed, 388 insertions(+) create mode 100644 aegisub/dialog_version_check.cpp create mode 100644 aegisub/dialog_version_check.h diff --git a/aegisub/dialog_version_check.cpp b/aegisub/dialog_version_check.cpp new file mode 100644 index 000000000..f5820b49c --- /dev/null +++ b/aegisub/dialog_version_check.cpp @@ -0,0 +1,295 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +/////////// +// Headers +#include +#include +#include +#include +#include +#include "dialog_version_check.h" +#include "version.h" +#include "main.h" + + +////////// +// Static +bool DialogVersionCheck::dialogRunning = false; + + +/////////////// +// Constructor +DialogVersionCheck::DialogVersionCheck(wxWindow *parent,bool hidden) +: wxDialog(parent,-1,_("Version Checker"),wxDefaultPosition,wxDefaultSize,wxDEFAULT_DIALOG_STYLE) +{ + // Is already running? + if (dialogRunning) { + Destroy(); + return; + } + dialogRunning = true; + + // Controls + wxSizer *controlSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Log")); + logBox = new wxTextCtrl(this,Log_Box,_T(""),wxDefaultPosition,wxSize(400,150),wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH | wxTE_AUTO_URL); + controlSizer->Add(logBox,1,wxEXPAND,0); + + // Buttons + wxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL); + buttonSizer->AddStretchSpacer(1); + buttonSizer->Add(new wxButton(this,wxID_OK),0,0,0); + + // Sizer + wxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); + mainSizer->Add(controlSizer,1,wxEXPAND | wxALL,5); + mainSizer->Add(buttonSizer,0,wxEXPAND | wxALL,5); + mainSizer->SetSizeHints(this); + SetSizer(mainSizer); + + // Show + visible = false; + if (!hidden) { + Show(); + visible = true; + } + + // Check version + CheckVersion(); +} + + +////////////// +// Destructor +DialogVersionCheck::~DialogVersionCheck() { + dialogRunning = false; +} + + +///////////////// +// Check Version +void DialogVersionCheck::CheckVersion() { + if (!wxFileSystem::HasHandlerForPath(_T("http://www.aegisub.net/"))) wxFileSystem::AddHandler(new wxInternetFSHandler); + thread = new VersionCheckThread(this); + thread->Create(); + thread->Run(); +} + + +/////////////// +// Event table +BEGIN_EVENT_TABLE(DialogVersionCheck,wxDialog) + EVT_BUTTON (wxID_OK, DialogVersionCheck::OnOK) + EVT_CLOSE (DialogVersionCheck::OnClose) + EVT_TEXT_URL(Log_Box,DialogVersionCheck::OnURL) +END_EVENT_TABLE() + + +//////////// +// On close +void DialogVersionCheck::OnClose(wxCloseEvent &event) { + dialogRunning = false; + if (thread) thread->alive = false; + Destroy(); +} +void DialogVersionCheck::OnOK(wxCommandEvent &event) { + dialogRunning = false; + if (thread) thread->alive = false; + Destroy(); +} + + +//////////////// +// On Click URL +void DialogVersionCheck::OnURL(wxTextUrlEvent &event) { + wxMouseEvent mEvent = event.GetMouseEvent(); + if (mEvent.LeftDown()) { + wxString url = logBox->GetValue().Mid(event.GetURLStart(),event.GetURLEnd()-event.GetURLStart()+1); + AegisubApp::OpenURL(url); + } +} + + +///////////////////////////// +// Worker thread constructor +VersionCheckThread::VersionCheckThread(DialogVersionCheck *par) +: wxThread(wxTHREAD_DETACHED) +{ + parent = par; + alive = true; +} + + +///////////////// +// Worker thread +wxThread::ExitCode VersionCheckThread::Entry() { + // List of paths + wxArrayString paths; + paths.Add(_T("http://aegisub.cellosoft.com/latest.txt")); + paths.Add(_T("http://www.malakith.net/amz/aegisub/latest.txt")); + wxFSFile *fp = NULL; + + // Try each path until it finds one that works + for (unsigned int i=0;ilogBox->AppendText(_("Could not open Internet File system. Aborting.\n")); + goto endThread; + } + wxMutexGuiLeave(); + + // Open file +#ifdef __WXDEBUG__ + wxMutexGuiEnter(); + if (!alive) goto endThread; + parent->logBox->AppendText(_("Attempting to open \"") + path + _T("\"... ")); + wxMutexGuiLeave(); +#endif + wxFileSystem fs; + fp = fs.OpenFile(path); + + // Failed? + if (!fp) { +#ifdef __WXDEBUG__ + wxMutexGuiEnter(); + if (!alive) goto endThread; + parent->logBox->AppendText(_("Failed.\n")); + wxMutexGuiLeave(); +#endif + continue; + } + + // OK +#ifdef __WXDEBUG__ + wxMutexGuiEnter(); + if (!alive) goto endThread; + parent->logBox->AppendText(_("OK.\n")); + wxMutexGuiLeave(); +#endif + + // Get text input stream + wxInputStream *fstream = fp->GetStream(); + wxTextInputStream text(*fstream); + wxString contents; + + // What kind of version is this? + wxString versionKind; + double versionN; + int svnRev = GetSVNRevision(); + wxString temp = GetVersionNumber(); + temp.ToDouble(&versionN); + if (GetIsOfficialRelease()) versionKind = _T("release"); + else versionKind = _T("svn"); + + // Read lines + while (!fstream->Eof()) { + // Parse + contents = text.ReadLine(); + wxStringTokenizer tkn(contents,_T(";"),wxTOKEN_RET_EMPTY_ALL); + wxArrayString parsed; + while (tkn.HasMoreTokens()) { + parsed.Add(tkn.GetNextToken()); + } + if (parsed.Count() != 4) continue; + + // See if it's interesting + if (parsed[0] == versionKind || parsed[0] == _T("release")) { + bool newer = false; + + // Check + if (parsed[0] == _T("svn")) { + long temp; + parsed[1].ToLong(&temp); + if (temp > svnRev) newer = true; + } + else { + int pos = parsed[1].Find(_T('-')); + wxString vName = parsed[1].Left(pos); + wxString svnName = parsed[1].Mid(pos+1); + if (versionKind == _T("svn")) { + long temp; + svnName.ToLong(&temp); + if (temp >= svnRev) newer = true; + } + else { + double temp; + vName.ToDouble(&temp); + if (temp > versionN) newer = true; + } + } + + // Is newer? + if (newer) { + wxMutexGuiEnter(); + if (!alive) goto endThread; + parent->logBox->AppendText(_("New version found!\n")); + parent->logBox->AppendText(parsed[3] + _T("\n")); + parent->logBox->AppendText(_("Please go to the following URL to download it: ") + parsed[2] + _T("\n")); + if (!parent->visible) { + parent->Show(); + parent->Raise(); + parent->visible = true; + } + goto endThread; + } + } + } + + // No new updates + wxMutexGuiEnter(); + if (!alive) goto endThread; + parent->logBox->AppendText(_("No new version has been found.\n")); + wxMutexGuiLeave(); + + // Delete file + delete fp; + fp = NULL; + break; + } + + // Finish thread + wxMutexGuiEnter(); +endThread: + if (alive && !parent->visible) parent->Destroy(); + wxMutexGuiLeave(); + delete fp; + fp = NULL; + Delete(); + return 0; +} diff --git a/aegisub/dialog_version_check.h b/aegisub/dialog_version_check.h new file mode 100644 index 000000000..59a5dc9d6 --- /dev/null +++ b/aegisub/dialog_version_check.h @@ -0,0 +1,93 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +/////////// +// Headers +#include + + +////////////// +// Prototypes +class DialogVersionCheck; + + +///////////////// +// Worker thread +class VersionCheckThread : public wxThread { +private: + DialogVersionCheck *parent; + +public: + bool alive; + + VersionCheckThread(DialogVersionCheck *parent); + wxThread::ExitCode Entry(); +}; + + +////////////////////////// +// Version checker dialog +class DialogVersionCheck : public wxDialog { + friend class VersionCheckThread; + +private: + static bool dialogRunning; + + wxTextCtrl *logBox; + VersionCheckThread *thread; + bool visible; + + void CheckVersion(); + void OnClose(wxCloseEvent &event); + void OnOK(wxCommandEvent &event); + void OnURL(wxTextUrlEvent &event); + +public: + DialogVersionCheck(wxWindow *parent,bool hidden); + ~DialogVersionCheck(); + + DECLARE_EVENT_TABLE() +}; + + +/////// +// IDs +enum { + Log_Box = 1000 +};