purplexpcom on Tb17, try: -b o -p all -u none -t none
authorFlorian Quèze <florian@instantbird.org>
Thu, 20 Sep 2012 19:33:36 +0200
changeset 14177 f41c067eb2523a601bbf17f61af822080a1d22a3
parent 14176 bef5c9d145f77173f2b94150a09989d64ad33b9d
push id261
push userflorian@queze.net
push dateThu, 20 Sep 2012 17:39:20 +0000
treeherdertry-comm-central@f41c067eb252 [default view] [failures only]
purplexpcom on Tb17, try: -b o -p all -u none -t none
aclocal.m4
build/autoconf/glib.m4
configure.in
mail/build.mk
mail/installer/package-manifest.in
mail/makefiles.sh
purple/Makefile.in
purple/config/version.txt
purple/jar.mn
purple/libpurple/Makefile.in
purple/libpurple/account.c
purple/libpurple/account.h
purple/libpurple/accountopt.c
purple/libpurple/accountopt.h
purple/libpurple/blist.c
purple/libpurple/blist.h
purple/libpurple/buddyicon.c
purple/libpurple/buddyicon.h
purple/libpurple/cipher.c
purple/libpurple/cipher.h
purple/libpurple/ciphers/des.c
purple/libpurple/ciphers/gchecksum.c
purple/libpurple/ciphers/hmac.c
purple/libpurple/ciphers/md4.c
purple/libpurple/ciphers/md5.c
purple/libpurple/ciphers/rc4.c
purple/libpurple/ciphers/sha1.c
purple/libpurple/ciphers/sha256.c
purple/libpurple/circbuffer.c
purple/libpurple/circbuffer.h
purple/libpurple/cmds.c
purple/libpurple/cmds.h
purple/libpurple/connection.c
purple/libpurple/connection.h
purple/libpurple/conversation.c
purple/libpurple/conversation.h
purple/libpurple/core.c
purple/libpurple/core.h
purple/libpurple/dbus-maybe.h
purple/libpurple/debug.c
purple/libpurple/debug.h
purple/libpurple/dnsquery.c
purple/libpurple/dnsquery.h
purple/libpurple/dnssrv.c
purple/libpurple/dnssrv.h
purple/libpurple/eventloop.c
purple/libpurple/eventloop.h
purple/libpurple/ft.c
purple/libpurple/ft.h
purple/libpurple/gettext.c
purple/libpurple/gettext.h
purple/libpurple/idle.c
purple/libpurple/idle.h
purple/libpurple/imgstore.c
purple/libpurple/imgstore.h
purple/libpurple/internal.h
purple/libpurple/log.h
purple/libpurple/mime.c
purple/libpurple/mime.h
purple/libpurple/nat-pmp.c
purple/libpurple/nat-pmp.h
purple/libpurple/network.c
purple/libpurple/network.h
purple/libpurple/notify.c
purple/libpurple/notify.h
purple/libpurple/ntlm.c
purple/libpurple/ntlm.h
purple/libpurple/plugin.c
purple/libpurple/plugin.h
purple/libpurple/pluginpref.c
purple/libpurple/pluginpref.h
purple/libpurple/prefs.c
purple/libpurple/prefs.h
purple/libpurple/privacy.c
purple/libpurple/privacy.h
purple/libpurple/protocols/bonjour/Makefile.in
purple/libpurple/protocols/bonjour/bonjour.c
purple/libpurple/protocols/bonjour/bonjour.h
purple/libpurple/protocols/bonjour/bonjour_ft.c
purple/libpurple/protocols/bonjour/bonjour_ft.h
purple/libpurple/protocols/bonjour/buddy.c
purple/libpurple/protocols/bonjour/buddy.h
purple/libpurple/protocols/bonjour/dns_sd_proxy.c
purple/libpurple/protocols/bonjour/dns_sd_proxy.h
purple/libpurple/protocols/bonjour/jabber.c
purple/libpurple/protocols/bonjour/jabber.h
purple/libpurple/protocols/bonjour/mdns_avahi.c
purple/libpurple/protocols/bonjour/mdns_common.c
purple/libpurple/protocols/bonjour/mdns_common.h
purple/libpurple/protocols/bonjour/mdns_interface.h
purple/libpurple/protocols/bonjour/mdns_types.h
purple/libpurple/protocols/bonjour/mdns_win32.c
purple/libpurple/protocols/bonjour/parser.c
purple/libpurple/protocols/bonjour/parser.h
purple/libpurple/protocols/bonjour/win32/dns_sd.h
purple/libpurple/protocols/create-cid.sh
purple/libpurple/protocols/gg/Makefile.in
purple/libpurple/protocols/gg/buddylist.c
purple/libpurple/protocols/gg/buddylist.h
purple/libpurple/protocols/gg/confer.c
purple/libpurple/protocols/gg/confer.h
purple/libpurple/protocols/gg/gg-utils.c
purple/libpurple/protocols/gg/gg-utils.h
purple/libpurple/protocols/gg/gg.c
purple/libpurple/protocols/gg/gg.h
purple/libpurple/protocols/gg/lib/COPYING
purple/libpurple/protocols/gg/lib/common.c
purple/libpurple/protocols/gg/lib/compat.h
purple/libpurple/protocols/gg/lib/dcc.c
purple/libpurple/protocols/gg/lib/dcc7.c
purple/libpurple/protocols/gg/lib/debug.c
purple/libpurple/protocols/gg/lib/deflate.c
purple/libpurple/protocols/gg/lib/deflate.h
purple/libpurple/protocols/gg/lib/encoding.c
purple/libpurple/protocols/gg/lib/encoding.h
purple/libpurple/protocols/gg/lib/events.c
purple/libpurple/protocols/gg/lib/handlers.c
purple/libpurple/protocols/gg/lib/http.c
purple/libpurple/protocols/gg/lib/libgadu-config.h
purple/libpurple/protocols/gg/lib/libgadu-debug.h
purple/libpurple/protocols/gg/lib/libgadu-internal.h
purple/libpurple/protocols/gg/lib/libgadu.c
purple/libpurple/protocols/gg/lib/libgadu.h
purple/libpurple/protocols/gg/lib/message.c
purple/libpurple/protocols/gg/lib/message.h
purple/libpurple/protocols/gg/lib/obsolete.c
purple/libpurple/protocols/gg/lib/protocol.h
purple/libpurple/protocols/gg/lib/pubdir.c
purple/libpurple/protocols/gg/lib/pubdir50.c
purple/libpurple/protocols/gg/lib/resolver.c
purple/libpurple/protocols/gg/lib/resolver.h
purple/libpurple/protocols/gg/lib/session.h
purple/libpurple/protocols/gg/lib/sha1.c
purple/libpurple/protocols/gg/search.c
purple/libpurple/protocols/gg/search.h
purple/libpurple/protocols/jabber/Makefile.in
purple/libpurple/protocols/jabber/adhoccommands.c
purple/libpurple/protocols/jabber/adhoccommands.h
purple/libpurple/protocols/jabber/auth.c
purple/libpurple/protocols/jabber/auth.h
purple/libpurple/protocols/jabber/auth_digest_md5.c
purple/libpurple/protocols/jabber/auth_digest_md5.h
purple/libpurple/protocols/jabber/auth_plain.c
purple/libpurple/protocols/jabber/auth_scram.c
purple/libpurple/protocols/jabber/auth_scram.h
purple/libpurple/protocols/jabber/bosh.c
purple/libpurple/protocols/jabber/bosh.h
purple/libpurple/protocols/jabber/buddy.c
purple/libpurple/protocols/jabber/buddy.h
purple/libpurple/protocols/jabber/caps.c
purple/libpurple/protocols/jabber/caps.h
purple/libpurple/protocols/jabber/chat.c
purple/libpurple/protocols/jabber/chat.h
purple/libpurple/protocols/jabber/data.c
purple/libpurple/protocols/jabber/data.h
purple/libpurple/protocols/jabber/disco.c
purple/libpurple/protocols/jabber/disco.h
purple/libpurple/protocols/jabber/google/gmail.c
purple/libpurple/protocols/jabber/google/gmail.h
purple/libpurple/protocols/jabber/google/google.c
purple/libpurple/protocols/jabber/google/google.h
purple/libpurple/protocols/jabber/google/google_presence.c
purple/libpurple/protocols/jabber/google/google_presence.h
purple/libpurple/protocols/jabber/google/google_roster.c
purple/libpurple/protocols/jabber/google/google_roster.h
purple/libpurple/protocols/jabber/google/google_session.c
purple/libpurple/protocols/jabber/google/google_session.h
purple/libpurple/protocols/jabber/google/jingleinfo.c
purple/libpurple/protocols/jabber/google/jingleinfo.h
purple/libpurple/protocols/jabber/google/relay.c
purple/libpurple/protocols/jabber/google/relay.h
purple/libpurple/protocols/jabber/ibb.c
purple/libpurple/protocols/jabber/ibb.h
purple/libpurple/protocols/jabber/iq.c
purple/libpurple/protocols/jabber/iq.h
purple/libpurple/protocols/jabber/jabber.c
purple/libpurple/protocols/jabber/jabber.h
purple/libpurple/protocols/jabber/jutil.c
purple/libpurple/protocols/jabber/jutil.h
purple/libpurple/protocols/jabber/libxmpp.c
purple/libpurple/protocols/jabber/message.c
purple/libpurple/protocols/jabber/message.h
purple/libpurple/protocols/jabber/namespaces.h
purple/libpurple/protocols/jabber/oob.c
purple/libpurple/protocols/jabber/oob.h
purple/libpurple/protocols/jabber/parser.c
purple/libpurple/protocols/jabber/parser.h
purple/libpurple/protocols/jabber/pep.c
purple/libpurple/protocols/jabber/pep.h
purple/libpurple/protocols/jabber/ping.c
purple/libpurple/protocols/jabber/ping.h
purple/libpurple/protocols/jabber/presence.c
purple/libpurple/protocols/jabber/presence.h
purple/libpurple/protocols/jabber/roster.c
purple/libpurple/protocols/jabber/roster.h
purple/libpurple/protocols/jabber/si.c
purple/libpurple/protocols/jabber/si.h
purple/libpurple/protocols/jabber/useravatar.c
purple/libpurple/protocols/jabber/useravatar.h
purple/libpurple/protocols/jabber/usermood.c
purple/libpurple/protocols/jabber/usermood.h
purple/libpurple/protocols/jabber/usernick.c
purple/libpurple/protocols/jabber/usernick.h
purple/libpurple/protocols/jabber/usertune.c
purple/libpurple/protocols/jabber/usertune.h
purple/libpurple/protocols/jabber/win32/posix.uname.c
purple/libpurple/protocols/jabber/win32/utsname.h
purple/libpurple/protocols/jabber/xdata.c
purple/libpurple/protocols/jabber/xdata.h
purple/libpurple/protocols/module.ver.in
purple/libpurple/protocols/msn/Makefile.in
purple/libpurple/protocols/msn/cmdproc.c
purple/libpurple/protocols/msn/cmdproc.h
purple/libpurple/protocols/msn/command.c
purple/libpurple/protocols/msn/command.h
purple/libpurple/protocols/msn/contact.c
purple/libpurple/protocols/msn/contact.h
purple/libpurple/protocols/msn/directconn.c
purple/libpurple/protocols/msn/directconn.h
purple/libpurple/protocols/msn/error.c
purple/libpurple/protocols/msn/error.h
purple/libpurple/protocols/msn/group.c
purple/libpurple/protocols/msn/group.h
purple/libpurple/protocols/msn/history.c
purple/libpurple/protocols/msn/history.h
purple/libpurple/protocols/msn/httpconn.c
purple/libpurple/protocols/msn/httpconn.h
purple/libpurple/protocols/msn/msg.c
purple/libpurple/protocols/msn/msg.h
purple/libpurple/protocols/msn/msn.c
purple/libpurple/protocols/msn/msn.h
purple/libpurple/protocols/msn/msnutils.c
purple/libpurple/protocols/msn/msnutils.h
purple/libpurple/protocols/msn/nexus.c
purple/libpurple/protocols/msn/nexus.h
purple/libpurple/protocols/msn/notification.c
purple/libpurple/protocols/msn/notification.h
purple/libpurple/protocols/msn/object.c
purple/libpurple/protocols/msn/object.h
purple/libpurple/protocols/msn/oim.c
purple/libpurple/protocols/msn/oim.h
purple/libpurple/protocols/msn/p2p.c
purple/libpurple/protocols/msn/p2p.h
purple/libpurple/protocols/msn/page.c
purple/libpurple/protocols/msn/page.h
purple/libpurple/protocols/msn/sbconn.c
purple/libpurple/protocols/msn/sbconn.h
purple/libpurple/protocols/msn/servconn.c
purple/libpurple/protocols/msn/servconn.h
purple/libpurple/protocols/msn/session.c
purple/libpurple/protocols/msn/session.h
purple/libpurple/protocols/msn/slp.c
purple/libpurple/protocols/msn/slp.h
purple/libpurple/protocols/msn/slpcall.c
purple/libpurple/protocols/msn/slpcall.h
purple/libpurple/protocols/msn/slplink.c
purple/libpurple/protocols/msn/slplink.h
purple/libpurple/protocols/msn/slpmsg.c
purple/libpurple/protocols/msn/slpmsg.h
purple/libpurple/protocols/msn/slpmsg_part.c
purple/libpurple/protocols/msn/slpmsg_part.h
purple/libpurple/protocols/msn/soap.c
purple/libpurple/protocols/msn/soap.h
purple/libpurple/protocols/msn/state.c
purple/libpurple/protocols/msn/state.h
purple/libpurple/protocols/msn/switchboard.c
purple/libpurple/protocols/msn/switchboard.h
purple/libpurple/protocols/msn/table.c
purple/libpurple/protocols/msn/table.h
purple/libpurple/protocols/msn/tlv.c
purple/libpurple/protocols/msn/tlv.h
purple/libpurple/protocols/msn/transaction.c
purple/libpurple/protocols/msn/transaction.h
purple/libpurple/protocols/msn/user.c
purple/libpurple/protocols/msn/user.h
purple/libpurple/protocols/msn/userlist.c
purple/libpurple/protocols/msn/userlist.h
purple/libpurple/protocols/msn/xfer.c
purple/libpurple/protocols/msn/xfer.h
purple/libpurple/protocols/myspace/Makefile.in
purple/libpurple/protocols/myspace/README
purple/libpurple/protocols/myspace/markup.c
purple/libpurple/protocols/myspace/markup.h
purple/libpurple/protocols/myspace/message.c
purple/libpurple/protocols/myspace/message.h
purple/libpurple/protocols/myspace/myspace.c
purple/libpurple/protocols/myspace/myspace.h
purple/libpurple/protocols/myspace/persist.h
purple/libpurple/protocols/myspace/session.c
purple/libpurple/protocols/myspace/session.h
purple/libpurple/protocols/myspace/user.c
purple/libpurple/protocols/myspace/user.h
purple/libpurple/protocols/myspace/zap.c
purple/libpurple/protocols/myspace/zap.h
purple/libpurple/protocols/netsoul/Makefile.in
purple/libpurple/protocols/netsoul/netsoul.c
purple/libpurple/protocols/netsoul/netsoul.h
purple/libpurple/protocols/netsoul/ns_buddy.c
purple/libpurple/protocols/netsoul/ns_chat.c
purple/libpurple/protocols/netsoul/ns_connection.c
purple/libpurple/protocols/netsoul/ns_listen.c
purple/libpurple/protocols/netsoul/ns_output.c
purple/libpurple/protocols/netsoul/ns_utils.c
purple/libpurple/protocols/novell/Makefile.in
purple/libpurple/protocols/novell/nmconference.c
purple/libpurple/protocols/novell/nmconference.h
purple/libpurple/protocols/novell/nmconn.c
purple/libpurple/protocols/novell/nmconn.h
purple/libpurple/protocols/novell/nmcontact.c
purple/libpurple/protocols/novell/nmcontact.h
purple/libpurple/protocols/novell/nmevent.c
purple/libpurple/protocols/novell/nmevent.h
purple/libpurple/protocols/novell/nmfield.c
purple/libpurple/protocols/novell/nmfield.h
purple/libpurple/protocols/novell/nmmessage.c
purple/libpurple/protocols/novell/nmmessage.h
purple/libpurple/protocols/novell/nmrequest.c
purple/libpurple/protocols/novell/nmrequest.h
purple/libpurple/protocols/novell/nmrtf.c
purple/libpurple/protocols/novell/nmrtf.h
purple/libpurple/protocols/novell/nmuser.c
purple/libpurple/protocols/novell/nmuser.h
purple/libpurple/protocols/novell/nmuserrecord.c
purple/libpurple/protocols/novell/nmuserrecord.h
purple/libpurple/protocols/novell/novell.c
purple/libpurple/protocols/null/Makefile.in
purple/libpurple/protocols/null/README
purple/libpurple/protocols/null/nullprpl.c
purple/libpurple/protocols/oscar/AUTHORS
purple/libpurple/protocols/oscar/COPYING
purple/libpurple/protocols/oscar/Makefile.in
purple/libpurple/protocols/oscar/authorization.c
purple/libpurple/protocols/oscar/bstream.c
purple/libpurple/protocols/oscar/clientlogin.c
purple/libpurple/protocols/oscar/encoding.c
purple/libpurple/protocols/oscar/encoding.h
purple/libpurple/protocols/oscar/family_admin.c
purple/libpurple/protocols/oscar/family_alert.c
purple/libpurple/protocols/oscar/family_auth.c
purple/libpurple/protocols/oscar/family_bart.c
purple/libpurple/protocols/oscar/family_bos.c
purple/libpurple/protocols/oscar/family_buddy.c
purple/libpurple/protocols/oscar/family_chat.c
purple/libpurple/protocols/oscar/family_chatnav.c
purple/libpurple/protocols/oscar/family_feedbag.c
purple/libpurple/protocols/oscar/family_icbm.c
purple/libpurple/protocols/oscar/family_icq.c
purple/libpurple/protocols/oscar/family_locate.c
purple/libpurple/protocols/oscar/family_oservice.c
purple/libpurple/protocols/oscar/family_popup.c
purple/libpurple/protocols/oscar/family_stats.c
purple/libpurple/protocols/oscar/family_userlookup.c
purple/libpurple/protocols/oscar/flap_connection.c
purple/libpurple/protocols/oscar/libaim.c
purple/libpurple/protocols/oscar/libicq.c
purple/libpurple/protocols/oscar/misc.c
purple/libpurple/protocols/oscar/msgcookie.c
purple/libpurple/protocols/oscar/odc.c
purple/libpurple/protocols/oscar/oft.c
purple/libpurple/protocols/oscar/oscar.c
purple/libpurple/protocols/oscar/oscar.h
purple/libpurple/protocols/oscar/oscar_data.c
purple/libpurple/protocols/oscar/oscarcommon.h
purple/libpurple/protocols/oscar/peer.c
purple/libpurple/protocols/oscar/peer.h
purple/libpurple/protocols/oscar/peer_proxy.c
purple/libpurple/protocols/oscar/rxhandlers.c
purple/libpurple/protocols/oscar/snac.c
purple/libpurple/protocols/oscar/snactypes.h
purple/libpurple/protocols/oscar/tlv.c
purple/libpurple/protocols/oscar/userinfo.c
purple/libpurple/protocols/oscar/util.c
purple/libpurple/protocols/oscar/visibility.c
purple/libpurple/protocols/oscar/visibility.h
purple/libpurple/protocols/prpl-rules.mk
purple/libpurple/protocols/prpl.mk
purple/libpurple/protocols/qq/AUTHORS
purple/libpurple/protocols/qq/Makefile.in
purple/libpurple/protocols/qq/buddy_info.c
purple/libpurple/protocols/qq/buddy_info.h
purple/libpurple/protocols/qq/buddy_list.c
purple/libpurple/protocols/qq/buddy_list.h
purple/libpurple/protocols/qq/buddy_memo.c
purple/libpurple/protocols/qq/buddy_memo.h
purple/libpurple/protocols/qq/buddy_opt.c
purple/libpurple/protocols/qq/buddy_opt.h
purple/libpurple/protocols/qq/char_conv.c
purple/libpurple/protocols/qq/char_conv.h
purple/libpurple/protocols/qq/file_trans.c
purple/libpurple/protocols/qq/file_trans.h
purple/libpurple/protocols/qq/group.c
purple/libpurple/protocols/qq/group.h
purple/libpurple/protocols/qq/group_im.c
purple/libpurple/protocols/qq/group_im.h
purple/libpurple/protocols/qq/group_info.c
purple/libpurple/protocols/qq/group_info.h
purple/libpurple/protocols/qq/group_internal.c
purple/libpurple/protocols/qq/group_internal.h
purple/libpurple/protocols/qq/group_join.c
purple/libpurple/protocols/qq/group_join.h
purple/libpurple/protocols/qq/group_opt.c
purple/libpurple/protocols/qq/group_opt.h
purple/libpurple/protocols/qq/im.c
purple/libpurple/protocols/qq/im.h
purple/libpurple/protocols/qq/packet_parse.c
purple/libpurple/protocols/qq/packet_parse.h
purple/libpurple/protocols/qq/qq.c
purple/libpurple/protocols/qq/qq.h
purple/libpurple/protocols/qq/qq_base.c
purple/libpurple/protocols/qq/qq_base.h
purple/libpurple/protocols/qq/qq_crypt.c
purple/libpurple/protocols/qq/qq_crypt.h
purple/libpurple/protocols/qq/qq_define.c
purple/libpurple/protocols/qq/qq_define.h
purple/libpurple/protocols/qq/qq_network.c
purple/libpurple/protocols/qq/qq_network.h
purple/libpurple/protocols/qq/qq_process.c
purple/libpurple/protocols/qq/qq_process.h
purple/libpurple/protocols/qq/qq_trans.c
purple/libpurple/protocols/qq/qq_trans.h
purple/libpurple/protocols/qq/send_file.c
purple/libpurple/protocols/qq/send_file.h
purple/libpurple/protocols/qq/utils.c
purple/libpurple/protocols/qq/utils.h
purple/libpurple/protocols/sametime/Makefile.in
purple/libpurple/protocols/sametime/meanwhile/channel.c
purple/libpurple/protocols/sametime/meanwhile/cipher.c
purple/libpurple/protocols/sametime/meanwhile/common.c
purple/libpurple/protocols/sametime/meanwhile/error.c
purple/libpurple/protocols/sametime/meanwhile/message.c
purple/libpurple/protocols/sametime/meanwhile/mpi/mpi-config.h
purple/libpurple/protocols/sametime/meanwhile/mpi/mpi-types.h
purple/libpurple/protocols/sametime/meanwhile/mpi/mpi.c
purple/libpurple/protocols/sametime/meanwhile/mpi/mpi.h
purple/libpurple/protocols/sametime/meanwhile/mw_channel.h
purple/libpurple/protocols/sametime/meanwhile/mw_cipher.h
purple/libpurple/protocols/sametime/meanwhile/mw_common.h
purple/libpurple/protocols/sametime/meanwhile/mw_debug.c
purple/libpurple/protocols/sametime/meanwhile/mw_debug.h
purple/libpurple/protocols/sametime/meanwhile/mw_error.h
purple/libpurple/protocols/sametime/meanwhile/mw_message.h
purple/libpurple/protocols/sametime/meanwhile/mw_service.h
purple/libpurple/protocols/sametime/meanwhile/mw_session.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_aware.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_conf.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_dir.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_ft.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_im.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_place.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_resolve.h
purple/libpurple/protocols/sametime/meanwhile/mw_srvc_store.h
purple/libpurple/protocols/sametime/meanwhile/mw_st_list.h
purple/libpurple/protocols/sametime/meanwhile/mw_util.c
purple/libpurple/protocols/sametime/meanwhile/mw_util.h
purple/libpurple/protocols/sametime/meanwhile/service.c
purple/libpurple/protocols/sametime/meanwhile/session.c
purple/libpurple/protocols/sametime/meanwhile/srvc_aware.c
purple/libpurple/protocols/sametime/meanwhile/srvc_conf.c
purple/libpurple/protocols/sametime/meanwhile/srvc_dir.c
purple/libpurple/protocols/sametime/meanwhile/srvc_ft.c
purple/libpurple/protocols/sametime/meanwhile/srvc_im.c
purple/libpurple/protocols/sametime/meanwhile/srvc_place.c
purple/libpurple/protocols/sametime/meanwhile/srvc_resolve.c
purple/libpurple/protocols/sametime/meanwhile/srvc_store.c
purple/libpurple/protocols/sametime/meanwhile/st_list.c
purple/libpurple/protocols/sametime/sametime.c
purple/libpurple/protocols/sametime/sametime.h
purple/libpurple/protocols/simple/Makefile.in
purple/libpurple/protocols/simple/simple.c
purple/libpurple/protocols/simple/simple.h
purple/libpurple/protocols/simple/sipmsg.c
purple/libpurple/protocols/simple/sipmsg.h
purple/libpurple/protocols/xpcomModule.cpp.in
purple/libpurple/protocols/yahoo/Makefile.in
purple/libpurple/protocols/yahoo/libyahoo.c
purple/libpurple/protocols/yahoo/libyahoojp.c
purple/libpurple/protocols/yahoo/libymsg.c
purple/libpurple/protocols/yahoo/libymsg.h
purple/libpurple/protocols/yahoo/util.c
purple/libpurple/protocols/yahoo/yahoo_aliases.c
purple/libpurple/protocols/yahoo/yahoo_aliases.h
purple/libpurple/protocols/yahoo/yahoo_doodle.c
purple/libpurple/protocols/yahoo/yahoo_doodle.h
purple/libpurple/protocols/yahoo/yahoo_filexfer.c
purple/libpurple/protocols/yahoo/yahoo_filexfer.h
purple/libpurple/protocols/yahoo/yahoo_friend.c
purple/libpurple/protocols/yahoo/yahoo_friend.h
purple/libpurple/protocols/yahoo/yahoo_packet.c
purple/libpurple/protocols/yahoo/yahoo_packet.h
purple/libpurple/protocols/yahoo/yahoo_picture.c
purple/libpurple/protocols/yahoo/yahoo_picture.h
purple/libpurple/protocols/yahoo/yahoo_profile.c
purple/libpurple/protocols/yahoo/yahoochat.c
purple/libpurple/protocols/yahoo/yahoochat.h
purple/libpurple/protocols/yahoo/ycht.c
purple/libpurple/protocols/yahoo/ycht.h
purple/libpurple/proxy.c
purple/libpurple/proxy.h
purple/libpurple/prpl.c
purple/libpurple/prpl.h
purple/libpurple/purple-prefs.js
purple/libpurple/request.c
purple/libpurple/request.h
purple/libpurple/roomlist.c
purple/libpurple/roomlist.h
purple/libpurple/server.c
purple/libpurple/server.h
purple/libpurple/signals.c
purple/libpurple/signals.h
purple/libpurple/smiley.c
purple/libpurple/smiley.h
purple/libpurple/ssl-nss.c
purple/libpurple/sslconn.c
purple/libpurple/sslconn.h
purple/libpurple/status.c
purple/libpurple/status.h
purple/libpurple/stringref.c
purple/libpurple/stringref.h
purple/libpurple/stun.c
purple/libpurple/stun.h
purple/libpurple/upnp.c
purple/libpurple/upnp.h
purple/libpurple/util.c
purple/libpurple/util.h
purple/libpurple/value.c
purple/libpurple/value.h
purple/libpurple/version.c
purple/libpurple/version.h.in
purple/libpurple/whiteboard.c
purple/libpurple/whiteboard.h
purple/libpurple/win32/libc_interface.c
purple/libpurple/win32/libc_interface.h
purple/libpurple/win32/libc_internal.h
purple/libpurple/win32/win32dep.c
purple/libpurple/win32/win32dep.h
purple/libpurple/win32/wpurpleerror.h
purple/libpurple/xmlnode.c
purple/libpurple/xmlnode.h
purple/libraries/glib/Makefile.in
purple/libraries/glib/config.h
purple/libraries/glib/dirent-win32.h
purple/libraries/glib/dirent.c
purple/libraries/glib/galias.h
purple/libraries/glib/galiasdef.c
purple/libraries/glib/galloca.h
purple/libraries/glib/garray.c
purple/libraries/glib/garray.h
purple/libraries/glib/gasyncqueue.h
purple/libraries/glib/gatomic.c
purple/libraries/glib/gatomic.h
purple/libraries/glib/gbacktrace.h
purple/libraries/glib/gbase64.c
purple/libraries/glib/gbase64.h
purple/libraries/glib/gbookmarkfile.h
purple/libraries/glib/gcache.h
purple/libraries/glib/gchecksum.c
purple/libraries/glib/gchecksum.h
purple/libraries/glib/gcompletion.h
purple/libraries/glib/gconvert.c
purple/libraries/glib/gconvert.h
purple/libraries/glib/gdataset.c
purple/libraries/glib/gdataset.h
purple/libraries/glib/gdatasetprivate.h
purple/libraries/glib/gdate.c
purple/libraries/glib/gdate.h
purple/libraries/glib/gdebug.h
purple/libraries/glib/gdir.c
purple/libraries/glib/gdir.h
purple/libraries/glib/gerror.c
purple/libraries/glib/gerror.h
purple/libraries/glib/gfileutils.c
purple/libraries/glib/gfileutils.h
purple/libraries/glib/ghash.c
purple/libraries/glib/ghash.h
purple/libraries/glib/ghook.c
purple/libraries/glib/ghook.h
purple/libraries/glib/giochannel.h
purple/libraries/glib/gkeyfile.h
purple/libraries/glib/glib-object.h
purple/libraries/glib/glib-wince.def
purple/libraries/glib/glib.h
purple/libraries/glib/glib.symbols
purple/libraries/glib/glibconfig.h
purple/libraries/glib/glibintl.h
purple/libraries/glib/glist.c
purple/libraries/glib/glist.h
purple/libraries/glib/gmacros.h
purple/libraries/glib/gmain.c
purple/libraries/glib/gmain.h
purple/libraries/glib/gmappedfile.h
purple/libraries/glib/gmarkup.c
purple/libraries/glib/gmarkup.h
purple/libraries/glib/gmem.c
purple/libraries/glib/gmem.h
purple/libraries/glib/gmessages.c
purple/libraries/glib/gmessages.h
purple/libraries/glib/gmirroringtable.h
purple/libraries/glib/gnode.h
purple/libraries/glib/gnulib/asnprintf.c
purple/libraries/glib/gnulib/g-gnulib.h
purple/libraries/glib/gnulib/printf-args.c
purple/libraries/glib/gnulib/printf-args.h
purple/libraries/glib/gnulib/printf-parse.c
purple/libraries/glib/gnulib/printf-parse.h
purple/libraries/glib/gnulib/printf.c
purple/libraries/glib/gnulib/printf.h
purple/libraries/glib/gnulib/vasnprintf.c
purple/libraries/glib/gnulib/vasnprintf.h
purple/libraries/glib/gobject.symbols
purple/libraries/glib/gobject/gboxed.c
purple/libraries/glib/gobject/gboxed.h
purple/libraries/glib/gobject/gbsearcharray.h
purple/libraries/glib/gobject/gclosure.c
purple/libraries/glib/gobject/gclosure.h
purple/libraries/glib/gobject/genums.c
purple/libraries/glib/gobject/genums.h
purple/libraries/glib/gobject/gmarshal.h
purple/libraries/glib/gobject/gobject.c
purple/libraries/glib/gobject/gobject.h
purple/libraries/glib/gobject/gobjectalias.h
purple/libraries/glib/gobject/gobjectaliasdef.c
purple/libraries/glib/gobject/gobjectnotifyqueue.c
purple/libraries/glib/gobject/gparam.c
purple/libraries/glib/gobject/gparam.h
purple/libraries/glib/gobject/gparamspecs.c
purple/libraries/glib/gobject/gparamspecs.h
purple/libraries/glib/gobject/gsignal.c
purple/libraries/glib/gobject/gsignal.h
purple/libraries/glib/gobject/gsourceclosure.h
purple/libraries/glib/gobject/gtype.c
purple/libraries/glib/gobject/gtype.h
purple/libraries/glib/gobject/gtypemodule.c
purple/libraries/glib/gobject/gtypemodule.h
purple/libraries/glib/gobject/gtypeplugin.c
purple/libraries/glib/gobject/gtypeplugin.h
purple/libraries/glib/gobject/gvalue.c
purple/libraries/glib/gobject/gvalue.h
purple/libraries/glib/gobject/gvaluearray.c
purple/libraries/glib/gobject/gvaluearray.h
purple/libraries/glib/gobject/gvaluecollector.h
purple/libraries/glib/gobject/gvaluetransform.c
purple/libraries/glib/gobject/gvaluetypes.c
purple/libraries/glib/gobject/gvaluetypes.h
purple/libraries/glib/goption.h
purple/libraries/glib/gpattern.c
purple/libraries/glib/gpattern.h
purple/libraries/glib/gprimes.c
purple/libraries/glib/gprimes.h
purple/libraries/glib/gprintf.c
purple/libraries/glib/gprintf.h
purple/libraries/glib/gprintfint.h
purple/libraries/glib/gqsort.c
purple/libraries/glib/gqsort.h
purple/libraries/glib/gquark.h
purple/libraries/glib/gqueue.c
purple/libraries/glib/gqueue.h
purple/libraries/glib/grand.c
purple/libraries/glib/grand.h
purple/libraries/glib/gregex.h
purple/libraries/glib/grel.h
purple/libraries/glib/gscanner.c
purple/libraries/glib/gscanner.h
purple/libraries/glib/gscripttable.h
purple/libraries/glib/gsequence.h
purple/libraries/glib/gshell.c
purple/libraries/glib/gshell.h
purple/libraries/glib/gslice.c
purple/libraries/glib/gslice.h
purple/libraries/glib/gslist.c
purple/libraries/glib/gslist.h
purple/libraries/glib/gstdio.c
purple/libraries/glib/gstdio.h
purple/libraries/glib/gstrfuncs.c
purple/libraries/glib/gstrfuncs.h
purple/libraries/glib/gstring.c
purple/libraries/glib/gstring.h
purple/libraries/glib/gtestutils.h
purple/libraries/glib/gthread-impl.c
purple/libraries/glib/gthread-win32.c
purple/libraries/glib/gthread.c
purple/libraries/glib/gthread.h
purple/libraries/glib/gthreadpool.h
purple/libraries/glib/gthreadprivate.h
purple/libraries/glib/gtimer.h
purple/libraries/glib/gtree.h
purple/libraries/glib/gtypes.h
purple/libraries/glib/gunichartables.h
purple/libraries/glib/gunicode.h
purple/libraries/glib/gunicodeprivate.h
purple/libraries/glib/gunicollate.c
purple/libraries/glib/gunicomp.h
purple/libraries/glib/gunidecomp.c
purple/libraries/glib/gunidecomp.h
purple/libraries/glib/guniprop.c
purple/libraries/glib/gurifuncs.h
purple/libraries/glib/gutf8.c
purple/libraries/glib/gutils.c
purple/libraries/glib/gutils.h
purple/libraries/glib/gwin32.c
purple/libraries/glib/gwin32.h
purple/libraries/glib/libcharset/libcharset.h
purple/libraries/glib/libcharset/localcharset.c
purple/libraries/glib/module.ver
purple/libraries/glib/wdirent.c
purple/libraries/glib/win_iconv.c
purple/libraries/glib/wince-stat.h
purple/libraries/glib/wince.c
purple/libraries/glib/wince.h
purple/libraries/xml2/Copyright
purple/libraries/xml2/HTMLparser.h
purple/libraries/xml2/HTMLtree.h
purple/libraries/xml2/Makefile.in
purple/libraries/xml2/SAX.h
purple/libraries/xml2/SAX2.c
purple/libraries/xml2/SAX2.h
purple/libraries/xml2/chvalid.c
purple/libraries/xml2/chvalid.h
purple/libraries/xml2/config.h
purple/libraries/xml2/debugXML.h
purple/libraries/xml2/dict.c
purple/libraries/xml2/dict.h
purple/libraries/xml2/elfgcchack.h
purple/libraries/xml2/encoding.c
purple/libraries/xml2/encoding.h
purple/libraries/xml2/entities.c
purple/libraries/xml2/entities.h
purple/libraries/xml2/error.c
purple/libraries/xml2/globals.c
purple/libraries/xml2/globals.h
purple/libraries/xml2/hash.c
purple/libraries/xml2/hash.h
purple/libraries/xml2/libxml.h
purple/libraries/xml2/list.c
purple/libraries/xml2/list.h
purple/libraries/xml2/module.ver
purple/libraries/xml2/nanoftp.h
purple/libraries/xml2/nanohttp.h
purple/libraries/xml2/parser.c
purple/libraries/xml2/parser.h
purple/libraries/xml2/parserInternals.c
purple/libraries/xml2/parserInternals.h
purple/libraries/xml2/threads.c
purple/libraries/xml2/threads.h
purple/libraries/xml2/tree.c
purple/libraries/xml2/tree.h
purple/libraries/xml2/uri.c
purple/libraries/xml2/uri.h
purple/libraries/xml2/valid.c
purple/libraries/xml2/valid.h
purple/libraries/xml2/wincecompat.c
purple/libraries/xml2/wincecompat.h
purple/libraries/xml2/xlink.h
purple/libraries/xml2/xmlIO.c
purple/libraries/xml2/xmlIO.h
purple/libraries/xml2/xmlautomata.h
purple/libraries/xml2/xmlerror.h
purple/libraries/xml2/xmlexports.h
purple/libraries/xml2/xmlmemory.c
purple/libraries/xml2/xmlmemory.h
purple/libraries/xml2/xmlregexp.h
purple/libraries/xml2/xmlstring.c
purple/libraries/xml2/xmlstring.h
purple/libraries/xml2/xmlversion.h
purple/locales/Makefile.in
purple/locales/en-US/bonjour.properties
purple/locales/en-US/gg.properties
purple/locales/en-US/jabber.properties
purple/locales/en-US/msn.properties
purple/locales/en-US/myspace.properties
purple/locales/en-US/novell.properties
purple/locales/en-US/oscar.properties
purple/locales/en-US/purple.properties
purple/locales/en-US/qq.properties
purple/locales/en-US/sametime.properties
purple/locales/en-US/simple.properties
purple/locales/en-US/yahoo.properties
purple/locales/jar.mn
purple/makefiles.sh
purple/purplexpcom/public/Makefile.in
purple/purplexpcom/public/purpleICoreService.idl
purple/purplexpcom/public/purpleIPlugin.idl
purple/purplexpcom/public/purpleIProxy.idl
purple/purplexpcom/src/Makefile.in
purple/purplexpcom/src/module.ver.in
purple/purplexpcom/src/prpl.manifest
purple/purplexpcom/src/purpleAccount.cpp
purple/purplexpcom/src/purpleAccount.h
purple/purplexpcom/src/purpleAccountBuddy.cpp
purple/purplexpcom/src/purpleAccountBuddy.h
purple/purplexpcom/src/purpleAccountScoper.cpp
purple/purplexpcom/src/purpleAccountScoper.h
purple/purplexpcom/src/purpleConvChat.cpp
purple/purplexpcom/src/purpleConvChat.h
purple/purplexpcom/src/purpleConvChatBuddy.cpp
purple/purplexpcom/src/purpleConvChatBuddy.h
purple/purplexpcom/src/purpleConvIM.cpp
purple/purplexpcom/src/purpleConvIM.h
purple/purplexpcom/src/purpleConversation.cpp
purple/purplexpcom/src/purpleConversation.h
purple/purplexpcom/src/purpleCoreService.cpp
purple/purplexpcom/src/purpleCoreService.h
purple/purplexpcom/src/purpleDNS.cpp
purple/purplexpcom/src/purpleDNS.h
purple/purplexpcom/src/purpleDebug.cpp
purple/purplexpcom/src/purpleDebug.h
purple/purplexpcom/src/purpleGListEnumerator.cpp
purple/purplexpcom/src/purpleGListEnumerator.h
purple/purplexpcom/src/purpleGetText.cpp
purple/purplexpcom/src/purpleGetText.h
purple/purplexpcom/src/purpleInit.cpp
purple/purplexpcom/src/purpleInitAccounts.cpp
purple/purplexpcom/src/purpleInitCommands.cpp
purple/purplexpcom/src/purpleInitContacts.cpp
purple/purplexpcom/src/purpleInitConv.cpp
purple/purplexpcom/src/purpleMessage.cpp
purple/purplexpcom/src/purpleMessage.h
purple/purplexpcom/src/purpleModule.cpp
purple/purplexpcom/src/purpleNetwork.cpp
purple/purplexpcom/src/purpleNetwork.h
purple/purplexpcom/src/purplePref.cpp
purple/purplexpcom/src/purplePref.h
purple/purplexpcom/src/purpleProtocol.cpp
purple/purplexpcom/src/purpleProtocol.h
purple/purplexpcom/src/purpleProxy.cpp
purple/purplexpcom/src/purpleProxy.h
purple/purplexpcom/src/purpleProxyInfo.cpp
purple/purplexpcom/src/purpleProxyInfo.h
purple/purplexpcom/src/purpleSockets.cpp
purple/purplexpcom/src/purpleSockets.h
purple/purplexpcom/src/purpleStorage.cpp
purple/purplexpcom/src/purpleStorage.h
purple/purplexpcom/src/purpleTimer.cpp
purple/purplexpcom/src/purpleTimer.h
purple/purplexpcom/src/purpleTooltipInfo.cpp
purple/purplexpcom/src/purpleTooltipInfo.h
purple/purplexpcom/src/test/test_purplexpcom.js
purple/purplexpcom/src/test/xpcshell.ini
purple/upgrade-libpurple.sh
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,16 +1,17 @@
 dnl
 dnl Local autoconf macros used with mozilla
 dnl The contents of this file are under the Public Domain.
 dnl
 
 builtin(include, mozilla/build/autoconf/toolchain.m4)dnl
 builtin(include, mozilla/build/autoconf/ccache.m4)dnl
 builtin(include, mozilla/build/autoconf/config.status.m4)dnl
