summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/EndpointI.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2013-04-04 16:02:42 -0700
committerMark Spruiell <mes@zeroc.com>2013-04-04 16:02:42 -0700
commit9cb665138c7d2422739e32b40a249c64fd3b6cd5 (patch)
tree94759d916599ca08761b98580185a230744ac67a /cpp/src/Ice/EndpointI.cpp
parentx64 VC10 icexml35d.dll was linked to wrong file (diff)
downloadice-9cb665138c7d2422739e32b40a249c64fd3b6cd5.tar.bz2
ice-9cb665138c7d2422739e32b40a249c64fd3b6cd5.tar.xz
ice-9cb665138c7d2422739e32b40a249c64fd3b6cd5.zip
* SOCKS support for C++
* Minor cleanup in C# * Unity fixes
Diffstat (limited to 'cpp/src/Ice/EndpointI.cpp')
-rw-r--r--cpp/src/Ice/EndpointI.cpp71
1 files changed, 46 insertions, 25 deletions
diff --git a/cpp/src/Ice/EndpointI.cpp b/cpp/src/Ice/EndpointI.cpp
index aabcb14b2b0..9cd4823c9ae 100644
--- a/cpp/src/Ice/EndpointI.cpp
+++ b/cpp/src/Ice/EndpointI.cpp
@@ -46,6 +46,17 @@ Init init;
Ice::LocalObject* IceInternal::upCast(EndpointI* p) { return p; }
IceUtil::Shared* IceInternal::upCast(EndpointHostResolver* p) { return p; }
+vector<ConnectorPtr>
+IceInternal::EndpointI::connectors(const vector<Address>& /*addrs*/, const NetworkProxyPtr& /*proxy*/) const
+{
+ //
+ // This method must be extended by endpoints which use the EndpointHostResolver to create
+ // connectors from IP addresses.
+ //
+ assert(false);
+ return vector<ConnectorPtr>();
+}
+
const string&
IceInternal::EndpointI::connectionId() const
{
@@ -63,17 +74,6 @@ IceInternal::EndpointI::internal_getHash() const
return _hashValue;
}
-vector<ConnectorPtr>
-IceInternal::EndpointI::connectors(const vector<Address>& /*addrs*/) const
-{
- //
- // This method must be extended by endpoints which use the EndpointHostResolver to create
- // connectors from IP addresses.
- //
- assert(false);
- return vector<ConnectorPtr>();
-}
-
IceInternal::EndpointI::EndpointI(const std::string& connectionId) :
_connectionId(connectionId),
_hashInitialized(false)
@@ -128,10 +128,14 @@ IceInternal::EndpointHostResolver::resolve(const string& host, int port, Ice::En
// Try to get the addresses without DNS lookup. If this doesn't
// work, we retry with DNS lookup (and observer).
//
- vector<Address> addrs = getAddresses(host, port, _protocol, selType, _preferIPv6, false);
- if(!addrs.empty())
+ NetworkProxyPtr networkProxy = _instance->networkProxy();
+ if(!networkProxy)
{
- return endpoint->connectors(addrs);
+ vector<Address> addrs = getAddresses(host, port, _protocol, selType, _preferIPv6, false);
+ if(!addrs.empty())
+ {
+ return endpoint->connectors(addrs, 0);
+ }
}
ObserverHelperT<> observer;
@@ -144,7 +148,13 @@ IceInternal::EndpointHostResolver::resolve(const string& host, int port, Ice::En
vector<ConnectorPtr> connectors;
try
{
- connectors = endpoint->connectors(getAddresses(host, port, _protocol, selType, _preferIPv6, true));
+ if(networkProxy)
+ {
+ networkProxy = networkProxy->resolveHost();
+ }
+
+ connectors = endpoint->connectors(getAddresses(host, port, _protocol, selType, _preferIPv6, true),
+ networkProxy);
}
catch(const Ice::LocalException& ex)
{
@@ -162,20 +172,24 @@ IceInternal::EndpointHostResolver::resolve(const string& host, int port, Ice::En
// Try to get the addresses without DNS lookup. If this doesn't work, we queue a resolve
// entry and the thread will take care of getting the endpoint addresses.
//
- try
+ NetworkProxyPtr networkProxy = _instance->networkProxy();
+ if(!networkProxy)
{
- vector<Address> addrs = getAddresses(host, port, _protocol, selType, _preferIPv6, false);
- if(!addrs.empty())
+ try
{
- callback->connectors(endpoint->connectors(addrs));
+ vector<Address> addrs = getAddresses(host, port, _protocol, selType, _preferIPv6, false);
+ if(!addrs.empty())
+ {
+ callback->connectors(endpoint->connectors(addrs, 0));
+ return;
+ }
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ callback->exception(ex);
return;
}
}
- catch(const Ice::LocalException& ex)
- {
- callback->exception(ex);
- return;
- }
Lock sync(*this);
assert(!_destroyed);
@@ -241,11 +255,18 @@ IceInternal::EndpointHostResolver::run()
threadObserver->stateChanged(ThreadStateIdle, ThreadStateInUseForOther);
}
+ NetworkProxyPtr networkProxy = _instance->networkProxy();
+ if(networkProxy)
+ {
+ networkProxy = networkProxy->resolveHost();
+ }
+
r.callback->connectors(r.endpoint->connectors(getAddresses(r.host,
r.port,
_protocol,
r.selType,
- _preferIPv6, true)));
+ _preferIPv6, true),
+ networkProxy));
if(threadObserver)
{