/*
 * Starts the element. If the sockfd property was not the default, this method
 * will create a new socket and connect to the server.
 *
 * @param bsink - the element
 * @return TRUE if the send operation was successful, FALSE otherwise.
 */
static gboolean
gst_dccp_client_sink_start (GstBaseSink * bsink)
{
  GstDCCPClientSink *sink = GST_DCCP_CLIENT_SINK (bsink);

  if (sink->sock_fd == DCCP_DEFAULT_SOCK_FD) {
    gchar *ip = NULL;

    /* look up name if we need to */
    if (!(ip = gst_dccp_host_to_ip (GST_ELEMENT (sink), sink->host))) {
      GST_ERROR_OBJECT (sink, "cannot resolve hostname");
      gst_dccp_client_sink_stop (GST_BASE_SINK (sink));
      return FALSE;
    }

    /* name the server socket */
    memset (&sink->server_sin, 0, sizeof (sink->server_sin));
    sink->server_sin.sin_family = AF_INET;      /* network socket */
    sink->server_sin.sin_port = htons (sink->port);     /* on port */
    sink->server_sin.sin_addr.s_addr = inet_addr (ip);  /* on host ip */
    g_free (ip);

    /* create socket */
    if ((sink->sock_fd = gst_dccp_create_new_socket (GST_ELEMENT (sink))) < 0) {
      return FALSE;
    }

    if (!gst_dccp_set_ccid (GST_ELEMENT (sink), sink->sock_fd, sink->ccid)) {
      gst_dccp_client_sink_stop (GST_BASE_SINK (sink));
      return FALSE;
    }

    if (!gst_dccp_connect_to_server (GST_ELEMENT (sink), sink->server_sin,
            sink->sock_fd)) {
      gst_dccp_client_sink_stop (GST_BASE_SINK (sink));
      return FALSE;
    }

    /* the socket is connected */
    g_signal_emit (sink, gst_dccp_client_sink_signals[SIGNAL_CONNECTED], 0,
        sink->sock_fd);
  }

  sink->pksize =
      gst_dccp_get_max_packet_size (GST_ELEMENT (sink), sink->sock_fd);

  return TRUE;
}
/*
 * Starts the element. If the sockfd property was not the default, this method
 * will create a new server socket and wait for a client connection.
 *
 * @param bsrc - the element
 * @return TRUE if the send operation was successful, FALSE otherwise.
 */
static gboolean
gst_dccp_server_src_start (GstBaseSrc * bsrc)
{
  GstDCCPServerSrc *src = GST_DCCP_SERVER_SRC (bsrc);

  if (src->client_sock_fd == DCCP_DEFAULT_CLIENT_SOCK_FD) {
    /* create socket */
    if ((src->sock_fd = gst_dccp_create_new_socket (GST_ELEMENT (src))) < 0) {
      return FALSE;
    }

    if (!gst_dccp_make_address_reusable (GST_ELEMENT (src), src->sock_fd)) {
      return FALSE;
    }

    /* name the server socket */
    memset (&src->server_sin, 0, sizeof (src->server_sin));
    src->server_sin.sin_family = AF_INET;       /* network socket */
    src->server_sin.sin_port = htons (src->port);       /* on port */
    src->server_sin.sin_addr.s_addr = htonl (INADDR_ANY);       /* for hosts */


    if (!gst_dccp_bind_server_socket (GST_ELEMENT (src), src->sock_fd,
            src->server_sin)) {
      return FALSE;
    }

    if (!gst_dccp_set_ccid (GST_ELEMENT (src), src->sock_fd, src->ccid)) {
      return FALSE;
    }

    if (!gst_dccp_listen_server_socket (GST_ELEMENT (src), src->sock_fd)) {
      return FALSE;
    }

    src->client_sock_fd = gst_dccp_server_wait_connections (GST_ELEMENT (src),
        src->sock_fd);
    if (src->client_sock_fd == -1) {
      return FALSE;
    }

    /* the socket is connected */
    g_signal_emit (src, gst_dccp_server_src_signals[SIGNAL_CONNECTED], 0,
        src->client_sock_fd);
  }

  return TRUE;
}