From 91570ab79252b37afeae3b230cb6023c5b52547a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
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("<RCC version =\"1.0\">")
-	output.write("<qresource prefix=\"/themes/Default\">")
-	for (path, dirs, files) in os.walk(sourceDir) :
-		for file in files :
-			filePath = os.path.join(path,file)
-			output.write("<file alias=\"%(alias)s\">%(path)s</file>" % { 
-					"alias": filePath[len(sourceDir)+1:],
-					"path": filePath
-				})
-	output.write("</qresource>")
-	output.write("</RCC>")
+  sourceDir = source[0].abspath
+  output = open(target[0].abspath, "w")
+  output.write("<RCC version =\"1.0\">")
+  output.write("<qresource prefix=\"/themes/Default\">")
+  for (path, dirs, files) in os.walk(sourceDir) :
+    for file in files :
+      filePath = os.path.join(path,file)
+      output.write("<file alias=\"%(alias)s\">%(path)s</file>" % { 
+          "alias": filePath[len(sourceDir)+1:],
+          "path": filePath
+        })
+  output.write("</qresource>")
+  output.write("</RCC>")
 
 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