+builtin(include, build/autoconf/glib.m4)dnl
 builtin(include, mozilla/build/autoconf/nspr.m4)dnl
 builtin(include, mozilla/build/autoconf/nss.m4)dnl
 builtin(include, mozilla/build/autoconf/pkg.m4)dnl
 builtin(include, mozilla/build/autoconf/codeset.m4)dnl
 builtin(include, mozilla/build/autoconf/altoptions.m4)dnl
 builtin(include, mozilla/build/autoconf/mozprog.m4)dnl
 builtin(include, mozilla/build/autoconf/acwinpaths.m4)dnl
 builtin(include, mozilla/build/autoconf/lto.m4)dnl
new file mode 100644
--- /dev/null
+++ b/build/autoconf/glib.m4
@@ -0,0 +1,200 @@
+# Configure paths for GLIB
+# Owen Taylor     97-11-3
+
+dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or 
+dnl gthread is specified in MODULES, pass to glib-config
+dnl
+AC_DEFUN([AM_PATH_GLIB],
+[dnl 
+dnl Get the cflags and libraries from the glib-config script
+dnl
+AC_ARG_WITH(glib-prefix,[  --with-glib-prefix=PFX  Prefix where GLIB is installed (optional)],
+            glib_config_prefix="$withval", glib_config_prefix="")
+AC_ARG_WITH(glib-exec-prefix,[  --with-glib-exec-prefix=PFX
+                          Exec prefix where GLIB is installed (optional)],
+            glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
+AC_ARG_ENABLE(glibtest, [  --disable-glibtest      Do not try to compile and run a test GLIB program],
+		    , enable_glibtest=yes)
+
+  if test x$glib_config_exec_prefix != x ; then
+     glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
+     fi
+  fi
+  if test x$glib_config_prefix != x ; then
+     glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_prefix/bin/glib-config
+     fi
+  fi
+
+  for module in . $4
+  do
+      case "$module" in
+         gmodule) 
+             glib_config_args="$glib_config_args gmodule"
+         ;;
+         gthread) 
+             glib_config_args="$glib_config_args gthread"
+         ;;
+      esac
+  done
+
+  dnl Force a version check to keep upgraded versions from being overridden by the cached value.
+  unset ac_cv_path_GLIB_CONFIG
+
+  AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
+  min_glib_version=ifelse([$1], ,0.99.7,$1)
+  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+  no_glib=""
+  if test "$GLIB_CONFIG" = "no" ; then
+    no_glib=yes
+  else
+    GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
+    GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
+    glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of glib-config to some extent
+dnl
+      rm -f conf.glibtest
+      AC_TRY_RUN([
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.glibtest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_glib_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If glib-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH environment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
+      printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+	   (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+	     GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
+        printf("*** correct copy of glib-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GLIB_CONFIG" = "no" ; then
+       echo "*** The glib-config script installed by GLIB could not be found"
+       echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GLIB_CONFIG environment variable to the"
+       echo "*** full path to glib-config."
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          AC_TRY_LINK([
+#include <glib.h>
+#include <stdio.h>
+],      [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occurred. This usually means GLIB was incorrectly installed"
+          echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
+          echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GLIB_CFLAGS)
+  AC_SUBST(GLIB_LIBS)
+  rm -f conf.glibtest
+])
--- a/configure.in
+++ b/configure.in
@@ -1641,16 +1641,21 @@ case "$host" in
     ;;
 
 *)
     HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
     ;;
 esac
 
+dnl Get version of libpurple from the version files.
+PURPLE_MAJOR_VERSION=`cat $topsrcdir/purple/config/version.txt |cut -d '.' -f 1`
+PURPLE_MINOR_VERSION=`cat $topsrcdir/purple/config/version.txt |cut -d '.' -f 2`
+PURPLE_MICRO_VERSION=`cat $topsrcdir/purple/config/version.txt |cut -d '.' -f 3`
+
 dnl We require version 2.5 or newer of Python to build.
 AC_MSG_CHECKING([for minimum required Python version >= $PYTHON_VERSION])
 changequote(,)
 $PYTHON -c "import sys; sys.exit(sys.version[:3] < sys.argv[1])" $PYTHON_VERSION
 _python_res=$?
 changequote([,])
 if test "$_python_res" != 0; then
     AC_MSG_ERROR([Python $PYTHON_VERSION or higher is required.])
@@ -6371,27 +6376,121 @@ MOZ_ARG_ENABLE_BOOL(incomplete-external-
     MOZ_INCOMPLETE_EXTERNAL_LINKAGE=1,
     MOZ_INCOMPLETE_EXTERNAL_LINKAGE= )
 
 export MOZ_INCOMPLETE_EXTERNAL_LINKAGE
 AC_SUBST(MOZ_INCOMPLETE_EXTERNAL_LINKAGE)
 
 dnl ========================================================
 dnl =
+dnl = Libpurple related checks
+dnl =
+dnl ========================================================
+
+dnl ========================================================
+dnl Check for libxml2.
+dnl ========================================================
+if test "${OS_TARGET}" = "Linux"; then
+    PKG_CHECK_MODULES(LIBXML2, libxml-2.0)
+
+    AC_SUBST(LIBXML2_CFLAGS)
+    AC_SUBST(LIBXML2_LIBS)
+fi
+
+_SAVE_LIBS="$LIBS"
+LIBS=
+
+AC_CHECK_HEADERS(arpa/nameser_compat.h)
+AC_CHECK_FUNCS(inet_ntop)
+
+# AC_CHECK_SIZEOF() doesn't include <time.h>.
+AC_MSG_CHECKING(size of time_t)
+AC_CACHE_VAL(ac_cv_sizeof_time_t,
+[AC_TRY_RUN([#include <stdio.h>
+#include <time.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(time_t));
+  exit(0);
+}],
+ac_cv_sizeof_time_t=`cat conftestval`,
+ac_cv_sizeof_time_t=0,
+ac_cv_sizeof_time_t=4)
+])
+AC_MSG_RESULT($ac_cv_sizeof_time_t)
+AC_DEFINE_UNQUOTED(SIZEOF_TIME_T, $ac_cv_sizeof_time_t,
+[The number of bytes in a time_t.])
+
+# equivalent of AC_VAR_TIMEZONE_EXTERNALS
+AC_CACHE_CHECK(for timezone external, ac_cv_var_timezone,
+    AC_TRY_LINK([#include <time.h>], [return (int)timezone;],
+                ac_cv_var_timezone=yes, ac_cv_var_timezone=no))
+if test $ac_cv_var_timezone = yes; then
+    AC_DEFINE(HAVE_TIMEZONE)
+fi
+
+AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
+    AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff = 1;],
+                   ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no))
+if test $ac_cv_struct_tm_gmtoff = yes; then
+    AC_DEFINE(HAVE_TM_GMTOFF)
+fi
+
+LIBS="$_SAVE_LIBS"
+
+STATIC_PRPLS="gg oscar msn myspace novell sametime simple yahoo netsoul"
+
+MOZ_ARG_ENABLE_BOOL(purple-plugins,
+[  --enable-purple-plugins      Enable usage of system libpurple plugins],
+    PURPLE_PLUGINS=1,
+    PURPLE_PLUGINS= )
+AC_SUBST(PURPLE_PLUGINS)
+
+dnl =========================================================
+dnl = Bonjour
+dnl =========================================================
+PURPLE_BONJOUR=1
+MOZ_ARG_DISABLE_BOOL(bonjour,
+[  --disable-bonjour          Disable Bonjour protocol support],
+    PURPLE_BONJOUR=)
+
+if test "$PURPLE_BONJOUR"; then
+    case "$OS_TARGET" in
+        WINNT|Darwin)
+            dnl =========================================================
+            dnl = Bonjour SDK should be installed on Mac OS X, we provide the
+            dnl = header for Windows
+            dnl =========================================================
+            STATIC_PRPLS="$STATIC_PRPLS bonjour"
+            ;;
+        *)
+            PURPLE_BONJOUR=
+            ;;
+    esac
+fi
+AC_SUBST(PURPLE_BONJOUR)
+AC_SUBST(STATIC_PRPLS)
+
+dnl ========================================================
+dnl =
 dnl = Standalone module options
 dnl = 
 dnl ========================================================
 MOZ_ARG_HEADER(Standalone module options (Not for building Mozilla))
 
 dnl Check for GLib.
 dnl ========================================================
 if test -z "$SKIP_PATH_CHECKS"; then
 if test -z "${GLIB_CFLAGS}" -o -z "${GLIB_LIBS}" ; then
     if test "$MOZ_ENABLE_GTK2" -o "$MOZ_ENABLE_QT" -o "$USE_ELF_DYNSTR_GC" ; then
         PKG_CHECK_MODULES(GLIB, glib-2.0 >= 1.3.7 gobject-2.0)
