RabbitMQConnection::~RabbitMQConnection()
{
  int fd;

  if (conn == NULL) {
    GST_DEBUG ("service already stopped");
    return;
  }

  fd = amqp_socket_get_sockfd (socket);

  /* Errors are ignored during close */
  if (!closeOnRelease) {
    /* close socket */
    close (fd);
  }

  amqp_channel_close (conn, 1, AMQP_REPLY_SUCCESS);
  amqp_connection_close (conn, AMQP_REPLY_SUCCESS);
  amqp_destroy_connection (conn);

  if (closeOnRelease) {
    /* inform remote side that we are done */
    shutdown (fd, SHUT_WR);
  }

  conn = NULL;
}
RabbitMQConnection::RabbitMQConnection (const std::string &address, int port) :
  address (address), port (port)
{
  conn = amqp_new_connection();

  socket = amqp_tcp_socket_new (conn);

  if (!socket) {
    throw Glib::IOChannelError (Glib::IOChannelError::Code::FAILED,
                                "Cannot create TCP socket");
  }

  if (amqp_socket_open (socket, address.c_str(), port) ) {
    throw Glib::IOChannelError (Glib::IOChannelError::Code::FAILED,
                                "Cannot open TCP socket");
  }

  makeSocketLinger (amqp_socket_get_sockfd (socket) );

  exception_on_error (amqp_login (conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN,
                                  "guest", "guest"), "Loging in");
  amqp_channel_open (conn, 1);
  exception_on_error (amqp_get_rpc_reply (conn), "Opening channel");
}
int amqp_get_sockfd(amqp_connection_state_t state)
{
  return state->socket ? amqp_socket_get_sockfd(state->socket) : -1;
}
int
RabbitMQConnection::getFd()
{
  return amqp_socket_get_sockfd (socket);
}