#include <ace/IOStream_T.h>
template<class STREAM> class ACE_IOStream : public iostream, public STREAM {
public:
ACE_IOStream ( STREAM &stream, u_int streambuf_size = ACE_STREAMBUF_SIZE );
ACE_IOStream (u_int streambuf_size = ACE_STREAMBUF_SIZE);
virtual ~ACE_IOStream (void);
virtual int close (void);
int eof (void) const;
virtual ACE_IOStream<STREAM> &operator>> (ACE_IOStream_String &v);
virtual ACE_IOStream<STREAM> &operator<< (ACE_IOStream_String &v);
inline GETPUT_FUNC_SET (ACE_IOStream<STREAM>);
inline virtual int ipfx (int noskip = 0);
setstate (failbit);
return (0);
inline virtual int ipfx0 (void);
inline virtual int ipfx1 (void);
setstate (failbit);
return (0);
inline virtual void isfx (void);
inline virtual int opfx (void);
ACE_IOStream<STREAM> & operator>> (ACE_Time_Value *&tv);
protected:
ACE_Streambuf_T<STREAM> *streambuf_;
private:
inline ACE_UNIMPLEMENTED_FUNC (ssize_t send (...));
};
STREAM
class. When you create a new class from this template, you
can use it anywhere you would have used your original
STREAM
class.
To create an iostream for your favorite ACE IPC class (e.g.,
ACE_SOCK_Stream
), feed that class to this template's
STREAM
parameter, e.g.,
typedef ACE_Svc_HandlerACE_SOCK_iostream,
ACE_INET_Addr, ACE_NULL_SYNCH
Service_Handler;
Because the operators in the iostream class are not virtual, you cannot easily provide overloads in your custom ACE_IOStream classes. To make these things work correctly, you need to overload ALL operators of the ACE_IOStream you create. I've attempted to do that here to make things easier for you but there are no guarantees.
In the iostream.cpp file is an example of why it is necessary to overload all of the get/put operators when you want to customize only one or two.
ACE_IOStream (
STREAM &stream,
u_int streambuf_size = ACE_STREAMBUF_SIZE
);
ACE_IOStream (u_int streambuf_size = ACE_STREAMBUF_SIZE);
virtual ~ACE_IOStream (void);
streambuf_
ourselves since we gave it
to the iostream
base class;
virtual int close (void);
close
function.
int eof (void) const;
STREAM
, i.e., if the
connection has closed down or an error has occurred, else 0.
Under the covers, eof
calls the streambuf's timeout
function
which will reset the timeout flag. As as result, you should save
the return of eof
and check it instead of calling eof
successively.
virtual ACE_IOStream<STREAM> &operator>> (ACE_IOStream_String &v);
iostream
has them for char*
but that isn't always the best thing for a String
. If we don't
provide our own here, we may not get what we want.
virtual ACE_IOStream<STREAM> &operator<< (ACE_IOStream_String &v);
String::put
operator.
inline GETPUT_FUNC_SET (ACE_IOStream<STREAM>);
inline virtual int ipfx (int noskip = 0);
setstate (failbit);
return (0);
inline virtual int ipfx0 (void);
inline virtual int ipfx1 (void);
setstate (failbit);
return (0);
inline virtual void isfx (void);
inline virtual int opfx (void);
ACE_IOStream<STREAM> & operator>> (ACE_Time_Value *&tv);
inline ACE_UNIMPLEMENTED_FUNC (ssize_t send (...));
jcej@lads.com
and Jim Crossley jim@lads.com