RE: docxmlrpcs

"Gaetano Giunta" <[email protected]> Fri, 7 Jul 2006 11:27:45 +0200
Newsgroups gmane.comp.php.xml-rpc
Message-ID <[email protected]>
This is a multi-part message in MIME format.

------=_NextPart_000_0024_01C6A1B8.5EF33790
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_0025_01C6A1B8.5EF33790"


------=_NextPart_001_0025_01C6A1B8.5EF33790
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: base64

b29wcywgZm9yZ290IGF0dGFjaG1lbnQNCiAgLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCiAg
RnJvbTogcGhweG1scnBjLWJvdW5jZXNAbGlzdHMudXNlZnVsaW5jLmNvbSBbbWFpbHRvOnBocHht
bHJwYy1ib3VuY2VzQGxpc3RzLnVzZWZ1bGluYy5jb21dT24gQmVoYWxmIE9mIEdhZXRhbm8gR2l1
bnRhDQogIFNlbnQ6IEZyaWRheSwgSnVseSAwNywgMjAwNiAxMToyMiBBTQ0KICBUbzogcGhweG1s
cnBjQGxpc3RzLnVzZWZ1bGluYy5jb20NCiAgU3ViamVjdDogUkU6IFtwaHB4bWxycGNdIGRvY3ht
bHJwY3MNCg0KDQogIEluIGZhY3Qgc2luZ2xlIHBhcmFtIHNpZ25hdHVyZSBpcyBhbHJlYWR5IGlt
cGxlbWVudGVkIGluIENWUyAodGhhbmtzIHRvIHNvbWUga2luZCBzb3VsIGV4dGVybmFsIGNvbnRy
aWJ1dGlvbikuDQoNCiAgSSBhbSBqdXN0IHdhaXRpbmcgdG8gZmluZCBzb21lIHRpbWUgdG8gcGFj
a2FnZSByZWxlYXNlIDAuMiAoaW4gZmFjdCBJIGFtIHdvcmtpbmcgYnVzaWx5IG9uIGV4dGVuZGlu
ZyB0aGUgYmFzZSBjbGFzc2VzIHRvIGFkZCBtb3JlIGF1dG9tYWdpYyBzdHVmZi4uLiBidXQgaWYg
eW91IGFyZSBsdWNreSBpdCBtaWdodCBjb21lIG91dCBhcyBzb29uIGFzIG5leHQgd2VlaykuDQoN
CiAgVG8gZXh0ZW5kIHRoZSBzaWduYXR1cmVzIHdpdGhvdXQgYnJlYWtpbmcgZXhpc3RpbmcgY29k
ZSwgd2UgZGVjaWRlZCB0byBtYWtlIHVzZSBvZiBhIG5ldyBtZW1iZXIgaW4gdGhlIG1ldGhvZCBk
ZXNjcmlwdGlvbiBhcnJheTogJ3NpZ25hdHVyZV9kb2NzJy4NCiAgSXQgaGFzIHRvIGJlIGFuIGFy
cmF5IG9mIGFycmF5cywgd2l0aCBzYW1lIG51bWJlciBvZiBtZW1iZXJzIGFzICdzaWduYXR1cmUn
LiBPZiBjb3Vyc2UgZWFjaCBtZW1iZXIgaXMgYSBkb2N1bWVudGluZyBzdHJpbmcgaW5zdGVhZCBv
ZiBhIHR5cGUgbmFtZS4NCg0KICBUaGUgY29kZSBpcyBhdHRhY2hlZCwgaW4gY2FzZSB5b3Ugd2Fu
dCB0byBjaGVjayBpdCBvdXQuDQoNCiAgQnllDQogIEdlYXRhbm8NCiAgICAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQ0KICAgIEZyb206IHBocHhtbHJwYy1ib3VuY2VzQGxpc3RzLnVzZWZ1bGlu
Yy5jb20gW21haWx0bzpwaHB4bWxycGMtYm91bmNlc0BsaXN0cy51c2VmdWxpbmMuY29tXU9uIEJl
aGFsZiBPZiBKaXAgSG9nZW5ib29tDQogICAgU2VudDogRnJpZGF5LCBKdWx5IDA3LCAyMDA2IDEw
OjQ0IEFNDQogICAgVG86IHBocHhtbHJwY0BsaXN0cy51c2VmdWxpbmMuY29tDQogICAgU3ViamVj
dDogW3BocHhtbHJwY10gZG9jeG1scnBjcw0KDQoNCg0KDQogICAgSGVsbG8sDQoNCg0KDQogICAg
SSBhbSBjdXJyZW50bHkgdXNpbmcgdGhlIGRvY3htbHJwY3MsIGFsdGhvdWdoIEkga25vdyBpdCdz
IGp1c3QgdGhlIDAuMSBhbHBoYSB2ZXJzaW9uLCBJIHdhcyB3b25kZXJpbmcgaG93IHlvdSBhcmUg
Z29pbmcgdG8gaW1wbGVtZW50IHRoZSBkZXNjcmlwdGlvbiBvZiBpbnB1dC9vdXRwdXQgcGFyYW1l
dGVycy4uLiBUaGlzIHdvdWxkIGJlIGEgdmVyeSBuaWNlIGZlYXR1cmUsIGJ1dCBJIGd1ZXNzIHRo
ZSBzeW50YXggb2YgdGhlIHNnbmF0dXJlIHdvdWxkIGhhdmUgdG8gYmUgY2hhbmdlZCB0byBnaXZl
IHNvbWUga2luZCBvZiBkb2N1bWVudGF0aW9uIHdpdGggdGhlIHBhcmFtZXRlcnMuLi4NCg0KICAg
IEhvcGUgdG8gaGVhciBmcm9tIHlvdSwNCg0KDQoNCiAgICBSZWdhcmRzLA0KDQoNCg0KICAgIEpp
cCBIb2dlbmJvb20NCg0KDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgIEJlIG9uZSBvZiB0
aGUgZmlyc3QgdG8gdHJ5IFdpbmRvd3MgTGl2ZSBNYWlsLiA=

