From d4aea239c671e296cc9634c8b79c1c185a9ed44b Mon Sep 17 00:00:00 2001 From: Robert McGovern Date: Tue, 17 Nov 2009 00:04:22 +0100 Subject: [PATCH] Added Growl output on the successful extraction of an archive. Note it will also display the Growl status if you skip over extracting files in the archive. --- Frameworks/Growl.framework/Growl | 1 + Frameworks/Growl.framework/Headers | 1 + Frameworks/Growl.framework/Resources | 1 + Frameworks/Growl.framework/Versions/A/Growl | Bin 0 -> 271496 bytes .../Versions/A/Headers/Growl.h | 6 + .../A/Headers/GrowlApplicationBridge-Carbon.h | 780 ++++++++++++++++++ .../A/Headers/GrowlApplicationBridge.h | 575 +++++++++++++ .../Versions/A/Headers/GrowlDefines.h | 348 ++++++++ .../Versions/A/Resources/Info.plist | 24 + Frameworks/Growl.framework/Versions/Current | 1 + Growl Registration Ticket.growlRegDict | 16 + QuietUnrar.xcodeproj/project.pbxproj | 20 +- QuietUnrar.xcodeproj/rob.mode1v3 | 45 +- QuietUnrar.xcodeproj/rob.pbxuser | 117 ++- QuietUnrarAppDelegate.m | 15 +- 15 files changed, 1913 insertions(+), 37 deletions(-) create mode 120000 Frameworks/Growl.framework/Growl create mode 120000 Frameworks/Growl.framework/Headers create mode 120000 Frameworks/Growl.framework/Resources create mode 100755 Frameworks/Growl.framework/Versions/A/Growl create mode 100644 Frameworks/Growl.framework/Versions/A/Headers/Growl.h create mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h create mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h create mode 100644 Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h create mode 100644 Frameworks/Growl.framework/Versions/A/Resources/Info.plist create mode 120000 Frameworks/Growl.framework/Versions/Current create mode 100644 Growl Registration Ticket.growlRegDict diff --git a/Frameworks/Growl.framework/Growl b/Frameworks/Growl.framework/Growl new file mode 120000 index 0000000..85956e2 --- /dev/null +++ b/Frameworks/Growl.framework/Growl @@ -0,0 +1 @@ +Versions/Current/Growl \ No newline at end of file diff --git a/Frameworks/Growl.framework/Headers b/Frameworks/Growl.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Frameworks/Growl.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Frameworks/Growl.framework/Resources b/Frameworks/Growl.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/Frameworks/Growl.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/Frameworks/Growl.framework/Versions/A/Growl b/Frameworks/Growl.framework/Versions/A/Growl new file mode 100755 index 0000000000000000000000000000000000000000..55db3246e62230cb95426cb8617d28efef1ecba8 GIT binary patch literal 271496 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 +#include + +#ifndef GROWL_EXPORT +#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE +#endif + +/*! @header GrowlApplicationBridge-Carbon.h + * @abstract Declares an API that Carbon applications can use to interact with Growl. + * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX + * to Growl (such as your application's name and what notifications it may + * post) and to provide information to your application (such as that Growl + * is listening for notifications or that a notification has been clicked). + * + * You can set the Growldelegate with Growl_SetDelegate and find out the + * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more + * information about the delegate. + */ + +__BEGIN_DECLS + +/*! @struct Growl_Delegate + * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events. + * @discussion The Growl delegate provides your interface to + * GrowlApplicationBridge. When GrowlApplicationBridge needs information about + * your application, it looks for it in the delegate; when Growl or the user + * does something that you might be interested in, GrowlApplicationBridge + * looks for a callback in the delegate and calls it if present + * (meaning, if it is not NULL). + * XXX on all of that + * @field size The size of the delegate structure. + * @field applicationName The name of your application. + * @field registrationDictionary A dictionary describing your application and the notifications it can send out. + * @field applicationIconData Your application's icon. + * @field growlInstallationWindowTitle The title of the installation window. + * @field growlInstallationInformation Text to display in the installation window. + * @field growlUpdateWindowTitle The title of the update window. + * @field growlUpdateInformation Text to display in the update window. + * @field referenceCount A count of owners of the delegate. + * @field retain Called when GrowlApplicationBridge receives this delegate. + * @field release Called when GrowlApplicationBridge no longer needs this delegate. + * @field growlIsReady Called when GrowlHelperApp is listening for notifications. + * @field growlNotificationWasClicked Called when a Growl notification is clicked. + * @field growlNotificationTimedOut Called when a Growl notification timed out. + */ +struct Growl_Delegate { + /* @discussion This should be sizeof(struct Growl_Delegate). + */ + size_t size; + + /*All of these attributes are optional. + *Optional attributes can be NULL; required attributes that + * are NULL cause setting the Growl delegate to fail. + *XXX - move optional/required status into the discussion for each field + */ + + /* This name is used both internally and in the Growl preferences. + * + * This should remain stable between different versions and incarnations of + * your application. + * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and + * "SurfWriter Lite" are not. + * + * This can be NULL if it is provided elsewhere, namely in an + * auto-discoverable plist file in your app bundle + * (XXX refer to more information on that) or in registrationDictionary. + */ + CFStringRef applicationName; + + /* + * Must contain at least these keys: + * GROWL_NOTIFICATIONS_ALL (CFArray): + * Contains the names of all notifications your application may post. + * + * Can also contain these keys: + * GROWL_NOTIFICATIONS_DEFAULT (CFArray): + * Names of notifications that should be enabled by default. + * If omitted, GROWL_NOTIFICATIONS_ALL will be used. + * GROWL_APP_NAME (CFString): + * Same as the applicationName member of this structure. + * If both are present, the applicationName member shall prevail. + * If this key is present, you may omit applicationName (set it to NULL). + * GROWL_APP_ICON (CFData): + * Same as the iconData member of this structure. + * If both are present, the iconData member shall prevail. + * If this key is present, you may omit iconData (set it to NULL). + * + * If you change the contents of this dictionary after setting the delegate, + * be sure to call Growl_Reregister. + * + * This can be NULL if you have an auto-discoverable plist file in your app + * bundle. (XXX refer to more information on that) + */ + CFDictionaryRef registrationDictionary; + + /* The data can be in any format supported by NSImage. As of + * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and + * PICT formats. + * + * If this is not supplied, Growl will look up your application's icon by + * its application name. + */ + CFDataRef applicationIconData; + + /* Installer display attributes + * + * These four attributes are used by the Growl installer, if this framework + * supports it. + * For any of these being NULL, a localised default will be + * supplied. + */ + + /* If this is NULL, Growl will use a default, + * localized title. + * + * Only used if you're using Growl-WithInstaller.framework. Otherwise, + * this member is ignored. + */ + CFStringRef growlInstallationWindowTitle; + /* This information may be as long or short as desired (the + * window will be sized to fit it). If Growl is not installed, it will + * be displayed to the user as an explanation of what Growl is and what + * it can do in your application. + * It should probably note that no download is required to install. + * + * If this is NULL, Growl will use a default, localized + * explanation. + * + * Only used if you're using Growl-WithInstaller.framework. Otherwise, + * this member is ignored. + */ + CFStringRef growlInstallationInformation; + /* If this is NULL, Growl will use a default, + * localized title. + * + * Only used if you're using Growl-WithInstaller.framework. Otherwise, + * this member is ignored. + */ + CFStringRef growlUpdateWindowTitle; + /* This information may be as long or short as desired (the + * window will be sized to fit it). If an older version of Growl is + * installed, it will be displayed to the user as an explanation that an + * updated version of Growl is included in your application and + * no download is required. + * + * If this is NULL, Growl will use a default, localized + * explanation. + * + * Only used if you're using Growl-WithInstaller.framework. Otherwise, + * this member is ignored. + */ + CFStringRef growlUpdateInformation; + + /* This member is provided for use by your retain and release + * callbacks (see below). + * + * GrowlApplicationBridge never directly uses this member. Instead, it + * calls your retain callback (if non-NULL) and your release + * callback (if non-NULL). + */ + unsigned referenceCount; + + //Functions. Currently all of these are optional (any of them can be NULL). + + /* When you call Growl_SetDelegate(newDelegate), it will call + * oldDelegate->release(oldDelegate), and then it will call + * newDelegate->retain(newDelegate), and the return value from retain + * is what will be set as the delegate. + * (This means that this member works like CFRetain and -[NSObject retain].) + * This member is optional (it can be NULL). + * For a delegate allocated with malloc, this member would be + * NULL. + * @result A delegate to which GrowlApplicationBridge holds a reference. + */ + void *(*retain)(void *); + /* When you call Growl_SetDelegate(newDelegate), it will call + * oldDelegate->release(oldDelegate), and then it will call + * newDelegate->retain(newDelegate), and the return value from retain + * is what will be set as the delegate. + * (This means that this member works like CFRelease and + * -[NSObject release].) + * This member is optional (it can be NULL). + * For a delegate allocated with malloc, this member might be + * free(3). + */ + void (*release)(void *); + + /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was + * launched successfully (or was already running). The application can + * take actions with the knowledge that Growl is installed and functional. + */ + void (*growlIsReady)(void); + + /* Informs the delegate that a Growl notification was clicked. It is only + * sent for notifications sent with a non-NULL clickContext, + * so if you want to receive a message when a notification is clicked, + * clickContext must not be NULL when calling + * Growl_PostNotification or + * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. + */ + void (*growlNotificationWasClicked)(CFPropertyListRef clickContext); + + /* Informs the delegate that a Growl notification timed out. It is only + * sent for notifications sent with a non-NULL clickContext, + * so if you want to receive a message when a notification is clicked, + * clickContext must not be NULL when calling + * Growl_PostNotification or + * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. + */ + void (*growlNotificationTimedOut)(CFPropertyListRef clickContext); +}; + +/*! @struct Growl_Notification + * @abstract Structure describing a Growl notification. + * @discussion XXX + * @field size The size of the notification structure. + * @field name Identifies the notification. + * @field title Short synopsis of the notification. + * @field description Additional text. + * @field iconData An icon for the notification. + * @field priority An indicator of the notification's importance. + * @field reserved Bits reserved for future usage. + * @field isSticky Requests that a notification stay on-screen until dismissed explicitly. + * @field clickContext An identifier to be passed to your click callback when a notification is clicked. + * @field clickCallback A callback to call when the notification is clicked. + */ +struct Growl_Notification { + /* This should be sizeof(struct Growl_Notification). + */ + size_t size; + + /* The notification name distinguishes one type of + * notification from another. The name should be human-readable, as it + * will be displayed in the Growl preference pane. + * + * The name is used in the GROWL_NOTIFICATIONS_ALL and + * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and + * in this member of the Growl_Notification structure. + */ + CFStringRef name; + + /* A notification's title describes the notification briefly. + * It should be easy to read quickly by the user. + */ + CFStringRef title; + + /* The description supplements the title with more + * information. It is usually longer and sometimes involves a list of + * subjects. For example, for a 'Download complete' notification, the + * description might have one filename per line. GrowlMail in Growl 0.6 + * uses a description of '%d new mail(s)' (formatted with the number of + * messages). + */ + CFStringRef description; + + /* The notification icon usually indicates either what + * happened (it may have the same icon as e.g. a toolbar item that + * started the process that led to the notification), or what it happened + * to (e.g. a document icon). + * + * The icon data is optional, so it can be NULL. In that + * case, the application icon is used alone. Not all displays support + * icons. + * + * The data can be in any format supported by NSImage. As of Mac OS X + * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form + * ats. + */ + CFDataRef iconData; + + /* Priority is new in Growl 0.6, and is represented as a + * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low + * priority, and +2 is Very High priority. + * + * Not all displays support priority. If you do not wish to assign a + * priority to your notification, assign 0. + */ + signed int priority; + + /* These bits are not used in Growl 0.6. Set them to 0. + */ + unsigned reserved: 31; + + /* When the sticky bit is clear, in most displays, + * notifications disappear after a certain amount of time. Sticky + * notifications, however, remain on-screen until the user dismisses them + * explicitly, usually by clicking them. + * + * Sticky notifications were introduced in Growl 0.6. Most notifications + * should not be sticky. Not all displays support sticky notifications, + * and the user may choose in Growl's preference pane to force the + * notification to be sticky or non-sticky, in which case the sticky bit + * in the notification will be ignored. + */ + unsigned isSticky: 1; + + /* If this is not NULL, and your click callback + * is not NULL either, this will be passed to the callback + * when your notification is clicked by the user. + * + * Click feedback was introduced in Growl 0.6, and it is optional. Not + * all displays support click feedback. + */ + CFPropertyListRef clickContext; + + /* If this is not NULL, it will be called instead + * of the Growl delegate's click callback when clickContext is + * non-NULL and the notification is clicked on by the user. + * + * Click feedback was introduced in Growl 0.6, and it is optional. Not + * all displays support click feedback. + * + * The per-notification click callback is not yet supported as of Growl + * 0.7. + */ + void (*clickCallback)(CFPropertyListRef clickContext); + + CFStringRef identifier; +}; + +#pragma mark - +#pragma mark Easy initialisers + +/*! @defined InitGrowlDelegate + * @abstract Callable macro. Initializes a Growl delegate structure to defaults. + * @discussion Call with a pointer to a struct Growl_Delegate. All of the + * members of the structure will be set to 0 or NULL, except for + * size (which will be set to sizeof(struct Growl_Delegate)) and + * referenceCount (which will be set to 1). + */ +#define InitGrowlDelegate(delegate) \ + do { \ + if (delegate) { \ + (delegate)->size = sizeof(struct Growl_Delegate); \ + (delegate)->applicationName = NULL; \ + (delegate)->registrationDictionary = NULL; \ + (delegate)->applicationIconData = NULL; \ + (delegate)->growlInstallationWindowTitle = NULL; \ + (delegate)->growlInstallationInformation = NULL; \ + (delegate)->growlUpdateWindowTitle = NULL; \ + (delegate)->growlUpdateInformation = NULL; \ + (delegate)->referenceCount = 1U; \ + (delegate)->retain = NULL; \ + (delegate)->release = NULL; \ + (delegate)->growlIsReady = NULL; \ + (delegate)->growlNotificationWasClicked = NULL; \ + (delegate)->growlNotificationTimedOut = NULL; \ + } \ + } while(0) + +/*! @defined InitGrowlNotification + * @abstract Callable macro. Initializes a Growl notification structure to defaults. + * @discussion Call with a pointer to a struct Growl_Notification. All of + * the members of the structure will be set to 0 or NULL, except + * for size (which will be set to + * sizeof(struct Growl_Notification)). + */ +#define InitGrowlNotification(notification) \ + do { \ + if (notification) { \ + (notification)->size = sizeof(struct Growl_Notification); \ + (notification)->name = NULL; \ + (notification)->title = NULL; \ + (notification)->description = NULL; \ + (notification)->iconData = NULL; \ + (notification)->priority = 0; \ + (notification)->reserved = 0U; \ + (notification)->isSticky = false; \ + (notification)->clickContext = NULL; \ + (notification)->clickCallback = NULL; \ + (notification)->identifier = NULL; \ + } \ + } while(0) + +#pragma mark - +#pragma mark Public API + +// @functiongroup Managing the Growl delegate + +/*! @function Growl_SetDelegate + * @abstract Replaces the current Growl delegate with a new one, or removes + * the Growl delegate. + * @param newDelegate + * @result Returns false and does nothing else if a pointer that was passed in + * is unsatisfactory (because it is non-NULL, but at least one + * required member of it is NULL). Otherwise, sets or unsets the + * delegate and returns true. + * @discussion When newDelegate is non-NULL, sets + * the delegate to newDelegate. When it is NULL, + * the current delegate will be unset, and no delegate will be in place. + * + * It is legal for newDelegate to be the current delegate; + * nothing will happen, and Growl_SetDelegate will return true. It is also + * legal for it to be NULL, as described above; again, it will + * return true. + * + * If there was a delegate in place before the call, Growl_SetDelegate will + * call the old delegate's release member if it was non-NULL. If + * newDelegate is non-NULL, Growl_SetDelegate will + * call newDelegate->retain, and set the delegate to its return + * value. + * + * If you are using Growl-WithInstaller.framework, and an older version of + * Growl is installed on the user's system, the user will automatically be + * prompted to update. + * + * GrowlApplicationBridge currently does not copy this structure, nor does it + * retain any of the CF objects in the structure (it regards the structure as + * a container that retains the objects when they are added and releases them + * when they are removed or the structure is destroyed). Also, + * GrowlApplicationBridge currently does not modify any member of the + * structure, except possibly the referenceCount by calling the retain and + * release members. + */ +GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); + +/*! @function Growl_GetDelegate + * @abstract Returns the current Growl delegate, if any. + * @result The current Growl delegate. + * @discussion Returns the last pointer passed into Growl_SetDelegate, or + * NULL if no such call has been made. + * + * This function follows standard Core Foundation reference-counting rules. + * Because it is a Get function, not a Copy function, it will not retain the + * delegate on your behalf. You are responsible for retaining and releasing + * the delegate as needed. + */ +GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void); + +#pragma mark - + +// @functiongroup Posting Growl notifications + +/*! @function Growl_PostNotification + * @abstract Posts a Growl notification. + * @param notification The notification to post. + * @discussion This is the preferred means for sending a Growl notification. + * The notification name and at least one of the title and description are + * required (all three are preferred). All other parameters may be + * NULL (or 0 or false as appropriate) to accept default values. + * + * If using the Growl-WithInstaller framework, if Growl is not installed the + * user will be prompted to install Growl. + * If the user cancels, this function will have no effect until the next + * application session, at which time when it is called the user will be + * prompted again. The user is also given the option to not be prompted again. + * If the user does choose to install Growl, the requested notification will + * be displayed once Growl is installed and running. + */ +GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification); + +/*! @function Growl_PostNotificationWithDictionary +* @abstract Notifies using a userInfo dictionary suitable for passing to +* CFDistributedNotificationCenter. +* @param userInfo The dictionary to notify with. +* @discussion Before Growl 0.6, your application would have posted +* notifications using CFDistributedNotificationCenter by creating a userInfo +* dictionary with the notification data. This had the advantage of allowing +* you to add other data to the dictionary for programs besides Growl that +* might be listening. +* +* This function allows you to use such dictionaries without being restricted +* to using CFDistributedNotificationCenter. The keys for this dictionary + * can be found in GrowlDefines.h. +*/ +GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); + +/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext + * @abstract Posts a Growl notification using parameter values. + * @param title The title of the notification. + * @param description The description of the notification. + * @param notificationName The name of the notification as listed in the + * registration dictionary. + * @param iconData Data representing a notification icon. Can be NULL. + * @param priority The priority of the notification (-2 to +2, with -2 + * being Very Low and +2 being Very High). + * @param isSticky If true, requests that this notification wait for a + * response from the user. + * @param clickContext An object to pass to the clickCallback, if any. Can + * be NULL, in which case the clickCallback is not called. + * @discussion Creates a temporary Growl_Notification, fills it out with the + * supplied information, and calls Growl_PostNotification on it. + * See struct Growl_Notification and Growl_PostNotification for more + * information. + * + * The icon data can be in any format supported by NSImage. As of Mac OS X + * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats. + */ +GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( + /*inhale*/ + CFStringRef title, + CFStringRef description, + CFStringRef notificationName, + CFDataRef iconData, + signed int priority, + Boolean isSticky, + CFPropertyListRef clickContext); + +#pragma mark - + +// @functiongroup Registering + +/*! @function Growl_RegisterWithDictionary + * @abstract Register your application with Growl without setting a delegate. + * @discussion When you call this function with a dictionary, + * GrowlApplicationBridge registers your application using that dictionary. + * If you pass NULL, GrowlApplicationBridge will ask the delegate + * (if there is one) for a dictionary, and if that doesn't work, it will look + * in your application's bundle for an auto-discoverable plist. + * (XXX refer to more information on that) + * + * If you pass a dictionary to this function, it must include the + * GROWL_APP_NAME key, unless a delegate is set. + * + * This function is mainly an alternative to the delegate system introduced + * with Growl 0.6. Without a delegate, you cannot receive callbacks such as + * growlIsReady (since they are sent to the delegate). You can, + * however, set a delegate after registering without one. + * + * This function was introduced in Growl.framework 0.7. + * @result false if registration failed (e.g. if Growl isn't installed). + */ +GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); + +/*! @function Growl_Reregister + * @abstract Updates your registration with Growl. + * @discussion If your application changes the contents of the + * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the + * Growl delegate, or if it changes the value of that member, or if it + * changes the contents of its auto-discoverable plist, call this function + * to have Growl update its registration information for your application. + * + * Otherwise, this function does not normally need to be called. If you're + * using a delegate, your application will be registered when you set the + * delegate if both the delegate and its registrationDictionary member are + * non-NULL. + * + * This function is now implemented using + * Growl_RegisterWithDictionary. + */ +GROWL_EXPORT void Growl_Reregister(void); + +#pragma mark - + +/*! @function Growl_SetWillRegisterWhenGrowlIsReady + * @abstract Tells GrowlApplicationBridge to register with Growl when Growl + * launches (or not). + * @discussion When Growl has started listening for notifications, it posts a + * GROWL_IS_READY notification on the Distributed Notification + * Center. GrowlApplicationBridge listens for this notification, using it to + * perform various tasks (such as calling your delegate's + * growlIsReady callback, if it has one). If this function is + * called with true, one of those tasks will be to reregister + * with Growl (in the manner of Growl_Reregister). + * + * This attribute is automatically set back to false + * (the default) after every GROWL_IS_READY notification. + * @param flag true if you want GrowlApplicationBridge to register with + * Growl when next it is ready; false if not. + */ +GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); +/*! @function Growl_WillRegisterWhenGrowlIsReady + * @abstract Reports whether GrowlApplicationBridge will register with Growl + * when Growl next launches. + * @result true if GrowlApplicationBridge will register with + * Growl when next it posts GROWL_IS_READY; false if not. + */ +GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void); + +#pragma mark - + +// @functiongroup Obtaining registration dictionaries + +/*! @function Growl_CopyRegistrationDictionaryFromDelegate + * @abstract Asks the delegate for a registration dictionary. + * @discussion If no delegate is set, or if the delegate's + * registrationDictionary member is NULL, this + * function returns NULL. + * + * This function does not attempt to clean up the dictionary in any way - for + * example, if it is missing the GROWL_APP_NAME key, the result + * will be missing it too. Use + * Growl_CreateRegistrationDictionaryByFillingInDictionary or + * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys + * to try to fill in missing keys. + * + * This function was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ +GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); + +/*! @function Growl_CopyRegistrationDictionaryFromBundle + * @abstract Looks in a bundle for a registration dictionary. + * @discussion This function looks in a bundle for an auto-discoverable + * registration dictionary file using CFBundleCopyResourceURL. + * If it finds one, it loads the file using CFPropertyList and + * returns the result. + * + * If you pass NULL as the bundle, the main bundle is examined. + * + * This function does not attempt to clean up the dictionary in any way - for + * example, if it is missing the GROWL_APP_NAME key, the result + * will be missing it too. Use + * Growl_CreateRegistrationDictionaryByFillingInDictionary: or + * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys + * to try to fill in missing keys. + * + * This function was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ +GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); + +/*! @function Growl_CreateBestRegistrationDictionary + * @abstract Obtains a registration dictionary, filled out to the best of + * GrowlApplicationBridge's knowledge. + * @discussion This function creates a registration dictionary as best + * GrowlApplicationBridge knows how. + * + * First, GrowlApplicationBridge examines the Growl delegate (if there is + * one) and gets the registration dictionary from that. If no such dictionary + * was obtained, GrowlApplicationBridge looks in your application's main + * bundle for an auto-discoverable registration dictionary file. If that + * doesn't exist either, this function returns NULL. + * + * Second, GrowlApplicationBridge calls + * Growl_CreateRegistrationDictionaryByFillingInDictionary with + * whatever dictionary was obtained. The result of that function is the + * result of this function. + * + * GrowlApplicationBridge uses this function when you call + * Growl_SetDelegate, or when you call + * Growl_RegisterWithDictionary with NULL. + * + * This function was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ +GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); + +#pragma mark - + +// @functiongroup Filling in registration dictionaries + +/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary + * @abstract Tries to fill in missing keys in a registration dictionary. + * @param regDict The dictionary to fill in. + * @result The dictionary with the keys filled in. + * @discussion This function examines the passed-in dictionary for missing keys, + * and tries to work out correct values for them. As of 0.7, it uses: + * + * Key Value + * --- ----- + * GROWL_APP_NAME CFBundleExecutableName + * GROWL_APP_ICON The icon of the application. + * GROWL_APP_LOCATION The location of the application. + * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL + * + * Keys are only filled in if missing; if a key is present in the dictionary, + * its value will not be changed. + * + * This function was introduced in Growl.framework 0.7. + */ +GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); +/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys + * @abstract Tries to fill in missing keys in a registration dictionary. + * @param regDict The dictionary to fill in. + * @param keys The keys to fill in. If NULL, any missing keys are filled in. + * @result The dictionary with the keys filled in. + * @discussion This function examines the passed-in dictionary for missing keys, + * and tries to work out correct values for them. As of 0.7, it uses: + * + * Key Value + * --- ----- + * GROWL_APP_NAME CFBundleExecutableName + * GROWL_APP_ICON The icon of the application. + * GROWL_APP_LOCATION The location of the application. + * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL + * + * Only those keys that are listed in keys will be filled in. + * Other missing keys are ignored. Also, keys are only filled in if missing; + * if a key is present in the dictionary, its value will not be changed. + * + * This function was introduced in Growl.framework 0.7. + */ +GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); + +/*! @brief Tries to fill in missing keys in a notification dictionary. + * @param notifDict The dictionary to fill in. + * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. + * @discussion This function examines the \a notifDict for missing keys, and + * tries to get them from the last known registration dictionary. As of 1.1, + * the keys that it will look for are: + * + * \li GROWL_APP_NAME + * \li GROWL_APP_ICON + * + * @since Growl.framework 1.1 + */ +GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict); + +#pragma mark - + +// @functiongroup Querying Growl's status + +/*! @function Growl_IsInstalled + * @abstract Determines whether the Growl prefpane and its helper app are + * installed. + * @result Returns true if Growl is installed, false otherwise. + */ +GROWL_EXPORT Boolean Growl_IsInstalled(void); + +/*! @function Growl_IsRunning + * @abstract Cycles through the process list to find whether GrowlHelperApp + * is running. + * @result Returns true if Growl is running, false otherwise. + */ +GROWL_EXPORT Boolean Growl_IsRunning(void); + +#pragma mark - + +// @functiongroup Launching Growl + +/*! @typedef GrowlLaunchCallback + * @abstract Callback to notify you that Growl is running. + * @param context The context pointer passed to Growl_LaunchIfInstalled. + * @discussion Growl_LaunchIfInstalled calls this callback function if Growl + * was already running or if it launched Growl successfully. + */ +typedef void (*GrowlLaunchCallback)(void *context); + +/*! @function Growl_LaunchIfInstalled + * @abstract Launches GrowlHelperApp if it is not already running. + * @param callback A callback function which will be called if Growl was successfully + * launched or was already running. Can be NULL. + * @param context The context pointer to pass to the callback. Can be NULL. + * @result Returns true if Growl was successfully launched or was already + * running; returns false and does not call the callback otherwise. + * @discussion Returns true and calls the callback (if the callback is not + * NULL) if the Growl helper app began launching or was already + * running. Returns false and performs no other action if Growl could not be + * launched (e.g. because the Growl preference pane is not properly installed). + * + * If Growl_CreateBestRegistrationDictionary returns + * non-NULL, this function will register with Growl atomically. + * + * The callback should take a single argument; this is to allow applications + * to have context-relevant information passed back. It is perfectly + * acceptable for context to be NULL. The callback itself can be + * NULL if you don't want one. + */ +GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); + +#pragma mark - +#pragma mark Constants + +/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER + * @abstract The CFBundleIdentifier of the Growl preference pane bundle. + * @discussion GrowlApplicationBridge uses this to determine whether Growl is + * currently installed, by searching for the Growl preference pane. Your + * application probably does not need to use this macro itself. + */ +#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER +#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel") +#endif + +__END_DECLS + +#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */ diff --git a/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h new file mode 100644 index 0000000..1e39f8d --- /dev/null +++ b/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h @@ -0,0 +1,575 @@ +// +// GrowlApplicationBridge.h +// Growl +// +// Created by Evan Schoenberg on Wed Jun 16 2004. +// Copyright 2004-2006 The Growl Project. All rights reserved. +// + +/*! + * @header GrowlApplicationBridge.h + * @abstract Defines the GrowlApplicationBridge class. + * @discussion This header defines the GrowlApplicationBridge class as well as + * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant. + */ + +#ifndef __GrowlApplicationBridge_h__ +#define __GrowlApplicationBridge_h__ + +#import +#import +#import "GrowlDefines.h" + +//Forward declarations +@protocol GrowlApplicationBridgeDelegate; + +//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) +#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" + +//------------------------------------------------------------------------------ +#pragma mark - + +/*! + * @class GrowlApplicationBridge + * @abstract A class used to interface with Growl. + * @discussion This class provides a means to interface with Growl. + * + * Currently it provides a way to detect if Growl is installed and launch the + * GrowlHelperApp if it's not already running. + */ +@interface GrowlApplicationBridge : NSObject { + +} + +/*! + * @method isGrowlInstalled + * @abstract Detects whether Growl is installed. + * @discussion Determines if the Growl prefpane and its helper app are installed. + * @result Returns YES if Growl is installed, NO otherwise. + */ ++ (BOOL) isGrowlInstalled; + +/*! + * @method isGrowlRunning + * @abstract Detects whether GrowlHelperApp is currently running. + * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings. + * @result Returns YES if GrowlHelperApp is running, NO otherwise. + */ ++ (BOOL) isGrowlRunning; + +#pragma mark - + +/*! + * @method setGrowlDelegate: + * @abstract Set the object which will be responsible for providing and receiving Growl information. + * @discussion This must be called before using GrowlApplicationBridge. + * + * The methods in the GrowlApplicationBridgeDelegate protocol are required + * and return the basic information needed to register with Growl. + * + * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol + * informal protocol are individually optional. They provide a greater + * degree of interaction between the application and growl such as informing + * the application when one of its Growl notifications is clicked by the user. + * + * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol + * informal protocol are individually optional and are only applicable when + * using the Growl-WithInstaller.framework which allows for automated Growl + * installation. + * + * When this method is called, data will be collected from inDelegate, Growl + * will be launched if it is not already running, and the application will be + * registered with Growl. + * + * If using the Growl-WithInstaller framework, if Growl is already installed + * but this copy of the framework has an updated version of Growl, the user + * will be prompted to update automatically. + * + * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. + */ ++ (void) setGrowlDelegate:(NSObject *)inDelegate; + +/*! + * @method growlDelegate + * @abstract Return the object responsible for providing and receiving Growl information. + * @discussion See setGrowlDelegate: for details. + * @result The Growl delegate. + */ ++ (NSObject *) growlDelegate; + +#pragma mark - + +/*! + * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext: + * @abstract Send a Growl notification. + * @discussion This is the preferred means for sending a Growl notification. + * The notification name and at least one of the title and description are + * required (all three are preferred). All other parameters may be + * nil (or 0 or NO as appropriate) to accept default values. + * + * If using the Growl-WithInstaller framework, if Growl is not installed the + * user will be prompted to install Growl. If the user cancels, this method + * will have no effect until the next application session, at which time when + * it is called the user will be prompted again. The user is also given the + * option to not be prompted again. If the user does choose to install Growl, + * the requested notification will be displayed once Growl is installed and + * running. + * + * @param title The title of the notification displayed to the user. + * @param description The full description of the notification displayed to the user. + * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. + * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. + * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. + * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. + * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). + */ ++ (void) notifyWithTitle:(NSString *)title + description:(NSString *)description + notificationName:(NSString *)notifName + iconData:(NSData *)iconData + priority:(signed int)priority + isSticky:(BOOL)isSticky + clickContext:(id)clickContext; + +/*! + * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: + * @abstract Send a Growl notification. + * @discussion This is the preferred means for sending a Growl notification. + * The notification name and at least one of the title and description are + * required (all three are preferred). All other parameters may be + * nil (or 0 or NO as appropriate) to accept default values. + * + * If using the Growl-WithInstaller framework, if Growl is not installed the + * user will be prompted to install Growl. If the user cancels, this method + * will have no effect until the next application session, at which time when + * it is called the user will be prompted again. The user is also given the + * option to not be prompted again. If the user does choose to install Growl, + * the requested notification will be displayed once Growl is installed and + * running. + * + * @param title The title of the notification displayed to the user. + * @param description The full description of the notification displayed to the user. + * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. + * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. + * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. + * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. + * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). + * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. + */ ++ (void) notifyWithTitle:(NSString *)title + description:(NSString *)description + notificationName:(NSString *)notifName + iconData:(NSData *)iconData + priority:(signed int)priority + isSticky:(BOOL)isSticky + clickContext:(id)clickContext + identifier:(NSString *)identifier; + +/*! @method notifyWithDictionary: + * @abstract Notifies using a userInfo dictionary suitable for passing to + * NSDistributedNotificationCenter. + * @param userInfo The dictionary to notify with. + * @discussion Before Growl 0.6, your application would have posted + * notifications using NSDistributedNotificationCenter by + * creating a userInfo dictionary with the notification data. This had the + * advantage of allowing you to add other data to the dictionary for programs + * besides Growl that might be listening. + * + * This method allows you to use such dictionaries without being restricted + * to using NSDistributedNotificationCenter. The keys for this dictionary + * can be found in GrowlDefines.h. + */ ++ (void) notifyWithDictionary:(NSDictionary *)userInfo; + +#pragma mark - + +/*! @method registerWithDictionary: + * @abstract Register your application with Growl without setting a delegate. + * @discussion When you call this method with a dictionary, + * GrowlApplicationBridge registers your application using that dictionary. + * If you pass nil, GrowlApplicationBridge will ask the delegate + * (if there is one) for a dictionary, and if that doesn't work, it will look + * in your application's bundle for an auto-discoverable plist. + * (XXX refer to more information on that) + * + * If you pass a dictionary to this method, it must include the + * GROWL_APP_NAME key, unless a delegate is set. + * + * This method is mainly an alternative to the delegate system introduced + * with Growl 0.6. Without a delegate, you cannot receive callbacks such as + * -growlIsReady (since they are sent to the delegate). You can, + * however, set a delegate after registering without one. + * + * This method was introduced in Growl.framework 0.7. + */ ++ (BOOL) registerWithDictionary:(NSDictionary *)regDict; + +/*! @method reregisterGrowlNotifications + * @abstract Reregister the notifications for this application. + * @discussion This method does not normally need to be called. If your + * application changes what notifications it is registering with Growl, call + * this method to have the Growl delegate's + * -registrationDictionaryForGrowl method called again and the + * Growl registration information updated. + * + * This method is now implemented using -registerWithDictionary:. + */ ++ (void) reregisterGrowlNotifications; + +#pragma mark - + +/*! @method setWillRegisterWhenGrowlIsReady: + * @abstract Tells GrowlApplicationBridge to register with Growl when Growl + * launches (or not). + * @discussion When Growl has started listening for notifications, it posts a + * GROWL_IS_READY notification on the Distributed Notification + * Center. GrowlApplicationBridge listens for this notification, using it to + * perform various tasks (such as calling your delegate's + * -growlIsReady method, if it has one). If this method is + * called with YES, one of those tasks will be to reregister + * with Growl (in the manner of -reregisterGrowlNotifications). + * + * This attribute is automatically set back to NO (the default) + * after every GROWL_IS_READY notification. + * @param flag YES if you want GrowlApplicationBridge to register with + * Growl when next it is ready; NO if not. + */ ++ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; +/*! @method willRegisterWhenGrowlIsReady + * @abstract Reports whether GrowlApplicationBridge will register with Growl + * when Growl next launches. + * @result YES if GrowlApplicationBridge will register with Growl + * when next it posts GROWL_IS_READY; NO if not. + */ ++ (BOOL) willRegisterWhenGrowlIsReady; + +#pragma mark - + +/*! @method registrationDictionaryFromDelegate + * @abstract Asks the delegate for a registration dictionary. + * @discussion If no delegate is set, or if the delegate's + * -registrationDictionaryForGrowl method returns + * nil, this method returns nil. + * + * This method does not attempt to clean up the dictionary in any way - for + * example, if it is missing the GROWL_APP_NAME key, the result + * will be missing it too. Use +[GrowlApplicationBridge + * registrationDictionaryByFillingInDictionary:] or + * +[GrowlApplicationBridge + * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try + * to fill in missing keys. + * + * This method was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ ++ (NSDictionary *) registrationDictionaryFromDelegate; + +/*! @method registrationDictionaryFromBundle: + * @abstract Looks in a bundle for a registration dictionary. + * @discussion This method looks in a bundle for an auto-discoverable + * registration dictionary file using -[NSBundle + * pathForResource:ofType:]. If it finds one, it loads the file using + * +[NSDictionary dictionaryWithContentsOfFile:] and returns the + * result. + * + * If you pass nil as the bundle, the main bundle is examined. + * + * This method does not attempt to clean up the dictionary in any way - for + * example, if it is missing the GROWL_APP_NAME key, the result + * will be missing it too. Use +[GrowlApplicationBridge + * registrationDictionaryByFillingInDictionary:] or + * +[GrowlApplicationBridge + * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try + * to fill in missing keys. + * + * This method was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ ++ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle; + +/*! @method bestRegistrationDictionary + * @abstract Obtains a registration dictionary, filled out to the best of + * GrowlApplicationBridge's knowledge. + * @discussion This method creates a registration dictionary as best + * GrowlApplicationBridge knows how. + * + * First, GrowlApplicationBridge contacts the Growl delegate (if there is + * one) and gets the registration dictionary from that. If no such dictionary + * was obtained, GrowlApplicationBridge looks in your application's main + * bundle for an auto-discoverable registration dictionary file. If that + * doesn't exist either, this method returns nil. + * + * Second, GrowlApplicationBridge calls + * +registrationDictionaryByFillingInDictionary: with whatever + * dictionary was obtained. The result of that method is the result of this + * method. + * + * GrowlApplicationBridge uses this method when you call + * +setGrowlDelegate:, or when you call + * +registerWithDictionary: with nil. + * + * This method was introduced in Growl.framework 0.7. + * @result A registration dictionary. + */ ++ (NSDictionary *) bestRegistrationDictionary; + +#pragma mark - + +/*! @method registrationDictionaryByFillingInDictionary: + * @abstract Tries to fill in missing keys in a registration dictionary. + * @discussion This method examines the passed-in dictionary for missing keys, + * and tries to work out correct values for them. As of 0.7, it uses: + * + * Key Value + * --- ----- + * GROWL_APP_NAME CFBundleExecutableName + * GROWL_APP_ICON The icon of the application. + * GROWL_APP_LOCATION The location of the application. + * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL + * + * Keys are only filled in if missing; if a key is present in the dictionary, + * its value will not be changed. + * + * This method was introduced in Growl.framework 0.7. + * @param regDict The dictionary to fill in. + * @result The dictionary with the keys filled in. This is an autoreleased + * copy of regDict. + */ ++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; +/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: + * @abstract Tries to fill in missing keys in a registration dictionary. + * @discussion This method examines the passed-in dictionary for missing keys, + * and tries to work out correct values for them. As of 0.7, it uses: + * + * Key Value + * --- ----- + * GROWL_APP_NAME CFBundleExecutableName + * GROWL_APP_ICON The icon of the application. + * GROWL_APP_LOCATION The location of the application. + * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL + * + * Only those keys that are listed in keys will be filled in. + * Other missing keys are ignored. Also, keys are only filled in if missing; + * if a key is present in the dictionary, its value will not be changed. + * + * This method was introduced in Growl.framework 0.7. + * @param regDict The dictionary to fill in. + * @param keys The keys to fill in. If nil, any missing keys are filled in. + * @result The dictionary with the keys filled in. This is an autoreleased + * copy of regDict. + */ ++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; + +/*! @brief Tries to fill in missing keys in a notification dictionary. + * @param notifDict The dictionary to fill in. + * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. + * @discussion This function examines the \a notifDict for missing keys, and + * tries to get them from the last known registration dictionary. As of 1.1, + * the keys that it will look for are: + * + * \li GROWL_APP_NAME + * \li GROWL_APP_ICON + * + * @since Growl.framework 1.1 + */ ++ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; + ++ (NSDictionary *) frameworkInfoDictionary; +@end + +//------------------------------------------------------------------------------ +#pragma mark - + +/*! + * @protocol GrowlApplicationBridgeDelegate + * @abstract Required protocol for the Growl delegate. + * @discussion The methods in this protocol are required and are called + * automatically as needed by GrowlApplicationBridge. See + * +[GrowlApplicationBridge setGrowlDelegate:]. + * See also GrowlApplicationBridgeDelegate_InformalProtocol. + */ + +@protocol GrowlApplicationBridgeDelegate + +// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. + +@end + +//------------------------------------------------------------------------------ +#pragma mark - + +/*! + * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) + * @abstract Methods which may be optionally implemented by the GrowlDelegate. + * @discussion The methods in this informal protocol will only be called if implemented by the delegate. + */ +@interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) + +/*! + * @method registrationDictionaryForGrowl + * @abstract Return the dictionary used to register this application with Growl. + * @discussion The returned dictionary gives Growl the complete list of + * notifications this application will ever send, and it also specifies which + * notifications should be enabled by default. Each is specified by an array + * of NSString objects. + * + * For most applications, these two arrays can be the same (if all sent + * notifications should be displayed by default). + * + * The NSString objects of these arrays will correspond to the + * notificationName: parameter passed in + * +[GrowlApplicationBridge + * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. + * + * The dictionary should have the required key object pairs: + * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects + * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects + * + * The dictionary may have the following key object pairs: + * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name + * + * You do not need to implement this method if you have an auto-discoverable + * plist file in your app bundle. (XXX refer to more information on that) + * + * @result The NSDictionary to use for registration. + */ +- (NSDictionary *) registrationDictionaryForGrowl; + +/*! + * @method applicationNameForGrowl + * @abstract Return the name of this application which will be used for Growl bookkeeping. + * @discussion This name is used both internally and in the Growl preferences. + * + * This should remain stable between different versions and incarnations of + * your application. + * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and + * "SurfWriter Lite" are not. + * + * You do not need to implement this method if you are providing the + * application name elsewhere, meaning in an auto-discoverable plist file in + * your app bundle (XXX refer to more information on that) or in the result + * of -registrationDictionaryForGrowl. + * + * @result The name of the application using Growl. + */ +- (NSString *) applicationNameForGrowl; + +/*! + * @method applicationIconForGrowl + * @abstract Return the NSImage to treat as the application icon. + * @discussion The delegate may optionally return an NSImage + * object to use as the application icon. If this method is not implemented, + * {{{-applicationIconDataForGrowl}}} is tried. If that method is not + * implemented, the application's own icon is used. Neither method is + * generally needed. + * @result The NSImage to treat as the application icon. + */ +- (NSImage *) applicationIconForGrowl; + +/*! + * @method applicationIconDataForGrowl + * @abstract Return the NSData to treat as the application icon. + * @discussion The delegate may optionally return an NSData + * object to use as the application icon; if this is not implemented, the + * application's own icon is used. This is not generally needed. + * @result The NSData to treat as the application icon. + * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. + */ +- (NSData *) applicationIconDataForGrowl; + +/*! + * @method growlIsReady + * @abstract Informs the delegate that Growl has launched. + * @discussion Informs the delegate that Growl (specifically, the + * GrowlHelperApp) was launched successfully. The application can take actions + * with the knowledge that Growl is installed and functional. + */ +- (void) growlIsReady; + +/*! + * @method growlNotificationWasClicked: + * @abstract Informs the delegate that a Growl notification was clicked. + * @discussion Informs the delegate that a Growl notification was clicked. It + * is only sent for notifications sent with a non-nil + * clickContext, so if you want to receive a message when a notification is + * clicked, clickContext must not be nil when calling + * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. + * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. + */ +- (void) growlNotificationWasClicked:(id)clickContext; + +/*! + * @method growlNotificationTimedOut: + * @abstract Informs the delegate that a Growl notification timed out. + * @discussion Informs the delegate that a Growl notification timed out. It + * is only sent for notifications sent with a non-nil + * clickContext, so if you want to receive a message when a notification is + * clicked, clickContext must not be nil when calling + * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. + * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. + */ +- (void) growlNotificationTimedOut:(id)clickContext; + +@end + +#pragma mark - +/*! + * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol) + * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework. + * @discussion The methods in this informal protocol will only be called if + * implemented by the delegate. They allow greater control of the information + * presented to the user when installing or upgrading Growl from within your + * application when using Growl-WithInstaller.framework. + */ +@interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol) + +/*! + * @method growlInstallationWindowTitle + * @abstract Return the title of the installation window. + * @discussion If not implemented, Growl will use a default, localized title. + * @result An NSString object to use as the title. + */ +- (NSString *)growlInstallationWindowTitle; + +/*! + * @method growlUpdateWindowTitle + * @abstract Return the title of the upgrade window. + * @discussion If not implemented, Growl will use a default, localized title. + * @result An NSString object to use as the title. + */ +- (NSString *)growlUpdateWindowTitle; + +/*! + * @method growlInstallationInformation + * @abstract Return the information to display when installing. + * @discussion This information may be as long or short as desired (the window + * will be sized to fit it). It will be displayed to the user as an + * explanation of what Growl is and what it can do in your application. It + * should probably note that no download is required to install. + * + * If this is not implemented, Growl will use a default, localized explanation. + * @result An NSAttributedString object to display. + */ +- (NSAttributedString *)growlInstallationInformation; + +/*! + * @method growlUpdateInformation + * @abstract Return the information to display when upgrading. + * @discussion This information may be as long or short as desired (the window + * will be sized to fit it). It will be displayed to the user as an + * explanation that an updated version of Growl is included in your + * application and no download is required. + * + * If this is not implemented, Growl will use a default, localized explanation. + * @result An NSAttributedString object to display. + */ +- (NSAttributedString *)growlUpdateInformation; + +@end + +//private +@interface GrowlApplicationBridge (GrowlInstallationPrompt_private) ++ (void) _userChoseNotToInstallGrowl; +@end + +#endif /* __GrowlApplicationBridge_h__ */ diff --git a/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h b/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h new file mode 100644 index 0000000..2b971cf --- /dev/null +++ b/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h @@ -0,0 +1,348 @@ +// +// GrowlDefines.h +// + +#ifndef _GROWLDEFINES_H +#define _GROWLDEFINES_H + +#ifdef __OBJC__ +#define XSTR(x) (@x) +#define STRING_TYPE NSString * +#else +#define XSTR CFSTR +#define STRING_TYPE CFStringRef +#endif + +/*! @header GrowlDefines.h + * @abstract Defines all the notification keys. + * @discussion Defines all the keys used for registration with Growl and for + * Growl notifications. + * + * Most applications should use the functions or methods of Growl.framework + * instead of posting notifications such as those described here. + * @updated 2004-01-25 + */ + +// UserInfo Keys for Registration +#pragma mark UserInfo Keys for Registration + +/*! @group Registration userInfo keys */ +/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification. + * @discussion The values of these keys describe the application and the + * notifications it may post. + * + * Your application must register with Growl before it can post Growl + * notifications (and have them not be ignored). However, as of Growl 0.6, + * posting GROWL_APP_REGISTRATION notifications directly is no longer the + * preferred way to register your application. Your application should instead + * use Growl.framework's delegate system. + * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for + * more information. + */ + +/*! @defined GROWL_APP_NAME + * @abstract The name of your application. + * @discussion The name of your application. This should remain stable between + * different versions and incarnations of your application. + * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and + * "SurfWriter Lite" are not. + */ +#define GROWL_APP_NAME XSTR("ApplicationName") +/*! @defined GROWL_APP_ID + * @abstract The bundle identifier of your application. + * @discussion The bundle identifier of your application. This key should + * be unique for your application while there may be several applications + * with the same GROWL_APP_NAME. + * This key is optional. + */ +#define GROWL_APP_ID XSTR("ApplicationId") +/*! @defined GROWL_APP_ICON + * @abstract The image data for your application's icon. + * @discussion Image data representing your application's icon. This may be + * superimposed on a notification icon as a badge, used as the notification + * icon when a notification-specific icon is not supplied, or ignored + * altogether, depending on the display. Must be in a format supported by + * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_APP_ICON XSTR("ApplicationIcon") +/*! @defined GROWL_NOTIFICATIONS_DEFAULT + * @abstract The array of notifications to turn on by default. + * @discussion These are the names of the notifications that should be enabled + * by default when your application registers for the first time. If your + * application reregisters, Growl will look here for any new notification + * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others. + */ +#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications") +/*! @defined GROWL_NOTIFICATIONS_ALL + * @abstract The array of all notifications your application can send. + * @discussion These are the names of all of the notifications that your + * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good + * notification names. + */ +#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") +/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS + * @abstract A dictionary of human-readable names for your notifications. + * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL + * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. + * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. + * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. + * + * This key is optional. + */ +#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") +/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS +* @abstract A dictionary of descriptions of _when_ each notification occurs +* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are +* descriptions of _when_ each notification occurs, such as "You received a new mail message" or +* "A file finished downloading". +* +* This key is optional. +*/ +#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") + +/*! @defined GROWL_TICKET_VERSION + * @abstract The version of your registration ticket. + * @discussion Include this key in a ticket plist file that you put in your + * application bundle for auto-discovery. The current ticket version is 1. + */ +#define GROWL_TICKET_VERSION XSTR("TicketVersion") +// UserInfo Keys for Notifications +#pragma mark UserInfo Keys for Notifications + +/*! @group Notification userInfo keys */ +/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification. + * @discussion The values of these keys describe the content of a Growl + * notification. + * + * Not all of these keys are supported by all displays. Only the name, title, + * and description of a notification are universal. Most of the built-in + * displays do support all of these keys, and most other visual displays + * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays + * support only textual data. + */ + +/*! @defined GROWL_NOTIFICATION_NAME + * @abstract The name of the notification. + * @discussion The name of the notification. Note that if you do not define + * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name + * will the one displayed within the Growl preference pane and should be human-readable. + */ +#define GROWL_NOTIFICATION_NAME XSTR("NotificationName") +/*! @defined GROWL_NOTIFICATION_TITLE + * @abstract The title to display in the notification. + * @discussion The title of the notification. Should be very brief. + * The title usually says what happened, e.g. "Download complete". + */ +#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle") +/*! @defined GROWL_NOTIFICATION_DESCRIPTION + * @abstract The description to display in the notification. + * @discussion The description should be longer and more verbose than the title. + * The description usually tells the subject of the action, + * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes". + */ +#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") +/*! @defined GROWL_NOTIFICATION_ICON + * @discussion Image data for the notification icon. Must be in a format + * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon") +/*! @defined GROWL_NOTIFICATION_APP_ICON + * @discussion Image data for the application icon, in case GROWL_APP_ICON does + * not apply for some reason. Must be in a format supported by NSImage, such + * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon") +/*! @defined GROWL_NOTIFICATION_PRIORITY + * @discussion The priority of the notification as an integer number from + * -2 to +2 (+2 being highest). + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority") +/*! @defined GROWL_NOTIFICATION_STICKY + * @discussion A Boolean number controlling whether the notification is sticky. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky") +/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT + * @abstract Identifies which notification was clicked. + * @discussion An identifier for the notification for clicking purposes. + * + * This will be passed back to the application when the notification is + * clicked. It must be plist-encodable (a data, dictionary, array, number, or + * string object), and it should be unique for each notification you post. + * A good click context would be a UUID string returned by NSProcessInfo or + * CFUUID. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") + +/*! @defined GROWL_DISPLAY_PLUGIN + * @discussion The name of a display plugin which should be used for this notification. + * Optional. If this key is not set or the specified display plugin does not + * exist, the display plugin stored in the application ticket is used. This key + * allows applications to use different default display plugins for their + * notifications. The user can still override those settings in the preference + * pane. + */ +#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin") + +/*! @defined GROWL_NOTIFICATION_IDENTIFIER + * @abstract An identifier for the notification for coalescing purposes. + * Notifications with the same identifier fall into the same class; only + * the last notification of a class is displayed on the screen. If a + * notification of the same class is currently being displayed, it is + * replaced by this notification. + * + * Optional. Not supported by all display plugins. + */ +#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier") + +/*! @defined GROWL_APP_PID + * @abstract The process identifier of the process which sends this + * notification. If this field is set, the application will only receive + * clicked and timed out notifications which originate from this process. + * + * Optional. + */ +#define GROWL_APP_PID XSTR("ApplicationPID") + +/*! @defined GROWL_NOTIFICATION_PROGRESS +* @abstract If this key is set, it should contain a double value wrapped +* in a NSNumber which describes some sort of progress (from 0.0 to 100.0). +* If this is key is not set, no progress bar is shown. +* +* Optional. Not supported by all display plugins. +*/ +#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") + +// Notifications +#pragma mark Notifications + +/*! @group Notification names */ +/* @abstract Names of distributed notifications used by Growl. + * @discussion These are notifications used by applications (directly or + * indirectly) to interact with Growl, and by Growl for interaction between + * its components. + * + * Most of these should no longer be used in Growl 0.6 and later, in favor of + * Growl.framework's GrowlApplicationBridge APIs. + */ + +/*! @defined GROWL_APP_REGISTRATION + * @abstract The distributed notification for registering your application. + * @discussion This is the name of the distributed notification that can be + * used to register applications with Growl. + * + * The userInfo dictionary for this notification can contain these keys: + *
    + *
  • GROWL_APP_NAME
  • + *
  • GROWL_APP_ICON
  • + *
  • GROWL_NOTIFICATIONS_ALL
  • + *
  • GROWL_NOTIFICATIONS_DEFAULT
  • + *
