fun with resources
[email protected] (D Ackerman) Mon, 28 Jan 2002 22:57:33 -0500
| Newsgroups | perl.macperl.toolbox |
|---|---|
| Message-ID | <a05010400b87bcb8259fb@[140.247.42.110]> |
--============_-1199845839==_============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" I wrote the following as an exercise to learn a bit about the resource manager. Though perhaps not super elegant, it does seem kind of fun, so I figured I would post it. Feedback on (mis)use of the Resource manager would be welcome if anyone in the know see's something glaringly wrong! Thanks, Dave ############################################################################## # # File: Random startup pict.pl # # Author(s): David Ackerman <[email protected]> # # # Source: Started anew. # # Notes: Script for picking a new StartupScreen each time the machine is started. # Save as a dropplet and place in the Startup Items Folder. If a StartupScreen # already exists during the first run, it will be moved to ":Desktop Folder:Old Startup Pict:". # On all future runs, the StartupPict file in the System Folder will be deleted and replaced # with a new 'PICT" Resource file. Preferences are set during the first run as well. You # will be prompted to select a folder containing your PICT files (or file containing 'PICT' # resources), and asked if you want to see each new selection when it is copied to the System # Folder. If you wish to change the preferences later, locate the file named "Random Startup # Pict Preferences" in the Preferences Folder and delete it. # # Change History: # 1/25/02 [3:04 PM] Source started # ############################################################################# __BEGIN__ #!perl -w use strict; use v5.6.1; use Mac::Memory; use Mac::Files; use Mac::Resources; use Mac::Windows; use Mac::QuickDraw; use Mac::Navigation; use Storable; use constant PICT_LOC => 0; use constant SHOW_AT_STARTUP => 1; use constant TYPE => 1; use constant smRoman => 0; use vars qw (@prefs $system_path); $system_path = FindFolder(kOnSystemDisk, kSystemFolderType); my $screen_rect = GetMainDevice()->gdRect; my ($pict, $r_handle, $res) = ""; read_prefs(); my @files = get_file_list(); my $num = rand (scalar(@files)); $num = int($num); my $new_pict = $prefs[PICT_LOC] . $files[$num]; if (-e ($system_path . "StartupScreen")) { FSpDelete ($system_path . "StartupScreen"); if ($^E) { show_os_error("Trouble deleting old StartupPict!"); die($!); } } MacPerl::MakeFSSpec($system_path); MacPerl::MakeFSSpec($new_pict); my @info = MacPerl::GetFileInfo($new_pict); if ($info[TYPE] eq 'PICT') { my $cat_info = FSpGetCatInfo ($new_pict); my $data_fork_size = $cat_info->ioFlLgLen; open (IN, "<$new_pict") or die ($!); seek (IN, 512, 0); read (IN, my $data, $data_fork_size); close (IN); if (length($data) == ($data_fork_size - 512)) { $r_handle = new Handle($data); } else { show_os_error("Error occurred reading PICT data"); die ($!); } } else { #get a resource $res = FSpOpenResFile($new_pict, 1); if (defined($res)) { my $num_picts = Count1Resources 'PICT'; my $r_num; if (defined($num_picts) && (!$^E)) { $r_num = rand ($num_picts); $r_num = int ($r_num); $r_num++; $r_handle = Get1IndResource ('PICT', $r_num); if (defined ($r_handle)) { DetachResource ($r_handle); } else { show_os_error ("Unable to get 'PICT' Resource Handle from \"$new_pict\""); } } else { show_os_error ("No 'PICT' Resources found in \"$new_pict\""); } CloseResFile ($res); } else { show_os_error("Error occured opening resource fork of \"$new_pict\""); die($!); } } my $f = $system_path . "StartupScreen"; MacPerl::MakeFSSpec($f); FSpCreateResFile ($f, 'RSED', 'rsrc', smRoman); unless ($^E) { $res = FSpOpenResFile($f, 3); if (defined($res)) { AddResource $r_handle, 'PICT', 0, '' if defined($r_handle); unless ($^E or (!defined($r_handle))) { WriteResource $r_handle; ReleaseResource $r_handle if defined ($r_handle); } else { show_os_error("Error occured adding 'PICT' Resource to \"$f\""); } } else { show_os_error("Unable to open Resource Fork of \"$f\""); } } else { show_os_error("Error occured creating \"$f\""); } if ($prefs[SHOW_AT_STARTUP]) { my $pict = GetPicture 0; if (defined($pict)) { my $window_rect = $pict->picFrame; my $window_pos = Mac::QuickDraw::OffsetRect($window_rect, $screen_rect->left + ($screen_rect->right - $screen_rect->left - $window_rect->right) / 2, $screen_rect->top + ($screen_rect->bottom - $screen_rect->top - $window_rect->bottom) / 3); my $w = MacColorWindow->new($window_pos, "", 1, dBoxProc, 1); SetPort($w->window); DrawPicture $pict, $pict->picFrame; sleep (2); $w->dispose if defined ($w->window); } else { show_os_error("Error occured getting StartupScreen 'PICT' Resource"); } } CloseResFile ($res); MacPerl::Quit (2); sub read_prefs { my $pref_path = FindFolder(kOnSystemDisk, kPreferencesFolderType); $pref_path .= "Random Startup Pict Preferences"; if (-e $pref_path) { my $r = retrieve($pref_path); @prefs = @$r; } else { #set prefs $prefs[PICT_LOC] = get_folder("Locate source folder of 'PICT' files"); $prefs[SHOW_AT_STARTUP] = MacPerl::Answer("Show next startup pict?", "Show", "Surprise me"); if (-e $system_path . "StartupScreen") { my $target = FindFolder(kOnSystemDisk, kDesktopFolderType); mkdir ($target . "Old Startup Pict"); FSpCatMove ($system_path . "StartupScreen", $target . "Old Startup Pict"); if ($^E) { show_os_error("Trouble moving old StartupScreen!"); die($!, " If \"Old Startup Pict:StartupScreen\" exists on the desktop try moving or deleting and run script again!"); } else { MacPerl::Answer("Previous StartupScreen found in System folder, moved to desktop!", "OK"); } } store (\@prefs, $pref_path); } } sub get_file_list { opendir (D, $prefs[PICT_LOC]) or die ($!); my @file_list = readdir (D); closedir (D); #remove invalid files/folders from list for (my $i = 0; $i < scalar(@file_list); $i++) { my $f = $prefs[PICT_LOC] . $file_list[$i]; if ((-d ($f)) || (-l ($f))) { splice (@file_list, $i, 1); $i--; } else { my @info = MacPerl::GetFileInfo($f); if ($info[TYPE] ne 'PICT') { #check for pict resource MacPerl::MakeFSSpec($f); my $rfd = FSpOpenResFile($f, 1); if (defined($rfd)) { my $num_picts = Count1Resources 'PICT'; if (defined($num_picts) || (!$^E)) { if ($num_picts < 1) { splice (@file_list, $i, 1); $i--; } } else { show_os_error("Error occured while validating file list!"); } CloseResFile ($rfd); } else { show_os_error("Error occured opening resource fork of \"$f\""); } } } } return @file_list; } sub show_os_error { my $error = shift; my $e; if ($^E) { if (defined($error)) { $e = $error; } $error = $^E . "\n\n$e"; } elsif (!defined($error)) { $error = 'An unknown error has occured!'; } MacPerl::Answer($error); } sub get_folder { my $message = shift; my $options = NavGetDefaultDialogOptions; $options->message($message); my $reply = NavChooseFolder (FindFolder(kOnSystemDisk, kDesktopFolderType), $options); if (defined($reply)) { my $file = $reply->file(1); NavDisposeReply $reply; return $file; } else { return undef; } } __END__ --============_-1199845839==_============ Content-Id: <a05010400b87bcb8259fb@[140.247.42.110].0.0> Content-Type: multipart/appledouble; boundary="============_-1199845839==_D============" --============_-1199845839==_D============ Content-Transfer-Encoding: base64 Content-Type: application/applefile; name="%Random_startup_pict.pl" Content-Disposition: attachment; filename="%Random_startup_pict.pl" ; modification-date="Mon, 28 Jan 2002 22:49:41 -0500" AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAADAAAASgAAABYAAAAJAAAAYAAAACAA AAAIAAAAgAAAABAAAAACAAAAkAAABa5SYW5kb20gc3RhcnR1cCBwaWN0LnBsVEVYVFIq Y2gBAADcA8AAAAAAAAAAAAAAAAAAAAAAAAAD5tX6A+iSBUttDAAD6JPhAAABAAAABWgA AARoAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACU1v bmFjbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYABAB0AZwDCgUAAHQBnAMKBQC4 e4YFAAAEtwAABLcAAAAAAQAAAAQYUipjaACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQ291 cmllcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoA AAAECUhlbHZldGljYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAxDb25maWRlbnRpYWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAEAAAEAAAEAAACAAAAAgAAAAIAAAACAAAAAAAAAAQEBAQEBAAAAAAMAUAEA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AQAAAAVoAAAEaAAAAEZTT1JUA5IAgAAcAEYAAUJCU1QAAAASTVBTUgAAAB4AgP//AAAA TA0NbZgD7f//AAAAAA0NbXQ= --============_-1199845839==_D============ Content-Type: application/octet-stream; name="Random_startup_pict.pl" Content-Disposition: attachment; filename="Random_startup_pict.pl" Content-Transfer-Encoding: base64 ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0gIw0gIwlGaWxlOgkJCVJhbmRvbSBz dGFydHVwIHBpY3QucGwNICMNICMJQXV0aG9yKHMpOgkJRGF2aWQgQWNrZXJtYW4gPGRh Y2tlcm1AZmFzLmhhcnZhcmQuZWR1Pg0gIw0gIw0gIwlTb3VyY2U6CQkJU3RhcnRlZCBh bmV3Lg0gIw0gIwlOb3RlczoJCQlTY3JpcHQgZm9yIHBpY2tpbmcgYSBuZXcgU3RhcnR1 cFNjcmVlbiBlYWNoIHRpbWUgdGhlIG1hY2hpbmUgaXMgc3RhcnRlZC4NICMJCQkJCVNh dmUgYXMgYSBkcm9wcGxldCBhbmQgcGxhY2UgaW4gdGhlIFN0YXJ0dXAgSXRlbXMgRm9s ZGVyLiAgSWYgYSBTdGFydHVwU2NyZWVuDSAjCQkJCQlhbHJlYWR5IGV4aXN0cyBkdXJp bmcgdGhlIGZpcnN0IHJ1biwgaXQgd2lsbCBiZSBtb3ZlZCB0byAiOkRlc2t0b3AgRm9s ZGVyOk9sZCBTdGFydHVwIFBpY3Q6Ii4NICMJCQkJCU9uIGFsbCBmdXR1cmUgcnVucywg dGhlIFN0YXJ0dXBQaWN0IGZpbGUgaW4gdGhlIFN5c3RlbSBGb2xkZXIgd2lsbCBiZSBk ZWxldGVkIGFuZCByZXBsYWNlZA0gIwkJCQkJd2l0aCBhIG5ldyAnUElDVCIgUmVzb3Vy Y2UgZmlsZS4gUHJlZmVyZW5jZXMgYXJlIHNldCBkdXJpbmcgdGhlIGZpcnN0IHJ1biBh cyB3ZWxsLiAgWW91DSAjCQkJCQl3aWxsIGJlIHByb21wdGVkIHRvIHNlbGVjdCBhIGZv bGRlciBjb250YWluaW5nIHlvdXIgUElDVCBmaWxlcyAob3IgZmlsZSBjb250YWluaW5n ICdQSUNUJw0gIwkJCQkJcmVzb3VyY2VzKSwgYW5kIGFza2VkIGlmIHlvdSB3YW50IHRv IHNlZSBlYWNoIG5ldyBzZWxlY3Rpb24gd2hlbiBpdCBpcyBjb3BpZWQgdG8gdGhlIFN5 c3RlbQ0gIwkJCQkJRm9sZGVyLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIHByZWZl cmVuY2VzIGxhdGVyLCBsb2NhdGUgdGhlIGZpbGUgbmFtZWQgIlJhbmRvbSBTdGFydHVw IA0gIwkJCQkJUGljdCBQcmVmZXJlbmNlcyIgaW4gdGhlIFByZWZlcmVuY2VzIEZvbGRl ciBhbmQgZGVsZXRlIGl0LgkJDSAjDSAjCUNoYW5nZSBIaXN0b3J5Og0gIwkJCTEvMjUv MDIgWzM6MDQgUE1dCVNvdXJjZSBzdGFydGVkIA0gIwkNICMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjDQ0jIXBlcmwgLXcNDXVzZSBzdHJpY3Q7DXVzZSB2NS42LjE7DXVzZSBN YWM6Ok1lbW9yeTsNdXNlIE1hYzo6RmlsZXM7DXVzZSBNYWM6OlJlc291cmNlczsNdXNl IE1hYzo6V2luZG93czsNdXNlIE1hYzo6UXVpY2tEcmF3Ow11c2UgTWFjOjpOYXZpZ2F0 aW9uOw11c2UgU3RvcmFibGU7DQ11c2UgY29uc3RhbnQgUElDVF9MT0MgPT4gMDsNdXNl IGNvbnN0YW50IFNIT1dfQVRfU1RBUlRVUCA9PiAxOw11c2UgY29uc3RhbnQgVFlQRSA9 PiAxOw11c2UgY29uc3RhbnQgc21Sb21hbiA9PiAwOw0NdXNlIHZhcnMgcXcgKEBwcmVm cyAkc3lzdGVtX3BhdGgpOw0NJHN5c3RlbV9wYXRoID0gRmluZEZvbGRlcihrT25TeXN0 ZW1EaXNrLCBrU3lzdGVtRm9sZGVyVHlwZSk7DQ1teSAkc2NyZWVuX3JlY3QgPSBHZXRN YWluRGV2aWNlKCktPmdkUmVjdDsNDW15ICgkcGljdCwgJHJfaGFuZGxlLCAkcmVzKSA9 ICIiOw0NcmVhZF9wcmVmcygpOw0NbXkgQGZpbGVzID0gZ2V0X2ZpbGVfbGlzdCgpOw0N bXkgJG51bSA9IHJhbmQgKHNjYWxhcihAZmlsZXMpKTsNJG51bSA9IGludCgkbnVtKTsN DW15ICRuZXdfcGljdCA9ICRwcmVmc1tQSUNUX0xPQ10gLiAkZmlsZXNbJG51bV07DQ1p ZiAoLWUgKCRzeXN0ZW1fcGF0aCAuICJTdGFydHVwU2NyZWVuIikpIHsNCUZTcERlbGV0 ZSAoJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iKTsNCWlmICgkXkUpIHsNCQlz aG93X29zX2Vycm9yKCJUcm91YmxlIGRlbGV0aW5nIG9sZCBTdGFydHVwUGljdCEiKTsN CQlkaWUoJCEpOw0JfQ19DQ1NYWNQZXJsOjpNYWtlRlNTcGVjKCRzeXN0ZW1fcGF0aCk7 DU1hY1Blcmw6Ok1ha2VGU1NwZWMoJG5ld19waWN0KTsNDW15IEBpbmZvID0gTWFjUGVy bDo6R2V0RmlsZUluZm8oJG5ld19waWN0KTsNaWYgKCRpbmZvW1RZUEVdIGVxICdQSUNU Jykgew0JbXkgJGNhdF9pbmZvID0gRlNwR2V0Q2F0SW5mbyAoJG5ld19waWN0KTsNCW15 ICRkYXRhX2Zvcmtfc2l6ZSA9ICRjYXRfaW5mby0+aW9GbExnTGVuOw0Jb3BlbiAoSU4s ICI8JG5ld19waWN0Iikgb3IgZGllICgkISk7DQlzZWVrIChJTiwgNTEyLCAwKTsNCXJl YWQgKElOLCBteSAkZGF0YSwgJGRhdGFfZm9ya19zaXplKTsNCWNsb3NlIChJTik7DQlp ZiAobGVuZ3RoKCRkYXRhKSA9PSAoJGRhdGFfZm9ya19zaXplIC0gNTEyKSkgeyANCQkk cl9oYW5kbGUgPSBuZXcgSGFuZGxlKCRkYXRhKTsNCX0gZWxzZSB7DQkJc2hvd19vc19l cnJvcigiRXJyb3Igb2NjdXJyZWQgcmVhZGluZyBQSUNUIGRhdGEiKTsNCQlkaWUgKCQh KTsNCX0JDX0gZWxzZSB7DQkjZ2V0IGEgcmVzb3VyY2UNCSRyZXMgPSBGU3BPcGVuUmVz RmlsZSgkbmV3X3BpY3QsIDEpOw0JaWYgKGRlZmluZWQoJHJlcykpIHsNCQlteSAkbnVt X3BpY3RzID0gQ291bnQxUmVzb3VyY2VzICdQSUNUJzsNCQlteSAkcl9udW07DQkJaWYg KGRlZmluZWQoJG51bV9waWN0cykgJiYgKCEkXkUpKSB7CQ0JCQkkcl9udW0gPSByYW5k ICgkbnVtX3BpY3RzKTsNCQkJJHJfbnVtID0gaW50ICgkcl9udW0pOw0JCQkkcl9udW0r KzsNCQkJJHJfaGFuZGxlID0gR2V0MUluZFJlc291cmNlICgnUElDVCcsICRyX251bSk7 DQkJCQ0JCQlpZiAoZGVmaW5lZCAoJHJfaGFuZGxlKSkgewkNCQkJCURldGFjaFJlc291 cmNlICgkcl9oYW5kbGUpOw0JCQl9IGVsc2Ugew0JCQkJc2hvd19vc19lcnJvciAoIlVu YWJsZSB0byBnZXQgJ1BJQ1QnIFJlc291cmNlIEhhbmRsZSBmcm9tIFwiJG5ld19waWN0 XCIiKTsNCQkJfQkNCQl9IGVsc2Ugew0JCQlzaG93X29zX2Vycm9yICgiTm8gJ1BJQ1Qn IFJlc291cmNlcyBmb3VuZCBpbiBcIiRuZXdfcGljdFwiIik7DQkJfQkNCQlDbG9zZVJl c0ZpbGUgKCRyZXMpOw0JfSBlbHNlIHsNCQlzaG93X29zX2Vycm9yKCJFcnJvciBvY2N1 cmVkIG9wZW5pbmcgcmVzb3VyY2UgZm9yayBvZiBcIiRuZXdfcGljdFwiIik7DQkJZGll KCQhKTsNCX0JDX0NbXkgJGYgPSAkc3lzdGVtX3BhdGggLiAiU3RhcnR1cFNjcmVlbiI7 DU1hY1Blcmw6Ok1ha2VGU1NwZWMoJGYpOw0NDUZTcENyZWF0ZVJlc0ZpbGUgKCRmLCAn UlNFRCcsICdyc3JjJywgc21Sb21hbik7DXVubGVzcyAoJF5FKSB7DQkkcmVzID0gRlNw T3BlblJlc0ZpbGUoJGYsIDMpOw0JaWYgKGRlZmluZWQoJHJlcykpIHsNCQlBZGRSZXNv dXJjZSAkcl9oYW5kbGUsICdQSUNUJywgMCwgJycgaWYgZGVmaW5lZCgkcl9oYW5kbGUp Ow0JCXVubGVzcyAoJF5FIG9yICghZGVmaW5lZCgkcl9oYW5kbGUpKSkgew0JCQlXcml0 ZVJlc291cmNlICRyX2hhbmRsZTsNCQkJUmVsZWFzZVJlc291cmNlICRyX2hhbmRsZSBp ZiBkZWZpbmVkICgkcl9oYW5kbGUpOw0JCX0gZWxzZSB7DQkJCXNob3dfb3NfZXJyb3Io IkVycm9yIG9jY3VyZWQgYWRkaW5nICdQSUNUJyBSZXNvdXJjZSB0byBcIiRmXCIiKTsN CQl9DQl9IGVsc2Ugew0JCXNob3dfb3NfZXJyb3IoIlVuYWJsZSB0byBvcGVuIFJlc291 cmNlIEZvcmsgb2YgXCIkZlwiIik7DQl9CQ19IGVsc2Ugew0Jc2hvd19vc19lcnJvcigi RXJyb3Igb2NjdXJlZCBjcmVhdGluZyBcIiRmXCIiKTsNfQ0NaWYgKCRwcmVmc1tTSE9X X0FUX1NUQVJUVVBdKSB7DQlteSAkcGljdCA9IEdldFBpY3R1cmUgMDsNCQ0JaWYgKGRl ZmluZWQoJHBpY3QpKSB7DQkNCW15ICR3aW5kb3dfcmVjdCA9ICRwaWN0LT5waWNGcmFt ZTsNCQ0JbXkgJHdpbmRvd19wb3MgPSBNYWM6OlF1aWNrRHJhdzo6T2Zmc2V0UmVjdCgk d2luZG93X3JlY3QsDQkJCQkkc2NyZWVuX3JlY3QtPmxlZnQgKyAoJHNjcmVlbl9yZWN0 LT5yaWdodCAtICRzY3JlZW5fcmVjdC0+bGVmdCAtICR3aW5kb3dfcmVjdC0+cmlnaHQp IC8gMiwNCQkJCSRzY3JlZW5fcmVjdC0+dG9wICsgKCRzY3JlZW5fcmVjdC0+Ym90dG9t IC0gJHNjcmVlbl9yZWN0LT50b3AgLSAkd2luZG93X3JlY3QtPmJvdHRvbSkgLyAzKTsN CQ0JbXkgJHcgPSBNYWNDb2xvcldpbmRvdy0+bmV3KCR3aW5kb3dfcG9zLCAiIiwgMSwg ZEJveFByb2MsIDEpOw0JDQlTZXRQb3J0KCR3LT53aW5kb3cpOw0JDQlEcmF3UGljdHVy ZSAkcGljdCwgJHBpY3QtPnBpY0ZyYW1lOw0JDQlzbGVlcCAoMik7DQkNCSR3LT5kaXNw b3NlIGlmIGRlZmluZWQgKCR3LT53aW5kb3cpOw0JfSBlbHNlIHsNCQlzaG93X29zX2Vy cm9yKCJFcnJvciBvY2N1cmVkIGdldHRpbmcgU3RhcnR1cFNjcmVlbiAnUElDVCcgUmVz b3VyY2UiKTsNCX0NfQ1DbG9zZVJlc0ZpbGUgKCRyZXMpOw1NYWNQZXJsOjpRdWl0ICgy KTsNDQ0NDXN1YiByZWFkX3ByZWZzIHsNCW15ICRwcmVmX3BhdGggPSBGaW5kRm9sZGVy KGtPblN5c3RlbURpc2ssIGtQcmVmZXJlbmNlc0ZvbGRlclR5cGUpOw0JJHByZWZfcGF0 aCAuPSAiUmFuZG9tIFN0YXJ0dXAgUGljdCBQcmVmZXJlbmNlcyI7DQlpZiAoLWUgJHBy ZWZfcGF0aCkgeyANCQlteSAkciA9IHJldHJpZXZlKCRwcmVmX3BhdGgpOw0JCUBwcmVm cyA9IEAkcjsNCX0gDQkNCWVsc2Ugew0JCSNzZXQgcHJlZnMNCQkkcHJlZnNbUElDVF9M T0NdID0gZ2V0X2ZvbGRlcigiTG9jYXRlIHNvdXJjZSBmb2xkZXIgb2YgJ1BJQ1QnIGZp bGVzIik7DQkJJHByZWZzW1NIT1dfQVRfU1RBUlRVUF0gPSBNYWNQZXJsOjpBbnN3ZXIo IlNob3cgbmV4dCBzdGFydHVwIHBpY3Q/IiwgIlNob3ciLCAiU3VycHJpc2UgbWUiKTsN CQlpZiAoLWUgJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iKSB7DQkJCW15ICR0 YXJnZXQgPSBGaW5kRm9sZGVyKGtPblN5c3RlbURpc2ssIGtEZXNrdG9wRm9sZGVyVHlw ZSk7DQkJCW1rZGlyICgkdGFyZ2V0IC4gIk9sZCBTdGFydHVwIFBpY3QiKTsNCQkJRlNw Q2F0TW92ZSAoJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iLCAkdGFyZ2V0IC4g Ik9sZCBTdGFydHVwIFBpY3QiKTsNCQkJaWYgKCReRSkgew0JCQkJc2hvd19vc19lcnJv cigiVHJvdWJsZSBtb3Zpbmcgb2xkIFN0YXJ0dXBTY3JlZW4hIik7DQkJCQlkaWUoJCEs ICIgSWYgXCJPbGQgU3RhcnR1cCBQaWN0OlN0YXJ0dXBTY3JlZW5cIiBleGlzdHMgb24g dGhlIGRlc2t0b3AgdHJ5IG1vdmluZyBvciBkZWxldGluZyBhbmQgcnVuIHNjcmlwdCBh Z2FpbiEiKTsNCQkJfSBlbHNlIHsNCQkJCU1hY1Blcmw6OkFuc3dlcigiUHJldmlvdXMg U3RhcnR1cFNjcmVlbiBmb3VuZCBpbiBTeXN0ZW0gZm9sZGVyLCBtb3ZlZCB0byBkZXNr dG9wISIsICJPSyIpOw0JCQl9CQ0JCQkNCQl9DQkJc3RvcmUgKFxAcHJlZnMsICAkcHJl Zl9wYXRoKTsNCX0NfQ0Nc3ViIGdldF9maWxlX2xpc3Qgew0Jb3BlbmRpciAoRCwgJHBy ZWZzW1BJQ1RfTE9DXSkgb3IgZGllICgkISk7DQlteSBAZmlsZV9saXN0ID0gcmVhZGRp ciAoRCk7DQljbG9zZWRpciAoRCk7DQkNCSNyZW1vdmUgaW52YWxpZCBmaWxlcy9mb2xk ZXJzIGZyb20gbGlzdA0JZm9yIChteSAkaSA9IDA7ICRpIDwgc2NhbGFyKEBmaWxlX2xp c3QpOyAkaSsrKSB7DQkJbXkgJGYgPSAkcHJlZnNbUElDVF9MT0NdIC4gJGZpbGVfbGlz dFskaV07DQkJDQkJaWYgKCgtZCAoJGYpKSB8fCAoLWwgKCRmKSkpIHsNCQkJc3BsaWNl IChAZmlsZV9saXN0LCAkaSwgMSk7DQkJCSRpLS07DQkJfSBlbHNlIHsNCQkJbXkgQGlu Zm8gPSBNYWNQZXJsOjpHZXRGaWxlSW5mbygkZik7DQkJCWlmICgkaW5mb1tUWVBFXSBu ZSAnUElDVCcpIHsNCQkJCSNjaGVjayBmb3IgcGljdCByZXNvdXJjZQ0JCQkJTWFjUGVy bDo6TWFrZUZTU3BlYygkZik7DQkJCQlteSAkcmZkID0gRlNwT3BlblJlc0ZpbGUoJGYs IDEpOw0JCQkJaWYgKGRlZmluZWQoJHJmZCkpIHsNCQkJCQlteSAkbnVtX3BpY3RzID0g Q291bnQxUmVzb3VyY2VzICdQSUNUJzsNCQkJCQlpZiAoZGVmaW5lZCgkbnVtX3BpY3Rz KSB8fCAoISReRSkpIHsJDQkJCQkJCWlmICgkbnVtX3BpY3RzIDwgMSkgew0JCQkJCQkJ c3BsaWNlIChAZmlsZV9saXN0LCAkaSwgMSk7DQkJCQkJCQkkaS0tOw0JCQkJCQl9DQkJ CQkJfSBlbHNlIHsNCQkJCQkJc2hvd19vc19lcnJvcigiRXJyb3Igb2NjdXJlZCB3aGls ZSB2YWxpZGF0aW5nIGZpbGUgbGlzdCEiKTsNCQkJCQl9CQ0JCQkJCUNsb3NlUmVzRmls ZSAoJHJmZCk7DQkJCQl9IGVsc2Ugew0JCQkJCXNob3dfb3NfZXJyb3IoIkVycm9yIG9j Y3VyZWQgb3BlbmluZyByZXNvdXJjZSBmb3JrIG9mIFwiJGZcIiIpOw0JCQkJfQ0JCQkJ DQkJCX0gCQ0JCX0JDQkJCQ0JfQ0NCXJldHVybiBAZmlsZV9saXN0Ow19DQ1zdWIgc2hv d19vc19lcnJvciB7DQlteSAkZXJyb3IgPSBzaGlmdDsNCW15ICRlOwkNCWlmICgkXkUp IHsNCQlpZiAoZGVmaW5lZCgkZXJyb3IpKSB7DQkJCSRlID0gJGVycm9yOw0JCX0NCQkk ZXJyb3IgPSAkXkUgLiAiXG5cbiRlIjsNCX0gZWxzaWYgKCFkZWZpbmVkKCRlcnJvcikp IHsNCQkkZXJyb3IgPSAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZCEnOw0JfQkJ CQkNCU1hY1Blcmw6OkFuc3dlcigkZXJyb3IpOw19DQ1zdWIgZ2V0X2ZvbGRlciB7DQlt eSAkbWVzc2FnZSA9IHNoaWZ0Ow0JbXkgJG9wdGlvbnMgPSBOYXZHZXREZWZhdWx0RGlh bG9nT3B0aW9uczsNCSRvcHRpb25zLT5tZXNzYWdlKCRtZXNzYWdlKTsNCW15ICRyZXBs eSA9IE5hdkNob29zZUZvbGRlciAoRmluZEZvbGRlcihrT25TeXN0ZW1EaXNrLCBrRGVz a3RvcEZvbGRlclR5cGUpLCAkb3B0aW9ucyk7DQlpZiAoZGVmaW5lZCgkcmVwbHkpKSB7 DQkJbXkgJGZpbGUgPSAkcmVwbHktPmZpbGUoMSk7DQkJTmF2RGlzcG9zZVJlcGx5ICRy ZXBseTsgDQkJcmV0dXJuICRmaWxlOwkNCX0gZWxzZSB7DQkJcmV0dXJuIHVuZGVmOw0J fQkNfQ== --============_-1199845839==_D============-- --============_-1199845839==_============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" -- ------------------------------------------------------------------ | David Ackerman | Telephone: 617-495-2794 | | Audio Associate | Fax: 617-496-4636 | | Archive World Music | e-mail: [email protected] | | Harvard University | | | Cambridge, MA 02138 | PGP key 0xE928B52F | ------------------------------------------------------------------ --============_-1199845839==_============--