コード例 #1
0
    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;
    }