Hello,

I'm a bit desperate while trying to change the 'SIZE' resource
from a MacPerl script.

The problem is more MacOS specific I assume than MacPerlish.
I can sucessfully get the resource values and manipulate them
but in the end the Finder Info does sometimes and sometimes
doesn't reflect those changes, really frustrating ...

In InsideMac I could only find a reference of how to set
SIZE (-1) but not really how ID 0, 1 are to be set.

Thanks for your time

The script follows


Axel

#!perl -w

use vars qw( $DEBUG );
use strict;

$DEBUG = 1;

my( $recommended, $minsize, $maxsize ) = ( 4*1024*1024, 4.5*1024*1024, 6.5*1024*1024 );
print <<eom;
setting Mac mem info to:
   recommended = $recommended bytes
   minsize = $minsize bytes
   maxsize = $maxsize bytes
eom

use Mac::Resources;
use Mac::Memory;

if( $DEBUG ) {
        use Data::Dumper;
        $Data::Dumper::Terse = 1;
        $Data::Dumper::Indent= 1;
}

my $pwd;
chomp( $pwd = `pwd` );
my $resfile = "$pwd:DiskCopy";
print "working on: $resfile\n";
## bestätigter Bug: OpenResFile arbeitet nicht im Arbeitsverzeichnis

my $RFD = OpenResFile( $resfile )
        or die "can't open res file '$resfile'\n$!\n$^E\n";

my $size_id;
foreach $size_id ( -1 .. 1 )
{

        print "\ngetting 'SIZE' resource $size_id\n";
        my $sres = GetResource( "SIZE", $size_id )
                or die "   GetResource( 'SIZE', $size_id ) failed.\n$!\n$^E\n";
        my $mem = $sres->get;
        my $len = length( $mem );
        if( !$len ) { die "got zero length resource info!\n" }
        # print "length = $len\n" if $DEBUG;

=for test
        my $bits = unpack( "b*", $mem);
        print Dumper $bits;
=cut

        my @nums = unpack( "sll", $mem);
        for( $nums[1], $nums[2] ) { print "$_\n" }

###
#next;
###

        my $new_res;
        if( $size_id == -1 ) { $new_res = pack( "sll", $nums[0], $recommended, 
$minsize ) }
        if( $size_id ==  0 ) { $new_res = pack( "sll", $nums[0], $maxsize, $minsize ) }
        if( $size_id ==  1 ) { $new_res = pack( "sll", $nums[0], $maxsize, $minsize ) }

        $sres->set( 0, $len, $new_res );

        ChangedResource( $sres ) or die "ChangedResource() failed\n$!\n$^E\n";
        WriteResource( $sres ) or die "WriteResource() failed\n$!\n$^E\n";

}

CloseResFile( $RFD );


$RFD = OpenResFile( $resfile )
        or die "can't open res file '$resfile'\n$!\n$^E\n";

print "\n\ncheck:\n";
foreach $size_id ( -1 .. 1 )
{
        print "\ngetting 'SIZE' resource $size_id\n";
        my $sres = GetResource( "SIZE", $size_id )
                or die "   GetResource( 'SIZE', $size_id ) failed.\n$!\n$^E\n";
        my $mem = $sres->get;
        my $len = length( $mem );
        if( !$len ) { die "got zero length resource info!\n" }
        my @nums = unpack( "sll", $mem);
        for( $nums[1], $nums[2] ) { print "$_\n" }
}

CloseResFile( $RFD );

print "done.\n";

__END__

Reply via email to