<!--
        $Id: pi-rpc.dtd,v 1.4 2001/03/23 08:45:46 rjray Exp $

        This is the Document Type Declaration for PI-RPC messages.
        Request bodies sent by a compliant PI-RPC client should
        be valid against this DTD, using one of the following two
        valid top-level container tags:

                methodCallSet
                methodCall

        The corresponding DOCTYPE entries referring to this DTD would be:

                methodCallSet SYSTEM "pi-rpc.dtd"
                methodCall SYSTEM "pi-rpc.dtd"

        depending on the desired top-level container. It can also be
        referenced by URL as "http://www.blackperl.com/xml/pi-rpc.dtd".

        Response bodies returned by a compliant PI-RPC server should
        be valid against this DTD, using one of the following two
        top-level container tags:

                methodResponseSet
                methodResponse

        The corresponding DOCTYPE entries referring to this DTD would be:

                methodResponseSet SYSTEM "pi-rpc.dtd"
                methodResponse SYSTEM "pi-rpc.dtd"

        depending on the desired top-level container. As above, it can
        be referenced by URL.

        Copyright © 2000, Randy J. Ray (rjray@blackperl.com)
        Freely usable and redistributable under the terms of the
        Artistic License as applied to the Perl Programming Language.
-->

<!--                   Ampersand                                   -->
<!ENTITY   amp         "&#38;"                                       >
<!--                   Greater-Than                                -->
<!ENTITY   gt          "&#62;"                                       >
<!--                   Less-Than                                   -->
<!ENTITY   lt          "&#60;"                                       >

<!ELEMENT  methodCallSet (methodCall+)                               >
<!ATTLIST  methodCallSet
             serial     (yes | no) yes                               >

<!ELEMENT  methodCall    (methodName?, params)                       >
<!ATTLIST  methodCall
             name       NMTOKEN                            #IMPLIED
             dependancy NMTOKENS                           #IMPLIED
             sequence   ID                                 #IMPLIED  >

<!ELEMENT  methodRepsonseSet
                         (methodResponse+)                           >
<!ATTLIST  methodResponseSet
            serial       (yes | no) yes                              >

<!ELEMENT  methodResponse (params | param | value | fault)           >
<!ATTLIST  methodResponse
            name       NMTOKEN                             #IMPLIED
            sequence   ID                                  #IMPLIED  >

<!ELEMENT  methodName    (#PCDATA)                                   >
<!ELEMENT  params        (param*)                                    >
<!ELEMENT  param         (value)                                     >
<!ELEMENT  value         (int | i4 | double | string | boolean |
                             dateTime.iso8601 | base64 | array |
                             struct | reference | #PCDATA)           >
<!ELEMENT  nil           EMPTY                                       >
<!ELEMENT  int           (#PCDATA)                                   >
<!ELEMENT  i4            (#PCDATA)                                   >
<!ATTLIST  int
             width       (#PCDATA)                                   >
<!ELEMENT  double        (#PCDATA)                                   >
<!ELEMENT  string        (#PCDATA)                                   >
<!ELEMENT  boolean       (#PCDATA)                                   >
<!ELEMENT  dateTime.iso8601
                         (#PCDATA)                                   >
<!ELEMENT  dateTime.int  (#PCDATA)                                   >
<!ATTLIST  dateTime.int
             epoch       (#PCDATA)                                   >
<!ELEMENT  base64        (#PCDATA)                                   >
<!ELEMENT  reference     (#PCDATA)                                   >
<!ELEMENT  array         (data | value*)                             >
<!ELEMENT  data          (value*)                                    >
<!ELEMENT  struct        (member+)                                   >
<!ELEMENT  member        (name, value)                               >
<!ELEMENT  name          (#PCDATA)                                   >

<!ELEMENT  fault         (value | struct)                            >
