summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Reference.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-11-13 10:17:27 +0100
committerBenoit Foucher <benoit@zeroc.com>2012-11-13 10:17:27 +0100
commit99b44d083eeee5583adfe642081a827224fa1309 (patch)
tree46bb3af634cbd5d90b9e5d46099f4e0e85f70ec6 /cpp/src/Ice/Reference.cpp
parentCosmetic updates to IceGrid Admin connection wizard (diff)
downloadice-99b44d083eeee5583adfe642081a827224fa1309.tar.bz2
ice-99b44d083eeee5583adfe642081a827224fa1309.tar.xz
ice-99b44d083eeee5583adfe642081a827224fa1309.zip
Fixed ICE-4927: fixed proxy encoding to marshal protocol/encoding version instead of encoding it in endpoints
Diffstat (limited to 'cpp/src/Ice/Reference.cpp')
-rw-r--r--cpp/src/Ice/Reference.cpp87
1 files changed, 65 insertions, 22 deletions
diff --git a/cpp/src/Ice/Reference.cpp b/cpp/src/Ice/Reference.cpp
index dadbdf8af0d..a3d9f9478ca 100644
--- a/cpp/src/Ice/Reference.cpp
+++ b/cpp/src/Ice/Reference.cpp
@@ -143,7 +143,7 @@ IceInternal::Reference::changeEncoding(const Ice::EncodingVersion& encoding) con
r->_encoding = encoding;
return r;
}
-
+
ReferencePtr
IceInternal::Reference::changeCompress(bool newCompress) const
{
@@ -193,6 +193,12 @@ IceInternal::Reference::streamWrite(BasicStream* s) const
s->write(_secure);
+ if(s->getWriteEncoding() != Ice::Encoding_1_0)
+ {
+ s->write(_protocol);
+ s->write(_encoding);
+ }
+
// Derived class writes the remainder of the reference.
}
@@ -282,6 +288,16 @@ IceInternal::Reference::toString() const
s << " -s";
}
+ if(_protocol != Ice::Protocol_1_0)
+ {
+ s << " -p " << _protocol;
+ }
+
+ if(_encoding != Ice::Encoding_1_0)
+ {
+ s << " -e " << _encoding;
+ }
+
return s.str();
// Derived class writes the remainder of the string.
@@ -324,7 +340,12 @@ IceInternal::Reference::operator==(const Reference& r) const
return false;
}
- if(_encoding != r._encoding)
+ if(_protocol != r._protocol)
+ {
+ return false;
+ }
+
+ if(_encoding != r._encoding)
{
return false;
}
@@ -410,11 +431,20 @@ IceInternal::Reference::operator<(const Reference& r) const
return false;
}
- if(_encoding < r._encoding)
+ if(_protocol < r._protocol)
{
return true;
- }
- else if(r._encoding > _encoding)
+ }
+ else if(r._protocol < _protocol)
+ {
+ return false;
+ }
+
+ if(_encoding < r._encoding)
+ {
+ return true;
+ }
+ else if(r._encoding < _encoding)
{
return false;
}
@@ -450,6 +480,7 @@ IceInternal::Reference::Reference(const InstancePtr& instance,
const string& facet,
Mode mode,
bool secure,
+ const ProtocolVersion& protocol,
const EncodingVersion& encoding) :
_hashInitialized(false),
_instance(instance),
@@ -459,6 +490,7 @@ IceInternal::Reference::Reference(const InstancePtr& instance,
_identity(id),
_context(new SharedContext),
_facet(facet),
+ _protocol(protocol),
_encoding(encoding),
_overrideCompress(false),
_compress(false)
@@ -474,6 +506,7 @@ IceInternal::Reference::Reference(const Reference& r) :
_identity(r._identity),
_context(r._context),
_facet(r._facet),
+ _protocol(r._protocol),
_encoding(r._encoding),
_overrideCompress(r._overrideCompress),
_compress(r._compress)
@@ -495,6 +528,8 @@ IceInternal::Reference::hashInit() const
{
hashAdd(h, _compress);
}
+ hashAdd(h, _protocol.major);
+ hashAdd(h, _protocol.minor);
hashAdd(h, _encoding.major);
hashAdd(h, _encoding.minor);
return h;
@@ -510,7 +545,7 @@ IceInternal::FixedReference::FixedReference(const InstancePtr& instance,
bool secure,
const EncodingVersion& encoding,
const ConnectionIPtr& fixedConnection) :
- Reference(instance, communicator, id, facet, mode, secure, encoding),
+ Reference(instance, communicator, id, facet, mode, secure, Ice::Protocol_1_0, encoding),
_fixedConnection(fixedConnection)
{
}
@@ -820,7 +855,8 @@ IceInternal::RoutableReference::RoutableReference(const InstancePtr& instance,
const string& facet,
Mode mode,
bool secure,
- const EncodingVersion& version,
+ const ProtocolVersion& protocol,
+ const EncodingVersion& encoding,
const vector<EndpointIPtr>& endpoints,
const string& adapterId,
const LocatorInfoPtr& locatorInfo,
@@ -830,7 +866,7 @@ IceInternal::RoutableReference::RoutableReference(const InstancePtr& instance,
bool preferSecure,
EndpointSelectionType endpointSelection,
int locatorCacheTimeout) :
- Reference(instance, communicator, id, facet, mode, secure, version),
+ Reference(instance, communicator, id, facet, mode, secure, protocol, encoding),
_endpoints(endpoints),
_adapterId(adapterId),
_locatorInfo(locatorInfo),
@@ -907,6 +943,21 @@ IceInternal::RoutableReference::getConnectionId() const
}
ReferencePtr
+IceInternal::RoutableReference::changeEncoding(const Ice::EncodingVersion& encoding) const
+{
+ ReferencePtr r = Reference::changeEncoding(encoding);
+ if(r.get() != const_cast<RoutableReference*>(this))
+ {
+ LocatorInfoPtr& locInfo = RoutableReferencePtr::dynamicCast(r)->_locatorInfo;
+ if(locInfo && locInfo->getLocator()->ice_getEncodingVersion() != encoding)
+ {
+ locInfo = getInstance()->locatorManager()->get(locInfo->getLocator()->ice_encodingVersion(encoding));
+ }
+ }
+ return r;
+}
+
+ReferencePtr
IceInternal::RoutableReference::changeCompress(bool newCompress) const
{
ReferencePtr r = Reference::changeCompress(newCompress);
@@ -1175,7 +1226,6 @@ IceInternal::RoutableReference::toProperty(const string& prefix) const
properties[prefix + ".ConnectionCached"] = _cacheConnection ? "1" : "0";
properties[prefix + ".PreferSecure"] = _preferSecure ? "1" : "0";
properties[prefix + ".EndpointSelection"] = _endpointSelection == Random ? "Random" : "Ordered";
- properties[prefix + ".EncodingVersion"] = versionToString(getEncoding());
ostringstream s;
s << _locatorCacheTimeout;
@@ -1888,20 +1938,14 @@ IceInternal::RoutableReference::RoutableReference(const RoutableReference& r) :
namespace
{
-struct EndpointIsIncompatible : public unary_function<EndpointIPtr, bool>
+struct EndpointIsOpaque : public unary_function<EndpointIPtr, bool>
{
- const Reference* _reference;
-
- EndpointIsIncompatible(const Reference* reference) : _reference(reference)
- {
- }
+public:
bool
- operator()(const EndpointIPtr& p) const
+ operator()(EndpointIPtr p) const
{
- // If the enpoint doesn't support the proxy encoding or protocol, it's incompatible.
- return !(isSupported(_reference->getEncoding(), p->encodingVersion()) &&
- isSupported(currentProtocol, p->protocolVersion()));
+ return dynamic_cast<OpaqueEndpointI*>(p.get()) != 0;
}
};
@@ -1913,10 +1957,9 @@ IceInternal::RoutableReference::filterEndpoints(const vector<EndpointIPtr>& allE
vector<EndpointIPtr> endpoints = allEndpoints;
//
- // Filter out incompatible endpoints (whose encoding/protocol
- // versions aren't supported by this runtime, or are opaque).
+ // Filter out unknown endpoints.
//
- endpoints.erase(remove_if(endpoints.begin(), endpoints.end(), EndpointIsIncompatible(this)), endpoints.end());
+ endpoints.erase(remove_if(endpoints.begin(), endpoints.end(), EndpointIsOpaque()), endpoints.end());
//
// Filter out endpoints according to the mode of the reference.