changeset 16755:4cb9f5cc07ba

merge of 'c0c4c168411c9fbc5ccb9790a43e21a62f6dcd55' and 'e8735efa0f7ed48bdb06f7ca465f8efa06b81dde'
author Richard Laager <rlaager@wiktel.com>
date Tue, 01 May 2007 05:54:26 +0000
parents 3bd360f26a9e (current diff) ccce74d54edd (diff)
children 8f513f2b37d5
files
diffstat 26 files changed, 811 insertions(+), 263 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/plugins/perl/Makefile.am	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/Makefile.am	Tue May 01 05:54:26 2007 +0000
@@ -73,9 +73,9 @@
 	common/Util.xs \
 	common/XMLNode.xs \
 	common/module.h \
-	common/typemap \
-	common/fallback/const-c.inc \
-	common/fallback/const-xs.inc
+	common/typemap
+#	common/fallback/const-c.inc \
+#	common/fallback/const-xs.inc
 
 EXTRA_DIST = \
 	Makefile.mingw \
@@ -139,7 +139,7 @@
 	done
 
 	@rm -f Makefile
-	@rm -f common/const-c.inc common/const-xs.inc
+#	@rm -f common/const-c.inc common/const-xs.inc
 
 	@if test "x${top_srcdir}" != "x${top_builddir}"; then \
 		for f in ${common_sources}; do \
--- a/libpurple/plugins/perl/common/BuddyList.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/BuddyList.xs	Tue May 01 05:54:26 2007 +0000
@@ -4,6 +4,26 @@
 MODULE = Purple::BuddyList  PACKAGE = Purple  PREFIX = purple_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::BuddyList::Node", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_BLIST_##name##_NODE}
+		const_iv(GROUP),
+		const_iv(CONTACT),
+		const_iv(BUDDY),
+		const_iv(CHAT),
+		const_iv(OTHER),
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_BLIST_NODE_FLAG_##name}
+		const_iv(NO_SAVE),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 Purple::BuddyList
 purple_get_blist()
 
@@ -30,15 +50,18 @@
 		XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::BuddyList::Buddy")));
 	}
 
+Purple::BuddyList::Group
+purple_find_group(name)
+	const char *name
+
+MODULE = Purple::BuddyList  PACKAGE = Purple::Find  PREFIX = purple_
+PROTOTYPES: ENABLE
+
 gboolean
 purple_group_on_account(group, account)
 	Purple::BuddyList::Group  group
 	Purple::Account account
 
-Purple::BuddyList::Group
-purple_find_group(name)
-	const char *name
-
 MODULE = Purple::BuddyList  PACKAGE = Purple::BuddyList::Contact  PREFIX = purple_contact_
 PROTOTYPES: ENABLE
 
--- a/libpurple/plugins/perl/common/Cmds.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Cmds.xs	Tue May 01 05:54:26 2007 +0000
@@ -4,6 +4,63 @@
 MODULE = Purple::Cmd  PACKAGE = Purple::Cmd  PREFIX = purple_cmd_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *status_stash = gv_stashpv("Purple::Cmd::Status", 1);