+    else
+        AM_PATH_GLIB(${GLIB_VERSION})
     fi
 fi
 fi
 
 if test -z "${GLIB_GMODULE_LIBS}" -a -n "${GLIB_CONFIG}"; then
     GLIB_GMODULE_LIBS=`$GLIB_CONFIG gmodule --libs`
 fi
 
@@ -6749,16 +6848,20 @@ AC_SUBST(MOZ_APP_DISPLAYNAME)
 AC_SUBST(MOZ_APP_VERSION)
 AC_SUBST(MOZ_APP_MAXVERSION)
 AC_SUBST(MAR_CHANNEL_ID)
 AC_SUBST(ACCEPTED_MAR_CHANNEL_IDS)
 AC_SUBST(FIREFOX_VERSION)
 AC_SUBST(THUNDERBIRD_VERSION)
 AC_SUBST(SUNBIRD_VERSION)
 AC_SUBST(SEAMONKEY_VERSION)
+AC_SUBST(INSTANTBIRD_VERSION)
+AC_SUBST(PURPLE_MAJOR_VERSION)
+AC_SUBST(PURPLE_MINOR_VERSION)
+AC_SUBST(PURPLE_MICRO_VERSION)
 
 AC_SUBST(MOZ_PKG_SPECIAL)
 
 AC_SUBST(MAIL_PKG_SHARED)
 
 AC_SUBST(MOZILLA_OFFICIAL)
 
 dnl win32 options
