// ********************************************************************** // // Copyright (c) 2001 // Mutable Realms, Inc. // Huntsville, AL, USA // // All Rights Reserved // // ********************************************************************** #ifndef ICE_STREAM_H #define ICE_STREAM_H #include #include #include #include #include namespace Ice { class UserException; } namespace IceInternal { class ICE_API BasicStream : public Buffer { public: BasicStream(const InstancePtr&); InstancePtr instance() const; void swap(BasicStream&); void resize(int); void reserve(int); void startWriteEncaps(); void endWriteEncaps(); void startReadEncaps(); void endReadEncaps(); void checkReadEncaps(); Ice::Int getReadEncapsSize(); void skipEncaps(); void writeSize(Ice::Int); void readSize(Ice::Int&); void writeBlob(const std::vector&); void readBlob(std::vector&, Ice::Int); // Performance critical function inlined, as writing single bytes // is used in many places in Ice code. void write(Ice::Byte v) { b.push_back(v); } void write(const std::vector&); void read(Ice::Byte&); void read(std::vector&); // Performance critical function inlined, as writing single bools // is used in many places in Ice code. void write(bool v) { b.push_back(static_cast(v)); } void write(const std::vector&); void read(bool&); void read(std::vector&); void write(Ice::Short); void write(const std::vector&); void read(Ice::Short&); void read(std::vector&); void write(Ice::Int); void write(const std::vector&); void read(Ice::Int&); void read(std::vector&); void write(Ice::Long); void write(const std::vector&); void read(Ice::Long&); void read(std::vector&); void write(Ice::Float); void write(const std::vector&); void read(Ice::Float&); void read(std::vector&); void write(Ice::Double); void write(const std::vector&); void read(Ice::Double&); void read(std::vector&); void write(const std::string&); void write(const std::vector&); void read(std::string&); void read(std::vector&); void write(const Ice::ObjectPrx&); void read(Ice::ObjectPrx&); void write(const Ice::ObjectPtr&); void read(const std::string&, const ::Ice::ObjectFactoryPtr&, Ice::ObjectPtr&); void write(const Ice::UserException&); ::Ice::Int throwException(const std::string*, const std::string*); private: // // Optimization. The instance may not be deleted while a // stack-allocated Incoming still holds it. // const InstancePtr& _instance; struct ReadEncaps { Container::size_type start; Ice::Byte encoding; std::vector objectsRead; }; struct WriteEncaps { Container::size_type start; std::map objectsWritten; }; std::vector _readEncapsStack; std::vector _writeEncapsStack; ReadEncaps* _currentReadEncaps; WriteEncaps* _currentWriteEncaps; static const std::string _emptyString; static const std::string _iceObjectId; static const std::string _userExceptionId; }; } #endif