From: <ba...@us...> - 2008-05-28 22:45:55
|
Revision: 10051 http://amsn.svn.sourceforge.net/amsn/?rev=10051&view=rev Author: baaazen Date: 2008-05-28 15:46:00 -0700 (Wed, 28 May 2008) Log Message: ----------- r9232, 9527 to branch: 9232: Add growl source to the package. So recompiling will be easier. `make install` builds the lib, and copies it back into the utils folder. 9527: Add growl make rules to Makefile.in. Modified Paths: -------------- branches/0_97/amsn/Makefile.in Added Paths: ----------- branches/0_97/amsn/utils/macosx/growl1.0/Rules.mk branches/0_97/amsn/utils/macosx/growl1.0/src/ branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.m branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlDefines.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlDefinesInternal.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathUtil.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathUtil.m branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathway.h branches/0_97/amsn/utils/macosx/growl1.0/src/NSURLAdditions.h branches/0_97/amsn/utils/macosx/growl1.0/src/NSURLAdditions.m branches/0_97/amsn/utils/macosx/growl1.0/src/ReadMe-Tcl.txt branches/0_97/amsn/utils/macosx/growl1.0/src/Rules.mk branches/0_97/amsn/utils/macosx/growl1.0/src/TclGrowler.h branches/0_97/amsn/utils/macosx/growl1.0/src/TclGrowler.m branches/0_97/amsn/utils/macosx/growl1.0/src/growl.m Removed Paths: ------------- branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.m branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlDefines.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlDefinesInternal.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathUtil.h branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathUtil.m branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlPathway.h branches/0_97/amsn/utils/macosx/growl1.0/src/NSURLAdditions.h branches/0_97/amsn/utils/macosx/growl1.0/src/NSURLAdditions.m branches/0_97/amsn/utils/macosx/growl1.0/src/ReadMe-Tcl.txt branches/0_97/amsn/utils/macosx/growl1.0/src/TclGrowler.h branches/0_97/amsn/utils/macosx/growl1.0/src/TclGrowler.m branches/0_97/amsn/utils/macosx/growl1.0/src/growl.m Modified: branches/0_97/amsn/Makefile.in =================================================================== --- branches/0_97/amsn/Makefile.in 2008-05-28 22:30:39 UTC (rev 10050) +++ branches/0_97/amsn/Makefile.in 2008-05-28 22:46:00 UTC (rev 10051) @@ -274,6 +274,8 @@ else ifeq ($(FOUND_OS),mac) include $(macosx_dir)/sndplay-src/Rules.mk + include $(macosx_dir)/growl1.0/Rules.mk + include $(macosx_dir)/growl1.0/src/Rules.mk include $(macosx_dir)/tclCarbon/Rules.mk include $(macosx_dir)/tclCarbon/src/Rules.mk endif Added: branches/0_97/amsn/utils/macosx/growl1.0/Rules.mk =================================================================== --- branches/0_97/amsn/utils/macosx/growl1.0/Rules.mk (rev 0) +++ branches/0_97/amsn/utils/macosx/growl1.0/Rules.mk 2008-05-28 22:46:00 UTC (rev 10051) @@ -0,0 +1,12 @@ +OBJS-growl = $(macosx_dir)/growl1.0/src/libgrowl.dylib +TARGETS-growl = $(macosx_dir)/growl1.0/libgrowl.dylib + +all:: $(TARGETS-growl) + +$(TARGETS-growl): $(OBJS-growl) + cp $< $@ + +clean:: clean-growl + +clean-growl:: + rm -f $(OBJS-growl) $(TARGETS-growl) Copied: branches/0_97/amsn/utils/macosx/growl1.0/src (from rev 9232, trunk/amsn/utils/macosx/growl1.0/src) Deleted: branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c =================================================================== --- trunk/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c 2008-01-05 01:04:42 UTC (rev 9232) +++ branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c 2008-05-28 22:46:00 UTC (rev 10051) @@ -1,529 +0,0 @@ -// -// CFGrowlAdditions.c -// Growl -// -// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. -// Copyright 2005 The Growl Project. -// - -#include <Carbon/Carbon.h> -#include "CFGrowlAdditions.h" -#include <c.h> -#include <unistd.h> - -static CFStringRef _CFURLAliasDataKey = CFSTR("_CFURLAliasData"); -static CFStringRef _CFURLStringKey = CFSTR("_CFURLString"); -static CFStringRef _CFURLStringTypeKey = CFSTR("_CFURLStringType"); - -//see GrowlApplicationBridge-Carbon.c for rationale of using NSLog. -extern void NSLog(CFStringRef format, ...); - -CFStringRef copyCurrentProcessName(void) { - ProcessSerialNumber PSN = { 0, kCurrentProcess }; - CFStringRef name = NULL; - OSStatus err = CopyProcessName(&PSN, &name); - if (err != noErr) { - NSLog(CFSTR("in copyCurrentProcessName in CFGrowlAdditions: Could not get process name because CopyProcessName returned %li"), (long)err); - name = NULL; - } - return name; -} - -CFURLRef copyCurrentProcessURL(void) { - ProcessSerialNumber psn = { 0, kCurrentProcess }; - FSRef fsref; - CFURLRef URL = NULL; - OSStatus err = GetProcessBundleLocation(&psn, &fsref); - if (err != noErr) { - NSLog(CFSTR("in copyCurrentProcessURL in CFGrowlAdditions: Could not get application location, because GetProcessBundleLocation returned %li\n"), (long)err); - } else { - URL = CFURLCreateFromFSRef(kCFAllocatorDefault, &fsref); - } - return URL; -} -CFStringRef copyCurrentProcessPath(void) { - CFURLRef URL = copyCurrentProcessURL(); - CFStringRef path = CFURLCopyFileSystemPath(URL, kCFURLPOSIXPathStyle); - CFRelease(URL); - return path; -} - -CFURLRef copyTemporaryFolderURL(void) { - FSRef ref; - CFURLRef url = NULL; - - OSStatus err = FSFindFolder(kOnAppropriateDisk, kTemporaryFolderType, kCreateFolder, &ref); - if (err != noErr) - NSLog(CFSTR("in copyTemporaryFolderPath in CFGrowlAdditions: Could not locate temporary folder because FSFindFolder returned %li"), (long)err); - else - url = CFURLCreateFromFSRef(kCFAllocatorDefault, &ref); - - return url; -} -CFStringRef copyTemporaryFolderPath(void) { - CFStringRef path = NULL; - - CFURLRef url = copyTemporaryFolderURL(); - if (url) { - path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); - CFRelease(url); - } - - return path; -} - -CFDictionaryRef createDockDescriptionForURL(CFURLRef url) { - if (!url) { - NSLog(CFSTR("%@"), CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: Cannot copy Dock description for a NULL URL")); - return NULL; - } - - //return NULL for non-file: URLs. - CFStringRef scheme = CFURLCopyScheme(url); - Boolean isFileURL = (CFStringCompare(scheme, CFSTR("file"), kCFCompareCaseInsensitive) == kCFCompareEqualTo); - CFRelease(scheme); - if (!isFileURL) - return NULL; - - CFDictionaryRef dict = NULL; - CFStringRef path = NULL; - CFDataRef aliasData = NULL; - - FSRef fsref; - if (CFURLGetFSRef(url, &fsref)) { - AliasHandle alias = NULL; - OSStatus err = FSNewAlias(/*fromFile*/ NULL, &fsref, &alias); - if (err != noErr) { - NSLog(CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: FSNewAlias for %@ returned %li"), url, (long)err); - } else { - HLock((Handle)alias); - - err = FSCopyAliasInfo(alias, /*targetName*/ NULL, /*volumeName*/ NULL, (CFStringRef *)&path, /*whichInfo*/ NULL, /*info*/ NULL); - if (err != noErr) { - NSLog(CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: FSCopyAliasInfo for %@ returned %li"), url, (long)err); - } - - aliasData = CFDataCreate(kCFAllocatorDefault, (UInt8 *)*alias, GetHandleSize((Handle)alias)); - - HUnlock((Handle)alias); - DisposeHandle((Handle)alias); - } - } - - if (!path) { - path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); - } - - if (path || aliasData) { - CFMutableDictionaryRef temp = CFDictionaryCreateMutable(kCFAllocatorDefault, /*capacity*/ 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - - if (path) { - CFDictionarySetValue(temp, _CFURLStringKey, path); - CFRelease(path); - - int pathStyle = kCFURLPOSIXPathStyle; - CFNumberRef pathStyleNum = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &pathStyle); - CFDictionarySetValue(temp, _CFURLStringTypeKey, pathStyleNum); - CFRelease(pathStyleNum); - } - - if (aliasData) { - CFDictionarySetValue(temp, _CFURLAliasDataKey, aliasData); - CFRelease(aliasData); - } - - dict = temp; - } - - return dict; -} - -CFDataRef copyIconDataForPath(CFStringRef path) { - CFDataRef data = NULL; - - //false is probably safest, and is harmless when the object really is a directory. - CFURLRef URL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path, kCFURLPOSIXPathStyle, /*isDirectory*/ false); - if (URL) { - data = copyIconDataForURL(URL); - CFRelease(URL); - } - - return data; -} -CFDataRef copyIconDataForURL(CFURLRef URL) { - CFDataRef data = NULL; - - if (URL) { - FSRef ref; - if (CFURLGetFSRef(URL, &ref)) { - IconRef icon = NULL; - SInt16 label_noOneCares; - OSStatus err = GetIconRefFromFileInfo(&ref, - /*inFileNameLength*/ 0U, /*inFileName*/ NULL, - kFSCatInfoNone, /*inCatalogInfo*/ NULL, - kIconServicesNoBadgeFlag | kIconServicesUpdateIfNeededFlag, - &icon, - &label_noOneCares); - if (err != noErr) { - NSLog(CFSTR("in copyIconDataForURL in CFGrowlAdditions: could not get icon for %@: GetIconRefFromFileInfo returned %li\n"), URL, (long)err); - } else { - IconFamilyHandle fam = NULL; - err = IconRefToIconFamily(icon, kSelectorAllAvailableData, &fam); - if (err != noErr) { - NSLog(CFSTR("in copyIconDataForURL in CFGrowlAdditions: could not get icon for %@: IconRefToIconFamily returned %li\n"), URL, (long)err); - } else { - HLock((Handle)fam); - data = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)*(Handle)fam, GetHandleSize((Handle)fam)); - HUnlock((Handle)fam); - DisposeHandle((Handle)fam); - } - ReleaseIconRef(icon); - } - } - } - - return data; -} - -URL_TYPE createURLByMakingDirectoryAtURLWithName(URL_TYPE parent, STRING_TYPE name) { - CFURLRef newDirectory = NULL; - - CFAllocatorRef allocator = parent ? CFGetAllocator(parent) : name ? CFGetAllocator(name) : kCFAllocatorDefault; - - if (parent) parent = CFRetain(parent); - else { - char *cwdBytes = alloca(PATH_MAX); - getcwd(cwdBytes, PATH_MAX); - parent = CFURLCreateFromFileSystemRepresentation(allocator, (const unsigned char *)cwdBytes, strlen(cwdBytes), /*isDirectory*/ true); - if (!name) { - newDirectory = parent; - goto end; - } - } - if (!parent) - NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: parent directory URL is NULL (please tell the Growl developers)\n"), parent); - else { - if (name) - name = CFRetain(name); - else { - name = CFURLCopyLastPathComponent(parent); - CFURLRef newParent = CFURLCreateCopyDeletingLastPathComponent(allocator, parent); - CFRelease(parent); - parent = newParent; - } - - if (!name) - NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: name of directory to create is NULL (please tell the Growl developers)\n"), parent); - else { - FSRef parentRef; - if (!CFURLGetFSRef(parent, &parentRef)) - NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: could not create FSRef for parent directory at %@ (please tell the Growl developers)\n"), parent); - else { - FSRef newDirectoryRef; - - struct HFSUniStr255 nameUnicode; - CFRange range = { 0, MIN(CFStringGetLength(name), USHRT_MAX) }; - CFStringGetCharacters(name, range, nameUnicode.unicode); - nameUnicode.length = range.length; - - struct FSRefParam refPB = { - .ref = &parentRef, - .nameLength = nameUnicode.length, - .name = nameUnicode.unicode, - .whichInfo = kFSCatInfoNone, - .catInfo = NULL, - .textEncodingHint = kTextEncodingUnknown, - .newRef = &newDirectoryRef, - }; - - OSStatus err = PBCreateDirectoryUnicodeSync(&refPB); - if (err == dupFNErr) { - //dupFNErr == file (or folder) exists already. this is fine. - err = PBMakeFSRefUnicodeSync(&refPB); - } - if (err == noErr) { - NSLog(CFSTR("PBCreateDirectoryUnicodeSync or PBMakeFSRefUnicodeSync returned %li; calling CFURLCreateFromFSRef"), (long)err); //XXX - newDirectory = CFURLCreateFromFSRef(allocator, &newDirectoryRef); - NSLog(CFSTR("CFURLCreateFromFSRef returned %@"), newDirectory); //XXX - } else - NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: could not create directory '%@' in parent directory at %@: FSCreateDirectoryUnicode returned %li (please tell the Growl developers)"), name, parent, (long)err); - } - - CFRelease(parent); - } //if (name) - CFRelease(name); - } //if (parent) - -end: - return newDirectory; -} - -#ifndef COPYFORK_BUFSIZE -# define COPYFORK_BUFSIZE 5242880U /*5 MiB*/ -#endif - -static OSStatus copyFork(const struct HFSUniStr255 *forkName, const FSRef *srcFile, const FSRef *destDir, const struct HFSUniStr255 *destName, FSRef *outDestFile) { - OSStatus err, closeErr; - struct FSForkIOParam srcPB = { - .ref = srcFile, - .forkNameLength = forkName->length, - .forkName = forkName->unicode, - .permissions = fsRdPerm, - }; - unsigned char debuggingPathBuf[PATH_MAX] = ""; - OSStatus debuggingPathErr; - - err = PBOpenForkSync(&srcPB); - if (err != noErr) { - debuggingPathErr = FSRefMakePath(srcFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); - } else { - FSRef destFile; - - /*the first thing to do is get the name of the destination file, if one - * wasn't provided. - *and while we're at it, we get the catalogue info as well. - */ - struct FSCatalogInfo catInfo; - struct FSRefParam refPB = { - .ref = srcFile, - .whichInfo = kFSCatInfoGettableInfo & kFSCatInfoSettableInfo, - .catInfo = &catInfo, - .spec = NULL, - .parentRef = NULL, - .outName = destName ? NULL : (struct HFSUniStr255 *)(destName = alloca(sizeof(struct HFSUniStr255))), - }; - - err = PBGetCatalogInfoSync(&refPB); - if (err != noErr) { - debuggingPathErr = FSRefMakePath(srcFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBGetCatalogInfoSync (source: %s) returned %li"), debuggingPathBuf, (long)err); - } else { - refPB.ref = destDir; - refPB.nameLength = destName->length; - refPB.name = destName->unicode; - refPB.textEncodingHint = kTextEncodingUnknown; - refPB.newRef = &destFile; - - const char *functionName = "PBMakeFSRefUnicodeSync"; //for error-reporting message - - err = PBMakeFSRefUnicodeSync(&refPB); - if ((err != noErr) && (err != fnfErr)) { - handleMakeFSRefError: - debuggingPathErr = FSRefMakePath(destDir, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for destination directory: FSRefMakePath returned %li)", (long)debuggingPathErr); - - //get filename too - CFStringRef debuggingFilename = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, - destName->unicode, - destName->length, - /*contentsDeallocator*/ kCFAllocatorNull); - if (!debuggingFilename) - debuggingFilename = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, "(could not get filename for destination file: CFStringCreateWithCharactersNoCopy returned NULL)", kCFStringEncodingASCII, /*contentsDeallocator*/ kCFAllocatorNull); - - NSLog(CFSTR("in copyFork in CFGrowlAdditions: %s (destination: %s/%@) returned %li"), functionName, debuggingPathBuf, debuggingFilename, (long)err); - - if (debuggingFilename) CFRelease(debuggingFilename); - } else { - //that file doesn't exist in that folder; create it. - err = PBCreateFileUnicodeSync(&refPB); - if (err == noErr) { - /*make sure the Finder knows about the new file. - *FNNotify returns a status code too, but this isn't an - * essential step, so we just ignore it. - */ - FNNotify(destDir, kFNDirectoryModifiedMessage, kNilOptions); - } else if (err == dupFNErr) { - /*dupFNErr: the file already exists. - *we can safely ignore this error. - */ - err = noErr; - } else { - functionName = "PBCreateFileUnicodeSync"; - goto handleMakeFSRefError; - } - } - } - if (err == noErr) { - if (outDestFile) - memcpy(outDestFile, &destFile, sizeof(destFile)); - - struct FSForkIOParam destPB = { - .ref = &destFile, - .forkNameLength = forkName->length, - .forkName = forkName->unicode, - .permissions = fsWrPerm, - }; - err = PBOpenForkSync(&destPB); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (dest) returned %li"), (long)err); - if (err != noErr) { - debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); - } else { - void *buf = malloc(COPYFORK_BUFSIZE); - if (buf) { - srcPB.buffer = destPB.buffer = buf; - srcPB.requestCount = COPYFORK_BUFSIZE; - while (err == noErr) { - err = PBReadForkSync(&srcPB); - if (err == eofErr) { - err = noErr; - if (srcPB.actualCount == 0) - break; - } - if (err != noErr) { - debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBReadForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); - } else { - destPB.requestCount = srcPB.actualCount; - err = PBWriteForkSync(&destPB); - if (err != noErr) { - debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBWriteForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); - } - } - } - - free(buf); - } - - closeErr = PBCloseForkSync(&destPB); - if (closeErr != noErr) { - debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBCloseForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); - } - if (err == noErr) err = closeErr; - } - } - - closeErr = PBCloseForkSync(&srcPB); - if (closeErr != noErr) { - debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); - if (debuggingPathErr != noErr) - snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); - NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBCloseForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); - } - if (err == noErr) err = closeErr; - } - - return err; -} - -static OSStatus GrowlCopyObjectSync(const FSRef *fileRef, const FSRef *destRef, FSRef *destFileRef) { - OSStatus err; - struct HFSUniStr255 forkName; - struct FSForkIOParam forkPB = { - .ref = fileRef, - .forkIterator = { - .initialize = 0L - }, - .outForkName = &forkName, - }; - - do { - err = PBIterateForksSync(&forkPB); - NSLog(CFSTR("PBIterateForksSync returned %li"), (long)err); - if (err != noErr) { - if (err != errFSNoMoreItems) - NSLog(CFSTR("in GrowlCopyObjectSync in CFGrowlAdditions: PBIterateForksSync returned %li"), (long)err); - } else { - err = copyFork(&forkName, fileRef, destRef, /*destName*/ NULL, /*outDestFile*/ destFileRef); - //copyFork prints its own error messages - } - } while (err == noErr); - if (err == errFSNoMoreItems) err = noErr; - - return err; -} - -CFURLRef createURLByCopyingFileFromURLToDirectoryURL(CFURLRef file, CFURLRef dest) { - CFURLRef destFileURL = NULL; - - FSRef fileRef, destRef, destFileRef; - Boolean gotFileRef = CFURLGetFSRef(file, &fileRef); - Boolean gotDestRef = CFURLGetFSRef(dest, &destRef); - if (!gotFileRef) - NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CFURLGetFSRef failed with source URL %@"), file); - else if (!gotDestRef) - NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CFURLGetFSRef failed with destination URL %@"), dest); - else { - OSStatus err; - - /* - * 10.2 has a problem with weak symbols in frameworks so we use - * MAC_OS_X_VERSION_MIN_REQUIRED >= 10.3. - */ -#if defined(NSAppKitVersionNumber10_3) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3 - if (FSCopyObjectSync) { - err = FSCopyObjectSync(&fileRef, &destRef, /*destName*/ NULL, &destFileRef, kFSFileOperationOverwrite); - } else { -#endif - err = GrowlCopyObjectSync(&fileRef, &destRef, &destFileRef); -#if defined(NSAppKitVersionNumber10_3) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3 - } -#endif - - if (err == noErr) - destFileURL = CFURLCreateFromFSRef(kCFAllocatorDefault, &destFileRef); - else - NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CopyObjectSync returned %li for source URL %@"), (long)err, file); - } - - return destFileURL; -} - -CFPropertyListRef createPropertyListFromURL(CFURLRef file, u_int32_t mutability, CFPropertyListFormat *outFormat, CFStringRef *outErrorString) { - CFPropertyListRef plist = NULL; - - if (!file) - NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: cannot read from a NULL URL")); - else { - CFReadStreamRef stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, file); - if (!stream) - NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not create stream for reading from URL %@"), file); - else { - if (!CFReadStreamOpen(stream)) - NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not open stream for reading from URL %@"), file); - else { - CFPropertyListFormat format; - CFStringRef errorString = NULL; - - plist = CFPropertyListCreateFromStream(kCFAllocatorDefault, - stream, - /*streamLength*/ 0, - mutability, - &format, - &errorString); - if (!plist) - NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not read property list from URL %@ (error string: %@)"), file, errorString); - - if (outFormat) *outFormat = format; - if (errorString) { - if (outErrorString) - *outErrorString = errorString; - else - CFRelease(errorString); - } - - CFReadStreamClose(stream); - } - - CFRelease(stream); - } - } - - return plist; -} Copied: branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c (from rev 9232, trunk/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c) =================================================================== --- branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c (rev 0) +++ branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.c 2008-05-28 22:46:00 UTC (rev 10051) @@ -0,0 +1,529 @@ +// +// CFGrowlAdditions.c +// Growl +// +// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. +// Copyright 2005 The Growl Project. +// + +#include <Carbon/Carbon.h> +#include "CFGrowlAdditions.h" +#include <c.h> +#include <unistd.h> + +static CFStringRef _CFURLAliasDataKey = CFSTR("_CFURLAliasData"); +static CFStringRef _CFURLStringKey = CFSTR("_CFURLString"); +static CFStringRef _CFURLStringTypeKey = CFSTR("_CFURLStringType"); + +//see GrowlApplicationBridge-Carbon.c for rationale of using NSLog. +extern void NSLog(CFStringRef format, ...); + +CFStringRef copyCurrentProcessName(void) { + ProcessSerialNumber PSN = { 0, kCurrentProcess }; + CFStringRef name = NULL; + OSStatus err = CopyProcessName(&PSN, &name); + if (err != noErr) { + NSLog(CFSTR("in copyCurrentProcessName in CFGrowlAdditions: Could not get process name because CopyProcessName returned %li"), (long)err); + name = NULL; + } + return name; +} + +CFURLRef copyCurrentProcessURL(void) { + ProcessSerialNumber psn = { 0, kCurrentProcess }; + FSRef fsref; + CFURLRef URL = NULL; + OSStatus err = GetProcessBundleLocation(&psn, &fsref); + if (err != noErr) { + NSLog(CFSTR("in copyCurrentProcessURL in CFGrowlAdditions: Could not get application location, because GetProcessBundleLocation returned %li\n"), (long)err); + } else { + URL = CFURLCreateFromFSRef(kCFAllocatorDefault, &fsref); + } + return URL; +} +CFStringRef copyCurrentProcessPath(void) { + CFURLRef URL = copyCurrentProcessURL(); + CFStringRef path = CFURLCopyFileSystemPath(URL, kCFURLPOSIXPathStyle); + CFRelease(URL); + return path; +} + +CFURLRef copyTemporaryFolderURL(void) { + FSRef ref; + CFURLRef url = NULL; + + OSStatus err = FSFindFolder(kOnAppropriateDisk, kTemporaryFolderType, kCreateFolder, &ref); + if (err != noErr) + NSLog(CFSTR("in copyTemporaryFolderPath in CFGrowlAdditions: Could not locate temporary folder because FSFindFolder returned %li"), (long)err); + else + url = CFURLCreateFromFSRef(kCFAllocatorDefault, &ref); + + return url; +} +CFStringRef copyTemporaryFolderPath(void) { + CFStringRef path = NULL; + + CFURLRef url = copyTemporaryFolderURL(); + if (url) { + path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); + CFRelease(url); + } + + return path; +} + +CFDictionaryRef createDockDescriptionForURL(CFURLRef url) { + if (!url) { + NSLog(CFSTR("%@"), CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: Cannot copy Dock description for a NULL URL")); + return NULL; + } + + //return NULL for non-file: URLs. + CFStringRef scheme = CFURLCopyScheme(url); + Boolean isFileURL = (CFStringCompare(scheme, CFSTR("file"), kCFCompareCaseInsensitive) == kCFCompareEqualTo); + CFRelease(scheme); + if (!isFileURL) + return NULL; + + CFDictionaryRef dict = NULL; + CFStringRef path = NULL; + CFDataRef aliasData = NULL; + + FSRef fsref; + if (CFURLGetFSRef(url, &fsref)) { + AliasHandle alias = NULL; + OSStatus err = FSNewAlias(/*fromFile*/ NULL, &fsref, &alias); + if (err != noErr) { + NSLog(CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: FSNewAlias for %@ returned %li"), url, (long)err); + } else { + HLock((Handle)alias); + + err = FSCopyAliasInfo(alias, /*targetName*/ NULL, /*volumeName*/ NULL, (CFStringRef *)&path, /*whichInfo*/ NULL, /*info*/ NULL); + if (err != noErr) { + NSLog(CFSTR("in copyDockDescriptionForURL in CFGrowlAdditions: FSCopyAliasInfo for %@ returned %li"), url, (long)err); + } + + aliasData = CFDataCreate(kCFAllocatorDefault, (UInt8 *)*alias, GetHandleSize((Handle)alias)); + + HUnlock((Handle)alias); + DisposeHandle((Handle)alias); + } + } + + if (!path) { + path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); + } + + if (path || aliasData) { + CFMutableDictionaryRef temp = CFDictionaryCreateMutable(kCFAllocatorDefault, /*capacity*/ 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + + if (path) { + CFDictionarySetValue(temp, _CFURLStringKey, path); + CFRelease(path); + + int pathStyle = kCFURLPOSIXPathStyle; + CFNumberRef pathStyleNum = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &pathStyle); + CFDictionarySetValue(temp, _CFURLStringTypeKey, pathStyleNum); + CFRelease(pathStyleNum); + } + + if (aliasData) { + CFDictionarySetValue(temp, _CFURLAliasDataKey, aliasData); + CFRelease(aliasData); + } + + dict = temp; + } + + return dict; +} + +CFDataRef copyIconDataForPath(CFStringRef path) { + CFDataRef data = NULL; + + //false is probably safest, and is harmless when the object really is a directory. + CFURLRef URL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path, kCFURLPOSIXPathStyle, /*isDirectory*/ false); + if (URL) { + data = copyIconDataForURL(URL); + CFRelease(URL); + } + + return data; +} +CFDataRef copyIconDataForURL(CFURLRef URL) { + CFDataRef data = NULL; + + if (URL) { + FSRef ref; + if (CFURLGetFSRef(URL, &ref)) { + IconRef icon = NULL; + SInt16 label_noOneCares; + OSStatus err = GetIconRefFromFileInfo(&ref, + /*inFileNameLength*/ 0U, /*inFileName*/ NULL, + kFSCatInfoNone, /*inCatalogInfo*/ NULL, + kIconServicesNoBadgeFlag | kIconServicesUpdateIfNeededFlag, + &icon, + &label_noOneCares); + if (err != noErr) { + NSLog(CFSTR("in copyIconDataForURL in CFGrowlAdditions: could not get icon for %@: GetIconRefFromFileInfo returned %li\n"), URL, (long)err); + } else { + IconFamilyHandle fam = NULL; + err = IconRefToIconFamily(icon, kSelectorAllAvailableData, &fam); + if (err != noErr) { + NSLog(CFSTR("in copyIconDataForURL in CFGrowlAdditions: could not get icon for %@: IconRefToIconFamily returned %li\n"), URL, (long)err); + } else { + HLock((Handle)fam); + data = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)*(Handle)fam, GetHandleSize((Handle)fam)); + HUnlock((Handle)fam); + DisposeHandle((Handle)fam); + } + ReleaseIconRef(icon); + } + } + } + + return data; +} + +URL_TYPE createURLByMakingDirectoryAtURLWithName(URL_TYPE parent, STRING_TYPE name) { + CFURLRef newDirectory = NULL; + + CFAllocatorRef allocator = parent ? CFGetAllocator(parent) : name ? CFGetAllocator(name) : kCFAllocatorDefault; + + if (parent) parent = CFRetain(parent); + else { + char *cwdBytes = alloca(PATH_MAX); + getcwd(cwdBytes, PATH_MAX); + parent = CFURLCreateFromFileSystemRepresentation(allocator, (const unsigned char *)cwdBytes, strlen(cwdBytes), /*isDirectory*/ true); + if (!name) { + newDirectory = parent; + goto end; + } + } + if (!parent) + NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: parent directory URL is NULL (please tell the Growl developers)\n"), parent); + else { + if (name) + name = CFRetain(name); + else { + name = CFURLCopyLastPathComponent(parent); + CFURLRef newParent = CFURLCreateCopyDeletingLastPathComponent(allocator, parent); + CFRelease(parent); + parent = newParent; + } + + if (!name) + NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: name of directory to create is NULL (please tell the Growl developers)\n"), parent); + else { + FSRef parentRef; + if (!CFURLGetFSRef(parent, &parentRef)) + NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: could not create FSRef for parent directory at %@ (please tell the Growl developers)\n"), parent); + else { + FSRef newDirectoryRef; + + struct HFSUniStr255 nameUnicode; + CFRange range = { 0, MIN(CFStringGetLength(name), USHRT_MAX) }; + CFStringGetCharacters(name, range, nameUnicode.unicode); + nameUnicode.length = range.length; + + struct FSRefParam refPB = { + .ref = &parentRef, + .nameLength = nameUnicode.length, + .name = nameUnicode.unicode, + .whichInfo = kFSCatInfoNone, + .catInfo = NULL, + .textEncodingHint = kTextEncodingUnknown, + .newRef = &newDirectoryRef, + }; + + OSStatus err = PBCreateDirectoryUnicodeSync(&refPB); + if (err == dupFNErr) { + //dupFNErr == file (or folder) exists already. this is fine. + err = PBMakeFSRefUnicodeSync(&refPB); + } + if (err == noErr) { + NSLog(CFSTR("PBCreateDirectoryUnicodeSync or PBMakeFSRefUnicodeSync returned %li; calling CFURLCreateFromFSRef"), (long)err); //XXX + newDirectory = CFURLCreateFromFSRef(allocator, &newDirectoryRef); + NSLog(CFSTR("CFURLCreateFromFSRef returned %@"), newDirectory); //XXX + } else + NSLog(CFSTR("in createURLByMakingDirectoryAtURLWithName in CFGrowlAdditions: could not create directory '%@' in parent directory at %@: FSCreateDirectoryUnicode returned %li (please tell the Growl developers)"), name, parent, (long)err); + } + + CFRelease(parent); + } //if (name) + CFRelease(name); + } //if (parent) + +end: + return newDirectory; +} + +#ifndef COPYFORK_BUFSIZE +# define COPYFORK_BUFSIZE 5242880U /*5 MiB*/ +#endif + +static OSStatus copyFork(const struct HFSUniStr255 *forkName, const FSRef *srcFile, const FSRef *destDir, const struct HFSUniStr255 *destName, FSRef *outDestFile) { + OSStatus err, closeErr; + struct FSForkIOParam srcPB = { + .ref = srcFile, + .forkNameLength = forkName->length, + .forkName = forkName->unicode, + .permissions = fsRdPerm, + }; + unsigned char debuggingPathBuf[PATH_MAX] = ""; + OSStatus debuggingPathErr; + + err = PBOpenForkSync(&srcPB); + if (err != noErr) { + debuggingPathErr = FSRefMakePath(srcFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); + } else { + FSRef destFile; + + /*the first thing to do is get the name of the destination file, if one + * wasn't provided. + *and while we're at it, we get the catalogue info as well. + */ + struct FSCatalogInfo catInfo; + struct FSRefParam refPB = { + .ref = srcFile, + .whichInfo = kFSCatInfoGettableInfo & kFSCatInfoSettableInfo, + .catInfo = &catInfo, + .spec = NULL, + .parentRef = NULL, + .outName = destName ? NULL : (struct HFSUniStr255 *)(destName = alloca(sizeof(struct HFSUniStr255))), + }; + + err = PBGetCatalogInfoSync(&refPB); + if (err != noErr) { + debuggingPathErr = FSRefMakePath(srcFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBGetCatalogInfoSync (source: %s) returned %li"), debuggingPathBuf, (long)err); + } else { + refPB.ref = destDir; + refPB.nameLength = destName->length; + refPB.name = destName->unicode; + refPB.textEncodingHint = kTextEncodingUnknown; + refPB.newRef = &destFile; + + const char *functionName = "PBMakeFSRefUnicodeSync"; //for error-reporting message + + err = PBMakeFSRefUnicodeSync(&refPB); + if ((err != noErr) && (err != fnfErr)) { + handleMakeFSRefError: + debuggingPathErr = FSRefMakePath(destDir, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for destination directory: FSRefMakePath returned %li)", (long)debuggingPathErr); + + //get filename too + CFStringRef debuggingFilename = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, + destName->unicode, + destName->length, + /*contentsDeallocator*/ kCFAllocatorNull); + if (!debuggingFilename) + debuggingFilename = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, "(could not get filename for destination file: CFStringCreateWithCharactersNoCopy returned NULL)", kCFStringEncodingASCII, /*contentsDeallocator*/ kCFAllocatorNull); + + NSLog(CFSTR("in copyFork in CFGrowlAdditions: %s (destination: %s/%@) returned %li"), functionName, debuggingPathBuf, debuggingFilename, (long)err); + + if (debuggingFilename) CFRelease(debuggingFilename); + } else { + //that file doesn't exist in that folder; create it. + err = PBCreateFileUnicodeSync(&refPB); + if (err == noErr) { + /*make sure the Finder knows about the new file. + *FNNotify returns a status code too, but this isn't an + * essential step, so we just ignore it. + */ + FNNotify(destDir, kFNDirectoryModifiedMessage, kNilOptions); + } else if (err == dupFNErr) { + /*dupFNErr: the file already exists. + *we can safely ignore this error. + */ + err = noErr; + } else { + functionName = "PBCreateFileUnicodeSync"; + goto handleMakeFSRefError; + } + } + } + if (err == noErr) { + if (outDestFile) + memcpy(outDestFile, &destFile, sizeof(destFile)); + + struct FSForkIOParam destPB = { + .ref = &destFile, + .forkNameLength = forkName->length, + .forkName = forkName->unicode, + .permissions = fsWrPerm, + }; + err = PBOpenForkSync(&destPB); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (dest) returned %li"), (long)err); + if (err != noErr) { + debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBOpenForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); + } else { + void *buf = malloc(COPYFORK_BUFSIZE); + if (buf) { + srcPB.buffer = destPB.buffer = buf; + srcPB.requestCount = COPYFORK_BUFSIZE; + while (err == noErr) { + err = PBReadForkSync(&srcPB); + if (err == eofErr) { + err = noErr; + if (srcPB.actualCount == 0) + break; + } + if (err != noErr) { + debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBReadForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); + } else { + destPB.requestCount = srcPB.actualCount; + err = PBWriteForkSync(&destPB); + if (err != noErr) { + debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBWriteForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); + } + } + } + + free(buf); + } + + closeErr = PBCloseForkSync(&destPB); + if (closeErr != noErr) { + debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for dest file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBCloseForkSync (destination: %s) returned %li"), debuggingPathBuf, (long)err); + } + if (err == noErr) err = closeErr; + } + } + + closeErr = PBCloseForkSync(&srcPB); + if (closeErr != noErr) { + debuggingPathErr = FSRefMakePath(&destFile, debuggingPathBuf, PATH_MAX); + if (debuggingPathErr != noErr) + snprintf((char *)debuggingPathBuf, PATH_MAX, "(could not get path for source file: FSRefMakePath returned %li)", (long)debuggingPathErr); + NSLog(CFSTR("in copyFork in CFGrowlAdditions: PBCloseForkSync (source: %s) returned %li"), debuggingPathBuf, (long)err); + } + if (err == noErr) err = closeErr; + } + + return err; +} + +static OSStatus GrowlCopyObjectSync(const FSRef *fileRef, const FSRef *destRef, FSRef *destFileRef) { + OSStatus err; + struct HFSUniStr255 forkName; + struct FSForkIOParam forkPB = { + .ref = fileRef, + .forkIterator = { + .initialize = 0L + }, + .outForkName = &forkName, + }; + + do { + err = PBIterateForksSync(&forkPB); + NSLog(CFSTR("PBIterateForksSync returned %li"), (long)err); + if (err != noErr) { + if (err != errFSNoMoreItems) + NSLog(CFSTR("in GrowlCopyObjectSync in CFGrowlAdditions: PBIterateForksSync returned %li"), (long)err); + } else { + err = copyFork(&forkName, fileRef, destRef, /*destName*/ NULL, /*outDestFile*/ destFileRef); + //copyFork prints its own error messages + } + } while (err == noErr); + if (err == errFSNoMoreItems) err = noErr; + + return err; +} + +CFURLRef createURLByCopyingFileFromURLToDirectoryURL(CFURLRef file, CFURLRef dest) { + CFURLRef destFileURL = NULL; + + FSRef fileRef, destRef, destFileRef; + Boolean gotFileRef = CFURLGetFSRef(file, &fileRef); + Boolean gotDestRef = CFURLGetFSRef(dest, &destRef); + if (!gotFileRef) + NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CFURLGetFSRef failed with source URL %@"), file); + else if (!gotDestRef) + NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CFURLGetFSRef failed with destination URL %@"), dest); + else { + OSStatus err; + + /* + * 10.2 has a problem with weak symbols in frameworks so we use + * MAC_OS_X_VERSION_MIN_REQUIRED >= 10.3. + */ +#if defined(NSAppKitVersionNumber10_3) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3 + if (FSCopyObjectSync) { + err = FSCopyObjectSync(&fileRef, &destRef, /*destName*/ NULL, &destFileRef, kFSFileOperationOverwrite); + } else { +#endif + err = GrowlCopyObjectSync(&fileRef, &destRef, &destFileRef); +#if defined(NSAppKitVersionNumber10_3) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3 + } +#endif + + if (err == noErr) + destFileURL = CFURLCreateFromFSRef(kCFAllocatorDefault, &destFileRef); + else + NSLog(CFSTR("in createURLByCopyingFileFromURLToDirectoryURL in CFGrowlAdditions: CopyObjectSync returned %li for source URL %@"), (long)err, file); + } + + return destFileURL; +} + +CFPropertyListRef createPropertyListFromURL(CFURLRef file, u_int32_t mutability, CFPropertyListFormat *outFormat, CFStringRef *outErrorString) { + CFPropertyListRef plist = NULL; + + if (!file) + NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: cannot read from a NULL URL")); + else { + CFReadStreamRef stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, file); + if (!stream) + NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not create stream for reading from URL %@"), file); + else { + if (!CFReadStreamOpen(stream)) + NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not open stream for reading from URL %@"), file); + else { + CFPropertyListFormat format; + CFStringRef errorString = NULL; + + plist = CFPropertyListCreateFromStream(kCFAllocatorDefault, + stream, + /*streamLength*/ 0, + mutability, + &format, + &errorString); + if (!plist) + NSLog(CFSTR("in createPropertyListFromURL in CFGrowlAdditions: could not read property list from URL %@ (error string: %@)"), file, errorString); + + if (outFormat) *outFormat = format; + if (errorString) { + if (outErrorString) + *outErrorString = errorString; + else + CFRelease(errorString); + } + + CFReadStreamClose(stream); + } + + CFRelease(stream); + } + } + + return plist; +} Deleted: branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h =================================================================== --- trunk/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h 2008-01-05 01:04:42 UTC (rev 9232) +++ branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h 2008-05-28 22:46:00 UTC (rev 10051) @@ -1,77 +0,0 @@ -// -// CFGrowlAdditions.h -// Growl -// -// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. -// Copyright 2005 The Growl Project. -// - -#ifdef __OBJC__ -# define DATA_TYPE NSData * -# define DICTIONARY_TYPE NSDictionary * -# define STRING_TYPE NSString * -# define ARRAY_TYPE NSArray * -# define URL_TYPE NSURL * -# define PLIST_TYPE NSObject * -#else -# define DATA_TYPE CFDataRef -# define DICTIONARY_TYPE CFDictionaryRef -# define STRING_TYPE CFStringRef -# define ARRAY_TYPE CFArrayRef -# define URL_TYPE CFURLRef -# define PLIST_TYPE CFPropertyListRef -#endif - -STRING_TYPE copyCurrentProcessName(void); -URL_TYPE copyCurrentProcessURL(void); -STRING_TYPE copyCurrentProcessPath(void); - -URL_TYPE copyTemporaryFolderURL(void); -STRING_TYPE copyTemporaryFolderPath(void); - -DICTIONARY_TYPE createDockDescriptionForURL(URL_TYPE url); - -/* @function copyIconDataForPath - * @param path The POSIX path to the file or folder whose icon you want. - * @result The icon data, in IconFamily format (same as used in the 'icns' resource and in .icns files). You are responsible for releasing this object. - */ -DATA_TYPE copyIconDataForPath(STRING_TYPE path); -/* @function copyIconDataForURL - * @param URL The URL to the file or folder whose icon you want. - * @result The icon data, in IconFamily format (same as used in the 'icns' resource and in .icns files). You are responsible for releasing this object. - */ -DATA_TYPE copyIconDataForURL(URL_TYPE URL); - -/* @function createURLByMakingDirectoryAtURLWithName - * @abstract Create a directory. - * @discussion This function has a useful side effect: if you pass - * <code>NULL</code> for both parameters, this function will act basically as - * CFURL version of <code>getcwd</code>(3). - * - * Also, for CF clients: the allocator used to create the returned URL will - * be the allocator for the parent URL, the allocator for the name string, or - * the default allocator, in that order of preference. - * @param parent The directory in which to create the new directory. If this is <code>NULL</code>, the current working directory (as returned by <code>getcwd</code>(3)) will be used. - * @param name The name of the directory you want to create. If this is <code>NULL</code>, the directory specified by the URL will be created. - * @result The URL for the directory if it was successfully created (in which case, you are responsible for releasing this object); else, <code>NULL</code>. - */ -URL_TYPE createURLByMakingDirectoryAtURLWithName(URL_TYPE parent, STRING_TYPE name); - -/* @function createURLByCopyingFileFromURLToDirectoryURL - * @param file The file to copy. - * @param dest The folder to copy it to. - * @result The copy. You are responsible for releasing this object. - */ -URL_TYPE createURLByCopyingFileFromURLToDirectoryURL(URL_TYPE file, URL_TYPE dest); - -/* @function createPropertyListFromURL - * @abstract Reads a property list from the contents of an URL. - * @discussion Creates a property list from the data at an URL (for example, a - * file URL), and returns it. - * @param file The file to read. - * @param mutability A mutability-option constant indicating whether the property list (and possibly its contents) should be mutable. - * @param outFormat If the property list is read successfully, this will point to the format of the property list. You may pass NULL if you are not interested in this information. If the property list is not read successfully, the value at this pointer will be left unchanged. - * @param outErrorString If an error occurs, this will point to a string (which you are responsible for releasing) describing the error. You may pass NULL if you are not interested in this information. If no error occurs, the value at this pointer will be left unchanged. - * @result The property list. You are responsible for releasing this object. - */ -PLIST_TYPE createPropertyListFromURL(URL_TYPE file, u_int32_t mutability, CFPropertyListFormat *outFormat, STRING_TYPE *outErrorString); Copied: branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h (from rev 9232, trunk/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h) =================================================================== --- branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h (rev 0) +++ branches/0_97/amsn/utils/macosx/growl1.0/src/CFGrowlAdditions.h 2008-05-28 22:46:00 UTC (rev 10051) @@ -0,0 +1,77 @@ +// +// CFGrowlAdditions.h +// Growl +// +// Created by Mac-arena the Bored Zo on Wed Jun 18 2004. +// Copyright 2005 The Growl Project. +// + +#ifdef __OBJC__ +# define DATA_TYPE NSData * +# define DICTIONARY_TYPE NSDictionary * +# define STRING_TYPE NSString * +# define ARRAY_TYPE NSArray * +# define URL_TYPE NSURL * +# define PLIST_TYPE NSObject * +#else +# define DATA_TYPE CFDataRef +# define DICTIONARY_TYPE CFDictionaryRef +# define STRING_TYPE CFStringRef +# define ARRAY_TYPE CFArrayRef +# define URL_TYPE CFURLRef +# define PLIST_TYPE CFPropertyListRef +#endif + +STRING_TYPE copyCurrentProcessName(void); +URL_TYPE copyCurrentProcessURL(void); +STRING_TYPE copyCurrentProcessPath(void); + +URL_TYPE copyTemporaryFolderURL(void); +STRING_TYPE copyTemporaryFolderPath(void); + +DICTIONARY_TYPE createDockDescriptionForURL(URL_TYPE url); + +/* @function copyIconDataForPath + * @param path The POSIX path to the file or folder whose icon you want. + * @result The icon data, in IconFamily format (same as used in the 'icns' resource and in .icns files). You are responsible for releasing this object. + */ +DATA_TYPE copyIconDataForPath(STRING_TYPE path); +/* @function copyIconDataForURL + * @param URL The URL to the file or folder whose icon you want. + * @result The icon data, in IconFamily format (same as used in the 'icns' resource and in .icns files). You are responsible for releasing this object. + */ +DATA_TYPE copyIconDataForURL(URL_TYPE URL); + +/* @function createURLByMakingDirectoryAtURLWithName + * @abstract Create a directory. + * @discussion This function has a useful side effect: if you pass + * <code>NULL</code> for both parameters, this function will act basically as + * CFURL version of <code>getcwd</code>(3). + * + * Also, for CF clients: the allocator used to create the returned URL will + * be the allocator for the parent URL, the allocator for the name string, or + * the default allocator, in that order of preference. + * @param parent The directory in which to create the new directory. If this is <code>NULL</code>, the current working directory (as returned by <code>getcwd</code>(3)) will be used. + * @param name The name of the directory you want to create. If this is <code>NULL</code>, the directory specified by the URL will be created. + * @result The URL for the directory if it was successfully created (in which case, you are responsible for releasing this object); else, <code>NULL</code>. + */ +URL_TYPE createURLByMakingDirectoryAtURLWithName(URL_TYPE parent, STRING_TYPE name); + +/* @function createURLByCopyingFileFromURLToDirectoryURL + * @param file The file to copy. + * @param dest The folder to copy it to. + * @result The copy. You are responsible for releasing this object. + */ +URL_TYPE createURLByCopyingFileFromURLToDirectoryURL(URL_TYPE file, URL_TYPE dest); + +/* @function createPropertyListFromURL + * @abstract Reads a property list from the contents of an URL. + * @discussion Creates a property list from the data at an URL (for example, a + * file URL), and returns it. + * @param file The file to read. + * @param mutability A mutability-option constant indicating whether the property list (and possibly its contents) should be mutable. + * @param outFormat If the property list is read successfully, this will point to the format of the property list. You may pass NULL if you are not interested in this information. If the property list is not read successfully, the value at this pointer will be left unchanged. + * @param outErrorString If an error occurs, this will point to a string (which you are responsible for releasing) describing the error. You may pass NULL if you are not interested in this information. If no error occurs, the value at this pointer will be left unchanged. + * @result The property list. You are responsible for releasing this object. + */ +PLIST_TYPE createPropertyListFromURL(URL_TYPE file, u_int32_t mutability, CFPropertyListFormat *outFormat, STRING_TYPE *outErrorString); Deleted: branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.h =================================================================== --- trunk/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.h 2008-01-05 01:04:42 UTC (rev 9232) +++ branches/0_97/amsn/utils/macosx/growl1.0/src/GrowlApplicationBridge.h 2008-05-28 22:46:00 UTC (rev 10051) @@ -1,556 +0,0 @@ -// -// GrowlApplicationBridge.h -// Growl -// -// Created by Evan Schoenberg on Wed Jun 16 2004. -// Copyright 2004-2005 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 <Foundation/Foundation.h> -#import "GrowlDefines.h" - -//Forward declarations -@protocol GrowlApplicationBridgeDelegate; - -/*! - * @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER - * @discussion The bundle identifier for the Growl prefpane. - */ -#define GROWL_PREFPANE_BUNDLE_IDENTIFIER @"com.growl.prefpanel" - -/*! - * @defined GROWL_PREFPANE_NAME - * @discussion The file name of the Growl prefpane. - */ -#define GROWL_PREFPANE_NAME @"Growl.prefPane" - -//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<GrowlApplicationBridgeDelegate> *)inDelegate; - -/*! - * @method growlDelegate - * @abstract Return the object responsible for providing and receiving Growl information. - * @discussion See setGrowlDelegate: for details. - * @result The Growl delegate. - */ -+ (NSObject<GrowlApplicationBridgeDelegate> *) 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 - * <code>nil</code> (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 <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, 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 <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> 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 - * <code>nil</code> (or 0 or NO as appropriate) to accept default ... [truncated message content] |