[futurebasic] Bookmarks - The new Alias Manager

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : December 2010 : Group Archive : Group : All Groups

From: Bernie <fblist.bw@...>
Date: Fri, 10 Dec 2010 11:48:28 +0000
Although the Alias Manager is not yet flagged as legacy, obsolete or deprecated, looks like its replacement is [going to be] bookmarks. The following creates bookmark data from a chosen file and stores it in app prefs. File menus are Choose File & Resolve Bookmark.
'---------------
/*
   Bookmark demo 1

   Bernie Wylde 20111208
*/

if ( system(_sysVers) < 1060 ) then shutdown "Requires OS X 10.6 or later"

// CFURL.h
#if ndef _DEFINEDINCARBON

#define CFURLBookmarkCreationOptions as CFOptionFlags
#define CFURLBookmarkFileCreationOptions as CFOptionFlags
begin enum
_kCFURLBookmarkCreationPreferFileIDResolutionMask = ( 1 << 8 )
_kCFURLBookmarkCreationMinimalBookmarkMask = ( 1 << 9 )
_kCFURLBookmarkCreationSuitableForBookmarkFile = ( 1 << 10 )
end enum

#define CFURLBookmarkResolutionOptions as CFOptionFlags
begin enum
_kCFBookmarkResolutionWithoutUIMask = ( 1 << 8 )
_kCFBookmarkResolutionWithoutMountingMask = ( 1 << 9 )
end enum

toolbox fn CFURLCreateByResolvingBookmarkData( CFAllocatorRef allocator, CFDataRef bookmark, CFURLBookmarkResolutionOptions options, CFURLRef relativeToURL, CFArrayRef resourcePropertiesToInclude, Boolean* isStale, CFErrorRef* error ) = CFURLRef
toolbox fn CFURLCreateResourcePropertiesForKeysFromBookmarkData( CFAllocatorRef allocator, CFArrayRef resourcePropertiesToReturn, CFDataRef bookmark ) = CFDictionaryRef
toolbox fn CFURLCreateResourcePropertyForKeyFromBookmarkData( CFAllocatorRef allocator, CFStringRef resourcePropertyKey, CFDataRef bookmark ) = CFTypeRef
toolbox fn CFURLCreateBookmarkData( CFAllocatorRef allocator, CFURLRef url, CFURLBookmarkCreationOptions options, CFArrayRef resourcePropertiesToInclude, CFURLRef relativeToURL, CFErrorRef *error ) = CFDataRef
toolbox fn CFURLCreateBookmarkDataFromAliasRecord( CFAllocatorRef allocatorRef, CFDataRef aliasRecordDataRef ) = CFDataRef
toolbox fn CFURLCreateBookmarkDataFromFile( CFAllocatorRef allocator, CFURLRef fileURL, CFErrorRef *errorRef ) = CFDataRef
toolbox fn CFURLWriteBookmarkDataToFile( CFDataRef bookmarkRef, CFURLRef fileURL, CFURLBookmarkFileCreationOptions options, CFErrorRef *errorRef ) = Boolean

#endif// ndef _DEFINEDINCARBON

include "Util_FileDirectory.incl"
include "Util_CFPrefs.incl"

_mFile = 1
_iChooseFile = 1
_iResolveBookmark = 2

_mainWnd = 1

_kMyBookmarkPrefsKey$ = "MyBookmark"

local fn ResolveBookmark
'~'1
dim as CFDataRef     bookmarkData
dim as CFURLRef      url
dim as CFStringRef   path
dim as Str255        s

bookmarkData = fn CFPrefsCopyAppValue( _kMyBookmarkPrefsKey$ )
long if ( bookmarkData )
url = fn CFURLCreateByResolvingBookmarkData( _kCFAllocatorDefault, bookmarkData, 0, 0, 0, #0, #0 )
long if ( url )

// do something with url

fn FD_CFURLCreatePath( url, @path )
fn CFStringGetPascalString( path, @s, 256, _kCFStringEncodingMacRoman )
print "Bookmark resolved: "s
CFRelease( path )
CFRelease( url )
xelse
print "Unable to resolve bookmark"
end if
CFRelease( bookmarkData )
xelse
print "No bookmark data"
end if
end fn

local fn MyChooseFileHandler( reply as ^NavReplyRecord, userData as pointer )
'~'1
dim as CFURLRef    url
dim as CFDataRef   bookmarkData

NavDialog_CopyItemCFURLRef( #reply, 1, @url )
bookmarkData = fn CFURLCreateBookmarkData( _kCFAllocatorDefault, url, _kCFURLBookmarkCreationMinimalBookmarkMask, 0, 0, #0 )
long if ( bookmarkData )
fn CFPrefsSetAppValue( _kMyBookmarkPrefsKey$, bookmarkData )
CFRelease( bookmarkData )
fn CFPrefsAppSynchronize()
window _mainWnd
print "Bookmark stored"
end if
end fn

local fn HandleMenu
'~'1
select ( menu( _itemID ) )
case _iChooseFile      : fn NavDialog( _kNavDialogChooseFile + _kNavDialogSheet, "Choose file", "", @fn MyChooseFileHandler, 0 )
case _iResolveBookmark : fn ResolveBookmark()
end select
end fn

menu _mFile, 0, _enable, "File"
menu _mFile, _iChooseFile, _enable, "Choose File…/O"
menu _mFile, _iResolveBookmark, _enable, "Resolve Bookmark/R"

on menu fn HandleMenu

window _mainWnd, "Bookmark demo 1", (0,0)-(400,300)
fn ResolveBookmark()

RunApplicationEventLoop()
'---------------

I have a second demo which uses bookmark calls to programatically create an alias file. If anyone's interested, I can post that too.

Bernie