------=_NextPart_001_0025_01C6A1B8.5EF33790
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05U
RU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQoNCg0KPFNUWUxFPlAgew0KCVBB
RERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAwcHg7
IE1BUkdJTjogMHB4OyBQQURESU5HLVRPUDogMHB4DQp9DQpCT0RZIHsNCglGT05ULVNJWkU6IDEw
cHQ7IEZPTlQtRkFNSUxZOiBUYWhvbWENCn0NCjwvU1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1T
SFRNTCA2LjAwLjI4MDAuMTU1NSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8RElW
PjxGT05UIGZhY2U9QXJpYWwgY29sb3I9IzAwMDBmZj48U1BBTiBjbGFzcz05MjcxOTI3MDktMDcw
NzIwMDY+b29wcywgZm9yZ290IA0KYXR0YWNobWVudDwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8QkxP
Q0tRVU9URSBkaXI9bHRyIA0Kc3R5bGU9IlBBRERJTkctTEVGVDogNXB4OyBNQVJHSU4tTEVGVDog
NXB4OyBCT1JERVItTEVGVDogIzAwMDBmZiAycHggc29saWQ7IE1BUkdJTi1SSUdIVDogMHB4Ij4N
CiAgPERJViBjbGFzcz1PdXRsb29rTWVzc2FnZUhlYWRlciBkaXI9bHRyIGFsaWduPWxlZnQ+PEZP
TlQgDQogIGZhY2U9VGFob21hPi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tPEJSPjxCPkZyb206
PC9CPiANCiAgcGhweG1scnBjLWJvdW5jZXNAbGlzdHMudXNlZnVsaW5jLmNvbSANCiAgW21haWx0
bzpwaHB4bWxycGMtYm91bmNlc0BsaXN0cy51c2VmdWxpbmMuY29tXTxCPk9uIEJlaGFsZiBPZiA8
L0I+R2FldGFubyANCiAgR2l1bnRhPEJSPjxCPlNlbnQ6PC9CPiBGcmlkYXksIEp1bHkgMDcsIDIw
MDYgMTE6MjIgQU08QlI+PEI+VG86PC9CPiANCiAgcGhweG1scnBjQGxpc3RzLnVzZWZ1bGluYy5j
b208QlI+PEI+U3ViamVjdDo8L0I+IFJFOiBbcGhweG1scnBjXSANCiAgZG9jeG1scnBjczxCUj48
QlI+PC9GT05UPjwvRElWPg0KICA8RElWPjxGT05UIGZhY2U9QXJpYWwgY29sb3I9IzAwMDBmZj48
U1BBTiBjbGFzcz04MDYzMzU5MDgtMDcwNzIwMDY+SW4gZmFjdCANCiAgc2luZ2xlIHBhcmFtIHNp
Z25hdHVyZSBpcyBhbHJlYWR5IGltcGxlbWVudGVkIGluIENWUyAodGhhbmtzIHRvIHNvbWUga2lu
ZCBzb3VsIA0KICBleHRlcm5hbCBjb250cmlidXRpb24pLjwvU1BBTj48L0ZPTlQ+PC9ESVY+DQog
IDxESVY+PEZPTlQgZmFjZT1BcmlhbCBjb2xvcj0jMDAwMGZmPjxTUEFOIA0KICBjbGFzcz04MDYz
MzU5MDgtMDcwNzIwMDY+PC9TUEFOPjwvRk9OVD4mbmJzcDs8L0RJVj4NCiAgPERJVj48Rk9OVCBm
YWNlPUFyaWFsIGNvbG9yPSMwMDAwZmY+PFNQQU4gY2xhc3M9ODA2MzM1OTA4LTA3MDcyMDA2Pkkg
YW0ganVzdCANCiAgd2FpdGluZyB0byBmaW5kIHNvbWUgdGltZSB0byBwYWNrYWdlIHJlbGVhc2Ug
MC4yIChpbiBmYWN0IEkgYW0gd29ya2luZyBidXNpbHkgDQogIG9uIGV4dGVuZGluZyB0aGUgYmFz
ZSBjbGFzc2VzIHRvIGFkZCBtb3JlIGF1dG9tYWdpYyBzdHVmZi4uLiBidXQgaWYgeW91IGFyZSAN
CiAgbHVja3kgaXQgbWlnaHQgY29tZSBvdXQgYXMgc29vbiBhcyBuZXh0IHdlZWspLjwvU1BBTj48
L0ZPTlQ+PC9ESVY+DQogIDxESVY+PEZPTlQgZmFjZT1BcmlhbCBjb2xvcj0jMDAwMGZmPjxTUEFO
IA0KICBjbGFzcz04MDYzMzU5MDgtMDcwNzIwMDY+PC9TUEFOPjwvRk9OVD4mbmJzcDs8L0RJVj4N
CiAgPERJVj48Rk9OVCBmYWNlPUFyaWFsIGNvbG9yPSMwMDAwZmY+PFNQQU4gY2xhc3M9ODA2MzM1
OTA4LTA3MDcyMDA2PlRvIGV4dGVuZCANCiAgdGhlIHNpZ25hdHVyZXMgd2l0aG91dCBicmVha2lu
ZyBleGlzdGluZyBjb2RlLCZuYnNwO3dlIGRlY2lkZWQgdG8gbWFrZSB1c2Ugb2YgDQogIGEgbmV3
Jm5ic3A7bWVtYmVyIGluIHRoZSBtZXRob2QgZGVzY3JpcHRpb24gYXJyYXk6IA0KICAnc2lnbmF0
dXJlX2RvY3MnLjwvU1BBTj48L0ZPTlQ+PC9ESVY+DQogIDxESVY+PEZPTlQgZmFjZT1BcmlhbCBj
b2xvcj0jMDAwMGZmPjxTUEFOIGNsYXNzPTgwNjMzNTkwOC0wNzA3MjAwNj5JdCZuYnNwO2hhcyAN
CiAgdG8gYmUmbmJzcDthbiBhcnJheSBvZiBhcnJheXMsIHdpdGggc2FtZSBudW1iZXIgb2YgbWVt
YmVycyBhcyAnc2lnbmF0dXJlJy4gT2YgDQogIGNvdXJzZSBlYWNoIG1lbWJlciBpcyBhIGRvY3Vt
ZW50aW5nIHN0cmluZyBpbnN0ZWFkIG9mIGEgdHlwZSANCiAgbmFtZS48L1NQQU4+PC9GT05UPjwv
RElWPg0KICA8RElWPjxGT05UIGZhY2U9QXJpYWwgY29sb3I9IzAwMDBmZj48U1BBTiANCiAgY2xh
c3M9ODA2MzM1OTA4LTA3MDcyMDA2PjwvU1BBTj48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQogIDxESVY+
PEZPTlQgZmFjZT1BcmlhbCBjb2xvcj0jMDAwMGZmPjxTUEFOIGNsYXNzPTgwNjMzNTkwOC0wNzA3
MjAwNj5UaGUgY29kZSBpcyANCiAgYXR0YWNoZWQsIGluIGNhc2UgeW91IHdhbnQgdG8gY2hlY2sg
aXQgb3V0LjwvU1BBTj48L0ZPTlQ+PC9ESVY+DQogIDxESVY+PEZPTlQgZmFjZT1BcmlhbCBjb2xv
cj0jMDAwMGZmPjxTUEFOIA0KICBjbGFzcz04MDYzMzU5MDgtMDcwNzIwMDY+PC9TUEFOPjwvRk9O
VD4mbmJzcDs8L0RJVj4NCiAgPERJVj48Rk9OVCBmYWNlPUFyaWFsIGNvbG9yPSMwMDAwZmY+PFNQ
QU4gDQogIGNsYXNzPTgwNjMzNTkwOC0wNzA3MjAwNj5CeWU8L1NQQU4+PC9GT05UPjwvRElWPg0K
ICA8RElWPjxGT05UIGZhY2U9QXJpYWwgY29sb3I9IzAwMDBmZj48U1BBTiANCiAgY2xhc3M9ODA2
MzM1OTA4LTA3MDcyMDA2PkdlYXRhbm88L1NQQU4+PC9GT05UPjwvRElWPg0KICA8QkxPQ0tRVU9U
RSANCiAgc3R5bGU9IlBBRERJTkctTEVGVDogNXB4OyBNQVJHSU4tTEVGVDogNXB4OyBCT1JERVIt
TEVGVDogIzAwMDBmZiAycHggc29saWQiPg0KICAgIDxESVYgY2xhc3M9T3V0bG9va01lc3NhZ2VI
ZWFkZXIgZGlyPWx0ciBhbGlnbj1sZWZ0PjxGT05UIA0KICAgIGZhY2U9VGFob21hPi0tLS0tT3Jp
Z2luYWwgTWVzc2FnZS0tLS0tPEJSPjxCPkZyb206PC9CPiANCiAgICBwaHB4bWxycGMtYm91bmNl
c0BsaXN0cy51c2VmdWxpbmMuY29tIA0KICAgIFttYWlsdG86cGhweG1scnBjLWJvdW5jZXNAbGlz
dHMudXNlZnVsaW5jLmNvbV08Qj5PbiBCZWhhbGYgT2YgPC9CPkppcCANCiAgICBIb2dlbmJvb208
QlI+PEI+U2VudDo8L0I+IEZyaWRheSwgSnVseSAwNywgMjAwNiAxMDo0NCBBTTxCUj48Qj5Ubzo8
L0I+IA0KICAgIHBocHhtbHJwY0BsaXN0cy51c2VmdWxpbmMuY29tPEJSPjxCPlN1YmplY3Q6PC9C
PiBbcGhweG1scnBjXSANCiAgICBkb2N4bWxycGNzPEJSPjxCUj48L0ZPTlQ+PC9ESVY+PEJSPg0K
ICAgIDxESVY+DQogICAgPFAgY2xhc3M9TXNvTm9ybWFsIA0KICAgIHN0eWxlPSJNQVJHSU46IDBp
biAwaW4gMHB0OyBtc28tbGF5b3V0LWdyaWQtYWxpZ246IG5vbmUiPkhlbGxvLDwvUD4NCiAgICA8
UCBjbGFzcz1Nc29Ob3JtYWwgDQogICAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQ7IG1zby1s
YXlvdXQtZ3JpZC1hbGlnbjogbm9uZSI+Jm5ic3A7PC9QPg0KICAgIDxQIGNsYXNzPU1zb05vcm1h
bCANCiAgICBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdDsgbXNvLWxheW91dC1ncmlkLWFsaWdu
OiBub25lIj5JIGFtIGN1cnJlbnRseSANCiAgICB1c2luZyB0aGUgZG9jeG1scnBjcywgYWx0aG91
Z2ggSSBrbm93IGl0J3MganVzdCB0aGUgMC4xIGFscGhhIHZlcnNpb24sIEkgd2FzIA0KICAgIHdv
bmRlcmluZyBob3cgeW91IGFyZSBnb2luZyB0byBpbXBsZW1lbnQgdGhlIGRlc2NyaXB0aW9uIG9m
IGlucHV0L291dHB1dCANCiAgICBwYXJhbWV0ZXJzLi4uIFRoaXMgd291bGQgYmUgYSB2ZXJ5IG5p
Y2UgZmVhdHVyZSwgYnV0IEkgZ3Vlc3MgdGhlIHN5bnRheCBvZiANCiAgICB0aGUgc2duYXR1cmUg
d291bGQgaGF2ZSB0byBiZSBjaGFuZ2VkIHRvIGdpdmUgc29tZSBraW5kIG9mIGRvY3VtZW50YXRp
b24gDQogICAgd2l0aCB0aGUgcGFyYW1ldGVycy4uLjwvUD4NCiAgICA8UCBjbGFzcz1Nc29Ob3Jt
YWwgDQogICAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQ7IG1zby1sYXlvdXQtZ3JpZC1hbGln
bjogbm9uZSI+SG9wZSB0byBoZWFyIGZyb20gDQogICAgeW91LDwvUD4NCiAgICA8UCBjbGFzcz1N
c29Ob3JtYWwgDQogICAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQ7IG1zby1sYXlvdXQtZ3Jp
ZC1hbGlnbjogbm9uZSI+Jm5ic3A7PC9QPg0KICAgIDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICBz
dHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdDsgbXNvLWxheW91dC1ncmlkLWFsaWduOiBub25lIj5S
ZWdhcmRzLDwvUD4NCiAgICA8UCBjbGFzcz1Nc29Ob3JtYWwgDQogICAgc3R5bGU9Ik1BUkdJTjog
MGluIDBpbiAwcHQ7IG1zby1sYXlvdXQtZ3JpZC1hbGlnbjogbm9uZSI+Jm5ic3A7PC9QPg0KICAg
IDxQIGNsYXNzPU1zb05vcm1hbCANCiAgICBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdDsgbXNv
LWxheW91dC1ncmlkLWFsaWduOiBub25lIj5KaXAgDQogICAgSG9nZW5ib29tPC9QPjwvRElWPjxC
Uj48QlI+DQogICAgPEhSPg0KICAgIEJlIG9uZSBvZiB0aGUgZmlyc3QgdG8gdHJ5IDxBIA0KICAg
IGhyZWY9Imh0dHA6Ly9pZGVhcy5saXZlLmNvbS9wcm9ncmFtcGFnZS5hc3B4P3ZlcnNpb25JZD01
ZDIxYzUxYS1iMTYxLTQzMTQtOWIwZS00OTExZmIyYjJlNmQiIA0KICAgIHRhcmdldD1fbmV3Pldp
bmRvd3MgTGl2ZSBNYWlsLjwvQT4gPC9CTE9DS1FVT1RFPjwvQkxPQ0tRVU9URT48L0JPRFk+PC9I
VE1MPg0K

