1<?php
2	/**
3	* XMLRPC server
4	* @author Dan Kuykendall <dan@kuykendall.org>
5	* @copyright Copyright (C) 2004 Free Software Foundation, Inc. http://www.fsf.org/
6	* @license http://www.fsf.org/licenses/gpl.html GNU General Public License
7	* @package phpgwapi
8	* @subpackage communication
9	* @version $Id: xmlrpc.interop.php 15462 2004-11-06 15:34:27Z powerstat $
10	*/
11
12	// a PHP version
13	// of the state-number server
14	// send me an integer and i'll sell you a state
15
16	$stateNames = array(
17		'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
18		'Colorado', 'Columbia', 'Connecticut', 'Delaware', 'Florida',
19		'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas',
20		'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan',
21		'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada',
22		'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina',
23		'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island',
24		'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont',
25		'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'
26	);
27
28	$findstate_sig = array(array(xmlrpcString, xmlrpcInt));
29
30	$findstate_doc = 'When passed an integer between 1 and 51 returns the
31name of a US state, where the integer is the index of that state name
32in an alphabetic order.';
33
34
35	/**
36	* Find state
37	*
38	* @param object $m
39	* @return object xmlrpcresp - error or state name
40	*/
41	function findstate($m)
42	{
43		$err='';
44		// get the first param
45		$sno=$m->getParam(0);
46		// if it's there and the correct type
47
48		if (isset($sno) && ($sno->scalartyp()=='int'))
49		{
50			// extract the value of the state number
51			$snv=$sno->scalarval();
52			// look it up in our array (zero-based)
53			if (isset($GLOBALS['stateNames'][$snv-1]))
54			{
55				$sname=$GLOBALS['stateNames'][$snv-1];
56			}
57			else
58			{
59				// not, there so complain
60				$err="I don't have a state for the index '" . $snv . "'";
61			}
62		}
63		else
64		{
65			// parameter mismatch, complain
66			$err='One integer parameter required';
67		}
68
69		// if we generated an error, create an error return response
70		if ($err)
71		{
72			return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval'), $GLOBALS['xmlrpcerruser'], $err);
73		}
74		else
75		{
76			// otherwise, we create the right response
77			// with the state name
78			return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$sname));
79		}
80	}
81
82	$addtwo_sig=array(array(xmlrpcInt, xmlrpcInt, xmlrpcInt));
83	$addtwo_doc='Add two integers together and return the result';
84
85	function addtwo($m)
86	{
87		$s=$m->getParam(0);
88		$t=$m->getParam(1);
89		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$s->scalarval()+$t->scalarval(),'int'));
90	}
91
92	$addtwodouble_sig=array(array(xmlrpcDouble, xmlrpcDouble, xmlrpcDouble));
93	$addtwodouble_doc='Add two doubles together and return the result';
94
95	function addtwodouble($m)
96	{
97		$s=$m->getParam(0);
98		$t=$m->getParam(1);
99		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$s->scalarval()+$t->scalarval(),'double'));
100	}
101
102	$stringecho_sig=array(array(xmlrpcString, xmlrpcString));
103	$stringecho_doc='Accepts a string parameter, returns the string.';
104
105	function stringecho($m)
106	{
107		// just sends back a string
108		$s=$m->getParam(0);
109		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$s->scalarval()));
110	}
111
112	$echoback_sig=array(array(xmlrpcString, xmlrpcString));
113	$echoback_doc='Accepts a string parameter, returns the entire incoming payload';
114
115	function echoback($m)
116	{
117		// just sends back a string with what i got
118		// send to me, just escaped, that's all
119		//
120		// $m is an incoming message
121		$s="I got the following message:\n" . $m->serialize();
122		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$s));
123	}
124
125	$echosixtyfour_sig=array(array(xmlrpcString, xmlrpcBase64));
126	$echosixtyfour_doc='Accepts a base64 parameter and returns it decoded as a string';
127
128	function echosixtyfour($m)
129	{
130		// accepts an encoded value, but sends it back
131		// as a normal string. this is to test base64 encoding
132		// is working as expected
133		$incoming=$m->getParam(0);
134		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$incoming->scalarval(), 'string'));
135	}
136
137	$bitflipper_sig=array(array(xmlrpcArray, xmlrpcArray));
138	$bitflipper_doc='Accepts an array of booleans, and returns them inverted';
139
140	function bitflipper($m)
141	{
142		$v  = $m->getParam(0);
143		$sz = $v->arraysize();
144		$rv = CreateObject('phpgwapi.xmlrpcval',array(), xmlrpcArray);
145
146		for($j=0; $j<$sz; $j++)
147		{
148			$b = $v->arraymem($j);
149			if ($b->scalarval())
150			{
151				$rv->addScalar(False, 'boolean');
152			}
153			else
154			{
155				$rv->addScalar(True, 'boolean');
156			}
157		}
158		return CreateObject('phpgwapi.xmlrpcresp',$rv);
159	}
160
161	// Sorting demo
162	//
163	// send me an array of structs thus:
164	//
165	// Dave 35
166	// Edd  45
167	// Fred 23
168	// Barney 37
169	//
170	// and I'll return it to you in sorted order
171
172	function agesorter_compare($a, $b)
173	{
174		// don't even ask me _why_ these come padded with
175		// hyphens, I couldn't tell you :p
176		$a=ereg_replace('-', '', $a);
177		$b=ereg_replace('-', '', $b);
178
179		if ($GLOBALS['agesorter_arr'][$a]==$agesorter[$b])
180		{
181			return 0;
182		}
183		return ($GLOBALS['agesorter_arr'][$a] > $GLOBALS['agesorter_arr'][$b]) ? -1 : 1;
184	}
185
186	$agesorter_sig=array(array(xmlrpcArray, xmlrpcArray));
187	$agesorter_doc='Send this method an array of [string, int] structs, eg:
188<PRE>
189 Dave   35
190 Edd    45
191 Fred   23
192 Barney 37
193</PRE>
194And the array will be returned with the entries sorted by their numbers.
195';
196
197	function agesorter($m)
198	{
199		global $s;
200
201		xmlrpc_debugmsg("Entering 'agesorter'");
202		// get the parameter
203		$sno = $m->getParam(0);
204		// error string for [if|when] things go wrong
205		$err = '';
206		// create the output value
207		$v = CreateObject('phpgwapi.xmlrpcval');
208		$agar = array();
209
210		if (isset($sno) && $sno->kindOf()=='array')
211		{
212			$max = $sno->arraysize();
213			// TODO: create debug method to print can work once more
214			// print "<!-- found $max array elements -->\n";
215			for($i=0; $i<$max; $i++)
216			{
217				$rec = $sno->arraymem($i);
218				if ($rec->kindOf()!='struct')
219				{
220					$err = 'Found non-struct in array at element ' . $i;
221					break;
222				}
223				// extract name and age from struct
224				$n = $rec->structmem('name');
225				$a = $rec->structmem('age');
226				// $n and $a are xmlrpcvals,
227				// so get the scalarval from them
228				$agar[$n->scalarval()] = $a->scalarval();
229			}
230
231			$GLOBALS['agesorter_arr'] = $agar;
232			// hack, must make global as uksort() won't
233			// allow us to pass any other auxilliary information
234			uksort($GLOBALS['agesorter_arr'], agesorter_compare);
235			$outAr = array();
236			while (list($key,$val) = each($GLOBALS['agesorter_arr']))
237			{
238				// recreate each struct element
239				$outAr[] = CreateObject('phpgwapi.xmlrpcval',array(
240					'name' => CreateObject('phpgwapi.xmlrpcval',$key),
241					'age'  => CreateObject('phpgwapi.xmlrpcval',$val, 'int')
242					),
243					'struct'
244				);
245			}
246			// add this array to the output value
247			$v->addArray($outAr);
248		}
249		else
250		{
251			$err = 'Must be one parameter, an array of structs';
252		}
253
254		if ($err)
255		{
256			return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval'), $GLOBALS['xmlrpcerruser'], $err);
257		}
258		else
259		{
260			return CreateObject('phpgwapi.xmlrpcresp',$v);
261		}
262	}
263
264	// signature and instructions, place these in the dispatch map
265
266	$mail_send_sig = array(
267		array(
268			xmlrpcBoolean, xmlrpcString, xmlrpcString,
269			xmlrpcString, xmlrpcString, xmlrpcString,
270			xmlrpcString, xmlrpcString
271		)
272	);
273
274	$mail_send_doc = 'mail.send(recipient, subject, text, sender, cc, bcc, mimetype)
275<br />recipient, cc, and bcc are strings, comma-separated lists of email addresses, as described above.
276<br />subject is a string, the subject of the message.
277<br />sender is a string, it\'s the email address of the person sending the message. This string can not be
278a comma-separated list, it must contain a single email address only.
279text is a string, it contains the body of the message.
280<br />mimetype, a string, is a standard MIME type, for example, text/plain.
281';
282
283	// WARNING; this functionality depends on the sendmail -t option
284	// it may not work with Windows machines properly; particularly
285	// the Bcc option.  Sneak on your friends at your own risk!
286	function mail_send($m)
287	{
288		$err = '';
289
290		$mTo   = $m->getParam(0);
291		$mSub  = $m->getParam(1);
292		$mBody = $m->getParam(2);
293		$mFrom = $m->getParam(3);
294		$mCc   = $m->getParam(4);
295		$mBcc  = $m->getParam(5);
296		$mMime = $m->getParam(6);
297
298		if ($mTo->scalarval() == '')
299		{
300			$err = "Error, no 'To' field specified";
301		}
302		if ($mFrom->scalarval() == '')
303		{
304			$err = "Error, no 'From' field specified";
305		}
306		$msghdr  = 'From: ' . $mFrom->scalarval() . "\n";
307		$msghdr .= 'To: '. $mTo->scalarval() . "\n";
308
309		if ($mCc->scalarval()!='')
310		{
311			$msghdr .= 'Cc: ' . $mCc->scalarval(). "\n";
312		}
313		if ($mBcc->scalarval()!='')
314		{
315			$msghdr .= 'Bcc: ' . $mBcc->scalarval(). "\n";
316		}
317		if ($mMime->scalarval()!='')
318		{
319			$msghdr .= 'Content-type: ' . $mMime->scalarval() . "\n";
320		}
321
322		$msghdr .= 'X-Mailer: XML-RPC for PHP mailer 1.0';
323
324		if ($err == '')
325		{
326			if (!mail('', $mSub->scalarval(), $mBody->scalarval(), $msghdr))
327			{
328				$err = 'Error, could not send the mail.';
329			}
330		}
331
332		if ($err)
333		{
334			return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval'), $GLOBALS['xmlrpcerruser'], $err);
335		}
336		else
337		{
338			return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval','true', xmlrpcBoolean));
339		}
340	}
341
342	$v1_arrayOfStructs_sig = array(array(xmlrpcInt, xmlrpcArray));
343	$v1_arrayOfStructs_doc = 'This handler takes a single parameter, an array of structs, each of which contains at least three elements named moe, larry and curly, all <i4>s. Your handler must add all the struct elements named curly and return the result.';
344
345	function v1_arrayOfStructs($m)
346	{
347		$sno = $m->getParam(0);
348		$numcurly = 0;
349		for($i=0; $i<$sno->arraysize(); $i++)
350		{
351			$str = $sno->arraymem($i);
352			$str->structreset();
353			while(list($key,$val) = $str->structeach())
354			{
355				if ($key == 'curly')
356				{
357					$numcurly += $val->scalarval();
358				}
359			}
360		}
361		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$numcurly, 'int'));
362	}
363
364	$v1_easyStruct_sig = array(array(xmlrpcInt, xmlrpcStruct));
365	$v1_easyStruct_doc = 'This handler takes a single parameter, a struct, containing at least three elements named moe, larry and curly, all &lt;i4&gt;s. Your handler must add the three numbers and return the result.';
366
367	function v1_easyStruct($m)
368	{
369		$sno   = $m->getParam(0);
370		$moe   = $sno->structmem('moe');
371		$larry = $sno->structmem('larry');
372		$curly = $sno->structmem('curly');
373		$num   = $moe->scalarval() + $larry->scalarval() + $curly->scalarval();
374		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$num, 'int'));
375	}
376
377	$v1_echoStruct_sig=array(array(xmlrpcStruct, xmlrpcStruct));
378	$v1_echoStruct_doc='This handler takes a single parameter, a struct. Your handler must return the struct.';
379
380	function v1_echoStruct($m)
381	{
382		$sno=$m->getParam(0);
383		return CreateObject('phpgwapi.xmlrpcresp',$sno);
384	}
385
386	$v1_manyTypes_sig = array(
387		array(
388			xmlrpcArray, xmlrpcInt, xmlrpcBoolean,
389			xmlrpcString, xmlrpcDouble, xmlrpcDateTime,
390			xmlrpcBase64
391		)
392	);
393	$v1_manyTypes_doc = 'This handler takes six parameters, and returns an array containing all the parameters.';
394
395	function v1_manyTypes($m)
396	{
397		return CreateObject('phpgwapi.xmlrpcresp',
398			CreateObject('phpgwapi.xmlrpcval',array(
399				$m->getParam(0),
400				$m->getParam(1),
401				$m->getParam(2),
402				$m->getParam(3),
403				$m->getParam(4),
404				$m->getParam(5)
405			),
406			'array'
407		));
408	}
409
410	$v1_moderateSizeArrayCheck_sig = array(array(xmlrpcString, xmlrpcArray));
411	$v1_moderateSizeArrayCheck_doc = 'This handler takes a single parameter, which is an array containing between 100 and 200 elements. Each of the items is a string, your handler must return a string containing the concatenated text of the first and last elements.';
412
413	function v1_moderateSizeArrayCheck($m)
414	{
415		$ar    = $m->getParam(0);
416		$sz    = $ar->arraysize();
417		$first = $ar->arraymem(0);
418		$last  = $ar->arraymem($sz-1);
419		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',$first->scalarval() . $last->scalarval(), "string"));
420	}
421
422	$v1_simpleStructReturn_sig = array(array(xmlrpcStruct, xmlrpcInt));
423	$v1_simpleStructReturn_doc = 'This handler takes one parameter, and returns a struct containing three elements, times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.';
424
425	function v1_simpleStructReturn($m)
426	{
427		$sno=$m->getParam(0);
428		$v=$sno->scalarval();
429		return CreateObject('phpgwapi.xmlrpcresp',
430			CreateObject('phpgwapi.xmlrpcval',array(
431				'times10'   => CreateObject('phpgwapi.xmlrpcval',$v*10, 'int'),
432				'times100'  => CreateObject('phpgwapi.xmlrpcval',$v*100, 'int'),
433				'times1000' => CreateObject('phpgwapi.xmlrpcval',$v*1000, 'int')
434			),
435			'struct'
436		));
437	}
438
439	$v1_nestedStruct_sig = array(array(xmlrpcInt, xmlrpcStruct));
440	$v1_nestedStruct_doc = 'This handler takes a single parameter, a struct, that models a daily calendar. At the top level, there is one struct for each year. Each year is broken down into months, and months into days. Most of the days are empty in the struct you receive, but the entry for April 1, 2000 contains a least three elements named moe, larry and curly, all &lt;i4&gt;s. Your handler must add the three numbers and return the result.';
441
442	function v1_nestedStruct($m)
443	{
444		$sno=$m->getParam(0);
445		$twoK=$sno->structmem('2000');
446		$april=$twoK->structmem('04');
447		$fools=$april->structmem('01');
448		$curly=$fools->structmem('curly');
449		$larry=$fools->structmem('larry');
450		$moe=$fools->structmem('moe');
451		return CreateObject('phpgwapi.xmlrpcresp',CreateObject('phpgwapi.xmlrpcval',
452			$curly->scalarval() + $larry->scalarval() + $moe->scalarval(), 'int'
453		));
454	}
455
456	$v1_countTheEntities_sig=array(array(xmlrpcStruct, xmlrpcString));
457	$v1_countTheEntities_doc='This handler takes a single parameter, a string, that contains any number of predefined entities, namely &lt;, &gt;, &amp; \' and ".<br />Your handler must return a struct that contains five fields, all numbers:  ctLeftAngleBrackets, ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.';
458
459	function v1_countTheEntities($m)
460	{
461		$sno=$m->getParam(0);
462		$str=$sno->scalarval();
463		$gt=0; $lt=0; $ap=0; $qu=0; $amp=0;
464		for($i=0; $i<strlen($str); $i++)
465		{
466			$c=substr($str, $i, 1);
467			switch($c)
468			{
469				case '>':
470					$gt++;
471					break;
472				case '<':
473					$lt++;
474					break;
475				case '"':
476					$qu++;
477					break;
478				case "'":
479					$ap++;
480					break;
481				case '&':
482					$amp++;
483					break;
484				default:
485					break;
486			}
487		}
488		return CreateObject('phpgwapi.xmlrpcresp',
489			CreateObject('phpgwapi.xmlrpcval',array(
490				'ctLeftAngleBrackets'  => CreateObject('phpgwapi.xmlrpcval',$lt, 'int'),
491				'ctRightAngleBrackets' => CreateObject('phpgwapi.xmlrpcval',$gt, 'int'),
492				'ctAmpersands'         => CreateObject('phpgwapi.xmlrpcval',$amp, 'int'),
493				'ctApostrophes'        => CreateObject('phpgwapi.xmlrpcval',$ap, 'int'),
494				'ctQuotes'             => CreateObject('phpgwapi.xmlrpcval',$qu, 'int')
495			),
496   		     'struct'
497		));
498	}
499
500	// trivial interop tests
501	// http://www.xmlrpc.com/stories/storyReader$1636
502
503	$i_echoString_sig=array(array(xmlrpcString, xmlrpcString));
504	$i_echoString_doc='Echoes string.';
505
506	$i_echoStringArray_sig=array(array(xmlrpcArray, xmlrpcArray));
507	$i_echoStringArray_doc='Echoes string array.';
508
509	$i_echoInteger_sig=array(array(xmlrpcInt, xmlrpcInt));
510	$i_echoInteger_doc='Echoes integer.';
511
512	$i_echoIntegerArray_sig=array(array(xmlrpcArray, xmlrpcArray));
513	$i_echoIntegerArray_doc='Echoes integer array.';
514
515	$i_echoFloat_sig=array(array(xmlrpcDouble, xmlrpcDouble));
516	$i_echoFloat_doc='Echoes float.';
517
518	$i_echoFloatArray_sig=array(array(xmlrpcArray, xmlrpcArray));
519	$i_echoFloatArray_doc='Echoes float array.';
520
521	$i_echoStruct_sig=array(array(xmlrpcStruct, xmlrpcStruct));
522	$i_echoStruct_doc='Echoes struct.';
523
524	$i_echoStructArray_sig=array(array(xmlrpcArray, xmlrpcArray));
525	$i_echoStructArray_doc='Echoes struct array.';
526
527	$i_echoValue_doc='Echoes any value back.';
528
529	$i_echoBase64_sig=array(array(xmlrpcBase64, xmlrpcBase64));
530	$i_echoBase64_doc='Echoes base64.';
531
532	$i_echoDate_sig=array(array(xmlrpcDateTime, xmlrpcDateTime));
533	$i_echoDate_doc='Echoes dateTime.';
534
535	function i_echoParam($m)
536	{
537		$s = $m->getParam(0);
538		return CreateObject('phpgwapi.xmlrpcresp',$s);
539	}
540
541	function i_echoString($m)
542	{
543		return i_echoParam($m);
544	}
545	function i_echoInteger($m)
546	{
547		return i_echoParam($m);
548	}
549	function i_echoFloat($m)
550	{
551		return i_echoParam($m);
552	}
553	function i_echoStruct($m)
554	{
555		return i_echoParam($m);
556	}
557	function i_echoStringArray($m)
558	{
559		return i_echoParam($m);
560	}
561	function i_echoIntegerArray($m)
562	{
563		return i_echoParam($m);
564	}
565	function i_echoFloatArray($m)
566	{
567		return i_echoParam($m);
568	}
569	function i_echoStructArray($m)
570	{
571		return i_echoParam($m);
572	}
573	function i_echoValue($m)
574	{
575		return i_echoParam($m);
576	}
577	function i_echoBase64($m)
578	{
579		return i_echoParam($m);
580	}
581	function i_echoDate($m)
582	{
583		return i_echoParam($m);
584	}
585
586	$i_whichToolkit_doc = 'Returns a struct containing the following strings:  toolkitDocsUrl, toolkitName, toolkitVersion, toolkitOperatingSystem.';
587
588	function i_whichToolkit($m)
589	{
590		$ret = array(
591			'toolkitDocsUrl' => 'http://xmlrpc.usefulinc.com/php.html',
592			'toolkitName'    => $GLOBALS['xmlrpcName'],
593			'toolkitVersion' => $GLOBALS['xmlrpcVersion'],
594			'toolkitOperatingSystem' => $GLOBALS['SERVER_SOFTWARE']
595		);
596		return CreateObject('phpgwapi.xmlrpcresp',phpgw_xmlrpc_encode($ret));
597	}
598
599	$server->add_to_map('examples.getStateName',            'findstate',$findstate_sig,$findstate_doc);
600	$server->add_to_map('examples.sortByAge',               'agesorter',$agesorter_sig,$agesorter_doc);
601	$server->add_to_map('examples.addtwo',                  'addtwo',$addtwo_sig,$addtwo_doc);
602	$server->add_to_map('examples.addtwodouble',            'addtwodouble',$addtwodouble_sig,$addtwodouble_doc);
603	$server->add_to_map('examples.stringecho',              'stringecho',$stringecho_sig,$stringecho_doc);
604	$server->add_to_map('examples.echo',                    'echoback',$echoback_sig,$echoback_doc);
605	$server->add_to_map('examples.decode64',                'echosixtyfour',$echosixtyfour_sig,$echosixtyfour_doc);
606	$server->add_to_map('examples.invertBooleans',          'bitflipper',$bitflipper_sig,$bitflipper_doc);
607	$server->add_to_map('mail.send',                        'mail_send',$mail_send_sig,$mail_send_doc);
608	$server->add_to_map('validator1.arrayOfStructsTest',    'v1_arrayOfStructs',$v1_arrayOfStructs_sig,$v1_arrayOfStructs_doc);
609	$server->add_to_map('validator1.easyStructTest',        'v1_easyStruct',$v1_easyStruct_sig,$v1_easyStruct_doc);
610	$server->add_to_map('validator1.echoStructTest',        'v1_echoStruct',$v1_echoStruct_sig,$v1_echoStruct_doc);
611	$server->add_to_map('validator1.manyTypesTest',         'v1_manyTypes',$v1_manyTypes_sig,$v1_manyTypes_doc);
612	$server->add_to_map('validator1.moderateSizeArrayCheck','v1_moderateSizeArrayCheck',$v1_moderateSizeArrayCheck_sig,$v1_moderateSizeArrayCheck_doc);
613	$server->add_to_map('validator1.simpleStructReturnTest','v1_simpleStructReturn',$v1_simpleStructReturn_sig,$v1_simpleStructReturn_doc);
614	$server->add_to_map('validator1.nestedStructTest',      'v1_nestedStruct',$v1_nestedStruct_sig,$v1_nestedStruct_doc);
615	$server->add_to_map('validator1.countTheEntities',      'v1_countTheEntities',$v1_countTheEntities_sig,$v1_countTheEntities_doc);
616	$server->add_to_map('interopEchoTests.echoString',      'i_echoString',$i_echoString_sig,$i_echoString_doc);
617	$server->add_to_map('interopEchoTests.echoStringArray', 'i_echoStringArray',$i_echoStringArray_sig,$i_echoStringArray_doc);
618	$server->add_to_map('interopEchoTests.echoInteger',     'i_echoInteger',$i_echoInteger_sig,$i_echoInteger_doc);
619	$server->add_to_map('interopEchoTests.echoIntegerArray','i_echoIntegerArray',$i_echoIntegerArray_sig,$i_echoIntegerArray_doc);
620	$server->add_to_map('interopEchoTests.echoFloat',       'i_echoFloat',$i_echoFloat_sig,$i_echoFloat_doc);
621	$server->add_to_map('interopEchoTests.echoFloatArray',  'i_echoFloatArray',$i_echoFloatArray_sig,$i_echoFloatArray_doc);
622	$server->add_to_map('interopEchoTests.echoStruct',      'i_echoStruct',$i_echoStruct_sig,$i_echoStruct_doc);
623	$server->add_to_map('interopEchoTests.echoStructArray', 'i_echoStructArray',$i_echoStructArray_sig,$i_echoStructArray_doc);
624	$server->add_to_map('interopEchoTests.echoValue',       'i_echoValue','',$i_echoValue_doc);
625	$server->add_to_map('interopEchoTests.echoBase64',      'i_echoBase64',$i_echoBase64_sig,$i_echoBase64_doc);
626	$server->add_to_map('interopEchoTests.echoDate',        'i_echoDate',$i_echoDate_sig,$i_echoDate_doc);
627	$server->add_to_map('interopEchoTests.whichToolkit',    'i_whichToolkit','',$i_whichToolkit_doc);
628
629	// that should do all we need!
630?>
631