+	HV *ret_stash = gv_stashpv("Purple::Cmd::Return", 1);
+	HV *p_stash = gv_stashpv("Purple::Cmd::Priority", 1);
+	HV *flag_stash = gv_stashpv("Purple::Cmd::Flag", 1);
+
+	static const constiv *civ, status_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CMD_STATUS_##name}
+		const_iv(OK),
+		const_iv(FAILED),
+		const_iv(NOT_FOUND),
+		const_iv(WRONG_ARGS),
+		const_iv(WRONG_PRPL),
+		const_iv(WRONG_TYPE),
+	};
+	static const constiv ret_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_CMD_RET_##name}
+		const_iv(OK),
+		const_iv(FAILED),
+		const_iv(CONTINUE),
+	};
+	static const constiv p_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_CMD_P_##name}
+		const_iv(VERY_LOW),
+		const_iv(LOW),
+		const_iv(DEFAULT),
+		const_iv(PRPL),
+		const_iv(PLUGIN),
+		const_iv(ALIAS),
+		const_iv(HIGH),
+		const_iv(VERY_HIGH),
+	};
+	static const constiv flag_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_CMD_FLAG_##name}
+		const_iv(IM),
+		const_iv(CHAT),
+		const_iv(PRPL_ONLY),
+		const_iv(ALLOW_WRONG_ARGS),
+	};
+
+	for (civ = status_const_iv + sizeof(status_const_iv) / sizeof(status_const_iv[0]); civ-- > status_const_iv;)
+		newCONSTSUB(status_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = ret_const_iv + sizeof(ret_const_iv) / sizeof(ret_const_iv[0]); civ-- > ret_const_iv;)
+		newCONSTSUB(ret_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = p_const_iv + sizeof(p_const_iv) / sizeof(p_const_iv[0]); civ-- > p_const_iv;)
+		newCONSTSUB(p_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = flag_const_iv + sizeof(flag_const_iv) / sizeof(flag_const_iv[0]); civ-- > flag_const_iv;)
+		newCONSTSUB(flag_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_cmd_help(conv, command)
 	Purple::Conversation conv
--- a/libpurple/plugins/perl/common/Connection.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Connection.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,21 @@
 MODULE = Purple::Connection  PACKAGE = Purple::Connection  PREFIX = purple_connection_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Connection::State", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_##name}
+		const_iv(DISCONNECTED),
+		const_iv(CONNECTED),
+		const_iv(CONNECTING),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 Purple::Account
 purple_connection_get_account(gc)
 	Purple::Connection gc
--- a/libpurple/plugins/perl/common/Conversation.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Conversation.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,93 @@
 MODULE = Purple::Conversation  PACKAGE = Purple  PREFIX = purple_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *type_stash = gv_stashpv("Purple::Conversation::Type", 1);
+	HV *update_stash = gv_stashpv("Purple::Conversation::Update::Type", 1);
+	HV *typing_stash = gv_stashpv("Purple::Conversation::TypingState", 1);
+	HV *flags_stash = gv_stashpv("Purple::Conversation::Flags", 1);
+	HV *cbflags_stash = gv_stashpv("Purple::Conversation::ChatBuddy::Flags", 1);
+
+	static const constiv *civ, type_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CONV_TYPE_##name}
+		const_iv(UNKNOWN),
+		const_iv(IM),
+		const_iv(CHAT),
+		const_iv(MISC),
+		const_iv(ANY),
+	};
+	static const constiv update_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_CONV_UPDATE_##name}
+		const_iv(ADD),
+		const_iv(REMOVE),
+		const_iv(ACCOUNT),
+		const_iv(TYPING),
+		const_iv(UNSEEN),
+		const_iv(LOGGING),
+		const_iv(TOPIC),
+/*
+		const_iv(ONLINE),
+		const_iv(OFFLINE),
+*/
+		const_iv(AWAY),
+		const_iv(ICON),
+		const_iv(TITLE),
+		const_iv(CHATLEFT),
+		const_iv(FEATURES),
+	};
+	static const constiv typing_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_##name}
+		const_iv(NOT_TYPING),
+		const_iv(TYPING),
+		const_iv(TYPED),
+	};
+	static const constiv flags_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_MESSAGE_##name}
+		const_iv(SEND),
+		const_iv(RECV),
+		const_iv(SYSTEM),
+		const_iv(AUTO_RESP),
+		const_iv(ACTIVE_ONLY),
+		const_iv(NICK),
+		const_iv(NO_LOG),
+		const_iv(WHISPER),
+		const_iv(ERROR),
+		const_iv(DELAYED),
+		const_iv(RAW),
+		const_iv(IMAGES),
+		const_iv(NOTIFY),
+	};
+	static const constiv cbflags_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_CBFLAGS_##name}
+		const_iv(NONE),
+		const_iv(VOICE),
+		const_iv(HALFOP),
+		const_iv(OP),
+		const_iv(FOUNDER),
+		const_iv(TYPING),
+	};
+
+	for (civ = type_const_iv + sizeof(type_const_iv) / sizeof(type_const_iv[0]); civ-- > type_const_iv; )
+		newCONSTSUB(type_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = update_const_iv + sizeof(update_const_iv) / sizeof(update_const_iv[0]); civ-- > update_const_iv; )
+		newCONSTSUB(update_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = typing_const_iv + sizeof(typing_const_iv) / sizeof(typing_const_iv[0]); civ-- > typing_const_iv; )
+		newCONSTSUB(typing_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = flags_const_iv + sizeof(flags_const_iv) / sizeof(flags_const_iv[0]); civ-- > flags_const_iv; )
+		newCONSTSUB(flags_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = cbflags_const_iv + sizeof(cbflags_const_iv) / sizeof(cbflags_const_iv[0]); civ-- > cbflags_const_iv; )
+		newCONSTSUB(cbflags_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_get_ims()
 PREINIT:
--- a/libpurple/plugins/perl/common/Debug.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Debug.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,24 @@
 MODULE = Purple::Debug  PACKAGE = Purple::Debug  PREFIX = purple_debug_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Debug", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_DEBUG_##name}
+		const_iv(ALL),
+		const_iv(MISC),
+		const_iv(INFO),
+		const_iv(WARNING),
+		const_iv(ERROR),
+		const_iv(FATAL),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_debug(level, category, string)
 	Purple::DebugLevel level
--- a/libpurple/plugins/perl/common/FT.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/FT.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,36 @@
 MODULE = Purple::Xfer  PACKAGE = Purple::Xfer  PREFIX = purple_xfer_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *type_stash = gv_stashpv("Purple::Xfer::Type", 1);
+	HV *status_stash = gv_stashpv("Purple::Xfer::Status", 1);
+
+	static const constiv *civ, type_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_XFER_##name}
+		const_iv(UNKNOWN),
+		const_iv(SEND),
+		const_iv(RECEIVE),
+	};
+	static const constiv status_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_XFER_STATUS_##name}
+		const_iv(UNKNOWN),
+		const_iv(NOT_STARTED),
+		const_iv(ACCEPTED),
+		const_iv(STARTED),
+		const_iv(DONE),
+		const_iv(CANCEL_LOCAL),
+		const_iv(CANCEL_REMOTE),
+	};
+
+	for (civ = type_const_iv + sizeof(type_const_iv) / sizeof(type_const_iv[0]); civ-- > type_const_iv; )
+		newCONSTSUB(type_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = status_const_iv + sizeof(status_const_iv) / sizeof(status_const_iv[0]); civ-- > status_const_iv; )
+		newCONSTSUB(status_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 Purple::Xfer
 purple_xfer_new(class, account, type, who)
 	Purple::Account account
--- a/libpurple/plugins/perl/common/Log.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Log.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,30 @@
 MODULE = Purple::Log  PACKAGE = Purple::Log  PREFIX = purple_log_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *type_stash = gv_stashpv("Purple::Log::Type", 1);
+	HV *flags_stash = gv_stashpv("Purple::Log:ReadFlags::", 1);
+
+	static const constiv *civ, type_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_LOG_##name}
+		const_iv(IM),
+		const_iv(CHAT),
+		const_iv(SYSTEM),
+	};
+	static const constiv flags_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_LOG_READ_##name}
+		const_iv(NO_NEWLINE),
+	};
+
+	for (civ = type_const_iv + sizeof(type_const_iv) / sizeof(type_const_iv[0]); civ-- > type_const_iv; )
+		newCONSTSUB(type_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = flags_const_iv + sizeof(flags_const_iv) / sizeof(flags_const_iv[0]); civ-- > flags_const_iv; )
+		newCONSTSUB(flags_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 int
 purple_log_common_sizer(log)
 	Purple::Log log
--- a/libpurple/plugins/perl/common/Makefile.PL.in	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Makefile.PL.in	Tue May 01 05:54:26 2007 +0000
@@ -14,26 +14,3 @@
     'OBJECT'            => '$(O_FILES)', # link all the C files too
 #    'OPTIMIZE'          => '-g', # For debugging
 );