------=_NextPart_001_0025_01C6A1B8.5EF33790--

------=_NextPart_000_0024_01C6A1B8.5EF33790
Content-Type: text/plain;
	name="docxmlrpcs.inc"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="docxmlrpcs.inc"

<?php
/**
 * Self-documenting extension to the PHP-XMLRPC server
 *
 * @author Gaetano Giunta
 * @version $Id: docxmlrpcs.inc,v 1.4 2006/05/14 18:03:41 ggiunta Exp $
 * @copyright (c) 2005 G. Giunta
 *
 * @todo use some AJAX magic to implement xmlrpc calls to test/debug =
methods
 *       without feeding to user the raw xml
 * @todo add some i18n support
 * @todo add a sane way to have a set of hhtp headers to be sent along =
with every
 *       type of generated documentation (eg. content-type)
 **/

	// requires: xmlrpc.inc, xmlrpcs.inc (version 2.0RC3 or later)

	/**
	* Extends the base xmlrpc server with the capability to generate =
documentation
	* about the exposed xmlrpc methods.
	* It will take advantage of a new memeber in the dispatch map: =
signature_docs
	* it is expected to be an array with the same number of memebers as =
signature,
	* but containing a short description for every parameter.
	*/
	class documenting_xmlrpc_server extends xmlrpc_server
	{
		/// default format for generated documentation: either wsdl or html
		var $default_doctype =3D 'html';
		var $default_doclang =3D 'en';
		var $supported_langs =3D array('en');
		var $supported_doctypes =3D array('html', 'wsdl');

		/**
		* Override xmlrpc_server service method:
		*   in case of GET requests show docs about implemented methods;
		*   in case of POST received by a form, we use the methodCall input =
value
		*   as if it had been sent with a tex/xml mimetype
		* @param string $data    request data to be parsed, null by default
		* @param string $doctype type of documentation to generate: html, =
wsdl, etc... If empty, use class default
		*/
		function service($data=3Dnull, $doctype=3D'')
		{
			if($_SERVER['REQUEST_METHOD'] !=3D 'POST')
			{
				if ($doctype =3D=3D '' || !in_array($doctype, =
$this->supported_doctypes))
				{
					$doctype =3D $this->default_doctype;
				}
				// language decoding
				if (isset($_GET['lang']) && in_array(strtolower($_GET['lang']), =
$this->supported_langs))
				{
					$lang =3D strtolower($_GET['lang']);
				}
				else
				{
					$lang =3D $this->default_doclang;
				}

				print generateDocs($this, $doctype, $lang);
			}
			else
			{
				// we break the xmlrpc spec here, and answer to POST requests
				// that have been sent via a standard html form, such as the
				// one that is part of self-generated docs
				if(isset($_SERVER['CONTENT_TYPE'])
					&& $_SERVER['CONTENT_TYPE'] =3D=3D =
'application/x-www-form-urlencoded'
					&& isset($_POST['methodCall']))
				{
					parent::service($_POST['methodCall']);
				}
				else
				{
					parent::service($data);
				}
			}
		}

	}

	/**
	* Generate the documentation about methods exposed by a given server.
	* Note that it will NOT html-escape the user provided documentantation =
(ie. risky).
	* @param xmlrpcserver $server
	* @param string $doctype type of documentation to generate: html =
(default), wsdl, etc...
	* @param string $lang language for docs
	* @return string
	*
	* @todo add support for i18n of generated user-readable docs (eg html)
	*/
	function generateDocs($server, $doctype=3D'html', $lang=3D'en')
	{
		$payload =3D '';
		switch ($doctype)
		{
			case 'wsdl':
				break;
			case 'html':
				//$i18n =3D $GLOBALS['xmlrpcdoci18n'][$lang];
				$template =3D $GLOBALS['xmlrpcdocparts']['html'];
				// in case we have to send custom http headers, do it
				// removed from here, since we only return the payload now...
				//foreach ($template['httpheaders'] as $header)
				//	header($header);

				// method name decoding: is uer seeking info about a single method?
				if (isset($_GET['methodName']))
				{
					$payload .=3D xmlrpc_smarty($template['docheader'], array('lang' =
=3D> $lang, 'title' =3D> 'Method '.$_GET['methodName']));
					if ($server->allow_system_funcs)
					{
						$methods =3D array_merge($server->dmap, =
$GLOBALS['_xmlrpcs_dmap']);
					}
					else
					{
						$methods =3D $server->dmap;
					}
					if (!array_key_exists($_GET['methodName'], $methods))
					{
						$payload .=3D xmlrpc_smarty($template['methodheader'], =
array('method' =3D> $_GET['methodName'], 'desc' =3D> ''));
						$payload .=3D xmlrpc_smarty($template['methodnotfound'], =
array('method' =3D> $_GET['methodName']));
					}
					else
					{
						$payload .=3D xmlrpc_smarty($template['methodheader'], =
array('method' =3D> $_GET['methodName'], 'desc' =3D> =
@$methods[$_GET['methodName']]['docstring']));
						//$payload .=3D xmlrpc_smarty($template['methodfound']);
						for ($i =3D 0; $i < =
count($methods[$_GET['methodName']]['signature']); $i++)
						{
							$val =3D $methods[$_GET['methodName']]['signature'][$i];
							// NEW: signature_docs array, MIGHT be present - or not...
							$doc =3D @$methods[$_GET['methodName']]['signature_docs'][$i];
							if (!is_array($doc) || !count($doc))
							{
								$doc =3D array_fill(0, count($val), '');
							}
							$payload .=3D xmlrpc_smarty($template['sigheader'], =
array('signum' =3D> $i+1));
							$out =3D array_shift($val);
							$outdoc =3D array_shift($doc);
							for ($j =3D 0; $j < count($val); $j++)
							{
								$payload .=3D xmlrpc_smarty($template['sigparam'], =
array('paramtype' =3D> $val[$j], 'paramdesc' =3D> @$doc[$j]));
							}
							$payload .=3D xmlrpc_smarty($template['sigfooter'], =
array('outtype' =3D> $out, 'outdesc' =3D> $outdoc, 'method' =3D> =
$_GET['methodName']));
						}
						$payload .=3D xmlrpc_smarty($template['methodfooter'], =
array('method' =3D> $_GET['methodName']));
					}
				}
				else
				{
					// complete api info
					$payload .=3D xmlrpc_smarty($template['docheader'], array('lang' =
=3D> $lang, 'title' =3D> 'API Index'));
					$payload .=3D xmlrpc_smarty($template['apiheader']);
					foreach($server->dmap as $key =3D> $val)
					{
						$payload .=3D xmlrpc_smarty($template['apimethod'], array('method' =
=3D> $key, 'desc' =3D> @$val['docstring']));
					}
					if($server->allow_system_funcs)
					{
						foreach($GLOBALS['_xmlrpcs_dmap'] as $key =3D> $val)
						{
							$payload .=3D xmlrpc_smarty($template['apimethod'], =
array('method' =3D> $key, 'desc' =3D> @$val['docstring']));
						}
					}
					$payload .=3D xmlrpc_smarty($template['apifooter']);
				}

				$payload .=3D xmlrpc_smarty($template['docfooter']);

		}
		return $payload;
	}

	/**
	* Dumb (dumb dumb) smarty-like template system
	* @param string $template the template text, using {$var} syntax for =
substitution
	* @param array $params array of variables to be substituted in =
template, based on array key
	*
	* @todo introduce support for multilanguage directly here
	* @todo introduce support for nested arrays, so we can coalesce =
templates
	*/
	function xmlrpc_smarty($template, $params=3Darray())
	{
		foreach ($params as $key =3D> $val)
		{
			$template =3D str_replace("{\$$key}", $val, $template);
		}
		return $template;
	}

	/**
	* Templates used for building docs
	* The charset is assumed to be ISO-8859-1 for every generated html. =
Take care
	*/
	$GLOBALS['xmlrpcdocparts'] =3D array(
		'html' =3D> array(

//'httpheaders' =3D> array(),

'docheader' =3D> '<?xml version=3D"1.0" encoding=3D"iso-8859-1"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" xml:lang=3D"{$lang}" =
lang=3D"{$lang}">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; =
charset=3DISO-8859-1" />
<meta http-equiv=3D"Content-Script-Type" content=3D"text-javascript" />
<meta name=3D"generator" content=3D"'.$GLOBALS['xmlrpcName'].'" />
<link rel=3D"stylesheet" type=3D"text/css" href=3D"docxmlrpcs.css" />
<title>{$title}</title>
</head>
<body>',

'docfooter' =3D> '
<div class=3D"footer">Generated using PHP-XMLRPC =
'.$GLOBALS['xmlrpcVersion'].'</div>
</body></html>',

'apiheader' =3D> '
<h1>API index</h1>
<p>This server defines the following API specification:</p>
<table class=3D"apilist">
<tr><th>Method</th><th>Description</th></tr>',

'apimethod' =3D> '
<tr><td><a =
href=3D"?methodName=3D{$method}">{$method}</a></td><td>{$desc}</td></tr>'=
,

'apifooter' =3D> '
</table>',

'methodheader' =3D> '
<h1>Method <em>{$method}</em></h1>
<div>{$desc}</div>',

'methodnotfound' =3D> '
<h3>The method {$method} is not part of the API of this server</h3>
',

'sigheader' =3D> '
<h2>Signature {$signum}</h2>
<blockquote>
<h3>Input parameters</h3>
<table class=3D"inputparameters">
<tr><th>Type</th><th>Description</th></tr>',

'sigparam' =3D> '
<tr><td>{$paramtype}</td><td>{$paramdesc}</td></tr>',

'sigfooter' =3D> '
</table>
<h3>Output parameter</h3>
<table class=3D"inputparameters">
<tr><th>Type</th><th>Description</th></tr>
<tr><td>{$outtype}</td><td>{$outdesc}</td></tr>
</table>
</blockquote>',

'methodfooter' =3D> '
<h2>Test method call</h2>
<p>Complete by hand the form below inserting the needed parameters to =
call this method.<br/>
For a string param use e.g. =
<pre>&lt;param&gt;&lt;value&gt;&lt;string&gt;Hello&lt;/string&gt;&lt;/val=
ue&gt;&lt;/param&gt;</pre></p>
<form action=3D"" method=3D"post"><p>
<textarea name=3D"methodCall" rows=3D"5" cols=3D"80">
&lt;methodCall&gt;&lt;methodName&gt;{$method}&lt;/methodName&gt;
&lt;params&gt;
&lt;/params&gt;
&lt;/methodCall&gt;
</textarea><br/>
<input type=3D"submit" value=3D"Test"/>
</p></form>'
		),

		'wsdl' =3D> array(
		)
	);

/*
	/// internationalization of docs templates
	$GLOBALS['xmlrpcdoci18n'] =3D array(
		'en' =3D> array (
			'apiindex' =3D> 'API Index'
		)
	);
*/
?>
------=_NextPart_000_0024_01C6A1B8.5EF33790
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
phpxmlrpc mailing list
[email protected]
http://lists.usefulinc.com/cgi-bin/mailman/listinfo/phpxmlrpc

------=_NextPart_000_0024_01C6A1B8.5EF33790--