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