-
-if (eval {require ExtUtils::Constant; 1}) {
-	foreach (qw(PURPLE_DEBUG_ALL PURPLE_DEBUG_MISC PURPLE_DEBUG_INFO
-	            PURPLE_DEBUG_WARNING PURPLE_DEBUG_ERROR PURPLE_DEBUG_FATAL)) {
-		push @names, {name => $_, type => "IV", macro => 1};
-	}
-
-	ExtUtils::Constant::WriteConstants(
-		NAME    => 'Purple::DebugLevel',
-		NAMES   => \@names,
-		C_FILE  => 'const-c.inc',
-		XS_FILE => 'const-xs.inc'
-	);
-}
-else {
-	use File::Copy;
-	use File::Spec;
-
-	foreach my $file ('const-c.inc', 'const-xs.inc') {
-		my $fallback = File::Spec->catfile('fallback', $file);
-		copy ($fallback, $file) or die "Can't copy $fallback to $file: $!";
-	}
-}
--- a/libpurple/plugins/perl/common/Makefile.mingw	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Makefile.mingw	Tue May 01 05:54:26 2007 +0000
@@ -68,7 +68,7 @@
 				Util.xs \
 				XMLNode.xs
 
-FALLBACKS =	const-c.inc const-xs.inc
+#FALLBACKS =	const-c.inc const-xs.inc
 C_FILES = $(XS_FILES:%.xs=%.c)
 OBJECTS = $(C_FILES:%.c=%.o)
 
--- a/libpurple/plugins/perl/common/Notify.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Notify.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,47 @@
 MODULE = Purple::Notify  PACKAGE = Purple::Notify  PREFIX = purple_notify_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *type_stash = gv_stashpv("Purple::Notify::Type", 1);
