
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Server/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Server/ProtocolSTRUCTURE.pm |
package Server::ProtocolSTRUCTURE;
use strict;
eval("use MIME::Base64");
sub new {
my $class = shift;
my $self = {};
bless($self,$class);
return($self);
}
#***********************************************************************
sub server_send {
my $self = shift;
my $obj = shift;
my $sock = shift;
$obj = $self->serialize($obj);
print $sock $obj . "\n";
}
#***********************************************************************
sub client_send {
my $self = shift;
my $obj = shift;
my $sock = shift;
$obj = $self->serialize($obj);
print $sock $obj . "\n";
}
#**********************************************************************
sub server_receive {
my $self = shift;
my $sock = shift;
my $erg = "";
my $o;
while (0 == 0) {
if (eof($sock)) {
return("___EOF___",0);
} else {
$o = <$sock>;
}
last if ($o eq "\n");
$erg = $erg . $o;
}
$o = 0;
$o = $self->deserialize($erg);
return($o,1) if ($o);
return("___EOF___",0);
}
#**********************************************************************
sub client_receive {
my $self = shift;
my $sock = shift;
return($self->server_receive($sock));
}
#**********************************************************************
sub serialize {
my $self = shift;
my $obj = shift;
$obj = $self->serialize_1($obj);
my $text = "";
my $ll; my $o;
foreach $o (@$obj) {
my $ll = length($o);
$text = $text . length($ll) . $ll . $o;
}
return(encode_base64($text));
}
#**********************************************************************
sub serialize_1 {
my $self = shift;
my $obj = shift;
my $ee = [];
my $o; my $o1; my @ee1;
if (ref($obj) eq "ARRAY") {
push(@$ee,"A".$#{$obj});
foreach $o (@$obj) {
$o = $self->serialize_1($o);
foreach $o1 (@$o) {
push(@$ee,$o1);
}
}
}
elsif (ref($obj) eq "HASH") {
@ee1 = keys %$obj;
push(@$ee,"H".$#ee1);
foreach $o (@ee1) {
push(@$ee,$o);
$o = $self->serialize_1($obj->{$o});
foreach $o1 (@$o) {
push(@$ee,$o1);
}
}
}
else {
$ee = ["S",$obj];
}
return($ee);
}
#************************************************************************
sub deserialize {
my $self = shift;
my $text = shift;
$text = decode_base64($text);
my $ee = []; my $ll1; my $ll2;
while ($text) {
$ll1 = substr($text,0,1);
$text = substr($text,1);
$ll2 = substr($text,0,$ll1);
$text = substr($text,$ll1);
push(@$ee,substr($text,0,$ll2));
$text = substr($text,$ll2);
}
($ll1,$ee) = $self->deserialize_1($ee);
return($ll1);
}
#************************************************************************
sub deserialize_1 {
my $self = shift;
my $ee = shift;
my $o = shift(@$ee);
my $o1; my $zaehler; my $pointer; my $erg;
if (substr($o,0,1) eq "S") {
return(shift(@$ee),$ee);
}
elsif (substr($o,0,1) eq "A") {
$erg = [];
$o = substr($o,1);
$zaehler = -1;
while ($zaehler < $o) {
($o1,$ee) = $self->deserialize_1($ee);
push(@$erg,$o1);
$zaehler = $zaehler + 1;
}
return($erg,$ee);
}
elsif (substr($o,0,1) eq "H") {
$erg = {};
$o = substr($o,1);
$zaehler = -1;
while ($zaehler < $o) {
$pointer = shift(@$ee);
($o1,$ee) = $self->deserialize_1($ee);
$erg->{$pointer} = $o1;
$zaehler = $zaehler + 1;
}
return($erg,$ee);
}
}
1;