ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages_pm.xsl
Revision: 1.11
Committed: Sat May 29 06:38:26 2004 UTC (20 years ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.10: +3 -2 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 pcg 1.8 my $old_data = $data;#d#
173 pcg 1.1 while (length $data) {
174     my $type = dec_U8;
175     my $add = $type < 128;
176    
177 pcg 1.8 my $ofs = (length $old_data) - (length $data);#d#
178    
179 pcg 1.1 $type &= 127;
180    
181     if ($type == 127) {
182     dec_U8; # unused?? *sigh*
183     push @r, [add_node => dec_I32];
184    
185     } elsif ($type == 126) {
186     push @r, [set_node => dec_I32];
187    
188     } elsif ($type == 125) {
189     push @r, [set_current => dec_I32];
190    
191     } elsif ($type == 34) {
192     push @r, [score => dec_U8, dec_score1000];
193    
194     } elsif ($type == 29) {
195 pcg 1.6 push @r, [type_29 => dec_ZSTRING];
196 pcg 1.7 warn "UNKNOWN TREE TYPE 29 $r[-1][1]\007 PLEASE REPORT";#d#
197 pcg 1.1 die;
198    
199     } elsif ($type == 28) {
200     # move number, only in variations it seems. oh my.
201 pcg 1.6 push @r, [movenum => dec_ZSTRING];
202 pcg 1.1
203 pcg 1.7 } elsif ($type == 26) {
204     push @r, [type_26 => dec_U8]; # sets a flag (?)
205 pcg 1.11 warn "unknown tree node 26, please ignore\n";
206     # possibly marks moves done while editing, as opposed to game-moves(?)
207 pcg 1.7
208 pcg 1.1 } elsif ($type == 25) {
209     push @r, [result => dec_result];
210    
211     } elsif ($type == 23) {
212     push @r, [mark => $add, MARK_GRAYED, dec_U8, dec_U8];
213    
214     } elsif ($type == 22) {
215 pcg 1.6 push @r, [mark => $add, dec_U8() ? MARK_SMALL_W : MARK_SMALL_B, dec_U8, dec_U8];
216 pcg 1.1
217     } elsif ($type == 21) {
218 pcg 1.8 push @r, [mark => $add, MARK_SQUARE, dec_U8, dec_U8];
219 pcg 1.1
220     } elsif ($type == 20) {
221 pcg 1.8 push @r, [mark => $add, MARK_TRIANGLE, dec_U8, dec_U8];
222 pcg 1.1
223     } elsif ($type == 19) {
224 pcg 1.8 push @r, [mark => $add, MARK_LABEL, dec_U8, dec_U8, dec_ZSTRING];
225     #push @r, [unknown_18 => dec_U8, dec_U32, dec_U32, dec_U8, dec_U32, dec_U32, dec_U32];
226     #push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
227 pcg 1.1
228     } elsif ($type == 18) {
229 pcg 1.8 push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
230 pcg 1.1
231     } elsif ($type == 17) {
232 pcg 1.8 push @r, [set_stone => dec_U8, dec_U8, dec_U8];#d#?
233    
234     # } elsif ($type == 16) {
235     # push @r, [set_stone => dec_U8, dec_U8, dec_U8];#o#
236 pcg 1.1
237 pcg 1.8 } elsif ($type == 15) {
238     push @r, [mark => $add, MARK_CIRCLE, dec_U8, dec_U8];#d#?
239 pcg 1.1
240     } elsif ($type == 14) {
241 pcg 1.6 push @r, [move => dec_U8, dec_U8, dec_U8];
242 pcg 1.1
243     } elsif (($type >= 4 && $type <= 9)
244     || ($type >= 11 && $type <= 13)
245     || $type == 24) {
246    
247     push @r, [({
248     4 => "date",
249     5 => "unknown_comment5",
250 pcg 1.8 6 => "game_id", #?#
251 pcg 1.1 7 => "unknown_comment7",
252     8 => "unknown_comment8",
253     9 => "copyright", #?
254     11 => "unknown_comment11",
255     12 => "unknown_comment12",
256     13 => "unknown_comment13",
257     24 => "comment",
258 pcg 1.6 })->{$type} => dec_ZSTRING];
259 pcg 1.1
260     } elsif ($type == 3) {
261     push @r, [rank => dec_U8, dec_U32];
262    
263     } elsif ($type == 2) {
264 pcg 1.6 push @r, [player => dec_U8, dec_ZSTRING];
265 pcg 1.1
266 pcg 1.8 } elsif ($type == 1) {
267     push @r, [sgf_name => dec_ZSTRING];
268    
269 pcg 1.1 } elsif ($type == 0) {
270     # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
271     # (no wonder he is so keen on keeping it a secret...)
272    
273     push @r, [rules => dec_rules];
274    
275     # OLD
276    
277     } else {
278 pcg 1.7 require KGS::Listener::Debug; # hack
279 pcg 1.1 print STDERR KGS::Listener::Debug::dumpval(\@r);
280 pcg 1.8 printf "offset: 0x%04x\n", $ofs;
281     open XTYPE, "|xtype"; print XTYPE $old_data; close XTYPE;
282     warn "unknown tree type $type, PLEASE REPORT and include the game you wanted to watch. thx.";
283 pcg 1.1
284     }
285 pcg 1.8
286 pcg 1.11 #push @{$r[-1]}, offset => sprintf "0x%x", $ofs;#d#
287 pcg 1.8
288 pcg 1.1 }
289 pcg 1.8 # print STDERR KGS::Listener::Debug::dumpval(\@r);#d#
290     # return [];#d#
291 pcg 1.1 \@r;
292     }
293    
294     sub enc_TREE {
295     for (@{$_[0]}) {
296     my ($type, @arg) = @$_;
297    
298     if ($type eq "add_node") {
299     enc_U8 127;
300     enc_U8 0; # unused?
301     enc_I32 $arg[0];
302    
303     } elsif ($type eq "set_node") {
304     enc_U8 126;
305     enc_I32 $arg[0];
306    
307     } elsif ($type eq "set_current") {
308     enc_U8 125;
309     enc_I32 $arg[0];
310    
311     } elsif ($type eq "movenum") {
312     enc_U8 28;
313 pcg 1.6 enc_ZSTRING $arg[0];
314 pcg 1.1
315     } elsif ($type eq "set_stone") {
316 pcg 1.6 enc_U8 16;
317     enc_U8 $arg[0];
318 pcg 1.1 enc_U8 $arg[1];
319     enc_U8 $arg[2];
320    
321     } elsif ($type eq "move") {
322 pcg 1.6 enc_U8 14;
323     enc_U8 $arg[0];
324 pcg 1.1 enc_U8 $arg[1];
325     enc_U8 $arg[2];
326    
327     } elsif ($type eq "comment") {
328     enc_U8 24;
329 pcg 1.6 enc_ZSTRING $arg[0];
330    
331     } elsif ($type eq "mark") {
332     my $op = ({
333     &MARK_GRAYED => 23,
334     &MARK_SMALL_B => 22,
335     &MARK_SMALL_W => 22,
336 pcg 1.10 &MARK_SQUARE => 21,
337     &MARK_TRIANGLE => 20,
338     &MARK_LABEL => 19,
339     &MARK_CIRCLE => 15,
340 pcg 1.6 })->{$arg[1]};
341    
342     enc_U8 $op + ($arg[0] ? 0 : 128);
343     enc_U8 $arg[1] == MARK_SMALL_W if $op == 22;
344     enc_U8 $arg[2];
345     enc_U8 $arg[3];
346    
347     enc_ZSTRING $arg[4] if $op == 18;
348 pcg 1.1
349 pcg 1.7 # unknown types
350     } elsif ($type eq "type_29") {
351     enc_U8 29;
352     enc_ZSTRING $arg[0];
353     } elsif ($type eq "type_26") {
354     enc_U8 26;
355     enc_U8 $arg[0];
356    
357 pcg 1.1 } else {
358     warn "unable to encode tree node type $type\n";
359     }
360     }
361 pcg 1.6 };
362    
363 pcg 1.1 ]]>
364    
365     #############################################################################
366     # messages
367     <xsl:apply-templates select="descendant::message"/>
368     }
369    
370     1;
371     </xsl:template>
372    
373     <xsl:template match="type[@type = 'S']">
374     sub dec_<xsl:value-of select="@name"/> {
375     my $res = "";
376     my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
377     $data = pop @r;
378     for (@r) {
379     last unless $_;
380     $res .= chr $_;
381     }
382     # dump extra data to file for later analysis
383 pcg 1.5 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
384 pcg 1.1 $res;
385     }
386    
387     sub enc_<xsl:value-of select="@name"/> {
388     $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
389     }
390     </xsl:template>
391    
392     <xsl:template match="type[@type = 'A']">
393     sub dec_<xsl:value-of select="@name"/> {
394     (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
395     }
396    
397     sub enc_<xsl:value-of select="@name"/> {
398 pcg 1.2 $data .= pack "a<xsl:value-of select="@length"/>", $_[0];
399 pcg 1.1 }
400     </xsl:template>
401    
402     <xsl:template match="type[@multiplier]">
403     sub dec_<xsl:value-of select="@name"/> {
404     (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
405     }
406    
407     sub enc_<xsl:value-of select="@name"/> {
408     enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
409     }
410     </xsl:template>
411    
412     <xsl:template match="member[@array = 'yes']" mode="dec">
413     $r->{<xsl:value-of select="@name"/>} = (my $array = []);
414     while (length $data) {
415     push @$array, dec_<xsl:value-of select="@type"/>
416 pcg 1.3 <xsl:text> </xsl:text>;
417 pcg 1.1 }
418     </xsl:template>
419    
420     <xsl:template match="member" mode="dec">
421     $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
422     <xsl:text> </xsl:text>
423 pcg 1.3 <xsl:value-of select="concat('q|',@value,'|')"/>
424 pcg 1.1 <xsl:if test="@guard-cond">
425     if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
426     <xsl:text>;</xsl:text>
427     </xsl:template>
428    
429     <xsl:template match="member" mode="enc">
430     enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
431     <xsl:text>} : (</xsl:text>
432 pcg 1.3 <xsl:value-of select="concat('q|',@value,'|')"/>
433 pcg 1.1 <xsl:text>);</xsl:text>
434     </xsl:template>
435    
436     <xsl:template match="struct">
437     sub dec_<xsl:value-of select="@name"/> {
438     my $r = {};
439     <xsl:apply-templates select="member" mode="dec"/>
440     <xsl:if test="@class">
441     bless $r, <xsl:value-of select="@class"/>::;
442     </xsl:if>
443     $r;
444     }
445    
446     sub enc_<xsl:value-of select="@name"/> {
447     <xsl:apply-templates select="member" mode="enc"/>
448     }
449     </xsl:template>
450    
451     <xsl:template match="message">
452     # <xsl:value-of select="@name"/>
453     $dec_<xsl:value-of select="@src"/>{0x<xsl:value-of select="@type"/>} = sub {
454     $data = $_[0];
455     my $r;
456     $r->{type} = "<xsl:value-of select="@name"/>";
457     <xsl:apply-templates select="member" mode="dec"/>
458     $r;
459     };
460     $enc_<xsl:value-of select="@src"/>{<xsl:value-of select="@name"/>} = sub {
461     $data = "";
462     enc_U16 0x<xsl:value-of select="@type"/>;
463     <xsl:apply-templates select="member" mode="enc"/>
464     $data;
465     };
466     </xsl:template>
467    
468     <xsl:template match="text()">
469     </xsl:template>
470    
471     </xsl:stylesheet>
472