libpurple/plugins/perl/perl-common.c

branch
soc.2013.gobjectification
changeset 34802
4ea5cddeefc4
parent 34800
00331d95b7d0
child 34805
aa65e5a9f2ef
--- a/libpurple/plugins/perl/perl-common.c	Wed Jul 17 04:11:53 2013 +0530
+++ b/libpurple/plugins/perl/perl-common.c	Wed Jul 17 04:20:08 2013 +0530
@@ -1,6 +1,8 @@
-#include "debug.h"
+#include "perl-common.h"
 
-#include "perl-common.h"
+#include "cipher.h"
+#include "debug.h"
+#include "savedstatuses.h"
 
 extern PerlInterpreter *my_perl;
 
@@ -378,102 +380,77 @@
 #endif
 
 void *
-purple_perl_data_from_sv(PurpleValue *value, SV *sv)
+purple_perl_data_from_sv(GType type, SV *sv)
 {
-
-	switch (purple_value_get_type(value)) {
-		case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv);
-		case PURPLE_TYPE_INT:     return (void *)SvIV(sv);
-		case PURPLE_TYPE_UINT:    return (void *)SvUV(sv);
-		case PURPLE_TYPE_LONG:    return (void *)SvIV(sv);
-		case PURPLE_TYPE_ULONG:   return (void *)SvUV(sv);
-		case PURPLE_TYPE_INT64:   return (void *)SvIV(sv);
-		case PURPLE_TYPE_UINT64:  return (void *)SvUV(sv);
-		case PURPLE_TYPE_STRING:  return g_strdup(SvPVutf8_nolen(sv));
-		case PURPLE_TYPE_POINTER: return (void *)SvIV(sv);
-		case PURPLE_TYPE_BOXED:   return (void *)SvIV(sv);
-
-		default:
-			return NULL;
+	switch (type) {
+		case G_TYPE_BOOLEAN: return (void *)SvIV(sv);
+		case G_TYPE_INT:     return (void *)SvIV(sv);
+		case G_TYPE_UINT:    return (void *)SvUV(sv);
+		case G_TYPE_LONG:    return (void *)SvIV(sv);
+		case G_TYPE_ULONG:   return (void *)SvUV(sv);
+		case G_TYPE_INT64:   return (void *)SvIV(sv);
+		case G_TYPE_UINT64:  return (void *)SvUV(sv);
+		case G_TYPE_STRING:  return g_strdup(SvPVutf8_nolen(sv));
+		case G_TYPE_POINTER: return (void *)SvIV(sv);
+		case G_TYPE_BOXED:   return (void *)SvIV(sv);
 	}
 
 	return NULL;
 }
 
 static SV *
