Index: trunk/PS-IPP-PSFTP/lib/PS/IPP/PSFTP.pm
===================================================================
--- trunk/PS-IPP-PSFTP/lib/PS/IPP/PSFTP.pm	(revision 5300)
+++ trunk/PS-IPP-PSFTP/lib/PS/IPP/PSFTP.pm	(revision 5326)
@@ -1,5 +1,5 @@
 # Copyright (C) 2005  Joshua Hoblitt
 #
-# $Id: PSFTP.pm,v 1.7 2005-10-12 22:45:38 jhoblitt Exp $
+# $Id: PSFTP.pm,v 1.8 2005-10-14 02:35:42 jhoblitt Exp $
 
 package PS::IPP::PSFTP;
@@ -19,4 +19,5 @@
 use POSIX;
 use PS::IPP::PSFTP::Parser;
+use Regexp::Common qw( number );
 
 sub new
@@ -106,5 +107,5 @@
 }
 
-sub get_file
+sub get_file_by_record
 {
     my $self = shift;
@@ -127,6 +128,48 @@
     );
 
+    return $self->get_file(
+        url         => $p{record}->url,
+        size        => $p{record}->size,
+        md5         => $p{record}->md5,
+        filename    => $p{filename},
+    );
+}
+
+sub get_file
+{
+    my $self = shift;
+
+    my %p = validate(@_,
+        {
+            url         => {
+                type        => SCALAR,
+                callbacks   => {
+                    'is valid url' => sub { is_uri( $_[0] ) },
+                },
+            },
+            size        => {
+                type        => SCALAR,
+                regex       => qr/^$RE{num}{int}$/,
+                optional    => 1,
+            },
+            md5         => {
+                type        => SCALAR,
+                regex       => qr/^$RE{num}{real}{-base => 16}$/,
+                optional    => 1,
+            },
+            filename    => {
+                type        => SCALAR,
+                regex       => qr/\S+/, # string with atleast 1 non WS char
+                callbacks   => {
+                    'write access' => sub {
+                        POSIX::access($_[0], &POSIX::W_OK);
+                    },
+                },
+            },
+        },
+    );
+
     my $ua = LWP::UserAgent->new;
-    my $request = HTTP::Request->new(GET => $p{record}->url);
+    my $request = HTTP::Request->new(GET => $p{url});
     my $response = $ua->request($request, $p{filename});
 
@@ -136,18 +179,22 @@
     }
 
-    my $size = stat($p{filename})->size;
-    if (! $p{record}->size == $size) {
-        carp "id: ", $p{record}->id,
-             " - expected size: ", $p{record}->size,
-             " got: ", $size;
-        return undef;
-    }
-
-    my $md5 = file_md5_hex($p{filename});
-    if (! $p{record}->md5 eq $md5) {
-        carp "id: ", $p{record}->id, 
-             " - expected md5: ", $p{record}->md5,
-             " got: ", $md5;
-        return undef;
+    if (defined $p{size}) {
+        my $size = stat($p{filename})->size;
+        if (! $p{size} == $size) {
+            carp "url: ", $p{url},
+                 " - expected size: ", $p{size},
+                 " got: ", $size;
+            return undef;
+        }
+    }
+
+    if (defined $p{md5}) {
+        my $md5 = file_md5_hex($p{filename});
+        if (! $p{md5} eq $md5) {
+            carp "url: ", $p{url},
+                 " - expected md5: ", $p{md5},
+                 " got: ", $md5;
+            return undef;
+        }
     }
 
