diff --git a/toolkit/components/alerts/src/mac/Makefile.in b/toolkit/components/alerts/src/mac/Makefile.in index 60e7691f5bcc..c6518b1d0452 100644 --- a/toolkit/components/alerts/src/mac/Makefile.in +++ b/toolkit/components/alerts/src/mac/Makefile.in @@ -51,6 +51,7 @@ REQUIRES = \ string \ necko \ xulapp \ + intl \ $(NULL) CMMSRCS = \ diff --git a/toolkit/components/alerts/src/mac/mozGrowlDelegate.h b/toolkit/components/alerts/src/mac/mozGrowlDelegate.h index f70840fa243b..5c14b079c2ef 100644 --- a/toolkit/components/alerts/src/mac/mozGrowlDelegate.h +++ b/toolkit/components/alerts/src/mac/mozGrowlDelegate.h @@ -39,8 +39,9 @@ #import -// XXX should this be localized? Bug 378527 -#define NOTIFICATION_NAME @"Application Notice" +#define GROWL_STRING_BUNDLE_LOCATION \ + "chrome://alerts/locale/notificationNames.properties" + #define OBSERVER_KEY @"ALERT_OBSERVER" #define COOKIE_KEY @"ALERT_COOKIE" @@ -48,23 +49,27 @@ { @private PRUint32 mKey; - NSMutableDictionary* mDict; + NSMutableDictionary *mDict; + NSMutableArray *mNames; + NSMutableArray *mEnabled; } /** * Dispatches a notification to Growl * + * @param aName The notification name to dispatch * @param aTitle The title of the notification * @param aText The body of the notification * @param aImage The image data, or [NSData data] if no image * @param aKey The observer key to use as a lookup (or 0 if no observer) * @param aCookie The string to be used as a cookie if there is an observer */ -+ (void) notifyWithTitle:(const nsAString&)aTitle - description:(const nsAString&)aText - iconData:(NSData*)aImage - key:(PRUint32)aKey - cookie:(const nsAString&)aCookie; ++ (void) notifyWithName:(const nsAString&)aName + title:(const nsAString&)aTitle + description:(const nsAString&)aText + iconData:(NSData*)aImage + key:(PRUint32)aKey + cookie:(const nsAString&)aCookie; /** * Adds an nsIObserver that we can query later for dispatching obsevers. diff --git a/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm b/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm index 98f3402d6401..97e9a8e10b84 100644 --- a/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm +++ b/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm @@ -42,6 +42,7 @@ #include "nsCOMPtr.h" #include "nsServiceManagerUtils.h" #include "nsIXULAppInfo.h" +#include "nsIStringBundle.h" @implementation mozGrowlDelegate @@ -50,6 +51,38 @@ if ((self = [super init])) { mKey = 0; mDict = [[NSMutableDictionary dictionaryWithCapacity: 8] retain]; + + mNames = [[NSMutableArray alloc] init]; + mEnabled = [[NSMutableArray alloc] init]; + + nsresult rv; + nsCOMPtr bundleService = + do_GetService("@mozilla.org/intl/stringbundle;1", &rv); + + if (NS_SUCCEEDED(rv)) { + nsCOMPtr bundle; + rv = bundleService->CreateBundle(GROWL_STRING_BUNDLE_LOCATION, + getter_AddRefs(bundle)); + + if (NS_SUCCEEDED(rv)) { + nsString text; + rv = bundle->GetStringFromName(NS_LITERAL_STRING("general").get(), + getter_Copies(text)); + + if (NS_SUCCEEDED(rv)) { + NSString *s = [NSString stringWithCharacters: text.BeginReading() + length: text.Length()]; + [mNames addObject: s]; + [mEnabled addObject: s]; + + return self; + } + } + } + + // Fallback + [mNames addObject: @"General Notification"]; + [mEnabled addObject: @"General Notification"]; } return self; @@ -59,15 +92,21 @@ { [mDict release]; + [mNames release]; + [mEnabled release]; + [super dealloc]; } -+ (void) notifyWithTitle:(const nsAString&)aTitle - description:(const nsAString&)aText - iconData:(NSData*)aImage - key:(PRUint32)aKey - cookie:(const nsAString&)aCookie ++ (void) notifyWithName:(const nsAString&)aName + title:(const nsAString&)aTitle + description:(const nsAString&)aText + iconData:(NSData*)aImage + key:(PRUint32)aKey + cookie:(const nsAString&)aCookie { + NS_ASSERTION(aName.Length(), "No name specified for the alert!"); + NSDictionary* clickContext = nil; if (aKey) { clickContext = [NSDictionary dictionaryWithObjectsAndKeys: @@ -85,7 +124,8 @@ length: aTitle.Length()] description: [NSString stringWithCharacters: aText.BeginReading() length: aText.Length()] - notificationName: NOTIFICATION_NAME + notificationName: [NSString stringWithCharacters: aName.BeginReading() + length: aName.Length()] iconData: aImage priority: 0 isSticky: NO @@ -105,10 +145,8 @@ - (NSDictionary *) registrationDictionaryForGrowl { return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: NOTIFICATION_NAME, nil], - GROWL_NOTIFICATIONS_ALL, - [NSArray arrayWithObjects: NOTIFICATION_NAME, nil], - GROWL_NOTIFICATIONS_DEFAULT, + mNames, GROWL_NOTIFICATIONS_ALL, + mEnabled, GROWL_NOTIFICATIONS_DEFAULT, nil]; } diff --git a/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h b/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h index ccc41b790c07..19c8b62ecb1e 100644 --- a/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h +++ b/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h @@ -45,7 +45,8 @@ class nsAlertsImageLoadListener : public nsIStreamLoaderObserver { public: - nsAlertsImageLoadListener(const nsAString& aAlertTitle, + nsAlertsImageLoadListener(const nsAString &aName, + const nsAString& aAlertTitle, const nsAString& aAlertText, PRBool aAlertClickable, const nsAString& aAlertCookie, @@ -54,6 +55,7 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSISTREAMLOADEROBSERVER private: + nsString mName; nsString mAlertTitle; nsString mAlertText; PRBool mAlertClickable; diff --git a/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm b/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm index 818f24bc92d4..4c6b600ea1ba 100644 --- a/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm +++ b/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm @@ -45,12 +45,13 @@ NS_IMPL_ISUPPORTS1(nsAlertsImageLoadListener, nsIStreamLoaderObserver) -nsAlertsImageLoadListener::nsAlertsImageLoadListener(const nsAString& aAlertTitle, +nsAlertsImageLoadListener::nsAlertsImageLoadListener(const nsAString &aName, + const nsAString& aAlertTitle, const nsAString& aAlertText, PRBool aAlertClickable, const nsAString& aAlertCookie, PRUint32 aAlertListenerKey) : - mAlertTitle(aAlertTitle), mAlertText(aAlertText), + mName(aName), mAlertTitle(aAlertTitle), mAlertText(aAlertText), mAlertClickable(aAlertClickable), mAlertCookie(aAlertCookie), mAlertListenerKey(aAlertListenerKey) { @@ -82,13 +83,14 @@ nsAlertsImageLoadListener::OnStreamComplete(nsIStreamLoader* aLoader, } #endif - [mozGrowlDelegate notifyWithTitle: mAlertTitle - description: mAlertText - iconData: NS_FAILED(aStatus) ? [NSData data] : - [NSData dataWithBytes: aResult - length: aLength] - key: mAlertListenerKey - cookie: mAlertCookie]; + [mozGrowlDelegate notifyWithName: mName + title: mAlertTitle + description: mAlertText + iconData: NS_FAILED(aStatus) ? [NSData data] : + [NSData dataWithBytes: aResult + length: aLength] + key: mAlertListenerKey + cookie: mAlertCookie]; return NS_OK; } diff --git a/toolkit/components/alerts/src/mac/nsAlertsService.mm b/toolkit/components/alerts/src/mac/nsAlertsService.mm index 714fb8f7da28..c3fd39320e8d 100644 --- a/toolkit/components/alerts/src/mac/nsAlertsService.mm +++ b/toolkit/components/alerts/src/mac/nsAlertsService.mm @@ -42,6 +42,8 @@ #include "nsNetUtil.h" #include "nsCRT.h" #include "nsCOMPtr.h" +#include "nsIStringBundle.h" +#include "nsIObserverService.h" #import "mozGrowlDelegate.h" #import "GrowlApplicationBridge.h" @@ -76,9 +78,12 @@ nsAlertsService::Init() if ([GrowlApplicationBridge isGrowlInstalled] == NO) return NS_ERROR_SERVICE_NOT_AVAILABLE; - mDelegate = new GrowlDelegateWrapper(); + nsresult rv; + nsCOMPtr os = + do_GetService("@mozilla.org/observer-service;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); - return NS_OK; + return os->AddObserver(this, "final-ui-startup", PR_FALSE); } nsAlertsService::nsAlertsService() : mDelegate(nsnull) {} @@ -97,7 +102,6 @@ nsAlertsService::ShowAlertNotification(const nsAString& aImageUrl, const nsAString& aAlertCookie, nsIObserver* aAlertListener) { - NS_ASSERTION(mDelegate->delegate == [GrowlApplicationBridge growlDelegate], "Growl Delegate was not registered properly."); @@ -105,22 +109,41 @@ nsAlertsService::ShowAlertNotification(const nsAString& aImageUrl, if (aAlertListener) ind = [mDelegate->delegate addObserver: aAlertListener]; + nsresult rv; + nsCOMPtr bundleService = + do_GetService("@mozilla.org/intl/stringbundle;1", &rv); + + // We don't want to fail just yet if we can't get the alert name + nsString name = NS_LITERAL_STRING("General Notification"); + if (NS_SUCCEEDED(rv)) { + nsCOMPtr bundle; + rv = bundleService->CreateBundle(GROWL_STRING_BUNDLE_LOCATION, + getter_AddRefs(bundle)); + if (NS_SUCCEEDED(rv)) { + rv = bundle->GetStringFromName(NS_LITERAL_STRING("general").get(), + getter_Copies(name)); + if (NS_FAILED(rv)) + name = NS_LITERAL_STRING("General Notification"); + } + } + nsCOMPtr uri; - nsresult rv = NS_NewURI(getter_AddRefs(uri), aImageUrl); + rv = NS_NewURI(getter_AddRefs(uri), aImageUrl); if (NS_FAILED(rv)) { // image uri failed to resolve, so dispatch to growl with no image - [mozGrowlDelegate notifyWithTitle: aAlertTitle - description: aAlertText - iconData: [NSData data] - key: ind - cookie: aAlertCookie]; + [mozGrowlDelegate notifyWithName: name + title: aAlertTitle + description: aAlertText + iconData: [NSData data] + key: ind + cookie: aAlertCookie]; return NS_OK; } nsCOMPtr listener = - new nsAlertsImageLoadListener(aAlertTitle, aAlertText, aAlertClickable, - aAlertCookie, ind); + new nsAlertsImageLoadListener(name, aAlertTitle, aAlertText, + aAlertClickable, aAlertCookie, ind); nsCOMPtr loader; rv = NS_NewStreamLoader(getter_AddRefs(loader), uri, listener); @@ -133,8 +156,15 @@ NS_IMETHODIMP nsAlertsService::Observe(nsISupports* aSubject, const char* aTopic, const PRUnichar* aData) { - if (nsCRT::strcmp(aTopic, "app-startup") == 0) // registers with Growl here + if (nsCRT::strcmp(aTopic, "final-ui-startup") == 0) { + NS_ASSERTION([GrowlApplicationBridge growlDelegate] == nil, + "We already registered with Growl!"); + + mDelegate = new GrowlDelegateWrapper(); + + // registers with Growl [GrowlApplicationBridge setGrowlDelegate: mDelegate->delegate]; + } return NS_OK; } diff --git a/toolkit/components/alerts/src/mac/nsAlertsServiceModule.cpp b/toolkit/components/alerts/src/mac/nsAlertsServiceModule.cpp index af397f442458..f5db7ba2e807 100644 --- a/toolkit/components/alerts/src/mac/nsAlertsServiceModule.cpp +++ b/toolkit/components/alerts/src/mac/nsAlertsServiceModule.cpp @@ -61,8 +61,8 @@ nsAlertsServiceRegister(nsIComponentManager* aCompMgr, char* prev = nsnull; rv = catman->AddCategoryEntry("app-startup", "nsAlertsService", - NS_ALERTSERVICE_CONTRACTID, PR_TRUE, PR_TRUE, - &prev); + "service," NS_ALERTSERVICE_CONTRACTID, PR_TRUE, + PR_TRUE, &prev); if (prev) nsMemory::Free(prev);