NAME

Mac::Finder::DSStore - Read and write Macintosh Finder DS_Store files

DESCRIPTION

Mac::Finder::DSStore provides a handful of functions for reading and writing the desktop database files created by the Macintosh Finder.

FUNCTIONS

Many functions take a $store argument which is the opened file as an instance of Mac::Finder::DSStore::BuddyAllocator, or a $block argument which is a specific block of the file as an instance of Mac::Finder::DSStore::BuddyAllocator::Block.

@records = &Mac::Finder::DSStore::getDSDBEntries($store[, $callback])

Retrieves the "superblock" pointed to by the DSDB entry in the store's table of contents, and traverses the B-tree it points to, returning a list of the records in the tree. Alternately, you can supply a callback which will be invoked for each record, and getDSDBEntries will return an empty list.

&Mac::Finder::DSStore::putDSDBEntries($store, $arrayref)

$arrayref must contain a correctly ordered list of Mac::Finder::DSStore::Entry objects. They will be evenly organized into a B-tree structure and written to the $store. If there is an existing tree of records in the file already, it will be deallocated.

This function does not flush the allocator's information back to the file.

&Mac::Finder::DSStore::writeDSDBEntries($file, @entries)

A convenience function which sorts a list of entries and writes them to the specified file using putDSDBEntries, then flushes the allocator's data structures to disk. $file may be a filename or an open file handle. The store object is returned, but you don't need to do anything else with it.

&Mac::Finder::DSStore::makeEntries($filename, [ what => value ... ])

makeEntries encapsulates some information about the format of individual records in the DS_Store file. It returns a list of records constructed with the given filename and with the information specified in the rest of its args. Most args come in pairs, a name and a value, so makeEntries kind of looks like it takes a hash. Some names take no value and some could take several. Some produce more than one record as a result.

See the output of the examples/dsstore_dump.pl script for an example of how to use this, and check the source code for a list of the formats it accepts.

This function might change in the future.

Mac::Finder::DSStore::Entry

This class holds the individual records from the database. Each record contains a filename (in some cases, "." to refer to the containing directory), a 4-character record type, and a value. The value is one of a few concrete types, according to the record type.

$entry = ...::Entry->new($filename, $typecode)

Creates a new entry with no value. The concrete type is inferred from the record type code.

$entry->filename

Gets the filename of an entry.

$entry->strucId

Gets the record type of this entry, as a four-character string, indicating what aspect of the file the entry describes.

$entry->value([$value])

Gets or sets the value of an entry.

If the concrete type is blob or type, the value is interpreted as a byte string; if it is ustr, as a character string. If the concrete type is long, shor, comp, dutc, or bool, then the value should be an integer.

$entry->cmp($other)

Returns -1, 0, or 1 depending on the relative ordering of the two entries, according to (a guess at) the record ordering used by the store's B-tree.

SEE ALSO

See Mac::Finder::DSStore::Format for more detailed information on the record types found in a DS_Store file.

See Mac::Finder::DSStore::BuddyAllocator for the low-level organization of the DS_Store file.

AUTHOR

Copyright 2008 by Wim Lewis <wiml@hhhh.org>.

Some information is from Mark Mentovai via the Mozilla project. Thanks also to Martin Baker for bug reports.