summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/BasicStream.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-10-17 18:48:46 +0000
committerMarc Laukien <marc@zeroc.com>2001-10-17 18:48:46 +0000
commitd7d8a18788c78e27d257ff12d92dd3f23bfc774a (patch)
tree6adecc8de9f13aae7c20c5280fd1069f9ab01e81 /cpp/src/Ice/BasicStream.cpp
parentslice definitions for PyceExt purposes only (diff)
downloadice-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.cpp113
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__);
}
}