diff -r 4b0c6ed43234 -r 8e837d1bf446 gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c --- a/gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c Wed Mar 24 17:58:42 2010 -0500 +++ b/gst_plugins_base/gst-libs/gst/netbuffer/gstnetbuffer.c Wed Mar 24 18:04:17 2010 -0500 @@ -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; +}