+	HV *msg_type_stash = gv_stashpv("Purple::Notify:Msg", 1);
+	HV *user_info_stash = gv_stashpv("Purple::NotifyUserInfo::Type", 1);
+
+	static const constiv *civ, type_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_NOTIFY_##name}
+		const_iv(MESSAGE),
+		const_iv(EMAIL),
+		const_iv(EMAILS),
+		const_iv(FORMATTED),
+		const_iv(SEARCHRESULTS),
+		const_iv(USERINFO),
+		const_iv(URI),
+	};
+	static const constiv msg_type_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_NOTIFY_MSG_##name}
+		const_iv(ERROR),
+		const_iv(WARNING),
+		const_iv(INFO),
+	};
+	static const constiv user_info_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_NOTIFY_USER_INFO_ENTRY_##name}
+		const_iv(PAIR),
+		const_iv(SECTION_BREAK),
+		const_iv(SECTION_HEADER),
+	};
+
+	for (civ = type_const_iv + sizeof(type_const_iv) / sizeof(type_const_iv[0]); civ-- > type_const_iv; )
+		newCONSTSUB(type_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = msg_type_const_iv + sizeof(msg_type_const_iv) / sizeof(msg_type_const_iv[0]); civ-- > msg_type_const_iv; )
+		newCONSTSUB(msg_type_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = user_info_const_iv + sizeof(user_info_const_iv) / sizeof(user_info_const_iv[0]); civ-- > user_info_const_iv; )
+		newCONSTSUB(user_info_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_notify_close(type, ui_handle)
 	Purple::NotifyType type
@@ -52,8 +93,44 @@
 	Purple::NotifyCloseCallback cb
 	gpointer user_data
 
+Purple::NotifyUiOps
+purple_notify_get_ui_ops()
+
+void
+purple_notify_set_ui_ops(ops)
+	Purple::NotifyUiOps ops
+
+void *
+purple_notify_message(handle, type, title, primary, secondary, cb, user_data)
+	void * handle
+	Purple::NotifyMsgType type
+	const char *title
+	const char *primary
+	const char *secondary
+	Purple::NotifyCloseCallback cb
+	gpointer user_data
+
+void *
+purple_notify_searchresults(gc, title, primary, secondary, results, cb, user_data)
+	Purple::Connection gc
+	const char *title
+	const char *primary
+	const char *secondary
+	Purple::NotifySearchResults results
+	Purple::NotifyCloseCallback cb
+	gpointer user_data
+
+void *
+purple_notify_uri(handle, uri)
+	void * handle
+	const char *uri
+
+MODULE = Purple::Notify  PACKAGE = Purple::NotifyUserInfo  PREFIX = purple_notify_user_info_
+PROTOTYPES: ENABLE
+
 Purple::NotifyUserInfo
-purple_notify_user_info_new()
+purple_notify_user_info_new(class)
+	C_ARGS: /* void */
 
 void
 purple_notify_user_info_destroy(user_info)
@@ -102,37 +179,3 @@
 gchar *
 purple_notify_user_info_entry_get_value(user_info_entry)
 	Purple::NotifyUserInfoEntry user_info_entry
-
-Purple::NotifyUiOps
-purple_notify_get_ui_ops()
-
-
-void *
-purple_notify_message(handle, type, title, primary, secondary, cb, user_data)
-	void * handle
-	Purple::NotifyMsgType type
-	const char *title
-	const char *primary
-	const char *secondary
-	Purple::NotifyCloseCallback cb
-	gpointer user_data
-
-void *
-purple_notify_searchresults(gc, title, primary, secondary, results, cb, user_data)
-	Purple::Connection gc
-	const char *title
-	const char *primary
-	const char *secondary
-	Purple::NotifySearchResults results
-	Purple::NotifyCloseCallback cb
-	gpointer user_data
-
-void
-purple_notify_set_ui_ops(ops)
-	Purple::NotifyUiOps ops
-
-void *
-purple_notify_uri(handle, uri)
-	void * handle
-	const char *uri
-
--- a/libpurple/plugins/perl/common/Plugin.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Plugin.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,22 @@
 MODULE = Purple::Plugin  PACKAGE = Purple::Plugin  PREFIX = purple_plugin_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Plugin::Type", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_PLUGIN_##name}
+		const_iv(UNKNOWN),
+		const_iv(STANDARD),
+		const_iv(LOADER),
+		const_iv(PROTOCOL),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 Purple::Plugin
 purple_plugin_new(native, path)
 	gboolean native
--- a/libpurple/plugins/perl/common/PluginPref.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/PluginPref.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,33 @@
 MODULE = Purple::PluginPref  PACKAGE = Purple::PluginPref::Frame  PREFIX = purple_plugin_pref_frame_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *string_format_stash = gv_stashpv("Purple::String::Format::Type", 1);
+	HV *plugin_pref_stash = gv_stashpv("Purple::PluginPref::Type", 1);
+
+	static const constiv *civ, string_format_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_STRING_FORMAT_TYPE_##name}
+		const_iv(NONE),
+		const_iv(MULTILINE),
+		const_iv(HTML),
+	};
+	static const constiv plugin_pref_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_PLUGIN_PREF_##name}
+		const_iv(NONE),
+		const_iv(CHOICE),
+		const_iv(INFO),
+		const_iv(STRING_FORMAT),
+	};
+
+	for (civ = string_format_const_iv + sizeof(string_format_const_iv) / sizeof(string_format_const_iv[0]); civ-- > string_format_const_iv; )
+		newCONSTSUB(string_format_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = plugin_pref_const_iv + sizeof(plugin_pref_const_iv) / sizeof(plugin_pref_const_iv[0]); civ-- > plugin_pref_const_iv; )
+		newCONSTSUB(plugin_pref_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_plugin_pref_frame_add(frame, pref)
 	Purple::PluginPref::Frame frame
--- a/libpurple/plugins/perl/common/Pounce.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Pounce.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,39 @@
 MODULE = Purple::Pounce  PACKAGE = Purple::Pounce  PREFIX = purple_pounce_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *event_stash = gv_stashpv("Purple::Pounce::Event", 1);
+	HV *option_stash = gv_stashpv("Purple::Pounce::Option", 1);
+
+	static const constiv *civ, event_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_POUNCE_##name}
+		const_iv(NONE),
+		const_iv(SIGNON),
+		const_iv(SIGNOFF),
+		const_iv(AWAY),
+		const_iv(AWAY_RETURN),
+		const_iv(IDLE),
+		const_iv(IDLE_RETURN),
+		const_iv(TYPING),
+		const_iv(TYPED),
+		const_iv(TYPING_STOPPED),
+		const_iv(MESSAGE_RECEIVED),
+	};
+	static const constiv option_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_POUNCE_OPTION_##name}
+		const_iv(NONE),
+		const_iv(AWAY),
+	};
+
+	for (civ = event_const_iv + sizeof(event_const_iv) / sizeof(event_const_iv[0]); civ-- > event_const_iv; )
+		newCONSTSUB(event_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = option_const_iv + sizeof(option_const_iv) / sizeof(option_const_iv[0]); civ-- > option_const_iv; )
+		newCONSTSUB(option_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_pounce_action_register(pounce, name)
 	Purple::Pounce pounce
--- a/libpurple/plugins/perl/common/Prefs.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Prefs.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,25 @@
 MODULE = Purple::Prefs  PACKAGE = Purple::Prefs  PREFIX = purple_prefs_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Pref::Type", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_PREF_##name}
+		const_iv(NONE),
+		const_iv(BOOLEAN),
+		const_iv(INT),
+		const_iv(STRING),
+		const_iv(STRING_LIST),
+		const_iv(PATH),
+		const_iv(PATH_LIST),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_prefs_add_bool(name, value)
 	const char *name
--- a/libpurple/plugins/perl/common/Proxy.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Proxy.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,13 +3,34 @@
 MODULE = Purple::Proxy  PACKAGE = Purple::Proxy  PREFIX = purple_proxy_
 PROTOTYPES: ENABLE
 
-Purple::ProxyInfo
-purple_global_proxy_get_info()
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::ProxyType::", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_PROXY_##name}
+		const_iv(USE_GLOBAL),
+		const_iv(NONE),
+		const_iv(HTTP),
+		const_iv(SOCKS4),
+		const_iv(SOCKS5),
+		const_iv(USE_ENVVAR),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
 
 Purple::Handle
 purple_proxy_get_handle()
 
 void
+purple_proxy_init()
+
+MODULE = Purple::Proxy  PACKAGE = Purple::ProxyInfo  PREFIX = purple_proxy_info_
+PROTOTYPES: ENABLE
+
+void
 purple_proxy_info_destroy(info)
 	Purple::ProxyInfo info
 
@@ -61,5 +82,8 @@
 	Purple::ProxyInfo info
 	const char *username
 
-void
-purple_proxy_init()
+MODULE = Purple::Proxy  PACKAGE = Purple::Proxy  PREFIX = purple_
+PROTOTYPES: ENABLE
+
+Purple::ProxyInfo
+purple_global_proxy_get_info()
--- a/libpurple/plugins/perl/common/Purple.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Purple.xs	Tue May 01 05:54:26 2007 +0000
@@ -1,6 +1,5 @@
 #include "module.h"
 #include "../perl-handlers.h"
-#include "const-c.inc"
 
 /* Prototypes for the BOOT section below. */
 PURPLE_PERL_BOOT_PROTO(Account);
@@ -40,8 +39,6 @@
 MODULE = Purple PACKAGE = Purple PREFIX = purple_
 PROTOTYPES: ENABLE
 
-INCLUDE: const-xs.inc
-
 BOOT:
 	PURPLE_PERL_BOOT(Account);
 	PURPLE_PERL_BOOT(Account__Option);
--- a/libpurple/plugins/perl/common/Request.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Request.xs	Tue May 01 05:54:26 2007 +0000
@@ -80,6 +80,41 @@
 MODULE = Purple::Request  PACKAGE = Purple::Request  PREFIX = purple_request_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *request_stash = gv_stashpv("Purple::RequestType", 1);
+	HV *request_field_stash = gv_stashpv("Purple::RequestFieldType", 1);
+
+	static const constiv *civ, request_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_REQUEST_##name}
+		const_iv(INPUT),
+		const_iv(CHOICE),
+		const_iv(ACTION),
+		const_iv(FIELDS),
+		const_iv(FILE),
+		const_iv(FOLDER),
+	};
+	static const constiv request_field_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_REQUEST_FIELD_##name}
+		const_iv(NONE),
+		const_iv(STRING),
+		const_iv(INTEGER),
+		const_iv(BOOLEAN),
+		const_iv(CHOICE),
+		const_iv(LIST),
+		const_iv(LABEL),
+		const_iv(IMAGE),
+		const_iv(ACCOUNT),
+	};
+
+	for (civ = request_const_iv + sizeof(request_const_iv) / sizeof(request_const_iv[0]); civ-- > request_const_iv; )
+		newCONSTSUB(request_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = request_field_const_iv + sizeof(request_field_const_iv) / sizeof(request_field_const_iv[0]); civ-- > request_field_const_iv; )
+		newCONSTSUB(request_field_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void *
 purple_request_input(handle, title, primary, secondary, default_value, multiline, masked, hint, ok_text, ok_cb, cancel_text, cancel_cb)
 	Purple::Plugin handle
@@ -170,9 +205,22 @@
 purple_request_close_with_handle(handle)
 	void * handle
 
+Purple::Request::UiOps
+purple_request_get_ui_ops()
+
+void
+purple_request_set_ui_ops(ops)
+	Purple::Request::UiOps ops
+
 MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
 PROTOTYPES: ENABLE
 
+Purple::Request::Field
+purple_request_field_account_new(id, text, account = NULL)
+	const char *id
+	const char *text
+	Purple::Account account
+
 Purple::Account
 purple_request_field_account_get_default_value(field)
 	Purple::Request::Field field
@@ -193,12 +241,6 @@
 purple_request_field_account_get_value(field)
 	Purple::Request::Field field
 
-Purple::Request::Field
-purple_request_field_account_new(id, text, account = NULL)
-	const char *id
-	const char *text
-	Purple::Account account
-
 void
 purple_request_field_account_set_default_value(field, default_value)
 	Purple::Request::Field field
@@ -214,6 +256,15 @@
 	Purple::Request::Field field
 	Purple::Account value
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
+Purple::Request::Field
+purple_request_field_bool_new(id, text, default_value = TRUE)
+	const char *id
+	const char *text
+	gboolean default_value
+
 gboolean
 purple_request_field_bool_get_default_value(field)
 	Purple::Request::Field field
@@ -222,12 +273,6 @@
 purple_request_field_bool_get_value(field)
 	Purple::Request::Field field
 
-Purple::Request::Field
-purple_request_field_bool_new(id, text, default_value = TRUE)
-	const char *id
-	const char *text
-	gboolean default_value
-
 void
 purple_request_field_bool_set_default_value(field, default_value)
 	Purple::Request::Field field
@@ -238,6 +283,15 @@
 	Purple::Request::Field field
 	gboolean value
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
+Purple::Request::Field
+purple_request_field_choice_new(id, text, default_value = 0)
+	const char *id
+	const char *text
+	int default_value
+
 void
 purple_request_field_choice_add(field, label)
 	Purple::Request::Field field
@@ -261,12 +315,6 @@
 purple_request_field_choice_get_value(field)
 	Purple::Request::Field field
 
-Purple::Request::Field
-purple_request_field_choice_new(id, text, default_value = 0)
-	const char *id
-	const char *text
-	int default_value
-
 void
 purple_request_field_choice_set_default_value(field, default_value)
 	Purple::Request::Field field
@@ -277,25 +325,14 @@
 	Purple::Request::Field field
 	int value
 
-void
-purple_request_field_destroy(field)
-	Purple::Request::Field field
-
-const char *
-purple_request_field_get_id(field)
-	Purple::Request::Field field
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
 
-const char *
-purple_request_field_get_label(field)
-	Purple::Request::Field field
-
-Purple::RequestFieldType
-purple_request_field_get_type(field)
-	Purple::Request::Field field
-
-const char *
-purple_request_field_get_type_hint(field)
-	Purple::Request::Field field
+Purple::Request::Field
+purple_request_field_int_new(id, text, default_value = 0)
+	const char *id
+	const char *text
+	int default_value
 
 int
 purple_request_field_int_get_default_value(field)
@@ -305,12 +342,6 @@
 purple_request_field_int_get_value(field)
 	Purple::Request::Field field
 
-Purple::Request::Field
-purple_request_field_int_new(id, text, default_value = 0)
-	const char *id
-	const char *text
-	int default_value
-
 void
 purple_request_field_int_set_default_value(field, default_value)
 	Purple::Request::Field field
@@ -325,15 +356,22 @@
 purple_request_field_is_required(field)
 	Purple::Request::Field field
 
-gboolean
-purple_request_field_is_visible(field)
-	Purple::Request::Field field
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
 
 Purple::Request::Field
 purple_request_field_label_new(id, text)
 	const char *id
 	const char *text
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
+Purple::Request::Field
+purple_request_field_list_new(id, text)
+	const char *id
+	const char *text
+
 void
 purple_request_field_list_add(field, item, data)
 	Purple::Request::Field field
@@ -383,16 +421,14 @@
 	Purple::Request::Field field
 	const char *item
 
-Purple::Request::Field
-purple_request_field_list_new(id, text)
-	const char *id
-	const char *text
-
 void
 purple_request_field_list_set_multi_select(field, multi_select)
 	Purple::Request::Field field
 	gboolean multi_select
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
 Purple::Request::Field
 purple_request_field_new(id, text, type)
 	const char *id
@@ -419,6 +455,16 @@
 	Purple::Request::Field field
 	gboolean visible
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
+Purple::Request::Field
+purple_request_field_string_new(id, text, default_value, multiline)
+	const char *id
+	const char *text
+	const char *default_value
+	gboolean multiline
+
 const char *
 purple_request_field_string_get_default_value(field)
 	Purple::Request::Field field
@@ -439,13 +485,6 @@
 purple_request_field_string_is_multiline(field)
 	Purple::Request::Field field
 
-Purple::Request::Field
-purple_request_field_string_new(id, text, default_value, multiline)
-	const char *id
-	const char *text
-	const char *default_value
-	gboolean multiline
-
 void
 purple_request_field_string_set_default_value(field, default_value)
 	Purple::Request::Field field
@@ -466,13 +505,6 @@
 	Purple::Request::Field field
 	const char *value
 
-Purple::Request::UiOps
-purple_request_get_ui_ops()
-
-void
-purple_request_set_ui_ops(ops)
-	Purple::Request::UiOps ops
-
 MODULE = Purple::Request  PACKAGE = Purple::Request::Field::Group  PREFIX = purple_request_field_group_
 PROTOTYPES: ENABLE
 
@@ -503,9 +535,39 @@
 purple_request_field_group_new(title)
 	const char *title
 
+MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
+PROTOTYPES: ENABLE
+
+void
+purple_request_field_destroy(field)
+	Purple::Request::Field field
+
+const char *
+purple_request_field_get_id(field)
+	Purple::Request::Field field
+
+const char *
+purple_request_field_get_label(field)
+	Purple::Request::Field field
+
+Purple::RequestFieldType
+purple_request_field_get_type(field)
+	Purple::Request::Field field
+
+const char *
+purple_request_field_get_type_hint(field)
+	Purple::Request::Field field
+
+gboolean
+purple_request_field_is_visible(field)
+	Purple::Request::Field field
+
 MODULE = Purple::Request  PACKAGE = Purple::Request::Fields  PREFIX = purple_request_fields_
 PROTOTYPES: ENABLE
 
+Purple::Request::Fields
+purple_request_fields_new()
+
 void
 purple_request_fields_add_group(fields, group)
 	Purple::Request::Fields fields
@@ -578,6 +640,3 @@
 purple_request_fields_is_field_required(fields, id)
 	Purple::Request::Fields fields
 	const char *id
-
-Purple::Request::Fields
-purple_request_fields_new()
--- a/libpurple/plugins/perl/common/Roomlist.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Roomlist.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,31 @@
 MODULE = Purple::Roomlist  PACKAGE = Purple::Roomlist  PREFIX = purple_roomlist_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *room_stash = gv_stashpv("Purple::Roomlist::Room::Type", 1);
+	HV *field_stash = gv_stashpv("Purple::Roomlist::Field::Type", 1);
+
+	static const constiv *civ, room_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_ROOMLIST_ROOMTYPE_##name}
+		const_iv(CATEGORY),
+		const_iv(ROOM),
+	};
+	static const constiv field_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_ROOMLIST_FIELD_##name}
+		const_iv(BOOL),
+		const_iv(INT),
+		const_iv(STRING),
+	};
+
+	for (civ = room_const_iv + sizeof(room_const_iv) / sizeof(room_const_iv[0]); civ-- > room_const_iv; )
+		newCONSTSUB(room_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = field_const_iv + sizeof(field_const_iv) / sizeof(field_const_iv[0]); civ-- > field_const_iv; )
+		newCONSTSUB(field_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void 
 purple_roomlist_cancel_get_list(list)
 	Purple::Roomlist list
--- a/libpurple/plugins/perl/common/Sound.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Sound.xs	Tue May 01 05:54:26 2007 +0000
@@ -3,6 +3,29 @@
 MODULE = Purple::Sound  PACKAGE = Purple::Sound  PREFIX = purple_sound_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::SoundEventID", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_SOUND_##name}
+		const_iv(BUDDY_ARRIVE),
+		const_iv(BUDDY_LEAVE),
+		const_iv(RECEIVE),
+		const_iv(FIRST_RECEIVE),
+		const_iv(SEND),
+		const_iv(CHAT_JOIN),
+		const_iv(CHAT_LEAVE),
+		const_iv(CHAT_YOU_SAY),
+		const_iv(CHAT_SAY),
+		const_iv(POUNCE_DEFAULT),
+		const_iv(CHAT_NICK),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 Purple::Sound::UiOps
 purple_sound_get_ui_ops()
 
--- a/libpurple/plugins/perl/common/Status.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Status.xs	Tue May 01 05:54:26 2007 +0000
@@ -42,6 +42,38 @@
 MODULE = Purple::Status  PACKAGE = Purple::Presence  PREFIX = purple_presence_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *context_stash = gv_stashpv("Purple::Presence::Context", 1);
+	HV *primitive_stash = gv_stashpv("Purple::Status::Primitive", 1);
+
+	static const constiv *civ, context_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_PRESENCE_CONTEXT_##name}
+		const_iv(UNSET),
+		const_iv(ACCOUNT),
+		const_iv(CONV),
+		const_iv(BUDDY),
+	};
+	static const constiv primitive_const_iv[] = {
+#undef const_iv
+#define const_iv(name) {#name, (IV)PURPLE_STATUS_##name}
+		const_iv(UNSET),
+		const_iv(OFFLINE),
+		const_iv(AVAILABLE),
+		const_iv(UNAVAILABLE),
+		const_iv(INVISIBLE),
+		const_iv(AWAY),
+		const_iv(EXTENDED_AWAY),
+		const_iv(MOBILE),
+	};
+
+	for (civ = context_const_iv + sizeof(context_const_iv) / sizeof(context_const_iv[0]); civ-- > context_const_iv; )
+		newCONSTSUB(context_stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = primitive_const_iv + sizeof(primitive_const_iv) / sizeof(primitive_const_iv[0]); civ-- > primitive_const_iv; )
+		newCONSTSUB(primitive_stash, (char *)civ->name, newSViv(civ->iv));
+}
+
 void
 purple_presence_add_list(presence, source_list)
 	Purple::Presence presence
