gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c
branchRCL_3
changeset 29 567bb019e3e3
parent 0 0e761a78d257
child 30 7e817e7e631c
--- a/gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c	Wed Mar 31 22:03:18 2010 +0300
+++ b/gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c	Tue Aug 31 15:30:33 2010 +0300
@@ -145,6 +145,9 @@
  * @port: a port number to set.
  *
  * Set @naddr with the IPv4 @address and @port pair.
+ *
+ * Note that @port and @address must be expressed in network byte order,
+ * use g_htons() and g_htonl() to convert them to network byte order.
  */
 #ifdef __SYMBIAN32__
 EXPORT_C
@@ -168,6 +171,9 @@
  * @port: a port number to set.
  *
  * Set @naddr with the IPv6 @address and @port pair.
+ *
+ * Note that @port must be expressed in network byte order, use g_htons() to convert
+ * it to network byte order.
  */
 #ifdef __SYMBIAN32__
 EXPORT_C
@@ -197,7 +203,7 @@
 #endif
 
 GstNetType
-gst_netaddress_get_net_type (GstNetAddress * naddr)
+gst_netaddress_get_net_type (const GstNetAddress * naddr)
 {
   g_return_val_if_fail (naddr != NULL, GST_NET_TYPE_UNKNOWN);
 
@@ -210,7 +216,11 @@
  * @address: a location to store the address.
  * @port: a location to store the port.
  *
- * Get the IPv4 address stored in @naddr into @address.
+ * Get the IPv4 address stored in @naddr into @address. This function requires
+ * that the address type of @naddr is of type #GST_NET_TYPE_IP4.
+ *
+ * Note that @port and @address are expressed in network byte order, use
+ * g_ntohs() and g_ntohl() to convert them to host order.
  *
  * Returns: TRUE if the address could be retrieved.
  */
@@ -219,12 +229,12 @@
 #endif
 
 gboolean
-gst_netaddress_get_ip4_address (GstNetAddress * naddr, guint32 * address,
+gst_netaddress_get_ip4_address (const GstNetAddress * naddr, guint32 * address,
     guint16 * port)
 {
   g_return_val_if_fail (naddr != NULL, FALSE);
 
-  if (naddr->type == GST_NET_TYPE_UNKNOWN)
+  if (naddr->type == GST_NET_TYPE_UNKNOWN || naddr->type == GST_NET_TYPE_IP6)
     return FALSE;
 
   if (address)
@@ -243,6 +253,12 @@
  *
  * Get the IPv6 address stored in @naddr into @address.
  *
+ * If @naddr is of type GST_NET_TYPE_IP4, the transitional IP6 address is
+ * returned.
+ *
+ * Note that @port is expressed in network byte order, use g_ntohs() to convert
+ * it to host order.
+ *
  * Returns: TRUE if the address could be retrieved.
  */
 #ifdef __SYMBIAN32__
@@ -250,16 +266,24 @@
 #endif
 
 gboolean
-gst_netaddress_get_ip6_address (GstNetAddress * naddr, guint8 address[16],
+gst_netaddress_get_ip6_address (const GstNetAddress * naddr, guint8 address[16],
     guint16 * port)
 {
+  static guint8 ip4_transition[16] =
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF };
   g_return_val_if_fail (naddr != NULL, FALSE);
 
   if (naddr->type == GST_NET_TYPE_UNKNOWN)
     return FALSE;
 
-  if (address)
-    memcpy (address, naddr->address.ip6, 16);
+  if (address) {
+    if (naddr->type == GST_NET_TYPE_IP6) {
+      memcpy (address, naddr->address.ip6, 16);
+    } else {                    /* naddr->type == GST_NET_TYPE_IP4 */
+      memcpy (address, ip4_transition, 12);
+      memcpy (address + 12, (guint8 *) & (naddr->address.ip4), 4);
+    }
+  }
   if (port)
     *port = naddr->port;
 
@@ -267,6 +291,98 @@
 }
 
 /**
+ * gst_netaddress_get_address_bytes:
+ * @naddr: a network address
+ * @address: a location to store the result.
+ * @port: a location to store the port.
+ *
+ * Get just the address bytes stored in @naddr into @address.
+ *
+ * Note that @port is expressed in network byte order, use g_ntohs() to convert
+ * it to host order. IP4 addresses are also stored in network byte order.
+ *
+ * Returns: number of bytes actually copied
+ *
+ * Since: 0.10.22
+ */
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+
+gint
+gst_netaddress_get_address_bytes (const GstNetAddress * naddr,
+    guint8 address[16], guint16 * port)
+{
+  gint ret = 0;
+
+  g_return_val_if_fail (naddr != NULL, FALSE);
+
+  if (naddr->type == GST_NET_TYPE_UNKNOWN)
+    return 0;
+
+  if (address) {
+    if (naddr->type == GST_NET_TYPE_IP6) {
+      memcpy (address, naddr->address.ip6, 16);
+      ret = 16;
+    } else {                    /* naddr->type == GST_NET_TYPE_IP4 */
+      memcpy (address, (guint8 *) & (naddr->address.ip4), 4);
+      ret = 4;
+    }
+  }
+  if (port)
+    *port = naddr->port;
+
+  return ret;
+}
+
+/**
+ * gst_netaddress_set_address_bytes:
+ * @naddr: a network address
+ * @address: a location to store the result.
+ * @port: a location to store the port.
+ *
+ * Set just the address bytes stored in @naddr into @address.
+ *
+ * Note that @port must be expressed in network byte order, use g_htons() to convert
+ * it to network byte order order. IP4 address bytes must also be stored in
+ * network byte order.
+ *
+ * Returns: number of bytes actually copied
+ *
+ * Since: 0.10.22
+ */
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+
+gint
+gst_netaddress_set_address_bytes (GstNetAddress * naddr, GstNetType type,
+    guint8 address[16], guint16 port)
+{
+  gint len = 0;
+
+  g_return_val_if_fail (naddr != NULL, 0);
+
+  naddr->type = type;
+  switch (naddr->type) {
+    case GST_NET_TYPE_UNKNOWN:
+    case GST_NET_TYPE_IP6:
+      len = 16;
+      memcpy (naddr->address.ip6, address, 16);
+      break;
+    case GST_NET_TYPE_IP4:
+      len = 4;
+      memcpy ((guint8 *) & (naddr->address.ip4), address, 4);
+      break;
+  }
+
+  if (port)
+    naddr->port = port;
+
+  return len;
+}
+
+/**
  * gst_netaddress_equal:
  * @naddr1: The first #GstNetAddress
  * @naddr2: The second #GstNetAddress
@@ -309,3 +425,68 @@
   }
   return TRUE;
 }
+
+/**
+ * gst_netaddress_to_string:
+ * @naddr: a #GstNetAddress
+ * @dest: destination
+ * @len: len of @dest
+ *
+ * Copies a string representation of @naddr into @dest. Up to @len bytes are
+ * copied.
+ *
+ * Returns: the number of bytes which would be produced if the buffer was large
+ * enough
+ *
+ * Since: 0.10.24
+ */
+ 
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+
+gint
+gst_netaddress_to_string (const GstNetAddress * naddr, gchar * dest, gulong len)
+{
+  gint result;
+
+  g_return_val_if_fail (naddr != NULL, FALSE);
+  g_return_val_if_fail (dest != NULL, FALSE);
+
+  switch (naddr->type) {
+    case GST_NET_TYPE_IP4:
+    {
+      guint32 address;
+      guint16 port;
+
+      gst_netaddress_get_ip4_address (naddr, &address, &port);
+      address = g_ntohl (address);
+
+      result = g_snprintf (dest, len, "%d.%d.%d.%d:%d", (address >> 24) & 0xff,
+          (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff,
+          g_ntohs (port));
+      break;
+    }
+    case GST_NET_TYPE_IP6:
+    {
+      guint8 address[16];
+      guint16 port;
+
+      gst_netaddress_get_ip6_address (naddr, address, &port);
+
+      result =
+          g_snprintf (dest, len, "[%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]:%d",
+          (address[0] << 8) | address[1], (address[2] << 8) | address[3],
+          (address[4] << 8) | address[5], (address[6] << 8) | address[7],
+          (address[8] << 8) | address[9], (address[10] << 8) | address[11],
+          (address[12] << 8) | address[13], (address[14] << 8) | address[15],
+          g_ntohs (port));
+      break;
+    }
+    default:
+      dest[0] = 0;
+      result = 0;
+      break;
+  }
+  return result;
+}