diff libpurple/plugins/perl/common/Util.xs @ 23655:af603a54ae5a

Some Perl bindings fixes and additions from Zsombor Welker. Technically some of these change the API, but in those couple cases, the way it is now is either broken, not usable or pretty unlikely to be used. Feel free to yell at me and/or revert this if you think this is unacceptable. Fixes #5912
author Daniel Atallah <daniel.atallah@gmail.com>
date Thu, 07 Aug 2008 02:48:21 +0000
parents 3a41eb457605
children 907f5f41e32a
line wrap: on
line diff
--- a/libpurple/plugins/perl/common/Util.xs	Thu Aug 07 01:46:36 2008 +0000
+++ b/libpurple/plugins/perl/common/Util.xs	Thu Aug 07 02:48:21 2008 +0000
@@ -26,9 +26,24 @@
 	LEAVE;
 }
 
+static void markup_find_tag_foreach(GQuark key_id, char *data, HV *hv) {
+	const char *key = NULL;
+	key = g_quark_to_string(key_id);
+	hv_store(hv, key, strlen(key), newSVpv(data, 0), 0);
+}
+
 MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_
 PROTOTYPES: ENABLE
 
+gboolean
+purple_running_gnome()
+
+gboolean
+purple_running_kde()
+
+gboolean
+purple_running_osx()
+
 int
 purple_build_dir(path, mode)
 	const char *path
@@ -49,15 +64,30 @@
 const gchar *
 purple_home_dir()
 
-gboolean
-purple_message_meify(message, len)
-	char *message
-	size_t len
+gchar_own*
+purple_message_meify(SV *msg)
+	PREINIT:
+		char *message = NULL;
+		gboolean ret;
+		gssize len;
+	CODE:
+		message = SvPV(msg, len);
+		message = g_strndup(message, len);
+		ret = purple_message_meify(message, len);
+		if(ret) {
+			/* message will get g_free()'d later on, since RETVAL is gchar_own* */
+			RETVAL = message;
+		} else {
+			RETVAL = NULL;
+			g_free(message);
+		}
+	OUTPUT:
+		RETVAL
 
 FILE *
-purple_mkstemp(path, binary)
-	char **path
+purple_mkstemp(OUTLIST gchar_own *path, binary)
 	gboolean binary
+	PROTOTYPE: $
 
 const char *
 purple_normalize(account, str)
@@ -122,14 +152,36 @@
 purple_url_encode(str)
 	const char *str
 
-gboolean
-purple_url_parse(url, ret_host, ret_port, ret_path, ret_user, ret_passwd)
+ # XXX: this made perl assert()...
+ #
+ #gboolean
+ #purple_url_parse(url, OUTLIST gchar_own *ret_host, OUTLIST int ret_port, OUTLIST gchar_own *ret_path, OUTLIST gchar_own *ret_user, OUTLIST gchar_own *ret_passwd)
+ #	const char *url
+ #	PROTOTYPE: $
+
+void
+purple_url_parse(url)
 	const char *url