+ * + * No longer recommended as of Growl 0.6. An alternate method of registering + * is to use Growl.framework's delegate system. + * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for + * more information. + */ +#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification") +/*! @defined GROWL_APP_REGISTRATION_CONF + * @abstract The distributed notification for confirming registration. + * @discussion The name of the distributed notification sent to confirm the + * registration. Used by the Growl preference pane. Your application probably + * does not need to use this notification. + */ +#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification") +/*! @defined GROWL_NOTIFICATION + * @abstract The distributed notification for Growl notifications. + * @discussion This is what it all comes down to. This is the name of the + * distributed notification that your application posts to actually send a + * Growl notification. + * + * The userInfo dictionary for this notification can contain these keys: + *
    + *
  • GROWL_NOTIFICATION_NAME (required)
  • + *
  • GROWL_NOTIFICATION_TITLE (required)
  • + *
  • GROWL_NOTIFICATION_DESCRIPTION (required)
  • + *
  • GROWL_NOTIFICATION_ICON
  • + *
  • GROWL_NOTIFICATION_APP_ICON
  • + *
  • GROWL_NOTIFICATION_PRIORITY
  • + *
  • GROWL_NOTIFICATION_STICKY
  • + *
  • GROWL_NOTIFICATION_CLICK_CONTEXT
  • + *
  • GROWL_APP_NAME (required)
  • + *