--- a/mail/build.mk
+++ b/mail/build.mk
@@ -42,19 +42,19 @@ endif
 tier_app_dirs += $(MOZ_BRANDING_DIRECTORY)
 
 ifdef MOZ_CALENDAR
 tier_app_dirs += calendar/lightning
 endif
 
 tier_app_dirs += \
 	chat \
+	purple \
 	mail \
 	$(NULL)
-#	purple instantbird
 
 installer:
 	@$(MAKE) -C mail/installer installer
 
 package:
 	@$(MAKE) -C mail/installer
 
 package-compare:
--- a/mail/installer/package-manifest.in
+++ b/mail/installer/package-manifest.in
@@ -73,21 +73,16 @@
 #elif _MSC_VER == 1700
 @BINPATH@/msvcp110.dll
 @BINPATH@/msvcr110.dll
 #endif
 #endif
 @BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@
 @BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@
 #ifdef XP_MACOSX
-@BINPATH@/XUL
-#else
-@BINPATH@/@DLL_PREFIX@xul@DLL_SUFFIX@
-#endif
-#ifdef XP_MACOSX
 @BINPATH@/@MOZ_CHILD_PROCESS_NAME@.app/
 @BINPATH@/@DLL_PREFIX@plugin_child_interpose@DLL_SUFFIX@
 #else
 @BINPATH@/@MOZ_CHILD_PROCESS_NAME@
 #endif
 ; ANGLE GLES-on-D3D rendering library
 #ifdef MOZ_ANGLE
 @BINPATH@/libEGL.dll
@@ -325,16 +320,19 @@
 @BINPATH@/nsldappr32v60@DLL_SUFFIX@
 @BINPATH@/nsldif32v60@DLL_SUFFIX@
 #else
 @BINPATH@/@DLL_PREFIX@ldap60@DLL_SUFFIX@
 @BINPATH@/@DLL_PREFIX@ldif60@DLL_SUFFIX@
 @BINPATH@/@DLL_PREFIX@prldap60@DLL_SUFFIX@
 #endif
 
+; purplexpcom
+@BINPATH@/components/@DLL_PREFIX@purplexpcom@DLL_SUFFIX@
+
 ; login manager
 @BINPATH@/components/loginmgr.xpt
 @BINPATH@/components/nsLoginInfo.js
 @BINPATH@/components/nsLoginManager.js
 @BINPATH@/components/nsLoginManagerPrompter.js
 @BINPATH@/components/passwordmgr.manifest
 @BINPATH@/components/storage-Legacy.js
 @BINPATH@/components/storage-mozStorage.js
--- a/mail/makefiles.sh
+++ b/mail/makefiles.sh
@@ -39,9 +39,10 @@ mail/themes/Makefile
 mail/themes/gnomestripe/Makefile
 mail/themes/pinstripe/Makefile
 mail/themes/qute/Makefile
 $MOZ_BRANDING_DIRECTORY/Makefile
 $MOZ_BRANDING_DIRECTORY/locales/Makefile
 "
 
 . "${srcdir}/chat/makefiles.sh"
+. "${srcdir}/purple/makefiles.sh"
 fi
