root/trunk/hotstuff/dxs/cdxs.pl

Revision 446, 3.8 KB (checked in by josef, 4 years ago)

- adapt copyright headers to the updated licence

Line 
1#!/usr/bin/perl
2#
3# Server for compressed SOAP messages for DXS (cDXS protocol)
4# Copyright (C) 2005 - 2007 Josef Spillner <josef@kstuff.org>
5# Published under 'GNU AGPLv3 or later' conditions
6
7use SOAP::Lite;
8use Data::Dumper;
9use IO::Socket;
10
11use DXS;
12
13##############################
14
15sub deserialize_inner{
16        my $x = shift(@_);
17
18        if(!$x){
19                return;
20        }
21
22        my @ar;
23        if(ref($x) eq "ARRAY"){
24                @ar = @{$x};
25        }else{
26                bless $x, SOAP::Data;
27                @ar = $x->value();
28        }
29
30        my $s = "";
31        foreach my $y(@ar){
32                my $tmp = $y->value();
33                $s .= $y->name();
34                if(ref($tmp) ne "SOAP::Data"){
35                        $s .= "(";
36                }
37                if(substr($tmp, 0, 4) eq "REF("){
38                        my $f = $y->value();
39                        my %ref = %{$$f};
40                        $s .= deserialize_inner($ref{"_value"});
41                }elsif(ref($tmp) eq "SOAP::Data"){
42                        $s .= deserialize_inner($tmp);
43                }else{
44                        $tmp =~ s/\(/\\\(/g;
45                        $tmp =~ s/\)/\\\)/g;
46                        $s .= $tmp;
47                }
48                if(ref($tmp) ne "SOAP::Data"){
49                        $s .= ")\n";
50                }
51        }
52        return $s;
53}
54
55sub deserialize{
56        my $name = shift(@_);
57        my $params = shift(@_);
58
59        my $s = "";
60        $s .= "$name(";
61        $s .= deserialize_inner($params);
62        $s .= ")\n";
63        return $s;
64}
65
66sub serialize{
67        my $input = shift(@_);
68        my $inner = shift(@_);
69
70        $input =~ m/([^(]+)(?:\((.+)\))?/;
71
72        my $method = $1;
73        my $rest = $2;
74        my @entries;
75
76        #print "-> $method\n";
77        #print "-> $rest\n";
78
79        if($rest =~ /[^(]+\(.+\)/){
80                $rest = substr($rest, 0, length($rest) - 1);
81                my @params = split(/\)[,\n\ ]/, $rest);
82                my @xdata;
83                foreach my $param(@params){
84                        $param = "$param)";
85                        #print " :: $param\n";
86
87                        my $xdataref = serialize($param, 1);
88                        @xdata = (@xdata, @{$xdataref});
89                }
90                my $data = SOAP::Data->name($method => \SOAP::Data->value(@xdata));
91                @entries = (@entries, $data);
92        }else{
93                #print "ok\n";
94                my $data = SOAP::Data->name($method => $rest);
95                @entries = (@entries, $data);
96        }
97
98        if($inner){
99                return [@entries];
100        }
101
102        my $data = $entries[0];
103        my $f = $data->value();
104        my %ref = %{$$f};
105        return ($method, $ref{"_value"});
106}
107
108##############################
109
110sub handle{
111        my $inputtree = shift(@_);
112
113        my ($method, $input) = serialize($inputtree);
114
115        my $som = SOAP::SOM->new($input);
116        my @args = ($som);
117        my $ret = eval("DXS::$method(DXS, \@args)");
118
119        my $outputtree = deserialize("$method" . "Response", $ret);
120        return $outputtree;
121}
122
123my $port = 30303;
124
125my $proto = getprotobyname("tcp");
126socket(SERVER, PF_INET, SOCK_STREAM, $proto);
127setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1));
128
129bind(SERVER, sockaddr_in($port, INADDR_ANY));
130listen(SERVER, SOMAXCONN);
131print "cDXS server started on $port...\n";
132
133my $in;
134while(1){
135        $sock = accept(CLIENT, SERVER);
136
137        print "* connection!\n";
138        my $input = "";
139        my $reader = 1;
140        while($reader){
141                my $in = <CLIENT>;
142                chomp $in;
143                print "-- $in\n";
144                if($in eq ""){
145                        last;
146                }
147                $input .= "$in\n";
148                if($in eq ")"){
149                        $reader = 0;
150                }
151                if($in =~ /^\S+\(\)$/){
152                        $reader = 0;
153                }
154        }
155        $response = handle($input);
156        print "RESPONSE: $response\n";
157        print CLIENT $response;
158        close(CLIENT);
159        print "* terminated.\n";
160}
161
162##############################
163
164my $server = SOAP::Data->name("server" => "Desktop Exchange Service (DXS)");
165my $version = SOAP::Data->name("version" => "0.1");
166my $provider = SOAP::Data->name("provider" => "foo");
167my $url = SOAP::Data->name("url" => "bar");
168my $x = [$server, $version, $provider, $url];
169
170##############################
171
172my $inputtree = deserialize("GHNSInfoResponse", $x);
173print $inputtree;
174
175###############################
176
177$inputtree = "GHNSSubscription(id(0) subscription(1))";
178
179my $output = serialize($inputtree, 1);
180
181print deserialize_inner($output);
182
183###############################
184
185my $category = SOAP::Data->name("category" => "example");
186my $r = [$category];
187
188my $method = "GHNSList";
189
190###############################
191
192my $som = SOAP::SOM->new($r);
193my @args = ($som);
194my $ret = eval("DXS::$method(DXS, \@args)");
195
196my $outputtree = deserialize("$method" . "Response", $ret);
197print $outputtree;
198
Note: See TracBrowser for help on using the browser.