bool LocalNode::_cmdAddListener( Command& command ) { NodeAddListenerPacket* packet = command.getModifiable< NodeAddListenerPacket >(); ConnectionDescriptionPtr description = new ConnectionDescription( packet->connectionData ); command.getNode()->addConnectionDescription( description ); if( command.getNode() != this ) return true; EQASSERT( packet->connection ); ConnectionPtr connection = packet->connection; packet->connection = 0; connection->unref( CO_REFERENCED_PARAM ); _connectionNodes[ connection ] = this; _incoming.addConnection( connection ); if( connection->getDescription()->type >= CONNECTIONTYPE_MULTICAST ) { MCData data; data.connection = connection; data.node = this; base::ScopedMutex<> mutex( _outMulticast ); _multicasts.push_back( data ); } connection->acceptNB(); return true; }
void LocalNode::_handleConnect() { ConnectionPtr connection = _incoming.getConnection(); ConnectionPtr newConn = connection->acceptSync(); connection->acceptNB(); if( !newConn ) { EQINFO << "Received connect event, but accept() failed" << std::endl; return; } _addConnection( newConn ); }
bool LocalNode::listen() { EQVERB << "Listener data: " << serialize() << std::endl; if( !isClosed() || !_connectSelf( )) return false; ConnectionDescriptions descriptions = getConnectionDescriptions(); for( ConnectionDescriptions::const_iterator i = descriptions.begin(); i != descriptions.end(); ++i ) { ConnectionDescriptionPtr description = *i; ConnectionPtr connection = Connection::create( description ); if( !connection ) continue; if( !connection->listen( )) { EQWARN << "Can't create listener connection: " << description << std::endl; return false; } _connectionNodes[ connection ] = this; _incoming.addConnection( connection ); if( description->type >= CONNECTIONTYPE_MULTICAST ) { MCData data; data.connection = connection; data.node = this; _multicasts.push_back( data ); } connection->acceptNB(); EQVERB << "Added node " << _id << " using " << connection << std::endl; } _state = STATE_LISTENING; EQVERB << base::className( this ) << " start command and receiver thread " << std::endl; _receiverThread->start(); EQINFO << *this << std::endl; return true; }