ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
Revision: 1.5
Committed: Tue Jun 10 08:01:17 2003 UTC (20 years, 11 months ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.4: +2 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 <!DOCTYPE xsl:stylesheet>
2     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3    
4     <xsl:output method="text" media-type="text/plain" encoding="utf-8"/>
5    
6 pcg 1.2 <xsl:template match="/"><![CDATA[
7     # This is an automatically generated file.
8     # This is an automatically generated file.
9     # This is an automatically generated file.
10     # This is an automatically generated file.
11     # This is an automatically generated file.
12    
13     # See doc/protocol.xml and doc/doc2messages.xsl
14    
15 pcg 1.1 package KGS::Messages;
16    
17 pcg 1.5 use KGS::Constants; # REPLACE by parsed file, too
18    
19 pcg 1.2 use strict;
20    
21     our %type;
22     our %send;
23     our %recv;
24    
25 pcg 1.1 {
26 pcg 1.2
27     my $data; # stores currently processed decoding/encoding packet
28    
29     # primitive enc/decoders
30    
31     #############################################################################
32    
33     sub dec_U8 {
34     (my ($r), $data) = unpack "C a*", $data; $r;
35     }
36    
37     sub dec_U16 {
38     (my ($r), $data) = unpack "v a*", $data; $r;
39     }
40    
41     sub dec_U32 {
42     (my ($r), $data) = unpack "V a*", $data; $r;
43     }
44    
45     sub dec_U64 {
46     my ($lo, $hi) = (dec_U32, dec_U32);
47     $lo + $hi * 2**32;
48     }
49    
50     sub dec_I8 {
51     (my ($r), $data) = unpack "c a*", $data;
52     $r;
53     }
54    
55     sub dec_I16 {
56     (my ($r), $data) = unpack "v a*", $data;
57     unpack "s", pack "S", $r;
58     }
59    
60     sub dec_I32 {
61     (my ($r), $data) = unpack "V a*", $data;
62     unpack "i", pack "I", $r;
63     }
64    
65     sub dec_DATA {
66     (my ($r), $data) = ($data, ""); $r;
67     }
68    
69     sub dec_STRING {
70     $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
71     # use Encode...
72     join "", map chr, unpack "v*", $1;
73     }
74    
75     sub dec_CONSTANT {
76     $_[0];
77     }
78    
79     sub dec_HEX { # for debugging
80     "HEX: " . unpack "H*", $data;#d#
81     }
82    
83     sub enc_HEX {
84     die "enc_HEX not defined for good";
85     }
86    
87     #############################################################################
88    
89     sub enc_U8 {
90     $data .= pack "C", $_[0];
91     }
92    
93     sub enc_U16 {
94     $data .= pack "v", $_[0];
95     }
96    
97     sub enc_U32 {
98     $data .= pack "V", $_[0];
99     }
100    
101     sub enc_U64 {
102     enc_U32 $_[0] & 0xffffffff;
103     enc_U32 +($_[0] >> 32) & 0xffffffff;
104     }
105    
106     sub enc_I32 {
107     enc_U32 unpack "I", pack "i", $_[0];
108     }
109    
110     sub enc_DATA {
111     # a dream!
112     $data .= $_[0];
113     }
114    
115     sub enc_STRING {
116     # should use encode for speed and clarity ;)
117     $data .= pack "v*", map ord, split //, $_[0];
118     }
119     ]]>
120    
121     #############################################################################
122     # types
123     <xsl:apply-templates select="descendant::type"/>
124    
125     #############################################################################
126     # structures
127     <xsl:apply-templates select="descendant::struct"/>
128    
129     #############################################################################
130     # "less" primitive types<![CDATA[
131    
132     my %marker_code = (
133     triangle => 1,
134     square => 2,
135     circle => 3,
136     small_b => 4,
137     small_w => 5,
138     gray => 6,
139     move => 7,
140     addstone => 8,
141     );
142    
143     my %code_marker = reverse %marker_code;
144    
145     # this was the most horrible thing to decode. still not everything is decoded correctly(?)
146     sub dec_TREE {
147     my @r;
148     while (length $data) {
149     my $type = dec_U8;
150    
151     if ($type == 255) {
152 pcg 1.3 push @r, [add_child => dec_I32];
153 pcg 1.2
154     } elsif ($type == 254) {
155     push @r, ["done"];
156    
157     } elsif ($type == 253) {
158     push @r, ["type253"];
159     # ????
160    
161     } elsif ($type == 252) { # even less clear
162     push @r, ["more"];
163    
164     } elsif ($type == 10) {
165     # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
166     # (no wonder he is so keen on keeping it secret...)
167    
168     push @r, [rules => dec_rules];
169    
170     } elsif ($type == 9 || $type == 22 || $type == 25 || $type == 31 || $type == 32) {
171     push @r, [({
172     9 => "comment",
173     22 => "unknown_comment22",
174     25 => "copyright", #?
175     31 => "date",
176     32 => "unknown_comment32",
177     })->{$type} => dec_STRING];
178    
179     } elsif ($type == 11 || $type == 12) {
180     push @r, [player => $type - 11, dec_STRING];
181    
182     } elsif ($type == 13 || $type == 14) {
183     push @r, [rank => $type - 13, dec_U32];
184    
185     } elsif ($type == 15 || $type == 16) {
186     push @r, [set_timer => $type - 15, dec_time, dec_U16];
187    
188     } elsif ($type == 17 || $type == 18) {
189 pcg 1.4 push @r, [score => $type - 17, dec_score16];
190 pcg 1.2
191     } elsif ($type == 19) {
192     push @r, [result => dec_result];
193    
194     } elsif ($type == 30) {
195     push @r, [active_player => dec_U8];
196    
197     } elsif ($type == 0) { # label(?)
198     my $label;
199     my $c = dec_U16; $label .= chr $c if $c;
200     my $c = dec_U16; $label .= chr $c if $c;
201     my $c = dec_U16; $label .= chr $c if $c;
202    
203     # empty label == remove label
204     push @r, [label => $label, dec_U8, dec_U8];
205    
206     } elsif ($type > 0 && $type < 9) {
207     # 1 marker type triangle
208     # 2 marker type square
209     # 3 marker type circle
210     # 4 small stone b
211     # 5 small stone w
212     # 6 grayed out
213     # 7 move
214     # 8 also move(?) or preset?
215     #
216     # $a1 is probably player again (2 == remove)
217     # x is from left 0 to right boardsize-1
218     # y is from top 0 to bottom boardsize-1
219     push @r, [$code_marker{$type} => dec_U8, dec_U8, dec_U8];
220    
221     } else {
222     push @r, [unknown => $type];
223     }
224     }
225     \@r;
226     }
227    
228     sub enc_TREE {
229     for (@{$_[0]}) {
230     my ($type, @arg) = @$_;
231    
232     if ($type eq "add_child") {
233     enc_U8 255;
234 pcg 1.3 enc_I32 $arg[0];
235 pcg 1.2
236     } elsif ($type eq "done") {
237     enc_U8 254;
238    
239     } elsif ($type eq "more") {
240     enc_U8 253;
241    
242     } elsif ($type eq "comment") {
243     # handle other string params, too
244     enc_U8 9;
245     enc_STRING $arg[0];
246    
247     } elsif ($type eq "label") {
248     enc_U8 0;
249     enc_U16 ord substr "$arg[0]\x00\x00", 0, 1;
250     enc_U16 ord substr "$arg[0]\x00\x00", 1, 1;
251     enc_U16 ord substr "$arg[0]\x00\x00", 2, 1;
252     enc_U8 $arg[1];
253     enc_U8 $arg[2];
254    
255     } elsif ($marker_code{$type}) {
256     enc_U8 $marker_code{$type};
257     enc_U8 $arg[0];
258     enc_U8 $arg[1];
259     enc_U8 $arg[2];
260    
261     } else {
262     warn "unable to encode tree node type $type\n";
263     }
264     }
265     }
266     ]]>
267    
268     #############################################################################
269     # messages
270     <xsl:apply-templates select="descendant::message"/>
271 pcg 1.1 }
272    
273     1;
274     </xsl:template>
275    
276 pcg 1.2 <xsl:template match="type[@type = 'S']">
277     sub dec_<xsl:value-of select="@name"/> {
278     my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
279     $data = pop @r;
280     join ":", map chr, @r;
281     }
282    
283     sub enc_<xsl:value-of select="@name"/> {
284     $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
285     }
286     </xsl:template>
287    
288     <xsl:template match="type[@type = 'A']">
289     sub dec_<xsl:value-of select="@name"/> {
290     (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
291     }
292    
293     sub enc_<xsl:value-of select="@name"/> {
294     $data .= pack "Z<xsl:value-of select="@length"/>", $_[0];
295     }
296     </xsl:template>
297    
298     <xsl:template match="type[@multiplier]">
299     sub dec_<xsl:value-of select="@name"/> {
300     (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
301     }
302    
303     sub enc_<xsl:value-of select="@name"/> {
304     enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
305     }
306     </xsl:template>
307    
308     <xsl:template match="member[@array = 'yes']" mode="dec">
309     $r->{<xsl:value-of select="@name"/>} = (my $array = []);
310     while (length $data) {
311     push @$array, dec_<xsl:value-of select="@type"/>
312     <xsl:text> </xsl:text>
313     <xsl:value-of select="@default"/>;
314     }
315     </xsl:template>
316    
317     <xsl:template match="member" mode="dec">
318     $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
319     <xsl:text> </xsl:text>
320     <xsl:value-of select="@default"/>
321     <xsl:if test="@guard-cond">
322     if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
323     <xsl:text>;</xsl:text>
324     </xsl:template>
325    
326     <xsl:template match="member" mode="enc">
327     <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'">
328     $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/
329     or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'";
330     </xsl:if><!--#d#-->
331     <!-- #d#, remove when kgs is repaired --><xsl:if test="@name = 'channel'">
332     $_[0]{<xsl:value-of select="@name"/>} > 0
333     or Carp::confess "FATAL: tried to send a zero channel id";
334     </xsl:if><!--#d#-->
335     enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
336     <xsl:text>} : (</xsl:text>
337     <xsl:value-of select="@default"/>
338     <xsl:text>);</xsl:text>
339     </xsl:template>
340    
341     <xsl:template match="struct">
342     sub dec_<xsl:value-of select="@name"/> {
343     my $r = {};
344     <xsl:apply-templates select="member" mode="dec"/>
345     <xsl:if test="@class">
346     bless $r, <xsl:value-of select="@class"/>::;
347     </xsl:if>
348     $r;
349     }
350    
351     sub enc_<xsl:value-of select="@name"/> {
352     <xsl:apply-templates select="member" mode="enc"/>
353     }
354 pcg 1.1 </xsl:template>
355    
356     <xsl:template match="message">
357     # <xsl:value-of select="@name"/>
358 pcg 1.2 <xsl:if test="@recv='yes'">
359     $recv{0x<xsl:value-of select="@type"/>} = sub {
360     $data = $_[0];
361     my $r;
362     $r->{type} = "<xsl:value-of select="@name"/>";
363     <xsl:apply-templates select="member" mode="dec"/>
364     $r;
365     };
366 pcg 1.1 </xsl:if>
367 pcg 1.2 <xsl:if test="@send='yes'">
368     $send{<xsl:value-of select="@name"/>} = sub {
369     $data = "";
370     enc_U16 0x<xsl:value-of select="@type"/>;
371     <xsl:apply-templates select="member" mode="enc"/>
372     $data;
373     };
374 pcg 1.1 </xsl:if>
375     </xsl:template>
376    
377     <xsl:template match="member">
378 pcg 1.2 [<xsl:value-of select="@name"/>
379     <xsl:text>=> "</xsl:text>
380     <xsl:value-of select="@type"/>
381     <xsl:text>", "</xsl:text>
382     <xsl:value-of select="@default"/>
383     <xsl:text>", "</xsl:text>
384     <xsl:value-of select="@guard"/>
385     <xsl:text>;"],</xsl:text>
386     </xsl:template>
387 pcg 1.1
388     <xsl:template match="text()">
389     </xsl:template>
390    
391     </xsl:stylesheet>
392