diff --git a/lib/native/mac/libsparkle_init.dylib b/lib/native/mac/libsparkle_init.dylib index c50bde787..12580d18b 100755 Binary files a/lib/native/mac/libsparkle_init.dylib and b/lib/native/mac/libsparkle_init.dylib differ diff --git a/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.h b/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.h index f81b0dff4..d1b765f31 100644 --- a/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.h +++ b/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.h @@ -10,10 +10,10 @@ extern "C" { /* * Class: net_java_sip_communicator_impl_sparkle_SparkleActivator * Method: initSparkle - * Signature: (Ljava/lang/String;ZI)V + * Signature: (Ljava/lang/String;ZILjava/lang/String;)V */ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sparkle_SparkleActivator_initSparkle - (JNIEnv *, jclass, jstring, jboolean, jint); + (JNIEnv *, jclass, jstring, jboolean, jint, jstring); #ifdef __cplusplus } diff --git a/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.m b/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.m index c5df1a915..f5d4126da 100644 --- a/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.m +++ b/src/native/macosx/sparkle/net_java_sip_communicator_impl_sparkle_SparkleActivator.m @@ -16,7 +16,7 @@ * installed in /Library/Frameworks/. This Framework is * available at http://sparkle.andymatuschak.org/ * - * @author Romain Kuntz + * @author Romain Kuntz * @author Egidijus Jankauskas */ @@ -27,21 +27,21 @@ /* * Class: net_java_sip_communicator_impl_sparkle_SparkleActivator * Method: initSparkle - * Signature: (Ljava/lang/String;ZI)V + * Signature: (Ljava/lang/String;ZILjava/lang/String;)V */ JNIEXPORT void JNICALL Java_net_java_sip_communicator_impl_sparkle_SparkleActivator_initSparkle (JNIEnv *env, jclass obj, jstring pathToSparkleFramework, - jboolean updateAtStartup, jint checkInterval) + jboolean updateAtStartup, jint checkInterval, jstring downloadLink) { BOOL hasLaunchedBefore = [[NSUserDefaults standardUserDefaults] boolForKey:@"SCHasLaunchedBefore"]; - + if(!hasLaunchedBefore) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SCHasLaunchedBefore"]; [[NSUserDefaults standardUserDefaults] synchronize]; } - + // The below code was used to avoid to link the Sparkle framework // at comilation time. //const char *path = (*env)->GetStringUTFChars(env, pathToSparkleFramework, 0); @@ -49,9 +49,21 @@ Java_net_java_sip_communicator_impl_sparkle_SparkleActivator_initSparkle //Class suUpdaterClass = [bundle classNamed:@"SUUpdater"]; //id suUpdater = [[suUpdaterClass alloc] init]; //(*env)->ReleaseStringUTFChars(env, pathToSparkleFramework, path); - + SUUpdater *suUpdater = [SUUpdater updaterForBundle:[NSBundle mainBundle]]; - + + if(downloadLink) + { + const char* link = (*env)->GetStringUTFChars(env, downloadLink, 0); + NSString* sLink = [NSString stringWithCString: link length: strlen(link)]; + NSURL* nsLink = [NSURL URLWithString: sLink]; + + if(nsLink) + { + [suUpdater setFeedURL: nsLink]; + } + } + NSMenu* menu = [[NSApplication sharedApplication] mainMenu]; NSMenu* applicationMenu = [[menu itemAtIndex:0] submenu]; NSMenuItem* checkForUpdatesMenuItem = [[NSMenuItem alloc] @@ -61,7 +73,7 @@ Java_net_java_sip_communicator_impl_sparkle_SparkleActivator_initSparkle [checkForUpdatesMenuItem setEnabled:YES]; [checkForUpdatesMenuItem setTarget:suUpdater]; - + // 0 => top, 1 => after "About..." [applicationMenu insertItem:checkForUpdatesMenuItem atIndex:1]; diff --git a/src/net/java/sip/communicator/impl/sparkle/SparkleActivator.java b/src/net/java/sip/communicator/impl/sparkle/SparkleActivator.java index 8a98b5f35..73109078c 100644 --- a/src/net/java/sip/communicator/impl/sparkle/SparkleActivator.java +++ b/src/net/java/sip/communicator/impl/sparkle/SparkleActivator.java @@ -7,6 +7,8 @@ package net.java.sip.communicator.impl.sparkle; import org.osgi.framework.*; + +import net.java.sip.communicator.service.configuration.*; import net.java.sip.communicator.util.*; /** @@ -22,6 +24,17 @@ public class SparkleActivator */ private static Logger logger = Logger.getLogger(SparkleActivator.class); + /** + * A reference to the ConfigurationService implementation instance that + * is currently registered with the bundle context. + */ + private static ConfigurationService configurationService = null; + + /** + * The current BundleContext. + */ + private static BundleContext bundleContext = null; + /** * Native method declaration * @@ -29,10 +42,14 @@ public class SparkleActivator * @param updateAtStartup specifies whether Sparkle should be checking for * updates on startup. * @param checkInterval specifies an interval for the update checks. + * @param downloadLink a custom download link for sparkle (i.e. the + * SUFeedURL). If null the default URL will be choosen (the + * SUFeedURL parameter in the .app/Contents/Info.pList). */ public native static void initSparkle(String pathToSparkleFramework, boolean updateAtStartup, - int checkInterval); + int checkInterval, + String downloadLink); /** * Whether updates are checked at startup @@ -50,14 +67,22 @@ public native static void initSparkle(String pathToSparkleFramework, */ private static boolean sparkleLibLoaded = false; + /** + * Property name for the update link in the configuration file. + */ + private static final String PROP_UPDATE_LINK = + "net.java.sip.communicator.UPDATE_LINK"; + /** * Initialize and start Sparkle * * @param bundleContext BundleContext - * @throws Exception + * @throws Exception if something goes wrong during sparkle initialization */ public void start(BundleContext bundleContext) throws Exception { + SparkleActivator.bundleContext = bundleContext; + /** * Dynamically loads JNI object. Will fail if non-MacOSX * or when libinit_sparkle.dylib is outside of the LD_LIBRARY_PATH @@ -79,10 +104,14 @@ public void start(BundleContext bundleContext) throws Exception return; } + String downloadLink = getConfigurationService().getString( + PROP_UPDATE_LINK); + + System.out.println("download link is: " + downloadLink); // TODO: better way to get the Sparkle Framework path? initSparkle(System.getProperty("user.dir") + "/../../Frameworks/Sparkle.framework", - updateAtStartup, checkInterval); + updateAtStartup, checkInterval, downloadLink); if (logger.isInfoEnabled()) logger.info("Sparkle Plugin ...[Started]"); } @@ -97,7 +126,28 @@ public void start(BundleContext bundleContext) throws Exception */ public void stop(BundleContext bundleContext) throws Exception { + bundleContext = null; if (logger.isInfoEnabled()) logger.info("Sparkle Plugin ...[Stopped]"); } + + /** + * Returns a reference to a ConfigurationService implementation currently + * registered in the bundle context or null if no such implementation was + * found. + * + * @return a currently valid implementation of the ConfigurationService. + */ + public static ConfigurationService getConfigurationService() + { + if (configurationService == null) + { + ServiceReference confReference + = bundleContext.getServiceReference( + ConfigurationService.class.getName()); + configurationService + = (ConfigurationService)bundleContext.getService(confReference); + } + return configurationService; + } }