Add RTSP accept method
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 18 Feb 2009 17:46:35 +0000 (18:46 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 18 Feb 2009 17:46:35 +0000 (18:46 +0100)
Add a method to accept a connection on a socket and create a GstRTSPConnection
for it.

API: gst_rtsp_connection_accept()

docs/libs/gst-plugins-base-libs-sections.txt
gst-libs/gst/rtsp/gstrtspconnection.c
gst-libs/gst/rtsp/gstrtspconnection.h

index 4680380..8f2516f 100644 (file)
@@ -1194,6 +1194,7 @@ gst_rtsp_base64_decode_ip
 <INCLUDE>gst/rtsp/gstrtspconnection.h</INCLUDE>
 GstRTSPConnection
 gst_rtsp_connection_create
+gst_rtsp_connection_accept
 gst_rtsp_connection_connect
 gst_rtsp_connection_close
 gst_rtsp_connection_free
index 33cec5b..85bb56b 100644 (file)
@@ -163,7 +163,7 @@ build_reset (GstRTSPBuilder * builder)
 /**
  * gst_rtsp_connection_create:
  * @url: a #GstRTSPUrl 
- * @conn: a #GstRTSPConnection
+ * @conn: storage for a #GstRTSPConnection
  *
  * Create a newly allocated #GstRTSPConnection from @url and store it in @conn.
  * The connection will not yet attempt to connect to @url, use
@@ -206,6 +206,62 @@ no_fdset:
 }
 
 /**
+ * gst_rtsp_connection_accept:
+ * @sock: a socket
+ * @conn: storage for a #GstRTSPConnection
+ *
+ * Accept a new connection on @sock and create a new #GstRTSPConnection for
+ * handling communication on new socket.
+ *
+ * Returns: #GST_RTSP_OK when @conn contains a valid connection.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_connection_accept (gint sock, GstRTSPConnection ** conn)
+{
+  int fd;
+  unsigned int address_len;
+  GstRTSPConnection *newconn;
+  struct sockaddr_in address;
+  GstRTSPUrl *url;
+
+  address_len = sizeof (address);
+  memset (&address, 0, address_len);
+
+  fd = accept (sock, (struct sockaddr *) &address, &address_len);
+  if (fd == -1)
+    goto accept_failed;
+
+  /* set to non-blocking mode so that we can cancel the communication */
+#ifndef G_OS_WIN32
+  fcntl (fd, F_SETFL, O_NONBLOCK);
+#else
+  ioctlsocket (fd, FIONBIO, &flags);
+#endif /* G_OS_WIN32 */
+
+  /* create a url for the client address */
+  url = g_new0 (GstRTSPUrl, 1);
+  url->host = g_strdup_printf ("%s", inet_ntoa (address.sin_addr));
+  url->port = address.sin_port;
+
+  /* now create the connection object */
+  gst_rtsp_connection_create (url, &newconn);
+  newconn->fd.fd = fd;
+  gst_poll_add_fd (newconn->fdset, &newconn->fd);
+
+  *conn = newconn;
+
+  return GST_RTSP_OK;
+
+  /* ERRORS */
+accept_failed:
+  {
+    return GST_RTSP_ESYS;
+  }
+}
+
+/**
  * gst_rtsp_connection_connect:
  * @conn: a #GstRTSPConnection 
  * @timeout: a #GTimeVal timeout
index 33bee8f..99dd314 100644 (file)
@@ -84,6 +84,7 @@ struct _GstRTSPConnection
 
 /* opening/closing a connection */
 GstRTSPResult      gst_rtsp_connection_create        (GstRTSPUrl *url, GstRTSPConnection **conn);
+GstRTSPResult      gst_rtsp_connection_accept        (gint sock, GstRTSPConnection **conn);
 GstRTSPResult      gst_rtsp_connection_connect       (GstRTSPConnection *conn, GTimeVal *timeout);
 GstRTSPResult      gst_rtsp_connection_close         (GstRTSPConnection *conn);
 GstRTSPResult      gst_rtsp_connection_free          (GstRTSPConnection *conn);