new file mode 100644
--- /dev/null
+++ b/purple/Makefile.in
@@ -0,0 +1,26 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH		= ..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+ifneq (,$(filter WINNT WINCE Darwin,$(OS_ARCH)))
+PARALLEL_DIRS	= \
+		libraries/xml2 \
+		libraries/glib \
+		$(NULL)
+endif
+
+DIRS		+= \
+		libpurple \
+		purplexpcom/public \
+		purplexpcom/src \
+		locales \
+		$(NULL)
+
+include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/purple/config/version.txt
@@ -0,0 +1,1 @@
+2.10.4
new file mode 100644
--- /dev/null
+++ b/purple/jar.mn
@@ -0,0 +1,68 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+purple.jar:
+% skin prpl-aim classic/1.0 %skin/classic/prpl/aim/
+	skin/classic/prpl/aim/icon32.png	(icons/prpl-aim-32.png)
+	skin/classic/prpl/aim/icon48.png	(icons/prpl-aim-48.png)
+	skin/classic/prpl/aim/icon.png		(icons/prpl-aim.png)
+% skin prpl-bonjour classic/1.0 %skin/classic/prpl/bonjour/
+	skin/classic/prpl/bonjour/icon32.png	(icons/prpl-bonjour-32.png)
+	skin/classic/prpl/bonjour/icon48.png	(icons/prpl-bonjour-48.png)
+	skin/classic/prpl/bonjour/icon.png	(icons/prpl-bonjour.png)
+% skin prpl-gg classic/1.0 %skin/classic/prpl/gg/
+	skin/classic/prpl/gg/icon32.png		(icons/prpl-gg-32.png)
+	skin/classic/prpl/gg/icon48.png		(icons/prpl-gg-48.png)
+	skin/classic/prpl/gg/icon.png		(icons/prpl-gg.png)
+% skin prpl-icq classic/1.0 %skin/classic/prpl/icq/
+	skin/classic/prpl/icq/icon32.png	(icons/prpl-icq-32.png)
+	skin/classic/prpl/icq/icon48.png	(icons/prpl-icq-48.png)
+	skin/classic/prpl/icq/icon.png		(icons/prpl-icq.png)
+% skin prpl-msn classic/1.0 %skin/classic/prpl/msn/
+	skin/classic/prpl/msn/icon32.png	(icons/prpl-msn-32.png)
+	skin/classic/prpl/msn/icon48.png	(icons/prpl-msn-48.png)
+	skin/classic/prpl/msn/icon.png		(icons/prpl-msn.png)
+% skin prpl-myspace classic/1.0 %skin/classic/prpl/myspace/
+	skin/classic/prpl/myspace/icon32.png	(icons/prpl-myspace-32.png)
+	skin/classic/prpl/myspace/icon48.png	(icons/prpl-myspace-48.png)
+	skin/classic/prpl/myspace/icon.png	(icons/prpl-myspace.png)
+% skin prpl-novell classic/1.0 %skin/classic/prpl/novell/
+	skin/classic/prpl/novell/icon32.png	(icons/prpl-novell-32.png)
+	skin/classic/prpl/novell/icon48.png	(icons/prpl-novell-48.png)
+	skin/classic/prpl/novell/icon.png	(icons/prpl-novell.png)
+% skin prpl-qq classic/1.0 %skin/classic/prpl/qq/
+	skin/classic/prpl/qq/icon32.png		(icons/prpl-qq-32.png)
+	skin/classic/prpl/qq/icon48.png		(icons/prpl-qq-48.png)
+	skin/classic/prpl/qq/icon.png		(icons/prpl-qq.png)
+% skin prpl-meanwhile classic/1.0 %skin/classic/prpl/meanwhile/
+	skin/classic/prpl/meanwhile/icon32.png	(icons/prpl-meanwhile-32.png)
+	skin/classic/prpl/meanwhile/icon48.png	(icons/prpl-meanwhile-48.png)
+	skin/classic/prpl/meanwhile/icon.png	(icons/prpl-meanwhile.png)
+% skin prpl-simple classic/1.0 %skin/classic/prpl/simple/
+	skin/classic/prpl/simple/icon32.png	(icons/prpl-simple-32.png)
+	skin/classic/prpl/simple/icon48.png	(icons/prpl-simple-48.png)
+	skin/classic/prpl/simple/icon.png	(icons/prpl-simple.png)
+% skin prpl-yahoo classic/1.0 %skin/classic/prpl/yahoo/
+% skin prpl-yahoojp classic/1.0 %skin/classic/prpl/yahoo/
+	skin/classic/prpl/yahoo/icon32.png	(icons/prpl-yahoo-32.png)
+	skin/classic/prpl/yahoo/icon48.png	(icons/prpl-yahoo-48.png)
+	skin/classic/prpl/yahoo/icon.png	(icons/prpl-yahoo.png)
+% skin prpl-bilboed-netsoul classic/1.0 %skin/classic/prpl/bilboed-netsoul/
+	skin/classic/prpl/bilboed-netsoul/icon32.png	(icons/prpl-bilboed-netsoul-32.png)
+	skin/classic/prpl/bilboed-netsoul/icon48.png	(icons/prpl-bilboed-netsoul-48.png)
+	skin/classic/prpl/bilboed-netsoul/icon.png	(icons/prpl-bilboed-netsoul.png)
+#if 0
+% skin prpl-silc classic/1.0 %skin/classic/prpl/silc/
+	skin/classic/prpl/silc/icon32.png	(icons/prpl-silc-32.png)
+	skin/classic/prpl/silc/icon48.png	(icons/prpl-silc-48.png)
+	skin/classic/prpl/silc/icon.png		(icons/prpl-silc.png)
+% skin prpl-zephyr classic/1.0 %skin/classic/prpl/zephyr/
+	skin/classic/prpl/zephyr/icon32.png	(icons/prpl-zephyr-32.png)
+	skin/classic/prpl/zephyr/icon48.png	(icons/prpl-zephyr-48.png)
+	skin/classic/prpl/zephyr/icon.png	(icons/prpl-zephyr.png)
+#endif
+#ifdef DEBUG
+chat.jar:
+% skin prpl-null classic/1.0 %skin/classic/chat/prpl-generic/
+#endif
new file mode 100644
--- /dev/null
+++ b/purple/libpurple/Makefile.in
@@ -0,0 +1,244 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH		= ../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE		= libpurple
+EXPORTS_NAMESPACES= libpurple
+LIBRARY_NAME	= purple
+FORCE_STATIC_LIB= 1
+LIB_IS_C_ONLY	= 1
+#NO_DIST_INSTALL	= 1
+
+VISIBILITY_FLAGS=
+
+ifeq (,$(filter WINNT Darwin,$(OS_ARCH)))
+LOCAL_INCLUDES	= $(GLIB_CFLAGS) $(LIBXML2_CFLAGS)
+else
+LOCAL_INCLUDES  = -I$(DIST)/include/glib
+SHARED_LIBRARY_LIBS += $(foreach lib,glib xml2,../libraries/$(lib)/$(LIB_PREFIX)$(lib).$(LIB_SUFFIX))
+
+ifeq ($(OS_ARCH),WINNT)
+LOCAL_INCLUDES += -I$(srcdir)/win32
+DEFINES += -DGLIB_STATIC_COMPILATION
+endif
+endif
+
+ifndef PURPLE_PLUGINS
+PROTOCOLS	= \
+		gg \
+		oscar \
+		msn \
+		myspace \
+		novell \
+		sametime \
+		simple \
+		yahoo \
+		netsoul \
+		$(NULL)
+
+ifdef PURPLE_BONJOUR
+PROTOCOLS	+= bonjour
+endif
+
+ifdef MOZ_DEBUG
+PROTOCOLS	+= null
+endif
+
+STATIC_PROTO_libs = $(foreach proto,$(STATIC_PRPLS),protocols/$(proto)_libs)
+
+PARALLEL_DIRS = $(foreach proto,$(STATIC_PRPLS),protocols/$(proto))
+ifneq (,$(STATIC_PRPLS))
+STATIC_PRPL_LIBS = $(foreach proto,$(STATIC_PRPLS),protocols/$(proto)/$(LIB_PREFIX)$(proto).$(LIB_SUFFIX))
+SHARED_LIBRARY_LIBS += $(STATIC_PRPL_LIBS)
+DEFINES += -DSTATIC_PROTO_INIT='extern void static_proto_init(void);'
+endif
+else
+libdir = /usr/lib
+DEFINES		+= -DPURPLE_PLUGINS -DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/\"
+endif
+
+PURPLE_VERSION	= $(PURPLE_MAJOR_VERSION).$(PURPLE_MINOR_VERSION).$(PURPLE_MICRO_VERSION)
+DEFINES		+= -DPACKAGE=\"purple\" -DVERSION=\"$(PURPLE_VERSION)\"
+
+PREF_JS_EXPORTS = $(srcdir)/purple-prefs.js
+
+EXPORTS_libpurple = \
+		account.h \
+		accountopt.h \
+		blist.h \
+		buddyicon.h \
+		cipher.h \
+		circbuffer.h \
+		cmds.h \
+		connection.h \
+		conversation.h \
+		core.h \
+		dbus-maybe.h \
+		debug.h \
+		eventloop.h \
+		ft.h \
+		gettext.h \
+		idle.h \
+		imgstore.h \
+		log.h \
+		mime.h \
+		nat-pmp.h \
+		network.h \
+		notify.h \
+		ntlm.h \
+		plugin.h \
+		pluginpref.h \
+		prefs.h \
+		privacy.h \
+		proxy.h \
+		prpl.h \
+		request.h \
+		roomlist.h \
+		server.h \
+		signals.h \
+		dnsquery.h \
+		dnssrv.h \
+		smiley.h \
+		status.h \
+		stringref.h \
+		stun.h \
+		sslconn.h \
+		upnp.h \
+		util.h \
+		value.h \
+		xmlnode.h \
+		whiteboard.h \
+		internal.h \
+		version.h \
+		$(NULL)
+#		certificate.h
+
+ifeq ($(OS_ARCH),WINNT)
+EXPORTS_libpurple += \
+		win32/win32dep.h \
+		win32/wpurpleerror.h \
+		win32/libc_interface.h \
+		win32/libc_internal.h \
+		$(NULL)
+endif
+
+CSRCS		= \
+		account.c \
+		accountopt.c \
+		blist.c \
+		buddyicon.c \
+		cipher.c \
+		ciphers/des.c \
+		ciphers/gchecksum.c \
+		ciphers/hmac.c \
+		ciphers/md4.c \
+		ciphers/md5.c \
+		ciphers/rc4.c \
+		ciphers/sha1.c \
+		ciphers/sha256.c \
+		circbuffer.c \
+		cmds.c \
+		connection.c \
+		conversation.c \
+		core.c \
+		debug.c \
+		eventloop.c \
+		ft.c \
+		gettext.c \
+		idle.c \
+		imgstore.c \
+		mime.c \
+		nat-pmp.c \
+		network.c \
+		ntlm.c \
+		notify.c \
+		plugin.c \
+		pluginpref.c \
+		prefs.c \
+		privacy.c \
+		proxy.c \
+		prpl.c \
+		request.c \
+		roomlist.c \
+		server.c \
+		signals.c \
+		dnsquery.c \
+		dnssrv.c \
+		smiley.c \
+		status.c \
+		stringref.c \
+		stun.c \
+		sslconn.c \
+		upnp.c \
+		util.c \
+		value.c \
+		version.c \
+		xmlnode.c \
+		whiteboard.c \
+		ssl-nss.c \
+		$(NULL)
+
+ifndef PURPLE_PLUGINS
+ifneq (,$(STATIC_PRPLS))
+CSRCS		+= static_proto_init.c
+GARBAGE		+= static_proto_init.c
+endif
+endif
+
+ifeq ($(OS_ARCH),WINNT)
+CSRCS		+= \
+		win32/libc_interface.c \
+		win32/win32dep.c \
+		$(NULL)
+endif
+
+include $(topsrcdir)/config/rules.mk
+
+ifeq ($(OS_ARCH),WINNT)
+export::
+	mkdir -p win32
+endif
+
+export::
+	mkdir -p ciphers
+
+ifneq (,$(STATIC_PRPLS))
+$(STATIC_PRPL_LIBS):: $(STATIC_PROTO_libs)
+
+static_proto_init.c: $(GLOBAL_DEPS)
+	echo >  $@ '#include <glib/gtypes.h>'
+	echo >> $@ '$(foreach proto,$(STATIC_PRPLS),extern gboolean purple_init_$(proto)_plugin();)'
+	echo >> $@ 'void static_proto_init(void) {'
+	echo >> $@ '$(foreach proto,$(STATIC_PRPLS),purple_init_$(proto)_plugin();)'
+	echo >> $@ '}'
+endif
+
+# the dynamic protocols are built after purplexpcom is linked
+dynamic-prpls:
+	$(foreach proto,$(filter-out $(STATIC_PRPLS),$(PROTOCOLS)),$(call SUBMAKE,libs,protocols/$(proto)))
+
+ifeq ($(OS_ARCH),WINNT)
+purple.def: ../libraries/glib/glib.def $(EXPORTS_libpurple) $(GLOBAL_DEPS)
+	cat ../libraries/glib/glib.def > purple.def
+	(cd $(srcdir); cat $(EXPORTS_libpurple)) |egrep '^[a-zA-Z].* \*?w?purple_[a-z_0-9]+\(' |sed -e 's/(.*//' -e 's/.* \*\?//' |sort |uniq >> purple.def
+	(cd $(srcdir); cat $(EXPORTS_libpurple)) |egrep '^w?purple_[a-z_0-9]+ ?\(' |sed -e 's/(.*//' |sort |uniq >> purple.def
+	cat $(srcdir)/server.h |egrep '^[a-zA-Z].* \*?serv_[a-z_0-9]+\(' |sed -e 's/(.*//' -e 's/.* \*\?//' |sort |uniq >> purple.def
+	cat $(srcdir)/signals.h |egrep 'void purple_marshal_[A-Z_]+\(' |sed -e 's/(.*//' -e 's/.* \*\?//' |sort |uniq >> purple.def
+	cat $(srcdir)/xmlnode.h |egrep '^[a-zA-Z].* \*?xmlnode_[a-z_]+\(' |sed -e 's/(.*//' -e 's/.* \*\?//' |sort |uniq >> purple.def
+
+$(LIBRARY): purple.def
+
+GARBAGE += purple.def
+endif
+
+version.h: version.h.in $(GLOBAL_DEPS)
+	sed 's/@''PURPLE_MAJOR_VERSION@/$(PURPLE_MAJOR_VERSION)/;s/@''PURPLE_MINOR_VERSION@/$(PURPLE_MINOR_VERSION)/;s/@''PURPLE_MICRO_VERSION@/$(PURPLE_MICRO_VERSION)/' $< > $@
+
+GARBAGE += version.h
new file mode 100644
--- /dev/null
+++ b/purple/libpurple/account.c
@@ -0,0 +1,3291 @@
+/**
+ * @file account.c Account API
+ * @ingroup core
+ */
+
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "internal.h"
+#include "account.h"
+#include "core.h"
+#include "dbus-maybe.h"
+#include "debug.h"
+#include "network.h"
+#include "notify.h"
+#include "prefs.h"
+#include "privacy.h"
+#include "prpl.h"
+#include "request.h"
+#include "server.h"
+#include "signals.h"
+#include "status.h"
+#include "util.h"
+#include "xmlnode.h"
+
+#define schedule_accounts_save()
+
+typedef struct
+{
+	PurpleConnectionErrorInfo *current_error;
+} PurpleAccountPrivate;
+
+#define PURPLE_ACCOUNT_GET_PRIVATE(account) \
+	((PurpleAccountPrivate *) (account->priv))
+
+/* TODO: Should use PurpleValue instead of this?  What about "ui"? */
+typedef struct
+{
+	PurplePrefType type;
+
+	char *ui;
+
+	union
+	{
+		int integer;
+		char *string;
+		gboolean boolean;
+
+	} value;
+
+} PurpleAccountSetting;
+
+typedef struct
+{
+	PurpleAccountRequestType type;
+	PurpleAccount *account;
+	void *ui_handle;
+	char *user;
+	gpointer userdata;
+	PurpleAccountRequestAuthorizationCb auth_cb;
+	PurpleAccountRequestAuthorizationCb deny_cb;
+	guint ref;
+} PurpleAccountRequestInfo;
+
+static PurpleAccountUiOps *account_ui_ops = NULL;
+
+static GList   *accounts = NULL;
+static guint    save_timer = 0;
+static gboolean accounts_loaded = FALSE;
+
+static GList *handles = NULL;
+
+static void set_current_error(PurpleAccount *account,
+	PurpleConnectionErrorInfo *new_err);
+
+#if 0
+/*********************************************************************
+ * Writing to disk                                                   *
+ *********************************************************************/
+
+static void
+setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data)
+{
+	const char *name;
+	PurpleAccountSetting *setting;
+	xmlnode *node, *child;
+	char buf[21];
+
+	name    = (const char *)key;
+	setting = (PurpleAccountSetting *)value;
+	node    = (xmlnode *)user_data;
+
+	child = xmlnode_new_child(node, "setting");
+	xmlnode_set_attrib(child, "name", name);
+
+	if (setting->type == PURPLE_PREF_INT) {
+		xmlnode_set_attrib(child, "type", "int");
+		g_snprintf(buf, sizeof(buf), "%d", setting->value.integer);
+		xmlnode_insert_data(child, buf, -1);
+	}
+	else if (setting->type == PURPLE_PREF_STRING && setting->value.string != NULL) {
+		xmlnode_set_attrib(child, "type", "string");
+		xmlnode_insert_data(child, setting->value.string, -1);
+	}
+	else if (setting->type == PURPLE_PREF_BOOLEAN) {
+		xmlnode_set_attrib(child, "type", "bool");
+		g_snprintf(buf, sizeof(buf), "%d", setting->value.boolean);
+		xmlnode_insert_data(child, buf, -1);
+	}
+}
+
+static void
+ui_setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data)
+{
+	const char *ui;
+	GHashTable *table;
+	xmlnode *node, *child;
+
+	ui    = (const char *)key;
+	table = (GHashTable *)value;
+	node  = (xmlnode *)user_data;
+
+	if (g_hash_table_size(table) > 0)
+	{
+		child = xmlnode_new_child(node, "settings");
+		xmlnode_set_attrib(child, "ui", ui);
+		g_hash_table_foreach(table, setting_to_xmlnode, child);
+	}
+}
+
+static xmlnode *
+status_attr_to_xmlnode(const PurpleStatus *status, const PurpleStatusType *type, const PurpleStatusAttr *attr)
+{
+	xmlnode *node;
+	const char *id;
+	char *value = NULL;
+	PurpleStatusAttr *default_attr;
+	PurpleValue *default_value;
+	PurpleType attr_type;
+	PurpleValue *attr_value;
+
+	id = purple_status_attr_get_id(attr);
+	g_return_val_if_fail(id, NULL);
+
+	attr_value = purple_status_get_attr_value(status, id);
+	g_return_val_if_fail(attr_value, NULL);
+	attr_type = purple_value_get_type(attr_value);
+
+	/*
+	 * If attr_value is a different type than it should be
+	 * then don't write it to the file.
+	 */
+	default_attr = purple_status_type_get_attr(type, id);
+	default_value = purple_status_attr_get_value(default_attr);
+	if (attr_type != purple_value_get_type(default_value))
+		return NULL;
+
+	/*
+	 * If attr_value is the same as the default for this status
+	 * then there is no need to write it to the file.
+	 */
+	if (attr_type == PURPLE_TYPE_STRING)
+	{
+		const char *string_value = purple_value_get_string(attr_value);
+		const char *default_string_value = purple_value_get_string(default_value);
+		if (purple_strequal(string_value, default_string_value))
+			return NULL;
+		value = g_strdup(purple_value_get_string(attr_value));
+	}
+	else if (attr_type == PURPLE_TYPE_INT)
+	{
+		int int_value = purple_value_get_int(attr_value);
+		if (int_value == purple_value_get_int(default_value))
+			return NULL;
+		value = g_strdup_printf("%d", int_value);
+	}
+	else if (attr_type == PURPLE_TYPE_BOOLEAN)
+	{
+		gboolean boolean_value = purple_value_get_boolean(attr_value);
+		if (boolean_value == purple_value_get_boolean(default_value))
+			return NULL;
+		value = g_strdup(boolean_value ?
+								"true" : "false");
+	}
+	else
+	{
+		return NULL;
+	}
+
+	g_return_val_if_fail(value, NULL);
+
+	node = xmlnode_new("attribute");
+
+	xmlnode_set_attrib(node, "id", id);
+	xmlnode_set_attrib(node, "value", value);
+
+	g_free(value);
+
+	return node;
+}
+
+static xmlnode *
+status_attrs_to_xmlnode(const PurpleStatus *status)
+{
+	PurpleStatusType *type = purple_status_get_type(status);
+	xmlnode *node, *child;
+	GList *attrs, *attr;
+
+	node = xmlnode_new("attributes");
+
+	attrs = purple_status_type_get_attrs(type);
+	for (attr = attrs; attr != NULL; attr = attr->next)
+	{
+		child = status_attr_to_xmlnode(status, type, (const PurpleStatusAttr *)attr->data);
+		if (child)
+			xmlnode_insert_child(node, child);
+	}
+
+	return node;
+}
+
+static xmlnode *
+status_to_xmlnode(const PurpleStatus *status)
+{
+	xmlnode *node, *child;
+
+	node = xmlnode_new("status");
+	xmlnode_set_attrib(node, "type", purple_status_get_id(status));
+	if (purple_status_get_name(status) != NULL)
+		xmlnode_set_attrib(node, "name", purple_status_get_name(status));
+	xmlnode_set_attrib(node, "active", purple_status_is_active(status) ? "true" : "false");
+
+	child = status_attrs_to_xmlnode(status);
+	xmlnode_insert_child(node, child);
+
+	return node;
+}
+
+static xmlnode *
+statuses_to_xmlnode(const PurplePresence *presence)
+{
+	xmlnode *node, *child;
+	GList *statuses;
+	PurpleStatus *status;
+
+	node = xmlnode_new("statuses");
+
+	statuses = purple_presence_get_statuses(presence);
+	for (; statuses != NULL; statuses = statuses->next)
+	{
+		status = statuses->data;
+		if (purple_status_type_is_saveable(purple_status_get_type(status)))
+		{
+			child = status_to_xmlnode(status);
+			xmlnode_insert_child(node, child);
+		}
+	}
+
+	return node;
+}
+
+static xmlnode *
+proxy_settings_to_xmlnode(PurpleProxyInfo *proxy_info)
+{
+	xmlnode *node, *child;
+	PurpleProxyType proxy_type;
+	const char *value;
+	int int_value;
+	char buf[21];
+
+	proxy_type = purple_proxy_info_get_type(proxy_info);
+
+	node = xmlnode_new("proxy");
+
+	child = xmlnode_new_child(node, "type");
+	xmlnode_insert_data(child,
+			(proxy_type == PURPLE_PROXY_USE_GLOBAL ? "global" :
+			 proxy_type == PURPLE_PROXY_NONE       ? "none"   :
+			 proxy_type == PURPLE_PROXY_HTTP       ? "http"   :
+			 proxy_type == PURPLE_PROXY_SOCKS4     ? "socks4" :
+			 proxy_type == PURPLE_PROXY_SOCKS5     ? "socks5" :
+			 proxy_type == PURPLE_PROXY_TOR        ? "tor" :
+			 proxy_type == PURPLE_PROXY_USE_ENVVAR ? "envvar" : "unknown"), -1);
+
+	if ((value = purple_proxy_info_get_host(proxy_info)) != NULL)
+	{
+		child = xmlnode_new_child(node, "host");
+		xmlnode_insert_data(child, value, -1);
+	}
+
+	if ((int_value = purple_proxy_info_get_port(proxy_info)) != 0)
+	{
+		g_snprintf(buf, sizeof(buf), "%d", int_value);
+		child = xmlnode_new_child(node, "port");
+		xmlnode_insert_data(child, buf, -1);
+	}
+
+	if ((value = purple_proxy_info_get_username(proxy_info)) != NULL)
+	{
+		child = xmlnode_new_child(node, "username");
+		xmlnode_insert_data(child, value, -1);
+	}
+
+	if ((value = purple_proxy_info_get_password(proxy_info)) != NULL)
+	{
+		child = xmlnode_new_child(node, "password");
+		xmlnode_insert_data(child, value, -1);
+	}
+
+	return node;
+}
+
+static xmlnode *
+current_error_to_xmlnode(PurpleConnectionErrorInfo *err)
+{
+	xmlnode *node, *child;
+	char type_str[3];
+
+	node = xmlnode_new("current_error");
+
+	if(err == NULL)
+		return node;
+
+	/* It doesn't make sense to have transient errors persist across a
+	 * restart.
+	 */
+	if(!purple_connection_error_is_fatal (err->type))
+		return node;
+
+	child = xmlnode_new_child(node, "type");
+	g_snprintf(type_str, sizeof(type_str), "%u", err->type);
+	xmlnode_insert_data(child, type_str, -1);
+
+	child = xmlnode_new_child(node, "description");
+	if(err->description) {
+		char *utf8ized = purple_utf8_try_convert(err->description);
+		if(utf8ized == NULL)
+			utf8ized = purple_utf8_salvage(err->description);
+		xmlnode_insert_data(child, utf8ized, -1);
+		g_free(utf8ized);
+	}
+
+	return node;
+}
+
+static xmlnode *
+account_to_xmlnode(PurpleAccount *account)
+{
+	PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+
+	xmlnode *node, *child;
+	const char *tmp;
+	PurplePresence *presence;
+	PurpleProxyInfo *proxy_info;
+
+	node = xmlnode_new("account");
+
+	child = xmlnode_new_child(node, "protocol");
+	xmlnode_insert_data(child, purple_account_get_protocol_id(account), -1);
+
+	child = xmlnode_new_child(node, "name");
+	xmlnode_insert_data(child, purple_account_get_username(account), -1);
+
+	if (purple_account_get_remember_password(account) &&
+		((tmp = purple_account_get_password(account)) != NULL))
+	{
+		child = xmlnode_new_child(node, "password");
+		xmlnode_insert_data(child, tmp, -1);
+	}
+
+	if ((tmp = purple_account_get_alias(account)) != NULL)
+	{
+		child = xmlnode_new_child(node, "alias");
+		xmlnode_insert_data(child, tmp, -1);
+	}
+
+	if ((presence = purple_account_get_presence(account)) != NULL)
+	{
+		child = statuses_to_xmlnode(presence);
+		xmlnode_insert_child(node, child);
+	}
+
+	if ((tmp = purple_account_get_user_info(account)) != NULL)
+	{
+		/* TODO: Do we need to call purple_str_strip_char(tmp, '\r') here? */
+		child = xmlnode_new_child(node, "userinfo");
+		xmlnode_insert_data(child, tmp, -1);
+	}
+
+	if (g_hash_table_size(account->settings) > 0)
+	{
+		child = xmlnode_new_child(node, "settings");
+		g_hash_table_foreach(account->settings, setting_to_xmlnode, child);
+	}
+
+	if (g_hash_table_size(account->ui_settings) > 0)
+	{
+		g_hash_table_foreach(account->ui_settings, ui_setting_to_xmlnode, node);
+	}
+
+	if ((proxy_info = purple_account_get_proxy_info(account)) != NULL)
+	{
+		child = proxy_settings_to_xmlnode(proxy_info);
+		xmlnode_insert_child(node, child);
+	}
+
+	child = current_error_to_xmlnode(priv->current_error);
+	xmlnode_insert_child(node, child);
+
+	return node;
+}
+
+static xmlnode *
+accounts_to_xmlnode(void)
+{
+	xmlnode *node, *child;
+	GList *cur;
+
+	node = xmlnode_new("account");
+	xmlnode_set_attrib(node, "version", "1.0");
+
+	for (cur = purple_accounts_get_all(); cur != NULL; cur = cur->next)
+	{
+		child = account_to_xmlnode(cur->data);
+		xmlnode_insert_child(node, child);
+	}
+
+	return node;
+}
+
+static void
+sync_accounts(void)
+{
+	xmlnode *node;
+	char *data;
+
+	if (!accounts_loaded)
+	{
+		purple_debug_error("account", "Attempted to save accounts before "
+						 "they were read!\n");
+		return;
+	}
+
+	node = accounts_to_xmlnode();
+	data = xmlnode_to_formatted_str(node, NULL);
+	purple_util_write_data_to_file("accounts.xml", data, -1);
+	g_free(data);
+	xmlnode_free(node);
+}
+
+static gboolean
+save_cb(gpointer data)
+{
+	sync_accounts();
+	save_timer = 0;
+	return FALSE;
+}
+
+static void
+schedule_accounts_save(void)
+{
+	if (save_timer == 0)
+		save_timer = purple_timeout_add_seconds(5, save_cb, NULL);
+}
+
+
+/*********************************************************************
+ * Reading from disk                                                 *
+ *********************************************************************/
+static void
+migrate_yahoo_japan(PurpleAccount *account)
+{
+	/* detect a Yahoo! JAPAN account that existed prior to 2.6.0 and convert it
+	 * to use the new prpl-yahoojp.  Also remove the account-specific settings
+	 * we no longer need */
+
+	if(purple_strequal(purple_account_get_protocol_id(account), "prpl-yahoo")) {
+		if(purple_account_get_bool(account, "yahoojp", FALSE)) {
+			const char *serverjp = purple_account_get_string(account, "serverjp", NULL);
+			const char *xferjp_host = purple_account_get_string(account, "xferjp_host", NULL);
+
+			g_return_if_fail(serverjp != NULL);
+			g_return_if_fail(xferjp_host != NULL);
+
+			purple_account_set_string(account, "server", serverjp);
+			purple_account_set_string(account, "xfer_host", xferjp_host);
+
+			purple_account_set_protocol_id(account, "prpl-yahoojp");
+		}
+
+		/* these should always be nuked */
+		purple_account_remove_setting(account, "yahoojp");
+		purple_account_remove_setting(account, "serverjp");
+		purple_account_remove_setting(account, "xferjp_host");
+
+	}
+}
+
+static void
+migrate_icq_server(PurpleAccount *account)
+{
+	/* Migrate the login server setting for ICQ accounts.  See
+	 * 'mtn log --last 1 --no-graph --from b6d7712e90b68610df3bd2d8cbaf46d94c8b3794'
+	 * for details on the change. */
+
+	if(purple_strequal(purple_account_get_protocol_id(account), "prpl-icq")) {
+		const char *tmp = purple_account_get_string(account, "server", NULL);
+
+		/* Non-secure server */
+		if(purple_strequal(tmp,	"login.messaging.aol.com") ||
+				purple_strequal(tmp, "login.oscar.aol.com"))
+			purple_account_set_string(account, "server", "login.icq.com");
+
+		/* Secure server */
+		if(purple_strequal(tmp, "slogin.oscar.aol.com"))
+			purple_account_set_string(account, "server", "slogin.icq.com");
+	}
+}
+
+static void
+migrate_xmpp_encryption(PurpleAccount *account)
+{
+	/* When this is removed, nuke the "old_ssl" and "require_tls" settings */
+	if (g_str_equal(purple_account_get_protocol_id(account), "prpl-jabber")) {
+		const char *sec = purple_account_get_string(account, "connection_security", "");
+
+		if (g_str_equal("", sec)) {
+			const char *val = "require_tls";
+			if (purple_account_get_bool(account, "old_ssl", FALSE))
+				val = "old_ssl";
+			else if (!purple_account_get_bool(account, "require_tls", TRUE))
+				val = "opportunistic_tls";
+
+			purple_account_set_string(account, "connection_security", val);
+		}
+	}
+}
+
+static void
+parse_settings(xmlnode *node, PurpleAccount *account)
+{
+	const char *ui;
+	xmlnode *child;
+
+	/* Get the UI string, if these are UI settings */
+	ui = xmlnode_get_attrib(node, "ui");
+
+	/* Read settings, one by one */
+	for (child = xmlnode_get_child(node, "setting"); child != NULL;
+			child = xmlnode_get_next_twin(child))
+	{
+		const char *name, *str_type;
+		PurplePrefType type;
+		char *data;
+
+		name = xmlnode_get_attrib(child, "name");
+		if (name == NULL)
+			/* Ignore this setting */
+			continue;
+
+		str_type = xmlnode_get_attrib(child, "type");
+		if (str_type == NULL)
+			/* Ignore this setting */
+			continue;
+
+		if (purple_strequal(str_type, "string"))
+			type = PURPLE_PREF_STRING;
+		else if (purple_strequal(str_type, "int"))
+			type = PURPLE_PREF_INT;
+		else if (purple_strequal(str_type, "bool"))
+			type = PURPLE_PREF_BOOLEAN;
+		else
+			/* Ignore this setting */
+			continue;
+
+		data = xmlnode_get_data(child);
+		if (data == NULL)
+			/* Ignore this setting */
+			continue;
+
+		if (ui == NULL)
+		{
+			if (type == PURPLE_PREF_STRING)
+				purple_account_set_string(account, name, data);
+			else if (type == PURPLE_PREF_INT)
+				purple_account_set_int(account, name, atoi(data));
+			else if (type == PURPLE_PREF_BOOLEAN)
+				purple_account_set_bool(account, name,
+									  (*data == '0' ? FALSE : TRUE));
+		} else {
+			if (type == PURPLE_PREF_STRING)
+				purple_account_set_ui_string(account, ui, name, data);
+			else if (type == PURPLE_PREF_INT)
+				purple_account_set_ui_int(account, ui, name, atoi(data));
+			else if (type == PURPLE_PREF_BOOLEAN)
+				purple_account_set_ui_bool(account, ui, name,
+										 (*data == '0' ? FALSE : TRUE));
+		}
+
+		g_free(data);
+	}
+
+	/* we do this here because we need access to account settings to determine
+	 * if we can/should migrate an old Yahoo! JAPAN account */
+	migrate_yahoo_japan(account);
+	/* we do this here because we need access to account settings to determine
+	 * if we can/should migrate an ICQ account's server setting */
+	migrate_icq_server(account);
+	/* we do this here because we need to do it before the user views the
+	 * Edit Account dialog. */
+	migrate_xmpp_encryption(account);
+}
+
+static GList *
+parse_status_attrs(xmlnode *node, PurpleStatus *status)
+{
+	GList *list = NULL;
+	xmlnode *child;
+	PurpleValue *attr_value;
+
+	for (child = xmlnode_get_child(node, "attribute"); child != NULL;
+			child = xmlnode_get_next_twin(child))
+	{
+		const char *id = xmlnode_get_attrib(child, "id");
+		const char *value = xmlnode_get_attrib(child, "value");
+
+		if (!id || !*id || !value || !*value)
+			continue;
+
+		attr_value = purple_status_get_attr_value(status, id);
+		if (!attr_value)
+			continue;
+
+		list = g_list_append(list, (char *)id);
+
+		switch (purple_value_get_type(attr_value))
+		{
+			case PURPLE_TYPE_STRING:
+				list = g_list_append(list, (char *)value);
+				break;
+			case PURPLE_TYPE_INT:
+			case PURPLE_TYPE_BOOLEAN:
+			{
+				int v;
+				if (sscanf(value, "%d", &v) == 1)
+					list = g_list_append(list, GINT_TO_POINTER(v));
+				else
+					list = g_list_remove(list, id);
+				break;
+			}
+			default:
+				break;
+		}
+	}
+
+	return list;
+}
+
+static void
+parse_status(xmlnode *node, PurpleAccount *account)
+{
+	gboolean active = FALSE;
+	const char *data;
+	const char *type;
+	xmlnode *child;
+	GList *attrs = NULL;
+
+	/* Get the active/inactive state */
+	data = xmlnode_get_attrib(node, "active");
+	if (data == NULL)
+		return;
+	if (g_ascii_strcasecmp(data, "true") == 0)
+		active = TRUE;
+	else if (g_ascii_strcasecmp(data, "false") == 0)
+		active = FALSE;
+	else
+		return;
+
+	/* Get the type of the status */
+	type = xmlnode_get_attrib(node, "type");
+	if (type == NULL)
+		return;
+
+	/* Read attributes into a GList */
+	child = xmlnode_get_child(node, "attributes");
+	if (child != NULL)
+	{
+		attrs = parse_status_attrs(child,
+						purple_account_get_status(account, type));
+	}
+
+	purple_account_set_status_list(account, type, active, attrs);
+
+	g_list_free(attrs);
+}
+
+static void
+parse_statuses(xmlnode *node, PurpleAccount *account)
+{
+	xmlnode *child;
+
+	for (child = xmlnode_get_child(node, "status"); child != NULL;
+			child = xmlnode_get_next_twin(child))
+	{
+		parse_status(child, account);
+	}
+}
+
+static void
+parse_proxy_info(xmlnode *node, PurpleAccount *account)
+{
+	PurpleProxyInfo *proxy_info;
+	xmlnode *child;
+	char *data;
+
+	proxy_info = purple_proxy_info_new();
+
+	/* Use the global proxy settings, by default */
+	purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_GLOBAL);
+
+	/* Read proxy type */
+	child = xmlnode_get_child(node, "type");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		if (purple_strequal(data, "global"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_GLOBAL);
+		else if (purple_strequal(data, "none"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_NONE);
+		else if (purple_strequal(data, "http"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_HTTP);
+		else if (purple_strequal(data, "socks4"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS4);
+		else if (purple_strequal(data, "socks5"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS5);
+		else if (purple_strequal(data, "tor"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_TOR);
+		else if (purple_strequal(data, "envvar"))
+			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_ENVVAR);
+		else
+		{
+			purple_debug_error("account", "Invalid proxy type found when "
+							 "loading account information for %s\n",
+							 purple_account_get_username(account));
+		}
+		g_free(data);
+	}
+
+	/* Read proxy host */
+	child = xmlnode_get_child(node, "host");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_proxy_info_set_host(proxy_info, data);
+		g_free(data);
+	}
+
+	/* Read proxy port */
+	child = xmlnode_get_child(node, "port");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_proxy_info_set_port(proxy_info, atoi(data));
+		g_free(data);
+	}
+
+	/* Read proxy username */
+	child = xmlnode_get_child(node, "username");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_proxy_info_set_username(proxy_info, data);
+		g_free(data);
+	}
+
+	/* Read proxy password */
+	child = xmlnode_get_child(node, "password");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_proxy_info_set_password(proxy_info, data);
+		g_free(data);
+	}
+
+	/* If there are no values set then proxy_info NULL */
+	if ((purple_proxy_info_get_type(proxy_info) == PURPLE_PROXY_USE_GLOBAL) &&
+		(purple_proxy_info_get_host(proxy_info) == NULL) &&
+		(purple_proxy_info_get_port(proxy_info) == 0) &&
+		(purple_proxy_info_get_username(proxy_info) == NULL) &&
+		(purple_proxy_info_get_password(proxy_info) == NULL))
+	{
+		purple_proxy_info_destroy(proxy_info);
+		return;
+	}
+
+	purple_account_set_proxy_info(account, proxy_info);
+}
+
+static void
+parse_current_error(xmlnode *node, PurpleAccount *account)
+{
+	guint type;
+	char *type_str = NULL, *description = NULL;
+	xmlnode *child;
+	PurpleConnectionErrorInfo *current_error = NULL;
+
+	child = xmlnode_get_child(node, "type");
+	if (child == NULL || (type_str = xmlnode_get_data(child)) == NULL)
+		return;
+	type = atoi(type_str);
+	g_free(type_str);
+
+	if (type > PURPLE_CONNECTION_ERROR_OTHER_ERROR)
+	{
+		purple_debug_error("account",
+			"Invalid PurpleConnectionError value %d found when "
+			"loading account information for %s\n",
+			type, purple_account_get_username(account));
+		type = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+	}
+
+	child = xmlnode_get_child(node, "description");
+	if (child)
+		description = xmlnode_get_data(child);
+	if (description == NULL)
+		description = g_strdup("");
+
+	current_error = g_new0(PurpleConnectionErrorInfo, 1);
+	PURPLE_DBUS_REGISTER_POINTER(current_error, PurpleConnectionErrorInfo);
+	current_error->type = type;
+	current_error->description = description;
+
+	set_current_error(account, current_error);
+}
+
+static PurpleAccount *
+parse_account(xmlnode *node)
+{
+	PurpleAccount *ret;
+	xmlnode *child;
+	char *protocol_id = NULL;
+	char *name = NULL;
+	char *data;
+
+	child = xmlnode_get_child(node, "protocol");
+	if (child != NULL)
+		protocol_id = xmlnode_get_data(child);
+
+	child = xmlnode_get_child(node, "name");
+	if (child != NULL)
+		name = xmlnode_get_data(child);
+	if (name == NULL)
+	{
+		/* Do we really need to do this? */
+		child = xmlnode_get_child(node, "username");
+		if (child != NULL)
+			name = xmlnode_get_data(child);
+	}
+
+	if ((protocol_id == NULL) || (name == NULL))
+	{
+		g_free(protocol_id);
+		g_free(name);
+		return NULL;
+	}
+
+	ret = purple_account_new(name, _purple_oscar_convert(name, protocol_id)); /* XXX: */
+	g_free(name);
+	g_free(protocol_id);
+
+	/* Read the password */
+	child = xmlnode_get_child(node, "password");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_account_set_remember_password(ret, TRUE);
+		purple_account_set_password(ret, data);
+		g_free(data);
+	}
+
+	/* Read the alias */
+	child = xmlnode_get_child(node, "alias");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		if (*data != '\0')
+			purple_account_set_alias(ret, data);
+		g_free(data);
+	}
+
+	/* Read the statuses */
+	child = xmlnode_get_child(node, "statuses");
+	if (child != NULL)
+	{
+		parse_statuses(child, ret);
+	}
+
+	/* Read the userinfo */
+	child = xmlnode_get_child(node, "userinfo");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		purple_account_set_user_info(ret, data);
+		g_free(data);
+	}
+
+	/* Read an old buddyicon */
+	child = xmlnode_get_child(node, "buddyicon");
+	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
+	{
+		const char *dirname = purple_buddy_icons_get_cache_dir();
+		char *filename = g_build_filename(dirname, data, NULL);
+		gchar *contents;
+		gsize len;
+
+		if (g_file_get_contents(filename, &contents, &len, NULL))
+		{
+			purple_buddy_icons_set_account_icon(ret, (guchar *)contents, len);
+		}
+		else
+		{
+			/* Try to see if the icon got left behind in the old cache. */
+			g_free(filename);
+			filename = g_build_filename(g_get_home_dir(), ".gaim", "icons", data, NULL);
+			if (g_file_get_contents(filename, &contents, &len, NULL)) {
+				purple_buddy_icons_set_account_icon(ret, (guchar*)contents, len);
+			}
+		}
+
+		g_free(filename);
+		g_free(data);
+	}
+
+	/* Read settings (both core and UI) */
+	for (child = xmlnode_get_child(node, "settings"); child != NULL;
+			child = xmlnode_get_next_twin(child))
+	{
+		parse_settings(child, ret);
+	}
+
+	/* Read proxy */
+	child = xmlnode_get_child(node, "proxy");
+	if (child != NULL)
+	{
+		parse_proxy_info(child, ret);
+	}
+
+	/* Read current error */
+	child = xmlnode_get_child(node, "current_error");
+	if (child != NULL)
+	{
+		parse_current_error(child, ret);
+	}
+
+	return ret;
+}
+#endif
+
+static void
+load_accounts(void)
+{
+	xmlnode *node, *child;
+
+	accounts_loaded = TRUE;
+
+#if 0
+	node = purple_util_read_xml_from_file("accounts.xml", _("accounts"));
+
+	if (node == NULL)
+		return;
+
+	for (child = xmlnode_get_child(node, "account"); child != NULL;
+			child = xmlnode_get_next_twin(child))
+	{
+		PurpleAccount *new_acct;
+		new_acct = parse_account(child);
+		purple_accounts_add(new_acct);
+	}
+
+	xmlnode_free(node);
+
+	_purple_buddy_icons_account_loaded_cb();
+#endif
+}
+
+
+static void
+delete_setting(void *data)
+{
+	PurpleAccountSetting *setting = (PurpleAccountSetting *)data;
+
+	g_free(setting->ui);
+
+	if (setting->type == PURPLE_PREF_STRING)
+		g_free(setting->value.string);
+
+	g_free(setting);
+}
+
+PurpleAccount *
+purple_account_new(const char *username, const char *protocol_id)
+{
+	PurpleAccount *account = NULL;
+	PurpleAccountPrivate *priv = NULL;
+	PurplePlugin *prpl = NULL;
+	PurplePluginProtocolInfo *prpl_info = NULL;
+	PurpleStatusType *status_type;
+
+	g_return_val_if_fail(username != NULL, NULL);
+	g_return_val_if_fail(protocol_id != NULL, NULL);
+
+	account = purple_accounts_find(username, protocol_id);
+
+	if (account != NULL)
+		return account;
+
+	account = g_new0(PurpleAccount, 1);
+	PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount);
+	priv = g_new0(PurpleAccountPrivate, 1);
+	account->priv = priv;
+
+	purple_account_set_username(account, username);
+
+	purple_account_set_protocol_id(account, protocol_id);
+
+	account->settings = g_hash_table_new_full(g_str_hash, g_str_equal,
+											  g_free, delete_setting);
+	account->ui_settings = g_hash_table_new_full(g_str_hash, g_str_equal,
+				g_free, (GDestroyNotify)g_hash_table_destroy);
+	account->system_log = NULL;
+	/* 0 is not a valid privacy setting */
+	account->perm_deny = PURPLE_PRIVACY_ALLOW_ALL;
+
+	purple_signal_emit(purple_accounts_get_handle(), "account-created", account);
+
+	prpl = purple_find_prpl(protocol_id);
+
+	if (prpl == NULL)
+		return account;
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+	if (prpl_info != NULL && prpl_info->status_types != NULL)
+		purple_account_set_status_types(account, prpl_info->status_types(account));
+
+	account->presence = purple_presence_new_for_account(account);
+
+	status_type = purple_account_get_status_type_with_primitive(account, PURPLE_STATUS_AVAILABLE);
+	if (status_type != NULL)
+		purple_presence_set_status_active(account->presence,
+										purple_status_type_get_id(status_type),
+										TRUE);
+	else
+		purple_presence_set_status_active(account->presence,
+										"offline",
+										TRUE);
+
+	return account;
+}
+
+void
+purple_account_destroy(PurpleAccount *account)
+{
+	PurpleAccountPrivate *priv = NULL;
+	GList *l;
+
+	g_return_if_fail(account != NULL);
+
+	purple_debug_info("account", "Destroying account %p\n", account);
+	purple_signal_emit(purple_accounts_get_handle(), "account-destroying", account);
+
+	for (l = purple_get_conversations(); l != NULL; l = l->next)
+	{
+		PurpleConversation *conv = (PurpleConversation *)l->data;
+
+		if (purple_conversation_get_account(conv) == account)
+			purple_conversation_set_account(conv, NULL);
+	}
+
+	g_free(account->username);
+	g_free(account->alias);
+	g_free(account->password);
+	g_free(account->user_info);
+	g_free(account->buddy_icon_path);
+	g_free(account->protocol_id);
+
+	g_hash_table_destroy(account->settings);
+	g_hash_table_destroy(account->ui_settings);
+
+	if (account->proxy_info)
+		purple_proxy_info_destroy(account->proxy_info);
+
+	purple_account_set_status_types(account, NULL);
+
+	purple_presence_destroy(account->presence);
+
+#if 0
+	if(account->system_log)
+		purple_log_free(account->system_log);
+#endif
+
+	while (account->deny) {
+		g_free(account->deny->data);
+		account->deny = g_slist_delete_link(account->deny, account->deny);
+	}
+
+	while (account->permit) {
+		g_free(account->permit->data);
+		account->permit = g_slist_delete_link(account->permit, account->permit);
+	}
+
+	priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
+	PURPLE_DBUS_UNREGISTER_POINTER(priv->current_error);
+	if (priv->current_error) {
+		g_free(priv->current_error->description);
+		g_free(priv->current_error);
+	}
+	g_free(priv);
+
+	PURPLE_DBUS_UNREGISTER_POINTER(account);
+	g_free(account);
+}
+
+void
+purple_account_set_register_callback(PurpleAccount *account, PurpleAccountRegistrationCb cb, void *user_data)
+{
+	g_return_if_fail(account != NULL);
+
+	account->registration_cb = cb;
+	account->registration_cb_user_data = user_data;
+}
+
+void
+purple_account_register(PurpleAccount *account)
+{
+	g_return_if_fail(account != NULL);
+
+	purple_debug_info("account", "Registering account %s\n",
+					purple_account_get_username(account));
+
+	_purple_connection_new(account, TRUE, purple_account_get_password(account));
+}
+
+void
+purple_account_unregister(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data)
+{
+	g_return_if_fail(account != NULL);
+
+	purple_debug_info("account", "Unregistering account %s\n",
+					  purple_account_get_username(account));
+
+	_purple_connection_new_unregister(account, purple_account_get_password(account), cb, user_data);
+}
+
+static void
+request_password_ok_cb(PurpleAccount *account, PurpleRequestFields *fields)
+{
+	const char *entry;
+	gboolean remember;
+
+	entry = purple_request_fields_get_string(fields, "password");
+	remember = purple_request_fields_get_bool(fields, "remember");
+
+	if (!entry || !*entry)
+	{
+		purple_notify_error(account, NULL, _("Password is required to sign on."), NULL);
+		return;
+	}
+
+	if(remember)
+		purple_account_set_remember_password(account, TRUE);
+
+	purple_account_set_password(account, entry);
+
+	_purple_connection_new(account, FALSE, entry);
+}
+
+static void
+request_password_cancel_cb(PurpleAccount *account, PurpleRequestFields *fields)
+{
+	/* Disable the account as the user has cancelled connecting */
+	purple_account_set_enabled(account, purple_core_get_ui(), FALSE);
+}
+
+
+void
+purple_account_request_password(PurpleAccount *account, GCallback ok_cb,
+				GCallback cancel_cb, void *user_data)
+{
+	gchar *primary;
+	const gchar *username;
+	PurpleRequestFieldGroup *group;
+	PurpleRequestField *field;
+	PurpleRequestFields *fields;
+
+	/* Close any previous password request windows */
+	purple_request_close_with_handle(account);
+
+	username = purple_account_get_username(account);
+	primary = g_strdup_printf(_("Enter password for %s (%s)"), username,
+								  purple_account_get_protocol_name(account));
+
+	fields = purple_request_fields_new();
+	group = purple_request_field_group_new(NULL);
+	purple_request_fields_add_group(fields, group);
+
+	field = purple_request_field_string_new("password", _("Enter Password"), NULL, FALSE);
+	purple_request_field_string_set_masked(field, TRUE);
+	purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	field = purple_request_field_bool_new("remember", _("Save password"), FALSE);
+	purple_request_field_group_add_field(group, field);
+
+	purple_request_fields(account,
+                        NULL,
+                        primary,
+                        NULL,
+                        fields,
+                        _("OK"), ok_cb,
+                        _("Cancel"), cancel_cb,
+						account, NULL, NULL,
+                        user_data);
+	g_free(primary);
+}
+
+void
+purple_account_connect(PurpleAccount *account)
+{
+	PurplePlugin *prpl;
+	const char *password, *username;
+	PurplePluginProtocolInfo *prpl_info;
+
+	g_return_if_fail(account != NULL);
+
+	username = purple_account_get_username(account);
+
+	if (!purple_account_get_enabled(account, purple_core_get_ui())) {
+		purple_debug_info("account",
+				  "Account %s not enabled, not connecting.\n",
+				  username);
+		return;
+	}
+
+	prpl = purple_find_prpl(purple_account_get_protocol_id(account));
+	if (prpl == NULL) {
+		gchar *message;
+
+		message = g_strdup_printf(_("Missing protocol plugin for %s"), username);
+		purple_notify_error(account, _("Connection Error"), message, NULL);
+		g_free(message);
+		return;
+	}
+
+	purple_debug_info("account", "Connecting to account %s.\n", username);
+
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+	password = purple_account_get_password(account);
+	if ((password == NULL) &&
+		!(prpl_info->options & OPT_PROTO_NO_PASSWORD) &&
+		!(prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL))
+		purple_account_request_password(account, G_CALLBACK(request_password_ok_cb), G_CALLBACK(request_password_cancel_cb), account);
+	else
+		_purple_connection_new(account, FALSE, password);
+}
+
+void
+purple_account_disconnect(PurpleAccount *account)
+{
+	PurpleConnection *gc;
+	const char *username;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(!purple_account_is_disconnected(account));
+
+	username = purple_account_get_username(account);
+	purple_debug_info("account", "Disconnecting account %s (%p)\n",
+	                  username ? username : "(null)", account);
+
+	account->disconnecting = TRUE;
+
+	gc = purple_account_get_connection(account);
+	_purple_connection_destroy(gc);
+
+	/* 
+	XXXFlo: disable this until the UI for requesting a password
+	        from the user works in Instantbird
+	if (!purple_account_get_remember_password(account))
+		purple_account_set_password(account, NULL);
+	*/
+	purple_account_set_connection(account, NULL);
+
+	account->disconnecting = FALSE;
+}
+
+void
+purple_account_notify_added(PurpleAccount *account, const char *remote_user,
+                          const char *id, const char *alias,
+                          const char *message)
+{
+	PurpleAccountUiOps *ui_ops;
+
+	g_return_if_fail(account     != NULL);
+	g_return_if_fail(remote_user != NULL);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	if (ui_ops != NULL && ui_ops->notify_added != NULL)
+		ui_ops->notify_added(account, remote_user, id, alias, message);
+}
+
+void
+purple_account_request_add(PurpleAccount *account, const char *remote_user,
+                         const char *id, const char *alias,
+                         const char *message)
+{
+	PurpleAccountUiOps *ui_ops;
+
+	g_return_if_fail(account     != NULL);
+	g_return_if_fail(remote_user != NULL);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	if (ui_ops != NULL && ui_ops->request_add != NULL)
+		ui_ops->request_add(account, remote_user, id, alias, message);
+}
+
+static PurpleAccountRequestInfo *
+purple_account_request_info_unref(PurpleAccountRequestInfo *info)
+{
+	if (--info->ref)
+		return info;
+
+	/* TODO: This will leak info->user_data, but there is no callback to just clean that up */
+	g_free(info->user);
+	g_free(info);
+	return NULL;
+}
+
+static void
+purple_account_request_close_info(PurpleAccountRequestInfo *info)
+{
+	PurpleAccountUiOps *ops;
+
+	ops = purple_accounts_get_ui_ops();
+
+	if (ops != NULL && ops->close_account_request != NULL)
+		ops->close_account_request(info->ui_handle);
+
+	purple_account_request_info_unref(info);
+}
+
+void
+purple_account_request_close_with_account(PurpleAccount *account)
+{
+	GList *l, *l_next;
+
+	g_return_if_fail(account != NULL);
+
+	for (l = handles; l != NULL; l = l_next) {
+		PurpleAccountRequestInfo *info = l->data;
+
+		l_next = l->next;
+
+		if (info->account == account) {
+			handles = g_list_remove(handles, info);
+			purple_account_request_close_info(info);
+		}
+	}
+}
+
+void
+purple_account_request_close(void *ui_handle)
+{
+	GList *l, *l_next;
+
+	g_return_if_fail(ui_handle != NULL);
+
+	for (l = handles; l != NULL; l = l_next) {
+		PurpleAccountRequestInfo *info = l->data;
+
+		l_next = l->next;
+
+		if (info->ui_handle == ui_handle) {
+			handles = g_list_remove(handles, info);
+			purple_account_request_close_info(info);
+		}
+	}
+}
+
+static void
+request_auth_cb(void *data)
+{
+	PurpleAccountRequestInfo *info = data;
+
+	handles = g_list_remove(handles, info);
+
+	if (info->auth_cb != NULL)
+		info->auth_cb(info->userdata);
+
+	purple_signal_emit(purple_accounts_get_handle(),
+			"account-authorization-granted", info->account, info->user);
+
+	purple_account_request_info_unref(info);
+}
+
+static void
+request_deny_cb(void *data)
+{
+	PurpleAccountRequestInfo *info = data;
+
+	handles = g_list_remove(handles, info);
+
+	if (info->deny_cb != NULL)
+		info->deny_cb(info->userdata);
+
+	purple_signal_emit(purple_accounts_get_handle(),
+			"account-authorization-denied", info->account, info->user);
+
+	purple_account_request_info_unref(info);
+}
+
+void *
+purple_account_request_authorization(PurpleAccount *account, const char *remote_user,
+				     const char *id, const char *alias, const char *message, gboolean on_list,
+				     PurpleAccountRequestAuthorizationCb auth_cb, PurpleAccountRequestAuthorizationCb deny_cb, void *user_data)
+{
+	PurpleAccountUiOps *ui_ops;
+	PurpleAccountRequestInfo *info;
+	int plugin_return;
+
+	g_return_val_if_fail(account     != NULL, NULL);
+	g_return_val_if_fail(remote_user != NULL, NULL);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	plugin_return = GPOINTER_TO_INT(
+			purple_signal_emit_return_1(purple_accounts_get_handle(),
+				"account-authorization-requested", account, remote_user));
+
+	if (plugin_return > 0) {
+		if (auth_cb != NULL)
+			auth_cb(user_data);
+		return NULL;
+	} else if (plugin_return < 0) {
+		if (deny_cb != NULL)
+			deny_cb(user_data);
+		return NULL;
+	}
+
+	plugin_return = GPOINTER_TO_INT(
+			purple_signal_emit_return_1(
+				purple_accounts_get_handle(),
+				"account-authorization-requested-with-message",
+				account, remote_user, message
+			));
+
+	switch (plugin_return)
+	{
+		case PURPLE_ACCOUNT_RESPONSE_IGNORE:
+			return NULL;
+		case PURPLE_ACCOUNT_RESPONSE_ACCEPT:
+			if (auth_cb != NULL)
+				auth_cb(user_data);
+			return NULL;
+		case PURPLE_ACCOUNT_RESPONSE_DENY:
+			if (deny_cb != NULL)
+				deny_cb(user_data);
+			return NULL;
+	}
+
+	if (ui_ops != NULL && ui_ops->request_authorize != NULL) {
+		info            = g_new0(PurpleAccountRequestInfo, 1);
+		info->type      = PURPLE_ACCOUNT_REQUEST_AUTHORIZATION;
+		info->account   = account;
+		info->auth_cb   = auth_cb;
+		info->deny_cb   = deny_cb;
+		info->userdata  = user_data;
+		info->user      = g_strdup(remote_user);
+		info->ref       = 2;  /* We hold an extra ref to make sure info remains valid
+		                         if any of the callbacks are called synchronously. We
+		                         unref it after the function call */
+
+		info->ui_handle = ui_ops->request_authorize(account, remote_user, id, alias, message,
+							    on_list, request_auth_cb, request_deny_cb, info);
+
+		info = purple_account_request_info_unref(info);
+		if (info) {
+			handles = g_list_append(handles, info);
+			return info->ui_handle;
+		}
+	}
+
+	return NULL;
+}
+
+static void
+change_password_cb(PurpleAccount *account, PurpleRequestFields *fields)
+{
+	const char *orig_pass, *new_pass_1, *new_pass_2;
+
+	orig_pass  = purple_request_fields_get_string(fields, "password");
+	new_pass_1 = purple_request_fields_get_string(fields, "new_password_1");
+	new_pass_2 = purple_request_fields_get_string(fields, "new_password_2");
+
+	if (g_utf8_collate(new_pass_1, new_pass_2))
+	{
+		purple_notify_error(account, NULL,
+						  _("New passwords do not match."), NULL);
+
+		return;
+	}
+
+	if ((purple_request_fields_is_field_required(fields, "password") &&
+			(orig_pass == NULL || *orig_pass == '\0')) ||
+		(purple_request_fields_is_field_required(fields, "new_password_1") &&
+			(new_pass_1 == NULL || *new_pass_1 == '\0')) ||
+		(purple_request_fields_is_field_required(fields, "new_password_2") &&
+			(new_pass_2 == NULL || *new_pass_2 == '\0')))
+	{
+		purple_notify_error(account, NULL,
+						  _("Fill out all fields completely."), NULL);
+		return;
+	}
+
+	purple_account_change_password(account, orig_pass, new_pass_1);
+}
+
+void
+purple_account_request_change_password(PurpleAccount *account)
+{
+	PurpleRequestFields *fields;
+	PurpleRequestFieldGroup *group;
+	PurpleRequestField *field;
+	PurpleConnection *gc;
+	PurplePlugin *prpl = NULL;
+	PurplePluginProtocolInfo *prpl_info = NULL;
+	char primary[256];
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(purple_account_is_connected(account));
+
+	gc = purple_account_get_connection(account);
+	if (gc != NULL)
+		prpl = purple_connection_get_prpl(gc);
+	if (prpl != NULL)
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	fields = purple_request_fields_new();
+
+	group = purple_request_field_group_new(NULL);
+	purple_request_fields_add_group(fields, group);
+
+	field = purple_request_field_string_new("password", _("Original password"),
+										  NULL, FALSE);
+	purple_request_field_string_set_masked(field, TRUE);
+	if (!(prpl_info && (prpl_info->options | OPT_PROTO_PASSWORD_OPTIONAL)))
+		purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	field = purple_request_field_string_new("new_password_1",
+										  _("New password"),
+										  NULL, FALSE);
+	purple_request_field_string_set_masked(field, TRUE);
+	if (!(prpl_info && (prpl_info->options | OPT_PROTO_PASSWORD_OPTIONAL)))
+		purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	field = purple_request_field_string_new("new_password_2",
+										  _("New password (again)"),
+										  NULL, FALSE);
+	purple_request_field_string_set_masked(field, TRUE);
+	if (!(prpl_info && (prpl_info->options | OPT_PROTO_PASSWORD_OPTIONAL)))
+		purple_request_field_set_required(field, TRUE);
+	purple_request_field_group_add_field(group, field);
+
+	g_snprintf(primary, sizeof(primary), _("Change password for %s"),
+			   purple_account_get_username(account));
+
+	/* I'm sticking this somewhere in the code: bologna */
+
+	purple_request_fields(purple_account_get_connection(account),
+						NULL,
+						primary,
+						_("Please enter your current password and your "
+						  "new password."),
+						fields,
+						_("OK"), G_CALLBACK(change_password_cb),
+						_("Cancel"), NULL,
+						account, NULL, NULL,
+						account);
+}
+
+static void
+set_user_info_cb(PurpleAccount *account, const char *user_info)
+{
+	PurpleConnection *gc;
+
+	purple_account_set_user_info(account, user_info);
+	gc = purple_account_get_connection(account);
+	serv_set_info(gc, user_info);
+}
+
+void
+purple_account_request_change_user_info(PurpleAccount *account)
+{
+	PurpleConnection *gc;
+	char primary[256];
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(purple_account_is_connected(account));
+
+	gc = purple_account_get_connection(account);
+
+	g_snprintf(primary, sizeof(primary),
+			   _("Change user information for %s"),
+			   purple_account_get_username(account));
+
+	purple_request_input(gc, _("Set User Info"), primary, NULL,
+					   purple_account_get_user_info(account),
+					   TRUE, FALSE, ((gc != NULL) &&
+					   (gc->flags & PURPLE_CONNECTION_HTML) ? "html" : NULL),
+					   _("Save"), G_CALLBACK(set_user_info_cb),
+					   _("Cancel"), NULL,
+					   account, NULL, NULL,
+					   account);
+}
+
+void
+purple_account_set_username(PurpleAccount *account, const char *username)
+{
+	PurpleBlistUiOps *blist_ops;
+
+	g_return_if_fail(account != NULL);
+
+	g_free(account->username);
+	account->username = g_strdup(username);
+
+	schedule_accounts_save();
+
+	/* if the name changes, we should re-write the buddy list
+	 * to disk with the new name */
+	blist_ops = purple_blist_get_ui_ops();
+	if (blist_ops != NULL && blist_ops->save_account != NULL)
+		blist_ops->save_account(account);
+}
+
+void
+purple_account_set_password(PurpleAccount *account, const char *password)
+{
+	g_return_if_fail(account != NULL);
+
+	g_free(account->password);
+	account->password = g_strdup(password);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_alias(PurpleAccount *account, const char *alias)
+{
+	g_return_if_fail(account != NULL);
+
+	/*
+	 * Do nothing if alias and account->alias are both NULL.  Or if
+	 * they're the exact same string.
+	 */
+	if (alias == account->alias)
+		return;
+
+	if ((!alias && account->alias) || (alias && !account->alias) ||
+			g_utf8_collate(account->alias, alias))
+	{
+		char *old = account->alias;
+
+		account->alias = g_strdup(alias);
+		purple_signal_emit(purple_accounts_get_handle(), "account-alias-changed",
+						 account, old);
+		g_free(old);
+
+		schedule_accounts_save();
+	}
+}
+
+void
+purple_account_set_user_info(PurpleAccount *account, const char *user_info)
+{
+	g_return_if_fail(account != NULL);
+
+	g_free(account->user_info);
+	account->user_info = g_strdup(user_info);
+
+	schedule_accounts_save();
+}
+
+void purple_account_set_buddy_icon_path(PurpleAccount *account, const char *path)
+{
+	g_return_if_fail(account != NULL);
+
+	g_free(account->buddy_icon_path);
+	account->buddy_icon_path = g_strdup(path);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_protocol_id(PurpleAccount *account, const char *protocol_id)
+{
+	g_return_if_fail(account     != NULL);
+	g_return_if_fail(protocol_id != NULL);
+
+	g_free(account->protocol_id);
+	account->protocol_id = g_strdup(protocol_id);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_connection(PurpleAccount *account, PurpleConnection *gc)
+{
+	g_return_if_fail(account != NULL);
+
+	account->gc = gc;
+}
+
+void
+purple_account_set_remember_password(PurpleAccount *account, gboolean value)
+{
+	g_return_if_fail(account != NULL);
+
+	account->remember_pass = value;
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_check_mail(PurpleAccount *account, gboolean value)
+{
+	g_return_if_fail(account != NULL);
+
+	purple_account_set_bool(account, "check-mail", value);
+}
+
+void
+purple_account_set_enabled(PurpleAccount *account, const char *ui,
+			 gboolean value)
+{
+	PurpleConnection *gc;
+	gboolean was_enabled = FALSE;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(ui      != NULL);
+
+	was_enabled = purple_account_get_enabled(account, ui);
+
+	purple_account_set_ui_bool(account, ui, "auto-login", value);
+	gc = purple_account_get_connection(account);
+
+	if(was_enabled && !value)
+		purple_signal_emit(purple_accounts_get_handle(), "account-disabled", account);
+	else if(!was_enabled && value)
+		purple_signal_emit(purple_accounts_get_handle(), "account-enabled", account);
+
+	if ((gc != NULL) && (gc->wants_to_die == TRUE))
+		return;
+
+	if (value && purple_presence_is_online(account->presence))
+		purple_account_connect(account);
+	else if (!value && !purple_account_is_disconnected(account))
+		purple_account_disconnect(account);
+}
+
+void
+purple_account_set_proxy_info(PurpleAccount *account, PurpleProxyInfo *info)
+{
+	g_return_if_fail(account != NULL);
+
+	if (account->proxy_info != NULL)
+		purple_proxy_info_destroy(account->proxy_info);
+
+	account->proxy_info = info;
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_privacy_type(PurpleAccount *account, PurplePrivacyType privacy_type)
+{
+	g_return_if_fail(account != NULL);
+
+	account->perm_deny = privacy_type;
+}
+
+void
+purple_account_set_status_types(PurpleAccount *account, GList *status_types)
+{
+	g_return_if_fail(account != NULL);
+
+	/* Out with the old... */
+	if (account->status_types != NULL)
+	{
+		g_list_foreach(account->status_types, (GFunc)purple_status_type_destroy, NULL);
+		g_list_free(account->status_types);
+	}
+
+	/* In with the new... */
+	account->status_types = status_types;
+}
+
+void
+purple_account_set_status(PurpleAccount *account, const char *status_id,
+						gboolean active, ...)
+{
+	GList *attrs = NULL;
+	const gchar *id;
+	gpointer data;
+	va_list args;
+
+	va_start(args, active);
+	while ((id = va_arg(args, const char *)) != NULL)
+	{
+		attrs = g_list_append(attrs, (char *)id);
+		data = va_arg(args, void *);
+		attrs = g_list_append(attrs, data);
+	}
+	purple_account_set_status_list(account, status_id, active, attrs);
+	g_list_free(attrs);
+	va_end(args);
+}
+
+void
+purple_account_set_status_list(PurpleAccount *account, const char *status_id,
+							 gboolean active, GList *attrs)
+{
+	PurpleStatus *status;
+
+	g_return_if_fail(account   != NULL);
+	g_return_if_fail(status_id != NULL);
+
+	status = purple_account_get_status(account, status_id);
+	if (status == NULL)
+	{
+		purple_debug_error("account",
+				   "Invalid status ID '%s' for account %s (%s)\n",
+				   status_id, purple_account_get_username(account),
+				   purple_account_get_protocol_id(account));
+		return;
+	}
+
+	if (active || purple_status_is_independent(status))
+		purple_status_set_active_with_attrs_list(status, active, attrs);
+
+	/*
+	 * Our current statuses are saved to accounts.xml (so that when we
+	 * reconnect, we go back to the previous status).
+	 */
+	schedule_accounts_save();
+}
+
+struct public_alias_closure
+{
+	PurpleAccount *account;
+	gpointer failure_cb;
+};
+
+static gboolean
+set_public_alias_unsupported(gpointer data)
+{
+	struct public_alias_closure *closure = data;
+	PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb;
+
+	failure_cb(closure->account,
+	           _("This protocol does not support setting a public alias."));
+	g_free(closure);
+
+	return FALSE;
+}
+
+void
+purple_account_set_public_alias(PurpleAccount *account,
+		const char *alias, PurpleSetPublicAliasSuccessCallback success_cb,
+		PurpleSetPublicAliasFailureCallback failure_cb)
+{
+	PurpleConnection *gc;
+	PurplePlugin *prpl = NULL;
+	PurplePluginProtocolInfo *prpl_info = NULL;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(purple_account_is_connected(account));
+
+	gc = purple_account_get_connection(account);
+	prpl = purple_connection_get_prpl(gc);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, set_public_alias))
+		prpl_info->set_public_alias(gc, alias, success_cb, failure_cb);
+	else if (failure_cb) {
+		struct public_alias_closure *closure =
+				g_new0(struct public_alias_closure, 1);
+		closure->account = account;
+		closure->failure_cb = failure_cb;
+		purple_timeout_add(0, set_public_alias_unsupported, closure);
+	}
+}
+
+static gboolean
+get_public_alias_unsupported(gpointer data)
+{
+	struct public_alias_closure *closure = data;
+	PurpleGetPublicAliasFailureCallback failure_cb = closure->failure_cb;
+
+	failure_cb(closure->account,
+	           _("This protocol does not support fetching the public alias."));
+	g_free(closure);
+
+	return FALSE;
+}
+
+void
+purple_account_get_public_alias(PurpleAccount *account,
+		PurpleGetPublicAliasSuccessCallback success_cb,
+		PurpleGetPublicAliasFailureCallback failure_cb)
+{
+	PurpleConnection *gc;
+	PurplePlugin *prpl = NULL;
+	PurplePluginProtocolInfo *prpl_info = NULL;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(purple_account_is_connected(account));
+
+	gc = purple_account_get_connection(account);
+	prpl = purple_connection_get_prpl(gc);
+	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_public_alias))
+		prpl_info->get_public_alias(gc, success_cb, failure_cb);
+	else if (failure_cb) {
+		struct public_alias_closure *closure =
+				g_new0(struct public_alias_closure, 1);
+		closure->account = account;
+		closure->failure_cb = failure_cb;
+		purple_timeout_add(0, get_public_alias_unsupported, closure);
+	}
+}
+
+gboolean
+purple_account_get_silence_suppression(const PurpleAccount *account)
+{
+	return purple_account_get_bool(account, "silence-suppression", FALSE);
+}
+
+void
+purple_account_set_silence_suppression(PurpleAccount *account, gboolean value)
+{
+	g_return_if_fail(account != NULL);
+
+	purple_account_set_bool(account, "silence-suppression", value);
+}
+
+void
+purple_account_clear_settings(PurpleAccount *account)
+{
+	g_return_if_fail(account != NULL);
+
+	g_hash_table_destroy(account->settings);
+
+	account->settings = g_hash_table_new_full(g_str_hash, g_str_equal,
+											  g_free, delete_setting);
+}
+
+void
+purple_account_remove_setting(PurpleAccount *account, const char *setting)
+{
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(setting != NULL);
+
+	g_hash_table_remove(account->settings, setting);
+}
+
+void
+purple_account_set_int(PurpleAccount *account, const char *name, int value)
+{
+	PurpleAccountSetting *setting;
+	PurpleAccountUiOps *ui_ops;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type          = PURPLE_PREF_INT;
+	setting->value.integer = value;
+
+	g_hash_table_insert(account->settings, g_strdup(name), setting);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	if (ui_ops != NULL && ui_ops->set_int != NULL)
+		ui_ops->set_int(account, name, value);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_string(PurpleAccount *account, const char *name,
+						const char *value)
+{
+	PurpleAccountSetting *setting;
+	PurpleAccountUiOps *ui_ops;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type         = PURPLE_PREF_STRING;
+	setting->value.string = g_strdup(value);
+
+	g_hash_table_insert(account->settings, g_strdup(name), setting);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	if (ui_ops != NULL && ui_ops->set_string != NULL)
+		ui_ops->set_string(account, name, value);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_bool(PurpleAccount *account, const char *name, gboolean value)
+{
+	PurpleAccountSetting *setting;
+	PurpleAccountUiOps *ui_ops;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type       = PURPLE_PREF_BOOLEAN;
+	setting->value.boolean = value;
+
+	g_hash_table_insert(account->settings, g_strdup(name), setting);
+
+	ui_ops = purple_accounts_get_ui_ops();
+
+	if (ui_ops != NULL && ui_ops->set_bool != NULL)
+		ui_ops->set_bool(account, name, value);
+
+	schedule_accounts_save();
+}
+
+static GHashTable *
+get_ui_settings_table(PurpleAccount *account, const char *ui)
+{
+	GHashTable *table;
+
+	table = g_hash_table_lookup(account->ui_settings, ui);
+
+	if (table == NULL) {
+		table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+									  delete_setting);
+		g_hash_table_insert(account->ui_settings, g_strdup(ui), table);
+	}
+
+	return table;
+}
+
+void
+purple_account_set_ui_int(PurpleAccount *account, const char *ui,
+						const char *name, int value)
+{
+	PurpleAccountSetting *setting;
+	GHashTable *table;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(ui      != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type          = PURPLE_PREF_INT;
+	setting->ui            = g_strdup(ui);
+	setting->value.integer = value;
+
+	table = get_ui_settings_table(account, ui);
+
+	g_hash_table_insert(table, g_strdup(name), setting);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_ui_string(PurpleAccount *account, const char *ui,
+						   const char *name, const char *value)
+{
+	PurpleAccountSetting *setting;
+	GHashTable *table;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(ui      != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type         = PURPLE_PREF_STRING;
+	setting->ui           = g_strdup(ui);
+	setting->value.string = g_strdup(value);
+
+	table = get_ui_settings_table(account, ui);
+
+	g_hash_table_insert(table, g_strdup(name), setting);
+
+	schedule_accounts_save();
+}
+
+void
+purple_account_set_ui_bool(PurpleAccount *account, const char *ui,
+						 const char *name, gboolean value)
+{
+	PurpleAccountSetting *setting;
+	GHashTable *table;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(ui      != NULL);
+	g_return_if_fail(name    != NULL);
+
+	setting = g_new0(PurpleAccountSetting, 1);
+
+	setting->type       = PURPLE_PREF_BOOLEAN;
+	setting->ui         = g_strdup(ui);
+	setting->value.boolean = value;
+
+	table = get_ui_settings_table(account, ui);
+
+	g_hash_table_insert(table, g_strdup(name), setting);
+
+	schedule_accounts_save();
+}
+
+static PurpleConnectionState
+purple_account_get_state(const PurpleAccount *account)
+{
+	PurpleConnection *gc;
+
+	g_return_val_if_fail(account != NULL, PURPLE_DISCONNECTED);
+
+	gc = purple_account_get_connection(account);
+	if (!gc)
+		return PURPLE_DISCONNECTED;
+
+	return purple_connection_get_state(gc);
+}
+
+gboolean
+purple_account_is_connected(const PurpleAccount *account)
+{
+	return (purple_account_get_state(account) == PURPLE_CONNECTED);
+}
+
+gboolean
+purple_account_is_connecting(const PurpleAccount *account)
+{
+	return (purple_account_get_state(account) == PURPLE_CONNECTING);
+}
+
+gboolean
+purple_account_is_disconnected(const PurpleAccount *account)
+{
+	return (purple_account_get_state(account) == PURPLE_DISCONNECTED);
+}
+
+const char *
+purple_account_get_username(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+
+	return account->username;
+}
+
+const char *
+purple_account_get_password(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+
+	return account->password;
+}
+
+const char *
+purple_account_get_alias(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+
+	return account->alias;
+}
+
+const char *
+purple_account_get_user_info(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+
+	return account->user_info;
+}
+
+const char *
+purple_account_get_buddy_icon_path(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+
+	return account->buddy_icon_path;
+}
+
+const char *
+purple_account_get_protocol_id(const PurpleAccount *account)
+{
+	g_return_val_if_fail(account != NULL, NULL);
+	return account->protocol_id;
+}