RpcReader - read RPC requests from a client
SYNOPSIS
#include <Dispatch/rpcreader.h>
DESCRIPTION
An RpcReader reads RPC requests from an rpcstream which
represents a connection to a client. When it reads an RPC
request, it uses the request number to look up the address
of a function in an array and calls that function to
unmarshall the request's arguments and execute the
request.
An RpcReader is not instantiable; you have to implement a
derived class which initializes the function array with
addresses of static member functions to unmarshall RPC
requests and which defines the action to be performed when
the client closes the connection. The function array
looks like this:
typedef void (*PF)(RpcReader*, RpcHdr&, rpcstream&);
PF* _function;
Each function stored in the array should extract any argu-
ments needed by the RPC request from the rpcstream, exe-
cute the RPC request, and insert any return values into
the rpcstream so they can be sent back to the client.
CONSTRUCTORS
RpcReader(rpcstream* client, int nfcns)
RpcReader(int fd, int nfcns, boolean binary = true)
If given a non-nil rpcstream, prepare to read RPC
requests from the client using it. If given a nil
rpcstream, just allocate the function array. If
given a file descriptor, create a new rpcstream and
prepare to read RPC requests from the client using
it. ``nfcns'' sets the size of the function array
that each constructor allocates.
PROTECTED OPERATIONS
virtual int inputReady(int)
Read an RPC request (only one request per call so
the program can service RPC requests from multiple
connections in round robin fashion). Look up the
appropriate function in the reader's or another
reader's function array and call it to handle the
RPC request. Return the appropriate status to tell
the Dispatcher whether to detach the RpcReader,
call inputReady again, or wait for new data before
calling inputReady again. A derived class should
not need to redefine this function.
You can redefine this function to change which
reader executes an RPC request after it's read.
Ordinarily the same reader that reads an RPC
request also executes it, but you can hand the
request off to another reader as well.
virtual void connectionClosed(int fd) = 0
You have to define this function since it may be
your only chance to perform cleanup (such as delet-
ing this) when the client closes the connection.
SEE ALSO
RpcHdr(3I), RpcService(3I), rpcstream(3I)
Man(1) output converted with
man2html