## GskXmlrpcStream

GskXmlrpcStream — a stream of XMLRPC method calls and responses.

## Synopsis

                        GskXmlrpcStreamClass;
                        GskXmlrpcStream;
    #define             GSK_XMLRPC_STREAM_REQUEST_HOOK      (stream)
    GskXmlrpcRequest *  gsk_xmlrpc_stream_get_request       (GskXmlrpcStream *stream);
    void                gsk_xmlrpc_stream_respond           (GskXmlrpcStream *stream,
                                                             GskXmlrpcRequest *request,
                                                             GskXmlrpcResponse *response);
    void                (*GskXmlrpcResponseNotify)          (GskXmlrpcRequest *request,
                                                             GskXmlrpcResponse *response,
                                                             gpointer data);
    void                gsk_xmlrpc_stream_make_request      (GskXmlrpcStream *stream,
                                                             GskXmlrpcRequest *request,
                                                             GskXmlrpcResponseNotify notify,
                                                             gpointer data,
                                                             GDestroyNotify destroy);

## Description

This class provides an easy way to handle XMLRPC; you may wish to attach this to an HTTP post_data or content_stream.

Or, you may use XMLRPC with the raw TCP/IP transport layer if you please.

## Details

### GskXmlrpcStreamClass

    typedef struct {
      GskStreamClass stream_class;

      void (*set_poll_requestable) (GskXmlrpcStream *,
    				gboolean polling);
      void (*shutdown_requestable) (GskXmlrpcStream *);
    } GskXmlrpcStreamClass;

### GskXmlrpcStream

    typedef struct {
      GskStream      stream;
      GskXmlrpcParser *parser;

      /* handle incoming requests */
      GskXmlrpcIncoming *first_unhandled_request;
      GskXmlrpcIncoming *next_to_dequeue;
      GskXmlrpcIncoming *last_request;
      GskHook incoming_request_hook;

      /* handle outgoing requests */
      GskXmlrpcOutgoing *first_unresponded_request;
      GskXmlrpcOutgoing *last_unresponded_request;

      /* queue outgoing response and request data here */
      GskBuffer outgoing;
    } GskXmlrpcStream;

### GSK_XMLRPC_STREAM_REQUEST_HOOK()

    #define             GSK_XMLRPC_STREAM_REQUEST_HOOK(stream)

Get the GskHook for the request-available end of the stream.

`stream` : | #GskXmlrpcStream from which to obtain the hook.

### gsk_xmlrpc_stream_get_request ()

    GskXmlrpcRequest *  gsk_xmlrpc_stream_get_request       (GskXmlrpcStream *stream);

Grab a new request from the stream. The caller should eventually respond to it with `gsk_xmlrpc_stream_respond()`.

`stream` : | the stream to dequeue an incomiung request from.
Returns : | a reference to a remote request which the caller must call `gsk_xmlrpc_request_unref()` on eventually, or NULL if no unhandled requests are available.

### gsk_xmlrpc_stream_respond ()

    void                gsk_xmlrpc_stream_respond           (GskXmlrpcStream *stream,
                                                             GskXmlrpcRequest *request,
                                                             GskXmlrpcResponse *response);

Give the RPC result to the other side of this connection.

`stream` : | the stream where the incoming request came in.
`request` : | the request initiated by the other side.
`response` : | local response to the request.

### GskXmlrpcResponseNotify ()

    void                (*GskXmlrpcResponseNotify)          (GskXmlrpcRequest *request,
                                                             GskXmlrpcResponse *response,
                                                             gpointer data);

`request` : |
`response` : |
`data` : |

### gsk_xmlrpc_stream_make_request ()

    void                gsk_xmlrpc_stream_make_request      (GskXmlrpcStream *stream,
                                                             GskXmlrpcRequest *request,
                                                             GskXmlrpcResponseNotify notify,
                                                             gpointer data,
                                                             GDestroyNotify destroy);

Make a request (a method call) to the other side of this GskXmlrpcStream. When a response is received, `notify` will be called, then destroy will be called.

If the stream shuts down before a notify is obtained, then just `destroy` is run.

`stream` : | the stream to make the request on.
`request` : | the request to issue.
`notify` : | callback to eventaully invoke with the remote response, if we get it.
`data` : | opaque user data to pass to the `notify` function eventually.
`destroy` : | callback to invoke after the handler is run, or if the stream shuts down before a response is obtained.