--- a/libpurple/plugins/perl/common/Util.xs	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/Util.xs	Tue May 01 05:54:26 2007 +0000
@@ -28,44 +28,11 @@
 MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_
 PROTOTYPES: ENABLE
 
-void
-purple_util_fetch_url(handle, url, full, user_agent, http11, cb)
-	Purple::Plugin handle
-	const char *url
-	gboolean full
-	const char *user_agent
-	gboolean http11
-	SV * cb
-CODE:
-	PurplePerlUrlData *gpr;
-	STRLEN len;
-	char *basename;
-
-	basename = g_path_get_basename(handle->path);
-	purple_perl_normalize_script_name(basename);
-	gpr = g_new(PurplePerlUrlData, 1);
-
-	gpr->cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(cb, len));
-	g_free(basename);
-	purple_util_fetch_url(url, full, user_agent, http11, purple_perl_util_url_cb, gpr);
-
 int
 purple_build_dir(path, mode)
 	const char *path
 	int mode
 
-const char *
-purple_date_format_full(tm)
-	const struct tm *tm
-
-const char *
-purple_date_format_long(tm)
-	const struct tm *tm
-
-const char *
-purple_date_format_short(tm)
-	const struct tm *tm
-
 gboolean
 purple_email_is_valid(address)
 	const char *address
