From 91570ab79252b37afeae3b230cb6023c5b52547a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Sat, 28 Nov 2009 00:37:37 +0100 Subject: Integrated Sparkle auto-updater. diff --git a/BuildTools/SCons/Tools/AppBundle.py b/BuildTools/SCons/Tools/AppBundle.py index 2849435..3d06e97 100644 --- a/BuildTools/SCons/Tools/AppBundle.py +++ b/BuildTools/SCons/Tools/AppBundle.py @@ -1,9 +1,10 @@ import SCons.Util def generate(env) : - def createAppBundle(env, bundle, version = "1.0", resources = [], info = {}) : + def createAppBundle(env, bundle, version = "1.0", resources = [], frameworks = [], info = {}) : bundleContentsDir = bundle + ".app" + "/Contents" resourcesDir = bundleContentsDir + "/Resources" + frameworksDir = bundleContentsDir + "/Frameworks" env.Install(bundleContentsDir + "/MacOS", bundle) env.WriteVal(bundleContentsDir + "/PkgInfo", env.Value("APPL\77\77\77\77")) @@ -38,6 +39,9 @@ def generate(env) : for resource in resources : env.Install(resourcesDir, resource) + for framework in frameworks : + env.Install(frameworksDir, framework) + env.AddMethod(createAppBundle, "AppBundle") diff --git a/SConstruct b/SConstruct index 98cd348..121df77 100644 --- a/SConstruct +++ b/SConstruct @@ -224,6 +224,7 @@ if env["PLATFORM"] == "darwin" : if conf.CheckObjCHeader("Sparkle/Sparkle.h") : env["HAVE_SPARKLE"] = 1 env["SPARKLE_FLAGS"] = sparkle_flags + env["SPARKLE_FRAMEWORK"] = "/Library/Frameworks/Sparkle.framework" conf.Finish() # LibXML diff --git a/SwifTools/AutoUpdater/DummyAutoUpdater.h b/SwifTools/AutoUpdater/DummyAutoUpdater.h new file mode 100644 index 0000000..bdddb2a --- /dev/null +++ b/SwifTools/AutoUpdater/DummyAutoUpdater.h @@ -0,0 +1,10 @@ +#pragma once + +#include "SwifTools/AutoUpdater/AutoUpdater.h" + +namespace Swift { + class DummyAutoUpdater : public AutoUpdater { + public: + void checkForUpdates() {} + }; +} diff --git a/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.cpp b/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.cpp new file mode 100644 index 0000000..2049a4e --- /dev/null +++ b/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.cpp @@ -0,0 +1,19 @@ +#include "SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.h" + +#ifdef HAVE_SPARKLE +#include "SwifTools/AutoUpdater/SparkleAutoUpdater.h" +#else +#include "SwifTools/AutoUpdater/DummyAutoUpdater.h" +#endif + +namespace Swift { + +AutoUpdater* PlatformAutoUpdaterFactory::createAutoUpdater(const String& appcastURL) { +#ifdef HAVE_SPARKLE + return new SparkleAutoUpdater(appcastURL); +#else + return new DummyAutoUpdater(); +#endif +} + +} diff --git a/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.h b/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.h new file mode 100644 index 0000000..4e3cef1 --- /dev/null +++ b/SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.h @@ -0,0 +1,9 @@ +namespace Swift { + class AutoUpdater; + class String; + + class PlatformAutoUpdaterFactory { + public: + AutoUpdater* createAutoUpdater(const String& appcastURL); + }; +} diff --git a/SwifTools/SConscript b/SwifTools/SConscript index 92e82be..a1b3d18 100644 --- a/SwifTools/SConscript +++ b/SwifTools/SConscript @@ -14,10 +14,13 @@ sources = [ "Idle/IdleQuerier.cpp", "Idle/PlatformIdleQuerier.cpp", "AutoUpdater/AutoUpdater.cpp", + "AutoUpdater/PlatformAutoUpdaterFactory.cpp", "Linkify.cpp", ] if myenv.get("HAVE_SPARKLE", 0) : + myenv.MergeFlags(myenv["SPARKLE_FLAGS"]) + myenv.Append(CPPDEFINES = ["HAVE_SPARKLE"]) sources += ["AutoUpdater/SparkleAutoUpdater.mm"] if myenv["PLATFORM"] == "win32" : diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp index 7e204e9..4c7eabb 100644 --- a/Swift/QtUI/QtSwift.cpp +++ b/Swift/QtUI/QtSwift.cpp @@ -15,14 +15,24 @@ #include "Swiften/Application/Application.h" #include "Swiften/Application/Platform/PlatformApplication.h" #include "Swiften/Base/String.h" +#include "Swiften/Base/Platform.h" #include "Swiften/Elements/Presence.h" #include "Swiften/Client/Client.h" #include "Swift/Controllers/ChatController.h" #include "Swift/Controllers/MainController.h" #include "Swift/QtUI/BuildVersion.h" +#include "SwifTools/AutoUpdater/AutoUpdater.h" +#include "SwifTools/AutoUpdater/PlatformAutoUpdaterFactory.h" namespace Swift{ +#if defined(SWIFTEN_PLATFORM_MACOSX) +#define SWIFT_APPCAST_URL "http://swift.im/appcast/psi-mac.xml" +#else +#define SWIFT_APPCAST_URL "" +#endif + + QtSwift::QtSwift(bool netbookMode) { if (netbookMode) { splitter_ = new QSplitter(); @@ -48,9 +58,13 @@ QtSwift::QtSwift(bool netbookMode) { splitter_->show(); } mainController_ = new MainController(chatWindowFactory_, rosterWindowFactory_, loginWindowFactory_, treeWidgetFactory_, settings_, application_, systemTray_, soundPlayer_, xmlConsoleWidgetFactory_); + + autoUpdater_ = PlatformAutoUpdaterFactory().createAutoUpdater(SWIFT_APPCAST_URL); + autoUpdater_->checkForUpdates(); } QtSwift::~QtSwift() { + delete autoUpdater_; delete chatWindowFactory_; delete rosterWindowFactory_; delete loginWindowFactory_; diff --git a/Swift/QtUI/QtSwift.h b/Swift/QtUI/QtSwift.h index ad113d6..0ba9926 100644 --- a/Swift/QtUI/QtSwift.h +++ b/Swift/QtUI/QtSwift.h @@ -11,6 +11,7 @@ class QSplitter; namespace Swift { + class AutoUpdater; class Application; class MainController; class QtChatWindowFactory; @@ -40,6 +41,7 @@ namespace Swift { QtSoundPlayer* soundPlayer_; QtChatTabs* tabs_; Application* application_; + AutoUpdater* autoUpdater_; }; } diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index f8de60e..3a9545c 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -2,19 +2,19 @@ import os, shutil, datetime import Version def generateDefaultTheme(env, target, source) : - sourceDir = source[0].abspath - output = open(target[0].abspath, "w") - output.write("") - output.write("") - for (path, dirs, files) in os.walk(sourceDir) : - for file in files : - filePath = os.path.join(path,file) - output.write("%(path)s" % { - "alias": filePath[len(sourceDir)+1:], - "path": filePath - }) - output.write("") - output.write("") + sourceDir = source[0].abspath + output = open(target[0].abspath, "w") + output.write("") + output.write("") + for (path, dirs, files) in os.walk(sourceDir) : + for file in files : + filePath = os.path.join(path,file) + output.write("%(path)s" % { + "alias": filePath[len(sourceDir)+1:], + "path": filePath + }) + output.write("") + output.write("") Import("env") @@ -24,6 +24,8 @@ myenv.MergeFlags(env["SWIFT_CONTROLLERS_FLAGS"]) myenv.MergeFlags(env["SWIFTOOLS_FLAGS"]) if myenv["HAVE_XSS"] : myenv.MergeFlags(env["XSS_FLAGS"]) +if myenv["HAVE_SPARKLE"] : + myenv.MergeFlags(env["SPARKLE_FLAGS"]) myenv.MergeFlags(env["SWIFTEN_FLAGS"]) myenv.MergeFlags(env["CPPUNIT_FLAGS"]) myenv.MergeFlags(env["LIBIDN_FLAGS"]) @@ -42,60 +44,60 @@ myenv.Append(CPPPATH = ["/usr/include/phonon"]) myenv.Append(CPPPATH = ["."]) if env["PLATFORM"] == "win32" : - #myenv["LINKFLAGS"] = ["/SUBSYSTEM:CONSOLE"] - myenv.Append(LINKFLAGS = ["/SUBSYSTEM:WINDOWS"]) - myenv.Append(LIBS = "qtmain") + #myenv["LINKFLAGS"] = ["/SUBSYSTEM:CONSOLE"] + myenv.Append(LINKFLAGS = ["/SUBSYSTEM:WINDOWS"]) + myenv.Append(LIBS = "qtmain") myenv.Command("DefaultTheme.qrc", "../resources/themes/Default", Action(generateDefaultTheme, cmdstr = "$GENCOMSTR")) sources = [ - "main.cpp", - "QtAboutWidget.cpp", - "QtAddContactDialog.cpp", - "QtChatWindow.cpp", - "QtChatWindowFactory.cpp", - "QtJoinMUCDialog.cpp", - "QtLoginWindow.cpp", - "QtLoginWindowFactory.cpp", - "QtMainWindow.cpp", - "QtMainWindowFactory.cpp", - "QtSettingsProvider.cpp", - "QtStatusWidget.cpp", - "QtSwift.cpp", - "QtChatView.cpp", - "QtChatTabs.cpp", - "QtSoundPlayer.cpp", - "QtSystemTray.cpp", - "QtTabbable.cpp", - "QtTextEdit.cpp", - "QtXMLConsoleWidgetFactory.cpp", - "QtXMLConsoleWidget.cpp", - "ChatSnippet.cpp", - "MessageSnippet.cpp", - "SystemMessageSnippet.cpp", - "Roster/RosterModel.cpp", - "Roster/QtTreeWidget.cpp", - "Roster/QtTreeWidgetItem.cpp", - "Roster/RosterDelegate.cpp", - "EventViewer/EventView.cpp", - "EventViewer/EventModel.cpp", - "EventViewer/EventDelegate.cpp", - "QtRosterHeader.cpp", - "qrc_DefaultTheme.cc", - "qrc_Swift.cc", - ] + "main.cpp", + "QtAboutWidget.cpp", + "QtAddContactDialog.cpp", + "QtChatWindow.cpp", + "QtChatWindowFactory.cpp", + "QtJoinMUCDialog.cpp", + "QtLoginWindow.cpp", + "QtLoginWindowFactory.cpp", + "QtMainWindow.cpp", + "QtMainWindowFactory.cpp", + "QtSettingsProvider.cpp", + "QtStatusWidget.cpp", + "QtSwift.cpp", + "QtChatView.cpp", + "QtChatTabs.cpp", + "QtSoundPlayer.cpp", + "QtSystemTray.cpp", + "QtTabbable.cpp", + "QtTextEdit.cpp", + "QtXMLConsoleWidgetFactory.cpp", + "QtXMLConsoleWidget.cpp", + "ChatSnippet.cpp", + "MessageSnippet.cpp", + "SystemMessageSnippet.cpp", + "Roster/RosterModel.cpp", + "Roster/QtTreeWidget.cpp", + "Roster/QtTreeWidgetItem.cpp", + "Roster/RosterDelegate.cpp", + "EventViewer/EventView.cpp", + "EventViewer/EventModel.cpp", + "EventViewer/EventDelegate.cpp", + "QtRosterHeader.cpp", + "qrc_DefaultTheme.cc", + "qrc_Swift.cc", + ] myenv.BuildVersion("BuildVersion.h", version = env["SWIFT_VERSION"]) if env["PLATFORM"] == "win32" : - myenv.RES("../resources/Windows/Swift.rc") - sources += ["../resources/Windows/Swift.res"] + myenv.RES("../resources/Windows/Swift.rc") + sources += ["../resources/Windows/Swift.res"] if env["PLATFORM"] == "darwin" or env["PLATFORM"] == "win32" : - swiftProgram = myenv.Program("Swift", sources) + swiftProgram = myenv.Program("Swift", sources) else : - swiftProgram = myenv.Program("swift", sources) + swiftProgram = myenv.Program("swift", sources) myenv.Uic4("QtJoinMUCDialog.ui") myenv.Uic4("QtAddContactDialog.ui") @@ -103,22 +105,25 @@ myenv.Qrc("DefaultTheme.qrc") myenv.Qrc("Swift.qrc") if env["PLATFORM"] == "darwin" : - myenv.AppBundle("Swift", version = env["SWIFT_VERSION"], resources = ["../resources/MacOSX/Swift.icns"]) + frameworks = [] + if env["HAVE_SPARKLE"] : + frameworks.append(env["SPARKLE_FRAMEWORK"]) + myenv.AppBundle("Swift", version = env["SWIFT_VERSION"], resources = ["../resources/MacOSX/Swift.icns"], frameworks = frameworks) if env.get("SWIFT_INSTALLDIR", "") : - env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "bin"), swiftProgram) + env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "bin"), swiftProgram) if env["PLATFORM"] == "win32" : - if "dist" in COMMAND_LINE_TARGETS or env.GetOption("clean") : - myenv.WindowsBundle("Swift", resources = [ - os.path.join(env["OPENSSL_DIR"], "bin", "ssleay32.dll"), - os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"), - ], - qtimageformats = ["gif", "ico", "jpeg", "mng", "svg", "tiff"], - qtlibs = ["QtCore4", "QtGui4", "QtNetwork4", "QtWebKit4", "phonon4"]) - - myenv.Append(NSIS_OPTIONS = [ - "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"", - "/DbuildVersion=" + env["SWIFT_VERSION"] - ]) - myenv.Nsis("../Packaging/nsis/swift.nsi") + if "dist" in COMMAND_LINE_TARGETS or env.GetOption("clean") : + myenv.WindowsBundle("Swift", resources = [ + os.path.join(env["OPENSSL_DIR"], "bin", "ssleay32.dll"), + os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"), + ], + qtimageformats = ["gif", "ico", "jpeg", "mng", "svg", "tiff"], + qtlibs = ["QtCore4", "QtGui4", "QtNetwork4", "QtWebKit4", "phonon4"]) + + myenv.Append(NSIS_OPTIONS = [ + "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"", + "/DbuildVersion=" + env["SWIFT_VERSION"] + ]) + myenv.Nsis("../Packaging/nsis/swift.nsi") diff --git a/Swift/QtUI/main.cpp b/Swift/QtUI/main.cpp index a7a715c..b76acfa 100644 --- a/Swift/QtUI/main.cpp +++ b/Swift/QtUI/main.cpp @@ -2,8 +2,7 @@ #include "QtSwift.h" -int main(int argc, char* argv[]) -{ +int main(int argc, char* argv[]) { QApplication app(argc, argv); bool netbookMode = argc > 1; Swift::QtSwift swift(netbookMode); diff --git a/Swiften/Application/MacOSX/MacOSXApplication.h b/Swiften/Application/MacOSX/MacOSXApplication.h index e408ffd..cd5e69f 100644 --- a/Swiften/Application/MacOSX/MacOSXApplication.h +++ b/Swiften/Application/MacOSX/MacOSXApplication.h @@ -3,6 +3,7 @@ #include "Swiften/Application/Application.h" #include "Swiften/Application/MacOSX/MacOSXApplicationMessageDisplay.h" +#include "Swiften/Application/MacOSX/MacOSXApplicationInitializer.h" namespace Swift { class ApplicationMessageDisplay; @@ -16,6 +17,7 @@ namespace Swift { boost::filesystem::path getSettingsDir() const; private: + MacOSXApplicationInitializer initializer_; MacOSXApplicationMessageDisplay messageDisplay_; }; } diff --git a/Swiften/Application/SConscript b/Swiften/Application/SConscript index d13b63b..7696bd7 100644 --- a/Swiften/Application/SConscript +++ b/Swiften/Application/SConscript @@ -8,7 +8,8 @@ sources = [ if swiften_env["PLATFORM"] == "darwin" : sources += [ "MacOSX/MacOSXApplication.cpp", - "MacOSX/MacOSXApplicationMessageDisplay.mm" + "MacOSX/MacOSXApplicationMessageDisplay.mm", + "MacOSX/MacOSXApplicationInitializer.mm", ] objects = swiften_env.StaticObject(sources) -- cgit v0.10.2-6-g49f6