-	char **ret_host
-	int *ret_port
-	char **ret_path
-	char **ret_user
-	char **ret_passwd
+	PREINIT:
+		char *ret_host;
+		int ret_port;
+		char *ret_path;
+		char *ret_user;
+		char *ret_passwd;
+		gboolean ret;
+	PPCODE:
+		ret = purple_url_parse(url, &ret_host, &ret_port, &ret_path, &ret_user, &ret_passwd);
+		XPUSHs(sv_2mortal(newSViv(ret)));
+		XPUSHs(ret_host ? sv_2mortal(newSVpv(ret_host, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(sv_2mortal(newSViv(ret_port)));
+		XPUSHs(ret_path ? sv_2mortal(newSVpv(ret_path, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(ret_user ? sv_2mortal(newSVpv(ret_user, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(ret_passwd ? sv_2mortal(newSVpv(ret_passwd, 0)) : sv_2mortal(newSV(0)));
+		g_free(ret_host);
+		g_free(ret_path);
+		g_free(ret_user);
+		g_free(ret_passwd);
+
 
 const char *
 purple_user_dir()
@@ -137,6 +189,144 @@
 const char *
 purple_utf8_strftime(const char *format, const struct tm *tm);
 
+gboolean
+purple_utf8_has_word(haystack, needle)
+	const char* haystack
+	const char* needle
+
+gchar_own*
+purple_utf8_ncr_decode(in)
+	const char* in
+
+gchar_own*
+purple_utf8_ncr_encode(in)
+	const char* in
+
+gchar*
+purple_utf8_salvage(str)
+	const char* str
+
+int
+purple_utf8_strcasecmp(a, b)
+	const char* a
+	const char* b
+
+gchar_own*
+purple_utf8_try_convert(str)
+	const char* str
+
+gboolean
+purple_ip_address_is_valid(ip)
+	const char* ip
+
+const char*
+purple_normalize_nocase(account, str)
+	Purple::Account account
+	const char* str
+
+const gchar*
+purple_gai_strerror(errnum)
+	gint errnum
+
+void
+purple_got_protocol_handler_uri(uri)
+	const char* uri
+
+gchar_own*
+purple_base16_encode(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_base16_encode_chunked(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_base64_encode(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+void
+purple_restore_default_signal_handlers()
+
+SV *
+purple_base16_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_base16_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+SV*
+purple_base64_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_base64_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+SV*
+purple_quotedp_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_quotedp_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+void
+purple_uri_list_extract_uris(uri_list)
+	const gchar* uri_list
+	PREINIT:
+		GList *l = NULL, *gl = NULL;
+	PPCODE:
+		gl = purple_uri_list_extract_uris(uri_list);
+		for(l = gl; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+			g_free(l->data);
+		}
+		g_list_free(gl);
+
+void
+purple_uri_list_extract_filenames(uri_list)
+	const gchar* uri_list
+	PREINIT:
+		GList *l = NULL, *gl = NULL;
+	PPCODE:
+		gl = purple_uri_list_extract_filenames(uri_list);
+		for(l = gl; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+			g_free(l->data);
+		}
+		g_list_free(gl);
+
 MODULE = Purple::Util  PACKAGE = Purple::Util::Str  PREFIX = purple_str_
 PROTOTYPES: ENABLE
 
@@ -145,9 +335,8 @@
 	const char *str
 
 gchar_own *
-purple_str_binary_to_ascii(binary, len)
-	const unsigned char *binary
-	guint len
+purple_str_binary_to_ascii(const unsigned char *binary, guint length(binary))
+	PROTOTYPE: $
 
 gboolean
 purple_str_has_prefix(s, p)
@@ -173,12 +362,11 @@
 	char thechar
 
 time_t
-purple_str_to_time(timestamp, utc = FALSE, tm = NULL, tz_off = NULL, rest = NULL)
+purple_str_to_time(timestamp, utc = FALSE, tm = NULL, OUTLIST long tz_off, OUTLIST const char *rest)
 	const char *timestamp
 	gboolean utc
 	struct tm *tm
-	long *tz_off
-	const char **rest
+	PROTOTYPE: $;$$
 
 MODULE = Purple::Util  PACKAGE = Purple::Util::Date  PREFIX = purple_date_
 PROTOTYPES: ENABLE
@@ -213,23 +401,38 @@
 	const char *link_prefix
 	Purple::Util::InfoFieldFormatCallback format_cb
 
-gboolean
-purple_markup_find_tag(needle, haystack, start, end, attributes)
+ # XXX: returning start/end to perl doesn't make a lot of sense...
+ # XXX: the actual tag data can be gotten with $start =~ s/$end//g;
+void
+purple_markup_find_tag(needle, haystack)
 	const char *needle
 	const char *haystack
-	const char **start
-	const char **end
-	GData **attributes
+	PREINIT:
+		const char *start = NULL;
+		const char *end = NULL;
+		GData *attributes;
+		gboolean ret;
+		HV *hv = NULL;
+	PPCODE:
+		ret = purple_markup_find_tag(needle, haystack, &start, &end, &attributes);
+		if(!ret) XSRETURN_UNDEF;
+
+		hv = newHV();
+		g_datalist_foreach(&attributes, (GDataForeachFunc) markup_find_tag_foreach, hv);
+		g_datalist_clear(&attributes);
+
+		XPUSHs(sv_2mortal(newSVpv(start, 0)));
+		XPUSHs(sv_2mortal(newSVpv(end, 0)));
+		XPUSHs(sv_2mortal(newRV_noinc((SV *) hv)));
 
 gchar_own *
 purple_markup_get_tag_name(tag)
 	const char *tag
 
 void
-purple_markup_html_to_xhtml(html, dest_xhtml, dest_plain)
+purple_markup_html_to_xhtml(html, OUTLIST gchar_own *dest_xhtml, OUTLIST gchar_own *dest_plain)
 	const char *html
-	char **dest_xhtml
-	char **dest_plain
+	PROTOTYPE: $
 
 gchar_own *
 purple_markup_linkify(str)
@@ -245,9 +448,33 @@
 purple_markup_strip_html(str)
 	const char *str
 
+gchar_own *
+purple_markup_get_css_property(style, opt)
+	const gchar* style
+	const gchar* opt
+
+SV*
+purple_markup_unescape_entity(text)
+	const char* text
+	PREINIT:
+	int length;
+	CODE:
+		{
+			const char *str = purple_markup_unescape_entity(text, &length);
+			if(length) {
+				RETVAL = newSVpv(str, length);
+			} else {
+				XSRETURN_UNDEF;
+			}
+		}
+	OUTPUT:
+		RETVAL
+
+
 MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_util_
 PROTOTYPES: ENABLE
 
+ #XXX: expand...
 void
 purple_util_fetch_url(plugin, url, full, user_agent, http11, cb)
 	Purple::Plugin plugin
@@ -256,14 +483,19 @@
 	const char *user_agent
 	gboolean http11
 	SV * cb
-CODE:
+PREINIT:
+	PurpleUtilFetchUrlData *data;
+PPCODE:
+	/* XXX: i don't like this... only plugins can use it... */
 	SV *sv = purple_perl_sv_from_fun(plugin, cb);
 
 	if (sv != NULL) {
-		purple_util_fetch_url(url, full, user_agent, http11,
+		data = purple_util_fetch_url(url, full, user_agent, http11,
 		                      purple_perl_util_url_cb, sv);
+		XPUSHs(sv_2mortal(purple_perl_bless_object(data, "Purple::Util::FetchUrlData")));
 	} else {
 		purple_debug_warning("perl", "Callback not a valid type, only strings and coderefs allowed in purple_util_fetch_url.\n");
+		XSRETURN_UNDEF;
 	}
 
 void
@@ -271,7 +503,44 @@
 	const char *dir
 
 gboolean
-purple_util_write_data_to_file(filename, data, size)
+purple_util_write_data_to_file(filename, const char *data, size_t length(data))
 	const char *filename
-	const char *data
-	size_t size
+	PROTOTYPE: $$
+
+void
+purple_util_set_current_song(title, artist, album)
+	const char *title
+	const char *artist
+	const char *album
+
+void
+purple_util_chrreplace(string, delimiter, replacement)
+	char* string
+	char delimiter
+	char replacement
+
+gchar_own*
+purple_util_format_song_info(title, artist, album, unused)
+	const char* title
+	const char* artist
+	const char* album
+	gpointer unused
+
+const char*
+purple_util_get_image_extension(gconstpointer data, size_t length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_util_get_image_filename(gconstpointer image_data, size_t length(image_data))
+	PROTOTYPE: $
+
+Purple::XMLNode
+purple_util_read_xml_from_file(filename, description)
+	const char* filename
+	const char* description
+
+gboolean
+purple_util_write_data_to_file_absolute(filename_full, char *data, gssize length(data))
+	const char* filename_full
+	PROTOTYPE: $$
+