From e10ec979eb4af0f9b6864ace517877be29641f94 Mon Sep 17 00:00:00 2001 From: Michael Ventnor Date: Thu, 8 Jan 2009 21:12:16 +1300 Subject: [PATCH] Bug 469880. Support a libnotify-based implementation of nsIAlertsService for GTK. r+sr=roc,r=ted --HG-- extra : rebase_source : f9a6a01ffaf868712429a42193a275eecaf9a614 --- config/autoconf.mk.in | 4 + config/system-headers | 1 + configure.in | 32 +++ js/src/config/system-headers | 1 + toolkit/components/alerts/src/Makefile.in | 2 + .../components/alerts/src/nsAlertsService.cpp | 7 + toolkit/components/build/nsToolkitCompsCID.h | 11 + toolkit/system/gnome/Makefile.in | 16 ++ toolkit/system/gnome/nsAlertsIconListener.cpp | 263 ++++++++++++++++++ toolkit/system/gnome/nsAlertsIconListener.h | 74 +++++ toolkit/system/gnome/nsAlertsService.cpp | 72 +++++ toolkit/system/gnome/nsAlertsService.h | 59 ++++ toolkit/system/gnome/nsGnomeModule.cpp | 17 +- 13 files changed, 558 insertions(+), 1 deletion(-) create mode 100644 toolkit/system/gnome/nsAlertsIconListener.cpp create mode 100644 toolkit/system/gnome/nsAlertsIconListener.h create mode 100644 toolkit/system/gnome/nsAlertsService.cpp create mode 100644 toolkit/system/gnome/nsAlertsService.h diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index 80339f29037..0aa1304bc6e 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -530,6 +530,10 @@ MOZ_PANGO_LIBS = @MOZ_PANGO_LIBS@ MOZ_XIE_LIBS = @MOZ_XIE_LIBS@ XT_LIBS = @XT_LIBS@ +MOZ_LIBNOTIFY_CFLAGS = @MOZ_LIBNOTIFY_CFLAGS@ +MOZ_LIBNOTIFY_LIBS = @MOZ_LIBNOTIFY_LIBS@ +MOZ_ENABLE_LIBNOTIFY = @MOZ_ENABLE_LIBNOTIFY@ + GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLIB_GMODULE_LIBS = @GLIB_GMODULE_LIBS@ diff --git a/config/system-headers b/config/system-headers index d043e60d6c0..a85937564b7 100644 --- a/config/system-headers +++ b/config/system-headers @@ -435,6 +435,7 @@ libgnomevfs/gnome-vfs-ops.h libgnomevfs/gnome-vfs-standard-callbacks.h libIDL/IDL.h lib$routines.h +libnotify/notify.h limits limits.h link.h diff --git a/configure.in b/configure.in index 4d84f0b60cc..d197e9628c1 100644 --- a/configure.in +++ b/configure.in @@ -133,6 +133,7 @@ STARTUP_NOTIFICATION_VERSION=0.8 DBUS_VERSION=0.60 LCMS_VERSION=1.17 SQLITE_VERSION=3.6.6.2 +LIBNOTIFY_VERSION=0.4 MSMANIFEST_TOOL= @@ -5124,6 +5125,37 @@ AC_SUBST(MOZ_ENABLE_DBUS) AC_SUBST(MOZ_DBUS_GLIB_CFLAGS) AC_SUBST(MOZ_DBUS_GLIB_LIBS) +dnl ======================================================== +dnl = libnotify support +dnl ======================================================== + +MOZ_ARG_ENABLE_BOOL(libnotify, +[ --enable-libnotify Enable libnotify support ], + MOZ_ENABLE_LIBNOTIFY=1, + MOZ_ENABLE_LIBNOTIFY=) + +if test "$MOZ_ENABLE_GTK2" +then + if test "$MOZ_ENABLE_LIBNOTIFY" + then + AC_DEFINE(MOZ_ENABLE_LIBNOTIFY) + fi +fi + +if test -z "$SKIP_LIBRARY_CHECKS" +then + if test "$MOZ_ENABLE_GTK2" + then + if test "$MOZ_ENABLE_LIBNOTIFY" + then + PKG_CHECK_MODULES(MOZ_LIBNOTIFY, libnotify >= $LIBNOTIFY_VERSION) + fi + fi +fi +AC_SUBST(MOZ_ENABLE_LIBNOTIFY) +AC_SUBST(MOZ_LIBNOTIFY_CFLAGS) +AC_SUBST(MOZ_LIBNOTIFY_LIBS) + dnl ======================================================== dnl = Build Personal Security Manager dnl ======================================================== diff --git a/js/src/config/system-headers b/js/src/config/system-headers index d043e60d6c0..a85937564b7 100644 --- a/js/src/config/system-headers +++ b/js/src/config/system-headers @@ -435,6 +435,7 @@ libgnomevfs/gnome-vfs-ops.h libgnomevfs/gnome-vfs-standard-callbacks.h libIDL/IDL.h lib$routines.h +libnotify/notify.h limits limits.h link.h diff --git a/toolkit/components/alerts/src/Makefile.in b/toolkit/components/alerts/src/Makefile.in index 85344b4905c..e298555e526 100644 --- a/toolkit/components/alerts/src/Makefile.in +++ b/toolkit/components/alerts/src/Makefile.in @@ -60,6 +60,8 @@ CPPSRCS = \ nsAlertsService.cpp \ $(NULL) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/components/build/ + include $(topsrcdir)/config/rules.mk EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS) diff --git a/toolkit/components/alerts/src/nsAlertsService.cpp b/toolkit/components/alerts/src/nsAlertsService.cpp index fafb77a84c1..9a57432ba48 100644 --- a/toolkit/components/alerts/src/nsAlertsService.cpp +++ b/toolkit/components/alerts/src/nsAlertsService.cpp @@ -47,6 +47,7 @@ #include "nsDependentString.h" #include "nsWidgetsCID.h" #include "nsILookAndFeel.h" +#include "nsToolkitCompsCID.h" static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID); @@ -73,6 +74,12 @@ NS_IMETHODIMP nsAlertsService::ShowAlertNotification(const nsAString & aImageUrl nsIObserver * aAlertListener, const nsAString & aAlertName) { + // Check if there is an optional service that handles system-level notifications + nsCOMPtr sysAlerts(do_GetService(NS_SYSTEMALERTSERVICE_CONTRACTID)); + if (sysAlerts) + return sysAlerts->ShowAlertNotification(aImageUrl, aAlertTitle, aAlertText, aAlertTextClickable, + aAlertCookie, aAlertListener, aAlertName); + nsCOMPtr wwatch(do_GetService(NS_WINDOWWATCHER_CONTRACTID)); nsCOMPtr newWindow; nsresult rv; diff --git a/toolkit/components/build/nsToolkitCompsCID.h b/toolkit/components/build/nsToolkitCompsCID.h index d3fc9de065d..09b4af9704a 100644 --- a/toolkit/components/build/nsToolkitCompsCID.h +++ b/toolkit/components/build/nsToolkitCompsCID.h @@ -38,6 +38,13 @@ #define NS_ALERTSERVICE_CONTRACTID \ "@mozilla.org/alerts-service;1" +// This separate service uses the same nsIAlertsService interface, +// but instead sends a notification to a platform alerts API +// if available. Using a separate CID allows us to overwrite the XUL +// alerts service at runtime. +#define NS_SYSTEMALERTSERVICE_CONTRACTID \ + "@mozilla.org/system-alerts-service;1" + #define NS_AUTOCOMPLETECONTROLLER_CONTRACTID \ "@mozilla.org/autocomplete/controller;1" @@ -115,6 +122,10 @@ #define NS_ALERTSSERVICE_CID \ { 0xa0ccaaf8, 0x9da, 0x44d8, { 0xb2, 0x50, 0x9a, 0xc3, 0xe9, 0x3c, 0x81, 0x17 } } +// {84E11F80-CA55-11DD-AD8B-0800200C9A66} +#define NS_SYSTEMALERTSSERVICE_CID \ +{ 0x84e11f80, 0xca55, 0x11dd, { 0xad, 0x8b, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66 } } + // {F6D5EBBD-34F4-487d-9D10-3D34123E3EB9} #define NS_AUTOCOMPLETECONTROLLER_CID \ { 0xf6d5ebbd, 0x34f4, 0x487d, { 0x9d, 0x10, 0x3d, 0x34, 0x12, 0x3e, 0x3e, 0xb9 } } diff --git a/toolkit/system/gnome/Makefile.in b/toolkit/system/gnome/Makefile.in index 5e7a4a0bb40..ca0164d7766 100644 --- a/toolkit/system/gnome/Makefile.in +++ b/toolkit/system/gnome/Makefile.in @@ -51,6 +51,11 @@ REQUIRES = \ xpcom \ string \ necko \ + alerts \ + gfx \ + imglib2 \ + intl \ + widget \ $(NULL) CPPSRCS = \ @@ -59,6 +64,13 @@ CPPSRCS = \ nsGnomeModule.cpp \ $(NULL) +ifdef MOZ_ENABLE_LIBNOTIFY +CPPSRCS += \ + nsAlertsService.cpp \ + nsAlertsIconListener.cpp \ + $(NULL) +endif + EXTRA_DSO_LDOPTS += \ $(XPCOM_GLUE_LDOPTS) \ $(XPCOM_FROZEN_LDOPTS) \ @@ -67,8 +79,11 @@ EXTRA_DSO_LDOPTS += \ $(MOZ_GNOMEVFS_LIBS) \ $(MOZ_LIBGNOME_LIBS) \ $(GLIB_LIBS) \ + $(MOZ_LIBNOTIFY_LIBS) \ $(NULL) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/components/build/ + include $(topsrcdir)/config/rules.mk CXXFLAGS += \ @@ -76,4 +91,5 @@ CXXFLAGS += \ $(MOZ_GNOMEVFS_CFLAGS) \ $(MOZ_LIBGNOME_CFLAGS) \ $(GLIB_CFLAGS) \ + $(MOZ_LIBNOTIFY_CFLAGS) \ $(NULL) diff --git a/toolkit/system/gnome/nsAlertsIconListener.cpp b/toolkit/system/gnome/nsAlertsIconListener.cpp new file mode 100644 index 00000000000..1e476609b1a --- /dev/null +++ b/toolkit/system/gnome/nsAlertsIconListener.cpp @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode:nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsAlertsIconListener.h" +#include "imgILoader.h" +#include "imgIRequest.h" +#include "gfxIImageFrame.h" +#include "nsIImage.h" +#include "nsNetUtil.h" +#include "nsIImageToPixbuf.h" +#include "nsIStringBundle.h" + +#include +#include + +NS_IMPL_ISUPPORTS2(nsAlertsIconListener, imgIContainerObserver, imgIDecoderObserver) + +nsAlertsIconListener::nsAlertsIconListener() +: mLoadedFrame(PR_FALSE) +{ + MOZ_COUNT_CTOR(nsAlertsIconListener); +} + +nsAlertsIconListener::~nsAlertsIconListener() +{ + MOZ_COUNT_DTOR(nsAlertsIconListener); + + if (mIconRequest) + mIconRequest->CancelAndForgetObserver(NS_BINDING_ABORTED); +} + +NS_IMETHODIMP +nsAlertsIconListener::OnStartRequest(imgIRequest* aRequest) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsAlertsIconListener::OnStartDecode(imgIRequest* aRequest) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsAlertsIconListener::OnStartContainer(imgIRequest* aRequest, + imgIContainer* aContainer) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsAlertsIconListener::OnStartFrame(imgIRequest* aRequest, + gfxIImageFrame* aFrame) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsAlertsIconListener::OnDataAvailable(imgIRequest* aRequest, + gfxIImageFrame* aFrame, + const nsIntRect* aRect) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsAlertsIconListener::OnStopContainer(imgIRequest* aRequest, + imgIContainer* aContainer) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsAlertsIconListener::OnStopDecode(imgIRequest* aRequest, + nsresult status, + const PRUnichar* statusArg) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsAlertsIconListener::FrameChanged(imgIContainer* aContainer, + gfxIImageFrame* aFrame, + nsIntRect* aDirtyRect) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsAlertsIconListener::OnStopRequest(imgIRequest* aRequest, + PRBool aIsLastPart) +{ + PRUint32 imgStatus = imgIRequest::STATUS_ERROR; + nsresult rv = aRequest->GetImageStatus(&imgStatus); + NS_ENSURE_SUCCESS(rv, rv); + if (imgStatus == imgIRequest::STATUS_ERROR && !mLoadedFrame) { + // We have an error getting the image. Display the notification with no icon. + ShowAlert(NULL); + } + + if (mIconRequest) { + mIconRequest->Cancel(NS_BINDING_ABORTED); + mIconRequest = nsnull; + } + return NS_OK; +} + +NS_IMETHODIMP +nsAlertsIconListener::OnStopFrame(imgIRequest* aRequest, + gfxIImageFrame* aFrame) +{ + if (aRequest != mIconRequest) + return NS_ERROR_FAILURE; + + if (mLoadedFrame) + return NS_OK; // only use one frame + + nsCOMPtr frame = aFrame; + nsCOMPtr image = do_GetInterface(frame); + if (!image) + return NS_ERROR_FAILURE; + + nsresult rv = image->LockImagePixels(PR_FALSE); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr imgToPixbuf = + do_GetService("@mozilla.org/widget/image-to-gdk-pixbuf;1"); + + GdkPixbuf* imagePixbuf = imgToPixbuf->ConvertImageToPixbuf(image); + if (!imagePixbuf) + return NS_ERROR_FAILURE; + + rv = image->UnlockImagePixels(PR_FALSE); + if (NS_FAILED(rv)) + return rv; + + ShowAlert(imagePixbuf); + + g_object_unref(imagePixbuf); + + mLoadedFrame = PR_TRUE; + return NS_OK; +} + +nsresult +nsAlertsIconListener::ShowAlert(GdkPixbuf* aPixbuf) +{ + NotifyNotification* notify = notify_notification_new(mAlertTitle.get(), + mAlertText.get(), + NULL, NULL); + if (!notify) + return NS_ERROR_OUT_OF_MEMORY; + + if (aPixbuf) + notify_notification_set_icon_from_pixbuf(notify, aPixbuf); + + notify_notification_set_timeout(notify, NOTIFY_EXPIRES_DEFAULT); + gboolean result = notify_notification_show(notify, NULL); + g_object_unref(notify); + + return result ? NS_OK : NS_ERROR_FAILURE; +} + +nsresult +nsAlertsIconListener::StartRequest(const nsAString & aImageUrl) +{ + if (mIconRequest) { + // Another icon request is already in flight. Kill it. + mIconRequest->Cancel(NS_BINDING_ABORTED); + mIconRequest = nsnull; + } + + nsCOMPtr imageUri; + NS_NewURI(getter_AddRefs(imageUri), aImageUrl); + if (!imageUri) + return ShowAlert(NULL); + + nsCOMPtr il(do_GetService("@mozilla.org/image/loader;1")); + if (!il) + return ShowAlert(NULL); + + return il->LoadImage(imageUri, nsnull, nsnull, nsnull, this, + nsnull, nsIRequest::LOAD_NORMAL, nsnull, nsnull, + getter_AddRefs(mIconRequest)); +} + +nsresult +nsAlertsIconListener::InitAlertAsync(const nsAString & aImageUrl, + const nsAString & aAlertTitle, + const nsAString & aAlertText) +{ + if (!notify_is_initted()) { + // Give the name of this application to libnotify + nsCOMPtr bundleService = + do_GetService(NS_STRINGBUNDLE_CONTRACTID); + + nsCAutoString appShortName; + if (bundleService) { + nsCOMPtr bundle; + bundleService->CreateBundle("chrome://branding/locale/brand.properties", + getter_AddRefs(bundle)); + nsAutoString appName; + + if (bundle) { + bundle->GetStringFromName(NS_LITERAL_STRING("brandShortName").get(), + getter_Copies(appName)); + appShortName = NS_ConvertUTF16toUTF8(appName); + } else { + NS_WARNING("brand.properties not present, using default application name"); + appShortName.AssignLiteral("Mozilla"); + } + } else { + appShortName.AssignLiteral("Mozilla"); + } + + if (!notify_init(appShortName.get())) + return NS_ERROR_FAILURE; + } + + mAlertTitle = NS_ConvertUTF16toUTF8(aAlertTitle); + mAlertText = NS_ConvertUTF16toUTF8(aAlertText); + + return StartRequest(aImageUrl); +} diff --git a/toolkit/system/gnome/nsAlertsIconListener.h b/toolkit/system/gnome/nsAlertsIconListener.h new file mode 100644 index 00000000000..5ad04df30a7 --- /dev/null +++ b/toolkit/system/gnome/nsAlertsIconListener.h @@ -0,0 +1,74 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsAlertsIconListener_h__ +#define nsAlertsIconListener_h__ + +#include "nsCOMPtr.h" +#include "imgIDecoderObserver.h" +#include "nsStringAPI.h" + +#include + +class imgIRequest; + +class nsAlertsIconListener : public imgIDecoderObserver +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_IMGICONTAINEROBSERVER + NS_DECL_IMGIDECODEROBSERVER + + nsAlertsIconListener(); + virtual ~nsAlertsIconListener(); + + nsresult InitAlertAsync(const nsAString & aImageUrl, + const nsAString & aAlertTitle, + const nsAString & aAlertText); + +protected: + nsCOMPtr mIconRequest; + nsCString mAlertTitle; + nsCString mAlertText; + + PRPackedBool mLoadedFrame; + + nsresult StartRequest(const nsAString & aImageUrl); + nsresult ShowAlert(GdkPixbuf* aPixbuf); +}; + +#endif diff --git a/toolkit/system/gnome/nsAlertsService.cpp b/toolkit/system/gnome/nsAlertsService.cpp new file mode 100644 index 00000000000..6881a5aade9 --- /dev/null +++ b/toolkit/system/gnome/nsAlertsService.cpp @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode:nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsAlertsService.h" +#include "nsAlertsIconListener.h" + +NS_IMPL_THREADSAFE_ADDREF(nsAlertsService) +NS_IMPL_THREADSAFE_RELEASE(nsAlertsService) + +NS_INTERFACE_MAP_BEGIN(nsAlertsService) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAlertsService) + NS_INTERFACE_MAP_ENTRY(nsIAlertsService) +NS_INTERFACE_MAP_END_THREADSAFE + +nsAlertsService::nsAlertsService() +{} + +nsAlertsService::~nsAlertsService() +{} + +nsresult +nsAlertsService::Init() +{ + return NS_OK; +} + +NS_IMETHODIMP nsAlertsService::ShowAlertNotification(const nsAString & aImageUrl, const nsAString & aAlertTitle, + const nsAString & aAlertText, PRBool aAlertTextClickable, + const nsAString & aAlertCookie, + nsIObserver * aAlertListener, + const nsAString & aAlertName) +{ + nsCOMPtr alertListener = new nsAlertsIconListener(); + if (!alertListener) + return NS_ERROR_OUT_OF_MEMORY; + + return alertListener->InitAlertAsync(aImageUrl, aAlertTitle, aAlertText); +} diff --git a/toolkit/system/gnome/nsAlertsService.h b/toolkit/system/gnome/nsAlertsService.h new file mode 100644 index 00000000000..46ac13be0f1 --- /dev/null +++ b/toolkit/system/gnome/nsAlertsService.h @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsAlertsService_h__ +#define nsAlertsService_h__ + +#include "nsIAlertsService.h" +#include "nsCOMPtr.h" + +class nsAlertsService : public nsIAlertsService +{ +public: + NS_DECL_NSIALERTSSERVICE + NS_DECL_ISUPPORTS + + nsAlertsService(); + virtual ~nsAlertsService(); + + nsresult Init(); + +protected: + +}; + +#endif /* nsAlertsService_h__ */ diff --git a/toolkit/system/gnome/nsGnomeModule.cpp b/toolkit/system/gnome/nsGnomeModule.cpp index 3e2abd3c2ab..abb4479b05d 100644 --- a/toolkit/system/gnome/nsGnomeModule.cpp +++ b/toolkit/system/gnome/nsGnomeModule.cpp @@ -38,11 +38,20 @@ #include "nsGConfService.h" #include "nsGnomeVFSService.h" +#include "nsToolkitCompsCID.h" #include "nsIGenericFactory.h" +#ifdef MOZ_ENABLE_LIBNOTIFY +#include "nsAlertsService.h" +#endif + NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGConfService, Init) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGnomeVFSService, Init) +#ifdef MOZ_ENABLE_LIBNOTIFY +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAlertsService, Init) +#endif + static const nsModuleComponentInfo components[] = { { "GConf Service", NS_GCONFSERVICE_CID, @@ -51,7 +60,13 @@ static const nsModuleComponentInfo components[] = { { "GnomeVFS Service", NS_GNOMEVFSSERVICE_CID, NS_GNOMEVFSSERVICE_CONTRACTID, - nsGnomeVFSServiceConstructor } + nsGnomeVFSServiceConstructor }, +#ifdef MOZ_ENABLE_LIBNOTIFY + { "Gnome Alerts Service", + NS_SYSTEMALERTSSERVICE_CID, + NS_SYSTEMALERTSERVICE_CONTRACTID, + nsAlertsServiceConstructor }, +#endif }; NS_IMPL_NSGETMODULE(mozgnome, components)