Author: alexlehm
Date: 2007-06-15 22:25:20 +0000 (Fri, 15 Jun 2007)
New Revision: 13618

Modified:
   trunk/apps/perlFreenet/
   trunk/apps/perlFreenet/Freenet/
   trunk/apps/perlFreenet/Freenet/Connection.pm
   trunk/apps/perlFreenet/Freenet/Message.pm
   trunk/apps/perlFreenet/README
   trunk/apps/perlFreenet/perlfn.pl
   trunk/apps/perlFreenet/putcomplexdir.pl
Log:
changed messages to support nested hashes, changed examples to use this feature



Property changes on: trunk/apps/perlFreenet
___________________________________________________________________
Name: svn:ignore
   + *.bak



Property changes on: trunk/apps/perlFreenet/Freenet
___________________________________________________________________
Name: svn:ignore
   + *.bak


Modified: trunk/apps/perlFreenet/Freenet/Connection.pm
===================================================================
--- trunk/apps/perlFreenet/Freenet/Connection.pm        2007-06-15 22:09:04 UTC 
(rev 13617)
+++ trunk/apps/perlFreenet/Freenet/Connection.pm        2007-06-15 22:25:20 UTC 
(rev 13618)
@@ -1,7 +1,7 @@
 package Freenet::Connection;

 use Freenet::Message;
-use IO::socket::INET;
+use IO::Socket::INET;

 sub new {
   my $class = shift;
@@ -122,7 +122,18 @@
     last if /^EndMessage$/;
     last if /^Data$/;
     my($k,$v)=split(/=/,$_,2);
-    $headers->{$k}=$v;
+    # handle keyword.keyword
+    if($k=~/^([^.]+)\.(.+)$/) {
+       my($ref)=\%{$headers->{$1}};
+       my($subkey)=$2;
+       while($subkey=~/^([^.]+)\.(.+)$/) {
+               $ref=\%{$ref->{$1}};
+               $subkey=$2;
+       }
+       $ref->{$subkey}=$v;
+    } else {
+       $headers->{$k}=$v;
+    }
   }

   if(/^Data$/) {
@@ -164,8 +175,7 @@

   foreach my $k (keys(%{$msg->header})) {
        my($h)=$msg->header($k);
-    print $sock "$k=$h\n";
-    $self->debug && print ">$k=$h\n";
+       $self->print_msghash($k, $h);
   }

   print $sock "EndMessage\n";
@@ -180,6 +190,33 @@
   return 1;
 }

+sub print_msghash
+{
+  my($self)=shift;
+  my($key)=shift;
+  my($value)=shift;
+  my($sock)=$self->{socket};
+
+  if(ref($value)) {
+       if(ref($value) eq "ARRAY") {
+               for(my $i=0;$i<int(@$value);$i++) {
+                       $self->print_msghash("$key.$i",$value->[$i]);
+               }
+       }
+       elsif(ref($value) eq "HASH") {
+               foreach my $k (keys(%$value)) {
+                       $self->print_msghash("$key.$k",$value->{$k});
+               }
+       }
+       else {
+               warn "unsupported value type ".ref($value)."\n";
+       }
+  } else {
+       print $sock "$key=$value\n";
+       $self->debug && print ">$key=$value\n";
+  }
+}
+
 sub disconnect
 {
   my $self=shift;

Modified: trunk/apps/perlFreenet/Freenet/Message.pm
===================================================================
--- trunk/apps/perlFreenet/Freenet/Message.pm   2007-06-15 22:09:04 UTC (rev 
13617)
+++ trunk/apps/perlFreenet/Freenet/Message.pm   2007-06-15 22:25:20 UTC (rev 
13618)
@@ -39,13 +39,27 @@
        if(int(@_)==0) {
     return $self->{header};
        } else {
-               my $k=shift;
-    return $self->{header}->{$k};
+               my @keys;
+               if(int(@_)>1) {
+                       @keys=@_;
+               } else {
+                       my $key=shift;
+                       @keys=split(/\./,$key);
+               }
+               my $ref=$self->{header};
+               foreach my $k (@keys) {
+                       $ref=$ref->{$k};
+                       if(!defined($ref)) {
+                               return undef;
+                       }
+               }
+    return $ref;
        }
 }

 # as_string is useful for debugging, returns the complete message ending
 # with either EndMessage or Data