@@ -82,53 +49,6 @@
 purple_home_dir()
 
 gboolean
-purple_markup_extract_info_field(str, len, user_info, start_token, skip, end_token, check_value, no_value_token, display_name, is_link, link_prefix, format_cb)
-	const char *str
-	int len
-	Purple::NotifyUserInfo user_info
-	const char *start_token
-	int skip
-	const char *end_token
-	char check_value
-	const char *no_value_token
-	const char *display_name
-	gboolean is_link
-	const char *link_prefix
-	Purple::Util::InfoFieldFormatCallback format_cb
-
-gboolean
-purple_markup_find_tag(needle, haystack, start, end, attributes)
-	const char *needle
-	const char *haystack
-	const char **start
-	const char **end
-	GData **attributes
-
-gchar_own *
-purple_markup_get_tag_name(tag)
-	const char *tag
-
-void
-purple_markup_html_to_xhtml(html, dest_xhtml, dest_plain)
-	const char *html
-	char **dest_xhtml
-	char **dest_plain
-
-gchar_own *
-purple_markup_linkify(str)
-	const char *str
-
-gchar_own *
-purple_markup_slice(str, x, y)
-	const char *str
-	guint x
-	guint y
-
-gchar_own *
-purple_markup_strip_html(str)
-	const char *str
-
-gboolean
 purple_message_meify(message, len)
 	char *message
 	size_t len
