Ice 3.7 C++11 API Reference
Loading...
Searching...
No Matches
OutgoingAsync.h
Go to the documentation of this file.
1//
2// Copyright (c) ZeroC, Inc. All rights reserved.
3//
4
5#ifndef ICE_OUTGOING_ASYNC_H
6#define ICE_OUTGOING_ASYNC_H
7
8#include <IceUtil/Timer.h>
9#include <IceUtil/Monitor.h>
10#include <Ice/OutgoingAsyncF.h>
11#include <Ice/CommunicatorF.h>
12#include <Ice/ConnectionIF.h>
13#include <Ice/ObjectAdapterF.h>
14#include <Ice/RequestHandlerF.h>
15#include <Ice/ConnectionF.h>
16#include <Ice/OutputStream.h>
17#include <Ice/InputStream.h>
18#include <Ice/ObserverHelper.h>
19#include <Ice/LocalException.h>
20#include <Ice/UniquePtr.h>
21
22#ifdef ICE_CPP11_MAPPING
23# ifdef __clang__
24# pragma clang diagnostic push
25 // See #2747
26# pragma clang diagnostic ignored "-Wshadow-uncaptured-local"
27# endif
28#else
29# include <Ice/AsyncResult.h>
30#endif
31
32#include <exception>
33
34namespace IceInternal
35{
36
37class RetryException;
38class CollocatedRequestHandler;
39
40class ICE_API OutgoingAsyncCompletionCallback
41{
42public:
43 virtual ~OutgoingAsyncCompletionCallback();
44
45protected:
46
47 virtual bool handleSent(bool, bool) = 0;
48 virtual bool handleException(const Ice::Exception&) = 0;
49 virtual bool handleResponse(bool) = 0;
50
51 virtual void handleInvokeSent(bool, OutgoingAsyncBase*) const = 0;
52 virtual void handleInvokeException(const Ice::Exception&, OutgoingAsyncBase*) const = 0;
53 virtual void handleInvokeResponse(bool, OutgoingAsyncBase*) const = 0;
54};
55
56//
57// Base class for handling asynchronous invocations. This class is
58// responsible for the handling of the output stream and the child
59// invocation observer.
60//
61class ICE_API OutgoingAsyncBase : public virtual OutgoingAsyncCompletionCallback,
62#ifdef ICE_CPP11_MAPPING
63 public std::enable_shared_from_this<OutgoingAsyncBase>
64#else
65 public Ice::AsyncResult
66#endif
67{
68public:
69
70 virtual bool sent();
71 virtual bool exception(const Ice::Exception&);
72 virtual bool response();
73
74 void invokeSentAsync();
75 void invokeExceptionAsync();
76 void invokeResponseAsync();
77
78 void invokeSent();
79 void invokeException();
80 void invokeResponse();
81
82 virtual void cancelable(const IceInternal::CancellationHandlerPtr&);
83 void cancel();
84
85#ifndef ICE_CPP11_MAPPING
86 virtual Ice::Int getHash() const;
87
88 virtual Ice::CommunicatorPtr getCommunicator() const;
89 virtual Ice::ConnectionPtr getConnection() const;
90 virtual Ice::ObjectPrx getProxy() const;
91
92 virtual Ice::LocalObjectPtr getCookie() const;
93 virtual const std::string& getOperation() const;
94
95 virtual bool isCompleted() const;
96 virtual void waitForCompleted();
97
98 virtual bool isSent() const;
99 virtual void waitForSent();
100
101 virtual bool sentSynchronously() const;
102
103 virtual void throwLocalException() const;
104
105 virtual bool _waitForResponse();
106 virtual Ice::InputStream* _startReadParams();
107 virtual void _endReadParams();
108 virtual void _readEmptyParams();
109 virtual void _readParamEncaps(const ::Ice::Byte*&, ::Ice::Int&);
110 virtual void _throwUserException();
111
112 virtual void _scheduleCallback(const CallbackPtr&);
113#endif
114
115 void attachRemoteObserver(const Ice::ConnectionInfoPtr& c, const Ice::EndpointPtr& endpt, Ice::Int requestId)
116 {
117 const Ice::Int size = static_cast<Ice::Int>(_os.b.size() - headerSize - 4);
118 _childObserver.attach(getObserver().getRemoteObserver(c, endpt, requestId, size));
119 }
120
121 void attachCollocatedObserver(const Ice::ObjectAdapterPtr& adapter, Ice::Int requestId)
122 {
123 const Ice::Int size = static_cast<Ice::Int>(_os.b.size() - headerSize - 4);
124 _childObserver.attach(getObserver().getCollocatedObserver(adapter, requestId, size));
125 }
126
127 Ice::OutputStream* getOs()
128 {
129 return &_os;
130 }
131
132 Ice::InputStream* getIs()
133 {
134 return &_is;
135 }
136
137protected:
138
139 OutgoingAsyncBase(const InstancePtr&);
140
141 bool sentImpl(bool);
142 bool exceptionImpl(const Ice::Exception&);
143 bool responseImpl(bool, bool);
144
145 void cancel(const Ice::LocalException&);
146 void checkCanceled();
147
148 void warning(const std::exception&) const;
149 void warning() const;
150
151 //
152 // This virtual method is necessary for the communicator flush
153 // batch requests implementation.
154 //
155 virtual IceInternal::InvocationObserver& getObserver()
156 {
157 return _observer;
158 }
159
160 const InstancePtr _instance;
161 Ice::ConnectionPtr _cachedConnection;
162 bool _sentSynchronously;
163 bool _doneInSent;
164 unsigned char _state;
165
166#ifdef ICE_CPP11_MAPPING
167 std::mutex _m;
168 using Lock = std::lock_guard<std::mutex>;
169#else
170 IceUtil::Monitor<IceUtil::Mutex> _m;
171 typedef IceUtil::Monitor<IceUtil::Mutex>::Lock Lock;
172 Ice::LocalObjectPtr _cookie;
173#endif
174
175 IceInternal::UniquePtr<Ice::Exception> _ex;
176 IceInternal::UniquePtr<Ice::LocalException> _cancellationException;
177
178 InvocationObserver _observer;
179 ObserverHelperT<Ice::Instrumentation::ChildInvocationObserver> _childObserver;
180
181 Ice::OutputStream _os;
182 Ice::InputStream _is;
183
184 CancellationHandlerPtr _cancellationHandler;
185
186 static const unsigned char OK;
187 static const unsigned char Sent;
188#ifndef ICE_CPP11_MAPPING
189 static const unsigned char Done;
190 static const unsigned char EndCalled;
191#endif
192};
193
194//
195// Base class for proxy based invocations. This class handles the
196// retry for proxy invocations. It also ensures the child observer is
197// correct notified of failures and make sure the retry task is
198// correctly canceled when the invocation completes.
199//
200class ICE_API ProxyOutgoingAsyncBase : public OutgoingAsyncBase,
201 public IceUtil::TimerTask
202{
203public:
204
205 virtual AsyncStatus invokeRemote(const Ice::ConnectionIPtr&, bool, bool) = 0;
206 virtual AsyncStatus invokeCollocated(CollocatedRequestHandler*) = 0;
207
208 virtual bool exception(const Ice::Exception&);
209 virtual void cancelable(const CancellationHandlerPtr&);
210
211 void retryException(const Ice::Exception&);
212 void retry();
213 void abort(const Ice::Exception&);
214
215#ifdef ICE_CPP11_MAPPING
216 std::shared_ptr<ProxyOutgoingAsyncBase> shared_from_this()
217 {
218 return std::static_pointer_cast<ProxyOutgoingAsyncBase>(OutgoingAsyncBase::shared_from_this());
219 }
220#else
221 virtual Ice::ObjectPrx getProxy() const;
222 virtual Ice::CommunicatorPtr getCommunicator() const;
223#endif
224
225protected:
226
227 ProxyOutgoingAsyncBase(const Ice::ObjectPrxPtr&);
228 ~ProxyOutgoingAsyncBase();
229
230 void invokeImpl(bool);
231 bool sentImpl(bool);
232 bool exceptionImpl(const Ice::Exception&);
233 bool responseImpl(bool, bool);
234
235 virtual void runTimerTask();
236
237 const Ice::ObjectPrxPtr _proxy;
238 RequestHandlerPtr _handler;
239 Ice::OperationMode _mode;
240
241private:
242
243 int _cnt;
244 bool _sent;
245};
246
247//
248// Class for handling Slice operation invocations
249//
250class ICE_API OutgoingAsync : public ProxyOutgoingAsyncBase
251{
252public:
253
254 OutgoingAsync(const Ice::ObjectPrxPtr&, bool);
255
256 void prepare(const std::string&, Ice::OperationMode, const Ice::Context&);
257
258 virtual bool sent();
259 virtual bool response();
260
261 virtual AsyncStatus invokeRemote(const Ice::ConnectionIPtr&, bool, bool);
262 virtual AsyncStatus invokeCollocated(CollocatedRequestHandler*);
263
264 void abort(const Ice::Exception&);
265 void invoke(const std::string&);
266#ifdef ICE_CPP11_MAPPING
267 void invoke(const std::string&, Ice::OperationMode, Ice::FormatType, const Ice::Context&,
268 std::function<void(Ice::OutputStream*)>);
269 void throwUserException();
270#endif
271
272 Ice::OutputStream* startWriteParams(Ice::FormatType format)
273 {
274 _os.startEncapsulation(_encoding, format);
275 return &_os;
276 }
277 void endWriteParams()
278 {
279 _os.endEncapsulation();
280 }
281 void writeEmptyParams()
282 {
283 _os.writeEmptyEncapsulation(_encoding);
284 }
285 void writeParamEncaps(const ::Ice::Byte* encaps, ::Ice::Int size)
286 {
287 if(size == 0)
288 {
289 _os.writeEmptyEncapsulation(_encoding);
290 }
291 else
292 {
293 _os.writeEncapsulation(encaps, size);
294 }
295 }
296
297protected:
298
299 const Ice::EncodingVersion _encoding;
300
301#ifdef ICE_CPP11_MAPPING
302 std::function<void(const ::Ice::UserException&)> _userException;
303#endif
304
305 bool _synchronous;
306};
307
308}
309
310namespace IceInternal
311{
312
313#ifdef ICE_CPP11_MAPPING
314
315class ICE_API LambdaInvoke : public virtual OutgoingAsyncCompletionCallback
316{
317public:
318
319 LambdaInvoke(std::function<void(::std::exception_ptr)> exception, std::function<void(bool)> sent) :
320 _exception(std::move(exception)), _sent(std::move(sent))
321 {
322 }
323
324protected:
325
326 virtual bool handleSent(bool, bool) override;
327 virtual bool handleException(const Ice::Exception&) override;
328 virtual bool handleResponse(bool) override;
329
330 virtual void handleInvokeSent(bool, OutgoingAsyncBase*) const override;
331 virtual void handleInvokeException(const Ice::Exception&, OutgoingAsyncBase*) const override;
332 virtual void handleInvokeResponse(bool, OutgoingAsyncBase*) const override;
333
334 std::function<void(::std::exception_ptr)> _exception;
335 std::function<void(bool)> _sent;
336 std::function<void(bool)> _response;
337};
338
339template<typename Promise>
340class PromiseInvoke : public virtual OutgoingAsyncCompletionCallback
341{
342public:
343
344 auto
345 getFuture() -> decltype(std::declval<Promise>().get_future())
346 {
347 return _promise.get_future();
348 }
349
350protected:
351
352 Promise _promise;
353 std::function<void(bool)> _response;
354
355private:
356
357 virtual bool handleSent(bool, bool) override
358 {
359 return false;
360 }
361
362 virtual bool handleException(const Ice::Exception& ex) override
363 {
364 try
365 {
366 ex.ice_throw();
367 }
368 catch(const Ice::Exception&)
369 {
370 _promise.set_exception(std::current_exception());
371 }
372 return false;
373 }
374
375 virtual bool handleResponse(bool ok) override
376 {
377 _response(ok);
378 return false;
379 }
380
381 virtual void handleInvokeSent(bool, OutgoingAsyncBase*) const override
382 {
383 assert(false);
384 }
385
386 virtual void handleInvokeException(const Ice::Exception&, OutgoingAsyncBase*) const override
387 {
388 assert(false);
389 }
390
391 virtual void handleInvokeResponse(bool, OutgoingAsyncBase*) const override
392 {
393 assert(false);
394 }
395};
396
397template<typename T>
398class OutgoingAsyncT : public OutgoingAsync
399{
400public:
401
402 using OutgoingAsync::OutgoingAsync;
403
404 void
405 invoke(const std::string& operation,
407 Ice::FormatType format,
408 const Ice::Context& ctx,
409 std::function<void(Ice::OutputStream*)> write,
410 std::function<void(const Ice::UserException&)> userException)
411 {
412 _read = [](Ice::InputStream* stream)
413 {
414 T v;
415 stream->read(v);
416 return v;
417 };
418 _userException = std::move(userException);
419 OutgoingAsync::invoke(operation, mode, format, ctx, std::move(write));
420 }
421
422 void
423 invoke(const std::string& operation,
425 Ice::FormatType format,
426 const Ice::Context& ctx,
427 std::function<void(Ice::OutputStream*)> write,
428 std::function<void(const Ice::UserException&)> userException,
429 std::function<T(Ice::InputStream*)> read)
430 {
431 _read = std::move(read);
432 _userException = std::move(userException);
433 OutgoingAsync::invoke(operation, mode, format, ctx, std::move(write));
434 }
435
436protected:
437
438 std::function<T(Ice::InputStream*)> _read;
439};
440
441template<>
442class OutgoingAsyncT<void> : public OutgoingAsync
443{
444public:
445
446 using OutgoingAsync::OutgoingAsync;
447
448 void
449 invoke(const std::string& operation,
451 Ice::FormatType format,
452 const Ice::Context& ctx,
453 std::function<void(Ice::OutputStream*)> write,
454 std::function<void(const Ice::UserException&)> userException)
455 {
456 _userException = std::move(userException);
457 OutgoingAsync::invoke(operation, mode, format, ctx, std::move(write));
458 }
459};
460
461template<typename R>
462class LambdaOutgoing : public OutgoingAsyncT<R>, public LambdaInvoke
463{
464public:
465
466 LambdaOutgoing(const std::shared_ptr<Ice::ObjectPrx>& proxy,
467 std::function<void(R)> response,
468 std::function<void(::std::exception_ptr)> ex,
469 std::function<void(bool)> sent) :
470 OutgoingAsyncT<R>(proxy, false), LambdaInvoke(std::move(ex), std::move(sent))
471 {
472#if ICE_CPLUSPLUS >= 201402L
473 // Move capture with C++14
474 _response = [this, response = std::move(response)](bool ok)
475#else
476 _response = [this, response](bool ok)
477#endif
478 {
479 if(!ok)
480 {
481 this->throwUserException();
482 }
483 else if(response)
484 {
485 assert(this->_read);
486 this->_is.startEncapsulation();
487 R v = this->_read(&this->_is);
488 this->_is.endEncapsulation();
489 try
490 {
491 response(std::move(v));
492 }
493 catch(...)
494 {
495 throw std::current_exception();
496 }
497 }
498 };
499 }
500};
501
502template<>
503class LambdaOutgoing<void> : public OutgoingAsyncT<void>, public LambdaInvoke
504{
505public:
506
507 LambdaOutgoing(const std::shared_ptr<Ice::ObjectPrx>& proxy,
508 std::function<void()> response,
509 std::function<void(::std::exception_ptr)> ex,
510 std::function<void(bool)> sent) :
511 OutgoingAsyncT<void>(proxy, false), LambdaInvoke(std::move(ex), std::move(sent))
512 {
513#if ICE_CPLUSPLUS >= 201402L
514 // Move capture with C++14
515 _response = [this, response = std::move(response)](bool ok)
516#else
517 _response = [this, response](bool ok)
518#endif
519 {
520 if(!ok)
521 {
522 this->throwUserException();
523 }
524 else if(response)
525 {
526 if(!this->_is.b.empty())
527 {
528 this->_is.skipEmptyEncapsulation();
529 }
530
531 try
532 {
533 response();
534 }
535 catch(...)
536 {
537 throw std::current_exception();
538 }
539 }
540 };
541 }
542};
543
544class CustomLambdaOutgoing : public OutgoingAsync, public LambdaInvoke
545{
546public:
547
548 CustomLambdaOutgoing(const std::shared_ptr<Ice::ObjectPrx>& proxy,
549 std::function<void(Ice::InputStream*)> read,
550 std::function<void(::std::exception_ptr)> ex,
551 std::function<void(bool)> sent) :
552 OutgoingAsync(proxy, false), LambdaInvoke(std::move(ex), std::move(sent))
553 {
554#if ICE_CPLUSPLUS >= 201402L
555 // Move capture with C++14
556 _response = [this, read = std::move(read)](bool ok)
557#else
558 _response = [this, read](bool ok)
559#endif
560 {
561 if(!ok)
562 {
563 this->throwUserException();
564 }
565 else if(read)
566 {
567 //
568 // Read and respond
569 //
570 read(&this->_is);
571 }
572 };
573 }
574
575 void
576 invoke(const std::string& operation,
578 Ice::FormatType format,
579 const Ice::Context& ctx,
580 std::function<void(Ice::OutputStream*)> write,
581 std::function<void(const Ice::UserException&)> userException)
582 {
583 _userException = std::move(userException);
584 OutgoingAsync::invoke(operation, mode, format, ctx, std::move(write));
585 }
586};
587
588template<typename P, typename R>
589class PromiseOutgoing : public OutgoingAsyncT<R>, public PromiseInvoke<P>
590{
591public:
592
593 PromiseOutgoing(const std::shared_ptr<Ice::ObjectPrx>& proxy, bool sync) :
594 OutgoingAsyncT<R>(proxy, sync)
595 {
596 this->_response = [this](bool ok)
597 {
598 if(ok)
599 {
600 assert(this->_read);
601 this->_is.startEncapsulation();
602 R v = this->_read(&this->_is);
603 this->_is.endEncapsulation();
604 this->_promise.set_value(std::move(v));
605 }
606 else
607 {
608 this->throwUserException();
609 }
610 };
611 }
612};
613
614template<typename P>
615class PromiseOutgoing<P, void> : public OutgoingAsyncT<void>, public PromiseInvoke<P>
616{
617public:
618
619 PromiseOutgoing(const std::shared_ptr<Ice::ObjectPrx>& proxy, bool sync) :
620 OutgoingAsyncT<void>(proxy, sync)
621 {
622 this->_response = [&](bool ok)
623 {
624 if(this->_is.b.empty())
625 {
626 //
627 // If there's no response (oneway, batch-oneway proxies), we just set the promise
628 // on completion without reading anything from the input stream. This is required for
629 // batch invocations.
630 //
631 this->_promise.set_value();
632 }
633 else if(ok)
634 {
635 this->_is.skipEmptyEncapsulation();
636 this->_promise.set_value();
637 }
638 else
639 {
640 this->throwUserException();
641 }
642 };
643 }
644
645 virtual bool handleSent(bool done, bool) override
646 {
647 if(done)
648 {
649 PromiseInvoke<P>::_promise.set_value();
650 }
651 return false;
652 }
653};
654
655#else
656
657//
658// Base class for all callbacks.
659//
660class ICE_API CallbackBase : public IceUtil::Shared
661{
662public:
663
664 virtual ~CallbackBase();
665
666 void checkCallback(bool, bool);
667
668 virtual void completed(const ::Ice::AsyncResultPtr&) const = 0;
669 virtual IceUtil::Handle<CallbackBase> verify(const ::Ice::LocalObjectPtr&) = 0;
670 virtual void sent(const ::Ice::AsyncResultPtr&) const = 0;
671 virtual bool hasSentCallback() const = 0;
672};
673typedef IceUtil::Handle<CallbackBase> CallbackBasePtr;
674
675//
676// Base class for generic callbacks.
677//
678class ICE_API GenericCallbackBase : public virtual CallbackBase
679{
680public:
681
682 virtual ~GenericCallbackBase();
683};
684
685//
686// See comments in OutgoingAsync.cpp
687//
688extern ICE_API CallbackBasePtr dummyCallback ICE_GLOBAL_VAR_SUFFIX;
689
690//
691// Generic callback template that requires the caller to down-cast the
692// proxy and the cookie that are obtained from the AsyncResult.
693//
694template<class T>
695class AsyncCallback : public GenericCallbackBase
696{
697public:
698
699 typedef T callback_type;
700 typedef IceUtil::Handle<T> TPtr;
701
702 typedef void (T::*Callback)(const ::Ice::AsyncResultPtr&);
703
704 AsyncCallback(const TPtr& instance, Callback cb, Callback sentcb = 0) :
705 _callback(instance), _completed(cb), _sent(sentcb)
706 {
707 checkCallback(instance, cb != 0);
708 }
709
710 virtual void completed(const ::Ice::AsyncResultPtr& result) const
711 {
712 (_callback.get()->*_completed)(result);
713 }
714
715 virtual CallbackBasePtr verify(const ::Ice::LocalObjectPtr&)
716 {
717 return this; // Nothing to do, the cookie is not type-safe.
718 }
719
720 virtual void sent(const ::Ice::AsyncResultPtr& result) const
721 {
722 if(_sent)
723 {
724 (_callback.get()->*_sent)(result);
725 }
726 }
727
728 virtual bool hasSentCallback() const
729 {
730 return _sent != 0;
731 }
732
733private:
734
735 TPtr _callback;
736 Callback _completed;
737 Callback _sent;
738};
739
740class CallbackCompletion : public virtual OutgoingAsyncCompletionCallback
741{
742public:
743
744 CallbackCompletion(const CallbackBasePtr& cb, const Ice::LocalObjectPtr& cookie) : _callback(cb)
745 {
746 if(!_callback)
747 {
748 throw IceUtil::IllegalArgumentException(__FILE__, __LINE__);
749 }
750 const_cast<CallbackBasePtr&>(_callback) = _callback->verify(cookie);
751 }
752
753 virtual bool handleSent(bool, bool alreadySent)
754 {
755 return _callback && _callback->hasSentCallback() && !alreadySent;
756 }
757
758 virtual bool handleException(const Ice::Exception&)
759 {
760 return _callback;
761 }
762
763 virtual bool handleResponse(bool)
764 {
765 return _callback;
766 }
767
768 virtual void handleInvokeSent(bool, OutgoingAsyncBase* outAsync) const
769 {
770 _callback->sent(outAsync);
771 }
772
773 virtual void handleInvokeException(const Ice::Exception&, OutgoingAsyncBase* outAsync) const
774 {
775 _callback->completed(outAsync);
776 }
777
778 virtual void handleInvokeResponse(bool, OutgoingAsyncBase* outAsync) const
779 {
780 _callback->completed(outAsync);
781 }
782
783private:
784
785 const CallbackBasePtr _callback;
786};
787
788class CallbackOutgoing : public OutgoingAsync, public CallbackCompletion
789{
790public:
791
792 CallbackOutgoing(const Ice::ObjectPrx& proxy,
793 const std::string& operation,
794 const CallbackBasePtr& cb,
795 const Ice::LocalObjectPtr& cookie,
796 bool sync) :
797 OutgoingAsync(proxy, sync), CallbackCompletion(cb, cookie), _operation(operation)
798 {
799 _cookie = cookie;
800 }
801
802 virtual const std::string&
803 getOperation() const
804 {
805 return _operation;
806 }
807
808private:
809
810 const std::string& _operation;
811};
812
813#endif
814
815}
816
817#ifndef ICE_CPP11_MAPPING
818
819namespace Ice
820{
821
822typedef IceUtil::Handle< ::IceInternal::GenericCallbackBase> CallbackPtr;
823
831template<class T> CallbackPtr
832newCallback(const IceUtil::Handle<T>& instance,
833 void (T::*cb)(const AsyncResultPtr&),
834 void (T::*sentcb)(const AsyncResultPtr&) = 0)
835{
836 return new ::IceInternal::AsyncCallback<T>(instance, cb, sentcb);
837}
838
846template<class T> CallbackPtr
847newCallback(T* instance,
848 void (T::*cb)(const AsyncResultPtr&),
849 void (T::*sentcb)(const AsyncResultPtr&) = 0)
850{
851 return new ::IceInternal::AsyncCallback<T>(instance, cb, sentcb);
852}
853
854}
855
856//
857// Operation callbacks are specified in Proxy.h
858//
859
860#endif
861
862#ifdef ICE_CPP11_MAPPING
863# ifdef __clang__
864# pragma clang diagnostic pop
865# endif
866#endif
867
868#endif
#define ICE_API
Definition Config.h:197
#define ICE_GLOBAL_VAR_SUFFIX
Definition Config.h:185
virtual void ice_throw() const =0
Throws this exception.
Definition BuiltinSequences.h:56
int Int
The mapping for the Slice int type.
Definition Config.h:54
OperationMode
Determines the retry behavior an invocation in case of a (potentially) recoverable error.
Definition Current.h:74
::std::map<::std::string, ::std::string > Context
A request context.
Definition Current.h:68
IceInternal::Handle< LocalObject > LocalObjectPtr
Definition LocalObjectF.h:17
FormatType
Describes the possible formats for classes and exceptions.
Definition Format.h:21
IceUtil::Exception Exception
Definition Exception.h:22