int AutoConnectionEntry::synchronize (void) { if ((_ui32RemoteProxyID == 0) || (_connectorType == CT_UNDEF)) { return -1; } _pConnectivitySolutions = _pConnectivitySolutions ? _pConnectivitySolutions : P_CONNECTION_MANAGER->findConnectivitySolutionsToProxyWithID (_ui32RemoteProxyID); if (!_pConnectivitySolutions) { return -2; } QueryResult query (_pConnectivitySolutions->getBestConnectionSolutionForConnectorType (_connectorType)); Connection *pActiveConnection = query.getActiveConnectionToRemoteProxy(); if (!pActiveConnection && !_pConnectivitySolutions->getRemoteProxyInfo().isRemoteProxyReachableFromLocalHost()) { // It is impossible to open a connection to the remote NetProxy from the local host return -3; } if (!pActiveConnection) { Connector * const pConnector = P_CONNECTION_MANAGER->getConnectorForType (_connectorType); if (!pConnector) { // Critical error! return -4; } pActiveConnection = pConnector->openNewConnectionToRemoteProxy (query, false); if (!pActiveConnection && pConnector->isConnectingToRemoteAddr(query.getRemoteProxyServerAddress())) { // Connection still establishing! return 0; } query = _pConnectivitySolutions->getBestConnectionSolutionForConnectorType (_connectorType); if (!(pActiveConnection = query.getActiveConnectionToRemoteProxy())) { // Connection failed return -5; } } pActiveConnection->lock(); if (!pActiveConnection->isConnected()) { // Unexpected case pActiveConnection->unlock(); return -6; } if (_bSynchronized) { // Nothing to do here pActiveConnection->unlock(); return 0; } bool bReachable = _pConnectivitySolutions->getRemoteProxyInfo().isLocalProxyReachableFromRemote(); if (0 != pActiveConnection->openConnectionWithRemoteProxy (query.getBestConnectionSolution(), bReachable)) { pActiveConnection->unlock(); _bSynchronized = false; return -7; } pActiveConnection->unlock(); _bSynchronized = true; return 0; }