@@ -148,46 +68,6 @@
 	const char *program
 
 gchar_own *
-purple_str_add_cr(str)
-	const char *str
-
-gchar_own *
-purple_str_binary_to_ascii(binary, len)
-	const unsigned char *binary
-	guint len
-
-gboolean
-purple_str_has_prefix(s, p)
-	const char *s
-	const char *p
-
-gboolean
-purple_str_has_suffix(s, x)
-	const char *s
-	const char *x
-
-gchar_own *
-purple_str_seconds_to_string(sec)
-	guint sec
-
-gchar_own *
-purple_str_size_to_units(size)
-	size_t size
-
-void
-purple_str_strip_char(str, thechar)
-	char *str
-	char thechar
-
-time_t
-purple_str_to_time(timestamp, utc = FALSE, tm = NULL, tz_off = NULL, rest = NULL)
-	const char *timestamp
-	gboolean utc
-	struct tm *tm
-	long *tz_off
-	const char **rest
-
-gchar_own *
 purple_strcasereplace(string, delimiter, replacement)
 	const char *string
 	const char *delimiter
@@ -256,6 +136,138 @@
 const char *
 purple_utf8_strftime(const char *format, const struct tm *tm);
 
+MODULE = Purple::Util  PACKAGE = Purple::Util::Str  PREFIX = purple_str_
+PROTOTYPES: ENABLE
+
+gchar_own *
+purple_str_add_cr(str)
+	const char *str
+
+gchar_own *
+purple_str_binary_to_ascii(binary, len)
+	const unsigned char *binary
+	guint len
+
+gboolean
+purple_str_has_prefix(s, p)
+	const char *s
+	const char *p
+
+gboolean
+purple_str_has_suffix(s, x)
+	const char *s
+	const char *x
+
+gchar_own *
+purple_str_seconds_to_string(sec)
+	guint sec
+
+gchar_own *
+purple_str_size_to_units(size)
+	size_t size
+
+void
+purple_str_strip_char(str, thechar)
+	char *str
+	char thechar
+
+time_t
+purple_str_to_time(timestamp, utc = FALSE, tm = NULL, tz_off = NULL, rest = NULL)
+	const char *timestamp
+	gboolean utc
+	struct tm *tm
+	long *tz_off
+	const char **rest
+
+MODULE = Purple::Util  PACKAGE = Purple::Util::Date  PREFIX = purple_date_
+PROTOTYPES: ENABLE
+
+const char *
+purple_date_format_full(tm)
+	const struct tm *tm
+
+const char *
+purple_date_format_long(tm)
+	const struct tm *tm
+
+const char *
+purple_date_format_short(tm)
+	const struct tm *tm
+
+MODULE = Purple::Util  PACKAGE = Purple::Util::Markup  PREFIX = purple_markup_
+PROTOTYPES: ENABLE
+
+gboolean
+purple_markup_extract_info_field(str, len, user_info, start_token, skip, end_token, check_value, no_value_token, display_name, is_link, link_prefix, format_cb)
+	const char *str
+	int len
+	Purple::NotifyUserInfo user_info
+	const char *start_token
+	int skip
+	const char *end_token
+	char check_value
+	const char *no_value_token
+	const char *display_name
+	gboolean is_link
+	const char *link_prefix
+	Purple::Util::InfoFieldFormatCallback format_cb
+
+gboolean
+purple_markup_find_tag(needle, haystack, start, end, attributes)
+	const char *needle
+	const char *haystack
+	const char **start
+	const char **end
+	GData **attributes
+
+gchar_own *
+purple_markup_get_tag_name(tag)
+	const char *tag
+
+void
+purple_markup_html_to_xhtml(html, dest_xhtml, dest_plain)
+	const char *html
+	char **dest_xhtml
+	char **dest_plain
+
+gchar_own *
+purple_markup_linkify(str)
+	const char *str
+
+gchar_own *
+purple_markup_slice(str, x, y)
+	const char *str
+	guint x
+	guint y
+
+gchar_own *
+purple_markup_strip_html(str)
+	const char *str
+
+MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_util_
+PROTOTYPES: ENABLE
+
+void
+purple_util_fetch_url(handle, url, full, user_agent, http11, cb)
+	Purple::Plugin handle
+	const char *url
+	gboolean full
+	const char *user_agent
+	gboolean http11
+	SV * cb
+CODE:
+	PurplePerlUrlData *gpr;
+	STRLEN len;
+	char *basename;
+
+	basename = g_path_get_basename(handle->path);
+	purple_perl_normalize_script_name(basename);
+	gpr = g_new(PurplePerlUrlData, 1);
+
+	gpr->cb = g_strdup_printf("Purple::Script::%s::%s", basename, SvPV(cb, len));
+	g_free(basename);
+	purple_util_fetch_url(url, full, user_agent, http11, purple_perl_util_url_cb, gpr);
+
 void
 purple_util_set_user_dir(dir)
 	const char *dir
