diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/BasicStream.cpp | 65 | ||||
-rw-r--r-- | cpp/src/Ice/Object.cpp | 3 | ||||
-rw-r--r-- | cpp/src/Ice/Proxy.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Ice/TraceUtil.cpp | 3 | ||||
-rw-r--r-- | cpp/src/IceStorm/TopicI.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Makefile | 5 |
6 files changed, 64 insertions, 16 deletions
diff --git a/cpp/src/Ice/BasicStream.cpp b/cpp/src/Ice/BasicStream.cpp index c2c3f593860..f359c5578dc 100644 --- a/cpp/src/Ice/BasicStream.cpp +++ b/cpp/src/Ice/BasicStream.cpp @@ -28,8 +28,8 @@ IceInternal::BasicStream::BasicStream(const InstancePtr& instance) : _encapsStack(1) { _encapsStack.resize(1); - _encapsStack.back().start = 0; _encapsStack.back().encoding = 0; + _encapsStack.back().start = 0; } IceInternal::BasicStream::~BasicStream() @@ -80,11 +80,11 @@ IceInternal::BasicStream::reserve(int total) void IceInternal::BasicStream::startWriteEncaps() { + write(Int(0)); // Encoding write(Int(0)); // Placeholder for the encapsulation length _encapsStack.resize(_encapsStack.size() + 1); - _encapsStack.back().start = b.size(); _encapsStack.back().encoding = 0; - write(_encapsStack.back().encoding); + _encapsStack.back().start = b.size(); } void @@ -104,15 +104,17 @@ IceInternal::BasicStream::endWriteEncaps() void IceInternal::BasicStream::startReadEncaps() { + Int encoding; + read(encoding); + if (encoding != 0) + { + throw UnsupportedEncodingException(__FILE__, __LINE__); + } Int sz; read(sz); _encapsStack.resize(_encapsStack.size() + 1); + _encapsStack.back().encoding = encoding; _encapsStack.back().start = i - b.begin(); - read(_encapsStack.back().encoding); - if (_encapsStack.back().encoding != 0) - { - throw UnsupportedEncodingException(__FILE__, __LINE__); - } } void @@ -121,7 +123,13 @@ IceInternal::BasicStream::endReadEncaps() int start = _encapsStack.back().start; _encapsStack.pop_back(); i = b.begin() + start - sizeof(Int); - skipEncaps(); + Int sz; + read(sz); + i += sz; + if (i > b.end()) + { + throw UnmarshalOutOfBoundsException(__FILE__, __LINE__); + } } void @@ -139,9 +147,27 @@ IceInternal::BasicStream::checkReadEncaps() } } +Int +IceInternal::BasicStream::getReadEncapsSize() +{ + int start = _encapsStack.back().start; + Container::iterator save = i; + i = b.begin() + start - sizeof(Int); + Int sz; + read(sz); + i = save; + return sz; +} + void IceInternal::BasicStream::skipEncaps() { + Int encoding; + read(encoding); + if (encoding != 0) + { + throw UnsupportedEncodingException(__FILE__, __LINE__); + } Int sz; read(sz); i += sz; @@ -152,6 +178,27 @@ IceInternal::BasicStream::skipEncaps() } void +IceInternal::BasicStream::writeBlob(const vector<Byte>& v) +{ + int pos = b.size(); + resize(pos + v.size()); + copy(v.begin(), v.end(), b.begin() + pos); +} + +void +IceInternal::BasicStream::readBlob(vector<Byte>& v, Int sz) +{ + Container::iterator begin = i; + i += sz; + if (i > b.end()) + { + throw UnmarshalOutOfBoundsException(__FILE__, __LINE__); + } + v.resize(sz); + copy(begin, i, v.begin()); +} + +void IceInternal::BasicStream::write(const vector<Byte>& v) { int pos = b.size(); diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp index 2179b78bb8a..8fe66e03a3c 100644 --- a/cpp/src/Ice/Object.cpp +++ b/cpp/src/Ice/Object.cpp @@ -248,7 +248,8 @@ DispatchStatus Ice::Blobject::__dispatch(Incoming& in, const string& identity, const string& facet, const string& operation) { vector<Byte> blob; - in.is()->read(blob); + Int sz = in.is()->getReadEncapsSize(); + in.is()->readBlob(blob, sz); ice_invokeIn(identity, facet, operation, blob); return ::IceInternal::DispatchOK; } diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp index 82a47527713..d7b06696567 100644 --- a/cpp/src/Ice/Proxy.cpp +++ b/cpp/src/Ice/Proxy.cpp @@ -536,7 +536,7 @@ IceDelegateM::Ice::Object::ice_invokeIn(const string& operation, const vector<By { Outgoing __out(__emitter, __reference, operation.c_str()); BasicStream* __os = __out.os(); - __os->write(inParams); + __os->writeBlob(inParams); if (!__out.invoke()) { throw ::Ice::UnknownUserException(__FILE__, __LINE__); diff --git a/cpp/src/Ice/TraceUtil.cpp b/cpp/src/Ice/TraceUtil.cpp index e9ad748267d..f2f386aab24 100644 --- a/cpp/src/Ice/TraceUtil.cpp +++ b/cpp/src/Ice/TraceUtil.cpp @@ -131,8 +131,6 @@ IceInternal::traceBatchRequest(const char* heading, const BasicStream& str, cons while (stream.i != stream.b.end()) { s << "\nrequest #" << cnt++ << ':'; - BasicStream::Container::iterator q = stream.i; - stream.startReadEncaps(); string identity; stream.read(identity); s << "\nidentity = " << identity; @@ -142,7 +140,6 @@ IceInternal::traceBatchRequest(const char* heading, const BasicStream& str, cons string operation; stream.read(operation); s << "\noperation name = " << operation; - stream.i = q; stream.skipEncaps(); } logger->trace(tl->protocolCat, s.str()); diff --git a/cpp/src/IceStorm/TopicI.cpp b/cpp/src/IceStorm/TopicI.cpp index 0510e081311..f5cef4a1201 100644 --- a/cpp/src/IceStorm/TopicI.cpp +++ b/cpp/src/IceStorm/TopicI.cpp @@ -144,7 +144,9 @@ public: _subscribers.remove_if(::Ice::constMemFun(&Subscriber::invalid)); for (SubscriberList::iterator i = _subscribers.begin(); i != _subscribers.end(); ++i) + { (*i)->publish(op, blob); + } //for_each(_subscribers.begin(), _subscribers.end(), Ice::memFun(&Subscriber::publish)); } diff --git a/cpp/src/Makefile b/cpp/src/Makefile index a155019e416..4d5389bb21c 100644 --- a/cpp/src/Makefile +++ b/cpp/src/Makefile @@ -19,8 +19,9 @@ SUBDIRS = IceUtil \ slice2docbook \ slice2java \ Ice \ - IcePack \ - Freeze + Freeze \ + IceStorm \ + IcePack $(EVERYTHING):: @for subdir in $(SUBDIRS); \ |