+ * + * No longer recommended as of Growl 0.6. Three alternate methods of posting + * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:], + * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and + * Growl_PostNotification. + */ +#define GROWL_NOTIFICATION XSTR("GrowlNotification") +/*! @defined GROWL_SHUTDOWN +* @abstract The distributed notification name that tells Growl to shutdown. +* @discussion The Growl preference pane posts this notification when the +* "Stop Growl" button is clicked. +*/ +#define GROWL_SHUTDOWN XSTR("GrowlShutdown") +/*! @defined GROWL_PING + * @abstract A distributed notification to check whether Growl is running. + * @discussion This is used by the Growl preference pane. If it receives a + * GROWL_PONG, the preference pane takes this to mean that Growl is running. + */ +#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash") +/*! @defined GROWL_PONG + * @abstract The distributed notification sent in reply to GROWL_PING. + * @discussion GrowlHelperApp posts this in reply to GROWL_PING. + */ +#define GROWL_PONG XSTR("What Do You Want From Me, Woman") +/*! @defined GROWL_IS_READY + * @abstract The distributed notification sent when Growl starts up. + * @discussion GrowlHelperApp posts this when it has begin listening on all of + * its sources for new notifications. GrowlApplicationBridge (in + * Growl.framework), upon receiving this notification, reregisters using the + * registration dictionary supplied by its delegate. + */ +#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") +/*! @defined GROWL_NOTIFICATION_CLICKED + * @abstract The distributed notification sent when a supported notification is clicked. + * @discussion When a Growl notification with a click context is clicked on by + * the user, Growl posts this distributed notification. + * The GrowlApplicationBridge responds to this notification by calling a + * callback in its delegate. + */ +#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!") +#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!") + +/*! @group Other symbols */ +/* Symbols which don't fit into any of the other categories. */ + +/*! @defined GROWL_KEY_CLICKED_CONTEXT + * @abstract Used internally as the key for the clickedContext passed over DNC. + * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the + * click context that was supplied in the original notification. + */ +#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext") +/*! @defined GROWL_REG_DICT_EXTENSION + * @abstract The filename extension for registration dictionaries. + * @discussion The GrowlApplicationBridge in Growl.framework registers with + * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION) + * and opening it in the GrowlHelperApp. This happens whether or not Growl is + * running; if it was stopped, it quits immediately without listening for + * notifications. + */ +#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") + + +#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" + +#endif //ndef _GROWLDEFINES_H diff --git a/Frameworks/Growl.framework/Versions/A/Resources/Info.plist b/Frameworks/Growl.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..82b32db --- /dev/null +++ b/Frameworks/Growl.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Growl + CFBundleIdentifier + com.growl.growlframework + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.2 + CFBundleSignature + GRRR + CFBundleVersion + 1.2 + NSPrincipalClass + GrowlApplicationBridge + + diff --git a/Frameworks/Growl.framework/Versions/Current b/Frameworks/Growl.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Frameworks/Growl.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Growl Registration Ticket.growlRegDict b/Growl Registration Ticket.growlRegDict new file mode 100644 index 0000000..b7efa69 --- /dev/null +++ b/Growl Registration Ticket.growlRegDict @@ -0,0 +1,16 @@ + + + + + TicketVersion + 1 + AllNotifications + + QuietUnrarExtractionComplete + + DefaultNotifications + + QuietUnrarExtractionComplete + + + diff --git a/QuietUnrar.xcodeproj/project.pbxproj b/QuietUnrar.xcodeproj/project.pbxproj index e86c59c..2be9f53 100644 --- a/QuietUnrar.xcodeproj/project.pbxproj +++ b/QuietUnrar.xcodeproj/project.pbxproj @@ -12,8 +12,10 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; }; D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */ = {isa = PBXBuildFile; fileRef = D488BC6710AF437B00B3451C /* libunrar.so */; }; - D488BDB710B0160300B3451C /* PasswordDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BDB610B0160300B3451C /* PasswordDialog.xib */; }; D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D488BE5410B05F3800B3451C /* PasswordView.xib */; }; + D488BFB010B1F97F00B3451C /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D488BFAF10B1F97F00B3451C /* Growl.framework */; }; + D488BFBF10B1FBC700B3451C /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D488BFAF10B1F97F00B3451C /* Growl.framework */; }; + D488BFCC10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; }; D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; D4A49692105435C100BE38AE /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4A96E2010545E9A0091ECB4 /* Carbon.framework */; }; @@ -36,6 +38,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + D488BFBF10B1FBC700B3451C /* Growl.framework in CopyFiles */, D488BCC110AF49C700B3451C /* libunrar.so in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; @@ -58,6 +61,8 @@ D488BC6710AF437B00B3451C /* libunrar.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libunrar.so; path = libunrar/libunrar.so; sourceTree = ""; }; D488BDB610B0160300B3451C /* PasswordDialog.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordDialog.xib; sourceTree = ""; }; D488BE5410B05F3800B3451C /* PasswordView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PasswordView.xib; sourceTree = ""; }; + D488BFAF10B1F97F00B3451C /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = Frameworks/Growl.framework; sourceTree = ""; }; + D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Growl Registration Ticket.growlRegDict"; sourceTree = ""; }; D4A495741054177300BE38AE /* arccmt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arccmt.cpp; path = libunrar/arccmt.cpp; sourceTree = ""; }; D4A495751054177300BE38AE /* archive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = archive.cpp; path = libunrar/archive.cpp; sourceTree = ""; }; D4A495761054177300BE38AE /* archive.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = archive.hpp; path = libunrar/archive.hpp; sourceTree = ""; }; @@ -183,6 +188,7 @@ D488BC6810AF437B00B3451C /* libunrar.so in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, D4A96E2110545E9A0091ECB4 /* Carbon.framework in Frameworks */, + D488BFB010B1F97F00B3451C /* Growl.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -255,6 +261,7 @@ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, D488BDB610B0160300B3451C /* PasswordDialog.xib */, + D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */, ); name = Resources; sourceTree = ""; @@ -265,6 +272,7 @@ D488BC6710AF437B00B3451C /* libunrar.so */, 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + D488BFAF10B1F97F00B3451C /* Growl.framework */, ); name = Frameworks; sourceTree = ""; @@ -456,8 +464,8 @@ files = ( D4A49692105435C100BE38AE /* MainMenu.xib in Resources */, D4A49691105435BE00BE38AE /* InfoPlist.strings in Resources */, - D488BDB710B0160300B3451C /* PasswordDialog.xib in Resources */, D488BE5510B05F3800B3451C /* PasswordView.xib in Resources */, + D488BFCC10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -524,6 +532,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/Frameworks\"", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; @@ -548,6 +560,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/Frameworks\"", + ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = QuietUnrar_Prefix.pch; diff --git a/QuietUnrar.xcodeproj/rob.mode1v3 b/QuietUnrar.xcodeproj/rob.mode1v3 index 90e5bbf..3a9541c 100644 --- a/QuietUnrar.xcodeproj/rob.mode1v3 +++ b/QuietUnrar.xcodeproj/rob.mode1v3 @@ -265,16 +265,14 @@ 29B97314FDCFA39411CA2CEA 080E96DDFE201D6D7F000001 - 29B97317FDCFA39411CA2CEA - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey - 17 - 16 + 3 + 1 + 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey @@ -297,7 +295,7 @@ 150 RubberWindowFrame - 6 55 1276 723 0 0 1280 778 + 4 55 1276 723 0 0 1280 778 Module PBXSmartGroupTreeModule @@ -327,7 +325,7 @@ _historyCapacity 0 bookmark - D488BFA310B1F66B00B3451C + D488BFD910B205CA00B3451C history D4A4963610541A1C00BE38AE @@ -347,7 +345,8 @@ D488BD9010AF7F6900B3451C D488BEFE10B18CFC00B3451C D488BF0F10B1A61D00B3451C - D488BF2F10B1B64800B3451C + D488BFD810B205CA00B3451C + D488BFD110B1FE4500B3451C SplitCount @@ -359,14 +358,14 @@ GeometryConfiguration Frame - {{0, 0}, {1104, 618}} + {{0, 0}, {1104, 539}} RubberWindowFrame - 6 55 1276 723 0 0 1280 778 + 4 55 1276 723 0 0 1280 778 Module PBXNavigatorGroup Proportion - 618pt + 539pt ContentConfiguration @@ -379,14 +378,14 @@ GeometryConfiguration Frame - {{0, 623}, {1104, 59}} + {{0, 544}, {1104, 138}} RubberWindowFrame - 6 55 1276 723 0 0 1280 778 + 4 55 1276 723 0 0 1280 778 Module XCDetailModule Proportion - 59pt + 138pt Proportion @@ -405,9 +404,9 @@ TableOfContents - D488B02310AF188A00B3451C + D488BFC810B1FBD200B3451C 1CE0B1FE06471DED0097A5F4 - D488B02410AF188A00B3451C + D488BFC910B1FBD200B3451C 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -545,17 +544,11 @@ 5 WindowOrderList - 1C530D57069F1CE1000CFCEE - D488BD7710AF722600B3451C - D488B03D10AF1C2900B3451C - D488B03E10AF1C2900B3451C - 1CD10A99069EF8BA00B06720 D4A49630105419F700BE38AE - 1C78EAAD065D492600B07095 /Users/rob/Programming/Projects - Mine/QuietUnrar/QuietUnrar.xcodeproj WindowString - 6 55 1276 723 0 0 1280 778 + 4 55 1276 723 0 0 1280 778 WindowToolsV3 @@ -576,7 +569,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - QuietUnrarAppDelegate.m + StatusBarVisibility @@ -593,8 +586,6 @@ 267pt - BecomeActive - ContentConfiguration PBXProjectModuleGUID @@ -634,7 +625,7 @@ TableOfContents D4A49630105419F700BE38AE - D488B02610AF188A00B3451C + D488BFCA10B1FBD200B3451C 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID diff --git a/QuietUnrar.xcodeproj/rob.pbxuser b/QuietUnrar.xcodeproj/rob.pbxuser index 8d04cd2..a7c0673 100644 --- a/QuietUnrar.xcodeproj/rob.pbxuser +++ b/QuietUnrar.xcodeproj/rob.pbxuser @@ -16,9 +16,9 @@ }; 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1167, 3341}}"; - sepNavSelRange = "{6817, 0}"; - sepNavVisRange = "{5644, 646}"; + sepNavIntBoundsRect = "{{0, 0}, {1043, 3120}}"; + sepNavSelRange = "{4007, 0}"; + sepNavVisRange = "{3148, 1295}"; sepNavWindowFrame = "{{85, 21}, {877, 731}}"; }; }; @@ -42,7 +42,7 @@ PBXFileTableDataSourceColumnWidthsKey = ( 22, 300, - 753, + 752.58349609375, ); PBXFileTableDataSourceColumnsKey = ( PBXExecutablesDataSource_ActiveFlagID, @@ -77,7 +77,7 @@ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, - 740, + 825, 60, 20, 48, @@ -113,6 +113,15 @@ D488BF0F10B1A61D00B3451C = D488BF0F10B1A61D00B3451C /* PBXTextBookmark */; D488BF2F10B1B64800B3451C = D488BF2F10B1B64800B3451C /* PBXTextBookmark */; D488BFA310B1F66B00B3451C = D488BFA310B1F66B00B3451C /* PBXTextBookmark */; + D488BFC710B1FBD200B3451C /* PBXTextBookmark */ = D488BFC710B1FBD200B3451C /* PBXTextBookmark */; + D488BFCD10B1FDF600B3451C /* PlistBookmark */ = D488BFCD10B1FDF600B3451C /* PlistBookmark */; + D488BFCE10B1FDF600B3451C /* PBXTextBookmark */ = D488BFCE10B1FDF600B3451C /* PBXTextBookmark */; + D488BFCF10B1FDF600B3451C /* PBXTextBookmark */ = D488BFCF10B1FDF600B3451C /* PBXTextBookmark */; + D488BFD110B1FE4500B3451C /* PBXTextBookmark */ = D488BFD110B1FE4500B3451C /* PBXTextBookmark */; + D488BFD210B1FE4500B3451C /* PlistBookmark */ = D488BFD210B1FE4500B3451C /* PlistBookmark */; + D488BFD310B1FE4500B3451C /* PlistBookmark */ = D488BFD310B1FE4500B3451C /* PlistBookmark */; + D488BFD810B205CA00B3451C /* PlistBookmark */ = D488BFD810B205CA00B3451C /* PlistBookmark */; + D488BFD910B205CA00B3451C /* PBXTextBookmark */ = D488BFD910B205CA00B3451C /* PBXTextBookmark */; D4A4963610541A1C00BE38AE = D4A4963610541A1C00BE38AE /* PBXTextBookmark */; D4A4965D105433E000BE38AE = D4A4965D105433E000BE38AE /* PBXTargetBookmark */; D4A96E4C1054628D0091ECB4 = D4A96E4C1054628D0091ECB4 /* PBXTextBookmark */; @@ -296,7 +305,7 @@ comments = "Value stored to 'closeResult' during its initialization is never read"; fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; rLen = 1; - rLoc = 171; + rLoc = 175; rType = 1; }; D488BFA310B1F66B00B3451C /* PBXTextBookmark */ = { @@ -304,11 +313,105 @@ fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; name = "QuietUnrarAppDelegate.m: 72"; rLen = 0; - rLoc = 3014; + rLoc = 3038; rType = 0; vrLen = 1803; vrLoc = 1721; }; + D488BFC710B1FBD200B3451C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; + name = "QuietUnrarAppDelegate.m: 100"; + rLen = 0; + rLoc = 4112; + rType = 0; + vrLen = 1293; + vrLoc = 3147; + }; + D488BFCD10B1FDF600B3451C /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = "/Users/rob/Programming/Projects - Mine/QuietUnrar/Growl Registration Ticket.growlRegDict.plist"; + rLen = 0; + rLoc = 9223372036854775807; + }; + D488BFCE10B1FDF600B3451C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; + name = "QuietUnrarAppDelegate.m: 100"; + rLen = 0; + rLoc = 4112; + rType = 0; + vrLen = 1292; + vrLoc = 3148; + }; + D488BFCF10B1FDF600B3451C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; + name = "QuietUnrarAppDelegate.m: 99"; + rLen = 0; + rLoc = 4094; + rType = 0; + vrLen = 1300; + vrLoc = 3148; + }; + D488BFD110B1FE4500B3451C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; + name = "QuietUnrarAppDelegate.m: 99"; + rLen = 0; + rLoc = 4094; + rType = 0; + vrLen = 1300; + vrLoc = 3148; + }; + D488BFD210B1FE4500B3451C /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = "/Users/rob/Programming/Projects - Mine/QuietUnrar/Growl Registration Ticket.growlRegDict.plist"; + rLen = 0; + rLoc = 9223372036854775807; + }; + D488BFD310B1FE4500B3451C /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = "/Users/rob/Programming/Projects - Mine/QuietUnrar/Growl Registration Ticket.growlRegDict.plist"; + rLen = 0; + rLoc = 9223372036854775807; + }; + D488BFD810B205CA00B3451C /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = D488BFCB10B1FD4500B3451C /* Growl Registration Ticket.growlRegDict */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = "/Users/rob/Programming/Projects - Mine/QuietUnrar/Growl Registration Ticket.growlRegDict"; + rLen = 0; + rLoc = 9223372036854775807; + }; + D488BFD910B205CA00B3451C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 256AC3D90F4B6AC300CF3369 /* QuietUnrarAppDelegate.m */; + name = "QuietUnrarAppDelegate.m: 98"; + rLen = 0; + rLoc = 4007; + rType = 0; + vrLen = 1295; + vrLoc = 3148; + }; D4A4940C1054167200BE38AE /* QuietUnrar */ = { isa = PBXExecutable; activeArgIndices = ( diff --git a/QuietUnrarAppDelegate.m b/QuietUnrarAppDelegate.m index 99e7f64..eb27302 100644 --- a/QuietUnrarAppDelegate.m +++ b/QuietUnrarAppDelegate.m @@ -7,6 +7,7 @@ // #import +#import #import "QuietUnrarAppDelegate.h" #import "libunrar/dll.hpp" @@ -88,7 +89,19 @@ int callbackFunction(UINT message, LPARAM userData, LPARAM parameterOne, LPARAM // NSLog(@"openFiles: %@", arrayOfFilenames); for (NSString * filename in arrayOfFilenames) { - [self extractRarWith:filename]; + BOOL extracted = [self extractRarWith:filename]; + if (extracted) { + [GrowlApplicationBridge setGrowlDelegate:@""]; + + [GrowlApplicationBridge + notifyWithTitle:@"QuietUnrar: Extraction Complete" + description:[NSString stringWithFormat:@"The archive %@ was successfully extracted", filename] + notificationName:@"QuietUnrarExtractionComplete" + iconData:nil + priority:0 + isSticky:NO + clickContext:nil]; + } } }