+
+/* Helper implementations */
+
+static gchar url_encode_hex[16] = {
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+};
+
+static gchar* url_encode (const gchar* source)
+{
+ gchar* dest = 0;
+ gsize dest_len = 0;
+ const gchar* s;
+ gchar* d;
+
+ /* Count new string length */
+
+ for (s = source; *s; s++)
+ {
+ dest_len++;
+ if (!((*s >= '0' && *s <= '9') || (*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z')))
+ dest_len += 2;
+ }
+
+ /* Build encoded string */
+
+ dest = g_malloc (dest_len + 1);
+
+ for (s = source, d = dest; *s; s++)
+ {
+ if ((*s >= '0' && *s <= '9') || (*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
+ *d++ = *s;
+ else if (*s == ' ')
+ *d++ = '+';
+ else
+ {
+ *d++ = '%';
+ *d++ = url_encode_hex[(*s >> 4) & 0xf];
+ *d++ = url_encode_hex[*s & 0xf];
+ }
+ }
+
+ *d = 0;
+ return dest;
+}