aboutsummaryrefslogtreecommitdiff
path: root/lib/win32/libmms_win32/src/uri.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/win32/libmms_win32/src/uri.c')
-rw-r--r--lib/win32/libmms_win32/src/uri.c904
1 files changed, 0 insertions, 904 deletions
diff --git a/lib/win32/libmms_win32/src/uri.c b/lib/win32/libmms_win32/src/uri.c
deleted file mode 100644
index 36710a5252..0000000000
--- a/lib/win32/libmms_win32/src/uri.c
+++ /dev/null
@@ -1,904 +0,0 @@
-/* GNet - Networking library
- * Copyright (C) 2000-2003 David Helder, David Bolcsfoldi, Eric Williams
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/* FIXME: #include "gnet-private.h" */
-#include <glib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#include "uri.h"
-#include <string.h>
-
-static void field_unescape (char *str);
-static char* field_escape (char* str, unsigned char mask);
-
-#define USERINFO_ESCAPE_MASK 0x01
-#define PATH_ESCAPE_MASK 0x02
-#define QUERY_ESCAPE_MASK 0x04
-#define FRAGMENT_ESCAPE_MASK 0x08
-
-/* #define FALSE 0 */
-/* #define TRUE (!FALSE) */
-
-static unsigned char neednt_escape_table[] =
-{
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x0c,
- 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x0f,
- 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-
-/*
-Perl code to generate above table:
-
-#!/usr/bin/perl
-
-$ok = "abcdefghijklmnopqrstuvwxyz" .
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .
- "0123456789" .
- "-_.!~*'()";
-$userinfo_ok = ';:&=+\$,';
-$path_ok = ':\@&=+\$,;/';
-$query_ok = ';/?:\@&=+\$,';
-$fragment_ok = ';/?:\@&=+\$,';
-
-for ($i = 0; $i < 32; $i++)
-{
- print " ";
- for ($j = 0; $j < 8; $j++)
- {
- $num = 0;
- $letter = chr(($i * 8) + $j);
-
- $num |= 0b0001 if (index($userinfo_ok, $letter) != -1);
- $num |= 0b0010 if (index($path_ok, $letter) != -1);
- $num |= 0b0100 if (index($query_ok, $letter) != -1);
- $num |= 0b1000 if (index($fragment_ok, $letter) != -1);
- $num |= 0b1111 if (index($ok, $letter) != -1);
-
- printf "0x%02x, ", $num;
- }
- print "\n";
-}
-*/
-
-
-/* our own ISSPACE. ANSI isspace is local dependent */
-#define ISSPACE(C) (((C) >= 9 && (C) <= 13) || (C) == ' ')
-
-
-static int split_user_passwd(const char* in, char** user, char** passwd)
-{
- char *tmp = strdup(in);
-
- if(!tmp)
- return 0;
- *passwd = strchr(tmp, ':');
- if(!(*passwd))
- {
- free(tmp);
- return 0;
- }
- *((*passwd)++) = '\0'; // don't you love C? :)
-
- *user = strdup(tmp);
- if(!*user)
- return 0;
- *passwd = strdup(*passwd);
- if(!*passwd)
- return 0;
-
- free(tmp);
- return 1;
-}
-
-/**
- * gnet_uri_new
- * @uri: URI string
- *
- * Creates a #GURI from a string. Empty fields are set to NULL. The
- * parser does not validate the URI -- it will accept some malformed
- * URI. URIs are usually in the form
- * scheme://userinfo@hostname:port/path?query#fragment
- *
- * URIs created from user input are typically unescaped. URIs
- * created from machine input (e.g. received over the internet) are
- * typically escaped.
- *
- * Returns: a new #GURI, or NULL if there was a failure.
- *
- **/
-GURI*
-gnet_uri_new (const char* uri)
-{
- GURI* guri = NULL;
- const char* p;
- const char* temp;
-
- g_return_val_if_fail (uri, NULL);
-
- /* Skip initial whitespace */
- p = uri;
- while (*p && ISSPACE((int)*p))
- ++p;
- if (!*p) /* Error if it's just a string of space */
- return NULL;
-
- guri = g_new0 (GURI, 1);
-
- /* Scheme */
- temp = p;
- while (*p && *p != ':' && *p != '/' && *p != '?' && *p != '#')
- ++p;
- if (*p == ':')
- {
- guri->scheme = g_strndup (temp, p - temp);
- ++p;
- }
- else /* This char is NUL, /, ?, or # */
- p = temp;
-
- /* Authority */
- if (*p == '/' && p[1] == '/')
- {
- char *userinfo;
- p += 2;
-
- /* Userinfo */
- temp = p;
- while (*p && *p != '@' && *p != '/' ) /* Look for @ or / */
- ++p;
- if (*p == '@') /* Found userinfo */
- {
- userinfo = g_strndup (temp, p - temp);
- if(!split_user_passwd(userinfo, &guri->user, &guri->passwd))
- {
- free(userinfo);
- goto error;
- }
- free(userinfo);
- ++p;
- }
- else
- p = temp;
-
- /* Hostname */
-
- /* Check for IPv6 canonical hostname in brackets */
- if (*p == '[')
- {
- p++; /* Skip [ */
- temp = p;
- while (*p && *p != ']') ++p;
- if ((p - temp) == 0)
- goto error;
- guri->hostname = g_strndup (temp, p - temp);
- if (*p)
- p++; /* Skip ] (if there) */
- }
- else
- {
- temp = p;
- while (*p && *p != '/' && *p != '?' && *p != '#' && *p != ':') ++p;
- if ((p - temp) == 0)
- goto error;
- guri->hostname = g_strndup (temp, p - temp);
- }
-
- /* Port */
- if (*p == ':')
- {
- for (++p; isdigit((int)*p); ++p)
- guri->port = guri->port * 10 + (*p - '0');
- }
-
- }
-
- /* Path (we are liberal and won't check if it starts with /) */
- temp = p;
- while (*p && *p != '?' && *p != '#')
- ++p;
- if (p != temp)
- guri->path = g_strndup(temp, p - temp);
-
- /* Query */
- if (*p == '?')
- {
- temp = p + 1;
- while (*p && *p != '#')
- ++p;
- guri->query = g_strndup (temp, p - temp);
- }
-
- /* Fragment */
- if (*p == '#')
- {
- ++p;
- guri->fragment = g_strdup (p);
- }
-
- return guri;
-
- error:
- gnet_uri_delete (guri);
- return NULL;
-}
-
-
-/**
- * gnet_uri_new_fields
- * @scheme: scheme
- * @hostname: host name
- * @port: port
- * @path: path
- *
- * Creates a #GURI from the fields. This function uses the most
- * common fields. Use gnet_uri_new_fields_all() to specify all
- * fields.
- *
- * Returns: a new #GURI.
- *
- **/
-GURI*
-gnet_uri_new_fields (const char* scheme, const char* hostname,
- const gint port, const char* path)
-{
- GURI* uri = NULL;
-
- uri = g_new0 (GURI, 1);
- if (scheme) uri->scheme = g_strdup (scheme);
- if (hostname) uri->hostname = g_strdup (hostname);
- uri->port = port;
- if (path) uri->path = g_strdup (path);
-
- return uri;
-}
-
-
-/**
- * gnet_uri_new_fields_all
- * @scheme: scheme
- * @userinfo: user info
- * @hostname: host name
- * @port: port
- * @path: path
- * @query: query
- * @fragment: fragment
- *
- * Creates a #GURI from all fields.
- *
- * Returns: a new #GURI.
- *
- **/
-GURI*
-gnet_uri_new_fields_all (const char* scheme, const char* user,
- const char* passwd, const char* hostname,
- const gint port, const char* path,
- const char* query, const char* fragment)
-{
- GURI* uri = NULL;
-
- uri = g_new0 (GURI, 1);
- if (scheme) uri->scheme = g_strdup (scheme);
- if (user) uri->user = g_strdup (user);
- if (passwd) uri->passwd = g_strdup (passwd);
- if (hostname) uri->hostname = g_strdup (hostname);
- uri->port = port;
- if (path) uri->path = g_strdup (path);
- if (query) uri->query = g_strdup (query);
- if (fragment) uri->fragment = g_strdup (fragment);
-
- return uri;
-}
-
-
-/**
- * gnet_uri_clone:
- * @uri: a #GURI
- *
- * Copies a #GURI.
- *
- * Returns: a copy of @uri.
- *
- **/
-GURI*
-gnet_uri_clone (const GURI* uri)
-{
- GURI* uri2;
-
- g_return_val_if_fail (uri, NULL);
-
- uri2 = g_new0 (GURI, 1);
- uri2->scheme = g_strdup (uri->scheme);
- uri2->user = g_strdup (uri->user);
- uri2->passwd = g_strdup (uri->passwd);
- uri2->hostname = g_strdup (uri->hostname);
- uri2->port = uri->port;
- uri2->path = g_strdup (uri->path);
- uri2->query = g_strdup (uri->query);
- uri2->fragment = g_strdup (uri->fragment);
-
- return uri2;
-}
-
-
-/**
- * gnet_uri_delete:
- * @uri: a #GURI
- *
- * Deletes a #GURI.
- *
- **/
-void
-gnet_uri_delete (GURI* uri)
-{
- if (uri)
- {
- g_free (uri->scheme);
- g_free (uri->user);
- g_free (uri->passwd);
- g_free (uri->hostname);
- g_free (uri->path);
- g_free (uri->query);
- g_free (uri->fragment);
- g_free (uri);
- }
-}
-
-
-
-
-#define SAFESTRCMP(A,B) (((A)&&(B))?(strcmp((A),(B))):((A)||(B)))
-
-/**
- * gnet_uri_equal
- * @p1: a #GURI
- * @p2: another #GURI
- *
- * Compares two #GURI's for equality.
- *
- * Returns: TRUE if they are equal; FALSE otherwise.
- *
- **/
-int
-gnet_uri_equal (gconstpointer p1, gconstpointer p2)
-{
- const GURI* uri1 = (const GURI*) p1;
- const GURI* uri2 = (const GURI*) p2;
-
- g_return_val_if_fail (uri1, FALSE);
- g_return_val_if_fail (uri2, FALSE);
-
- if (uri1->port == uri2->port &&
- !SAFESTRCMP(uri1->scheme, uri2->scheme) &&
- !SAFESTRCMP(uri1->user, uri2->user) &&
- !SAFESTRCMP(uri1->passwd, uri2->passwd) &&
- !SAFESTRCMP(uri1->hostname, uri2->hostname) &&
- !SAFESTRCMP(uri1->path, uri2->path) &&
- !SAFESTRCMP(uri1->query, uri2->query) &&
- !SAFESTRCMP(uri1->fragment, uri2->fragment))
- return TRUE;
-
- return FALSE;
-}
-
-
-/**
- * gnet_uri_hash
- * @p: a #GURI
- *
- * Creates a hash code for @p for use with GHashTable.
- *
- * Returns: hash code for @p.
- *
- **/
-guint
-gnet_uri_hash (gconstpointer p)
-{
- const GURI* uri = (const GURI*) p;
- guint h = 0;
-
- g_return_val_if_fail (uri, 0);
-
- if (uri->scheme) h = g_str_hash (uri->scheme);
- if (uri->user) h ^= g_str_hash (uri->user);
- if (uri->passwd) h ^= g_str_hash (uri->passwd);
- if (uri->hostname) h ^= g_str_hash (uri->hostname);
- h ^= uri->port;
- if (uri->path) h ^= g_str_hash (uri->path);
- if (uri->query) h ^= g_str_hash (uri->query);
- if (uri->fragment) h ^= g_str_hash (uri->fragment);
-
- return h;
-}
-
-
-/**
- * gnet_uri_escape
- * @uri: a #GURI
- *
- * Escapes the fields in a #GURI. Network protocols use escaped
- * URIs. People use unescaped URIs.
- *
- **/
-void
-gnet_uri_escape (GURI* uri)
-{
- g_return_if_fail (uri);
-
- uri->user = field_escape (uri->user, USERINFO_ESCAPE_MASK);
- uri->passwd = field_escape (uri->passwd, USERINFO_ESCAPE_MASK);
- uri->path = field_escape (uri->path, PATH_ESCAPE_MASK);
- uri->query = field_escape (uri->query, QUERY_ESCAPE_MASK);
- uri->fragment = field_escape (uri->fragment, FRAGMENT_ESCAPE_MASK);
-}
-
-
-/**
- * gnet_uri_unescape
- * @uri: a #GURI
- *
- * Unescapes the fields in the URI. Network protocols use escaped
- * URIs. People use unescaped URIs.
- *
- **/
-void
-gnet_uri_unescape (GURI* uri)
-{
- g_return_if_fail (uri);
-
- if (uri->user)
- field_unescape (uri->user);
- if (uri->passwd)
- field_unescape (uri->passwd);
- if (uri->path)
- field_unescape (uri->path);
- if (uri->query)
- field_unescape (uri->query);
- if (uri->fragment)
- field_unescape (uri->fragment);
-}
-
-
-static char*
-field_escape (char* str, unsigned char mask)
-{
- gint len;
- gint i;
- int must_escape = FALSE;
- char* dst;
- gint j;
-
- if (str == NULL)
- return NULL;
-
- /* Roughly calculate buffer size */
- len = 0;
- for (i = 0; str[i]; i++)
- {
- if (neednt_escape_table[(guint) str[i]] & mask)
- len++;
- else
- {
- len += 3;
- must_escape = TRUE;
- }
- }
-
- /* Don't escape if unnecessary */
- if (must_escape == FALSE)
- return str;
-
- /* Allocate buffer */
- dst = (char*) g_malloc(len + 1);
-
- /* Copy */
- for (i = j = 0; str[i]; i++, j++)
- {
- /* Unescaped character */
- if (neednt_escape_table[(guint) str[i]] & mask)
- {
- dst[j] = str[i];
- }
-
- /* Escaped character */
- else
- {
- dst[j] = '%';
-
- if (((str[i] & 0xf0) >> 4) < 10)
- dst[j+1] = ((str[i] & 0xf0) >> 4) + '0';
- else
- dst[j+1] = ((str[i] & 0xf0) >> 4) + 'a' - 10;
-
- if ((str[i] & 0x0f) < 10)
- dst[j+2] = (str[i] & 0x0f) + '0';
- else
- dst[j+2] = (str[i] & 0x0f) + 'a' - 10;
-
- j += 2; /* and j is incremented in loop too */
- }
- }
- dst[j] = '\0';
-
- g_free (str);
- return dst;
-}
-
-
-
-static void
-field_unescape (char* s)
-{
- char* src;
- char* dst;
-
- for (src = dst = s; *src; ++src, ++dst)
- {
- if (src[0] == '%' && src[1] != '\0' && src[2] != '\0')
- {
- gint high, low;
-
- if ('a' <= src[1] && src[1] <= 'f')
- high = src[1] - 'a' + 10;
- else if ('A' <= src[1] && src[1] <= 'F')
- high = src[1] - 'A' + 10;
- else if ('0' <= src[1] && src[1] <= '9')
- high = src[1] - '0';
- else /* malformed */
- goto regular_copy;
-
- if ('a' <= src[2] && src[2] <= 'f')
- low = src[2] - 'a' + 10;
- else if ('A' <= src[2] && src[2] <= 'F')
- low = src[2] - 'A' + 10;
- else if ('0' <= src[2] && src[2] <= '9')
- low = src[2] - '0';
- else /* malformed */
- goto regular_copy;
-
- *dst = (char)((high << 4) + low);
- src += 2;
- }
- else
- {
- regular_copy:
- *dst = *src;
- }
- }
-
- *dst = '\0';
-}
-
-
-
-/**
- * gnet_uri_get_string
- * @uri: a #GURI
- *
- * Gets a string representation of a #GURI. This function does not
- * escape or unescape the fields first. Call gnet_uri_escape() or
- * gnet_uri_unescape first if necessary.
- *
- * Returns: a string.
- *
- **/
-char*
-gnet_uri_get_string (const GURI* uri)
-{
- char* rv = NULL;
- GString* buffer = NULL;
-
- g_return_val_if_fail (uri, NULL);
-
- buffer = g_string_sized_new (16);
-
- if (uri->scheme)
- g_string_sprintfa (buffer, "%s:", uri->scheme);
-
- if (uri->user || uri->passwd || uri->hostname || uri->port)
- g_string_append (buffer, "//");
-
- if (uri->user)
- {
- buffer = g_string_append (buffer, uri->user);
- buffer = g_string_append_c (buffer, '@');
- }
- if (uri->passwd)
- {
- buffer = g_string_append (buffer, uri->passwd);
- buffer = g_string_append_c (buffer, '@');
- }
-
- /* Add brackets around the hostname if it's IPv6 */
- if (uri->hostname)
- {
- if (strchr(uri->hostname, ':') == NULL)
- buffer = g_string_append (buffer, uri->hostname);
- else
- g_string_sprintfa (buffer, "[%s]", uri->hostname);
- }
-
- if (uri->port)
- g_string_sprintfa (buffer, ":%d", uri->port);
-
- if (uri->path)
- {
- if (*uri->path == '/' ||
- !(uri->user || uri->passwd || uri->hostname || uri->port))
- g_string_append (buffer, uri->path);
- else
- g_string_sprintfa (buffer, "/%s", uri->path);
- }
-
- if (uri->query)
- g_string_sprintfa (buffer, "?%s", uri->query);
-
- if (uri->fragment)
- g_string_sprintfa (buffer, "#%s", uri->fragment);
-
- /* Free only GString not data contained, return the data instead */
- rv = buffer->str;
- g_string_free (buffer, FALSE);
- return rv;
-}
-
-
-/**
- * gnet_uri_set_scheme
- * @uri: a #GURI
- * @scheme: scheme
- *
- * Sets a #GURI's scheme.
- *
- **/
-void
-gnet_uri_set_scheme (GURI* uri, const char* scheme)
-{
- g_return_if_fail (uri);
-
- if (uri->scheme)
- {
- g_free (uri->scheme);
- uri->scheme = NULL;
- }
-
- if (scheme)
- uri->scheme = g_strdup (scheme);
-}
-
-
-/**
- * gnet_uri_set_userinfo
- * @uri: a #GURI
- * @userinfo: user info
- *
- * Sets a #GURI's user info.
- *
- **/
-void
-gnet_uri_set_userinfo (GURI* uri, const char* user, const char* passwd)
-{
- g_return_if_fail (uri);
-
- if (uri->user)
- {
- g_free (uri->user);
- uri->user = NULL;
- }
- if (uri->passwd)
- {
- g_free (uri->passwd);
- uri->passwd = NULL;
- }
-
- if (user)
- uri->user = g_strdup (user);
- if (passwd)
- uri->passwd = g_strdup (passwd);
-}
-
-
-/**
- * gnet_uri_set_hostname
- * @uri: a #GURI
- * @hostname: host name
- *
- * Sets a #GURI's host name.
- *
- **/
-void
-gnet_uri_set_hostname (GURI* uri, const char* hostname)
-{
- g_return_if_fail (uri);
-
- if (uri->hostname)
- {
- g_free (uri->hostname);
- uri->hostname = NULL;
- }
-
- if (hostname)
- uri->hostname = g_strdup (hostname);
-}
-
-
-/**
- * gnet_uri_set_port
- * @uri: a #GURI
- * @port: port
- *
- * Set a #GURI's port.
- *
- **/
-void
-gnet_uri_set_port (GURI* uri, gint port)
-{
- uri->port = port;
-}
-
-
-/**
- * gnet_uri_set_path
- * @uri: a #GURI
- * @path: path
- *
- * Set a #GURI's path.
- *
- **/
-void
-gnet_uri_set_path (GURI* uri, const char* path)
-{
- g_return_if_fail (uri);
-
- if (uri->path)
- {
- g_free (uri->path);
- uri->path = NULL;
- }
-
- if (path)
- uri->path = g_strdup (path);
-}
-
-
-
-/**
- * gnet_uri_set_query
- * @uri: a #GURI
- * @query: query
- *
- * Set a #GURI's query.
- *
- **/
-void
-gnet_uri_set_query (GURI* uri, const char* query)
-{
- g_return_if_fail (uri);
-
- if (uri->query)
- {
- g_free (uri->query);
- uri->query = NULL;
- }
-
- if (query)
- uri->query = g_strdup (query);
-}
-
-
-/**
- * gnet_uri_set_fragment
- * @uri: a #GURI
- * @fragment: fragment
- *
- * Set a #GURI's fragment.
- *
- **/
-void
-gnet_uri_set_fragment (GURI* uri, const char* fragment)
-{
- g_return_if_fail (uri);
-
- if (uri->fragment)
- {
- g_free (uri->fragment);
- uri->fragment = NULL;
- }
-
- if (fragment)
- uri->fragment = g_strdup (fragment);
-}
-
-
-/**
- * gnet_mms_helper
- * @uri: a #GURI
- *
- * returns char* representation of an uri that is sutable for
- * using in mms protocol.
- * '/path?query'
- *
- **/
-
-char* gnet_mms_helper(const GURI* uri)
-{
- size_t len = 0;
- char *ret, *tmp = NULL;
-
-
- /* Strip leading slashes and calculate the length of the path
- * which might not be present in the URI */
- if (uri->path) {
- tmp = uri->path;
- while (*tmp == '/')
- ++tmp;
- len += strlen(tmp);
- }
- /* Append length of the query part */
- if (uri->query)
- len += strlen(uri->query) + 1; /* + '?' */
-
- if (!(ret = (char *) malloc(len + 2)))
- return NULL;
-
- strcpy(ret, "/");
-
- /* Copy the optional path */
- if (tmp)
- strcat(ret, tmp);
-
- /* Copy the optional query */
- if (uri->query) {
- strcat(ret, "?");
- strcat(ret, uri->query);
- }
-
- return ret;
-}