Mail::Box::MH::Resource - Manage an MH resource file such as the MH profile


Mail-Box-MH-Resource documentation Contained in the Mail-Box-MH-Resource distribution.

Index


Code Index:

NAME

Top

Mail::Box::MH::Resource - Manage an MH resource file such as the MH profile

SYNOPSIS

Top

  #Create object and load profile
  my $prof = Mail::Box::MH::Resource->new();

  #Get a list of the profile components
  my @keys = $prof->enum();

  #Get MH directory to pass to Mail::Box::Manager
  my $folderdir = $prof->get('Path');
  $folderdir = File::Spec->file_name_is_absolute($folderdir->{Path}) ?
                                                 $folderdir->{Path}  :
                 File::Spec->catfile($ENV{HOME}, $folderdir->{Path})

  #Permanently remove messages
  $prof->set('rmmproc'=>'rm');

  #Save changes
  $prof->close();

DESCRIPTION

Top

Read and write MH format resource files such as profile, context, and sequence.

METHODS

Top

new [FILENAME]

Open a resource file, accepts an optional filename of the resource file to open. Non-absolute filenames which do not start with your system's designation for the current directory are opened relative to the MH profile Path component. ./ should work on most right minded systems, : for Macintosh, see File::Spec if you don't what it is for your system. If unspecified new falls back to $ENV{MH} and then $HOME/.mh_profile.

Example:

  #Create a new profile
  my $prof = Mail::Box::MH::Resource->new('/tmp/.mh_profile');

  #Load the context file to determine the currently selected folder
  my $cntx = Mail::Box::MH::Resource->new('current');

enum

Returns a list of existing component names.

get COMPONENT [COMPONENTS]

Return the values of one or more components. See SYNOPSIS for an example.

set COMPONENT [COMPONENTS]

Set the values of one or more components. See SYNOPSIS for an example.

close

Write the resource file to disk, original component ordering is not preserved.

CAVEATS

Top

Order is not preserved therefore "comments" may end up misplaced.

SEE ALSO

Top

mh-profile(5), Mail::Box::MH.

AUTHOR

Top

Jerrad Pierce <jpierce@cpan.org>


Mail-Box-MH-Resource documentation Contained in the Mail-Box-MH-Resource distribution.

require 5.006;
package Mail::Box::MH::Resource;
use Cwd;
use File::Spec;
use Mail::Reporter;
use vars ('$VERSION', @ISA);
$VERSION = 0.06;
@ISA = 'Mail::Reporter';

local($_, $/, %ENV);

my $curdir = File::Spec->catfile(File::Spec->curdir(), 'foo');
   $curdir =~s/\bfoo$//;

sub new{
  shift;
  my $self = bless {};
  $self->SUPER::init();

  unless( $self->{_file} = shift ){
    if( exists($ENV{MH}) ){
      $self->{_file} = File::Spec->file_name_is_absolute($ENV{MH}) ?
	$ENV{MH} : File::Spec->catfile(cwd(), $ENV{MH});
    }
    $self->{_file} ||= File::Spec->catfile($ENV{HOME}, '.mh_profile');
  }
  unless( File::Spec->file_name_is_absolute($self->{_file}) ||
	  $self->{_file} =~ m%^\Q$curdir\E% ){
    my $profile = Mail::Box::MH::Resource->new();
    my $path = $profile->get('Path');
    $path = File::Spec->file_name_is_absolute($path) ? $path :
      File::Spec->catdir($ENV{HOME}, $path);
    $self->{_file} = File::Spec->catfile($path, $self->{_file});
  }

  if( -e $self->{_file} ){
    if( open(my $profile, $self->{_file}) ){
      while( <$profile> ){
	chomp;
	next unless defined($_);
	#MH doesn't strip out leading whitespace, so this is okay
	my @F = split(/:\s*/, $_ ,2);
	$self->{_profile}->{$F[0]} = $F[1];
      }
      close($profile);
      $self->log(PROGRESS=>"Resource file F<$self->{_file}> opened for read.");
    }
    else{
      $self->log(ERROR=>"Resource file F<$self->{_file}> could not be opened for read: $!");
      return;
    }
  }
  else{
    $self->log(NOTICE=>"Resource file F<$self->{_file}> does not exist, it will be created on close()");
  }
  return $self;
}

sub get{
  return @{shift->{_profile}}{@_};
}

sub set{
  my $self = shift;
  my %hash = @_;
  $self->{_profile}->{$_} = $hash{$_} for keys %hash;
  #XXX Should this actually only get touched if any keys are *modified*?
  $self->{_modified} = 1;
};

sub close{
  my $self = shift;
  if( open(my $profile, '>', $self->{_file}) ){
    print $profile "$_: $self->{_profile}->{$_}$/" for keys %{$self->{_profile}};
    close($profile) && ($self->{_modified} = 0);
    $self->log(PROGRESS=>"Resource file F<$self->{_file}> synced.");
  }
  else{
    $self->log(ERROR=>"Resource file F<$self->{_file}> could not be open for write: $!");
   }
};

sub enum{
  keys %{shift->{_profile}};
}

sub DESTROY{
  my $self = shift;
  return unless $self->{_modified};
  require Data::Dumper;
  $self->log(
	     WARNING=>"Resource file F<$self->{_file}> modifications
were destroyed, save changes by calling close() first:\n".
	     Data::Dumper->Dump([$self->{_profile}]));
}

1;
__END__