ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages_pm.xsl
Revision: 1.7
Committed: Wed May 19 02:09:01 2004 UTC (20 years ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.6: +16 -1 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     <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_pm.xsl (and doc/Makefile)
14    
15     package KGS::Messages;
16    
17 pcg 1.4 use Gtk2::GoBoard::Constants; # for MARK_xyz
18 pcg 1.1
19     use strict;
20    
21     our %type;
22    
23     our %dec_client; # decode messages send to server
24     our %enc_client; # encode messages send to server
25     our %dec_server; # decode messages received from server
26     our %enc_server; # encode messages received from server
27    
28     {
29    
30     my $data; # stores currently processed decoding/encoding packet
31    
32 pcg 1.7 sub _set_data($) { $data = shift } # for debugging or special apps only
33    
34 pcg 1.1 # primitive enc/decoders
35    
36     #############################################################################
37    
38     sub dec_U8 {
39     (my ($r), $data) = unpack "C a*", $data; $r;
40     }
41    
42     sub dec_U16 {
43     (my ($r), $data) = unpack "v a*", $data; $r;
44     }
45    
46     sub dec_U32 {
47     (my ($r), $data) = unpack "V a*", $data; $r;
48     }
49    
50     sub dec_U64 {
51     my ($lo, $hi) = (dec_U32, dec_U32);
52     $lo + $hi * 2**32;
53     }
54    
55     sub dec_I8 {
56     (my ($r), $data) = unpack "c a*", $data;
57     $r;
58     }
59    
60     sub dec_I16 {
61     (my ($r), $data) = unpack "v a*", $data;
62     unpack "s", pack "S", $r;
63     }
64    
65     sub dec_I32 {
66     (my ($r), $data) = unpack "V a*", $data;
67     unpack "i", pack "I", $r;
68     }
69    
70     sub dec_DATA {
71     (my ($r), $data) = ($data, ""); $r;
72     }
73    
74 pcg 1.6 sub dec_ZSTRING {
75 pcg 1.1 $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
76     # use Encode...
77     join "", map chr, unpack "v*", $1;
78     }
79    
80 pcg 1.6 BEGIN { *dec_STRING = \&dec_ZSTRING };
81    
82 pcg 1.1 sub dec_CONSTANT {
83     $_[0];
84     }
85    
86     sub dec_password {
87     dec_U64;
88     }
89    
90     sub dec_HEX { # for debugging
91     "HEX: " . unpack "H*", $data;#d#
92     }
93    
94     #############################################################################
95    
96     sub enc_U8 {
97     $data .= pack "C", $_[0];
98     }
99    
100     sub enc_U16 {
101     $data .= pack "v", $_[0];
102     }
103    
104     sub enc_U32 {
105     $data .= pack "V", $_[0];
106     }
107    
108     sub enc_U64 {
109     enc_U32 $_[0] & 0xffffffff;
110     enc_U32 +($_[0] >> 32) & 0xffffffff;
111     }
112    
113     sub enc_I8 {
114     $data .= pack "c", $_[0];
115     }
116    
117     sub enc_I16 {
118     enc_U16 unpack "S", pack "s", $_[0];
119     }
120    
121     sub enc_I32 {
122     enc_U32 unpack "I", pack "i", $_[0];
123     }
124    
125     sub enc_DATA {
126     # a dream!
127     $data .= $_[0];
128     }
129    
130 pcg 1.6 sub enc_ZSTRING {
131     # should use encode for speed and clarity ;)
132     $data .= pack "v*", (map ord, split //, $_[0]), 0;
133     }
134    
135 pcg 1.1 sub enc_STRING {
136     # should use encode for speed and clarity ;)
137     $data .= pack "v*", map ord, split //, $_[0];
138     }
139    
140     sub enc_CONSTANT {
141     # nop
142     }
143    
144     sub enc_password {
145     require Math::BigInt; # I insist on 32-bit-perl.. should use C
146     # $hash must be 64 bit
147     my $hash = new Math::BigInt;
148     $hash = $hash * 1055 + ord for split //, $_[0];
149     enc_U64 $hash;
150     }
151    
152     sub enc_HEX {
153     die "enc_HEX not defined for good";
154     }
155    
156     ]]>
157    
158     #############################################################################
159     # types
160     <xsl:apply-templates select="descendant::type"/>
161    
162     #############################################################################
163     # structures
164     <xsl:apply-templates select="descendant::struct"/>
165    
166     #############################################################################
167     # "less" primitive types<![CDATA[
168    
169     # this was the most horrible thing to decode. still not everything is decoded correctly(?)
170     sub dec_TREE {
171     my @r;
172     while (length $data) {
173     my $type = dec_U8;
174     my $add = $type < 128;
175    
176     $type &= 127;
177    
178     if ($type == 127) {
179     dec_U8; # unused?? *sigh*
180     push @r, [add_node => dec_I32];
181    
182     } elsif ($type == 126) {
183     push @r, [set_node => dec_I32];
184    
185     } elsif ($type == 125) {
186     push @r, [set_current => dec_I32];
187    
188     } elsif ($type == 34) {
189     push @r, [score => dec_U8, dec_score1000];
190    
191     } elsif ($type == 29) {
192 pcg 1.6 push @r, [type_29 => dec_ZSTRING];
193 pcg 1.7 warn "UNKNOWN TREE TYPE 29 $r[-1][1]\007 PLEASE REPORT";#d#
194 pcg 1.1 die;
195    
196     } elsif ($type == 28) {
197     # move number, only in variations it seems. oh my.
198 pcg 1.6 push @r, [movenum => dec_ZSTRING];
199 pcg 1.1
200 pcg 1.7 } elsif ($type == 26) {
201     push @r, [type_26 => dec_U8]; # sets a flag (?)
202     warn "unknown tree node 26, PLEASE REPORT AND INCLUDE THE GAME\n";
203    
204 pcg 1.1 } elsif ($type == 25) {
205     push @r, [result => dec_result];
206    
207     } elsif ($type == 23) {
208     push @r, [mark => $add, MARK_GRAYED, dec_U8, dec_U8];
209    
210     } elsif ($type == 22) {
211 pcg 1.6 push @r, [mark => $add, dec_U8() ? MARK_SMALL_W : MARK_SMALL_B, dec_U8, dec_U8];
212 pcg 1.1
213     } elsif ($type == 21) {
214     push @r, [mark => $add, MARK_CIRCLE, dec_U8, dec_U8];
215    
216     } elsif ($type == 20) {
217     push @r, [mark => $add, MARK_SQUARE, dec_U8, dec_U8];
218    
219     } elsif ($type == 19) {
220     push @r, [mark => $add, MARK_TRIANGLE, dec_U8, dec_U8];
221    
222     } elsif ($type == 18) {
223 pcg 1.6 push @r, [mark => $add, MARK_LABEL, dec_U8, dec_U8, dec_ZSTRING];
224 pcg 1.1
225     } elsif ($type == 17) {
226     push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
227    
228     } elsif ($type == 16) {
229 pcg 1.6 push @r, [set_stone => dec_U8, dec_U8, dec_U8];
230 pcg 1.1
231     } elsif ($type == 14) {
232 pcg 1.6 push @r, [move => dec_U8, dec_U8, dec_U8];
233 pcg 1.1
234     } elsif (($type >= 4 && $type <= 9)
235     || ($type >= 11 && $type <= 13)
236     || $type == 24) {
237    
238     push @r, [({
239     4 => "date",
240     5 => "unknown_comment5",
241     6 => "unknown_comment6",
242     7 => "unknown_comment7",
243     8 => "unknown_comment8",
244     9 => "copyright", #?
245     11 => "unknown_comment11",
246     12 => "unknown_comment12",
247     13 => "unknown_comment13",
248     24 => "comment",
249 pcg 1.6 })->{$type} => dec_ZSTRING];
250 pcg 1.1
251     } elsif ($type == 3) {
252     push @r, [rank => dec_U8, dec_U32];
253    
254     } elsif ($type == 2) {
255 pcg 1.6 push @r, [player => dec_U8, dec_ZSTRING];
256 pcg 1.1
257     } elsif ($type == 0) {
258     # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
259     # (no wonder he is so keen on keeping it a secret...)
260    
261     push @r, [rules => dec_rules];
262    
263     # OLD
264    
265     } else {
266 pcg 1.7 require KGS::Listener::Debug; # hack
267 pcg 1.1 print STDERR KGS::Listener::Debug::dumpval(\@r);
268     open XTYPE, "|xtype"; print XTYPE $data; close XTYPE;
269     die "unknown tree type $type, PLEASE REPORT and include the game you wanted to watch. thx.";
270    
271     }
272     }
273     \@r;
274     }
275    
276     sub enc_TREE {
277     for (@{$_[0]}) {
278     my ($type, @arg) = @$_;
279    
280     if ($type eq "add_node") {
281     enc_U8 127;
282     enc_U8 0; # unused?
283     enc_I32 $arg[0];
284    
285     } elsif ($type eq "set_node") {
286     enc_U8 126;
287     enc_I32 $arg[0];
288    
289     } elsif ($type eq "set_current") {
290     enc_U8 125;
291     enc_I32 $arg[0];
292    
293     } elsif ($type eq "movenum") {
294     enc_U8 28;
295 pcg 1.6 enc_ZSTRING $arg[0];
296 pcg 1.1
297     } elsif ($type eq "set_stone") {
298 pcg 1.6 enc_U8 16;
299     enc_U8 $arg[0];
300 pcg 1.1 enc_U8 $arg[1];
301     enc_U8 $arg[2];
302    
303     } elsif ($type eq "move") {
304 pcg 1.6 enc_U8 14;
305     enc_U8 $arg[0];
306 pcg 1.1 enc_U8 $arg[1];
307     enc_U8 $arg[2];
308    
309     } elsif ($type eq "comment") {
310     enc_U8 24;
311 pcg 1.6 enc_ZSTRING $arg[0];
312    
313     } elsif ($type eq "mark") {
314     my $op = ({
315     &MARK_GRAYED => 23,
316     &MARK_SMALL_B => 22,
317     &MARK_SMALL_W => 22,
318     &MARK_CIRCLE => 21,
319     &MARK_SQUARE => 20,
320     &MARK_TRIANGLE => 19,
321     &MARK_LABEL => 18,
322     })->{$arg[1]};
323    
324     enc_U8 $op + ($arg[0] ? 0 : 128);
325     enc_U8 $arg[1] == MARK_SMALL_W if $op == 22;
326     enc_U8 $arg[2];
327     enc_U8 $arg[3];
328    
329     enc_ZSTRING $arg[4] if $op == 18;
330 pcg 1.1
331 pcg 1.7 # unknown types
332     } elsif ($type eq "type_29") {
333     enc_U8 29;
334     enc_ZSTRING $arg[0];
335     } elsif ($type eq "type_26") {
336     enc_U8 26;
337     enc_U8 $arg[0];
338    
339 pcg 1.1 } else {
340     warn "unable to encode tree node type $type\n";
341     }
342     }
343 pcg 1.6 };
344    
345 pcg 1.1 ]]>
346    
347     #############################################################################
348     # messages
349     <xsl:apply-templates select="descendant::message"/>
350     }
351    
352     1;
353     </xsl:template>
354    
355     <xsl:template match="type[@type = 'S']">
356     sub dec_<xsl:value-of select="@name"/> {
357     my $res = "";
358     my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
359     $data = pop @r;
360     for (@r) {
361     last unless $_;
362     $res .= chr $_;
363     }
364     # dump extra data to file for later analysis
365 pcg 1.5 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
366 pcg 1.1 $res;
367     }
368    
369     sub enc_<xsl:value-of select="@name"/> {
370     $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
371     }
372     </xsl:template>
373    
374     <xsl:template match="type[@type = 'A']">
375     sub dec_<xsl:value-of select="@name"/> {
376     (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
377     }
378    
379     sub enc_<xsl:value-of select="@name"/> {
380 pcg 1.2 $data .= pack "a<xsl:value-of select="@length"/>", $_[0];
381 pcg 1.1 }
382     </xsl:template>
383    
384     <xsl:template match="type[@multiplier]">
385     sub dec_<xsl:value-of select="@name"/> {
386     (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
387     }
388    
389     sub enc_<xsl:value-of select="@name"/> {
390     enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
391     }
392     </xsl:template>
393    
394     <xsl:template match="member[@array = 'yes']" mode="dec">
395     $r->{<xsl:value-of select="@name"/>} = (my $array = []);
396     while (length $data) {
397     push @$array, dec_<xsl:value-of select="@type"/>
398 pcg 1.3 <xsl:text> </xsl:text>;
399 pcg 1.1 }
400     </xsl:template>
401    
402     <xsl:template match="member" mode="dec">
403     $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
404     <xsl:text> </xsl:text>
405 pcg 1.3 <xsl:value-of select="concat('q|',@value,'|')"/>
406 pcg 1.1 <xsl:if test="@guard-cond">
407     if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
408     <xsl:text>;</xsl:text>
409     </xsl:template>
410    
411     <xsl:template match="member" mode="enc">
412     enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
413     <xsl:text>} : (</xsl:text>
414 pcg 1.3 <xsl:value-of select="concat('q|',@value,'|')"/>
415 pcg 1.1 <xsl:text>);</xsl:text>
416     </xsl:template>
417    
418     <xsl:template match="struct">
419     sub dec_<xsl:value-of select="@name"/> {
420     my $r = {};
421     <xsl:apply-templates select="member" mode="dec"/>
422     <xsl:if test="@class">
423     bless $r, <xsl:value-of select="@class"/>::;
424     </xsl:if>
425     $r;
426     }
427    
428     sub enc_<xsl:value-of select="@name"/> {
429     <xsl:apply-templates select="member" mode="enc"/>
430     }
431     </xsl:template>
432    
433     <xsl:template match="message">
434     # <xsl:value-of select="@name"/>
435     $dec_<xsl:value-of select="@src"/>{0x<xsl:value-of select="@type"/>} = sub {
436     $data = $_[0];
437     my $r;
438     $r->{type} = "<xsl:value-of select="@name"/>";
439     <xsl:apply-templates select="member" mode="dec"/>
440     $r;
441     };
442     $enc_<xsl:value-of select="@src"/>{<xsl:value-of select="@name"/>} = sub {
443     $data = "";
444     enc_U16 0x<xsl:value-of select="@type"/>;
445     <xsl:apply-templates select="member" mode="enc"/>
446     $data;
447     };
448     </xsl:template>
449    
450     <xsl:template match="text()">
451     </xsl:template>
452    
453     </xsl:stylesheet>
454