Up to now, we have tacitly ignored the trailing parameter of type Ice::Current
that is passed to each skeleton operation on the server side. The Current
structure is defined as follows:
module Ice { local dictionary<string, string> Context; enum OperationMode { Normal, \Idempotent }; local struct Current { ObjectAdapter adapter; Connection con; Identity id; string facet; string operation; OperationMode mode; Context ctx; int requestId; }; };
Note that the Current
value provides access to information about the currently executing request to the implementation of an operation in the server:
adapter
Theadapter
member provides access to the object adapter via which the request is being dispatched. In turn, the adapter provides access to its communicator (via thegetCommunicator
operation).
con
Thecon
member provides information about the connection over which this request was received.
id
Theid
member provides the object identity for the current request.
facet
Thefacet
member provides access to the facet for the request.
operation
Theoperation
member contains the name of the operation that is being invoked. Note that the operation name may indicate one of the operations onIce::Object
, such asice_ping
orice_isA
. (ice_isA
is invoked if a client performs acheckedCast
.)
mode
Themode
member contains the invocation mode for the operation (Normal
orIdempotent
), which influences the retry behavior of the Ice run time.
ctx
Thectx
member contains the current request context for the invocation.
requestId
The Ice protocol uses request IDs to associate replies with their corresponding requests. TherequestId
member provides this ID. For oneway requests (which do not have replies), the request ID is0
. For collocated requests (which do not use the Ice protocol), the request ID is-1
.
If you implement your server such that it uses a separate servant for each Ice object, the contents of Current
are not particularly interesting. (You would most likely access Current
to read the adapter
member, for example, to activate or deactivate a servant.) However, as we will see in our discussion of default servants and servant locators, the Current
object is essential for more sophisticated (and more scalable) servant implementations.