-purple_perl_sv_from_subtype(const PurpleValue *value, void *arg)
+purple_perl_sv_from_purple_type(GType type, void *arg)
 {
 	const char *stash = "Purple"; /* ? */
 
-	switch (purple_value_get_subtype(value)) {
-		case PURPLE_SUBTYPE_ACCOUNT:
-			stash = "Purple::Account";
-			break;
-		case PURPLE_SUBTYPE_BLIST:
-			stash = "Purple::BuddyList";
-			break;
-		case PURPLE_SUBTYPE_BLIST_BUDDY:
-			stash = "Purple::BuddyList::Buddy";
-			break;
-		case PURPLE_SUBTYPE_BLIST_GROUP:
-			stash = "Purple::BuddyList::Group";
-			break;
-		case PURPLE_SUBTYPE_BLIST_CHAT:
-			stash = "Purple::BuddyList::Chat";
-			break;
-		case PURPLE_SUBTYPE_BUDDY_ICON:
-			stash = "Purple::Buddy::Icon";
-			break;
-		case PURPLE_SUBTYPE_CONNECTION:
-			stash = "Purple::Connection";
-			break;
-		case PURPLE_SUBTYPE_CONVERSATION:
-			stash = "Purple::Conversation";
-			break;
-		case PURPLE_SUBTYPE_PLUGIN:
-			stash = "Purple::Plugin";
-			break;
-		case PURPLE_SUBTYPE_BLIST_NODE:
-			stash = "Purple::BuddyList::Node";
-			break;
-		case PURPLE_SUBTYPE_CIPHER:
-			stash = "Purple::Cipher";
-			break;
-		case PURPLE_SUBTYPE_STATUS:
-			stash = "Purple::Status";
-			break;
-		case PURPLE_SUBTYPE_SAVEDSTATUS:
-			stash = "Purple::SavedStatus";
-			break;
-		case PURPLE_SUBTYPE_LOG:
-			stash = "Purple::Log";
-			break;
-		case PURPLE_SUBTYPE_XFER:
-			stash = "Purple::Xfer";
-			break;
-		case PURPLE_SUBTYPE_XMLNODE:
-			stash = "Purple::XMLNode";
-			break;
- 		case PURPLE_SUBTYPE_USERINFO:
- 			stash = "Purple::NotifyUserInfo";
- 			break;
- 		case PURPLE_SUBTYPE_STORED_IMAGE:
- 			stash = "Purple::StoredImage";
- 			break;
- 		case PURPLE_SUBTYPE_CERTIFICATEPOOL:
- 			stash = "Purple::Certificate::Pool";
- 			break;
- 		case PURPLE_SUBTYPE_UNKNOWN:
- 			stash = "Purple::Unknown";
- 			break;
-  	}
+	if (type == PURPLE_TYPE_ACCOUNT)
+		stash = "Purple::Account";
+	else if (type == PURPLE_TYPE_BUDDY_LIST)
+		stash = "Purple::BuddyList";
+	else if (type == PURPLE_TYPE_BUDDY)
+		stash = "Purple::BuddyList::Buddy";
+	else if (type == PURPLE_TYPE_GROUP)
+		stash = "Purple::BuddyList::Group";
+	else if (type == PURPLE_TYPE_CHAT)
+		stash = "Purple::BuddyList::Chat";
+	else if (type == PURPLE_TYPE_BUDDY_ICON)
+		stash = "Purple::Buddy::Icon";
+	else if (type == PURPLE_TYPE_CONNECTION)
+		stash = "Purple::Connection";
+	else if (type == PURPLE_TYPE_CONVERSATION)
+		stash = "Purple::Conversation";
+	else if (type == PURPLE_TYPE_PLUGIN)
+		stash = "Purple::Plugin";
+	else if (type == PURPLE_TYPE_BLIST_NODE)
+		stash = "Purple::BuddyList::Node";
+	else if (type == PURPLE_TYPE_CIPHER)
+		stash = "Purple::Cipher";
+	else if (type == PURPLE_TYPE_STATUS)
+		stash = "Purple::Status";
+	else if (type == PURPLE_TYPE_SAVEDSTATUS)
+		stash = "Purple::SavedStatus";
+	else if (type == PURPLE_TYPE_LOG)
+		stash = "Purple::Log";
+	else if (type == PURPLE_TYPE_XFER)
+		stash = "Purple::Xfer";
+	else if (type == PURPLE_TYPE_XMLNODE)
+		stash = "Purple::XMLNode";
+	else if (type == PURPLE_TYPE_NOTIFY_USER_INFO)
+ 		stash = "Purple::NotifyUserInfo";
+	else if (type == PURPLE_TYPE_STORED_IMAGE)
+ 		stash = "Purple::StoredImage";
+	else if (type == PURPLE_TYPE_CERTIFICATE_POOL)
+ 		stash = "Purple::Certificate::Pool";
+	else
+ 		stash = "Purple::Unknown";
 
 	return sv_2mortal(purple_perl_bless_object(arg, stash));
 }
 
 SV *
