void FramedTcpListener::destroyConnection(FramedTcpConnection::Ptr conn)
{
  mutex_lock lock(_mutex);
  _connections.erase(conn.get());
  OSS_LOG_INFO( "FramedTcpListener::destroyConnection "
    << " connection removed - " << conn.get());
  conn->stop();
}
void FramedTcpListener::addConnection(FramedTcpConnection::Ptr conn)
{
  mutex_lock lock(_mutex);
  _connections[conn.get()] = conn;
  OSS_LOG_INFO( "FramedTcpListener::addConnection "
    << " connection accepted "  << conn.get());
  conn->start();
}
void SIPTCPConnectionManager::add(SIPTCPConnection::Ptr conn)
{
  OSS::mutex_write_lock wlock(_rwConnectionsMutex);
  if (!conn->getIdentifier())
    conn->setIdentifier(++_currentIdentifier);
  _connections[conn->getIdentifier()] = conn;
  OSS_LOG_INFO("SIPTCPConnection Added transport (" << conn->getIdentifier() << ") "
    << conn->getLocalAddress().toIpPortString() <<
    "->" << conn->getRemoteAddress().toIpPortString() );
}
void SIPTCPConnectionManager::stop(SIPTCPConnection::Ptr conn)
{
  OSS::mutex_write_lock wlock(_rwConnectionsMutex);

  OSS_LOG_INFO("Deleting SIPTCPConnection transport (" << conn->getIdentifier() << ") "
    << conn->getLocalAddress().toIpPortString() <<
    "->" << conn->getRemoteAddress().toIpPortString() );

  _connections.erase(conn->getIdentifier());
  conn->stop();
}
SIPTCPConnection::Ptr SIPTCPConnectionManager::findConnectionById(OSS::UInt64 identifier)
{
  OSS::mutex_read_lock rlock(_rwConnectionsMutex);
  if (_connections.find(identifier) != _connections.end())
  {
    SIPTCPConnection::Ptr conn = _connections[identifier];
    if (conn)
    {
      OSS_LOG_INFO("SIPTCPConnectionManager::findConnectionById got transport (" << conn->getIdentifier() << ") "
      << conn->getLocalAddress().toIpPortString() <<
      "->" << conn->getRemoteAddress().toIpPortString() );
    }
    return conn;
  }
  return SIPTCPConnection::Ptr();
}
void FramedTcpListener::run(const std::string& address, const std::string& port)
{
  _pNewConnection = FramedTcpConnection::Ptr(new FramedTcpConnection(*this));

  boost::asio::ip::tcp::resolver::query query(address, port);
  boost::asio::ip::tcp::endpoint endpoint = *_resolver.resolve(query);
  _acceptor.open(endpoint.protocol());
  _acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  _acceptor.bind(endpoint);
  _acceptor.listen();
  _acceptor.async_accept(dynamic_cast<FramedTcpConnection*>(_pNewConnection.get())->socket(),
      boost::bind(&FramedTcpListener::handleAccept, this,
        boost::asio::placeholders::error));

  OSS_LOG_INFO( "FramedTcpListener::run "
    << " started accepting connections at bind address tcp://" << address << ":" << port);
}