ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
Revision: 1.15
Committed: Tue Jul 22 03:35:34 2003 UTC (20 years, 10 months ago) by pcg
Content type: application/xml
Branch: MAIN
CVS Tags: stable
Changes since 1.14: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
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.xsl
14
15 package KGS::Messages;
16
17 use KGS::Constants; # REPLACE by parsed file, too
18
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 # primitive enc/decoders
33
34 #############################################################################
35
36 sub dec_U8 {
37 (my ($r), $data) = unpack "C a*", $data; $r;
38 }
39
40 sub dec_U16 {
41 (my ($r), $data) = unpack "v a*", $data; $r;
42 }
43
44 sub dec_U32 {
45 (my ($r), $data) = unpack "V a*", $data; $r;
46 }
47
48 sub dec_U64 {
49 my ($lo, $hi) = (dec_U32, dec_U32);
50 $lo + $hi * 2**32;
51 }
52
53 sub dec_I8 {
54 (my ($r), $data) = unpack "c a*", $data;
55 $r;
56 }
57
58 sub dec_I16 {
59 (my ($r), $data) = unpack "v a*", $data;
60 unpack "s", pack "S", $r;
61 }
62
63 sub dec_I32 {
64 (my ($r), $data) = unpack "V a*", $data;
65 unpack "i", pack "I", $r;
66 }
67
68 sub dec_DATA {
69 (my ($r), $data) = ($data, ""); $r;
70 }
71
72 sub dec_STRING {
73 $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
74 # use Encode...
75 join "", map chr, unpack "v*", $1;
76 }
77
78 sub dec_CONSTANT {
79 $_[0];
80 }
81
82 sub dec_password {
83 dec_U64;
84 }
85
86 sub dec_HEX { # for debugging
87 "HEX: " . unpack "H*", $data;#d#
88 }
89
90 #############################################################################
91
92 sub enc_U8 {
93 $data .= pack "C", $_[0];
94 }
95
96 sub enc_U16 {
97 $data .= pack "v", $_[0];
98 }
99
100 sub enc_U32 {
101 $data .= pack "V", $_[0];
102 }
103
104 sub enc_U64 {
105 enc_U32 $_[0] & 0xffffffff;
106 enc_U32 +($_[0] >> 32) & 0xffffffff;
107 }
108
109 sub enc_I8 {
110 $data .= pack "c", $_[0];
111 }
112
113 sub enc_I16 {
114 enc_U16 unpack "S", pack "s", $_[0];
115 }
116
117 sub enc_I32 {
118 enc_U32 unpack "I", pack "i", $_[0];
119 }
120
121 sub enc_DATA {
122 # a dream!
123 $data .= $_[0];
124 }
125
126 sub enc_STRING {
127 # should use encode for speed and clarity ;)
128 $data .= pack "v*", map ord, split //, $_[0];
129 }
130
131 sub enc_CONSTANT {
132 # nop
133 }
134
135 sub enc_password {
136 require Math::BigInt; # I insist on 32-bit-perl.. should use C
137 # $hash must be 64 bit
138 my $hash = new Math::BigInt;
139 $hash = $hash * 1055 + ord for split //, $_[0];
140 enc_U64 $hash;
141 }
142
143 sub enc_HEX {
144 die "enc_HEX not defined for good";
145 }
146
147 ]]>
148
149 #############################################################################
150 # types
151 <xsl:apply-templates select="descendant::type"/>
152
153 #############################################################################
154 # structures
155 <xsl:apply-templates select="descendant::struct"/>
156
157 #############################################################################
158 # "less" primitive types<![CDATA[
159
160 my %marker_code = (
161 triangle => 1,
162 square => 2,
163 circle => 3,
164 small_b => 4,
165 small_w => 5,
166 gray => 6,
167 move => 7,
168 addstone => 8,
169 );
170
171 my %code_marker = reverse %marker_code;
172
173 # this was the most horrible thing to decode. still not everything is decoded correctly(?)
174 sub dec_TREE {
175 my @r;
176 while (length $data) {
177 my $type = dec_U8;
178 my $add = $type < 128;
179
180 $type &= 127;
181
182 if ($type == 127) {
183 dec_U8; # unused?? *sigh*
184 push @r, [add_node => dec_I32];
185
186 } elsif ($type == 126) {
187 push @r, [set_node => dec_I32];
188
189 } elsif ($type == 125) {
190 push @r, [set_current => dec_I32];
191
192 } elsif ($type == 34) {
193 push @r, [score => dec_U8, dec_score1000];
194
195 } elsif ($type == 29) {
196 push @r, [type_29 => dec_STRING];
197 warn "TYPE 29 $r[-1][1]\007 PLEASE REPORT";#d#
198 die;
199
200 } elsif ($type == 28) {
201 # move number, only in variations it seems. oh my.
202 push @r, [movenum => dec_STRING];
203
204 } 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 push @r, [mark => $add, (&dec_U8 ? MARK_SMALL_W : MARK_SMALL_B), dec_U8, dec_U8];
212
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 push @r, [mark => $add, MARK_LABEL, dec_U8, dec_U8, dec_STRING];
224
225 } elsif ($type == 17) {
226 push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
227
228 } elsif ($type == 16) {
229 push @r, [set_stone => $add, dec_U8, dec_U8, dec_U8];
230
231 } elsif ($type == 14) {
232 push @r, [move => $add, dec_U8, dec_U8, dec_U8];
233
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 })->{$type} => dec_STRING];
250
251 } elsif ($type == 3) {
252 push @r, [rank => dec_U8, dec_U32];
253
254 } elsif ($type == 2) {
255 push @r, [player => dec_U8, dec_STRING];
256
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 } elsif (1) {
266 print STDERR KGS::Listener::Debug::dumpval(\@r);
267 open XTYPE, "|xtype"; print XTYPE $data; close XTYPE;
268 die "unknown tree type $type, PLEASE REPORT and include the game you wanted to watch. thx.";
269
270 } elsif ($type == 30) {
271 push @r, [active_player => dec_U8];
272
273 } elsif ($type == 0) { # label(?)
274 my $label;
275 my $c = dec_U16; $label .= chr $c if $c;
276 my $c = dec_U16; $label .= chr $c if $c;
277 my $c = dec_U16; $label .= chr $c if $c;
278
279 # empty label == remove label
280 push @r, [label => $label, dec_U8, dec_U8];
281
282 } elsif ($type > 0 && $type < 9) {
283 # 1 marker type triangle
284 # 2 marker type square
285 # 3 marker type circle
286 # 4 small stone b
287 # 5 small stone w
288 # 6 grayed out
289 # 7 move
290 # 8 also move(?) or preset?
291 #
292 # $a1 is probably player again (2 == remove)
293 # x is from left 0 to right boardsize-1
294 # y is from top 0 to bottom boardsize-1
295 push @r, [$code_marker{$type} => dec_U8, dec_U8, dec_U8];
296
297 } else {
298 push @r, [unknown => $type];
299 }
300 }
301 \@r;
302 }
303
304 sub enc_TREE {
305 die "tree encoding not yet supported again";
306 for (@{$_[0]}) {
307 my ($type, @arg) = @$_;
308
309 if ($type eq "add_child") {
310 enc_U8 255;
311 enc_I32 $arg[0];
312
313 } elsif ($type eq "done") {
314 enc_U8 254;
315
316 } elsif ($type eq "more") {
317 enc_U8 253;
318
319 } elsif ($type eq "comment") {
320 # handle other string params, too
321 enc_U8 9;
322 enc_STRING $arg[0];
323
324 } elsif ($type eq "label") {
325 enc_U8 0;
326 enc_U16 ord substr "$arg[0]\x00\x00", 0, 1;
327 enc_U16 ord substr "$arg[0]\x00\x00", 1, 1;
328 enc_U16 ord substr "$arg[0]\x00\x00", 2, 1;
329 enc_U8 $arg[1];
330 enc_U8 $arg[2];
331
332 } elsif ($marker_code{$type}) {
333 enc_U8 $marker_code{$type};
334 enc_U8 $arg[0];
335 enc_U8 $arg[1];
336 enc_U8 $arg[2];
337
338 } else {
339 warn "unable to encode tree node type $type\n";
340 }
341 }
342 }
343 ]]>
344
345 #############################################################################
346 # messages
347 <xsl:apply-templates select="descendant::message"/>
348 }
349
350 1;
351 </xsl:template>
352
353 <xsl:template match="type[@type = 'S']">
354 sub dec_<xsl:value-of select="@name"/> {
355 my $res = "";
356 my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
357 $data = pop @r;
358 for (@r) {
359 last unless $_;
360 $res .= chr $_;
361 }
362 # dump extra data to file for later analysis
363 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/tmp/dump"; print DUMP $x; close DUMP;#d#
364 $res;
365 }
366
367 sub enc_<xsl:value-of select="@name"/> {
368 $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
369 }
370 </xsl:template>
371
372 <xsl:template match="type[@type = 'A']">
373 sub dec_<xsl:value-of select="@name"/> {
374 (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
375 }
376
377 sub enc_<xsl:value-of select="@name"/> {
378 $data .= pack "Z<xsl:value-of select="@length"/>", $_[0];
379 }
380 </xsl:template>
381
382 <xsl:template match="type[@multiplier]">
383 sub dec_<xsl:value-of select="@name"/> {
384 (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
385 }
386
387 sub enc_<xsl:value-of select="@name"/> {
388 enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
389 }
390 </xsl:template>
391
392 <xsl:template match="member[@array = 'yes']" mode="dec">
393 $r->{<xsl:value-of select="@name"/>} = (my $array = []);
394 while (length $data) {
395 push @$array, dec_<xsl:value-of select="@type"/>
396 <xsl:text> </xsl:text>
397 <xsl:value-of select="@default"/>;
398 }
399 </xsl:template>
400
401 <xsl:template match="member" mode="dec">
402 $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
403 <xsl:text> </xsl:text>
404 <xsl:value-of select="@default"/>
405 <xsl:if test="@guard-cond">
406 if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
407 <xsl:text>;</xsl:text>
408 </xsl:template>
409
410 <xsl:template match="member" mode="enc">
411 <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'">
412 $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/
413 or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'";
414 </xsl:if><!--#d#-->
415 enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
416 <xsl:text>} : (</xsl:text>
417 <xsl:value-of select="@default"/>
418 <xsl:text>);</xsl:text>
419 </xsl:template>
420
421 <xsl:template match="struct">
422 sub dec_<xsl:value-of select="@name"/> {
423 my $r = {};
424 <xsl:apply-templates select="member" mode="dec"/>
425 <xsl:if test="@class">
426 bless $r, <xsl:value-of select="@class"/>::;
427 </xsl:if>
428 $r;
429 }
430
431 sub enc_<xsl:value-of select="@name"/> {
432 <xsl:apply-templates select="member" mode="enc"/>
433 }
434 </xsl:template>
435
436 <xsl:template match="message">
437 # <xsl:value-of select="@name"/>
438 $dec_<xsl:value-of select="@src"/>{0x<xsl:value-of select="@type"/>} = sub {
439 $data = $_[0];
440 my $r;
441 $r->{type} = "<xsl:value-of select="@name"/>";
442 <xsl:apply-templates select="member" mode="dec"/>
443 $r;
444 };
445 $enc_<xsl:value-of select="@src"/>{<xsl:value-of select="@name"/>} = sub {
446 $data = "";
447 enc_U16 0x<xsl:value-of select="@type"/>;
448 <xsl:apply-templates select="member" mode="enc"/>
449 $data;
450 };
451 </xsl:template>
452
453 <xsl:template match="member">
454 [<xsl:value-of select="@name"/>
455 <xsl:text>=> "</xsl:text>
456 <xsl:value-of select="@type"/>
457 <xsl:text>", "</xsl:text>
458 <xsl:value-of select="@default"/>
459 <xsl:text>", "</xsl:text>
460 <xsl:value-of select="@guard"/>
461 <xsl:text>;"],</xsl:text>
462 </xsl:template>
463
464 <xsl:template match="text()">
465 </xsl:template>
466
467 </xsl:stylesheet>
468