--- a/libpurple/plugins/perl/common/module.h	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/plugins/perl/common/module.h	Tue May 01 05:54:26 2007 +0000
@@ -276,3 +276,7 @@
 
 typedef gchar gchar_own;
 
+typedef struct _constiv {
+	const char *name;
+	IV iv;
+} constiv;
--- a/libpurple/server.c	Tue May 01 05:53:57 2007 +0000
+++ b/libpurple/server.c	Tue May 01 05:54:26 2007 +0000
@@ -20,6 +20,9 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */
+
+/* This file is the fullcrap */
+
 #include "internal.h"
 #include "blist.h"
 #include "conversation.h"
--- a/pidgin/gtkmain.c	Tue May 01 05:53:57 2007 +0000
+++ b/pidgin/gtkmain.c	Tue May 01 05:54:26 2007 +0000
@@ -318,6 +318,7 @@
 	pidgin_xfers_init();
 	pidgin_roomlist_init();
 	pidgin_log_init();
+	pidgin_docklet_init();
 }
 
 static void
@@ -745,7 +746,6 @@
 
 	/* load plugins we had when we quit */
 	purple_plugins_load_saved(PIDGIN_PREFS_ROOT "/plugins/loaded");
-	pidgin_docklet_init();
 
 	/* TODO: Move pounces loading into purple_pounces_init() */
 	purple_pounces_load();
--- a/pidgin/plugins/perl/common/GtkFt.xs	Tue May 01 05:53:57 2007 +0000
+++ b/pidgin/plugins/perl/common/GtkFt.xs	Tue May 01 05:54:26 2007 +0000
@@ -1,6 +1,6 @@
 #include "gtkmodule.h"
 
-MODULE = Pidgin::Xfer  PACKAGE = Pidgin::Xfer  PREFIX = pidgin_xfer_
+MODULE = Pidgin::Xfer  PACKAGE = Pidgin::Xfer  PREFIX = pidgin_
 PROTOTYPES: ENABLE
 
 void