+# TODO: this duplicates code from Freenet::Connection

 sub as_string
 {
@@ -53,7 +67,7 @@

        my($s)=$self->message."\n";
        foreach my $k (keys(%{$self->header})) {
-         $s.=$k."=".$self->header($k)."\n";
+         $s.=$self->string_msghash($k, $self->header->{$k});;
        }
        if(defined($self->data)) {
                # ignore the data field for now
@@ -64,4 +78,32 @@
        return $s;
 }

+sub string_msghash
+{
+  my($self)=shift;
+  my($key)=shift;
+  my($value)=shift;
+
+       my($res)="";
+
+  if(ref($value)) {
+       if(ref($value) eq "ARRAY") {
+               for(my $i=0;$i<int(@$value);$i++) {
+                       $res.=$self->string_msghash("$key.$i",$value->[$i]);
+               }
+       }
+       elsif(ref($value) eq "HASH") {
+               foreach my $k (keys(%$value)) {
+                       $res.=$self->string_msghash("$key.$k",$value->{$k});
+               }
+       }
+       else {
+               warn "unsupported value type ".ref($value)."\n";
+       }
+  } else {
+       $res.="$key=$value\n";
+  }
+  return $res;
+}
+
 1;

Modified: trunk/apps/perlFreenet/README
===================================================================
--- trunk/apps/perlFreenet/README       2007-06-15 22:09:04 UTC (rev 13617)
+++ trunk/apps/perlFreenet/README       2007-06-15 22:25:20 UTC (rev 13618)
@@ -12,9 +12,8 @@

 There are quite a few things missing, e.g. Perldoc.

-Until now, I have used the library under Windows only (Vista and XP) with 
-ActiveState Perl 5.8.8, it should work under Linux as well, but this is yet 
-untested.
+I am developing the library under Windows only (Vista and XP) with ActiveState 
+Perl 5.8.8, but it has been tested under Linux as well.

 For feedback about the code, please use devel at P7LnnR2qMOTZdYbBa_teC92vTLQ 
in 
 [MAILBOX] or use the bug tracker at https://bugs.freenetproject.org/ 

Modified: trunk/apps/perlFreenet/perlfn.pl
===================================================================
--- trunk/apps/perlFreenet/perlfn.pl    2007-06-15 22:09:04 UTC (rev 13617)
+++ trunk/apps/perlFreenet/perlfn.pl    2007-06-15 22:25:20 UTC (rev 13618)
@@ -10,13 +10,18 @@
 ($nodehello=$node->connect) || warn "connect failed\n";

 if($nodehello->message ne "NodeHello") {
-  warn "something went wrong, got ".$nodehello->message." instead of 
NodeHello\n";
+  die "something went wrong, got ".$nodehello->message." instead of 
NodeHello\n";
 }

 # get uptime
 $node->sendmessage("GetNode", {WithVolatile => 'true'});
 $nodedata=$node->getmessage;
-$uptime=$nodedata->header("volatile.uptimeSeconds")/3600.0;
+# you can reference nested keywords either directly or by the parent hash:
+
+#$uptime=$nodedata->header("volatile.uptimeSeconds")/3600.0;
+$volatile=$nodedata->header("volatile");
+$uptime=$volatile->{"uptimeSeconds"}/3600.0;
+
 print "uptime $uptime hours\n";

 # get a list of peer node names
@@ -38,6 +43,8 @@
        last if $msg->message eq "EndListPeers";
 };

+exit;
+
 $node->sendmessage("ClientGet",
        {
          IgnoreDS=>"false",
@@ -84,11 +91,6 @@
 $node->sendmessage("GenerateSSK", {Identifier=>"My Identifier Blah Blah"});
 print $node->getmessage->as_string;

-# shut down node (you probably dont want to do this is a test script)
-
-#$node->sendmessage("Shutdown");
-#print $node->getmessage->as_string;
-
 # get CHK of a known file

 # have to create the message beforehand since we have to add data element
@@ -111,7 +113,7 @@
        }
 );

