summaryrefslogtreecommitdiff
path: root/cpp/include/Ice/BasicStream.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/Ice/BasicStream.h')
-rw-r--r--cpp/include/Ice/BasicStream.h64
1 files changed, 56 insertions, 8 deletions
diff --git a/cpp/include/Ice/BasicStream.h b/cpp/include/Ice/BasicStream.h
index c5a5275744c..48012c799bd 100644
--- a/cpp/include/Ice/BasicStream.h
+++ b/cpp/include/Ice/BasicStream.h
@@ -35,7 +35,9 @@ class ICE_API BasicStream : public Buffer
{
public:
- BasicStream(Instance*);
+ typedef void (*PatchFunc)(void*, Ice::ObjectPtr&);
+
+ BasicStream(Instance* = 0);
//
// Must return Instance*, because we don't hold an InstancePtr for
@@ -57,9 +59,18 @@ public:
Ice::Int getReadEncapsSize();
void skipEncaps();
+ void startWriteSlice();
+ void endWriteSlice();
+ void startReadSlice();
+ void endReadSlice();
+ void skipSlice();
+
void writeSize(Ice::Int);
void readSize(Ice::Int&);
+ void writeTypeId(const std::string&);
+ void readTypeId(std::string&);
+
void writeBlob(const std::vector<Ice::Byte>&);
void readBlob(std::vector<Ice::Byte>&, Ice::Int);
@@ -120,10 +131,13 @@ public:
void read(Ice::ObjectPrx&);
void write(const Ice::ObjectPtr&);
- void read(const std::string&, const ::Ice::ObjectFactoryPtr&, Ice::ObjectPtr&);
+ void read(PatchFunc, void*);
void write(const Ice::UserException&);
- ::Ice::Int throwException(const std::string*, const std::string*);
+ void throwException();
+
+ void writePendingObjects();
+ void readPendingObjects();
private:
@@ -133,28 +147,62 @@ private:
//
Instance* _instance;
- struct ReadEncaps
+ struct PatchEntry {
+ PatchFunc patchFunc;
+ void* patchAddr;
+ };
+ typedef std::vector<PatchEntry> PatchList;
+ typedef std::map<Ice::Int, PatchList> PatchMap;
+ typedef std::map<Ice::Int, Ice::ObjectPtr> IndexToPtrMap;
+ typedef std::map<Ice::Int, std::string> TypeIdReadMap;
+
+ class ReadEncaps
{
+ public:
+ ReadEncaps();
+ ReadEncaps(const ReadEncaps&);
+ ~ReadEncaps();
+
Container::size_type start;
Ice::Byte encodingMajor;
Ice::Byte encodingMinor;
- std::vector<Ice::ObjectPtr> objectsRead;
+ PatchMap* patchMap;
+ IndexToPtrMap* unmarshaledMap;
+ Ice::Int typeIdIndex;
+ TypeIdReadMap* typeIdMap;
};
- struct WriteEncaps
+ typedef std::map<Ice::ObjectPtr, Ice::Int> PtrToIndexMap;
+ typedef std::map<std::string, Ice::Int> TypeIdWriteMap;
+
+ class WriteEncaps
{
+ public:
+
+ WriteEncaps();
+ WriteEncaps(const WriteEncaps&);
+ ~WriteEncaps();
+
Container::size_type start;
- std::map<Ice::ObjectPtr, Ice::Int> objectsWritten;
+ Ice::Int writeIndex;
+ PtrToIndexMap* toBeMarshaledMap;
+ PtrToIndexMap* marshaledMap;
+ Ice::Int typeIdIndex;
+ TypeIdWriteMap* typeIdMap;
};
std::vector<ReadEncaps> _readEncapsStack;
std::vector<WriteEncaps> _writeEncapsStack;
ReadEncaps* _currentReadEncaps;
WriteEncaps* _currentWriteEncaps;
+ Container::size_type _readSlice;
+ Container::size_type _writeSlice;
- static const std::string _emptyString;
static const std::string _iceObjectId;
static const std::string _userExceptionId;
+
+ void writeInstance(const Ice::ObjectPtr&, Ice::Int);
+ void patchPointers(::Ice::Int, PatchMap::iterator, IndexToPtrMap::const_iterator);
};
}