-purple_perl_sv_from_vargs(const PurpleValue *value, va_list *args, void ***copy_arg)
+purple_perl_sv_from_vargs(GType type, va_list *args, void ***copy_arg)
 {
+#if 0
 	if (purple_value_is_outgoing(value)) {
 		switch (purple_value_get_type(value)) {
 			case PURPLE_TYPE_SUBTYPE:
@@ -551,80 +528,60 @@
 				return NULL;
 		}
 	} else {
-		switch (purple_value_get_type(value)) {
-			case PURPLE_TYPE_SUBTYPE:
-				if ((*copy_arg = va_arg(*args, void *)) == NULL)
-					return &PL_sv_undef;
-
-				return purple_perl_sv_from_subtype(value, *copy_arg);
+#endif
+	switch (type) {
+		case G_TYPE_BOOLEAN:
+			*copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) );
 
-			case PURPLE_TYPE_BOOLEAN:
-				*copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) );
-
-				return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg));
+			return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg));
 
-			case PURPLE_TYPE_INT:
-				*copy_arg = GINT_TO_POINTER( va_arg(*args, int) );
+		case G_TYPE_INT:
+			*copy_arg = GINT_TO_POINTER( va_arg(*args, int) );
 
-				return newSViv(GPOINTER_TO_INT(*copy_arg));
+			return newSViv(GPOINTER_TO_INT(*copy_arg));
 
-			case PURPLE_TYPE_UINT:
-				*copy_arg = GUINT_TO_POINTER(va_arg(*args, unsigned int));
-
-				return newSVuv(GPOINTER_TO_UINT(*copy_arg));
+		case G_TYPE_UINT:
+			*copy_arg = GUINT_TO_POINTER(va_arg(*args, unsigned int));
 
-			case PURPLE_TYPE_LONG:
-				*copy_arg = (void *)va_arg(*args, long);
-
-				return newSViv((long)*copy_arg);
+			return newSVuv(GPOINTER_TO_UINT(*copy_arg));
 
-			case PURPLE_TYPE_ULONG:
-				*copy_arg = (void *)va_arg(*args, unsigned long);
+		case G_TYPE_LONG:
+			*copy_arg = (void *)va_arg(*args, long);
 
-				return newSVuv((unsigned long)*copy_arg);
+			return newSViv((long)*copy_arg);
 
-			case PURPLE_TYPE_INT64:
-#if 0
-				/* XXX This yells and complains. */
-				*copy_arg = va_arg(*args, gint64);
+		case G_TYPE_ULONG:
+			*copy_arg = (void *)va_arg(*args, unsigned long);
+
+			return newSVuv((unsigned long)*copy_arg);
 
-				return newSViv(*copy_arg);
-#endif
-				break;
+		case G_TYPE_INT64:
+			*copy_arg = (void *)va_arg(*args, gint64);
 
-			case PURPLE_TYPE_UINT64:
-				/* XXX This also yells and complains. */
-#if 0
-				*copy_arg = (void *)va_arg(*args, guint64);
+			return newSViv((gint64)*copy_arg);
 
-				return newSVuv(*copy_arg);
-#endif
-				break;
+		case G_TYPE_UINT64:
+			*copy_arg = (void *)va_arg(*args, guint64);
 
-			case PURPLE_TYPE_STRING:
-				if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL)
-					return &PL_sv_undef;
+			return newSVuv((guint64)*copy_arg);
 
-				return newSVGChar((char *)*copy_arg);
+		case G_TYPE_STRING:
+			if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL)
+				return &PL_sv_undef;
 
-			case PURPLE_TYPE_POINTER:
-				if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
-					return &PL_sv_undef;
+			return newSVGChar((char *)*copy_arg);
 
-				return newSViv((IV)*copy_arg);
+		case G_TYPE_POINTER:
+			if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
+				return &PL_sv_undef;
 
-			case PURPLE_TYPE_BOXED:
-				/* Uh.. I dunno. Try this? */
-				if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
-					return &PL_sv_undef;
+			return newSViv((IV)*copy_arg);
 
-				return sv_2mortal(purple_perl_bless_object(*copy_arg,
-						purple_value_get_specific_type(value)));
+		default:
+			if ((*copy_arg = va_arg(*args, void *)) == NULL)
+				return &PL_sv_undef;
 
-			default:
-				/* If this happens, things are going to get screwed up... */
-				return NULL;
-		}
+			return purple_perl_sv_from_purple_type(type, *copy_arg);
 	}
 
 	return NULL;

mercurial