-$data=read_file("c:/document.pdf", binmode => ':raw');
+$data=read_file("document.pdf", binmode => ':raw');

 $msg->{data}=$data;
 $msg->{header}->{DataLength}=length($data);
@@ -121,5 +123,10 @@
 my($msg)=$node->getmessage;
 print $msg->as_string;

+# shut down node (you probably dont want to do this is a test script)
+
+#$node->sendmessage("Shutdown");
+#print $node->getmessage->as_string;
+
 $node->disconnect || warn "disconnect failed\n";


Modified: trunk/apps/perlFreenet/putcomplexdir.pl
===================================================================
--- trunk/apps/perlFreenet/putcomplexdir.pl     2007-06-15 22:09:04 UTC (rev 
13617)
+++ trunk/apps/perlFreenet/putcomplexdir.pl     2007-06-15 22:25:20 UTC (rev 
13618)
@@ -1,5 +1,7 @@
 #! perl

+# test insert of a freesite, this expects a dummy site in testsite/*
+
 use Data::Dumper;
 use File::Slurp;

@@ -10,12 +12,12 @@
 ($nodehello=$node->connect) || warn "connect failed\n";

 if($nodehello->message ne "NodeHello") {
-  warn "something went wrong, got ".$nodehello->message." instead of 
NodeHello\n";
+  die "something went wrong, got ".$nodehello->message." instead of 
NodeHello\n";
 }

-$file0=read_file("index.html");
-$file1=read_file("foo.zip", binmode=>':raw');
-$file2=read_file("doc.pdf", binmode=>':raw');
+$file0=read_file("testsite/index.html");
+$file1=read_file("testsite/foo.zip", binmode=>':raw');
+$file2=read_file("testsite/doc.pdf", binmode=>':raw');

 $msg=Freenet::Message->new("ClientPutComplexDir",
        {
@@ -24,24 +26,32 @@
                MaxRetries=>999,
                PriorityClass=>2,
                URI=>'CHK@',
-               GetCHKOnly=>"false",
+               GetCHKOnly=>"true",
                DontCompress=>"false",
                ClientToken=>"My Client Token",
                Persistence=>"connection",
                Global=>"false",
                DefaultName=>"index.html",
-               "Files.0.Name"=>"index.html",
-               "Files.0.UploadFrom"=>"direct",
-               "Files.0.Metadata.ContentType"=>"text/html",
-               "Files.0.DataLength"=>length($file0),
-               "Files.1.Name"=>"foo.zip",
-               "Files.1.UploadFrom"=>"direct",
-               "Files.1.Metadata.ContentType"=>"application/zip",
-               "Files.1.DataLength"=>length($file1),
-               "Files.2.Name"=>"doc.pdf",
-               "Files.2.UploadFrom"=>"direct",
-               "Files.2.Metadata.ContentType"=>"application/pdf",
-               "Files.2.DataLength"=>length($file2),
+               Files => [
+                                                       {
+                                                               
Name=>"index.html",
+                                                               
UploadFrom=>"direct",
+                                                               
"Metadata.ContentType"=>"text/html",
+                                                               
DataLength=>length($file0),
+                                                       },
+                                                       {
+                                                               Name=>"foo.zip",
+                                                               
UploadFrom=>"direct",
+                                                               
"Metadata.ContentType"=>"application/zip",
+                                                               
DataLength=>length($file1),
+                                                       },
+                                                       {
+                                                               Name=>"doc.pdf",
+                                                               
UploadFrom=>"direct",
+                                                               
"Metadata.ContentType"=>"application/pdf",
+                                                               
DataLength=>length($file2),
+                                                       },
+                                               ]
        }
 );

@@ -51,5 +61,8 @@

 while(1) {
   my($msg)=$node->getmessage;
+  # TODO: should catch error messages as well
+  last if $msg->message eq "PutSuccessful";
 }
+
 $node->disconnect || warn "disconnect failed\n";


Reply via email to