diff options
author | Marc Laukien <marc@zeroc.com> | 2001-10-17 18:48:46 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2001-10-17 18:48:46 +0000 |
commit | d7d8a18788c78e27d257ff12d92dd3f23bfc774a (patch) | |
tree | 6adecc8de9f13aae7c20c5280fd1069f9ab01e81 /cpp/src/Ice/BasicStream.cpp | |
parent | slice definitions for PyceExt purposes only (diff) | |
download | ice-d7d8a18788c78e27d257ff12d92dd3f23bfc774a.tar.bz2 ice-d7d8a18788c78e27d257ff12d92dd3f23bfc774a.tar.xz ice-d7d8a18788c78e27d257ff12d92dd3f23bfc774a.zip |
fixes
Diffstat (limited to 'cpp/src/Ice/BasicStream.cpp')
-rw-r--r-- | cpp/src/Ice/BasicStream.cpp | 113 |
1 files changed, 52 insertions, 61 deletions
diff --git a/cpp/src/Ice/BasicStream.cpp b/cpp/src/Ice/BasicStream.cpp index 113376032fa..e874ab1c618 100644 --- a/cpp/src/Ice/BasicStream.cpp +++ b/cpp/src/Ice/BasicStream.cpp @@ -137,7 +137,7 @@ IceInternal::BasicStream::skipEncaps() Int sz; read(sz); i += sz; - if (i >= b.end()) + if (i > b.end()) { throw UnmarshalOutOfBoundsException(__FILE__, __LINE__); } @@ -606,16 +606,6 @@ IceInternal::BasicStream::read(vector<Double>& v) void IceInternal::BasicStream::write(const string& v) { - // - // TODO: Revise reading/writing of strings and wstrings. Strings - // shouldn't be null-terminated on the wire. Instead, the string - // size should be transmitted first, and strings should be allowed - // to have 0 bytes. Only one initial Int parameter is sufficient, - // with negative values indicating redirection, and positive - // values for string lengths. Strings with length 0 should never - // be redirected. - // - map<string, Int>::const_iterator p = _encapsStack.back().stringsWritten.find(v); if (p != _encapsStack.back().stringsWritten.end()) { @@ -623,13 +613,16 @@ IceInternal::BasicStream::write(const string& v) } else { - write(Int(-1)); - int pos = b.size(); - resize(pos + v.size() + 1); - copy(v.begin(), v.end(), b.begin() + pos); - b.back() = 0; - Int sz = _encapsStack.back().stringsWritten.size(); - _encapsStack.back().stringsWritten[v] = sz; + Int len = v.size(); + write(len); + if (len > 0) + { + int pos = b.size(); + resize(pos + len); + copy(v.begin(), v.end(), b.begin() + pos); +// Int sz = _encapsStack.back().stringsWritten.size(); +// _encapsStack.back().stringsWritten[v] = -(sz + 1); + } } } @@ -653,35 +646,37 @@ IceInternal::BasicStream::write(const vector<string>& v) void IceInternal::BasicStream::read(string& v) { - // TODO: Needs to be revised. See comments in write(const string&). - Int idx; - read(idx); + Int len; + read(len); + + assert(len >= 0); - if (idx >= 0) + if (len < 0) { - if (static_cast<vector<string>::size_type>(idx) >= _encapsStack.back().stringsRead.size()) + if (static_cast<vector<string>::size_type>(-(len + 1)) >= _encapsStack.back().stringsRead.size()) { throw StringEncodingException(__FILE__, __LINE__); } - v = _encapsStack.back().stringsRead[idx]; + v = _encapsStack.back().stringsRead[-(len + 1)]; } - else if(idx == -1) + else { - Container::iterator begin = i; - do + if (len == 0) + { + v.erase(); + } + else { - if (i >= b.end()) + Container::iterator begin = i; + i += len; + if (i > b.end()) { throw UnmarshalOutOfBoundsException(__FILE__, __LINE__); } + v.resize(len); + copy(begin, i, v.begin()); +// _encapsStack.back().stringsRead.push_back(v); } - while (*i++); - v = begin; - _encapsStack.back().stringsRead.push_back(v); - } - else - { - throw StringEncodingException(__FILE__, __LINE__); } } @@ -706,7 +701,6 @@ IceInternal::BasicStream::read(vector<string>& v) void IceInternal::BasicStream::write(const wstring& v) { - // TODO: Needs to be revised. See comments in write(const string&). map<wstring, Int>::const_iterator p = _encapsStack.back().wstringsWritten.find(v); if (p != _encapsStack.back().wstringsWritten.end()) { @@ -714,15 +708,18 @@ IceInternal::BasicStream::write(const wstring& v) } else { - write(Int(-1)); - wstring::const_iterator p; - for (p = v.begin(); p != v.end(); ++p) + Int len = v.size(); + write(len); + if (len > 0) { - write(static_cast<Short>(*p)); + wstring::const_iterator p; + for (p = v.begin(); p != v.end(); ++p) + { + write(static_cast<Short>(*p)); + } + Int sz = _encapsStack.back().wstringsWritten.size(); + _encapsStack.back().wstringsWritten[v] = -(sz + 1); } - write(Short(0)); - Int sz = _encapsStack.back().wstringsWritten.size(); - _encapsStack.back().wstringsWritten[v] = sz; } } @@ -740,36 +737,30 @@ IceInternal::BasicStream::write(const vector<wstring>& v) void IceInternal::BasicStream::read(wstring& v) { - // TODO: Needs to be revised. See comments in write(const string&). - Int idx; - read(idx); + Int len; + read(len); - if (idx >= 0) + if (len < 0) { - if (static_cast<vector<string>::size_type>(idx) >= _encapsStack.back().wstringsRead.size()) + if (static_cast<vector<string>::size_type>(-(len + 1)) >= _encapsStack.back().wstringsRead.size()) { throw StringEncodingException(__FILE__, __LINE__); } - v = _encapsStack.back().wstringsRead[idx]; + v = _encapsStack.back().wstringsRead[-(len + 1)]; } - else if(idx == -1) + else { v.erase(); - while (true) + if (len > 0) { - Short s; - read(s); - if (!s) + while (len--) { - break; + Short s; + read(s); + v += static_cast<wchar_t>(s); } - v += static_cast<wchar_t>(s); + _encapsStack.back().wstringsRead.push_back(v); } - _encapsStack.back().wstringsRead.push_back(v); - } - else - { - throw StringEncodingException(__FILE__, __LINE__); } } |