adium/adium

libpurple 2.12.0 @ r11b8084bcff4
adium-1.5.10.3
2017-03-21, Thijs Alkemade
b018d89d49dc
Parents 395e617c3bdc
Children f373ce30b5f7
libpurple 2.12.0 @ r11b8084bcff4
  • +0 -0
    Frameworks/libgcrypt.framework/Versions/1.6.2/libgcrypt
  • +0 -77
    Frameworks/libglib.framework/Versions/2.42.1/Headers/glibconfig.h
  • +0 -0
    Frameworks/libglib.framework/Versions/2.42.1/libglib
  • +0 -77
    Frameworks/libgmodule.framework/Versions/2.42.1/Headers/glibconfig.h
  • +0 -0
    Frameworks/libgmodule.framework/Versions/2.42.1/libgmodule
  • +0 -77
    Frameworks/libgobject.framework/Versions/2.42.1/Headers/glibconfig.h
  • +0 -0
    Frameworks/libgobject.framework/Versions/2.42.1/libgobject
  • +0 -0
    Frameworks/libgpgerror.framework/Versions/1.17/libgpgerror
  • +0 -77
    Frameworks/libgthread.framework/Versions/2.42.1/Headers/glibconfig.h
  • +0 -0
    Frameworks/libgthread.framework/Versions/2.42.1/libgthread
  • +0 -0
    Frameworks/libintl.framework/Versions/0.19.3/libintl
  • +0 -0
    Frameworks/libmeanwhile.framework/Versions/1.0.2/libmeanwhile
  • +1 -1
    Frameworks/libpurple.framework/Headers
  • +1 -1
    Frameworks/libpurple.framework/Resources
  • +0 -1194
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/account.h
  • +0 -395
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/accountopt.h
  • +0 -67
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/auth.h
  • +0 -1278
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/blist.h
  • +0 -43
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/bosh.h
  • +0 -125
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddy.h
  • +0 -441
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddyicon.h
  • +0 -57
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddylist.h
  • +0 -129
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/caps.h
  • +0 -899
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/certificate.h
  • +0 -118
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/chat.h
  • +0 -502
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cipher.h
  • +0 -118
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/circbuffer.h
  • +0 -100
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cmdproc.h
  • +0 -250
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cmds.h
  • +0 -84
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/command.h
  • +0 -86
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/config.h
  • +0 -626
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/connection.h
  • +0 -747
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/contact.h
  • +0 -1476
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/conversation.h
  • +0 -251
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/core.h
  • +0 -35
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dbus-maybe.h
  • +0 -243
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/debug.h
  • +0 -172
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/desktopitem.h
  • +0 -200
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/directconn.h
  • +0 -180
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dnsquery.h
  • +0 -242
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dnssrv.h
  • +0 -57
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/error.h
  • +0 -276
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/eventloop.h
  • +0 -814
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ft.h
  • +0 -2317
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/gaim-compat.h
  • +0 -74
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/gg.h
  • +0 -109
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/group.h
  • +0 -50
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/history.h
  • +0 -112
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/httpconn.h
  • +0 -104
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/idle.h
  • +0 -230
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/imgstore.h
  • +0 -278
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/internal.h
  • +0 -118
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/iq.h
  • +0 -226
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/irc.h
  • +0 -428
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/jabber.h
  • +0 -99
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/jutil.h
  • +0 -2639
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libgadu.h
  • +0 -22
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libpurple.h
  • +0 -402
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libymsg.h
  • +0 -583
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/log.h
  • +0 -84
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/marshallers.h
  • +0 -202
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media-gst.h
  • +0 -511
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media.h
  • +0 -288
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/backend-iface.h
  • +0 -252
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/candidate.h
  • +0 -214
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/codec.h
  • +0 -168
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/enum-types.h
  • +0 -385
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/mediamanager.h
  • +0 -218
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/mime.h
  • +0 -325
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msg.h
  • +0 -158
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msn.h
  • +0 -244
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msnutils.h
  • +0 -112
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/namespaces.h
  • +0 -77
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/nat-pmp.h
  • +0 -359
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/network.h
  • +0 -219
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/nexus.h
  • +0 -124
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/notification.h
  • +0 -814
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/notify.h
  • +0 -73
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ntlm.h
  • +0 -276
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/object.h
  • +0 -163
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/oim.h
  • +0 -1350
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/oscar.h
  • +0 -264
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/p2p.h
  • +0 -81
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/page.h
  • +0 -282
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/peer.h
  • +0 -740
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/plugin.h
  • +0 -269
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/pluginpref.h
  • +0 -389
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/pounce.h
  • +0 -371
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/prefs.h
  • +0 -103
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/presence.h
  • +0 -194
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/privacy.h
  • +0 -372
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/proxy.h
  • +0 -1019
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/prpl.h
  • +0 -105
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/purple.h
  • +0 -1608
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/request.h
  • +0 -398
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/roomlist.h
  • +0 -425
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/savedstatuses.h
  • +0 -41
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sbconn.h
  • +0 -152
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/search.h
  • +0 -193
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/servconn.h
  • +0 -218
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/server.h
  • +0 -245
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/session.h
  • +0 -40
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/si.h
  • +0 -380
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/signals.h
  • +0 -51
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slp.h
  • +0 -98
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpcall.h
  • +0 -98
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slplink.h
  • +0 -150
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpmsg.h
  • +0 -66
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpmsg_part.h
  • +0 -262
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/smiley.h
  • +0 -287
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/snactypes.h
  • +0 -52
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/soap.h
  • +0 -71
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound-theme-loader.h
  • +0 -108
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound-theme.h
  • +0 -143
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound.h
  • +0 -346
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sslconn.h
  • +0 -69
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/state.h
  • +0 -1103
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/status.h
  • +0 -138
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/stringref.h
  • +0 -88
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/stun.h
  • +0 -266
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/switchboard.h
  • +0 -93
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/table.h
  • +0 -93
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme-loader.h
  • +0 -139
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme-manager.h
  • +0 -175
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme.h
  • +0 -77
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/tlv.h
  • +0 -87
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/transaction.h
  • +0 -132
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/upnp.h
  • +0 -533
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/user.h
  • +0 -112
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/userlist.h
  • +0 -1490
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/util.h
  • +0 -504
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/value.h
  • +0 -88
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/version.h
  • +0 -262
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/whiteboard.h
  • +0 -67
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/xfer.h
  • +0 -397
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/xmlnode.h
  • +0 -41
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_aliases.h
  • +0 -131
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_doodle.h
  • +0 -70
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_filexfer.h
  • +0 -93
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_friend.h
  • +0 -150
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_packet.h
  • +0 -43
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_picture.h
  • +0 -66
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoochat.h
  • +0 -97
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ycht.h
  • +0 -3
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/English.lproj/InfoPlist.strings
  • +0 -18
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/Info.plist
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/as/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ast/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/bn_IN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/br/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/brx/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ca/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/cs/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/da/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/de/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/el/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_AU/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_CA/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_GB/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/es/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/es_AR/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/fi/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/fr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/hr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/hu/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/it/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ja/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/kk/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ks/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ku_IQ/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/lv/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mai/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mhr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ml/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/nb/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/nl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pt/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pt_BR/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ru/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sd/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sv/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/tr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/tt/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/uk/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/uz/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/zh_CN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/zh_TW/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/libpurple
  • +1253 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/account.h
  • +395 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/accountopt.h
  • +67 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/auth.h
  • +1278 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/blist.h
  • +43 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/bosh.h
  • +125 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddy.h
  • +441 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddyicon.h
  • +57 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddylist.h
  • +129 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/caps.h
  • +959 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/certificate.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/chat.h
  • +502 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/cipher.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/circbuffer.h
  • +311 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/cmds.h
  • +626 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/connection.h
  • +1478 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/conversation.h
  • +251 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/core.h
  • +35 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dbus-maybe.h
  • +243 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/debug.h
  • +172 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/desktopitem.h
  • +180 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dnsquery.h
  • +242 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dnssrv.h
  • +276 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/eventloop.h
  • +814 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/ft.h
  • +2317 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/gaim-compat.h
  • +74 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/gg.h
  • +104 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/idle.h
  • +230 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/imgstore.h
  • +275 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/internal.h
  • +118 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/iq.h
  • +228 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/irc.h
  • +423 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/jabber.h
  • +99 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/jutil.h
  • +2639 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/libgadu.h
  • +22 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/libpurple.h
  • +583 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/log.h
  • +84 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/marshallers.h
  • +202 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media-gst.h
  • +513 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media.h
  • +290 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/backend-iface.h
  • +252 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/candidate.h
  • +214 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/codec.h
  • +168 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/enum-types.h
  • +385 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/mediamanager.h
  • +218 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/mime.h
  • +112 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/namespaces.h
  • +77 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/nat-pmp.h
  • +359 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/network.h
  • +814 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/notify.h
  • +73 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/ntlm.h
  • +1355 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/oscar.h
  • +282 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/peer.h
  • +740 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/plugin.h
  • +269 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/pluginpref.h
  • +389 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/pounce.h
  • +485 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/prefs.h
  • +103 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/presence.h
  • +194 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/privacy.h
  • +372 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/proxy.h
  • +1019 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/prpl.h
  • +105 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/purple.h
  • +1608 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/request.h
  • +398 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/roomlist.h
  • +425 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/savedstatuses.h
  • +152 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/search.h
  • +218 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/server.h
  • +40 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/si.h
  • +380 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/signals.h
  • +262 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/smiley.h
  • +287 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/snactypes.h
  • +71 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound-theme-loader.h
  • +108 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound-theme.h
  • +143 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound.h
  • +346 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sslconn.h
  • +1103 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/status.h
  • +138 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/stringref.h
  • +88 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/stun.h
  • +93 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme-loader.h
  • +139 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme-manager.h
  • +175 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme.h
  • +132 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/upnp.h
  • +1516 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/util.h
  • +504 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/value.h
  • +88 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/version.h
  • +262 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/whiteboard.h
  • +397 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/xmlnode.h
  • +3 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/English.lproj/InfoPlist.strings
  • +18 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/Info.plist
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/as/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ast/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/bn_IN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/br/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/brx/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ca/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/cs/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/da/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/de/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/el/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_AU/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_CA/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_GB/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/es/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/es_AR/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/fi/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/fr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/hr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/hu/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/it/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ja/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/kk/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ks/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ku_IQ/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/lv/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mai/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mhr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ml/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/nb/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/nl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pt/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pt_BR/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ru/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sd/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sl/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sv/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/tr/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/tt/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/uk/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/uz/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/zh_CN/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/zh_TW/LC_MESSAGES/pidgin.mo
  • +0 -0
    Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/libpurple
  • +1 -1
    Frameworks/libpurple.framework/Versions/Current
  • +1 -1
    Frameworks/libpurple.framework/libpurple
  • Binary file Frameworks/libgcrypt.framework/Versions/1.6.2/libgcrypt has changed
    --- a/Frameworks/libglib.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libglib.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:37:34 2017 +0100
    @@ -48,40 +48,19 @@
    #define G_GUINT32_FORMAT "u"
    #define G_HAVE_GINT64 1 /* deprecated, always true */
    -#ifdef __LP64__
    typedef signed long gint64;
    typedef unsigned long guint64;
    #define G_GINT64_CONSTANT(val) (val##L)
    #define G_GUINT64_CONSTANT(val) (val##UL)
    -#else
    -typedef signed long long gint64;
    -typedef unsigned long long guint64;
    -
    -#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
    -#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL))
    -#endif
    -#ifdef __LP64__
    #define G_GINT64_MODIFIER "l"
    #define G_GINT64_FORMAT "li"
    #define G_GUINT64_FORMAT "lu"
    -#else
    -#define G_GINT64_MODIFIER "ll"
    -#define G_GINT64_FORMAT "lli"
    -#define G_GUINT64_FORMAT "llu"
    -#endif
    -#ifdef __LP64__
    #define GLIB_SIZEOF_VOID_P 8
    #define GLIB_SIZEOF_LONG 8
    #define GLIB_SIZEOF_SIZE_T 8
    #define GLIB_SIZEOF_SSIZE_T 8
    -#else
    -#define GLIB_SIZEOF_VOID_P 4
    -#define GLIB_SIZEOF_LONG 4
    -#define GLIB_SIZEOF_SIZE_T 4
    -#define GLIB_SIZEOF_SSIZE_T 4
    -#endif
    typedef signed long gssize;
    typedef unsigned long gsize;
    @@ -103,7 +82,6 @@
    #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
    -#ifdef __LP64__
    #define GPOINTER_TO_INT(p) ((gint) (glong) (p))
    #define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
    @@ -116,20 +94,6 @@
    #define G_GINTPTR_MODIFIER "l"
    #define G_GINTPTR_FORMAT "li"
    #define G_GUINTPTR_FORMAT "lu"
    -#else
    -#define GPOINTER_TO_INT(p) ((gint) (p))
    -#define GPOINTER_TO_UINT(p) ((guint) (p))
    -
    -#define GINT_TO_POINTER(i) ((gpointer) (i))
    -#define GUINT_TO_POINTER(u) ((gpointer) (u))
    -
    -typedef signed int gintptr;
    -typedef unsigned int guintptr;
    -
    -#define G_GINTPTR_MODIFIER ""
    -#define G_GINTPTR_FORMAT "i"
    -#define G_GUINTPTR_FORMAT "u"
    -#endif
    #ifndef G_DISABLE_DEPRECATED
    #define g_ATEXIT(proc) (atexit (proc))
    #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
    @@ -143,9 +107,7 @@
    #define G_VA_COPY va_copy
    -#ifdef __LP64__
    #define G_VA_COPY_AS_ARRAY 1
    -#endif
    #ifdef __cplusplus
    #define G_HAVE_INLINE 1
    @@ -194,70 +156,31 @@
    #define G_ATOMIC_LOCK_FREE
    -#ifdef __BIG_ENDIAN__
    -#define GINT16_TO_BE(val) ((gint16) (val))
    -#define GUINT16_TO_BE(val) ((guint16) (val))
    -#define GINT16_TO_LE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    -#define GUINT16_TO_LE(val) (GUINT16_SWAP_LE_BE (val))
    -#else
    #define GINT16_TO_LE(val) ((gint16) (val))
    #define GUINT16_TO_LE(val) ((guint16) (val))
    #define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    #define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT32_TO_BE(val) ((gint32) (val))
    -#define GUINT32_TO_BE(val) ((guint32) (val))
    -#define GINT32_TO_LE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    -#define GUINT32_TO_LE(val) (GUINT32_SWAP_LE_BE (val))
    -#else
    #define GINT32_TO_LE(val) ((gint32) (val))
    #define GUINT32_TO_LE(val) ((guint32) (val))
    #define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    #define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT64_TO_BE(val) ((gint64) (val))
    -#define GUINT64_TO_BE(val) ((guint64) (val))
    -#define GINT64_TO_LE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    -#define GUINT64_TO_LE(val) (GUINT64_SWAP_LE_BE (val))
    -#else
    #define GINT64_TO_LE(val) ((gint64) (val))
    #define GUINT64_TO_LE(val) ((guint64) (val))
    #define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    #define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
    -#endif
    -#ifdef __LP64__
    #define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
    #define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
    #define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
    #define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
    -#else
    -#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
    -#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
    -#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
    -#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
    -#endif
    #define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
    #define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
    #define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
    #define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
    -#ifdef __LP64__
    #define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
    #define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
    #define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
    #define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
    -#else
    -#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
    -#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
    -#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
    -#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define G_BYTE_ORDER G_BIG_ENDIAN
    -#else
    #define G_BYTE_ORDER G_LITTLE_ENDIAN
    -#endif
    #define GLIB_SYSDEF_POLLIN =1
    #define GLIB_SYSDEF_POLLOUT =4
    Binary file Frameworks/libglib.framework/Versions/2.42.1/libglib has changed
    --- a/Frameworks/libgmodule.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libgmodule.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:37:34 2017 +0100
    @@ -48,40 +48,19 @@
    #define G_GUINT32_FORMAT "u"
    #define G_HAVE_GINT64 1 /* deprecated, always true */
    -#ifdef __LP64__
    typedef signed long gint64;
    typedef unsigned long guint64;
    #define G_GINT64_CONSTANT(val) (val##L)
    #define G_GUINT64_CONSTANT(val) (val##UL)
    -#else
    -typedef signed long long gint64;
    -typedef unsigned long long guint64;
    -
    -#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
    -#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL))
    -#endif
    -#ifdef __LP64__
    #define G_GINT64_MODIFIER "l"
    #define G_GINT64_FORMAT "li"
    #define G_GUINT64_FORMAT "lu"
    -#else
    -#define G_GINT64_MODIFIER "ll"
    -#define G_GINT64_FORMAT "lli"
    -#define G_GUINT64_FORMAT "llu"
    -#endif
    -#ifdef __LP64__
    #define GLIB_SIZEOF_VOID_P 8
    #define GLIB_SIZEOF_LONG 8
    #define GLIB_SIZEOF_SIZE_T 8
    #define GLIB_SIZEOF_SSIZE_T 8
    -#else
    -#define GLIB_SIZEOF_VOID_P 4
    -#define GLIB_SIZEOF_LONG 4
    -#define GLIB_SIZEOF_SIZE_T 4
    -#define GLIB_SIZEOF_SSIZE_T 4
    -#endif
    typedef signed long gssize;
    typedef unsigned long gsize;
    @@ -103,7 +82,6 @@
    #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
    -#ifdef __LP64__
    #define GPOINTER_TO_INT(p) ((gint) (glong) (p))
    #define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
    @@ -116,20 +94,6 @@
    #define G_GINTPTR_MODIFIER "l"
    #define G_GINTPTR_FORMAT "li"
    #define G_GUINTPTR_FORMAT "lu"
    -#else
    -#define GPOINTER_TO_INT(p) ((gint) (p))
    -#define GPOINTER_TO_UINT(p) ((guint) (p))
    -
    -#define GINT_TO_POINTER(i) ((gpointer) (i))
    -#define GUINT_TO_POINTER(u) ((gpointer) (u))
    -
    -typedef signed int gintptr;
    -typedef unsigned int guintptr;
    -
    -#define G_GINTPTR_MODIFIER ""
    -#define G_GINTPTR_FORMAT "i"
    -#define G_GUINTPTR_FORMAT "u"
    -#endif
    #ifndef G_DISABLE_DEPRECATED
    #define g_ATEXIT(proc) (atexit (proc))
    #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
    @@ -143,9 +107,7 @@
    #define G_VA_COPY va_copy
    -#ifdef __LP64__
    #define G_VA_COPY_AS_ARRAY 1
    -#endif
    #ifdef __cplusplus
    #define G_HAVE_INLINE 1
    @@ -194,70 +156,31 @@
    #define G_ATOMIC_LOCK_FREE
    -#ifdef __BIG_ENDIAN__
    -#define GINT16_TO_BE(val) ((gint16) (val))
    -#define GUINT16_TO_BE(val) ((guint16) (val))
    -#define GINT16_TO_LE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    -#define GUINT16_TO_LE(val) (GUINT16_SWAP_LE_BE (val))
    -#else
    #define GINT16_TO_LE(val) ((gint16) (val))
    #define GUINT16_TO_LE(val) ((guint16) (val))
    #define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    #define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT32_TO_BE(val) ((gint32) (val))
    -#define GUINT32_TO_BE(val) ((guint32) (val))
    -#define GINT32_TO_LE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    -#define GUINT32_TO_LE(val) (GUINT32_SWAP_LE_BE (val))
    -#else
    #define GINT32_TO_LE(val) ((gint32) (val))
    #define GUINT32_TO_LE(val) ((guint32) (val))
    #define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    #define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT64_TO_BE(val) ((gint64) (val))
    -#define GUINT64_TO_BE(val) ((guint64) (val))
    -#define GINT64_TO_LE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    -#define GUINT64_TO_LE(val) (GUINT64_SWAP_LE_BE (val))
    -#else
    #define GINT64_TO_LE(val) ((gint64) (val))
    #define GUINT64_TO_LE(val) ((guint64) (val))
    #define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    #define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
    -#endif
    -#ifdef __LP64__
    #define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
    #define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
    #define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
    #define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
    -#else
    -#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
    -#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
    -#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
    -#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
    -#endif
    #define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
    #define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
    #define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
    #define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
    -#ifdef __LP64__
    #define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
    #define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
    #define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
    #define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
    -#else
    -#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
    -#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
    -#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
    -#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define G_BYTE_ORDER G_BIG_ENDIAN
    -#else
    #define G_BYTE_ORDER G_LITTLE_ENDIAN
    -#endif
    #define GLIB_SYSDEF_POLLIN =1
    #define GLIB_SYSDEF_POLLOUT =4
    Binary file Frameworks/libgmodule.framework/Versions/2.42.1/libgmodule has changed
    --- a/Frameworks/libgobject.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libgobject.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:37:34 2017 +0100
    @@ -48,40 +48,19 @@
    #define G_GUINT32_FORMAT "u"
    #define G_HAVE_GINT64 1 /* deprecated, always true */
    -#ifdef __LP64__
    typedef signed long gint64;
    typedef unsigned long guint64;
    #define G_GINT64_CONSTANT(val) (val##L)
    #define G_GUINT64_CONSTANT(val) (val##UL)
    -#else
    -typedef signed long long gint64;
    -typedef unsigned long long guint64;
    -
    -#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
    -#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL))
    -#endif
    -#ifdef __LP64__
    #define G_GINT64_MODIFIER "l"
    #define G_GINT64_FORMAT "li"
    #define G_GUINT64_FORMAT "lu"
    -#else
    -#define G_GINT64_MODIFIER "ll"
    -#define G_GINT64_FORMAT "lli"
    -#define G_GUINT64_FORMAT "llu"
    -#endif
    -#ifdef __LP64__
    #define GLIB_SIZEOF_VOID_P 8
    #define GLIB_SIZEOF_LONG 8
    #define GLIB_SIZEOF_SIZE_T 8
    #define GLIB_SIZEOF_SSIZE_T 8
    -#else
    -#define GLIB_SIZEOF_VOID_P 4
    -#define GLIB_SIZEOF_LONG 4
    -#define GLIB_SIZEOF_SIZE_T 4
    -#define GLIB_SIZEOF_SSIZE_T 4
    -#endif
    typedef signed long gssize;
    typedef unsigned long gsize;
    @@ -103,7 +82,6 @@
    #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
    -#ifdef __LP64__
    #define GPOINTER_TO_INT(p) ((gint) (glong) (p))
    #define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
    @@ -116,20 +94,6 @@
    #define G_GINTPTR_MODIFIER "l"
    #define G_GINTPTR_FORMAT "li"
    #define G_GUINTPTR_FORMAT "lu"
    -#else
    -#define GPOINTER_TO_INT(p) ((gint) (p))
    -#define GPOINTER_TO_UINT(p) ((guint) (p))
    -
    -#define GINT_TO_POINTER(i) ((gpointer) (i))
    -#define GUINT_TO_POINTER(u) ((gpointer) (u))
    -
    -typedef signed int gintptr;
    -typedef unsigned int guintptr;
    -
    -#define G_GINTPTR_MODIFIER ""
    -#define G_GINTPTR_FORMAT "i"
    -#define G_GUINTPTR_FORMAT "u"
    -#endif
    #ifndef G_DISABLE_DEPRECATED
    #define g_ATEXIT(proc) (atexit (proc))
    #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
    @@ -143,9 +107,7 @@
    #define G_VA_COPY va_copy
    -#ifdef __LP64__
    #define G_VA_COPY_AS_ARRAY 1
    -#endif
    #ifdef __cplusplus
    #define G_HAVE_INLINE 1
    @@ -194,70 +156,31 @@
    #define G_ATOMIC_LOCK_FREE
    -#ifdef __BIG_ENDIAN__
    -#define GINT16_TO_BE(val) ((gint16) (val))
    -#define GUINT16_TO_BE(val) ((guint16) (val))
    -#define GINT16_TO_LE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    -#define GUINT16_TO_LE(val) (GUINT16_SWAP_LE_BE (val))
    -#else
    #define GINT16_TO_LE(val) ((gint16) (val))
    #define GUINT16_TO_LE(val) ((guint16) (val))
    #define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    #define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT32_TO_BE(val) ((gint32) (val))
    -#define GUINT32_TO_BE(val) ((guint32) (val))
    -#define GINT32_TO_LE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    -#define GUINT32_TO_LE(val) (GUINT32_SWAP_LE_BE (val))
    -#else
    #define GINT32_TO_LE(val) ((gint32) (val))
    #define GUINT32_TO_LE(val) ((guint32) (val))
    #define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    #define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT64_TO_BE(val) ((gint64) (val))
    -#define GUINT64_TO_BE(val) ((guint64) (val))
    -#define GINT64_TO_LE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    -#define GUINT64_TO_LE(val) (GUINT64_SWAP_LE_BE (val))
    -#else
    #define GINT64_TO_LE(val) ((gint64) (val))
    #define GUINT64_TO_LE(val) ((guint64) (val))
    #define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    #define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
    -#endif
    -#ifdef __LP64__
    #define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
    #define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
    #define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
    #define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
    -#else
    -#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
    -#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
    -#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
    -#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
    -#endif
    #define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
    #define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
    #define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
    #define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
    -#ifdef __LP64__
    #define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
    #define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
    #define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
    #define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
    -#else
    -#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
    -#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
    -#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
    -#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define G_BYTE_ORDER G_BIG_ENDIAN
    -#else
    #define G_BYTE_ORDER G_LITTLE_ENDIAN
    -#endif
    #define GLIB_SYSDEF_POLLIN =1
    #define GLIB_SYSDEF_POLLOUT =4
    Binary file Frameworks/libgobject.framework/Versions/2.42.1/libgobject has changed
    Binary file Frameworks/libgpgerror.framework/Versions/1.17/libgpgerror has changed
    --- a/Frameworks/libgthread.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libgthread.framework/Versions/2.42.1/Headers/glibconfig.h Tue Mar 21 20:37:34 2017 +0100
    @@ -48,40 +48,19 @@
    #define G_GUINT32_FORMAT "u"
    #define G_HAVE_GINT64 1 /* deprecated, always true */
    -#ifdef __LP64__
    typedef signed long gint64;
    typedef unsigned long guint64;
    #define G_GINT64_CONSTANT(val) (val##L)
    #define G_GUINT64_CONSTANT(val) (val##UL)
    -#else
    -typedef signed long long gint64;
    -typedef unsigned long long guint64;
    -
    -#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
    -#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL))
    -#endif
    -#ifdef __LP64__
    #define G_GINT64_MODIFIER "l"
    #define G_GINT64_FORMAT "li"
    #define G_GUINT64_FORMAT "lu"
    -#else
    -#define G_GINT64_MODIFIER "ll"
    -#define G_GINT64_FORMAT "lli"
    -#define G_GUINT64_FORMAT "llu"
    -#endif
    -#ifdef __LP64__
    #define GLIB_SIZEOF_VOID_P 8
    #define GLIB_SIZEOF_LONG 8
    #define GLIB_SIZEOF_SIZE_T 8
    #define GLIB_SIZEOF_SSIZE_T 8
    -#else
    -#define GLIB_SIZEOF_VOID_P 4
    -#define GLIB_SIZEOF_LONG 4
    -#define GLIB_SIZEOF_SIZE_T 4
    -#define GLIB_SIZEOF_SSIZE_T 4
    -#endif
    typedef signed long gssize;
    typedef unsigned long gsize;
    @@ -103,7 +82,6 @@
    #define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
    -#ifdef __LP64__
    #define GPOINTER_TO_INT(p) ((gint) (glong) (p))
    #define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
    @@ -116,20 +94,6 @@
    #define G_GINTPTR_MODIFIER "l"
    #define G_GINTPTR_FORMAT "li"
    #define G_GUINTPTR_FORMAT "lu"
    -#else
    -#define GPOINTER_TO_INT(p) ((gint) (p))
    -#define GPOINTER_TO_UINT(p) ((guint) (p))
    -
    -#define GINT_TO_POINTER(i) ((gpointer) (i))
    -#define GUINT_TO_POINTER(u) ((gpointer) (u))
    -
    -typedef signed int gintptr;
    -typedef unsigned int guintptr;
    -
    -#define G_GINTPTR_MODIFIER ""
    -#define G_GINTPTR_FORMAT "i"
    -#define G_GUINTPTR_FORMAT "u"
    -#endif
    #ifndef G_DISABLE_DEPRECATED
    #define g_ATEXIT(proc) (atexit (proc))
    #define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
    @@ -143,9 +107,7 @@
    #define G_VA_COPY va_copy
    -#ifdef __LP64__
    #define G_VA_COPY_AS_ARRAY 1
    -#endif
    #ifdef __cplusplus
    #define G_HAVE_INLINE 1
    @@ -194,70 +156,31 @@
    #define G_ATOMIC_LOCK_FREE
    -#ifdef __BIG_ENDIAN__
    -#define GINT16_TO_BE(val) ((gint16) (val))
    -#define GUINT16_TO_BE(val) ((guint16) (val))
    -#define GINT16_TO_LE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    -#define GUINT16_TO_LE(val) (GUINT16_SWAP_LE_BE (val))
    -#else
    #define GINT16_TO_LE(val) ((gint16) (val))
    #define GUINT16_TO_LE(val) ((guint16) (val))
    #define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
    #define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT32_TO_BE(val) ((gint32) (val))
    -#define GUINT32_TO_BE(val) ((guint32) (val))
    -#define GINT32_TO_LE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    -#define GUINT32_TO_LE(val) (GUINT32_SWAP_LE_BE (val))
    -#else
    #define GINT32_TO_LE(val) ((gint32) (val))
    #define GUINT32_TO_LE(val) ((guint32) (val))
    #define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
    #define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define GINT64_TO_BE(val) ((gint64) (val))
    -#define GUINT64_TO_BE(val) ((guint64) (val))
    -#define GINT64_TO_LE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    -#define GUINT64_TO_LE(val) (GUINT64_SWAP_LE_BE (val))
    -#else
    #define GINT64_TO_LE(val) ((gint64) (val))
    #define GUINT64_TO_LE(val) ((guint64) (val))
    #define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
    #define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
    -#endif
    -#ifdef __LP64__
    #define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
    #define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
    #define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
    #define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
    -#else
    -#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
    -#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
    -#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
    -#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
    -#endif
    #define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
    #define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
    #define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
    #define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
    -#ifdef __LP64__
    #define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
    #define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
    #define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
    #define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
    -#else
    -#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
    -#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
    -#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
    -#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
    -#endif
    -#ifdef __BIG_ENDIAN__
    -#define G_BYTE_ORDER G_BIG_ENDIAN
    -#else
    #define G_BYTE_ORDER G_LITTLE_ENDIAN
    -#endif
    #define GLIB_SYSDEF_POLLIN =1
    #define GLIB_SYSDEF_POLLOUT =4
    Binary file Frameworks/libgthread.framework/Versions/2.42.1/libgthread has changed
    Binary file Frameworks/libintl.framework/Versions/0.19.3/libintl has changed
    Binary file Frameworks/libmeanwhile.framework/Versions/1.0.2/libmeanwhile has changed
    --- a/Frameworks/libpurple.framework/Headers Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libpurple.framework/Headers Tue Mar 21 20:37:34 2017 +0100
    @@ -1,1 +1,1 @@
    -Versions/2.10.12r8d2874a79747/Headers
    \ No newline at end of file
    +Versions/2.12.0r11b8084bcff4/Headers
    \ No newline at end of file
    --- a/Frameworks/libpurple.framework/Resources Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libpurple.framework/Resources Tue Mar 21 20:37:34 2017 +0100
    @@ -1,1 +1,1 @@
    -Versions/2.10.12r8d2874a79747/Resources
    \ No newline at end of file
    +Versions/2.12.0r11b8084bcff4/Resources
    \ No newline at end of file
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/account.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1194 +0,0 @@
    -/**
    - * @file account.h Account API
    - * @ingroup core
    - * @see @ref account-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_ACCOUNT_H_
    -#define _PURPLE_ACCOUNT_H_
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -
    -/** @copydoc _PurpleAccountUiOps */
    -typedef struct _PurpleAccountUiOps PurpleAccountUiOps;
    -/** @copydoc _PurpleAccount */
    -typedef struct _PurpleAccount PurpleAccount;
    -
    -typedef gboolean (*PurpleFilterAccountFunc)(PurpleAccount *account);
    -typedef void (*PurpleAccountRequestAuthorizationCb)(void *);
    -typedef void (*PurpleAccountRegistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
    -typedef void (*PurpleAccountUnregistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
    -typedef void (*PurpleSetPublicAliasSuccessCallback)(PurpleAccount *account, const char *new_alias);
    -typedef void (*PurpleSetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
    -typedef void (*PurpleGetPublicAliasSuccessCallback)(PurpleAccount *account, const char *alias);
    -typedef void (*PurpleGetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
    -
    -#include "connection.h"
    -#include "log.h"
    -#include "privacy.h"
    -#include "proxy.h"
    -#include "prpl.h"
    -#include "status.h"
    -
    -/**
    - * Account request types.
    - */
    -typedef enum
    -{
    - PURPLE_ACCOUNT_REQUEST_AUTHORIZATION = 0 /* Account authorization request */
    -} PurpleAccountRequestType;
    -
    -/**
    - * Account request response types
    - */
    -typedef enum
    -{
    - PURPLE_ACCOUNT_RESPONSE_IGNORE = -2,
    - PURPLE_ACCOUNT_RESPONSE_DENY = -1,
    - PURPLE_ACCOUNT_RESPONSE_PASS = 0,
    - PURPLE_ACCOUNT_RESPONSE_ACCEPT = 1
    -} PurpleAccountRequestResponse;
    -
    -/** Account UI operations, used to notify the user of status changes and when
    - * buddies add this account to their buddy lists.
    - */
    -struct _PurpleAccountUiOps
    -{
    - /** A buddy who is already on this account's buddy list added this account
    - * to their buddy list.
    - */
    - void (*notify_added)(PurpleAccount *account,
    - const char *remote_user,
    - const char *id,
    - const char *alias,
    - const char *message);
    -
    - /** This account's status changed. */
    - void (*status_changed)(PurpleAccount *account,
    - PurpleStatus *status);
    -
    - /** Someone we don't have on our list added us; prompt to add them. */
    - void (*request_add)(PurpleAccount *account,
    - const char *remote_user,
    - const char *id,
    - const char *alias,
    - const char *message);
    -
    - /** Prompt for authorization when someone adds this account to their buddy
    - * list. To authorize them to see this account's presence, call \a
    - * authorize_cb (\a user_data); otherwise call \a deny_cb (\a user_data);
    - * @return a UI-specific handle, as passed to #close_account_request.
    - */
    - void *(*request_authorize)(PurpleAccount *account,
    - const char *remote_user,
    - const char *id,
    - const char *alias,
    - const char *message,
    - gboolean on_list,
    - PurpleAccountRequestAuthorizationCb authorize_cb,
    - PurpleAccountRequestAuthorizationCb deny_cb,
    - void *user_data);
    -
    - /** Close a pending request for authorization. \a ui_handle is a handle
    - * as returned by #request_authorize.
    - */
    - void (*close_account_request)(void *ui_handle);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/** Structure representing an account.
    - */
    -struct _PurpleAccount
    -{
    - char *username; /**< The username. */
    - char *alias; /**< How you appear to yourself. */
    - char *password; /**< The account password. */
    - char *user_info; /**< User information. */
    -
    - char *buddy_icon_path; /**< The buddy icon's non-cached path. */
    -
    - gboolean remember_pass; /**< Remember the password. */
    -
    - char *protocol_id; /**< The ID of the protocol. */
    -
    - PurpleConnection *gc; /**< The connection handle. */
    - gboolean disconnecting; /**< The account is currently disconnecting */
    -
    - GHashTable *settings; /**< Protocol-specific settings. */
    - GHashTable *ui_settings; /**< UI-specific settings. */
    -
    - PurpleProxyInfo *proxy_info; /**< Proxy information. This will be set */
    - /* to NULL when the account inherits */
    - /* proxy settings from global prefs. */
    -
    - /*
    - * TODO: Supplementing the next two linked lists with hash tables
    - * should help performance a lot when these lists are long. This
    - * matters quite a bit for protocols like MSN, where all your
    - * buddies are added to your permit list. Currently we have to
    - * iterate through the entire list if we want to check if someone
    - * is permitted or denied. We should do this for 3.0.0.
    - * Or maybe use a GTree.
    - */
    - GSList *permit; /**< Permit list. */
    - GSList *deny; /**< Deny list. */
    - PurplePrivacyType perm_deny; /**< The permit/deny setting. */
    -
    - GList *status_types; /**< Status types. */
    -
    - PurplePresence *presence; /**< Presence. */
    - PurpleLog *system_log; /**< The system log */
    -
    - void *ui_data; /**< The UI can put data here. */
    - PurpleAccountRegistrationCb registration_cb;
    - void *registration_cb_user_data;
    -
    - gpointer priv; /**< Pointer to opaque private data. */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Account API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new account.
    - *
    - * @param username The username.
    - * @param protocol_id The protocol ID.
    - *
    - * @return The new account.
    - */
    -PurpleAccount *purple_account_new(const char *username, const char *protocol_id);
    -
    -/**
    - * Destroys an account.
    - *
    - * @param account The account to destroy.
    - */
    -void purple_account_destroy(PurpleAccount *account);
    -
    -/**
    - * Connects to an account.
    - *
    - * @param account The account to connect to.
    - */
    -void purple_account_connect(PurpleAccount *account);
    -
    -/**
    - * Sets the callback for successful registration.
    - *
    - * @param account The account for which this callback should be used
    - * @param cb The callback
    - * @param user_data The user data passed to the callback
    - */
    -void purple_account_set_register_callback(PurpleAccount *account, PurpleAccountRegistrationCb cb, void *user_data);
    -
    -/**
    - * Registers an account.
    - *
    - * @param account The account to register.
    - */
    -void purple_account_register(PurpleAccount *account);
    -
    -/**
    - * Unregisters an account (deleting it from the server).
    - *
    - * @param account The account to unregister.
    - * @param cb Optional callback to be called when unregistration is complete
    - * @param user_data user data to pass to the callback
    - */
    -void purple_account_unregister(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
    -
    -/**
    - * Disconnects from an account.
    - *
    - * @param account The account to disconnect from.
    - */
    -void purple_account_disconnect(PurpleAccount *account);
    -
    -/**
    - * Notifies the user that the account was added to a remote user's
    - * buddy list.
    - *
    - * This will present a dialog informing the user that he was added to the
    - * remote user's buddy list.
    - *
    - * @param account The account that was added.
    - * @param remote_user The name of the user that added this account.
    - * @param id The optional ID of the local account. Rarely used.
    - * @param alias The optional alias of the user.
    - * @param message The optional message sent from the user adding you.
    - */
    -void purple_account_notify_added(PurpleAccount *account, const char *remote_user,
    - const char *id, const char *alias,
    - const char *message);
    -
    -/**
    - * Notifies the user that the account was addded to a remote user's buddy
    - * list and asks ther user if they want to add the remote user to their buddy
    - * list.
    - *
    - * This will present a dialog informing the local user that the remote user
    - * added them to the remote user's buddy list and will ask if they want to add
    - * the remote user to the buddy list.
    - *
    - * @param account The account that was added.
    - * @param remote_user The name of the user that added this account.
    - * @param id The optional ID of the local account. Rarely used.
    - * @param alias The optional alias of the user.
    - * @param message The optional message sent from the user adding you.
    - */
    -void purple_account_request_add(PurpleAccount *account, const char *remote_user,
    - const char *id, const char *alias,
    - const char *message);
    -
    -/**
    - * Notifies the user that a remote user has wants to add the local user
    - * to his or her buddy list and requires authorization to do so.
    - *
    - * This will present a dialog informing the user of this and ask if the
    - * user authorizes or denies the remote user from adding him.
    - *
    - * @param account The account that was added
    - * @param remote_user The name of the user that added this account.
    - * @param id The optional ID of the local account. Rarely used.
    - * @param alias The optional alias of the remote user.
    - * @param message The optional message sent by the user wanting to add you.
    - * @param on_list Is the remote user already on the buddy list?
    - * @param auth_cb The callback called when the local user accepts
    - * @param deny_cb The callback called when the local user rejects
    - * @param user_data Data to be passed back to the above callbacks
    - *
    - * @return A UI-specific handle.
    - */
    -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);
    -
    -/**
    - * Close account requests registered for the given PurpleAccount
    - *
    - * @param account The account for which requests should be closed
    - */
    -void purple_account_request_close_with_account(PurpleAccount *account);
    -
    -/**
    - * Close the account request for the given ui handle
    - *
    - * @param ui_handle The ui specific handle for which requests should be closed
    - */
    -void purple_account_request_close(void *ui_handle);
    -
    -/**
    - * Requests a password from the user for the account. Does not set the
    - * account password on success; do that in ok_cb if desired.
    - *
    - * @param account The account to request the password for.
    - * @param ok_cb The callback for the OK button.
    - * @param cancel_cb The callback for the cancel button.
    - * @param user_data User data to be passed into callbacks.
    - */
    -void purple_account_request_password(PurpleAccount *account, GCallback ok_cb,
    - GCallback cancel_cb, void *user_data);
    -
    -/**
    - * Requests information from the user to change the account's password.
    - *
    - * @param account The account to change the password on.
    - */
    -void purple_account_request_change_password(PurpleAccount *account);
    -
    -/**
    - * Requests information from the user to change the account's
    - * user information.
    - *
    - * @param account The account to change the user information on.
    - */
    -void purple_account_request_change_user_info(PurpleAccount *account);
    -
    -/**
    - * Sets the account's username.
    - *
    - * @param account The account.
    - * @param username The username.
    - */
    -void purple_account_set_username(PurpleAccount *account, const char *username);
    -
    -/**
    - * Sets the account's password.
    - *
    - * @param account The account.
    - * @param password The password.
    - */
    -void purple_account_set_password(PurpleAccount *account, const char *password);
    -
    -/**
    - * Sets the account's alias.
    - *
    - * @param account The account.
    - * @param alias The alias.
    - */
    -void purple_account_set_alias(PurpleAccount *account, const char *alias);
    -
    -/**
    - * Sets the account's user information
    - *
    - * @param account The account.
    - * @param user_info The user information.
    - */
    -void purple_account_set_user_info(PurpleAccount *account, const char *user_info);
    -
    -/**
    - * Sets the account's buddy icon path.
    - *
    - * @param account The account.
    - * @param path The buddy icon non-cached path.
    - */
    -void purple_account_set_buddy_icon_path(PurpleAccount *account, const char *path);
    -
    -/**
    - * Sets the account's protocol ID.
    - *
    - * @param account The account.
    - * @param protocol_id The protocol ID.
    - */
    -void purple_account_set_protocol_id(PurpleAccount *account,
    - const char *protocol_id);
    -
    -/**
    - * Sets the account's connection.
    - *
    - * @param account The account.
    - * @param gc The connection.
    - */
    -void purple_account_set_connection(PurpleAccount *account, PurpleConnection *gc);
    -
    -/**
    - * Sets whether or not this account should save its password.
    - *
    - * @param account The account.
    - * @param value @c TRUE if it should remember the password.
    - */
    -void purple_account_set_remember_password(PurpleAccount *account, gboolean value);
    -
    -/**
    - * Sets whether or not this account should check for mail.
    - *
    - * @param account The account.
    - * @param value @c TRUE if it should check for mail.
    - */
    -void purple_account_set_check_mail(PurpleAccount *account, gboolean value);
    -
    -/**
    - * Sets whether or not this account is enabled for the specified
    - * UI.
    - *
    - * @param account The account.
    - * @param ui The UI.
    - * @param value @c TRUE if it is enabled.
    - */
    -void purple_account_set_enabled(PurpleAccount *account, const char *ui,
    - gboolean value);
    -
    -/**
    - * Sets the account's proxy information.
    - *
    - * @param account The account.
    - * @param info The proxy information.
    - */
    -void purple_account_set_proxy_info(PurpleAccount *account, PurpleProxyInfo *info);
    -
    -/**
    - * Sets the account's privacy type.
    - *
    - * @param account The account.
    - * @param privacy_type The privacy type.
    - *
    - * @since 2.7.0
    - */
    -void purple_account_set_privacy_type(PurpleAccount *account, PurplePrivacyType privacy_type);
    -
    -/**
    - * Sets the account's status types.
    - *
    - * @param account The account.
    - * @param status_types The list of status types.
    - */
    -void purple_account_set_status_types(PurpleAccount *account, GList *status_types);
    -
    -/**
    - * Variadic version of purple_account_set_status_list(); the variadic list
    - * replaces @a attrs, and should be <tt>NULL</tt>-terminated.
    - *
    - * @copydoc purple_account_set_status_list()
    - */
    -void purple_account_set_status(PurpleAccount *account, const char *status_id,
    - gboolean active, ...) G_GNUC_NULL_TERMINATED;
    -
    -
    -/**
    - * Activates or deactivates a status. All changes to the statuses of
    - * an account go through this function or purple_account_set_status().
    - *
    - * You can only deactivate an exclusive status by activating another exclusive
    - * status. So, if @a status_id is an exclusive status and @a active is @c
    - * FALSE, this function does nothing.
    - *
    - * @param account The account.
    - * @param status_id The ID of the status.
    - * @param active Whether @a status_id is to be activated (<tt>TRUE</tt>) or
    - * deactivated (<tt>FALSE</tt>).
    - * @param attrs A list of <tt>const char *</tt> attribute names followed by
    - * <tt>const char *</tt> attribute values for the status.
    - * (For example, one pair might be <tt>"message"</tt> followed
    - * by <tt>"hello, talk to me!"</tt>.)
    - */
    -void purple_account_set_status_list(PurpleAccount *account,
    - const char *status_id, gboolean active, GList *attrs);
    -
    -/**
    - * Set a server-side (public) alias for this account. The account
    - * must already be connected.
    - *
    - * Currently, the public alias is not stored locally, although this
    - * may change in a later version.
    - *
    - * @param account The account
    - * @param alias The new public alias for this account or NULL
    - * to unset the alias/nickname (or return it to
    - * a protocol-specific "default", like the username)
    - * @param success_cb A callback which will be called if the alias
    - * is successfully set on the server (or NULL).
    - * @param failure_cb A callback which will be called if the alias
    - * is not successfully set on the server (or NULL).
    - *
    - * @since 2.7.0
    - */
    -void purple_account_set_public_alias(PurpleAccount *account,
    - const char *alias, PurpleSetPublicAliasSuccessCallback success_cb,
    - PurpleSetPublicAliasFailureCallback failure_cb);
    -
    -/**
    - * Fetch the server-side (public) alias for this account. The account
    - * must already be connected.
    - *
    - * @param account The account
    - * @param success_cb A callback which will be called with the alias
    - * @param failure_cb A callback which will be called if the prpl is
    - * unable to retrieve the server-side alias.
    - * @since 2.7.0
    - */
    -void purple_account_get_public_alias(PurpleAccount *account,
    - PurpleGetPublicAliasSuccessCallback success_cb,
    - PurpleGetPublicAliasFailureCallback failure_cb);
    -
    -/**
    - * Return whether silence suppression is used during voice call.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if suppression is used, or @c FALSE if not.
    - */
    -gboolean purple_account_get_silence_suppression(const PurpleAccount *account);
    -
    -/**
    - * Sets whether silence suppression is used during voice call.
    - *
    - * @param account The account.
    - * @param value @c TRUE if suppression should be used.
    - */
    -void purple_account_set_silence_suppression(PurpleAccount *account,
    - gboolean value);
    -
    -/**
    - * Clears all protocol-specific settings on an account.
    - *
    - * @param account The account.
    - */
    -void purple_account_clear_settings(PurpleAccount *account);
    -
    -/**
    - * Removes an account-specific setting by name.
    - *
    - * @param account The account.
    - * @param setting The setting to remove.
    - *
    - * @since 2.6.0
    - */
    -void purple_account_remove_setting(PurpleAccount *account, const char *setting);
    -
    -/**
    - * Sets a protocol-specific integer setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_int(PurpleAccount *account, const char *name, int value);
    -
    -/**
    - * Sets a protocol-specific string setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_string(PurpleAccount *account, const char *name,
    - const char *value);
    -
    -/**
    - * Sets a protocol-specific boolean setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_bool(PurpleAccount *account, const char *name,
    - gboolean value);
    -
    -/**
    - * Sets a UI-specific integer setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_ui_int(PurpleAccount *account, const char *ui,
    - const char *name, int value);
    -
    -/**
    - * Sets a UI-specific string setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_ui_string(PurpleAccount *account, const char *ui,
    - const char *name, const char *value);
    -
    -/**
    - * Sets a UI-specific boolean setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param value The setting's value.
    - */
    -void purple_account_set_ui_bool(PurpleAccount *account, const char *ui,
    - const char *name, gboolean value);
    -
    -/**
    - * Returns whether or not the account is connected.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if connected, or @c FALSE otherwise.
    - */
    -gboolean purple_account_is_connected(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not the account is connecting.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if connecting, or @c FALSE otherwise.
    - */
    -gboolean purple_account_is_connecting(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not the account is disconnected.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if disconnected, or @c FALSE otherwise.
    - */
    -gboolean purple_account_is_disconnected(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's username.
    - *
    - * @param account The account.
    - *
    - * @return The username.
    - */
    -const char *purple_account_get_username(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's password.
    - *
    - * @param account The account.
    - *
    - * @return The password.
    - */
    -const char *purple_account_get_password(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's alias.
    - *
    - * @param account The account.
    - *
    - * @return The alias.
    - */
    -const char *purple_account_get_alias(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's user information.
    - *
    - * @param account The account.
    - *
    - * @return The user information.
    - */
    -const char *purple_account_get_user_info(const PurpleAccount *account);
    -
    -/**
    - * Gets the account's buddy icon path.
    - *
    - * @param account The account.
    - *
    - * @return The buddy icon's non-cached path.
    - */
    -const char *purple_account_get_buddy_icon_path(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's protocol ID.
    - *
    - * @param account The account.
    - *
    - * @return The protocol ID.
    - */
    -const char *purple_account_get_protocol_id(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's protocol name.
    - *
    - * @param account The account.
    - *
    - * @return The protocol name.
    - */
    -const char *purple_account_get_protocol_name(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's connection.
    - *
    - * @param account The account.
    - *
    - * @return The connection.
    - */
    -PurpleConnection *purple_account_get_connection(const PurpleAccount *account);
    -
    -/**
    - * Returns a name for this account appropriate for display to the user. In
    - * order of preference: the account's alias; the contact or buddy alias (if
    - * the account exists on its own buddy list); the connection's display name;
    - * the account's username.
    - *
    - * @param account The account.
    - *
    - * @return The name to display.
    - *
    - * @since 2.7.0
    - */
    -const gchar *purple_account_get_name_for_display(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not this account should save its password.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if it should remember the password.
    - */
    -gboolean purple_account_get_remember_password(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not this account should check for mail.
    - *
    - * @param account The account.
    - *
    - * @return @c TRUE if it should check for mail.
    - */
    -gboolean purple_account_get_check_mail(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not this account is enabled for the
    - * specified UI.
    - *
    - * @param account The account.
    - * @param ui The UI.
    - *
    - * @return @c TRUE if it enabled on this UI.
    - */
    -gboolean purple_account_get_enabled(const PurpleAccount *account,
    - const char *ui);
    -
    -/**
    - * Returns the account's proxy information.
    - *
    - * @param account The account.
    - *
    - * @return The proxy information.
    - */
    -PurpleProxyInfo *purple_account_get_proxy_info(const PurpleAccount *account);
    -
    -/**
    - * Returns the account's privacy type.
    - *
    - * @param account The account.
    - *
    - * @return The privacy type.
    - *
    - * @since 2.7.0
    - */
    -PurplePrivacyType purple_account_get_privacy_type(const PurpleAccount *account);
    -
    -/**
    - * Returns the active status for this account. This looks through
    - * the PurplePresence associated with this account and returns the
    - * PurpleStatus that has its active flag set to "TRUE." There can be
    - * only one active PurpleStatus in a PurplePresence.
    - *
    - * @param account The account.
    - *
    - * @return The active status.
    - */
    -PurpleStatus *purple_account_get_active_status(const PurpleAccount *account);
    -
    -/**
    - * Returns the account status with the specified ID.
    - *
    - * Note that this works differently than purple_buddy_get_status() in that
    - * it will only return NULL if the status was not registered.
    - *
    - * @param account The account.
    - * @param status_id The status ID.
    - *
    - * @return The status, or NULL if it was never registered.
    - */
    -PurpleStatus *purple_account_get_status(const PurpleAccount *account,
    - const char *status_id);
    -
    -/**
    - * Returns the account status type with the specified ID.
    - *
    - * @param account The account.
    - * @param id The ID of the status type to find.
    - *
    - * @return The status type if found, or NULL.
    - */
    -PurpleStatusType *purple_account_get_status_type(const PurpleAccount *account,
    - const char *id);
    -
    -/**
    - * Returns the account status type with the specified primitive.
    - * Note: It is possible for an account to have more than one
    - * PurpleStatusType with the same primitive. In this case, the
    - * first PurpleStatusType is returned.
    - *
    - * @param account The account.
    - * @param primitive The type of the status type to find.
    - *
    - * @return The status if found, or NULL.
    - */
    -PurpleStatusType *purple_account_get_status_type_with_primitive(
    - const PurpleAccount *account,
    - PurpleStatusPrimitive primitive);
    -
    -/**
    - * Returns the account's presence.
    - *
    - * @param account The account.
    - *
    - * @return The account's presence.
    - */
    -PurplePresence *purple_account_get_presence(const PurpleAccount *account);
    -
    -/**
    - * Returns whether or not an account status is active.
    - *
    - * @param account The account.
    - * @param status_id The status ID.
    - *
    - * @return TRUE if active, or FALSE if not.
    - */
    -gboolean purple_account_is_status_active(const PurpleAccount *account,
    - const char *status_id);
    -
    -/**
    - * Returns the account's status types.
    - *
    - * @param account The account.
    - *
    - * @constreturn The account's status types.
    - */
    -GList *purple_account_get_status_types(const PurpleAccount *account);
    -
    -/**
    - * Returns a protocol-specific integer setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -int purple_account_get_int(const PurpleAccount *account, const char *name,
    - int default_value);
    -
    -/**
    - * Returns a protocol-specific string setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -const char *purple_account_get_string(const PurpleAccount *account,
    - const char *name,
    - const char *default_value);
    -
    -/**
    - * Returns a protocol-specific boolean setting for an account.
    - *
    - * @param account The account.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -gboolean purple_account_get_bool(const PurpleAccount *account, const char *name,
    - gboolean default_value);
    -
    -/**
    - * Returns a UI-specific integer setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -int purple_account_get_ui_int(const PurpleAccount *account, const char *ui,
    - const char *name, int default_value);
    -
    -/**
    - * Returns a UI-specific string setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -const char *purple_account_get_ui_string(const PurpleAccount *account,
    - const char *ui, const char *name,
    - const char *default_value);
    -
    -/**
    - * Returns a UI-specific boolean setting for an account.
    - *
    - * @param account The account.
    - * @param ui The UI name.
    - * @param name The name of the setting.
    - * @param default_value The default value.
    - *
    - * @return The value.
    - */
    -gboolean purple_account_get_ui_bool(const PurpleAccount *account, const char *ui,
    - const char *name, gboolean default_value);
    -
    -
    -/**
    - * Returns the system log for an account.
    - *
    - * @param account The account.
    - * @param create Should it be created if it doesn't exist?
    - *
    - * @return The log.
    - *
    - * @note Callers should almost always pass @c FALSE for @a create.
    - * Passing @c TRUE could result in an existing log being reopened,
    - * if the log has already been closed, which not all loggers deal
    - * with appropriately.
    - */
    -PurpleLog *purple_account_get_log(PurpleAccount *account, gboolean create);
    -
    -/**
    - * Frees the system log of an account
    - *
    - * @param account The account.
    - */
    -void purple_account_destroy_log(PurpleAccount *account);
    -
    -/**
    - * Adds a buddy to the server-side buddy list for the specified account.
    - *
    - * @param account The account.
    - * @param buddy The buddy to add.
    - *
    - * @deprecated Use purple_account_add_buddy_with_invite and \c NULL message.
    - */
    -void purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy);
    -/**
    - * Adds a buddy to the server-side buddy list for the specified account.
    - *
    - * @param account The account.
    - * @param buddy The buddy to add.
    - * @param message The invite message. This may be ignored by a prpl.
    - *
    - * @since 2.8.0
    - */
    -void purple_account_add_buddy_with_invite(PurpleAccount *account, PurpleBuddy *buddy, const char *message);
    -
    -/**
    - * Adds a list of buddies to the server-side buddy list.
    - *
    - * @param account The account.
    - * @param buddies The list of PurpleBlistNodes representing the buddies to add.
    - *
    - * @deprecated Use purple_account_add_buddies_with_invite and \c NULL message.
    - */
    -void purple_account_add_buddies(PurpleAccount *account, GList *buddies);
    -/**
    - * Adds a list of buddies to the server-side buddy list.
    - *
    - * @param account The account.
    - * @param buddies The list of PurpleBlistNodes representing the buddies to add.
    - * @param message The invite message. This may be ignored by a prpl.
    - *
    - * @since 2.8.0
    - */
    -void purple_account_add_buddies_with_invite(PurpleAccount *account, GList *buddies, const char *message);
    -
    -/**
    - * Removes a buddy from the server-side buddy list.
    - *
    - * @param account The account.
    - * @param buddy The buddy to remove.
    - * @param group The group to remove the buddy from.
    - */
    -void purple_account_remove_buddy(PurpleAccount *account, PurpleBuddy *buddy,
    - PurpleGroup *group);
    -
    -/**
    - * Removes a list of buddies from the server-side buddy list.
    - *
    - * @note The lists buddies and groups are parallel lists. Be sure that node n of
    - * groups matches node n of buddies.
    - *
    - * @param account The account.
    - * @param buddies The list of buddies to remove.
    - * @param groups The list of groups to remove buddies from. Each node of this
    - * list should match the corresponding node of buddies.
    - */
    -void purple_account_remove_buddies(PurpleAccount *account, GList *buddies,
    - GList *groups);
    -
    -/**
    - * Removes a group from the server-side buddy list.
    - *
    - * @param account The account.
    - * @param group The group to remove.
    - */
    -void purple_account_remove_group(PurpleAccount *account, PurpleGroup *group);
    -
    -/**
    - * Changes the password on the specified account.
    - *
    - * @param account The account.
    - * @param orig_pw The old password.
    - * @param new_pw The new password.
    - */
    -void purple_account_change_password(PurpleAccount *account, const char *orig_pw,
    - const char *new_pw);
    -
    -/**
    - * Whether the account supports sending offline messages to buddy.
    - *
    - * @param account The account
    - * @param buddy The buddy
    - */
    -gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy);
    -
    -/**
    - * Get the error that caused the account to be disconnected, or @c NULL if the
    - * account is happily connected or disconnected without an error.
    - *
    - * @param account The account whose error should be retrieved.
    - * @constreturn The type of error and a human-readable description of the
    - * current error, or @c NULL if there is no current error. This
    - * pointer is guaranteed to remain valid until the @ref
    - * account-error-changed signal is emitted for @a account.
    - */
    -const PurpleConnectionErrorInfo *purple_account_get_current_error(PurpleAccount *account);
    -
    -/**
    - * Clear an account's current error state, resetting it to @c NULL.
    - *
    - * @param account The account whose error state should be cleared.
    - */
    -void purple_account_clear_current_error(PurpleAccount *account);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Accounts API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Adds an account to the list of accounts.
    - *
    - * @param account The account.
    - */
    -void purple_accounts_add(PurpleAccount *account);
    -
    -/**
    - * Removes an account from the list of accounts.
    - *
    - * @param account The account.
    - */
    -void purple_accounts_remove(PurpleAccount *account);
    -
    -/**
    - * Deletes an account.
    - *
    - * This will remove any buddies from the buddy list that belong to this
    - * account, buddy pounces that belong to this account, and will also
    - * destroy @a account.
    - *
    - * @param account The account.
    - */
    -void purple_accounts_delete(PurpleAccount *account);
    -
    -/**
    - * Reorders an account.
    - *
    - * @param account The account to reorder.
    - * @param new_index The new index for the account.
    - */
    -void purple_accounts_reorder(PurpleAccount *account, gint new_index);
    -
    -/**
    - * Returns a list of all accounts.
    - *
    - * @constreturn A list of all accounts.
    - */
    -GList *purple_accounts_get_all(void);
    -
    -/**
    - * Returns a list of all enabled accounts
    - *
    - * @return A list of all enabled accounts. The list is owned
    - * by the caller, and must be g_list_free()d to avoid
    - * leaking the nodes.
    - */
    -GList *purple_accounts_get_all_active(void);
    -
    -/**
    - * Finds an account with the specified name and protocol id.
    - *
    - * @param name The account username.
    - * @param protocol The account protocol ID.
    - *
    - * @return The account, if found, or @c FALSE otherwise.
    - */
    -PurpleAccount *purple_accounts_find(const char *name, const char *protocol);
    -
    -/**
    - * This is called by the core after all subsystems and what
    - * not have been initialized. It sets all enabled accounts
    - * to their startup status by signing them on, setting them
    - * away, etc.
    - *
    - * You probably shouldn't call this unless you really know
    - * what you're doing.
    - */
    -void purple_accounts_restore_current_statuses(void);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -/**
    - * Sets the UI operations structure to be used for accounts.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_accounts_set_ui_ops(PurpleAccountUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure used for accounts.
    - *
    - * @return The UI operations structure in use.
    - */
    -PurpleAccountUiOps *purple_accounts_get_ui_ops(void);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Accounts Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the accounts subsystem handle.
    - *
    - * @return The accounts subsystem handle.
    - */
    -void *purple_accounts_get_handle(void);
    -
    -/**
    - * Initializes the accounts subsystem.
    - */
    -void purple_accounts_init(void);
    -
    -/**
    - * Uninitializes the accounts subsystem.
    - */
    -void purple_accounts_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_ACCOUNT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/accountopt.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,395 +0,0 @@
    -/**
    - * @file accountopt.h Account Options 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
    - */
    -#ifndef _PURPLE_ACCOUNTOPT_H_
    -#define _PURPLE_ACCOUNTOPT_H_
    -
    -#include "prefs.h"
    -
    -/**
    - * An option for an account.
    - *
    - * This is set by protocol plugins, and appears in the account settings
    - * dialogs.
    - */
    -typedef struct
    -{
    - PurplePrefType type; /**< The type of value. */
    -
    - char *text; /**< The text that will appear to the user. */
    - char *pref_name; /**< The name of the associated preference. */
    -
    - union
    - {
    - gboolean boolean; /**< The default boolean value. */
    - int integer; /**< The default integer value. */
    - char *string; /**< The default string value. */
    - GList *list; /**< The default list value. */
    -
    - } default_value;
    -
    - gboolean masked; /**< Whether the value entered should be
    - * obscured from view (for passwords and
    - * similar options)
    - */
    -} PurpleAccountOption;
    -
    -/**
    - * A username split.
    - *
    - * This is used by some protocols to separate the fields of the username
    - * into more human-readable components.
    - */
    -typedef struct
    -{
    - char *text; /**< The text that will appear to the user. */
    - char *default_value; /**< The default value. */
    - char field_sep; /**< The field separator. */
    - gboolean reverse; /**< TRUE if the separator should be found
    - starting a the end of the string, FALSE
    - otherwise */
    -
    -} PurpleAccountUserSplit;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Account Option API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new account option. If you know what @a type will be in advance,
    - * consider using purple_account_option_bool_new(),
    - * purple_account_option_int_new(), purple_account_option_string_new() or
    - * purple_account_option_list_new() (as appropriate) instead.
    - *
    - * @param type The type of option.
    - * @param text The text of the option.
    - * @param pref_name The account preference name for the option.
    - *
    - * @return The account option.
    - */
    -PurpleAccountOption *purple_account_option_new(PurplePrefType type,
    - const char *text, const char *pref_name);
    -
    -/**
    - * Creates a new boolean account option.
    - *
    - * @param text The text of the option.
    - * @param pref_name The account preference name for the option.
    - * @param default_value The default value.
    - *
    - * @return The account option.
    - */
    -PurpleAccountOption *purple_account_option_bool_new(const char *text,
    - const char *pref_name, gboolean default_value);
    -
    -/**
    - * Creates a new integer account option.
    - *
    - * @param text The text of the option.
    - * @param pref_name The account preference name for the option.
    - * @param default_value The default value.
    - *
    - * @return The account option.
    - */
    -PurpleAccountOption *purple_account_option_int_new(const char *text,
    - const char *pref_name, int default_value);
    -
    -/**
    - * Creates a new string account option.
    - *
    - * @param text The text of the option.
    - * @param pref_name The account preference name for the option.
    - * @param default_value The default value.
    - *
    - * @return The account option.
    - */
    -PurpleAccountOption *purple_account_option_string_new(const char *text,
    - const char *pref_name, const char *default_value);
    -
    -/**
    - * Creates a new list account option.
    - *
    - * The list passed will be owned by the account option, and the
    - * strings inside will be freed automatically.
    - *
    - * The list is a list of #PurpleKeyValuePair items. The key is the label that
    - * should be displayed to the user, and the <tt>(const char *)</tt> value is
    - * the internal ID that should be passed to purple_account_set_string() to
    - * choose that value.
    - *
    - * @param text The text of the option.
    - * @param pref_name The account preference name for the option.
    - * @param list The key, value list.
    - *
    - * @return The account option.
    - */
    -PurpleAccountOption *purple_account_option_list_new(const char *text,
    - const char *pref_name, GList *list);
    -
    -/**
    - * Destroys an account option.
    - *
    - * @param option The option to destroy.
    - */
    -void purple_account_option_destroy(PurpleAccountOption *option);
    -
    -/**
    - * Sets the default boolean value for an account option.
    - *
    - * @param option The account option.
    - * @param value The default boolean value.
    - */
    -void purple_account_option_set_default_bool(PurpleAccountOption *option,
    - gboolean value);
    -
    -/**
    - * Sets the default integer value for an account option.
    - *
    - * @param option The account option.
    - * @param value The default integer value.
    - */
    -void purple_account_option_set_default_int(PurpleAccountOption *option,
    - int value);
    -
    -/**
    - * Sets the default string value for an account option.
    - *
    - * @param option The account option.
    - * @param value The default string value.
    - */
    -void purple_account_option_set_default_string(PurpleAccountOption *option,
    - const char *value);
    -
    -/**
    - * Sets the masking for an account option. Setting this to %TRUE acts
    - * as a hint to the UI that the option's value should be obscured from
    - * view, like a password.
    - *
    - * @param option The account option.
    - * @param masked The masking.
    - */
    -void
    -purple_account_option_set_masked(PurpleAccountOption *option, gboolean masked);
    -
    -/**
    - * Sets the list values for an account option.
    - *
    - * The list passed will be owned by the account option, and the
    - * strings inside will be freed automatically.
    - *
    - * The list is in key, value pairs. The key is the ID stored and used
    - * internally, and the value is the label displayed.
    - *
    - * @param option The account option.
    - * @param values The default list value.
    - */
    -void purple_account_option_set_list(PurpleAccountOption *option, GList *values);
    -
    -/**
    - * Adds an item to a list account option.
    - *
    - * @param option The account option.
    - * @param key The key.
    - * @param value The value.
    - */
    -void purple_account_option_add_list_item(PurpleAccountOption *option,
    - const char *key, const char *value);
    -
    -/**
    - * Returns the specified account option's type.
    - *
    - * @param option The account option.
    - *
    - * @return The account option's type.
    - */
    -PurplePrefType purple_account_option_get_type(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the text for an account option.
    - *
    - * @param option The account option.
    - *
    - * @return The account option's text.
    - */
    -const char *purple_account_option_get_text(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the name of an account option. This corresponds to the @c pref_name
    - * parameter supplied to purple_account_option_new() or one of the
    - * type-specific constructors.
    - *
    - * @param option The account option.
    - *
    - * @return The option's name.
    - */
    -const char *purple_account_option_get_setting(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the default boolean value for an account option.
    - *
    - * @param option The account option.
    - *
    - * @return The default boolean value.
    - */
    -gboolean purple_account_option_get_default_bool(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the default integer value for an account option.
    - *
    - * @param option The account option.
    - *
    - * @return The default integer value.
    - */
    -int purple_account_option_get_default_int(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the default string value for an account option.
    - *
    - * @param option The account option.
    - *
    - * @return The default string value.
    - */
    -const char *purple_account_option_get_default_string(
    - const PurpleAccountOption *option);
    -
    -/**
    - * Returns the default string value for a list account option.
    - *
    - * @param option The account option.
    - *
    - * @return The default list string value.
    - */
    -const char *purple_account_option_get_default_list_value(
    - const PurpleAccountOption *option);
    -
    -/**
    - * Returns whether an option's value should be masked from view, like a
    - * password. If so, the UI might display each character of the option
    - * as a '*' (for example).
    - *
    - * @param option The account option.
    - *
    - * @return %TRUE if the option's value should be obscured.
    - */
    -gboolean
    -purple_account_option_get_masked(const PurpleAccountOption *option);
    -
    -/**
    - * Returns the list values for an account option.
    - *
    - * @param option The account option.
    - *
    - * @constreturn A list of #PurpleKeyValuePair, mapping the human-readable
    - * description of the value to the <tt>(const char *)</tt> that
    - * should be passed to purple_account_set_string() to set the
    - * option.
    - */
    -GList *purple_account_option_get_list(const PurpleAccountOption *option);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Account User Split API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new account username split.
    - *
    - * @param text The text of the option.
    - * @param default_value The default value.
    - * @param sep The field separator.
    - *
    - * @return The new user split.
    - */
    -PurpleAccountUserSplit *purple_account_user_split_new(const char *text,
    - const char *default_value,
    - char sep);
    -
    -/**
    - * Destroys an account username split.
    - *
    - * @param split The split to destroy.
    - */
    -void purple_account_user_split_destroy(PurpleAccountUserSplit *split);
    -
    -/**
    - * Returns the text for an account username split.
    - *
    - * @param split The account username split.
    - *
    - * @return The account username split's text.
    - */
    -const char *purple_account_user_split_get_text(const PurpleAccountUserSplit *split);
    -
    -/**
    - * Returns the default string value for an account split.
    - *
    - * @param split The account username split.
    - *
    - * @return The default string.
    - */
    -const char *purple_account_user_split_get_default_value(
    - const PurpleAccountUserSplit *split);
    -
    -/**
    - * Returns the field separator for an account split.
    - *
    - * @param split The account username split.
    - *
    - * @return The field separator.
    - */
    -char purple_account_user_split_get_separator(const PurpleAccountUserSplit *split);
    -
    -/**
    - * Returns the 'reverse' value for an account split.
    - *
    - * @param split The account username split.
    - *
    - * @return The 'reverse' value.
    - */
    -gboolean purple_account_user_split_get_reverse(const PurpleAccountUserSplit *split);
    -
    -/**
    - * Sets the 'reverse' value for an account split.
    - *
    - * @param split The account username split.
    - * @param reverse The 'reverse' value
    - */
    -void purple_account_user_split_set_reverse(PurpleAccountUserSplit *split, gboolean reverse);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_ACCOUNTOPT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/auth.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,67 +0,0 @@
    -/**
    - * @file auth.h Authentication routines
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_AUTH_H_
    -#define PURPLE_JABBER_AUTH_H_
    -
    -typedef struct _JabberSaslMech JabberSaslMech;
    -
    -#include "jabber.h"
    -#include "xmlnode.h"
    -
    -typedef enum {
    - JABBER_SASL_STATE_FAIL = -1, /* Abort, Retry, Fail? */
    - JABBER_SASL_STATE_OK = 0, /* Hooray! */
    - JABBER_SASL_STATE_CONTINUE = 1 /* More authentication required */
    -} JabberSaslState;
    -
    -struct _JabberSaslMech {
    - gint8 priority; /* Higher priority will be tried before lower priority */
    - const gchar *name;
    - JabberSaslState (*start)(JabberStream *js, xmlnode *mechanisms, xmlnode **reply, char **msg);
    - JabberSaslState (*handle_challenge)(JabberStream *js, xmlnode *packet, xmlnode **reply, char **msg);
    - JabberSaslState (*handle_success)(JabberStream *js, xmlnode *packet, char **msg);
    - JabberSaslState (*handle_failure)(JabberStream *js, xmlnode *packet, xmlnode **reply, char **msg);
    - void (*dispose)(JabberStream *js);
    -};
    -
    -void jabber_auth_start(JabberStream *js, xmlnode *packet);
    -void jabber_auth_start_old(JabberStream *js);
    -void jabber_auth_handle_challenge(JabberStream *js, xmlnode *packet);
    -void jabber_auth_handle_success(JabberStream *js, xmlnode *packet);
    -void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet);
    -
    -JabberSaslMech *jabber_auth_get_plain_mech(void);
    -JabberSaslMech *jabber_auth_get_digest_md5_mech(void);
    -JabberSaslMech **jabber_auth_get_scram_mechs(gint *count);
    -#ifdef HAVE_CYRUS_SASL
    -JabberSaslMech *jabber_auth_get_cyrus_mech(void);
    -#endif
    -
    -void jabber_auth_add_mech(JabberSaslMech *);
    -void jabber_auth_remove_mech(JabberSaslMech *);
    -
    -void jabber_auth_init(void);
    -void jabber_auth_uninit(void);
    -
    -#endif /* PURPLE_JABBER_AUTH_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/blist.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1278 +0,0 @@
    -/**
    - * @file blist.h Buddy List API
    - * @ingroup core
    - * @see @ref blist-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_BLIST_H_
    -#define _PURPLE_BLIST_H_
    -
    -/* I can't believe I let ChipX86 inspire me to write good code. -Sean */
    -
    -#include <glib.h>
    -
    -/** @copydoc _PurpleBuddyList */
    -typedef struct _PurpleBuddyList PurpleBuddyList;
    -/** @copydoc _PurpleBlistUiOps */
    -typedef struct _PurpleBlistUiOps PurpleBlistUiOps;
    -/** @copydoc _PurpleBlistNode */
    -typedef struct _PurpleBlistNode PurpleBlistNode;
    -
    -/** @copydoc _PurpleChat */
    -typedef struct _PurpleChat PurpleChat;
    -/** @copydoc _PurpleGroup */
    -typedef struct _PurpleGroup PurpleGroup;
    -/** @copydoc _PurpleContact */
    -typedef struct _PurpleContact PurpleContact;
    -/** @copydoc _PurpleBuddy */
    -typedef struct _PurpleBuddy PurpleBuddy;
    -
    -/**************************************************************************/
    -/* Enumerations */
    -/**************************************************************************/
    -typedef enum
    -{
    - PURPLE_BLIST_GROUP_NODE,
    - PURPLE_BLIST_CONTACT_NODE,
    - PURPLE_BLIST_BUDDY_NODE,
    - PURPLE_BLIST_CHAT_NODE,
    - PURPLE_BLIST_OTHER_NODE
    -
    -} PurpleBlistNodeType;
    -
    -#define PURPLE_BLIST_NODE_IS_CHAT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE)
    -#define PURPLE_BLIST_NODE_IS_BUDDY(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE)
    -#define PURPLE_BLIST_NODE_IS_CONTACT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CONTACT_NODE)
    -#define PURPLE_BLIST_NODE_IS_GROUP(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_GROUP_NODE)
    -
    -#define PURPLE_BUDDY_IS_ONLINE(b) \
    - ((b) != NULL && purple_account_is_connected(purple_buddy_get_account(b)) && \
    - purple_presence_is_online(purple_buddy_get_presence(b)))
    -
    -typedef enum
    -{
    - PURPLE_BLIST_NODE_FLAG_NO_SAVE = 1 << 0 /**< node should not be saved with the buddy list */
    -
    -} PurpleBlistNodeFlags;
    -
    -/**
    - * @since 2.6.0
    - */
    -#define PURPLE_BLIST_NODE(obj) ((PurpleBlistNode *)(obj))
    -
    -#define PURPLE_BLIST_NODE_HAS_FLAG(b, f) (purple_blist_node_get_flags((PurpleBlistNode*)(b)) & (f))
    -#define PURPLE_BLIST_NODE_SHOULD_SAVE(b) (! PURPLE_BLIST_NODE_HAS_FLAG(b, PURPLE_BLIST_NODE_FLAG_NO_SAVE))
    -
    -#define PURPLE_BLIST_NODE_NAME(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE ? purple_chat_get_name((PurpleChat*)n) : \
    - purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE ? purple_buddy_get_name((PurpleBuddy*)n) : NULL)
    -
    -/**
    - * @since 2.6.0
    - */
    -#define PURPLE_GROUP(obj) ((PurpleGroup *)(obj))
    -
    -/**
    - * @since 2.6.0
    - */
    -#define PURPLE_CONTACT(obj) ((PurpleContact *)(obj))
    -
    -/**
    - * @since 2.6.0
    - */
    -#define PURPLE_BUDDY(obj) ((PurpleBuddy *)(obj))
    -
    -/**
    - * @since 2.6.0
    - */
    -#define PURPLE_CHAT(obj) ((PurpleChat *)(obj))
    -
    -#include "account.h"
    -#include "buddyicon.h"
    -#include "media.h"
    -#include "status.h"
    -
    -/**************************************************************************/
    -/* Data Structures */
    -/**************************************************************************/
    -
    -#if !(defined PURPLE_HIDE_STRUCTS) || (defined _PURPLE_BLIST_C_)
    -
    -/**
    - * A Buddy list node. This can represent a group, a buddy, or anything else.
    - * This is a base class for PurpleBuddy, PurpleContact, PurpleGroup, and for
    - * anything else that wants to put itself in the buddy list. */
    -struct _PurpleBlistNode {
    - PurpleBlistNodeType type; /**< The type of node this is */
    - PurpleBlistNode *prev; /**< The sibling before this buddy. */
    - PurpleBlistNode *next; /**< The sibling after this buddy. */
    - PurpleBlistNode *parent; /**< The parent of this node */
    - PurpleBlistNode *child; /**< The child of this node */
    - GHashTable *settings; /**< per-node settings */
    - void *ui_data; /**< The UI can put data here. */
    - PurpleBlistNodeFlags flags; /**< The buddy flags */
    -};
    -
    -/**
    - * A buddy. This contains everything Purple will ever need to know about someone on the buddy list. Everything.
    - */
    -struct _PurpleBuddy {
    - PurpleBlistNode node; /**< The node that this buddy inherits from */
    - char *name; /**< The name of the buddy. */
    - char *alias; /**< The user-set alias of the buddy */
    - char *server_alias; /**< The server-specified alias of the buddy. (i.e. MSN "Friendly Names") */
    - void *proto_data; /**< This allows the prpl to associate whatever data it wants with a buddy */
    - PurpleBuddyIcon *icon; /**< The buddy icon. */
    - PurpleAccount *account; /**< the account this buddy belongs to */
    - PurplePresence *presence;
    - PurpleMediaCaps media_caps; /**< The media capabilities of the buddy. */
    -};
    -
    -/**
    - * A contact. This contains everything Purple will ever need to know about a contact.
    - */
    -struct _PurpleContact {
    - PurpleBlistNode node; /**< The node that this contact inherits from. */
    - char *alias; /**< The user-set alias of the contact */
    - int totalsize; /**< The number of buddies in this contact */
    - int currentsize; /**< The number of buddies in this contact corresponding to online accounts */
    - int online; /**< The number of buddies in this contact who are currently online */
    - PurpleBuddy *priority; /**< The "top" buddy for this contact */
    - gboolean priority_valid; /**< Is priority valid? */
    -};
    -
    -
    -/**
    - * A group. This contains everything Purple will ever need to know about a group.
    - */
    -struct _PurpleGroup {
    - PurpleBlistNode node; /**< The node that this group inherits from */
    - char *name; /**< The name of this group. */
    - int totalsize; /**< The number of chats and contacts in this group */
    - int currentsize; /**< The number of chats and contacts in this group corresponding to online accounts */
    - int online; /**< The number of chats and contacts in this group who are currently online */
    -};
    -
    -/**
    - * A chat. This contains everything Purple needs to put a chat room in the
    - * buddy list.
    - */
    -struct _PurpleChat {
    - PurpleBlistNode node; /**< The node that this chat inherits from */
    - char *alias; /**< The display name of this chat. */
    - GHashTable *components; /**< the stuff the protocol needs to know to join the chat */
    - PurpleAccount *account; /**< The account this chat is attached to */
    -};
    -
    -/**
    - * The Buddy List
    - */
    -struct _PurpleBuddyList {
    - PurpleBlistNode *root; /**< The first node in the buddy list */
    - GHashTable *buddies; /**< Every buddy in this list */
    - void *ui_data; /**< UI-specific data. */
    -};
    -
    -#endif /* PURPLE_HIDE_STRUCTS && PURPLE_BLIST_STRUCTS */
    -
    -/**
    - * Buddy list UI operations.
    - *
    - * Any UI representing a buddy list must assign a filled-out PurpleBlistUiOps
    - * structure to the buddy list core.
    - */
    -struct _PurpleBlistUiOps
    -{
    - void (*new_list)(PurpleBuddyList *list); /**< Sets UI-specific data on a buddy list. */
    - void (*new_node)(PurpleBlistNode *node); /**< Sets UI-specific data on a node. */
    - void (*show)(PurpleBuddyList *list); /**< The core will call this when it's finished doing its core stuff */
    - void (*update)(PurpleBuddyList *list,
    - PurpleBlistNode *node); /**< This will update a node in the buddy list. */
    - void (*remove)(PurpleBuddyList *list,
    - PurpleBlistNode *node); /**< This removes a node from the list */
    - void (*destroy)(PurpleBuddyList *list); /**< When the list is destroyed, this is called to destroy the UI. */
    - void (*set_visible)(PurpleBuddyList *list,
    - gboolean show); /**< Hides or unhides the buddy list */
    - void (*request_add_buddy)(PurpleAccount *account, const char *username,
    - const char *group, const char *alias);
    - void (*request_add_chat)(PurpleAccount *account, PurpleGroup *group,
    - const char *alias, const char *name);
    - void (*request_add_group)(void);
    -
    - /**
    - * This is called when a node has been modified and should be saved.
    - *
    - * Implementation of this UI op is OPTIONAL. If not implemented, it will
    - * be set to a fallback function that saves data to blist.xml like in
    - * previous libpurple versions.
    - *
    - * @param node The node which has been modified.
    - *
    - * @since 2.6.0.
    - */
    - void (*save_node)(PurpleBlistNode *node);
    -
    - /**
    - * Called when a node is about to be removed from the buddy list.
    - * The UI op should update the relevant data structures to remove this
    - * node (for example, removing a buddy from the group this node is in).
    - *
    - * Implementation of this UI op is OPTIONAL. If not implemented, it will
    - * be set to a fallback function that saves data to blist.xml like in
    - * previous libpurple versions.
    - *
    - * @param node The node which has been modified.
    - * @since 2.6.0.
    - */
    - void (*remove_node)(PurpleBlistNode *node);
    -
    - /**
    - * Called to save all the data for an account. If the UI sets this,
    - * the callback must save the privacy and buddy list data for an account.
    - * If the account is NULL, save the data for all accounts.
    - *
    - * Implementation of this UI op is OPTIONAL. If not implemented, it will
    - * be set to a fallback function that saves data to blist.xml like in
    - * previous libpurple versions.
    - *
    - * @param account The account whose data to save. If NULL, save all data
    - * for all accounts.
    - * @since 2.6.0.
    - */
    - void (*save_account)(PurpleAccount *account);
    -
    - void (*_purple_reserved1)(void);
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Buddy List API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new buddy list
    - *
    - * @return The new buddy list.
    - * @deprecated In 3.0.0, this will be handled by purple_blist_init()
    - */
    -PurpleBuddyList *purple_blist_new(void);
    -
    -/**
    - * Sets the main buddy list.
    - *
    - * @param blist The buddy list you want to use.
    - * @deprecated In 3.0.0, this will be handled by purple_blist_init()
    - */
    -void purple_set_blist(PurpleBuddyList *blist);
    -
    -/**
    - * Returns the main buddy list.
    - *
    - * @return The main buddy list.
    - */
    -PurpleBuddyList *purple_get_blist(void);
    -
    -/**
    - * Returns the root node of the main buddy list.
    - *
    - * @return The root node.
    - */
    -PurpleBlistNode *purple_blist_get_root(void);
    -
    -/**
    - * Returns a list of every buddy in the list. Use of this function is
    - * discouraged if you do not actually need every buddy in the list. Use
    - * purple_find_buddies instead.
    - *
    - * @return A list of every buddy in the list. Caller is responsible for
    - * freeing the list.
    - *
    - * @see purple_find_buddies
    - * @since 2.6.0
    - */
    -GSList *purple_blist_get_buddies(void);
    -
    -/**
    - * Returns the UI data for the list.
    - *
    - * @return The UI data for the list.
    - *
    - * @since 2.6.0
    - */
    -gpointer purple_blist_get_ui_data(void);
    -
    -/**
    - * Sets the UI data for the list.
    - *
    - * @param ui_data The UI data for the list.
    - *
    - * @since 2.6.0
    - */
    -void purple_blist_set_ui_data(gpointer ui_data);
    -
    -/**
    - * Returns the next node of a given node. This function is to be used to iterate
    - * over the tree returned by purple_get_blist.
    - *
    - * @param node A node.
    - * @param offline Whether to include nodes for offline accounts
    - * @return The next node
    - * @see purple_blist_node_get_parent
    - * @see purple_blist_node_get_first_child
    - * @see purple_blist_node_get_sibling_next
    - * @see purple_blist_node_get_sibling_prev
    - */
    -PurpleBlistNode *purple_blist_node_next(PurpleBlistNode *node, gboolean offline);
    -
    -/**
    - * Returns the parent node of a given node.
    - *
    - * @param node A node.
    - * @return The parent node.
    - * @since 2.4.0
    - * @see purple_blist_node_get_first_child
    - * @see purple_blist_node_get_sibling_next
    - * @see purple_blist_node_get_sibling_prev
    - * @see purple_blist_node_next
    - */
    -PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node);
    -
    -/**
    - * Returns the the first child node of a given node.
    - *
    - * @param node A node.
    - * @return The child node.
    - * @since 2.4.0
    - * @see purple_blist_node_get_parent
    - * @see purple_blist_node_get_sibling_next
    - * @see purple_blist_node_get_sibling_prev
    - * @see purple_blist_node_next
    - */
    -PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node);
    -
    -/**
    - * Returns the sibling node of a given node.
    - *
    - * @param node A node.
    - * @return The sibling node.
    - * @since 2.4.0
    - * @see purple_blist_node_get_parent
    - * @see purple_blist_node_get_first_child
    - * @see purple_blist_node_get_sibling_prev
    - * @see purple_blist_node_next
    - */
    -PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node);
    -
    -/**
    - * Returns the previous sibling node of a given node.
    - *
    - * @param node A node.
    - * @return The sibling node.
    - * @since 2.4.0
    - * @see purple_blist_node_get_parent
    - * @see purple_blist_node_get_first_child
    - * @see purple_blist_node_get_sibling_next
    - * @see purple_blist_node_next
    - */
    -PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node);
    -
    -/**
    - * Returns the UI data of a given node.
    - *
    - * @param node The node.
    - * @return The UI data.
    - * @since 2.6.0
    - */
    -gpointer purple_blist_node_get_ui_data(const PurpleBlistNode *node);
    -
    -/**
    - * Sets the UI data of a given node.
    - *
    - * @param node The node.
    - * @param ui_data The UI data.
    - *
    - * @since 2.6.0
    - */
    -void purple_blist_node_set_ui_data(PurpleBlistNode *node, gpointer ui_data);
    -
    -/**
    - * Shows the buddy list, creating a new one if necessary.
    - */
    -void purple_blist_show(void);
    -
    -
    -/**
    - * Destroys the buddy list window.
    - *
    - * @deprecated The UI is responsible for cleaning up the
    - * PurpleBuddyList->ui_data. purple_blist_uninit() will free the
    - * PurpleBuddyList* itself.
    - */
    -void purple_blist_destroy(void);
    -
    -/**
    - * Hides or unhides the buddy list.
    - *
    - * @param show Whether or not to show the buddy list
    - */
    -void purple_blist_set_visible(gboolean show);
    -
    -/**
    - * Updates a buddy's status.
    - *
    - * This should only be called from within Purple.
    - *
    - * @param buddy The buddy whose status has changed.
    - * @param old_status The status from which we are changing.
    - */
    -void purple_blist_update_buddy_status(PurpleBuddy *buddy, PurpleStatus *old_status);
    -
    -/**
    - * Updates a node's custom icon.
    - *
    - * @param node The PurpleBlistNode whose custom icon has changed.
    - *
    - * @since 2.5.0
    - */
    -void purple_blist_update_node_icon(PurpleBlistNode *node);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    -/**
    - * Updates a buddy's icon.
    - *
    - * @param buddy The buddy whose buddy icon has changed
    - * @deprecated Use purple_blist_update_node_icon() instead.
    - */
    -void purple_blist_update_buddy_icon(PurpleBuddy *buddy);
    -#endif
    -
    -/**
    - * Renames a buddy in the buddy list.
    - *
    - * @param buddy The buddy whose name will be changed.
    - * @param name The new name of the buddy.
    - */
    -void purple_blist_rename_buddy(PurpleBuddy *buddy, const char *name);
    -
    -/**
    - * Aliases a contact in the buddy list.
    - *
    - * @param contact The contact whose alias will be changed.
    - * @param alias The contact's alias.
    - */
    -void purple_blist_alias_contact(PurpleContact *contact, const char *alias);
    -
    -/**
    - * Aliases a buddy in the buddy list.
    - *
    - * @param buddy The buddy whose alias will be changed.
    - * @param alias The buddy's alias.
    - */
    -void purple_blist_alias_buddy(PurpleBuddy *buddy, const char *alias);
    -
    -/**
    - * Sets the server-sent alias of a buddy in the buddy list.
    - * PRPLs should call serv_got_alias() instead of this.
    - *
    - * @param buddy The buddy whose alias will be changed.
    - * @param alias The buddy's "official" alias.
    - */
    -void purple_blist_server_alias_buddy(PurpleBuddy *buddy, const char *alias);
    -
    -/**
    - * Aliases a chat in the buddy list.
    - *
    - * @param chat The chat whose alias will be changed.
    - * @param alias The chat's new alias.
    - */
    -void purple_blist_alias_chat(PurpleChat *chat, const char *alias);
    -
    -/**
    - * Renames a group
    - *
    - * @param group The group to rename
    - * @param name The new name
    - */
    -void purple_blist_rename_group(PurpleGroup *group, const char *name);
    -
    -/**
    - * Creates a new chat for the buddy list
    - *
    - * @param account The account this chat will get added to
    - * @param alias The alias of the new chat
    - * @param components The info the prpl needs to join the chat. The
    - * hash function should be g_str_hash() and the
    - * equal function should be g_str_equal().
    - * @return A newly allocated chat
    - */
    -PurpleChat *purple_chat_new(PurpleAccount *account, const char *alias, GHashTable *components);
    -
    -/**
    - * Destroys a chat
    - *
    - * @param chat The chat to destroy
    - */
    -void purple_chat_destroy(PurpleChat *chat);
    -
    -/**
    - * Adds a new chat to the buddy list.
    - *
    - * The chat will be inserted right after node or appended to the end
    - * of group if node is NULL. If both are NULL, the buddy will be added to
    - * the "Chats" group.
    - *
    - * @param chat The new chat who gets added
    - * @param group The group to add the new chat to.
    - * @param node The insertion point
    - */
    -void purple_blist_add_chat(PurpleChat *chat, PurpleGroup *group, PurpleBlistNode *node);
    -
    -/**
    - * Creates a new buddy.
    - *
    - * This function only creates the PurpleBuddy. Use purple_blist_add_buddy
    - * to add the buddy to the list and purple_account_add_buddy to sync up
    - * with the server.
    - *
    - * @param account The account this buddy will get added to
    - * @param name The name of the new buddy
    - * @param alias The alias of the new buddy (or NULL if unaliased)
    - * @return A newly allocated buddy
    - *
    - * @see purple_account_add_buddy
    - * @see purple_blist_add_buddy
    - */
    -PurpleBuddy *purple_buddy_new(PurpleAccount *account, const char *name, const char *alias);
    -
    -/**
    - * Destroys a buddy
    - *
    - * @param buddy The buddy to destroy
    - */
    -void purple_buddy_destroy(PurpleBuddy *buddy);
    -
    -/**
    - * Sets a buddy's icon.
    - *
    - * This should only be called from within Purple. You probably want to
    - * call purple_buddy_icon_set_data().
    - *
    - * @param buddy The buddy.
    - * @param icon The buddy icon.
    - *
    - * @see purple_buddy_icon_set_data()
    - */
    -void purple_buddy_set_icon(PurpleBuddy *buddy, PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns a buddy's account.
    - *
    - * @param buddy The buddy.
    - *
    - * @return The account
    - */
    -PurpleAccount *purple_buddy_get_account(const PurpleBuddy *buddy);
    -
    -/**
    - * Returns a buddy's name
    - *
    - * @param buddy The buddy.
    - *
    - * @return The name.
    - */
    -const char *purple_buddy_get_name(const PurpleBuddy *buddy);
    -
    -/**
    - * Returns a buddy's icon.
    - *
    - * @param buddy The buddy.
    - *
    - * @return The buddy icon.
    - */
    -PurpleBuddyIcon *purple_buddy_get_icon(const PurpleBuddy *buddy);
    -
    -/**
    - * Returns a buddy's protocol-specific data.
    - *
    - * This should only be called from the associated prpl.
    - *
    - * @param buddy The buddy.
    - * @return The protocol data.
    - *
    - * @see purple_buddy_set_protocol_data()
    - * @since 2.6.0
    - */
    -gpointer purple_buddy_get_protocol_data(const PurpleBuddy *buddy);
    -
    -/**
    - * Sets a buddy's protocol-specific data.
    - *
    - * This should only be called from the associated prpl.
    - *
    - * @param buddy The buddy.
    - * @param data The data.
    - *
    - * @see purple_buddy_get_protocol_data()
    - * @since 2.6.0
    - */
    -void purple_buddy_set_protocol_data(PurpleBuddy *buddy, gpointer data);
    -
    -/**
    - * Returns a buddy's contact.
    - *
    - * @param buddy The buddy.
    - *
    - * @return The buddy's contact.
    - */
    -PurpleContact *purple_buddy_get_contact(PurpleBuddy *buddy);
    -
    -/**
    - * Returns a buddy's presence.
    - *
    - * @param buddy The buddy.
    - *
    - * @return The buddy's presence.
    - */
    -PurplePresence *purple_buddy_get_presence(const PurpleBuddy *buddy);
    -
    -/**
    - * Gets the media caps from a buddy.
    - *
    - * @param buddy The buddy.
    - * @return The media caps.
    - *
    - * @since 2.7.0
    - */
    -PurpleMediaCaps purple_buddy_get_media_caps(const PurpleBuddy *buddy);
    -
    -/**
    - * Sets the media caps for a buddy.
    - *
    - * @param buddy The PurpleBuddy.
    - * @param media_caps The PurpleMediaCaps.
    - */
    -void purple_buddy_set_media_caps(PurpleBuddy *buddy, PurpleMediaCaps media_caps);
    -
    -/**
    - * Adds a new buddy to the buddy list.
    - *
    - * The buddy will be inserted right after node or prepended to the
    - * group if node is NULL. If both are NULL, the buddy will be added to
    - * the "Buddies" group.
    - *
    - * @param buddy The new buddy who gets added
    - * @param contact The optional contact to place the buddy in.
    - * @param group The group to add the new buddy to.
    - * @param node The insertion point. Pass in NULL to add the node as
    - * the first child in the given group.
    - */
    -void purple_blist_add_buddy(PurpleBuddy *buddy, PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
    -
    -/**
    - * Creates a new group
    - *
    - * You can't have more than one group with the same name. Sorry. If you pass
    - * this the name of a group that already exists, it will return that group.
    - *
    - * @param name The name of the new group
    - * @return A new group struct
    -*/
    -PurpleGroup *purple_group_new(const char *name);
    -
    -/**
    - * Destroys a group
    - *
    - * @param group The group to destroy
    -*/
    -void purple_group_destroy(PurpleGroup *group);
    -
    -/**
    - * Adds a new group to the buddy list.
    - *
    - * The new group will be inserted after insert or prepended to the list if
    - * node is NULL.
    - *
    - * @param group The group
    - * @param node The insertion point
    - */
    -void purple_blist_add_group(PurpleGroup *group, PurpleBlistNode *node);
    -
    -/**
    - * Creates a new contact
    - *
    - * @return A new contact struct
    - */
    -PurpleContact *purple_contact_new(void);
    -
    -/**
    - * Destroys a contact
    - *
    - * @param contact The contact to destroy
    - */
    -void purple_contact_destroy(PurpleContact *contact);
    -
    -/**
    - * Gets the PurpleGroup from a PurpleContact
    - *
    - * @param contact The contact
    - * @return The group
    - *
    - * @since 2.7.0
    - */
    -PurpleGroup *purple_contact_get_group(const PurpleContact *contact);
    -
    -/**
    - * Adds a new contact to the buddy list.
    - *
    - * The new contact will be inserted after insert or prepended to the list if
    - * node is NULL.
    - *
    - * @param contact The contact
    - * @param group The group to add the contact to
    - * @param node The insertion point
    - */
    -void purple_blist_add_contact(PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
    -
    -/**
    - * Merges two contacts
    - *
    - * All of the buddies from source will be moved to target
    - *
    - * @param source The contact to merge
    - * @param node The place to merge to (a buddy or contact)
    - */
    -void purple_blist_merge_contact(PurpleContact *source, PurpleBlistNode *node);
    -
    -/**
    - * Returns the highest priority buddy for a given contact.
    - *
    - * @param contact The contact
    - * @return The highest priority buddy
    - */
    -PurpleBuddy *purple_contact_get_priority_buddy(PurpleContact *contact);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    -/**
    - * Sets the alias for a contact.
    - *
    - * @param contact The contact
    - * @param alias The alias to set, or NULL to unset
    - *
    - * @deprecated Use purple_blist_alias_contact() instead.
    - */
    -void purple_contact_set_alias(PurpleContact *contact, const char *alias);
    -#endif
    -
    -/**
    - * Gets the alias for a contact.
    - *
    - * @param contact The contact
    - * @return The alias, or NULL if it is not set.
    - */
    -const char *purple_contact_get_alias(PurpleContact *contact);
    -
    -/**
    - * Determines whether an account owns any buddies in a given contact
    - *
    - * @param contact The contact to search through.
    - * @param account The account.
    - *
    - * @return TRUE if there are any buddies from account in the contact, or FALSE otherwise.
    - */
    -gboolean purple_contact_on_account(PurpleContact *contact, PurpleAccount *account);
    -
    -/**
    - * Invalidates the priority buddy so that the next call to
    - * purple_contact_get_priority_buddy recomputes it.
    - *
    - * @param contact The contact
    - */
    -void purple_contact_invalidate_priority_buddy(PurpleContact *contact);
    -
    -/**
    - * Removes a buddy from the buddy list and frees the memory allocated to it.
    - * This doesn't actually try to remove the buddy from the server list.
    - *
    - * @param buddy The buddy to be removed
    - *
    - * @see purple_account_remove_buddy
    - */
    -void purple_blist_remove_buddy(PurpleBuddy *buddy);
    -
    -/**
    - * Removes a contact, and any buddies it contains, and frees the memory
    - * allocated to it. This calls purple_blist_remove_buddy and therefore
    - * doesn't remove the buddies from the server list.
    - *
    - * @param contact The contact to be removed
    - *
    - * @see purple_blist_remove_buddy
    - */
    -void purple_blist_remove_contact(PurpleContact *contact);
    -
    -/**
    - * Removes a chat from the buddy list and frees the memory allocated to it.
    - *
    - * @param chat The chat to be removed
    - */
    -void purple_blist_remove_chat(PurpleChat *chat);
    -
    -/**
    - * Removes a group from the buddy list and frees the memory allocated to it and to
    - * its children
    - *
    - * @param group The group to be removed
    - */
    -void purple_blist_remove_group(PurpleGroup *group);
    -
    -/**
    - * Returns the alias of a buddy.
    - *
    - * @param buddy The buddy whose name will be returned.
    - * @return The alias (if set), server alias (if set),
    - * or NULL.
    - */
    -const char *purple_buddy_get_alias_only(PurpleBuddy *buddy);
    -
    -/**
    - * Gets the server alias for a buddy.
    - *
    - * @param buddy The buddy whose name will be returned
    - * @return The server alias, or NULL if it is not set.
    - */
    -const char *purple_buddy_get_server_alias(PurpleBuddy *buddy);
    -
    -/**
    - * Returns the correct name to display for a buddy, taking the contact alias
    - * into account. In order of precedence: the buddy's alias; the buddy's
    - * contact alias; the buddy's server alias; the buddy's user name.
    - *
    - * @param buddy The buddy whose name will be returned
    - * @return The appropriate name or alias, or NULL.
    - *
    - */
    -const char *purple_buddy_get_contact_alias(PurpleBuddy *buddy);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    -/**
    - * Returns the correct alias for this user, ignoring server aliases. Used
    - * when a user-recognizable name is required. In order: buddy's alias; buddy's
    - * contact alias; buddy's user name.
    - *
    - * @param buddy The buddy whose alias will be returned.
    - * @return The appropriate name or alias.
    - * @deprecated Try purple_buddy_get_alias(), if server aliases are okay.
    - */
    -const char *purple_buddy_get_local_alias(PurpleBuddy *buddy);
    -#endif
    -
    -/**
    - * Returns the correct name to display for a buddy. In order of precedence:
    - * the buddy's alias; the buddy's server alias; the buddy's contact alias;
    - * the buddy's user name.
    - *
    - * @param buddy The buddy whose name will be returned.
    - * @return The appropriate name or alias, or NULL
    - */
    -const char *purple_buddy_get_alias(PurpleBuddy *buddy);
    -
    -/**
    - * Returns the local alias for the buddy, or @c NULL if none exists.
    - *
    - * @param buddy The buddy
    - * @return The local alias for the buddy
    - *
    - * @since 2.6.0
    - */
    -const char *purple_buddy_get_local_buddy_alias(PurpleBuddy *buddy);
    -
    -/**
    - * Returns the correct name to display for a blist chat.
    - *
    - * @param chat The chat whose name will be returned.
    - * @return The alias (if set), or first component value.
    - */
    -const char *purple_chat_get_name(PurpleChat *chat);
    -
    -/**
    - * Finds the buddy struct given a name and an account
    - *
    - * @param account The account this buddy belongs to
    - * @param name The buddy's name
    - * @return The buddy or NULL if the buddy does not exist
    - */
    -PurpleBuddy *purple_find_buddy(PurpleAccount *account, const char *name);
    -
    -/**
    - * Finds the buddy struct given a name, an account, and a group
    - *
    - * @param account The account this buddy belongs to
    - * @param name The buddy's name
    - * @param group The group to look in
    - * @return The buddy or NULL if the buddy does not exist in the group
    - */
    -PurpleBuddy *purple_find_buddy_in_group(PurpleAccount *account, const char *name,
    - PurpleGroup *group);
    -
    -/**
    - * Finds all PurpleBuddy structs given a name and an account
    - *
    - * @param account The account this buddy belongs to
    - * @param name The buddy's name (or NULL to return all buddies for the account)
    - *
    - * @return A GSList of buddies (which must be freed), or NULL if the buddy doesn't exist
    - */
    -GSList *purple_find_buddies(PurpleAccount *account, const char *name);
    -
    -
    -/**
    - * Finds a group by name
    - *
    - * @param name The group's name
    - * @return The group or NULL if the group does not exist
    - */
    -PurpleGroup *purple_find_group(const char *name);
    -
    -/**
    - * Finds a chat by name.
    - *
    - * @param account The chat's account.
    - * @param name The chat's name.
    - *
    - * @return The chat, or @c NULL if the chat does not exist.
    - */
    -PurpleChat *purple_blist_find_chat(PurpleAccount *account, const char *name);
    -
    -/**
    - * Returns the group of which the chat is a member.
    - *
    - * @param chat The chat.
    - *
    - * @return The parent group, or @c NULL if the chat is not in a group.
    - */
    -PurpleGroup *purple_chat_get_group(PurpleChat *chat);
    -
    -/**
    - * Returns the account the chat belongs to.
    - *
    - * @param chat The chat.
    - *
    - * @return The account the chat belongs to.
    - *
    - * @since 2.4.0
    - */
    -PurpleAccount *purple_chat_get_account(PurpleChat *chat);
    -
    -/**
    - * Get a hashtable containing information about a chat.
    - *
    - * @param chat The chat.
    - *
    - * @constreturn The hashtable.
    - *
    - * @since 2.4.0
    - */
    -GHashTable *purple_chat_get_components(PurpleChat *chat);
    -
    -/**
    - * Returns the group of which the buddy is a member.
    - *
    - * @param buddy The buddy
    - * @return The group or NULL if the buddy is not in a group
    - */
    -PurpleGroup *purple_buddy_get_group(PurpleBuddy *buddy);
    -
    -
    -/**
    - * Returns a list of accounts that have buddies in this group
    - *
    - * @param g The group
    - *
    - * @return A GSList of accounts (which must be freed), or NULL if the group
    - * has no accounts.
    - */
    -GSList *purple_group_get_accounts(PurpleGroup *g);
    -
    -/**
    - * Determines whether an account owns any buddies in a given group
    - *
    - * @param g The group to search through.
    - * @param account The account.
    - *
    - * @return TRUE if there are any buddies in the group, or FALSE otherwise.
    - */
    -gboolean purple_group_on_account(PurpleGroup *g, PurpleAccount *account);
    -
    -/**
    - * Returns the name of a group.
    - *
    - * @param group The group.
    - *
    - * @return The name of the group.
    - */
    -const char *purple_group_get_name(PurpleGroup *group);
    -
    -/**
    - * Called when an account connects. Tells the UI to update all the
    - * buddies.
    - *
    - * @param account The account
    - */
    -void purple_blist_add_account(PurpleAccount *account);
    -
    -
    -/**
    - * Called when an account disconnects. Sets the presence of all the buddies to 0
    - * and tells the UI to update them.
    - *
    - * @param account The account
    - */
    -void purple_blist_remove_account(PurpleAccount *account);
    -
    -
    -/**
    - * Determines the total size of a group
    - *
    - * @param group The group
    - * @param offline Count buddies in offline accounts
    - * @return The number of buddies in the group
    - */
    -int purple_blist_get_group_size(PurpleGroup *group, gboolean offline);
    -
    -/**
    - * Determines the number of online buddies in a group
    - *
    - * @param group The group
    - * @return The number of online buddies in the group, or 0 if the group is NULL
    - */
    -int purple_blist_get_group_online_count(PurpleGroup *group);
    -
    -/*@}*/
    -
    -/****************************************************************************************/
    -/** @name Buddy list file management API */
    -/****************************************************************************************/
    -
    -/**
    - * Loads the buddy list from ~/.purple/blist.xml.
    - */
    -void purple_blist_load(void);
    -
    -/**
    - * Schedule a save of the blist.xml file. This is used by the privacy
    - * API whenever the privacy settings are changed. If you make a change
    - * to blist.xml using one of the functions in the buddy list API, then
    - * the buddy list is saved automatically, so you should not need to
    - * call this.
    - */
    -void purple_blist_schedule_save(void);
    -
    -/**
    - * Requests from the user information needed to add a buddy to the
    - * buddy list.
    - *
    - * @param account The account the buddy is added to.
    - * @param username The username of the buddy.
    - * @param group The name of the group to place the buddy in.
    - * @param alias The optional alias for the buddy.
    - */
    -void purple_blist_request_add_buddy(PurpleAccount *account, const char *username,
    - const char *group, const char *alias);
    -
    -/**
    - * Requests from the user information needed to add a chat to the
    - * buddy list.
    - *
    - * @param account The account the buddy is added to.
    - * @param group The optional group to add the chat to.
    - * @param alias The optional alias for the chat.
    - * @param name The required chat name.
    - */
    -void purple_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group,
    - const char *alias, const char *name);
    -
    -/**
    - * Requests from the user information needed to add a group to the
    - * buddy list.
    - */
    -void purple_blist_request_add_group(void);
    -
    -/**
    - * Associates a boolean with a node in the buddy list
    - *
    - * @param node The node to associate the data with
    - * @param key The identifier for the data
    - * @param value The value to set
    - */
    -void purple_blist_node_set_bool(PurpleBlistNode *node, const char *key, gboolean value);
    -
    -/**
    - * Retrieves a named boolean setting from a node in the buddy list
    - *
    - * @param node The node to retrieve the data from
    - * @param key The identifier of the data
    - *
    - * @return The value, or FALSE if there is no setting
    - */
    -gboolean purple_blist_node_get_bool(PurpleBlistNode *node, const char *key);
    -
    -/**
    - * Associates an integer with a node in the buddy list
    - *
    - * @param node The node to associate the data with
    - * @param key The identifier for the data
    - * @param value The value to set
    - */
    -void purple_blist_node_set_int(PurpleBlistNode *node, const char *key, int value);
    -
    -/**
    - * Retrieves a named integer setting from a node in the buddy list
    - *
    - * @param node The node to retrieve the data from
    - * @param key The identifier of the data
    - *
    - * @return The value, or 0 if there is no setting
    - */
    -int purple_blist_node_get_int(PurpleBlistNode *node, const char *key);
    -
    -/**
    - * Associates a string with a node in the buddy list
    - *
    - * @param node The node to associate the data with
    - * @param key The identifier for the data
    - * @param value The value to set
    - */
    -void purple_blist_node_set_string(PurpleBlistNode *node, const char *key,
    - const char *value);
    -
    -/**
    - * Retrieves a named string setting from a node in the buddy list
    - *
    - * @param node The node to retrieve the data from
    - * @param key The identifier of the data
    - *
    - * @return The value, or NULL if there is no setting
    - */
    -const char *purple_blist_node_get_string(PurpleBlistNode *node, const char *key);
    -
    -/**
    - * Removes a named setting from a blist node
    - *
    - * @param node The node from which to remove the setting
    - * @param key The name of the setting
    - */
    -void purple_blist_node_remove_setting(PurpleBlistNode *node, const char *key);
    -
    -/**
    - * Set the flags for the given node. Setting a node's flags will overwrite
    - * the old flags, so if you want to save them, you must first call
    - * purple_blist_node_get_flags and modify that appropriately.
    - *
    - * @param node The node on which to set the flags.
    - * @param flags The flags to set. This is a bitmask.
    - */
    -void purple_blist_node_set_flags(PurpleBlistNode *node, PurpleBlistNodeFlags flags);
    -
    -/**
    - * Get the current flags on a given node.
    - *
    - * @param node The node from which to get the flags.
    - *
    - * @return The flags on the node. This is a bitmask.
    - */
    -PurpleBlistNodeFlags purple_blist_node_get_flags(PurpleBlistNode *node);
    -
    -/**
    - * Get the type of a given node.
    - *
    - * @param node The node.
    - *
    - * @return The type of the node.
    - *
    - * @since 2.1.0
    - */
    -PurpleBlistNodeType purple_blist_node_get_type(PurpleBlistNode *node);
    -
    -/*@}*/
    -
    -/**
    - * Retrieves the extended menu items for a buddy list node.
    - * @param n The blist node for which to obtain the extended menu items.
    - * @return A list of PurpleMenuAction items, as harvested by the
    - * blist-node-extended-menu signal.
    - */
    -GList *purple_blist_node_get_extended_menu(PurpleBlistNode *n);
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used for the buddy list.
    - *
    - * @param ops The ops struct.
    - */
    -void purple_blist_set_ui_ops(PurpleBlistUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used for the buddy list.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleBlistUiOps *purple_blist_get_ui_ops(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Buddy List Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the handle for the buddy list subsystem.
    - *
    - * @return The buddy list subsystem handle.
    - */
    -void *purple_blist_get_handle(void);
    -
    -/**
    - * Initializes the buddy list subsystem.
    - */
    -void purple_blist_init(void);
    -
    -/**
    - * Uninitializes the buddy list subsystem.
    - */
    -void purple_blist_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_BLIST_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/bosh.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,43 +0,0 @@
    -/**
    - * @file bosh.h Bidirectional-streams over Synchronous HTTP (BOSH) (XEP-0124 and XEP-0206)
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_BOSH_H_
    -#define PURPLE_JABBER_BOSH_H_
    -
    -typedef struct _PurpleBOSHConnection PurpleBOSHConnection;
    -
    -#include "jabber.h"
    -
    -void jabber_bosh_init(void);
    -void jabber_bosh_uninit(void);
    -
    -PurpleBOSHConnection* jabber_bosh_connection_init(JabberStream *js, const char *url);
    -void jabber_bosh_connection_destroy(PurpleBOSHConnection *conn);
    -
    -gboolean jabber_bosh_connection_is_ssl(PurpleBOSHConnection *conn);
    -void jabber_bosh_connection_send_keepalive(PurpleBOSHConnection *conn);
    -
    -void jabber_bosh_connection_connect(PurpleBOSHConnection *conn);
    -void jabber_bosh_connection_close(PurpleBOSHConnection *conn);
    -void jabber_bosh_connection_send_raw(PurpleBOSHConnection *conn, const char *data);
    -#endif /* PURPLE_JABBER_BOSH_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddy.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,125 +0,0 @@
    -/**
    - * @file buddy.h Buddy handlers
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_BUDDY_H_
    -#define PURPLE_JABBER_BUDDY_H_
    -
    -typedef struct _JabberBuddy JabberBuddy;
    -
    -#include "jabber.h"
    -#include "caps.h"
    -#include "jutil.h"
    -
    -struct _JabberBuddy {
    - /**
    - * A sorted list of resources in priority descending order.
    - * This means that the first resource in the list is the
    - * "most available" (see resource_compare_cb in buddy.c for
    - * details). Don't play with this yourself, let
    - * jabber_buddy_track_resource and jabber_buddy_remove_resource do it.
    - */
    - GList *resources;
    - char *error_msg;
    - enum {
    - JABBER_INVISIBLE_NONE = 0,
    - JABBER_INVISIBLE_SERVER = 1 << 1,
    - JABBER_INVIS_BUDDY = 1 << 2
    - } invisible;
    - enum {
    - JABBER_SUB_NONE = 0,
    - JABBER_SUB_PENDING = 1 << 1,
    - JABBER_SUB_TO = 1 << 2,
    - JABBER_SUB_FROM = 1 << 3,
    - JABBER_SUB_BOTH = (JABBER_SUB_TO | JABBER_SUB_FROM),
    - JABBER_SUB_REMOVE = 1 << 4
    - } subscription;
    -};
    -
    -typedef struct _JabberAdHocCommands {
    - char *jid;
    - char *node;
    - char *name;
    -} JabberAdHocCommands;
    -
    -typedef struct _JabberBuddyResource {
    - JabberBuddy *jb;
    - char *name;
    - int priority;
    - JabberBuddyState state;
    - char *status;
    - time_t idle;
    - JabberCapabilities capabilities;
    - char *thread_id;
    - enum {
    - JABBER_CHAT_STATES_UNKNOWN,
    - JABBER_CHAT_STATES_UNSUPPORTED,
    - JABBER_CHAT_STATES_SUPPORTED
    - } chat_states;
    - struct {
    - char *version;
    - char *name;
    - char *os;
    - } client;
    - /* tz_off == PURPLE_NO_TZ_OFF when unset */
    - long tz_off;
    - struct {
    - JabberCapsClientInfo *info;
    - GList *exts;
    - } caps;
    - GList *commands;
    - gboolean commands_fetched;
    -} JabberBuddyResource;
    -
    -void jabber_buddy_free(JabberBuddy *jb);
    -JabberBuddy *jabber_buddy_find(JabberStream *js, const char *name,
    - gboolean create);
    -JabberBuddyResource *jabber_buddy_find_resource(JabberBuddy *jb,
    - const char *resource);
    -JabberBuddyResource *jabber_buddy_track_resource(JabberBuddy *jb, const char *resource,
    - int priority, JabberBuddyState state, const char *status);
    -void jabber_buddy_remove_resource(JabberBuddy *jb, const char *resource);
    -void jabber_buddy_get_info(PurpleConnection *gc, const char *who);
    -
    -GList *jabber_blist_node_menu(PurpleBlistNode *node);
    -
    -void jabber_set_info(PurpleConnection *gc, const char *info);
    -void jabber_setup_set_info(PurplePluginAction *action);
    -void jabber_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img);
    -
    -void jabber_user_search(JabberStream *js, const char *directory);
    -void jabber_user_search_begin(PurplePluginAction *);
    -
    -void jabber_buddy_remove_all_pending_buddy_info_requests(JabberStream *js);
    -
    -void jabber_vcard_fetch_mine(JabberStream *js);
    -
    -gboolean jabber_resource_know_capabilities(const JabberBuddyResource *jbr);
    -gboolean jabber_resource_has_capability(const JabberBuddyResource *jbr,
    - const gchar *cap);
    -gboolean jabber_buddy_has_capability(const JabberBuddy *jb, const gchar *cap);
    -
    -const gchar *
    -jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr,
    - const gchar *category);
    -
    -#endif /* PURPLE_JABBER_BUDDY_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddyicon.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,441 +0,0 @@
    -/**
    - * @file buddyicon.h Buddy Icon 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
    - */
    -#ifndef _PURPLE_BUDDYICON_H_
    -#define _PURPLE_BUDDYICON_H_
    -
    -/** An opaque structure representing a buddy icon for a particular user on a
    - * particular #PurpleAccount. Instances are reference-counted; use
    - * purple_buddy_icon_ref() and purple_buddy_icon_unref() to take and release
    - * references.
    - */
    -typedef struct _PurpleBuddyIcon PurpleBuddyIcon;
    -
    -#include "account.h"
    -#include "blist.h"
    -#include "imgstore.h"
    -#include "prpl.h"
    -#include "util.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -
    -/**************************************************************************/
    -/** @name Buddy Icon API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new buddy icon structure and populates it.
    - *
    - * If the buddy icon already exists, you'll get a reference to that structure,
    - * which will have been updated with the data supplied.
    - *
    - * @param account The account the user is on.
    - * @param username The username the icon belongs to.
    - * @param icon_data The buddy icon data.
    - * @param icon_len The buddy icon length.
    - * @param checksum A protocol checksum from the prpl or @c NULL.
    - *
    - * @return The buddy icon structure, with a reference for the caller.
    - */
    -PurpleBuddyIcon *purple_buddy_icon_new(PurpleAccount *account, const char *username,
    - void *icon_data, size_t icon_len,
    - const char *checksum);
    -
    -/**
    - * Increments the reference count on a buddy icon.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return @a icon.
    - */
    -PurpleBuddyIcon *purple_buddy_icon_ref(PurpleBuddyIcon *icon);
    -
    -/**
    - * Decrements the reference count on a buddy icon.
    - *
    - * If the reference count reaches 0, the icon will be destroyed.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return @a icon, or @c NULL if the reference count reached 0.
    - */
    -PurpleBuddyIcon *purple_buddy_icon_unref(PurpleBuddyIcon *icon);
    -
    -/**
    - * Updates every instance of this icon.
    - *
    - * @param icon The buddy icon.
    - */
    -void purple_buddy_icon_update(PurpleBuddyIcon *icon);
    -
    -/**
    - * Sets the buddy icon's data.
    - *
    - * @param icon The buddy icon.
    - * @param data The buddy icon data, which the buddy icon code
    - * takes ownership of and will free.
    - * @param len The length of the data in @a data.
    - * @param checksum A protocol checksum from the prpl or @c NULL.
    - */
    -void
    -purple_buddy_icon_set_data(PurpleBuddyIcon *icon, guchar *data,
    - size_t len, const char *checksum);
    -
    -/**
    - * Returns the buddy icon's account.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return The account.
    - */
    -PurpleAccount *purple_buddy_icon_get_account(const PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns the buddy icon's username.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return The username.
    - */
    -const char *purple_buddy_icon_get_username(const PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns the buddy icon's checksum.
    - *
    - * This function is really only for prpl use.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return The checksum.
    - */
    -const char *purple_buddy_icon_get_checksum(const PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns the buddy icon's data.
    - *
    - * @param icon The buddy icon.
    - * @param len If not @c NULL, the length of the icon data returned will be
    - * set in the location pointed to by this.
    - *
    - * @return A pointer to the icon data.
    - */
    -gconstpointer purple_buddy_icon_get_data(const PurpleBuddyIcon *icon, size_t *len);
    -
    -/**
    - * Returns an extension corresponding to the buddy icon's file type.
    - *
    - * @param icon The buddy icon.
    - *
    - * @return The icon's extension, "icon" if unknown, or @c NULL if
    - * the image data has disappeared.
    - */
    -const char *purple_buddy_icon_get_extension(const PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns a full path to an icon.
    - *
    - * If the icon has data and the file exists in the cache, this will return
    - * a full path to the cache file.
    - *
    - * In general, it is not appropriate to be poking in the icon cache
    - * directly. If you find yourself wanting to use this function, think
    - * very long and hard about it, and then don't.
    - *
    - * @param icon The buddy icon
    - *
    - * @return A full path to the file, or @c NULL under various conditions.
    - */
    -char *purple_buddy_icon_get_full_path(PurpleBuddyIcon *icon);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Buddy Icon Subsystem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets a buddy icon for a user.
    - *
    - * @param account The account the user is on.
    - * @param username The username of the user.
    - * @param icon_data The buddy icon data, which the buddy icon code
    - * takes ownership of and will free.
    - * @param icon_len The length of the icon data.
    - * @param checksum A protocol checksum from the prpl or @c NULL.
    - */
    -void
    -purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username,
    - void *icon_data, size_t icon_len,
    - const char *checksum);
    -
    -/**
    - * Returns the checksum for the buddy icon of a specified buddy.
    - *
    - * This avoids loading the icon image data from the cache if it's
    - * not already loaded for some other reason.
    - *
    - * @param buddy The buddy
    - *
    - * @return The checksum.
    - */
    -const char *
    -purple_buddy_icons_get_checksum_for_user(PurpleBuddy *buddy);
    -
    -/**
    - * Returns the buddy icon information for a user.
    - *
    - * @param account The account the user is on.
    - * @param username The username of the user.
    - *
    - * @return The icon (with a reference for the caller) if found, or @c NULL if
    - * not found.
    - */
    -PurpleBuddyIcon *
    -purple_buddy_icons_find(PurpleAccount *account, const char *username);
    -
    -/**
    - * Returns the buddy icon image for an account.
    - *
    - * The caller owns a reference to the image in the store, and must dereference
    - * the image with purple_imgstore_unref() for it to be freed.
    - *
    - * This function deals with loading the icon from the cache, if
    - * needed, so it should be called in any case where you want the
    - * appropriate icon.
    - *
    - * @param account The account
    - *
    - * @return The account's buddy icon image.
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_find_account_icon(PurpleAccount *account);
    -
    -/**
    - * Sets a buddy icon for an account.
    - *
    - * This function will deal with saving a record of the icon,
    - * caching the data, etc.
    - *
    - * @param account The account for which to set a custom icon.
    - * @param icon_data The image data of the icon, which the
    - * buddy icon code will free.
    - * @param icon_len The length of the data in @a icon_data.
    - *
    - * @return The icon that was set. The caller does NOT own
    - * a reference to this, and must call purple_imgstore_ref()
    - * if it wants one.
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_set_account_icon(PurpleAccount *account,
    - guchar *icon_data, size_t icon_len);
    -
    -/**
    - * Returns the timestamp of when the icon was set.
    - *
    - * This is intended for use in protocols that require a timestamp for
    - * buddy icon update reasons.
    - *
    - * @param account The account
    - *
    - * @return The time the icon was set, or 0 if an error occurred.
    - */
    -time_t
    -purple_buddy_icons_get_account_icon_timestamp(PurpleAccount *account);
    -
    -/**
    - * Returns a boolean indicating if a given blist node has a custom buddy icon.
    - *
    - * @param node The blist node.
    - *
    - * @return A boolean indicating if @a node has a custom buddy icon.
    - * @since 2.5.0
    - */
    -gboolean
    -purple_buddy_icons_node_has_custom_icon(PurpleBlistNode *node);
    -
    -/**
    - * Returns the custom buddy icon image for a blist node.
    - *
    - * The caller owns a reference to the image in the store, and must dereference
    - * the image with purple_imgstore_unref() for it to be freed.
    - *
    - * This function deals with loading the icon from the cache, if
    - * needed, so it should be called in any case where you want the
    - * appropriate icon.
    - *
    - * @param node The node.
    - *
    - * @return The custom buddy icon.
    - * @since 2.5.0
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_node_find_custom_icon(PurpleBlistNode *node);
    -
    -/**
    - * Sets a custom buddy icon for a blist node.
    - *
    - * This function will deal with saving a record of the icon, caching the data,
    - * etc.
    - *
    - * @param node The blist node for which to set a custom icon.
    - * @param icon_data The image data of the icon, which the buddy icon code will
    - * free. Use NULL to unset the icon.
    - * @param icon_len The length of the data in @a icon_data.
    - *
    - * @return The icon that was set. The caller does NOT own a reference to this,
    - * and must call purple_imgstore_ref() if it wants one.
    - * @since 2.5.0
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_node_set_custom_icon(PurpleBlistNode *node,
    - guchar *icon_data, size_t icon_len);
    -
    -/**
    - * Sets a custom buddy icon for a blist node.
    - *
    - * Convenience wrapper around purple_buddy_icons_node_set_custom_icon.
    - * @see purple_buddy_icons_node_set_custom_icon()
    - *
    - * @param node The blist node for which to set a custom icon.
    - * @param filename The path to the icon to set for the blist node. Use NULL
    - * to unset the custom icon.
    - *
    - * @return The icon that was set. The caller does NOT own a reference to this,
    - * and must call purple_imgstore_ref() if it wants one.
    - * @since 2.5.0
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_node_set_custom_icon_from_file(PurpleBlistNode *node,
    - const gchar *filename);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BUDDYICON_C_)
    -/**
    - * PurpleContact version of purple_buddy_icons_node_has_custom_icon.
    - *
    - * @copydoc purple_buddy_icons_node_has_custom_icon()
    - *
    - * @deprecated Use purple_buddy_icons_node_has_custom_icon instead.
    - */
    -gboolean
    -purple_buddy_icons_has_custom_icon(PurpleContact *contact);
    -
    -/**
    - * PurpleContact version of purple_buddy_icons_node_find_custom_icon.
    - *
    - * @copydoc purple_buddy_icons_node_find_custom_icon()
    - *
    - * @deprecated Use purple_buddy_icons_node_find_custom_icon instead.
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_find_custom_icon(PurpleContact *contact);
    -
    -/**
    - * PurpleContact version of purple_buddy_icons_node_set_custom_icon.
    - *
    - * @copydoc purple_buddy_icons_node_set_custom_icon()
    - *
    - * @deprecated Use purple_buddy_icons_node_set_custom_icon instead.
    - */
    -PurpleStoredImage *
    -purple_buddy_icons_set_custom_icon(PurpleContact *contact,
    - guchar *icon_data, size_t icon_len);
    -#endif
    -
    -/**
    - * Sets whether or not buddy icon caching is enabled.
    - *
    - * @param caching TRUE of buddy icon caching should be enabled, or
    - * FALSE otherwise.
    - */
    -void purple_buddy_icons_set_caching(gboolean caching);
    -
    -/**
    - * Returns whether or not buddy icon caching should be enabled.
    - *
    - * The default is TRUE, unless otherwise specified by
    - * purple_buddy_icons_set_caching().
    - *
    - * @return TRUE if buddy icon caching is enabled, or FALSE otherwise.
    - */
    -gboolean purple_buddy_icons_is_caching(void);
    -
    -/**
    - * Sets the directory used to store buddy icon cache files.
    - *
    - * @param cache_dir The directory to store buddy icon cache files to.
    - */
    -void purple_buddy_icons_set_cache_dir(const char *cache_dir);
    -
    -/**
    - * Returns the directory used to store buddy icon cache files.
    - *
    - * The default directory is PURPLEDIR/icons, unless otherwise specified
    - * by purple_buddy_icons_set_cache_dir().
    - *
    - * @return The directory to store buddy icon cache files to.
    - */
    -const char *purple_buddy_icons_get_cache_dir(void);
    -
    -/**
    - * Returns the buddy icon subsystem handle.
    - *
    - * @return The subsystem handle.
    - */
    -void *purple_buddy_icons_get_handle(void);
    -
    -/**
    - * Initializes the buddy icon subsystem.
    - */
    -void purple_buddy_icons_init(void);
    -
    -/**
    - * Uninitializes the buddy icon subsystem.
    - */
    -void purple_buddy_icons_uninit(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Buddy Icon Helper API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets display size for a buddy icon
    - */
    -void purple_buddy_icon_get_scale_size(PurpleBuddyIconSpec *spec, int *width, int *height);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_BUDDYICON_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/buddylist.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,57 +0,0 @@
    -/**
    - * @file buddylist.h
    - *
    - * purple
    - *
    - * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    - *
    - * 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
    - */
    -
    -
    -#ifndef _PURPLE_GG_BUDDYLIST_H
    -#define _PURPLE_GG_BUDDYLIST_H
    -
    -#include "connection.h"
    -#include "account.h"
    -
    -void
    -ggp_buddylist_send(PurpleConnection *gc);
    -
    -/**
    - * Load buddylist from server into the roster.
    - *
    - * @param gc PurpleConnection
    - * @param buddylist Pointer to the buddylist that will be loaded.
    - */
    -/* void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) {{{ */
    -void
    -ggp_buddylist_load(PurpleConnection *gc, char *buddylist);
    -
    -/**
    - * Get all the buddies in the current account.
    - *
    - * @param account Current account.
    - *
    - * @return List of buddies.
    - */
    -char *
    -ggp_buddylist_dump(PurpleAccount *account);
    -
    -
    -#endif /* _PURPLE_GG_BUDDYLIST_H */
    -
    -
    -/* vim: set ts=8 sts=0 sw=8 noet: */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/caps.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,129 +0,0 @@
    -/*
    - * purple - Jabber Protocol Plugin
    - *
    - * 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
    - *
    - */
    -
    -#ifndef PURPLE_JABBER_CAPS_H_
    -#define PURPLE_JABBER_CAPS_H_
    -
    -typedef struct _JabberCapsClientInfo JabberCapsClientInfo;
    -
    -#include "jabber.h"
    -
    -/* Implementation of XEP-0115 - Entity Capabilities */
    -
    -typedef struct _JabberCapsNodeExts JabberCapsNodeExts;
    -
    -typedef struct _JabberCapsTuple {
    - const char *node;
    - const char *ver;
    - const char *hash;
    -} JabberCapsTuple;
    -
    -struct _JabberCapsClientInfo {
    - GList *identities; /* JabberIdentity */
    - GList *features; /* char * */
    - GList *forms; /* xmlnode * */
    - JabberCapsNodeExts *exts;
    -
    - const JabberCapsTuple tuple;
    -};
    -
    -/*
    - * This stores a set of exts "known" for a specific node (which indicates
    - * a specific client -- for reference, Pidgin, Finch, Meebo, et al share one
    - * node.) In XEP-0115 v1.3, exts are used for features that may or may not be
    - * present at a given time (PEP things, buzz might be disabled, etc).
    - *
    - * This structure is shared among all JabberCapsClientInfo instances matching
    - * a specific node (if the capstable key->hash == NULL, which indicates that
    - * the ClientInfo is using v1.3 caps as opposed to v1.5 caps).
    - *
    - * It's only exposed so that jabber_resource_has_capability can use it.
    - * Everyone else, STAY AWAY!
    - */
    -struct _JabberCapsNodeExts {
    - guint ref;
    - GHashTable *exts; /* char *ext_name -> GList *features */
    -};
    -
    -typedef void (*jabber_caps_get_info_cb)(JabberCapsClientInfo *info, GList *exts, gpointer user_data);
    -
    -void jabber_caps_init(void);
    -void jabber_caps_uninit(void);
    -
    -/**
    - * Check whether all of the exts in a char* array are known to the given info.
    - */
    -gboolean jabber_caps_exts_known(const JabberCapsClientInfo *info, char **exts);
    -
    -/**
    - * Main entity capabilites function to get the capabilities of a contact.
    - *
    - * The callback will be called synchronously if we already have the
    - * capabilities for the specified (node,ver,hash) (and, if exts are specified,
    - * if we know what each means)
    - *
    - * @param exts A g_strsplit'd (NULL-terminated) array of strings. This
    - * function is responsible for freeing it.
    - */
    -void jabber_caps_get_info(JabberStream *js, const char *who, const char *node,
    - const char *ver, const char *hash,
    - char **exts, jabber_caps_get_info_cb cb,
    - gpointer user_data);
    -
    -/**
    - * Takes a JabberCapsClientInfo pointer and returns the caps hash according to
    - * XEP-0115 Version 1.5.
    - *
    - * @param info A JabberCapsClientInfo pointer.
    - * @param hash Hash cipher to be used. Either sha-1 or md5.
    - * @return The base64 encoded SHA-1 hash; must be freed by caller
    - */
    -gchar *jabber_caps_calculate_hash(JabberCapsClientInfo *info, const char *hash);
    -
    -/**
    - * Calculate SHA1 hash for own featureset.
    - */
    -void jabber_caps_calculate_own_hash(JabberStream *js);
    -
    -/** Get the current caps hash.
    - * @ret hash
    -**/
    -const gchar* jabber_caps_get_own_hash(JabberStream *js);
    -
    -/**
    - * Broadcast a new calculated hash using a <presence> stanza.
    - */
    -void jabber_caps_broadcast_change(void);
    -
    -/**
    - * Parse the <query/> element from an IQ stanza into a JabberCapsClientInfo
    - * struct.
    - *
    - * Exposed for tests
    - *
    - * @param query The 'query' element from an IQ reply stanza.
    - * @returns A JabberCapsClientInfo struct, or NULL on error
    - */
    -JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query);
    -
    -#endif /* PURPLE_JABBER_CAPS_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/certificate.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,899 +0,0 @@
    -/**
    - * @file certificate.h Public-Key Certificate API
    - * @ingroup core
    - * @see @ref certificate-signals
    - * @since 2.2.0
    - */
    -
    -/*
    - *
    - * 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
    - */
    -
    -#ifndef _PURPLE_CERTIFICATE_H
    -#define _PURPLE_CERTIFICATE_H
    -
    -#include <time.h>
    -
    -#include <glib.h>
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif /* __cplusplus */
    -
    -
    -typedef enum
    -{
    - PURPLE_CERTIFICATE_INVALID = 0,
    - PURPLE_CERTIFICATE_VALID = 1
    -} PurpleCertificateVerificationStatus;
    -
    -/*
    - * TODO: Merge this with PurpleCertificateVerificationStatus for 3.0.0 */
    -typedef enum {
    - PURPLE_CERTIFICATE_UNKNOWN_ERROR = -1,
    -
    - /* Not an error */
    - PURPLE_CERTIFICATE_NO_PROBLEMS = 0,
    -
    - /* Non-fatal */
    - PURPLE_CERTIFICATE_NON_FATALS_MASK = 0x0000FFFF,
    -
    - /* The certificate is self-signed. */
    - PURPLE_CERTIFICATE_SELF_SIGNED = 0x01,
    -
    - /* The CA is not in libpurple's pool of certificates. */
    - PURPLE_CERTIFICATE_CA_UNKNOWN = 0x02,
    -
    - /* The current time is before the certificate's specified
    - * activation time.
    - */
    - PURPLE_CERTIFICATE_NOT_ACTIVATED = 0x04,
    -
    - /* The current time is after the certificate's specified expiration time */
    - PURPLE_CERTIFICATE_EXPIRED = 0x08,
    -
    - /* The certificate's subject name doesn't match the expected */
    - PURPLE_CERTIFICATE_NAME_MISMATCH = 0x10,
    -
    - /* No CA pool was found. This shouldn't happen... */
    - PURPLE_CERTIFICATE_NO_CA_POOL = 0x20,
    -
    - /* Fatal */
    - PURPLE_CERTIFICATE_FATALS_MASK = 0xFFFF0000,
    -
    - /* The signature chain could not be validated. Due to limitations in the
    - * the current API, this also indicates one of the CA certificates in the
    - * chain is expired (or not yet activated). FIXME 3.0.0 */
    - PURPLE_CERTIFICATE_INVALID_CHAIN = 0x10000,
    -
    - /* The signature has been revoked. */
    - PURPLE_CERTIFICATE_REVOKED = 0x20000,
    -
    - PURPLE_CERTIFICATE_LAST = 0x40000,
    -} PurpleCertificateInvalidityFlags;
    -
    -typedef struct _PurpleCertificate PurpleCertificate;
    -typedef struct _PurpleCertificatePool PurpleCertificatePool;
    -typedef struct _PurpleCertificateScheme PurpleCertificateScheme;
    -typedef struct _PurpleCertificateVerifier PurpleCertificateVerifier;
    -typedef struct _PurpleCertificateVerificationRequest PurpleCertificateVerificationRequest;
    -
    -/**
    - * Callback function for the results of a verification check
    - * @param st Status code
    - * @param userdata User-defined data
    - */
    -typedef void (*PurpleCertificateVerifiedCallback)
    - (PurpleCertificateVerificationStatus st,
    - gpointer userdata);
    -
    -/** A certificate instance
    - *
    - * An opaque data structure representing a single certificate under some
    - * CertificateScheme
    - */
    -struct _PurpleCertificate
    -{
    - /** Scheme this certificate is under */
    - PurpleCertificateScheme * scheme;
    - /** Opaque pointer to internal data */
    - gpointer data;
    -};
    -
    -/**
    - * Database for retrieval or storage of Certificates
    - *
    - * More or less a hash table; all lookups and writes are controlled by a string
    - * key.
    - */
    -struct _PurpleCertificatePool
    -{
    - /** Scheme this Pool operates for */
    - gchar *scheme_name;
    - /** Internal name to refer to the pool by */
    - gchar *name;
    -
    - /** User-friendly name for this type
    - * ex: N_("SSL Servers")
    - * When this is displayed anywhere, it should be i18ned
    - * ex: _(pool->fullname)
    - */
    - gchar *fullname;
    -
    - /** Internal pool data */
    - gpointer data;
    -
    - /**
    - * Set up the Pool's internal state
    - *
    - * Upon calling purple_certificate_register_pool() , this function will
    - * be called. May be NULL.
    - * @return TRUE if the initialization succeeded, otherwise FALSE
    - */
    - gboolean (* init)(void);
    -
    - /**
    - * Uninit the Pool's internal state
    - *
    - * Will be called by purple_certificate_unregister_pool() . May be NULL
    - */
    - void (* uninit)(void);
    -
    - /** Check for presence of a certificate in the pool using unique ID */
    - gboolean (* cert_in_pool)(const gchar *id);
    - /** Retrieve a PurpleCertificate from the pool */
    - PurpleCertificate * (* get_cert)(const gchar *id);
    - /** Add a certificate to the pool. Must overwrite any other
    - * certificates sharing the same ID in the pool.
    - * @return TRUE if the operation succeeded, otherwise FALSE
    - */
    - gboolean (* put_cert)(const gchar *id, PurpleCertificate *crt);
    - /** Delete a certificate from the pool */
    - gboolean (* delete_cert)(const gchar *id);
    -
    - /** Returns a list of IDs stored in the pool */
    - GList * (* get_idlist)(void);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/** A certificate type
    - *
    - * A CertificateScheme must implement all of the fields in the structure,
    - * and register it using purple_certificate_register_scheme()
    - *
    - * There may be only ONE CertificateScheme provided for each certificate
    - * type, as specified by the "name" field.
    - */
    -struct _PurpleCertificateScheme
    -{
    - /** Name of the certificate type
    - * ex: "x509", "pgp", etc.
    - * This must be globally unique - you may not register more than one
    - * CertificateScheme of the same name at a time.
    - */
    - gchar * name;
    -
    - /** User-friendly name for this type
    - * ex: N_("X.509 Certificates")
    - * When this is displayed anywhere, it should be i18ned
    - * ex: _(scheme->fullname)
    - */
    - gchar * fullname;
    -
    - /** Imports a certificate from a file
    - *
    - * @param filename File to import the certificate from
    - * @return Pointer to the newly allocated Certificate struct
    - * or NULL on failure.
    - */
    - PurpleCertificate * (* import_certificate)(const gchar * filename);
    -
    - /**
    - * Exports a certificate to a file
    - *
    - * @param filename File to export the certificate to
    - * @param crt Certificate to export
    - * @return TRUE if the export succeeded, otherwise FALSE
    - * @see purple_certificate_export()
    - */
    - gboolean (* export_certificate)(const gchar *filename, PurpleCertificate *crt);
    -
    - /**
    - * Duplicates a certificate
    - *
    - * Certificates are generally assumed to be read-only, so feel free to
    - * do any sort of reference-counting magic you want here. If this ever
    - * changes, please remember to change the magic accordingly.
    - * @return Reference to the new copy
    - */
    - PurpleCertificate * (* copy_certificate)(PurpleCertificate *crt);
    -
    - /** Destroys and frees a Certificate structure
    - *
    - * Destroys a Certificate's internal data structures and calls
    - * free(crt)
    - *
    - * @param crt Certificate instance to be destroyed. It WILL NOT be
    - * destroyed if it is not of the correct
    - * CertificateScheme. Can be NULL
    - */
    - void (* destroy_certificate)(PurpleCertificate * crt);
    -
    - /** Find whether "crt" has a valid signature from "issuer," including
    - * appropriate values for the CA flag in the basic constraints extension.
    - * @see purple_certificate_signed_by() */
    - gboolean (*signed_by)(PurpleCertificate *crt, PurpleCertificate *issuer);
    - /**
    - * Retrieves the certificate public key fingerprint using SHA1
    - *
    - * @param crt Certificate instance
    - * @return Binary representation of SHA1 hash - must be freed using
    - * g_byte_array_free()
    - */
    - GByteArray * (* get_fingerprint_sha1)(PurpleCertificate *crt);
    -
    - /**
    - * Retrieves a unique certificate identifier
    - *
    - * @param crt Certificate instance
    - * @return Newly allocated string that can be used to uniquely
    - * identify the certificate.
    - */
    - gchar * (* get_unique_id)(PurpleCertificate *crt);
    -
    - /**
    - * Retrieves a unique identifier for the certificate's issuer
    - *
    - * @param crt Certificate instance
    - * @return Newly allocated string that can be used to uniquely
    - * identify the issuer's certificate.
    - */
    - gchar * (* get_issuer_unique_id)(PurpleCertificate *crt);
    -
    - /**
    - * Gets the certificate subject's name
    - *
    - * For X.509, this is the "Common Name" field, as we're only using it
    - * for hostname verification at the moment
    - *
    - * @see purple_certificate_get_subject_name()
    - *
    - * @param crt Certificate instance
    - * @return Newly allocated string with the certificate subject.
    - */
    - gchar * (* get_subject_name)(PurpleCertificate *crt);
    -
    - /**
    - * Check the subject name against that on the certificate
    - * @see purple_certificate_check_subject_name()
    - * @return TRUE if it is a match, else FALSE
    - */
    - gboolean (* check_subject_name)(PurpleCertificate *crt, const gchar *name);
    -
    - /** Retrieve the certificate activation/expiration times */
    - gboolean (* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration);
    -
    - /** Imports certificates from a file
    - *
    - * @param filename File to import the certificates from
    - * @return GSList of pointers to the newly allocated Certificate structs
    - * or NULL on failure.
    - */
    - GSList * (* import_certificates)(const gchar * filename);
    -
    - /**
    - * Register a certificate as "trusted."
    - */
    - gboolean (* register_trusted_tls_cert)(PurpleCertificate *crt, gboolean ca);
    -
    - /**
    - * Verify that a certificate is valid, performing all necessary checks
    - * including date range, valid cert chain, recognized and valid CAs, etc.
    - */
    - void (* verify_cert)(PurpleCertificateVerificationRequest *vrq, PurpleCertificateInvalidityFlags *flags);
    -
    - void (*_purple_reserved3)(void);
    -};
    -
    -/** A set of operations used to provide logic for verifying a Certificate's
    - * authenticity.
    - *
    - * A Verifier provider must fill out these fields, then register it using
    - * purple_certificate_register_verifier()
    - *
    - * The (scheme_name, name) value must be unique for each Verifier - you may not
    - * register more than one Verifier of the same name for each Scheme
    - */
    -struct _PurpleCertificateVerifier
    -{
    - /** Name of the scheme this Verifier operates on
    - *
    - * The scheme will be looked up by name when a Request is generated
    - * using this Verifier
    - */
    - gchar *scheme_name;
    -
    - /** Name of the Verifier - case insensitive */
    - gchar *name;
    -
    - /**
    - * Start the verification process
    - *
    - * To be called from purple_certificate_verify once it has
    - * constructed the request. This will use the information in the
    - * given VerificationRequest to check the certificate and callback
    - * the requester with the verification results.
    - *
    - * @param vrq Request to process
    - */
    - void (* start_verification)(PurpleCertificateVerificationRequest *vrq);
    -
    - /**
    - * Destroy a completed Request under this Verifier
    - * The function pointed to here is only responsible for cleaning up
    - * whatever PurpleCertificateVerificationRequest::data points to.
    - * It should not call free(vrq)
    - *
    - * @param vrq Request to destroy
    - */
    - void (* destroy_request)(PurpleCertificateVerificationRequest *vrq);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/** Structure for a single certificate request
    - *
    - * Useful for keeping track of the state of a verification that involves
    - * several steps
    - */
    -struct _PurpleCertificateVerificationRequest
    -{
    - /** Reference to the verification logic used */
    - PurpleCertificateVerifier *verifier;
    - /** Reference to the scheme used.
    - *
    - * This is looked up from the Verifier when the Request is generated
    - */
    - PurpleCertificateScheme *scheme;
    -
    - /**
    - * Name to check that the certificate is issued to
    - *
    - * For X.509 certificates, this is the Common Name
    - */
    - gchar *subject_name;
    -
    - /** List of certificates in the chain to be verified (such as that returned by purple_ssl_get_peer_certificates )
    - *
    - * This is most relevant for X.509 certificates used in SSL sessions.
    - * The list order should be: certificate, issuer, issuer's issuer, etc.
    - */
    - GList *cert_chain;
    -
    - /** Internal data used by the Verifier code */
    - gpointer data;
    -
    - /** Function to call with the verification result */
    - PurpleCertificateVerifiedCallback cb;
    - /** Data to pass to the post-verification callback */
    - gpointer cb_data;
    -};
    -
    -/*****************************************************************************/
    -/** @name Certificate Verification Functions */
    -/*****************************************************************************/
    -/*@{*/
    -
    -/**
    - * Constructs a verification request and passed control to the specified Verifier
    - *
    - * It is possible that the callback will be called immediately upon calling
    - * this function. Plan accordingly.
    - *
    - * @param verifier Verification logic to use.
    - * @see purple_certificate_find_verifier()
    - *
    - * @param subject_name Name that should match the first certificate in the
    - * chain for the certificate to be valid. Will be strdup'd
    - * into the Request struct
    - *
    - * @param cert_chain Certificate chain to check. If there is more than one
    - * certificate in the chain (X.509), the peer's
    - * certificate comes first, then the issuer/signer's
    - * certificate, etc. The whole list is duplicated into the
    - * Request struct.
    - *
    - * @param cb Callback function to be called with whether the
    - * certificate was approved or not.
    - * @param cb_data User-defined data for the above.
    - */
    -void
    -purple_certificate_verify (PurpleCertificateVerifier *verifier,
    - const gchar *subject_name, GList *cert_chain,
    - PurpleCertificateVerifiedCallback cb,
    - gpointer cb_data);
    -
    -/**
    - * Completes and destroys a VerificationRequest
    - *
    - * @param vrq Request to conclude
    - * @param st Success/failure code to pass to the request's
    - * completion callback.
    - */
    -void
    -purple_certificate_verify_complete(PurpleCertificateVerificationRequest *vrq,
    - PurpleCertificateVerificationStatus st);
    -
    -/*@}*/
    -
    -/*****************************************************************************/
    -/** @name Certificate Functions */
    -/*****************************************************************************/
    -/*@{*/
    -
    -/**
    - * Makes a duplicate of a certificate
    - *
    - * @param crt Instance to duplicate
    - * @return Pointer to new instance
    - */
    -PurpleCertificate *
    -purple_certificate_copy(PurpleCertificate *crt);
    -
    -/**
    - * Duplicates an entire list of certificates
    - *
    - * @param crt_list List to duplicate
    - * @return New list copy
    - */
    -GList *
    -purple_certificate_copy_list(GList *crt_list);
    -
    -/**
    - * Destroys and free()'s a Certificate
    - *
    - * @param crt Instance to destroy. May be NULL.
    - */
    -void
    -purple_certificate_destroy (PurpleCertificate *crt);
    -
    -/**
    - * Destroy an entire list of Certificate instances and the containing list
    - *
    - * @param crt_list List of certificates to destroy. May be NULL.
    - */
    -void
    -purple_certificate_destroy_list (GList * crt_list);
    -
    -/**
    - * Check whether 'crt' has a valid signature made by 'issuer'
    - *
    - * @param crt Certificate instance to check signature of
    - * @param issuer Certificate thought to have signed 'crt'
    - *
    - * @return TRUE if 'crt' has a valid signature made by 'issuer',
    - * otherwise FALSE
    - * @todo Find a way to give the reason (bad signature, not the issuer, etc.)
    - */
    -gboolean
    -purple_certificate_signed_by(PurpleCertificate *crt, PurpleCertificate *issuer);
    -
    -/**
    - * Check that a certificate chain is valid and, if not, the failing certificate.
    - *
    - * Uses purple_certificate_signed_by() to verify that each PurpleCertificate
    - * in the chain carries a valid signature from the next. A single-certificate
    - * chain is considered to be valid.
    - *
    - * @param chain List of PurpleCertificate instances comprising the chain,
    - * in the order certificate, issuer, issuer's issuer, etc.
    - * @param failing A pointer to a PurpleCertificate*. If not NULL, if the
    - * chain fails to validate, this will be set to the
    - * certificate whose signature could not be validated.
    - * @return TRUE if the chain is valid. See description.
    - *
    - * @since 2.6.0
    - * @deprecated This function will become
    - * purple_certificate_check_signature_chain in 3.0.0
    - */
    -gboolean
    -purple_certificate_check_signature_chain_with_failing(GList *chain,
    - PurpleCertificate **failing);
    -
    -/**
    - * Check that a certificate chain is valid
    - *
    - * Uses purple_certificate_signed_by() to verify that each PurpleCertificate
    - * in the chain carries a valid signature from the next. A single-certificate
    - * chain is considered to be valid.
    - *
    - * @param chain List of PurpleCertificate instances comprising the chain,
    - * in the order certificate, issuer, issuer's issuer, etc.
    - * @return TRUE if the chain is valid. See description.
    - * @todo Specify which certificate in the chain caused a failure
    - * @deprecated This function will be removed in 3.0.0 and replaced with
    - * purple_certificate_check_signature_chain_with_failing
    - */
    -gboolean
    -purple_certificate_check_signature_chain(GList *chain);
    -
    -/**
    - * Imports a PurpleCertificate from a file
    - *
    - * @param scheme Scheme to import under
    - * @param filename File path to import from
    - * @return Pointer to a new PurpleCertificate, or NULL on failure
    - */
    -PurpleCertificate *
    -purple_certificate_import(PurpleCertificateScheme *scheme, const gchar *filename);
    -
    -/**
    - * Imports a list of PurpleCertificates from a file
    - *
    - * @param scheme Scheme to import under
    - * @param filename File path to import from
    - * @return Pointer to a GSList of new PurpleCertificates, or NULL on failure
    - */
    -GSList *
    -purple_certificates_import(PurpleCertificateScheme *scheme, const gchar *filename);
    -
    -/**
    - * Exports a PurpleCertificate to a file
    - *
    - * @param filename File to export the certificate to
    - * @param crt Certificate to export
    - * @return TRUE if the export succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_export(const gchar *filename, PurpleCertificate *crt);
    -
    -
    -/**
    - * Retrieves the certificate public key fingerprint using SHA1.
    - *
    - * @param crt Certificate instance
    - * @return Binary representation of the hash. You are responsible for free()ing
    - * this.
    - * @see purple_base16_encode_chunked()
    - */
    -GByteArray *
    -purple_certificate_get_fingerprint_sha1(PurpleCertificate *crt);
    -
    -/**
    - * Get a unique identifier for the certificate
    - *
    - * @param crt Certificate instance
    - * @return String representing the certificate uniquely. Must be g_free()'ed
    - */
    -gchar *
    -purple_certificate_get_unique_id(PurpleCertificate *crt);
    -
    -/**
    - * Get a unique identifier for the certificate's issuer
    - *
    - * @param crt Certificate instance
    - * @return String representing the certificate's issuer uniquely. Must be
    - * g_free()'ed
    - */
    -gchar *
    -purple_certificate_get_issuer_unique_id(PurpleCertificate *crt);
    -
    -/**
    - * Gets the certificate subject's name
    - *
    - * For X.509, this is the "Common Name" field, as we're only using it
    - * for hostname verification at the moment
    - *
    - * @param crt Certificate instance
    - * @return Newly allocated string with the certificate subject.
    - */
    -gchar *
    -purple_certificate_get_subject_name(PurpleCertificate *crt);
    -
    -/**
    - * Check the subject name against that on the certificate
    - * @param crt Certificate instance
    - * @param name Name to check.
    - * @return TRUE if it is a match, else FALSE
    - */
    -gboolean
    -purple_certificate_check_subject_name(PurpleCertificate *crt, const gchar *name);
    -
    -/**
    - * Get the expiration/activation times.
    - *
    - * @param crt Certificate instance
    - * @param activation Reference to store the activation time at. May be NULL
    - * if you don't actually want it.
    - * @param expiration Reference to store the expiration time at. May be NULL
    - * if you don't actually want it.
    - * @return TRUE if the requested values were obtained, otherwise FALSE.
    - */
    -gboolean
    -purple_certificate_get_times(PurpleCertificate *crt, time_t *activation, time_t *expiration);
    -
    -/*@}*/
    -
    -/*****************************************************************************/
    -/** @name Certificate Pool Functions */
    -/*****************************************************************************/
    -/*@{*/
    -/**
    - * Helper function for generating file paths in ~/.purple/certificates for
    - * CertificatePools that use them.
    - *
    - * All components will be escaped for filesystem friendliness.
    - *
    - * @param pool CertificatePool to build a path for
    - * @param id Key to look up a Certificate by. May be NULL.
    - * @return A newly allocated path of the form
    - * ~/.purple/certificates/scheme_name/pool_name/unique_id
    - */
    -gchar *
    -purple_certificate_pool_mkpath(PurpleCertificatePool *pool, const gchar *id);
    -
    -/**
    - * Determines whether a pool can be used.
    - *
    - * Checks whether the associated CertificateScheme is loaded.
    - *
    - * @param pool Pool to check
    - *
    - * @return TRUE if the pool can be used, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_pool_usable(PurpleCertificatePool *pool);
    -
    -/**
    - * Looks up the scheme the pool operates under
    - *
    - * @param pool Pool to get the scheme of
    - *
    - * @return Pointer to the pool's scheme, or NULL if it isn't loaded.
    - * @see purple_certificate_pool_usable()
    - */
    -PurpleCertificateScheme *
    -purple_certificate_pool_get_scheme(PurpleCertificatePool *pool);
    -
    -/**
    - * Check for presence of an ID in a pool.
    - * @param pool Pool to look in
    - * @param id ID to look for
    - * @return TRUE if the ID is in the pool, else FALSE
    - */
    -gboolean
    -purple_certificate_pool_contains(PurpleCertificatePool *pool, const gchar *id);
    -
    -/**
    - * Retrieve a certificate from a pool.
    - * @param pool Pool to fish in
    - * @param id ID to look up
    - * @return Retrieved certificate (to be freed with purple_certificate_destroy),
    - * or NULL if it wasn't there
    - */
    -PurpleCertificate *
    -purple_certificate_pool_retrieve(PurpleCertificatePool *pool, const gchar *id);
    -
    -/**
    - * Add a certificate to a pool
    - *
    - * Any pre-existing certificate of the same ID will be overwritten.
    - *
    - * @param pool Pool to add to
    - * @param id ID to store the certificate with
    - * @param crt Certificate to store
    - * @return TRUE if the operation succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_pool_store(PurpleCertificatePool *pool, const gchar *id, PurpleCertificate *crt);
    -
    -/**
    - * Remove a certificate from a pool
    - *
    - * @param pool Pool to remove from
    - * @param id ID to remove
    - * @return TRUE if the operation succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_pool_delete(PurpleCertificatePool *pool, const gchar *id);
    -
    -/**
    - * Get the list of IDs currently in the pool.
    - *
    - * @param pool Pool to enumerate
    - * @return GList pointing to newly-allocated id strings. Free using
    - * purple_certificate_pool_destroy_idlist()
    - */
    -GList *
    -purple_certificate_pool_get_idlist(PurpleCertificatePool *pool);
    -
    -/**
    - * Destroys the result given by purple_certificate_pool_get_idlist()
    - *
    - * @param idlist ID List to destroy
    - */
    -void
    -purple_certificate_pool_destroy_idlist(GList *idlist);
    -
    -/*@}*/
    -
    -/*****************************************************************************/
    -/** @name Certificate Subsystem API */
    -/*****************************************************************************/
    -/*@{*/
    -
    -/**
    - * Initialize the certificate system
    - */
    -void
    -purple_certificate_init(void);
    -
    -/**
    - * Un-initialize the certificate system
    - */
    -void
    -purple_certificate_uninit(void);
    -
    -/**
    - * Get the Certificate subsystem handle for signalling purposes
    - */
    -gpointer
    -purple_certificate_get_handle(void);
    -
    -/** Look up a registered CertificateScheme by name
    - * @param name The scheme name. Case insensitive.
    - * @return Pointer to the located Scheme, or NULL if it isn't found.
    - */
    -PurpleCertificateScheme *
    -purple_certificate_find_scheme(const gchar *name);
    -
    -/**
    - * Get all registered CertificateSchemes
    - *
    - * @return GList pointing to all registered CertificateSchemes . This value
    - * is owned by libpurple
    - */
    -GList *
    -purple_certificate_get_schemes(void);
    -
    -/** Register a CertificateScheme with libpurple
    - *
    - * No two schemes can be registered with the same name; this function enforces
    - * that.
    - *
    - * @param scheme Pointer to the scheme to register.
    - * @return TRUE if the scheme was successfully added, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_register_scheme(PurpleCertificateScheme *scheme);
    -
    -/** Unregister a CertificateScheme from libpurple
    - *
    - * @param scheme Scheme to unregister.
    - * If the scheme is not registered, this is a no-op.
    - *
    - * @return TRUE if the unregister completed successfully
    - */
    -gboolean
    -purple_certificate_unregister_scheme(PurpleCertificateScheme *scheme);
    -
    -/** Look up a registered PurpleCertificateVerifier by scheme and name
    - * @param scheme_name Scheme name. Case insensitive.
    - * @param ver_name The verifier name. Case insensitive.
    - * @return Pointer to the located Verifier, or NULL if it isn't found.
    - */
    -PurpleCertificateVerifier *
    -purple_certificate_find_verifier(const gchar *scheme_name, const gchar *ver_name);
    -
    -/**
    - * Get the list of registered CertificateVerifiers
    - *
    - * @return GList of all registered PurpleCertificateVerifier. This value
    - * is owned by libpurple
    - */
    -GList *
    -purple_certificate_get_verifiers(void);
    -
    -/**
    - * Register a CertificateVerifier with libpurple
    - *
    - * @param vr Verifier to register.
    - * @return TRUE if register succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_register_verifier(PurpleCertificateVerifier *vr);
    -
    -/**
    - * Unregister a CertificateVerifier with libpurple
    - *
    - * @param vr Verifier to unregister.
    - * @return TRUE if unregister succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_unregister_verifier(PurpleCertificateVerifier *vr);
    -
    -/** Look up a registered PurpleCertificatePool by scheme and name
    - * @param scheme_name Scheme name. Case insensitive.
    - * @param pool_name Pool name. Case insensitive.
    - * @return Pointer to the located Pool, or NULL if it isn't found.
    - */
    -PurpleCertificatePool *
    -purple_certificate_find_pool(const gchar *scheme_name, const gchar *pool_name);
    -
    -/**
    - * Get the list of registered Pools
    - *
    - * @return GList of all registered PurpleCertificatePool s. This value
    - * is owned by libpurple
    - */
    -GList *
    -purple_certificate_get_pools(void);
    -
    -/**
    - * Register a CertificatePool with libpurple and call its init function
    - *
    - * @param pool Pool to register.
    - * @return TRUE if the register succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_register_pool(PurpleCertificatePool *pool);
    -
    -/**
    - * Unregister a CertificatePool with libpurple and call its uninit function
    - *
    - * @param pool Pool to unregister.
    - * @return TRUE if the unregister succeeded, otherwise FALSE
    - */
    -gboolean
    -purple_certificate_unregister_pool(PurpleCertificatePool *pool);
    -
    -/*@}*/
    -
    -
    -/**
    - * Displays a window showing X.509 certificate information
    - *
    - * @param crt Certificate under an "x509" Scheme
    - * @todo Will break on CA certs, as they have no Common Name
    - */
    -void
    -purple_certificate_display_x509(PurpleCertificate *crt);
    -
    -/**
    - * Add a search path for certificates.
    - *
    - * @param path Path to search for certificates.
    - */
    -void purple_certificate_add_ca_search_path(const char *path);
    -
    -#ifdef __cplusplus
    -}
    -#endif /* __cplusplus */
    -
    -#endif /* _PURPLE_CERTIFICATE_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/chat.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,118 +0,0 @@
    -/**
    - * @file chat.h Chat stuff
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_CHAT_H_
    -#define PURPLE_JABBER_CHAT_H_
    -
    -#include "internal.h"
    -#include "connection.h"
    -#include "conversation.h"
    -#include "request.h"
    -#include "roomlist.h"
    -
    -#include "jabber.h"
    -
    -typedef struct _JabberChatMember {
    - char *handle;
    - char *jid;
    -} JabberChatMember;
    -
    -
    -typedef struct _JabberChat {
    - JabberStream *js;
    - char *room;
    - char *server;
    - char *handle;
    - GHashTable *components;
    - int id;
    - PurpleConversation *conv;
    - gboolean muc;
    - gboolean xhtml;
    - PurpleRequestType config_dialog_type;
    - void *config_dialog_handle;
    - GHashTable *members;
    - gboolean left;
    - time_t joined;
    -} JabberChat;
    -
    -GList *jabber_chat_info(PurpleConnection *gc);
    -GHashTable *jabber_chat_info_defaults(PurpleConnection *gc, const char *chat_name);
    -char *jabber_get_chat_name(GHashTable *data);
    -
    -/**
    - * in-prpl function for joining a chat room. Doesn't require sticking goop
    - * into a hash table.
    - *
    - * @param room The room to join. This MUST be normalized already.
    - * @param server The server the room is on. This MUST be normalized already.
    - * @param password The password (if required) to join the room. May be NULL.
    - * @param data The chat hash table. May be NULL (it will be generated
    - * for current core<>prpl API interface.)
    - */
    -JabberChat *jabber_join_chat(JabberStream *js, const char *room,
    - const char *server, const char *handle,
    - const char *password, GHashTable *data);
    -
    -void jabber_chat_join(PurpleConnection *gc, GHashTable *data);
    -JabberChat *jabber_chat_find(JabberStream *js, const char *room,
    - const char *server);
    -JabberChat *jabber_chat_find_by_id(JabberStream *js, int id);
    -JabberChat *jabber_chat_find_by_conv(PurpleConversation *conv);
    -void jabber_chat_destroy(JabberChat *chat);
    -void jabber_chat_free(JabberChat *chat);
    -gboolean jabber_chat_find_buddy(PurpleConversation *conv, const char *name);
    -void jabber_chat_invite(PurpleConnection *gc, int id, const char *message,
    - const char *name);
    -void jabber_chat_leave(PurpleConnection *gc, int id);
    -char *jabber_chat_buddy_real_name(PurpleConnection *gc, int id, const char *who);
    -void jabber_chat_request_room_configure(JabberChat *chat);
    -void jabber_chat_create_instant_room(JabberChat *chat);
    -void jabber_chat_register(JabberChat *chat);
    -void jabber_chat_change_topic(JabberChat *chat, const char *topic);
    -void jabber_chat_set_topic(PurpleConnection *gc, int id, const char *topic);
    -gboolean jabber_chat_change_nick(JabberChat *chat, const char *nick);
    -void jabber_chat_part(JabberChat *chat, const char *msg);
    -void jabber_chat_track_handle(JabberChat *chat, const char *handle,
    - const char *jid, const char *affiliation, const char *role);
    -void jabber_chat_remove_handle(JabberChat *chat, const char *handle);
    -gboolean jabber_chat_ban_user(JabberChat *chat, const char *who,
    - const char *why);
    -gboolean jabber_chat_affiliate_user(JabberChat *chat, const char *who,
    - const char *affiliation);
    -gboolean jabber_chat_affiliation_list(JabberChat *chat, const char *affiliation);
    -gboolean jabber_chat_role_user(JabberChat *chat, const char *who,
    - const char *role, const char *why);
    -gboolean jabber_chat_role_list(JabberChat *chat, const char *role);
    -
    -PurpleRoomlist *jabber_roomlist_get_list(PurpleConnection *gc);
    -void jabber_roomlist_cancel(PurpleRoomlist *list);
    -
    -void jabber_chat_disco_traffic(JabberChat *chat);
    -
    -char *jabber_roomlist_room_serialize(PurpleRoomlistRoom *room);
    -
    -gboolean jabber_chat_all_participants_have_capability(const JabberChat *chat,
    - const gchar *cap);
    -guint jabber_chat_get_num_participants(const JabberChat *chat);
    -
    -#endif /* PURPLE_JABBER_CHAT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cipher.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,502 +0,0 @@
    -/**
    - * @file cipher.h Purple Cipher API
    - * @ingroup core
    - * @see @ref cipher-signals
    - */
    -
    -/* 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
    - */
    -#ifndef PURPLE_CIPHER_H
    -#define PURPLE_CIPHER_H
    -
    -#include <glib.h>
    -#include <string.h>
    -
    -#define PURPLE_CIPHER(obj) ((PurpleCipher *)(obj)) /**< PurpleCipher typecast helper */
    -#define PURPLE_CIPHER_OPS(obj) ((PurpleCipherOps *)(obj)) /**< PurpleCipherInfo typecase helper */
    -#define PURPLE_CIPHER_CONTEXT(obj) ((PurpleCipherContext *)(obj)) /**< PurpleCipherContext typecast helper */
    -
    -typedef struct _PurpleCipher PurpleCipher; /**< A handle to a PurpleCipher */
    -typedef struct _PurpleCipherOps PurpleCipherOps; /**< Ops for a PurpleCipher */
    -typedef struct _PurpleCipherContext PurpleCipherContext; /**< A context for a PurpleCipher */
    -
    -/**
    - * Modes for batch encrypters
    - */
    -typedef enum _PurpleCipherBatchMode {
    - PURPLE_CIPHER_BATCH_MODE_ECB,
    - PURPLE_CIPHER_BATCH_MODE_CBC
    -} PurpleCipherBatchMode;
    -
    -/**
    - * The operation flags for a cipher
    - */
    -typedef enum _PurpleCipherCaps {
    - PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1, /**< Set option flag */
    - PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2, /**< Get option flag */
    - PURPLE_CIPHER_CAPS_INIT = 1 << 3, /**< Init flag */
    - PURPLE_CIPHER_CAPS_RESET = 1 << 4, /**< Reset flag */
    - PURPLE_CIPHER_CAPS_UNINIT = 1 << 5, /**< Uninit flag */
    - PURPLE_CIPHER_CAPS_SET_IV = 1 << 6, /**< Set IV flag */
    - PURPLE_CIPHER_CAPS_APPEND = 1 << 7, /**< Append flag */
    - PURPLE_CIPHER_CAPS_DIGEST = 1 << 8, /**< Digest flag */
    - PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 9, /**< Encrypt flag */
    - PURPLE_CIPHER_CAPS_DECRYPT = 1 << 10, /**< Decrypt flag */
    - PURPLE_CIPHER_CAPS_SET_SALT = 1 << 11, /**< Set salt flag */
    - PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 12, /**< Get salt size flag */
    - PURPLE_CIPHER_CAPS_SET_KEY = 1 << 13, /**< Set key flag */
    - PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 14, /**< Get key size flag */
    - PURPLE_CIPHER_CAPS_SET_BATCH_MODE = 1 << 15, /**< Set batch mode flag */
    - PURPLE_CIPHER_CAPS_GET_BATCH_MODE = 1 << 16, /**< Get batch mode flag */
    - PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE = 1 << 17, /**< The get block size flag */
    - PURPLE_CIPHER_CAPS_SET_KEY_WITH_LEN = 1 << 18, /**< The set key with length flag */
    - PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 19 /**< Unknown */
    -} PurpleCipherCaps;
    -
    -/**
    - * The operations of a cipher. Every cipher must implement one of these.
    - */
    -struct _PurpleCipherOps {
    - /** The set option function */
    - void (*set_option)(PurpleCipherContext *context, const gchar *name, void *value);
    -
    - /** The get option function */
    - void *(*get_option)(PurpleCipherContext *context, const gchar *name);
    -
    - /** The init function */
    - void (*init)(PurpleCipherContext *context, void *extra);
    -
    - /** The reset function */
    - void (*reset)(PurpleCipherContext *context, void *extra);
    -
    - /** The uninit function */
    - void (*uninit)(PurpleCipherContext *context);
    -
    - /** The set initialization vector function */
    - void (*set_iv)(PurpleCipherContext *context, guchar *iv, size_t len);
    -
    - /** The append data function */
    - void (*append)(PurpleCipherContext *context, const guchar *data, size_t len);
    -
    - /** The digest function */
    - gboolean (*digest)(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
    -
    - /** The encrypt function */
    - int (*encrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    -
    - /** The decrypt function */
    - int (*decrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    -
    - /** The set salt function */
    - void (*set_salt)(PurpleCipherContext *context, guchar *salt);
    -
    - /** The get salt size function */
    - size_t (*get_salt_size)(PurpleCipherContext *context);
    -
    - /** The set key function */
    - void (*set_key)(PurpleCipherContext *context, const guchar *key);
    -
    - /** The get key size function */
    - size_t (*get_key_size)(PurpleCipherContext *context);
    -
    - /** The set batch mode function */
    - void (*set_batch_mode)(PurpleCipherContext *context, PurpleCipherBatchMode mode);
    -
    - /** The get batch mode function */
    - PurpleCipherBatchMode (*get_batch_mode)(PurpleCipherContext *context);
    -
    - /** The get block size function */
    - size_t (*get_block_size)(PurpleCipherContext *context);
    -
    - /** The set key with length function */
    - void (*set_key_with_len)(PurpleCipherContext *context, const guchar *key, size_t len);
    -};
    -
    -G_BEGIN_DECLS
    -
    -/*****************************************************************************/
    -/** @name PurpleCipher API */
    -/*****************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets a cipher's name
    - *
    - * @param cipher The cipher handle
    - *
    - * @return The cipher's name
    - */
    -const gchar *purple_cipher_get_name(PurpleCipher *cipher);
    -
    -/**
    - * Gets a cipher's capabilities
    - *
    - * @param cipher The cipher handle
    - *
    - * @return The cipher's info
    - */
    -guint purple_cipher_get_capabilities(PurpleCipher *cipher);
    -
    -/**
    - * Gets a digest from a cipher
    - *
    - * @param name The cipher's name
    - * @param data The data to hash
    - * @param data_len The length of the data
    - * @param in_len The length of the buffer
    - * @param digest The returned digest
    - * @param out_len The length written
    - *
    - * @return @c TRUE if successful, @c FALSE otherwise
    - */
    -gboolean purple_cipher_digest_region(const gchar *name, const guchar *data, size_t data_len, size_t in_len, guchar digest[], size_t *out_len);
    -
    -/*@}*/
    -/******************************************************************************/
    -/** @name PurpleCiphers API */
    -/******************************************************************************/
    -/*@{*/
    -
    -/**
    - * Finds a cipher by it's name
    - *
    - * @param name The name of the cipher to find
    - *
    - * @return The cipher handle or @c NULL
    - */
    -PurpleCipher *purple_ciphers_find_cipher(const gchar *name);
    -
    -/**
    - * Registers a cipher as a usable cipher
    - *
    - * @param name The name of the new cipher
    - * @param ops The cipher ops to register
    - *
    - * @return The handle to the new cipher or @c NULL if it failed
    - */
    -PurpleCipher *purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops);
    -
    -/**
    - * Unregisters a cipher
    - *
    - * @param cipher The cipher handle to unregister
    - *
    - * @return Whether or not the cipher was successfully unloaded
    - */
    -gboolean purple_ciphers_unregister_cipher(PurpleCipher *cipher);
    -
    -/**
    - * Gets the list of ciphers
    - *
    - * @return The list of available ciphers
    - * @note This list should not be modified, it is owned by the cipher core
    - */
    -GList *purple_ciphers_get_ciphers(void);
    -
    -/*@}*/
    -/******************************************************************************/
    -/** @name PurpleCipher Subsystem API */
    -/******************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets the handle to the cipher subsystem
    - *
    - * @return The handle to the cipher subsystem
    - */
    -gpointer purple_ciphers_get_handle(void);
    -
    -/**
    - * Initializes the cipher core
    - */
    -void purple_ciphers_init(void);
    -
    -/**
    - * Uninitializes the cipher core
    - */
    -void purple_ciphers_uninit(void);
    -
    -/*@}*/
    -/******************************************************************************/
    -/** @name PurpleCipherContext API */
    -/******************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the value an option on a cipher context
    - *
    - * @param context The cipher context
    - * @param name The name of the option
    - * @param value The value to set
    - */
    -void purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name, gpointer value);
    -
    -/**
    - * Gets the vale of an option on a cipher context
    - *
    - * @param context The cipher context
    - * @param name The name of the option
    - * @return The value of the option
    - */
    -gpointer purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name);
    -
    -/**
    - * Creates a new cipher context and initializes it
    - *
    - * @param cipher The cipher to use
    - * @param extra Extra data for the specific cipher
    - *
    - * @return The new cipher context
    - */
    -PurpleCipherContext *purple_cipher_context_new(PurpleCipher *cipher, void *extra);
    -
    -/**
    - * Creates a new cipher context by the cipher name and initializes it
    - *
    - * @param name The cipher's name
    - * @param extra Extra data for the specific cipher
    - *
    - * @return The new cipher context
    - */
    -PurpleCipherContext *purple_cipher_context_new_by_name(const gchar *name, void *extra);
    -
    -/**
    - * Resets a cipher context to it's default value
    - * @note If you have set an IV you will have to set it after resetting
    - *
    - * @param context The context to reset
    - * @param extra Extra data for the specific cipher
    - */
    -void purple_cipher_context_reset(PurpleCipherContext *context, gpointer extra);
    -
    -/**
    - * Destorys a cipher context and deinitializes it
    - *
    - * @param context The cipher context to destory
    - */
    -void purple_cipher_context_destroy(PurpleCipherContext *context);
    -
    -/**
    - * Sets the initialization vector for a context
    - * @note This should only be called right after a cipher context is created or reset
    - *
    - * @param context The context to set the IV to
    - * @param iv The initialization vector to set
    - * @param len The len of the IV
    - */
    -void purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len);
    -
    -/**
    - * Appends data to the context
    - *
    - * @param context The context to append data to
    - * @param data The data to append
    - * @param len The length of the data
    - */
    -void purple_cipher_context_append(PurpleCipherContext *context, const guchar *data, size_t len);
    -
    -/**
    - * Digests a context
    - *
    - * @param context The context to digest
    - * @param in_len The length of the buffer
    - * @param digest The return buffer for the digest
    - * @param out_len The length of the returned value
    - */
    -gboolean purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
    -
    -/**
    - * Converts a guchar digest into a hex string
    - *
    - * @param context The context to get a digest from
    - * @param in_len The length of the buffer
    - * @param digest_s The return buffer for the string digest
    - * @param out_len The length of the returned value
    - */
    -gboolean purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len, gchar digest_s[], size_t *out_len);
    -
    -/**
    - * Encrypts data using the context
    - *
    - * @param context The context
    - * @param data The data to encrypt
    - * @param len The length of the data
    - * @param output The output buffer
    - * @param outlen The len of data that was outputed
    - *
    - * @return A cipher specific status code
    - */
    -gint purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    -
    -/**
    - * Decrypts data using the context
    - *
    - * @param context The context
    - * @param data The data to encrypt
    - * @param len The length of the returned value
    - * @param output The output buffer
    - * @param outlen The len of data that was outputed
    - *
    - * @return A cipher specific status code
    - */
    -gint purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    -
    -/**
    - * Sets the salt on a context
    - *
    - * @param context The context whose salt to set
    - * @param salt The salt
    - */
    -void purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt);
    -
    -/**
    - * Gets the size of the salt if the cipher supports it
    - *
    - * @param context The context whose salt size to get
    - *
    - * @return The size of the salt
    - */
    -size_t purple_cipher_context_get_salt_size(PurpleCipherContext *context);
    -
    -/**
    - * Sets the key on a context
    - *
    - * @param context The context whose key to set
    - * @param key The key
    - */
    -void purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key);
    -
    -/**
    - * Gets the key size for a context
    - *
    - * @param context The context whose key size to get
    - *
    - * @return The size of the key
    - */
    -size_t purple_cipher_context_get_key_size(PurpleCipherContext *context);
    -
    -/**
    - * Sets the batch mode of a context
    - *
    - * @param context The context whose batch mode to set
    - * @param mode The batch mode under which the cipher should operate
    - *
    - */
    -void purple_cipher_context_set_batch_mode(PurpleCipherContext *context, PurpleCipherBatchMode mode);
    -
    -/**
    - * Gets the batch mode of a context
    - *
    - * @param context The context whose batch mode to get
    - *
    - * @return The batch mode under which the cipher is operating
    - */
    -PurpleCipherBatchMode purple_cipher_context_get_batch_mode(PurpleCipherContext *context);
    -
    -/**
    - * Gets the block size of a context
    - *
    - * @param context The context whose block size to get
    - *
    - * @return The block size of the context
    - */
    -size_t purple_cipher_context_get_block_size(PurpleCipherContext *context);
    -
    -/**
    - * Sets the key with a given length on a context
    - *
    - * @param context The context whose key to set
    - * @param key The key
    - * @param len The length of the key
    - *
    - */
    -void purple_cipher_context_set_key_with_len(PurpleCipherContext *context, const guchar *key, size_t len);
    -
    -/**
    - * Sets the cipher data for a context
    - *
    - * @param context The context whose cipher data to set
    - * @param data The cipher data to set
    - */
    -void purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data);
    -
    -/**
    - * Gets the cipher data for a context
    - *
    - * @param context The context whose cipher data to get
    - *
    - * @return The cipher data
    - */
    -gpointer purple_cipher_context_get_data(PurpleCipherContext *context);
    -
    -/*@}*/
    -/*****************************************************************************/
    -/** @name Purple Cipher HTTP Digest Helper Functions */
    -/*****************************************************************************/
    -/*@{*/
    -
    -/**
    - * Calculates a session key for HTTP Digest authentation
    - *
    - * See RFC 2617 for more information.
    - *
    - * @param algorithm The hash algorithm to use
    - * @param username The username provided by the user
    - * @param realm The authentication realm provided by the server
    - * @param password The password provided by the user
    - * @param nonce The nonce provided by the server
    - * @param client_nonce The nonce provided by the client
    - *
    - * @return The session key, or @c NULL if an error occurred.
    - */
    -gchar *purple_cipher_http_digest_calculate_session_key(
    - const gchar *algorithm, const gchar *username,
    - const gchar *realm, const gchar *password,
    - const gchar *nonce, const gchar *client_nonce);
    -
    -/** Calculate a response for HTTP Digest authentication
    - *
    - * See RFC 2617 for more information.
    - *
    - * @param algorithm The hash algorithm to use
    - * @param method The HTTP method in use
    - * @param digest_uri The URI from the initial request
    - * @param qop The "quality of protection"
    - * @param entity The entity body
    - * @param nonce The nonce provided by the server
    - * @param nonce_count The nonce count
    - * @param client_nonce The nonce provided by the client
    - * @param session_key The session key from purple_cipher_http_digest_calculate_session_key()
    - *
    - * @return The hashed response, or @c NULL if an error occurred.
    - */
    -gchar *purple_cipher_http_digest_calculate_response(
    - const gchar *algorithm, const gchar *method,
    - const gchar *digest_uri, const gchar *qop,
    - const gchar *entity, const gchar *nonce,
    - const gchar *nonce_count, const gchar *client_nonce,
    - const gchar *session_key);
    -
    -/*@}*/
    -
    -G_END_DECLS
    -
    -#endif /* PURPLE_CIPHER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/circbuffer.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,118 +0,0 @@
    -/**
    - * @file circbuffer.h Buffer Utility Functions
    - * @ingroup core
    - */
    -
    -/* 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
    - */
    -#ifndef _CIRCBUFFER_H
    -#define _CIRCBUFFER_H
    -
    -#include <glib.h>
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -typedef struct _PurpleCircBuffer {
    -
    - /** A pointer to the starting address of our chunk of memory. */
    - gchar *buffer;
    -
    - /** The incremental amount to increase this buffer by when
    - * the buffer is not big enough to hold incoming data, in bytes. */
    - gsize growsize;
    -
    - /** The length of this buffer, in bytes. */
    - gsize buflen;
    -
    - /** The number of bytes of this buffer that contain unread data. */
    - gsize bufused;
    -
    - /** A pointer to the next byte where new incoming data is
    - * buffered to. */
    - gchar *inptr;
    -
    - /** A pointer to the next byte of buffered data that should be
    - * read by the consumer. */
    - gchar *outptr;
    -
    -} PurpleCircBuffer;
    -
    -/**
    - * Creates a new circular buffer. This will not allocate any memory for the
    - * actual buffer until data is appended to it.
    - *
    - * @param growsize The amount that the buffer should grow the first time data
    - * is appended and every time more space is needed. Pass in
    - * "0" to use the default of 256 bytes.
    - *
    - * @return The new PurpleCircBuffer. This should be freed with
    - * purple_circ_buffer_destroy when you are done with it
    - */
    -PurpleCircBuffer *purple_circ_buffer_new(gsize growsize);
    -
    -/**
    - * Dispose of the PurpleCircBuffer and free any memory used by it (including any
    - * memory used by the internal buffer).
    - *
    - * @param buf The PurpleCircBuffer to free
    - */
    -void purple_circ_buffer_destroy(PurpleCircBuffer *buf);
    -
    -/**
    - * Append data to the PurpleCircBuffer. This will grow the internal
    - * buffer to fit the added data, if needed.
    - *
    - * @param buf The PurpleCircBuffer to which to append the data
    - * @param src pointer to the data to copy into the buffer
    - * @param len number of bytes to copy into the buffer
    - */
    -void purple_circ_buffer_append(PurpleCircBuffer *buf, gconstpointer src, gsize len);
    -
    -/**
    - * Determine the maximum number of contiguous bytes that can be read from the
    - * PurpleCircBuffer.
    - * Note: This may not be the total number of bytes that are buffered - a
    - * subsequent call after calling purple_circ_buffer_mark_read() may indicate more
    - * data is available to read.
    - *
    - * @param buf the PurpleCircBuffer for which to determine the maximum contiguous
    - * bytes that can be read.
    - *
    - * @return the number of bytes that can be read from the PurpleCircBuffer
    - */
    -gsize purple_circ_buffer_get_max_read(const PurpleCircBuffer *buf);
    -
    -/**
    - * Mark the number of bytes that have been read from the buffer.
    - *
    - * @param buf The PurpleCircBuffer to mark bytes read from
    - * @param len The number of bytes to mark as read
    - *
    - * @return TRUE if we successfully marked the bytes as having been read, FALSE
    - * otherwise.
    - */
    -gboolean purple_circ_buffer_mark_read(PurpleCircBuffer *buf, gsize len);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _CIRCBUFFER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cmdproc.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,100 +0,0 @@
    -/**
    - * @file cmdproc.h MSN command processor functions
    - *
    - * 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
    - */
    -#ifndef MSN_CMDPROC_H
    -#define MSN_CMDPROC_H
    -
    -typedef struct _MsnCmdProc MsnCmdProc;
    -
    -#include "command.h"
    -#include "history.h"
    -#include "servconn.h"
    -#include "session.h"
    -#include "table.h"
    -
    -struct _MsnCmdProc
    -{
    - MsnSession *session;
    - MsnServConn *servconn;
    -
    - GQueue *txqueue;
    -
    - MsnCommand *last_cmd;
    -
    - MsnTable *cbs_table;
    -
    - MsnHistory *history;
    -
    - GHashTable *multiparts; /**< Multi-part message ID's */
    -
    - void *data; /**< Extra data, like the switchboard. */
    -};
    -
    -/**
    - * Creates a MsnCmdProc structure.
    - *
    - * @param session The session to associate with.
    - *
    - * @return A new MsnCmdProc structure.
    - */
    -MsnCmdProc *msn_cmdproc_new(MsnSession *session);
    -
    -/**
    - * Destroys an MsnCmdProc.
    - *
    - * @param cmdproc The object structure.
    - */
    -void msn_cmdproc_destroy(MsnCmdProc *cmdproc);
    -
    -/**
    - * Process the queued transactions.
    - *
    - * @param cmdproc The MsnCmdProc.
    - */
    -void msn_cmdproc_process_queue(MsnCmdProc *cmdproc);
    -
    -/**
    - * Sends transaction using this servconn.
    - *
    - * @param cmdproc The MsnCmdProc to be used.
    - * @param trans The MsnTransaction to be sent.
    - */
    -gboolean msn_cmdproc_send_trans(MsnCmdProc *cmdproc, MsnTransaction *trans);
    -
    -/**
    - * Add a transaction to the queue to be processed latter.
    - *
    - * @param cmdproc The MsnCmdProc in which the transaction will be queued.
    - * @param trans The MsnTransaction to be queued.
    - */
    -void msn_cmdproc_queue_trans(MsnCmdProc *cmdproc,
    - MsnTransaction *trans);
    -
    -void msn_cmdproc_process_msg(MsnCmdProc *cmdproc,
    - MsnMessage *msg);
    -void msn_cmdproc_process_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd);
    -void msn_cmdproc_process_cmd_text(MsnCmdProc *cmdproc, const char *command);
    -void msn_cmdproc_process_payload(MsnCmdProc *cmdproc,
    - char *payload, int payload_len);
    -
    -#endif /* MSN_CMDPROC_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/cmds.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,250 +0,0 @@
    -/**
    - * @file cmds.h Commands API
    - * @ingroup core
    - * @see @ref cmd-signals
    - */
    -
    -/* Copyright (C) 2003 Timothy Ringenbach <omarvo@hotmail.com>
    - *
    - * 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
    - *
    - */
    -#ifndef _PURPLE_CMDS_H_
    -#define _PURPLE_CMDS_H_
    -
    -#include "conversation.h"
    -
    -/**************************************************************************/
    -/** @name Structures */
    -/**************************************************************************/
    -/*@{*/
    -
    -/** The possible results of running a command with purple_cmd_do_command(). */
    -typedef enum _PurpleCmdStatus {
    - PURPLE_CMD_STATUS_OK,
    - PURPLE_CMD_STATUS_FAILED,
    - PURPLE_CMD_STATUS_NOT_FOUND,
    - PURPLE_CMD_STATUS_WRONG_ARGS,
    - PURPLE_CMD_STATUS_WRONG_PRPL,
    - PURPLE_CMD_STATUS_WRONG_TYPE
    -} PurpleCmdStatus;
    -
    -/** Commands registered with the core return one of these values when run.
    - * Normally, a command will want to return one of the first two; in some
    - * unusual cases, you might want to have several functions called for a
    - * particular command; in this case, they should return
    - * #PURPLE_CMD_RET_CONTINUE to cause the core to fall through to other
    - * commands with the same name.
    - */
    -typedef enum _PurpleCmdRet {
    - PURPLE_CMD_RET_OK, /**< Everything's okay; Don't look for another command to call. */
    - PURPLE_CMD_RET_FAILED, /**< The command failed, but stop looking.*/
    - PURPLE_CMD_RET_CONTINUE /**< Continue, looking for other commands with the same name to call. */
    -} PurpleCmdRet;
    -
    -#define PURPLE_CMD_FUNC(func) ((PurpleCmdFunc)func)
    -
    -/** A function implementing a command, as passed to purple_cmd_register().
    - *
    - * @todo document the arguments to these functions.
    - * */
    -typedef PurpleCmdRet (*PurpleCmdFunc)(PurpleConversation *, const gchar *cmd,
    - gchar **args, gchar **error, void *data);
    -/** A unique integer representing a command registered with
    - * purple_cmd_register(), which can subsequently be passed to
    - * purple_cmd_unregister() to unregister that command.
    - */
    -typedef guint PurpleCmdId;
    -
    -typedef enum _PurpleCmdPriority {
    - PURPLE_CMD_P_VERY_LOW = -1000,
    - PURPLE_CMD_P_LOW = 0,
    - PURPLE_CMD_P_DEFAULT = 1000,
    - PURPLE_CMD_P_PRPL = 2000,
    - PURPLE_CMD_P_PLUGIN = 3000,
    - PURPLE_CMD_P_ALIAS = 4000,
    - PURPLE_CMD_P_HIGH = 5000,
    - PURPLE_CMD_P_VERY_HIGH = 6000
    -} PurpleCmdPriority;
    -
    -/** Flags used to set various properties of commands. Every command should
    - * have at least one of #PURPLE_CMD_FLAG_IM and #PURPLE_CMD_FLAG_CHAT set in
    - * order to be even slighly useful.
    - *
    - * @see purple_cmd_register
    - */
    -typedef enum _PurpleCmdFlag {
    - /** Command is usable in IMs. */
    - PURPLE_CMD_FLAG_IM = 0x01,
    - /** Command is usable in multi-user chats. */
    - PURPLE_CMD_FLAG_CHAT = 0x02,
    - /** Command is usable only for a particular prpl. */
    - PURPLE_CMD_FLAG_PRPL_ONLY = 0x04,
    - /** Incorrect arguments to this command should be accepted anyway. */
    - PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS = 0x08
    -} PurpleCmdFlag;
    -
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Commands API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Register a new command with the core.
    - *
    - * The command will only happen if commands are enabled,
    - * which is a UI pref. UIs don't have to support commands at all.
    - *
    - * @param cmd The command. This should be a UTF-8 (or ASCII) string, with no spaces
    - * or other white space.
    - * @param args A string of characters describing to libpurple how to parse this
    - * command's arguments. If what the user types doesn't match this
    - * pattern, libpurple will keep looking for another command, unless
    - * the flag #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed in @a f.
    - * This string should contain no whitespace, and use a single
    - * character for each argument. The recognized characters are:
    - * <ul>
    - * <li><tt>'w'</tt>: Matches a single word.</li>
    - * <li><tt>'W'</tt>: Matches a single word, with formatting.</li>
    - * <li><tt>'s'</tt>: Matches the rest of the arguments after this
    - * point, as a single string.</li>
    - * <li><tt>'S'</tt>: Same as <tt>'s'</tt> but with formatting.</li>
    - * </ul>
    - * If args is the empty string, then the command accepts no arguments.
    - * The args passed to the callback @a func will be a @c NULL
    - * terminated array of @c NULL terminated strings, and will always
    - * match the number of arguments asked for, unless
    - * #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed.
    - * @param p This is the priority. Higher priority commands will be run first,
    - * and usually the first command will stop any others from being
    - * called.
    - * @param f Flags specifying various options about this command, combined with
    - * <tt>|</tt> (bitwise OR). You need to at least pass one of
    - * #PURPLE_CMD_FLAG_IM or #PURPLE_CMD_FLAG_CHAT (you may pass both) in
    - * order for the command to ever actually be called.
    - * @param prpl_id If the #PURPLE_CMD_FLAG_PRPL_ONLY flag is set, this is the id
    - * of the prpl to which the command applies (such as
    - * <tt>"prpl-msn"</tt>). If the flag is not set, this parameter
    - * is ignored; pass @c NULL (or a humourous string of your
    - * choice!).
    - * @param func This is the function to call when someone enters this command.
    - * @param helpstr a whitespace sensitive, UTF-8, HTML string describing how to
    - * use the command. The preferred format of this string is the
    - * command's name, followed by a space and any arguments it
    - * accepts (if it takes any arguments, otherwise no space),
    - * followed by a colon, two spaces, and a description of the
    - * command in sentence form. Do not include a slash before the
    - * command name.
    - * @param data User defined data to pass to the #PurpleCmdFunc @a f.
    - * @return A #PurpleCmdId, which is only used for calling
    - * #purple_cmd_unregister, or @a 0 on failure.
    - */
    -PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args, PurpleCmdPriority p, PurpleCmdFlag f,
    - const gchar *prpl_id, PurpleCmdFunc func, const gchar *helpstr, void *data);
    -
    -/**
    - * Unregister a command with the core.
    - *
    - * All registered commands must be unregistered, if they're registered by a plugin
    - * or something else that might go away. Normally this is called when the plugin
    - * unloads itself.
    - *
    - * @param id The #PurpleCmdId to unregister, as returned by #purple_cmd_register.
    - */
    -void purple_cmd_unregister(PurpleCmdId id);
    -
    -/**
    - * Do a command.
    - *
    - * Normally the UI calls this to perform a command. This might also be useful
    - * if aliases are ever implemented.
    - *
    - * @param conv The conversation the command was typed in.
    - * @param cmdline The command the user typed (including all arguments) as a single string.
    - * The caller doesn't have to do any parsing, except removing the command
    - * prefix, which the core has no knowledge of. cmd should not contain any
    - * formatting, and should be in plain text (no html entities).
    - * @param markup This is the same as cmd, but is the formatted version. It should be in
    - * HTML, with < > and &, at least, escaped to html entities, and should
    - * include both the default formatting and any extra manual formatting.
    - * @param errormsg If the command failed errormsg is filled in with the appropriate error
    - * message. It must be freed by the caller with g_free().
    - * @return A #PurpleCmdStatus indicating if the command succeeded or failed.
    - */
    -PurpleCmdStatus purple_cmd_do_command(PurpleConversation *conv, const gchar *cmdline,
    - const gchar *markup, gchar **errormsg);
    -
    -/**
    - * List registered commands.
    - *
    - * Returns a <tt>GList</tt> (which must be freed by the caller) of all commands
    - * that are valid in the context of @a conv, or all commands, if @a conv is @c
    - * NULL. Don't keep this list around past the main loop, or anything else that
    - * might unregister a command, as the <tt>const char *</tt>'s used get freed
    - * then.
    - *
    - * @param conv The conversation, or @c NULL.
    - * @return A @c GList of <tt>const char *</tt>, which must be freed with
    - * <tt>g_list_free()</tt>.
    - */
    -GList *purple_cmd_list(PurpleConversation *conv);
    -
    -/**
    - * Get the help string for a command.
    - *
    - * Returns the help strings for a given command in the form of a GList,
    - * one node for each matching command.
    - *
    - * @param conv The conversation, or @c NULL for no context.
    - * @param cmd The command. No wildcards accepted, but returns help for all
    - * commands if @c NULL.
    - * @return A <tt>GList</tt> of <tt>const char *</tt>s, which is the help string
    - * for that command.
    - */
    -GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd);
    -
    -/**
    - * Get the handle for the commands API
    - * @return The handle
    - * @since 2.5.0
    - */
    -gpointer purple_cmds_get_handle(void);
    -
    -/**
    - * Initialize the commands subsystem.
    - * @since 2.5.0
    - */
    -void purple_cmds_init(void);
    -
    -/**
    - * Uninitialize the commands subsystem.
    - * @since 2.5.0
    - */
    -void purple_cmds_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_CMDS_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/command.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,84 +0,0 @@
    -/**
    - * @file command.h MSN command functions
    - *
    - * 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
    - */
    -#ifndef MSN_COMMAND_H
    -#define MSN_COMMAND_H
    -
    -typedef struct _MsnCommand MsnCommand;
    -
    -#include "cmdproc.h"
    -#include "transaction.h"
    -
    -typedef void (*MsnPayloadCb)(MsnCmdProc *cmdproc, MsnCommand *cmd,
    - char *payload, size_t len);
    -
    -/**
    - * A received command.
    - */
    -struct _MsnCommand
    -{
    - unsigned int trId;
    -
    - char *command;
    - char **params;
    - guint param_count;
    -
    - guint ref_count;
    -
    - MsnTransaction *trans;
    -
    - char *payload;
    - size_t payload_len;
    -
    - MsnPayloadCb payload_cb;
    - void *payload_cbdata;
    -};
    -
    -/**
    - * Create a command object from the incoming string and ref it.
    - *
    - * @param string The incoming string.
    - *
    - * @return A MsnCommand object.
    - */
    -MsnCommand *msn_command_from_string(const char *string);
    -
    -/**
    - * Increment the ref count.
    - *
    - * @param cmd The MsnCommand to be ref.
    - *
    - * @return The ref command.
    - */
    -MsnCommand *msn_command_ref(MsnCommand *cmd);
    -
    -/**
    - * Decrement the ref count. If the count goes to 0, destroy it.
    - *
    - * @param cmd The MsnCommand to be unref.
    - *
    - */
    -void msn_command_unref(MsnCommand *cmd);
    -
    -#endif /* MSN_COMMAND_H */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/config.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,86 +0,0 @@
    -/* Local libgadu configuration file. */
    -
    -#undef printf
    -
    -#define GG_LIBGADU_VERSION "1.12.0-rc2"
    -
    -/* Defined if libgadu was compiled for bigendian machine. */
    -#undef GG_CONFIG_BIGENDIAN
    -#ifdef WORDS_BIGENDIAN
    -# define GG_CONFIG_BIGENDIAN
    -#endif
    -
    -/* Defined if this machine has gethostbyname_r(). */
    -#undef GG_CONFIG_HAVE_GETHOSTBYNAME_R
    -
    -/* Define to 1 if you have the `_exit' function. */
    -#define HAVE__EXIT 1
    -
    -/* Defined if libgadu was compiled and linked with fork support. */
    -#undef GG_CONFIG_HAVE_FORK
    -#ifndef _WIN32
    -# define GG_CONFIG_HAVE_FORK
    -#endif
    -
    -/* Defined if libgadu was compiled and linked with pthread support. */
    -/* We don't use pthreads - they may not be safe. */
    -#undef GG_CONFIG_HAVE_PTHREAD
    -
    -/* Defined if this machine has C99-compiliant vsnprintf(). */
    -#undef HAVE_C99_VSNPRINTF
    -#ifndef _WIN32
    -# define HAVE_C99_VSNPRINTF
    -#endif
    -
    -/* Defined if this machine has va_copy(). */
    -#define GG_CONFIG_HAVE_VA_COPY
    -
    -/* Defined if this machine has __va_copy(). */
    -#define GG_CONFIG_HAVE___VA_COPY
    -
    -/* Defined if this machine supports long long. */
    -#undef GG_CONFIG_HAVE_LONG_LONG
    -#ifdef HAVE_LONG_LONG
    -# define GG_CONFIG_HAVE_LONG_LONG
    -#endif
    -
    -/* Defined if libgadu was compiled and linked with GnuTLS support. */
    -#undef GG_CONFIG_HAVE_GNUTLS
    -#ifdef HAVE_GNUTLS
    -# define GG_CONFIG_HAVE_GNUTLS
    -#endif
    -
    -/* Defined if libgadu was compiled and linked with OpenSSL support. */
    -/* OpenSSL cannot be used with libpurple due to licence type. */
    -#undef GG_CONFIG_HAVE_OPENSSL
    -
    -/* Defined if libgadu was compiled and linked with zlib support. */
    -#define GG_CONFIG_HAVE_ZLIB
    -
    -/* Defined if uintX_t types are defined in <stdint.h>. */
    -#undef GG_CONFIG_HAVE_STDINT_H
    -#ifdef HAVE_STDINT_H
    -# define GG_CONFIG_HAVE_STDINT_H
    -#endif
    -
    -/* Defined if uintX_t types are defined in <inttypes.h>. */
    -#undef GG_CONFIG_HAVE_INTTYPES_H
    -#ifdef HAVE_INTTYPES_H
    -# define GG_CONFIG_HAVE_INTTYPES_H
    -#endif
    -
    -/* Defined if uintX_t types are defined in <sys/types.h>. */
    -#undef GG_CONFIG_HAVE_SYS_TYPES_H
    -#ifdef HAVE_SYS_TYPES_H
    -# define GG_CONFIG_HAVE_SYS_TYPES_H
    -#endif
    -
    -/* Defined if this machine has uint64_t. */
    -#define GG_CONFIG_HAVE_UINT64_T
    -
    -/* Defined if libgadu is GPL compliant (was not linked with OpenSSL or any
    - * other non-GPL compliant library support). */
    -#define GG_CONFIG_IS_GPL_COMPLIANT
    -
    -/* Defined if libgadu uses system defalt trusted CAs. */
    -#define GG_CONFIG_SSL_SYSTEM_TRUST
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/connection.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,626 +0,0 @@
    -/**
    - * @file connection.h Connection API
    - * @ingroup core
    - * @see @ref connection-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_CONNECTION_H_
    -#define _PURPLE_CONNECTION_H_
    -
    -/** @copydoc _PurpleConnection */
    -typedef struct _PurpleConnection PurpleConnection;
    -
    -/**
    - * Flags to change behavior of the client for a given connection.
    - */
    -typedef enum
    -{
    - PURPLE_CONNECTION_HTML = 0x0001, /**< Connection sends/receives in 'HTML'. */
    - PURPLE_CONNECTION_NO_BGCOLOR = 0x0002, /**< Connection does not send/receive
    - background colors. */
    - PURPLE_CONNECTION_AUTO_RESP = 0x0004, /**< Send auto responses when away. */
    - PURPLE_CONNECTION_FORMATTING_WBFO = 0x0008, /**< The text buffer must be formatted as a whole */
    - PURPLE_CONNECTION_NO_NEWLINES = 0x0010, /**< No new lines are allowed in outgoing messages */
    - PURPLE_CONNECTION_NO_FONTSIZE = 0x0020, /**< Connection does not send/receive font sizes */
    - PURPLE_CONNECTION_NO_URLDESC = 0x0040, /**< Connection does not support descriptions with links */
    - PURPLE_CONNECTION_NO_IMAGES = 0x0080, /**< Connection does not support sending of images */
    - PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY = 0x0100, /**< Connection supports sending and receiving custom smileys */
    - PURPLE_CONNECTION_SUPPORT_MOODS = 0x0200, /**< Connection supports setting moods */
    - PURPLE_CONNECTION_SUPPORT_MOOD_MESSAGES = 0x0400 /**< Connection supports setting a message on moods */
    -} PurpleConnectionFlags;
    -
    -typedef enum
    -{
    - PURPLE_DISCONNECTED = 0, /**< Disconnected. */
    - PURPLE_CONNECTED, /**< Connected. */
    - PURPLE_CONNECTING /**< Connecting. */
    -
    -} PurpleConnectionState;
    -
    -/**
    - * Possible errors that can cause a connection to be closed.
    - *
    - * @since 2.3.0
    - */
    -typedef enum
    -{
    - /** There was an error sending or receiving on the network socket, or
    - * there was some protocol error (such as the server sending malformed
    - * data).
    - */
    - PURPLE_CONNECTION_ERROR_NETWORK_ERROR = 0,
    - /** The username supplied was not valid. */
    - PURPLE_CONNECTION_ERROR_INVALID_USERNAME = 1,
    - /** The username, password or some other credential was incorrect. Use
    - * #PURPLE_CONNECTION_ERROR_INVALID_USERNAME instead if the username
    - * is known to be invalid.
    - */
    - PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED = 2,
    - /** libpurple doesn't speak any of the authentication methods the
    - * server offered.
    - */
    - PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3,
    - /** libpurple was built without SSL support, and the connection needs
    - * SSL.
    - */
    - PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT = 4,
    - /** There was an error negotiating SSL on this connection, or the
    - * server does not support encryption but an account option was set to
    - * require it.
    - */
    - PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR = 5,
    - /** Someone is already connected to the server using the name you are
    - * trying to connect with.
    - */
    - PURPLE_CONNECTION_ERROR_NAME_IN_USE = 6,
    -
    - /** The username/server/other preference for the account isn't valid.
    - * For instance, on IRC the username cannot contain white space.
    - * This reason should not be used for incorrect passwords etc: use
    - * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED for that.
    - *
    - * @todo This reason really shouldn't be necessary. Usernames and
    - * other account preferences should be validated when the
    - * account is created.
    - */
    - PURPLE_CONNECTION_ERROR_INVALID_SETTINGS = 7,
    -
    - /** The server did not provide a SSL certificate. */
    - PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED = 8,
    - /** The server's SSL certificate could not be trusted. */
    - PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED = 9,
    - /** The server's SSL certificate has expired. */
    - PURPLE_CONNECTION_ERROR_CERT_EXPIRED = 10,
    - /** The server's SSL certificate is not yet valid. */
    - PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11,
    - /** The server's SSL certificate did not match its hostname. */
    - PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12,
    - /** The server's SSL certificate does not have the expected
    - * fingerprint.
    - */
    - PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13,
    - /** The server's SSL certificate is self-signed. */
    - PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED = 14,
    - /** There was some other error validating the server's SSL certificate.
    - */
    - PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR = 15,
    -
    - /** Some other error occurred which fits into none of the other
    - * categories.
    - */
    - /* purple_connection_error_reason() in connection.c uses the fact that
    - * this is the last member of the enum when sanity-checking; if other
    - * reasons are added after it, the check must be updated.
    - */
    - PURPLE_CONNECTION_ERROR_OTHER_ERROR = 16
    -} PurpleConnectionError;
    -
    -/** Holds the type of an error along with its description. */
    -typedef struct
    -{
    - /** The type of error. */
    - PurpleConnectionError type;
    - /** A localised, human-readable description of the error. */
    - char *description;
    -} PurpleConnectionErrorInfo;
    -
    -#include <time.h>
    -
    -#include "account.h"
    -#include "plugin.h"
    -#include "status.h"
    -#include "sslconn.h"
    -
    -/**
    - * Connection UI operations. Used to notify the user of changes to
    - * connections, such as being disconnected, and to respond to the
    - * underlying network connection appearing and disappearing. UIs should
    - * call #purple_connections_set_ui_ops() with an instance of this struct.
    - *
    - * @see @ref ui-ops
    - */
    -typedef struct
    -{
    - /**
    - * When an account is connecting, this operation is called to notify
    - * the UI of what is happening, as well as which @a step out of @a
    - * step_count has been reached (which might be displayed as a progress
    - * bar).
    - * @see #purple_connection_update_progress
    - */
    - void (*connect_progress)(PurpleConnection *gc,
    - const char *text,
    - size_t step,
    - size_t step_count);
    -
    - /**
    - * Called when a connection is established (just before the
    - * @ref signed-on signal).
    - */
    - void (*connected)(PurpleConnection *gc);
    -
    - /**
    - * Called when a connection is ended (between the @ref signing-off
    - * and @ref signed-off signals).
    - */
    - void (*disconnected)(PurpleConnection *gc);
    -
    - /**
    - * Used to display connection-specific notices. (Pidgin's Gtk user
    - * interface implements this as a no-op; #purple_connection_notice(),
    - * which uses this operation, is not used by any of the protocols
    - * shipped with libpurple.)
    - */
    - void (*notice)(PurpleConnection *gc, const char *text);
    -
    - /**
    - * Called when an error causes a connection to be disconnected.
    - * Called before #disconnected.
    - * @param text a localized error message.
    - * @see #purple_connection_error
    - * @deprecated in favour of
    - * #PurpleConnectionUiOps.report_disconnect_reason.
    - */
    - void (*report_disconnect)(PurpleConnection *gc, const char *text);
    -
    - /**
    - * Called when libpurple discovers that the computer's network
    - * connection is active. On Linux, this uses Network Manager if
    - * available; on Windows, it uses Win32's network change notification
    - * infrastructure.
    - */
    - void (*network_connected)(void);
    -
    - /**
    - * Called when libpurple discovers that the computer's network
    - * connection has gone away.
    - */
    - void (*network_disconnected)(void);
    -
    - /**
    - * Called when an error causes a connection to be disconnected.
    - * Called before #disconnected. This op is intended to replace
    - * #report_disconnect. If both are implemented, this will be called
    - * first; however, there's no real reason to implement both.
    - *
    - * @param reason why the connection ended, if known, or
    - * #PURPLE_CONNECTION_ERROR_OTHER_ERROR, if not.
    - * @param text a localized message describing the disconnection
    - * in more detail to the user.
    - * @see #purple_connection_error_reason
    - *
    - * @since 2.3.0
    - */
    - void (*report_disconnect_reason)(PurpleConnection *gc,
    - PurpleConnectionError reason,
    - const char *text);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    -} PurpleConnectionUiOps;
    -
    -
    -/* Represents an active connection on an account. */
    -struct _PurpleConnection
    -{
    - PurplePlugin *prpl; /**< The protocol plugin. */
    - PurpleConnectionFlags flags; /**< Connection flags. */
    -
    - PurpleConnectionState state; /**< The connection state. */
    -
    - PurpleAccount *account; /**< The account being connected to. */
    - char *password; /**< The password used. */
    - int inpa; /**< The input watcher. */
    -
    - GSList *buddy_chats; /**< A list of active chats
    - (#PurpleConversation structs of type
    - #PURPLE_CONV_TYPE_CHAT). */
    - void *proto_data; /**< Protocol-specific data. */
    -
    - char *display_name; /**< How you appear to other people. */
    - guint keepalive; /**< Keep-alive. */
    -
    - /** Wants to Die state. This is set when the user chooses to log out, or
    - * when the protocol is disconnected and should not be automatically
    - * reconnected (incorrect password, etc.). prpls should rely on
    - * purple_connection_error_reason() to set this for them rather than
    - * setting it themselves.
    - * @see purple_connection_error_is_fatal
    - */
    - gboolean wants_to_die;
    -
    - guint disconnect_timeout; /**< Timer used for nasty stack tricks */
    - time_t last_received; /**< When we last received a packet. Set by the
    - prpl to avoid sending unneeded keepalives */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Connection API */
    -/**************************************************************************/
    -/*@{*/
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    -/**
    - * This function should only be called by purple_account_connect()
    - * in account.c. If you're trying to sign on an account, use that
    - * function instead.
    - *
    - * Creates a connection to the specified account and either connects
    - * or attempts to register a new account. If you are logging in,
    - * the connection uses the current active status for this account.
    - * So if you want to sign on as "away," for example, you need to
    - * have called purple_account_set_status(account, "away").
    - * (And this will call purple_account_connect() automatically).
    - *
    - * @param account The account the connection should be connecting to.
    - * @param regist Whether we are registering a new account or just
    - * trying to do a normal signon.
    - * @param password The password to use.
    - *
    - * @deprecated As this is internal, we should make it private in 3.0.0.
    - */
    -void purple_connection_new(PurpleAccount *account, gboolean regist,
    - const char *password);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    -/**
    - * This function should only be called by purple_account_unregister()
    - * in account.c.
    - *
    - * Tries to unregister the account on the server. If the account is not
    - * connected, also creates a new connection.
    - *
    - * @param account The account to unregister
    - * @param password The password to use.
    - * @param cb Optional callback to be called when unregistration is complete
    - * @param user_data user data to pass to the callback
    - *
    - * @deprecated As this is internal, we should make it private in 3.0.0.
    - */
    -void purple_connection_new_unregister(PurpleAccount *account, const char *password, PurpleAccountUnregistrationCb cb, void *user_data);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    -/**
    - * Disconnects and destroys a PurpleConnection.
    - *
    - * This function should only be called by purple_account_disconnect()
    - * in account.c. If you're trying to sign off an account, use that
    - * function instead.
    - *
    - * @param gc The purple connection to destroy.
    - *
    - * @deprecated As this is internal, we should make it private in 3.0.0.
    - */
    -void purple_connection_destroy(PurpleConnection *gc);
    -#endif
    -
    -/**
    - * Sets the connection state. PRPLs should call this and pass in
    - * the state #PURPLE_CONNECTED when the account is completely
    - * signed on. What does it mean to be completely signed on? If
    - * the core can call prpl->set_status, and it successfully changes
    - * your status, then the account is online.
    - *
    - * @param gc The connection.
    - * @param state The connection state.
    - */
    -void purple_connection_set_state(PurpleConnection *gc, PurpleConnectionState state);
    -
    -/**
    - * Sets the connection's account.
    - *
    - * @param gc The connection.
    - * @param account The account.
    - */
    -void purple_connection_set_account(PurpleConnection *gc, PurpleAccount *account);
    -
    -/**
    - * Sets the connection's displayed name.
    - *
    - * @param gc The connection.
    - * @param name The displayed name.
    - */
    -void purple_connection_set_display_name(PurpleConnection *gc, const char *name);
    -
    -/**
    - * Sets the protocol data for a connection.
    - *
    - * @param connection The PurpleConnection.
    - * @param proto_data The protocol data to set for the connection.
    - *
    - * @since 2.6.0
    - */
    -void purple_connection_set_protocol_data(PurpleConnection *connection, void *proto_data);
    -
    -/**
    - * Returns the connection state.
    - *
    - * @param gc The connection.
    - *
    - * @return The connection state.
    - */
    -PurpleConnectionState purple_connection_get_state(const PurpleConnection *gc);
    -
    -/**
    - * Returns TRUE if the account is connected, otherwise returns FALSE.
    - *
    - * @return TRUE if the account is connected, otherwise returns FALSE.
    - */
    -#define PURPLE_CONNECTION_IS_CONNECTED(gc) \
    - (purple_connection_get_state(gc) == PURPLE_CONNECTED)
    -
    -/**
    - * Returns the connection's account.
    - *
    - * @param gc The connection.
    - *
    - * @return The connection's account.
    - */
    -PurpleAccount *purple_connection_get_account(const PurpleConnection *gc);
    -
    -/**
    - * Returns the protocol plugin managing a connection.
    - *
    - * @param gc The connection.
    - *
    - * @return The protocol plugin.
    - *
    - * @since 2.4.0
    - */
    -PurplePlugin * purple_connection_get_prpl(const PurpleConnection *gc);
    -
    -/**
    - * Returns the connection's password.
    - *
    - * @param gc The connection.
    - *
    - * @return The connection's password.
    - */
    -const char *purple_connection_get_password(const PurpleConnection *gc);
    -
    -/**
    - * Returns the connection's displayed name.
    - *
    - * @param gc The connection.
    - *
    - * @return The connection's displayed name.
    - */
    -const char *purple_connection_get_display_name(const PurpleConnection *gc);
    -
    -/**
    - * Gets the protocol data from a connection.
    - *
    - * @param connection The PurpleConnection.
    - *
    - * @return The protocol data for the connection.
    - *
    - * @since 2.6.0
    - */
    -void *purple_connection_get_protocol_data(const PurpleConnection *connection);
    -
    -/**
    - * Updates the connection progress.
    - *
    - * @param gc The connection.
    - * @param text Information on the current step.
    - * @param step The current step.
    - * @param count The total number of steps.
    - */
    -void purple_connection_update_progress(PurpleConnection *gc, const char *text,
    - size_t step, size_t count);
    -
    -/**
    - * Displays a connection-specific notice.
    - *
    - * @param gc The connection.
    - * @param text The notice text.
    - */
    -void purple_connection_notice(PurpleConnection *gc, const char *text);
    -
    -/**
    - * Closes a connection with an error.
    - *
    - * @param gc The connection.
    - * @param reason The error text, which may not be @c NULL.
    - * @deprecated in favour of #purple_connection_error_reason. Calling
    - * @c purple_connection_error(gc, text) is equivalent to calling
    - * @c purple_connection_error_reason(gc, reason, text) where @c reason is
    - * #PURPLE_CONNECTION_ERROR_OTHER_ERROR if @c gc->wants_to_die is @c TRUE, and
    - * #PURPLE_CONNECTION_ERROR_NETWORK_ERROR if not. (This is to keep
    - * auto-reconnection behaviour the same when using old prpls which don't use
    - * reasons yet.)
    - */
    -void purple_connection_error(PurpleConnection *gc, const char *reason);
    -
    -/**
    - * Closes a connection with an error and a human-readable description of the
    - * error. It also sets @c gc->wants_to_die to the value of
    - * #purple_connection_error_is_fatal(@a reason), mainly for
    - * backwards-compatibility.
    - *
    - * @param gc the connection which is closing.
    - * @param reason why the connection is closing.
    - * @param description a non-@c NULL localized description of the error.
    - *
    - * @since 2.3.0
    - */
    -void
    -purple_connection_error_reason (PurpleConnection *gc,
    - PurpleConnectionError reason,
    - const char *description);
    -
    -/**
    - * Closes a connection due to an SSL error; this is basically a shortcut to
    - * turning the #PurpleSslErrorType into a #PurpleConnectionError and a
    - * human-readable string and then calling purple_connection_error_reason().
    - *
    - * @since 2.3.0
    - */
    -void
    -purple_connection_ssl_error (PurpleConnection *gc,
    - PurpleSslErrorType ssl_error);
    -
    -/**
    - * Reports whether a disconnection reason is fatal (in which case the account
    - * should probably not be automatically reconnected) or transient (so
    - * auto-reconnection is a good idea).
    - * For instance, #PURPLE_CONNECTION_ERROR_NETWORK_ERROR is a temporary error,
    - * which might be caused by losing the network connection, so <tt>
    - * purple_connection_error_is_fatal (PURPLE_CONNECTION_ERROR_NETWORK_ERROR)</tt>
    - * is @c FALSE. On the other hand,
    - * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED probably indicates a
    - * misconfiguration of the account which needs the user to go fix it up, so
    - * <tt> purple_connection_error_is_fatal
    - * (PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED)</tt> is @c TRUE.
    - *
    - * (This function is meant to replace checking PurpleConnection.wants_to_die.)
    - *
    - * @return @c TRUE if the account should not be automatically reconnected, and
    - * @c FALSE otherwise.
    - *
    - * @since 2.3.0
    - */
    -gboolean
    -purple_connection_error_is_fatal (PurpleConnectionError reason);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Connections API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Disconnects from all connections.
    - */
    -void purple_connections_disconnect_all(void);
    -
    -/**
    - * Returns a list of all active connections. This does not
    - * include connections that are in the process of connecting.
    - *
    - * @constreturn A list of all active connections.
    - */
    -GList *purple_connections_get_all(void);
    -
    -/**
    - * Returns a list of all connections in the process of connecting.
    - *
    - * @constreturn A list of connecting connections.
    - */
    -GList *purple_connections_get_connecting(void);
    -
    -/**
    - * Checks if gc is still a valid pointer to a gc.
    - *
    - * @return @c TRUE if gc is valid.
    - *
    - * @deprecated Do not use this. Instead, cancel your asynchronous request
    - * when the PurpleConnection is destroyed.
    - */
    -/*
    - * TODO: Eventually this bad boy will be removed, because it is
    - * a gross fix for a crashy problem.
    - */
    -#define PURPLE_CONNECTION_IS_VALID(gc) (g_list_find(purple_connections_get_all(), (gc)) != NULL)
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used for connections.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_connections_set_ui_ops(PurpleConnectionUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure used for connections.
    - *
    - * @return The UI operations structure in use.
    - */
    -PurpleConnectionUiOps *purple_connections_get_ui_ops(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Connections Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Initializes the connections subsystem.
    - */
    -void purple_connections_init(void);
    -
    -/**
    - * Uninitializes the connections subsystem.
    - */
    -void purple_connections_uninit(void);
    -
    -/**
    - * Returns the handle to the connections subsystem.
    - *
    - * @return The connections subsystem handle.
    - */
    -void *purple_connections_get_handle(void);
    -
    -/*@}*/
    -
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_CONNECTION_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/contact.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,747 +0,0 @@
    -/**
    - * @file contact.h Header file for contact.c
    - * Author
    - * MaYuan<mayuan2006@gmail.com>
    - * 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 02110-1301, USA
    - */
    -#ifndef MSN_CONTACT_H
    -#define MSN_CONTACT_H
    -
    -typedef struct _MsnCallbackState MsnCallbackState;
    -
    -typedef enum
    -{
    - MSN_ADD_BUDDY = 0x01,
    - MSN_MOVE_BUDDY = 0x02,
    - MSN_ACCEPTED_BUDDY = 0x04,
    - MSN_DENIED_BUDDY = 0x08,
    - MSN_ADD_GROUP = 0x10,
    - MSN_DEL_GROUP = 0x20,
    - MSN_RENAME_GROUP = 0x40,
    - MSN_UPDATE_INFO = 0x80,
    - MSN_ANNOTATE_USER = 0x100
    -} MsnCallbackAction;
    -
    -typedef enum
    -{
    - MSN_UPDATE_DISPLAY, /* Real display name */
    - MSN_UPDATE_ALIAS, /* Aliased display name */
    - MSN_UPDATE_COMMENT
    -} MsnContactUpdateType;
    -
    -typedef enum
    -{
    - MSN_PS_INITIAL,
    - MSN_PS_SAVE_CONTACT,
    - MSN_PS_PENDING_LIST,
    - MSN_PS_CONTACT_API,
    - MSN_PS_BLOCK_UNBLOCK,
    - MSN_PS_TIMER
    -} MsnSoapPartnerScenario;
    -
    -#include "session.h"
    -#include "soap.h"
    -
    -/* Thanks to TReKiE on the #pidgin channel for this new ID. */
    -#define MSN_APPLICATION_ID "F6D2794D-501F-443A-ADBE-8F1490FF30FD"
    -
    -#define MSN_CONTACT_SERVER "local-bay.contacts.msn.com"
    -
    -/* Get Contact List */
    -
    -#define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx"
    -#define MSN_GET_CONTACT_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/FindMembership"
    -
    -#define MSN_GET_CONTACT_UPDATE_XML \
    - "<View>Full</View>"\
    - "<deltasOnly>true</deltasOnly>"\
    - "<lastChange>%s</lastChange>"
    -
    -#define MSN_GET_CONTACT_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\
    -"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<soap:Header xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId xmlns=\"http://www.msn.com/webservices/AddressBook\">" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration xmlns=\"http://www.msn.com/webservices/AddressBook\">false</IsMigration>"\
    - "<PartnerScenario xmlns=\"http://www.msn.com/webservices/AddressBook\">%s</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest xmlns=\"http://www.msn.com/webservices/AddressBook\">false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<FindMembership xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<serviceFilter xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<Types xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Messenger</ServiceType>"\
    - "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Invitation</ServiceType>"\
    - "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">SocialNetwork</ServiceType>"\
    - "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Space</ServiceType>"\
    - "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Profile</ServiceType>"\
    - "</Types>"\
    - "</serviceFilter>"\
    - "%s"\
    - "</FindMembership>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/************************************************
    - * Address Book SOAP
    - * *********************************************/
    -
    -#define MSN_ADDRESS_BOOK_POST_URL "/abservice/abservice.asmx"
    -
    -/* Create AddressBook template */
    -#define MSN_ADD_ADDRESSBOOK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABAdd"
    -
    -#define MSN_ADD_ADDRESSBOOK_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Initial</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abInfo>"\
    - "<name/>"\
    - "<ownerPuid>0</ownerPuid>"\
    - "<ownerEmail>%s</ownerEmail>"\
    - "<fDefault>true</fDefault>"\
    - "</abInfo>"\
    - "</ABAdd>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* Get AddressBook */
    -#define MSN_GET_ADDRESS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindContactsPaged"
    -#define MSN_GET_ADDRESS_FULL_TIME "0001-01-01T00:00:00.0000000-08:00"
    -#define MSN_GET_ADDRESS_UPDATE_XML \
    - "<filterOptions>"\
    - "<deltasOnly>true</deltasOnly>"\
    - "<lastChange>%s</lastChange>"\
    - "</filterOptions>"
    -
    -#define MSN_GET_GLEAM_UPDATE_XML \
    - "%s"\
    - "<dynamicItemView>Gleam</dynamicItemView>"\
    - "<dynamicItemLastChange>%s</dynamicItemLastChange>"
    -
    -#define MSN_GET_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>%s</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABFindContactsPaged xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abView>Full</abView>"\
    - "<extendedContent>AB AllGroups CircleResult</extendedContent>"\
    - "%s"\
    - "</ABFindContactsPaged>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -
    -/*Gleams SOAP request template*/
    -#define MSN_GET_GLEAMS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll"
    -#define MSN_GLEAMS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Initial</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABFindAll xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<abView>Full</abView>"\
    - "<dynamicItemView>Gleam</dynamicItemView>"\
    - "<dynamicItemLastChange>0001-01-01T00:00:00.0000000-08:00</dynamicItemLastChange>"\
    - "</ABFindAll>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -
    -/*******************************************************
    - * Contact Management SOAP actions
    - *******************************************************/
    -
    -/* Add a new contact */
    -#define MSN_CONTACT_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactAdd"
    -#define MSN_CONTACT_LIVE_PENDING_XML \
    - "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<contactInfo>"\
    - "<contactType>LivePending</contactType>"\
    - "<passportName>%s</passportName>"\
    - "<isMessengerUser>true</isMessengerUser>"\
    - "</contactInfo>"\
    - "</Contact>"
    -
    -#define MSN_CONTACT_XML \
    - "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<contactInfo>"\
    - "<passportName>%s</passportName>"\
    - "<isSmtp>false</isSmtp>"\
    - "<isMessengerUser>true</isMessengerUser>"\
    - "</contactInfo>"\
    - "</Contact>"
    -
    -#define MSN_CONTACT_DISPLAYNAME_XML \
    - "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<contactInfo>"\
    - "<displayName>%s</displayName>"\
    - "<passportName>%s</passportName>"\
    - "<isMessengerUser>true</isMessengerUser>"\
    - "</contactInfo>"\
    - "</Contact>"
    -
    -#define MSN_CONTACT_ID_XML \
    - "<Contact>"\
    - "<contactId>%s</contactId>"\
    - "</Contact>"
    -
    -#define MSN_CONTACT_EMAIL_XML \
    - "<Contact>"\
    - "<contactInfo>"\
    - "<emails>"\
    - "<ContactEmail>"\
    - "<contactEmailType>%s</contactEmailType>"\
    - "<email>%s</email>"\
    - "<isMessengerEnabled>true</isMessengerEnabled>"\
    - "<Capability>%d</Capability>"\
    - "<MessengerEnabledExternally>false</MessengerEnabledExternally>"\
    - "<propertiesChanged/>"\
    - "</ContactEmail>"\
    - "</emails>"\
    - "</contactInfo>"\
    - "</Contact>"
    -
    -#define MSN_CONTACT_INVITE_MESSAGE_XML \
    - "<MessengerMemberInfo>"\
    - "<PendingAnnotations>"\
    - "<Annotation>"\
    - "<Name>MSN.IM.InviteMessage</Name>"\
    - "<Value>%s</Value>"\
    - "</Annotation>"\
    - "</PendingAnnotations>"\
    - "<DisplayName>%s</DisplayName>"\
    - "</MessengerMemberInfo>"
    -
    -#define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>ContactSave</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<contacts>%s</contacts>"\
    - "<options>"\
    - "<EnableAllowListManagement>true</EnableAllowListManagement>"\
    - "</options>"\
    - "</ABContactAdd>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* Add a contact to a group */
    -#define MSN_ADD_CONTACT_GROUP_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupContactAdd"
    -#define MSN_ADD_CONTACT_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>ContactSave</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABGroupContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<groupFilter>"\
    - "<groupIds>"\
    - "<guid>%s</guid>"\
    - "</groupIds>"\
    - "</groupFilter>"\
    - "<contacts>%s</contacts>"\
    - "<groupContactAddOptions>"\
    - "<fGenerateMissingQuickName>true</fGenerateMissingQuickName>"\
    - "<EnableAllowListManagement>true</EnableAllowListManagement>"\
    - "</groupContactAddOptions>"\
    - "%s"\
    - "</ABGroupContactAdd>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* Delete a contact from the Contact List */
    -#define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete"
    -#define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Timer</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<contacts>%s</contacts>"\
    - "</ABContactDelete>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* Remove a contact from a group */
    -#define MSN_CONTACT_DEL_GROUP_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupContactDelete"
    -#define MSN_CONTACT_DEL_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Timer</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABGroupContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<contacts>%s</contacts>"\
    - "<groupFilter>"\
    - "<groupIds>"\
    - "<guid>%s</guid>"\
    - "</groupIds>"\
    - "</groupFilter>"\
    - "</ABGroupContactDelete>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -
    -/* Update Contact Information */
    -#define MSN_CONTACT_UPDATE_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactUpdate"
    -#define MSN_CONTACT_UPDATE_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario></PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABContactUpdate xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<contacts>"\
    - "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - ""\
    - "</Contact>"\
    - "</contacts>"\
    - "</ABContactUpdate>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* Update Contact Annotations */
    -#define MSN_CONTACT_ANNOTATE_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactUpdate"
    -#define MSN_CONTACT_ANNOTATE_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario></PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABContactUpdate xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<contacts>"\
    - "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<propertiesChanged>Annotation</propertiesChanged>"\
    - "</Contact>"\
    - "</contacts>"\
    - "</ABContactUpdate>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/*******************************************************
    - * Add/Delete contact from lists SOAP actions
    - *******************************************************/
    -
    -/* block means delete from allow list and add contact to block list */
    -#define MSN_SHARE_POST_URL "/abservice/SharingService.asmx"
    -
    -#define MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/AddMember"
    -#define MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/DeleteMember"
    -
    -#define MSN_MEMBER_PASSPORT_XML \
    - "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"%s\">"\
    - "<Type>%s</Type>"\
    - "<State>Accepted</State>"\
    - "<%s>%s</%s>"\
    - "</Member>"
    -
    -#define MSN_MEMBER_MEMBERSHIPID_XML \
    - "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"%s\">"\
    - "<Type>%s</Type>"\
    - "<MembershipId>%u</MembershipId>"\
    - "<State>Accepted</State>"\
    - "</Member>"
    -
    -/* first delete contact from allow list */
    -
    -#define MSN_CONTACT_DELETE_FROM_LIST_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>%s</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<DeleteMember xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<serviceHandle>"\
    - "<Id>0</Id>"\
    - "<Type>Messenger</Type>"\
    - "<ForeignId></ForeignId>"\
    - "</serviceHandle>"\
    - "<memberships>"\
    - "<Membership>"\
    - "<MemberRole>%s</MemberRole>"\
    - "<Members>"\
    - "%s"\
    - "</Members>"\
    - "</Membership>"\
    - "</memberships>"\
    - "</DeleteMember>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -#define MSN_CONTACT_ADD_TO_LIST_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>%s</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<AddMember xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<serviceHandle>"\
    - "<Id>0</Id>"\
    - "<Type>Messenger</Type>"\
    - "<ForeignId></ForeignId>"\
    - "</serviceHandle>"\
    - "<memberships>"\
    - "<Membership>"\
    - "<MemberRole>%s</MemberRole>"\
    - "<Members>"\
    - "%s"\
    - "</Members>"\
    - "</Membership>"\
    - "</memberships>"\
    - "</AddMember>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -
    -
    -/*******************************************************
    - * Group management SOAP actions
    - *******************************************************/
    -
    -/* add a group */
    -#define MSN_GROUP_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupAdd"
    -#define MSN_GROUP_ADD_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>GroupSave</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABGroupAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<groupAddOptions>"\
    - "<fRenameOnMsgrConflict>false</fRenameOnMsgrConflict>"\
    - "</groupAddOptions>"\
    - "<groupInfo>"\
    - "<GroupInfo>"\
    - "<name>%s</name>"\
    - "<groupType>C8529CE2-6EAD-434d-881F-341E17DB3FF8</groupType>"\
    - "<fMessenger>false</fMessenger>"\
    - "<annotations>"\
    - "<Annotation>"\
    - "<Name>MSN.IM.Display</Name>"\
    - "<Value>1</Value>"\
    - "</Annotation>"\
    - "</annotations>"\
    - "</GroupInfo>"\
    - "</groupInfo>"\
    - "</ABGroupAdd>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* delete a group */
    -#define MSN_GROUP_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupDelete"
    -#define MSN_GROUP_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Timer</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<groupFilter>"\
    - "<groupIds>"\
    - "<guid>%s</guid>"\
    - "</groupIds>"\
    - "</groupFilter>"\
    - "</ABGroupDelete>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/* change a group's name */
    -#define MSN_GROUP_RENAME_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupUpdate"
    -#define MSN_GROUP_RENAME_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
    - "<soap:Header>"\
    - "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ApplicationId>" MSN_APPLICATION_ID "</ApplicationId>"\
    - "<IsMigration>false</IsMigration>"\
    - "<PartnerScenario>Timer</PartnerScenario>"\
    - "</ABApplicationHeader>"\
    - "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<ManagedGroupRequest>false</ManagedGroupRequest>"\
    - "<TicketToken>EMPTY</TicketToken>"\
    - "</ABAuthHeader>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<ABGroupUpdate xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
    - "<abId>00000000-0000-0000-0000-000000000000</abId>"\
    - "<groups>"\
    - "<Group>"\
    - "<groupId>%s</groupId>"\
    - "<groupInfo>"\
    - "<name>%s</name>"\
    - "</groupInfo>"\
    - "<propertiesChanged>GroupName </propertiesChanged>"\
    - "</Group>"\
    - "</groups>"\
    - "</ABGroupUpdate>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -struct _MsnCallbackState
    -{
    - gchar * who;
    - gchar * uid;
    - gchar * old_group_name;
    - gchar * new_group_name;
    - gchar * guid;
    - MsnListId list_id;
    - MsnCallbackAction action;
    - MsnSession *session;
    - xmlnode *body;
    - xmlnode *token;
    - const gchar *post_action;
    - const gchar *post_url;
    - MsnSoapCallback cb;
    - /* For msn_get_contact_list only */
    - MsnSoapPartnerScenario partner_scenario;
    -};
    -
    -/************************************************
    - * function prototype
    - ************************************************/
    -MsnCallbackState * msn_callback_state_new(MsnSession *session);
    -MsnCallbackState * msn_callback_state_dup(MsnCallbackState *state);
    -void msn_callback_state_free(MsnCallbackState *state);
    -void msn_callback_state_set_who(MsnCallbackState *state, const gchar *who);
    -void msn_callback_state_set_uid(MsnCallbackState *state, const gchar *uid);
    -void msn_callback_state_set_old_group_name(MsnCallbackState *state,
    - const gchar *old_group_name);
    -void msn_callback_state_set_new_group_name(MsnCallbackState *state,
    - const gchar *new_group_name);
    -void msn_callback_state_set_guid(MsnCallbackState *state, const gchar *guid);
    -void msn_callback_state_set_list_id(MsnCallbackState *state, MsnListId list_id);
    -void msn_callback_state_set_action(MsnCallbackState *state,
    - MsnCallbackAction action);
    -
    -void msn_get_contact_list(MsnSession *session,
    - const MsnSoapPartnerScenario partner_scenario,
    - const char *update);
    -void msn_get_address_book(MsnSession *session,
    - const MsnSoapPartnerScenario partner_scenario,
    - const char * update, const char * gupdate);
    -
    -/* contact SOAP operations */
    -void msn_update_contact(MsnSession *session, const char *passport, MsnContactUpdateType type, const char* value);
    -
    -void msn_annotate_contact(MsnSession *session, const char *passport, ...) G_GNUC_NULL_TERMINATED;
    -
    -void msn_add_contact(MsnSession *session, MsnCallbackState *state,
    - const char *passport);
    -void msn_delete_contact(MsnSession *session, MsnUser *user);
    -
    -void msn_add_contact_to_group(MsnSession *session, MsnCallbackState *state,
    - const char *passport, const char *groupId);
    -void msn_del_contact_from_group(MsnSession *session, const char *passport,
    - const char *group_name);
    -/* group operations */
    -void msn_add_group(MsnSession *session, MsnCallbackState *state,
    - const char* group_name);
    -void msn_del_group(MsnSession *session, const gchar *group_name);
    -void msn_contact_rename_group(MsnSession *session, const char *old_group_name,
    - const char *new_group_name);
    -
    -/* lists operations */
    -void msn_add_contact_to_list(MsnSession *session, MsnCallbackState *state,
    - const gchar *passport, const MsnListId list);
    -void msn_del_contact_from_list(MsnSession *session, MsnCallbackState *state,
    - const gchar *passport, const MsnListId list);
    -
    -#endif /* MSN_CONTACT_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/conversation.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1476 +0,0 @@
    -/**
    - * @file conversation.h Conversation API
    - * @ingroup core
    - * @see @ref conversation-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_CONVERSATION_H_
    -#define _PURPLE_CONVERSATION_H_
    -
    -/**************************************************************************/
    -/** Data Structures */
    -/**************************************************************************/
    -
    -
    -/** @copydoc _PurpleConversationUiOps */
    -typedef struct _PurpleConversationUiOps PurpleConversationUiOps;
    -/** @copydoc _PurpleConversation */
    -typedef struct _PurpleConversation PurpleConversation;
    -/** @copydoc _PurpleConvIm */
    -typedef struct _PurpleConvIm PurpleConvIm;
    -/** @copydoc _PurpleConvChat */
    -typedef struct _PurpleConvChat PurpleConvChat;
    -/** @copydoc _PurpleConvChatBuddy */
    -typedef struct _PurpleConvChatBuddy PurpleConvChatBuddy;
    -/** @copydoc _PurpleConvMessage */
    -typedef struct _PurpleConvMessage PurpleConvMessage;
    -
    -/**
    - * A type of conversation.
    - */
    -typedef enum
    -{
    - PURPLE_CONV_TYPE_UNKNOWN = 0, /**< Unknown conversation type. */
    - PURPLE_CONV_TYPE_IM, /**< Instant Message. */
    - PURPLE_CONV_TYPE_CHAT, /**< Chat room. */
    - PURPLE_CONV_TYPE_MISC, /**< A misc. conversation. */
    - PURPLE_CONV_TYPE_ANY /**< Any type of conversation. */
    -
    -} PurpleConversationType;
    -
    -/**
    - * Conversation update type.
    - */
    -typedef enum
    -{
    - PURPLE_CONV_UPDATE_ADD = 0, /**< The buddy associated with the conversation
    - was added. */
    - PURPLE_CONV_UPDATE_REMOVE, /**< The buddy associated with the conversation
    - was removed. */
    - PURPLE_CONV_UPDATE_ACCOUNT, /**< The purple_account was changed. */
    - PURPLE_CONV_UPDATE_TYPING, /**< The typing state was updated. */
    - PURPLE_CONV_UPDATE_UNSEEN, /**< The unseen state was updated. */
    - PURPLE_CONV_UPDATE_LOGGING, /**< Logging for this conversation was
    - enabled or disabled. */
    - PURPLE_CONV_UPDATE_TOPIC, /**< The topic for a chat was updated. */
    - /*
    - * XXX These need to go when we implement a more generic core/UI event
    - * system.
    - */
    - PURPLE_CONV_ACCOUNT_ONLINE, /**< One of the user's accounts went online. */
    - PURPLE_CONV_ACCOUNT_OFFLINE, /**< One of the user's accounts went offline. */
    - PURPLE_CONV_UPDATE_AWAY, /**< The other user went away. */
    - PURPLE_CONV_UPDATE_ICON, /**< The other user's buddy icon changed. */
    - PURPLE_CONV_UPDATE_TITLE,
    - PURPLE_CONV_UPDATE_CHATLEFT,
    -
    - PURPLE_CONV_UPDATE_FEATURES /**< The features for a chat have changed */
    -
    -} PurpleConvUpdateType;
    -
    -/**
    - * The typing state of a user.
    - */
    -typedef enum
    -{
    - PURPLE_NOT_TYPING = 0, /**< Not typing. */
    - PURPLE_TYPING, /**< Currently typing. */
    - PURPLE_TYPED /**< Stopped typing momentarily. */
    -
    -} PurpleTypingState;
    -
    -/**
    - * Flags applicable to a message. Most will have send, recv or system.
    - */
    -typedef enum
    -{
    - PURPLE_MESSAGE_SEND = 0x0001, /**< Outgoing message. */
    - PURPLE_MESSAGE_RECV = 0x0002, /**< Incoming message. */
    - PURPLE_MESSAGE_SYSTEM = 0x0004, /**< System message. */
    - PURPLE_MESSAGE_AUTO_RESP = 0x0008, /**< Auto response. */
    - PURPLE_MESSAGE_ACTIVE_ONLY = 0x0010, /**< Hint to the UI that this
    - message should not be
    - shown in conversations
    - which are only open for
    - internal UI purposes
    - (e.g. for contact-aware
    - conversations). */
    - PURPLE_MESSAGE_NICK = 0x0020, /**< Contains your nick. */
    - PURPLE_MESSAGE_NO_LOG = 0x0040, /**< Do not log. */
    - PURPLE_MESSAGE_WHISPER = 0x0080, /**< Whispered message. */
    - PURPLE_MESSAGE_ERROR = 0x0200, /**< Error message. */
    - PURPLE_MESSAGE_DELAYED = 0x0400, /**< Delayed message. */
    - PURPLE_MESSAGE_RAW = 0x0800, /**< "Raw" message - don't
    - apply formatting */
    - PURPLE_MESSAGE_IMAGES = 0x1000, /**< Message contains images */
    - PURPLE_MESSAGE_NOTIFY = 0x2000, /**< Message is a notification */
    - PURPLE_MESSAGE_NO_LINKIFY = 0x4000, /**< Message should not be auto-
    - linkified @since 2.1.0 */
    - PURPLE_MESSAGE_INVISIBLE = 0x8000 /**< Message should not be displayed */
    -} PurpleMessageFlags;
    -
    -/**
    - * Flags applicable to users in Chats.
    - */
    -typedef enum
    -{
    - PURPLE_CBFLAGS_NONE = 0x0000, /**< No flags */
    - PURPLE_CBFLAGS_VOICE = 0x0001, /**< Voiced user or "Participant" */
    - PURPLE_CBFLAGS_HALFOP = 0x0002, /**< Half-op */
    - PURPLE_CBFLAGS_OP = 0x0004, /**< Channel Op or Moderator */
    - PURPLE_CBFLAGS_FOUNDER = 0x0008, /**< Channel Founder */
    - PURPLE_CBFLAGS_TYPING = 0x0010, /**< Currently typing */
    - PURPLE_CBFLAGS_AWAY = 0x0020 /**< Currently away. @since 2.8.0 */
    -
    -} PurpleConvChatBuddyFlags;
    -
    -#include "account.h"
    -#include "buddyicon.h"
    -#include "log.h"
    -#include "server.h"
    -
    -/**
    - * Conversation operations and events.
    - *
    - * Any UI representing a conversation must assign a filled-out
    - * PurpleConversationUiOps structure to the PurpleConversation.
    - */
    -struct _PurpleConversationUiOps
    -{
    - /** Called when @a conv is created (but before the @ref
    - * conversation-created signal is emitted).
    - */
    - void (*create_conversation)(PurpleConversation *conv);
    -
    - /** Called just before @a conv is freed. */
    - void (*destroy_conversation)(PurpleConversation *conv);
    - /** Write a message to a chat. If this field is @c NULL, libpurple will
    - * fall back to using #write_conv.
    - * @see purple_conv_chat_write()
    - */
    - void (*write_chat)(PurpleConversation *conv, const char *who,
    - const char *message, PurpleMessageFlags flags,
    - time_t mtime);
    - /** Write a message to an IM conversation. If this field is @c NULL,
    - * libpurple will fall back to using #write_conv.
    - * @see purple_conv_im_write()
    - */
    - void (*write_im)(PurpleConversation *conv, const char *who,
    - const char *message, PurpleMessageFlags flags,
    - time_t mtime);
    - /** Write a message to a conversation. This is used rather than the
    - * chat- or im-specific ops for errors, system messages (such as "x is
    - * now know as y"), and as the fallback if #write_im and #write_chat
    - * are not implemented. It should be implemented, or the UI will miss
    - * conversation error messages and your users will hate you.
    - *
    - * @see purple_conversation_write()
    - */
    - void (*write_conv)(PurpleConversation *conv,
    - const char *name,
    - const char *alias,
    - const char *message,
    - PurpleMessageFlags flags,
    - time_t mtime);
    -
    - /** Add @a cbuddies to a chat.
    - * @param cbuddies A @c GList of #PurpleConvChatBuddy structs.
    - * @param new_arrivals Whether join notices should be shown.
    - * (Join notices are actually written to the
    - * conversation by #purple_conv_chat_add_users().)
    - */
    - void (*chat_add_users)(PurpleConversation *conv,
    - GList *cbuddies,
    - gboolean new_arrivals);
    - /** Rename the user in this chat named @a old_name to @a new_name. (The
    - * rename message is written to the conversation by libpurple.)
    - * @param new_alias @a new_name's new alias, if they have one.
    - * @see purple_conv_chat_add_users()
    - */
    - void (*chat_rename_user)(PurpleConversation *conv, const char *old_name,
    - const char *new_name, const char *new_alias);
    - /** Remove @a users from a chat.
    - * @param users A @c GList of <tt>const char *</tt>s.
    - * @see purple_conv_chat_rename_user()
    - */
    - void (*chat_remove_users)(PurpleConversation *conv, GList *users);
    - /** Called when a user's flags are changed.
    - * @see purple_conv_chat_user_set_flags()
    - */
    - void (*chat_update_user)(PurpleConversation *conv, const char *user);
    -
    - /** Present this conversation to the user; for example, by displaying
    - * the IM dialog.
    - */
    - void (*present)(PurpleConversation *conv);
    -
    - /** If this UI has a concept of focus (as in a windowing system) and
    - * this conversation has the focus, return @c TRUE; otherwise, return
    - * @c FALSE.
    - */
    - gboolean (*has_focus)(PurpleConversation *conv);
    -
    - /* Custom Smileys */
    - gboolean (*custom_smiley_add)(PurpleConversation *conv, const char *smile, gboolean remote);
    - void (*custom_smiley_write)(PurpleConversation *conv, const char *smile,
    - const guchar *data, gsize size);
    - void (*custom_smiley_close)(PurpleConversation *conv, const char *smile);
    -
    - /** Prompt the user for confirmation to send @a message. This function
    - * should arrange for the message to be sent if the user accepts. If
    - * this field is @c NULL, libpurple will fall back to using
    - * #purple_request_action().
    - */
    - void (*send_confirm)(PurpleConversation *conv, const char *message);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/**
    - * Data specific to Instant Messages.
    - */
    -struct _PurpleConvIm
    -{
    - PurpleConversation *conv; /**< The parent conversation. */
    -
    - PurpleTypingState typing_state; /**< The current typing state. */
    - guint typing_timeout; /**< The typing timer handle. */
    - time_t type_again; /**< The type again time. */
    - guint send_typed_timeout; /**< The type again timer handle. */
    -
    - PurpleBuddyIcon *icon; /**< The buddy icon. */
    -};
    -
    -/**
    - * Data specific to Chats.
    - */
    -struct _PurpleConvChat
    -{
    - PurpleConversation *conv; /**< The parent conversation. */
    -
    - GList *in_room; /**< The users in the room.
    - * @deprecated Will be removed in 3.0.0
    - */
    - GList *ignored; /**< Ignored users. */
    - char *who; /**< The person who set the topic. */
    - char *topic; /**< The topic. */
    - int id; /**< The chat ID. */
    - char *nick; /**< Your nick in this chat. */
    -
    - gboolean left; /**< We left the chat and kept the window open */
    - GHashTable *users; /**< Hash table of the users in the room.
    - * @since 2.9.0
    - */
    -};
    -
    -/**
    - * Data for "Chat Buddies"
    - */
    -struct _PurpleConvChatBuddy
    -{
    - char *name; /**< The chat participant's name in the chat. */
    - char *alias; /**< The chat participant's alias, if known;
    - * @a NULL otherwise.
    - */
    - char *alias_key; /**< A string by which this buddy will be sorted,
    - * or @c NULL if the buddy should be sorted by
    - * its @c name. (This is currently always @c
    - * NULL.)
    - */
    - gboolean buddy; /**< @a TRUE if this chat participant is on the
    - * buddy list; @a FALSE otherwise.
    - */
    - PurpleConvChatBuddyFlags flags; /**< A bitwise OR of flags for this participant,
    - * such as whether they are a channel operator.
    - */
    - GHashTable *attributes; /**< A hash table of attributes about the user, such as
    - * real name, user@host, etc.
    - */
    - gpointer ui_data; /** < The UI can put whatever it wants here. */
    -};
    -
    -/**
    - * Description of a conversation message
    - *
    - * @since 2.2.0
    - */
    -struct _PurpleConvMessage
    -{
    - char *who;
    - char *what;
    - PurpleMessageFlags flags;
    - time_t when;
    - PurpleConversation *conv; /**< @since 2.3.0 */
    - char *alias; /**< @since 2.3.0 */
    -};
    -
    -/**
    - * A core representation of a conversation between two or more people.
    - *
    - * The conversation can be an IM or a chat.
    - */
    -struct _PurpleConversation
    -{
    - PurpleConversationType type; /**< The type of conversation. */
    -
    - PurpleAccount *account; /**< The user using this conversation. */
    -
    -
    - char *name; /**< The name of the conversation. */
    - char *title; /**< The window title. */
    -
    - gboolean logging; /**< The status of logging. */
    -
    - GList *logs; /**< This conversation's logs */
    -
    - union
    - {
    - PurpleConvIm *im; /**< IM-specific data. */
    - PurpleConvChat *chat; /**< Chat-specific data. */
    - void *misc; /**< Misc. data. */
    -
    - } u;
    -
    - PurpleConversationUiOps *ui_ops; /**< UI-specific operations. */
    - void *ui_data; /**< UI-specific data. */
    -
    - GHashTable *data; /**< Plugin-specific data. */
    -
    - PurpleConnectionFlags features; /**< The supported features */
    - GList *message_history; /**< Message history, as a GList of PurpleConvMessage's */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Conversation API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new conversation of the specified type.
    - *
    - * @param type The type of conversation.
    - * @param account The account opening the conversation window on the purple
    - * user's end.
    - * @param name The name of the conversation. For PURPLE_CONV_TYPE_IM,
    - * this is the name of the buddy.
    - *
    - * @return The new conversation.
    - */
    -PurpleConversation *purple_conversation_new(PurpleConversationType type,
    - PurpleAccount *account,
    - const char *name);
    -
    -/**
    - * Destroys the specified conversation and removes it from the parent
    - * window.
    - *
    - * If this conversation is the only one contained in the parent window,
    - * that window is also destroyed.
    - *
    - * @param conv The conversation to destroy.
    - */
    -void purple_conversation_destroy(PurpleConversation *conv);
    -
    -
    -/**
    - * Present a conversation to the user. This allows core code to initiate a
    - * conversation by displaying the IM dialog.
    - * @param conv The conversation to present
    - */
    -void purple_conversation_present(PurpleConversation *conv);
    -
    -
    -/**
    - * Returns the specified conversation's type.
    - *
    - * @param conv The conversation.
    - *
    - * @return The conversation's type.
    - */
    -PurpleConversationType purple_conversation_get_type(const PurpleConversation *conv);
    -
    -/**
    - * Sets the specified conversation's UI operations structure.
    - *
    - * @param conv The conversation.
    - * @param ops The UI conversation operations structure.
    - */
    -void purple_conversation_set_ui_ops(PurpleConversation *conv,
    - PurpleConversationUiOps *ops);
    -
    -/**
    - * Sets the default conversation UI operations structure.
    - *
    - * @param ops The UI conversation operations structure.
    - */
    -void purple_conversations_set_ui_ops(PurpleConversationUiOps *ops);
    -
    -/**
    - * Returns the specified conversation's UI operations structure.
    - *
    - * @param conv The conversation.
    - *
    - * @return The operations structure.
    - */
    -PurpleConversationUiOps *purple_conversation_get_ui_ops(
    - const PurpleConversation *conv);
    -
    -/**
    - * Sets the specified conversation's purple_account.
    - *
    - * This purple_account represents the user using purple, not the person the user
    - * is having a conversation/chat/flame with.
    - *
    - * @param conv The conversation.
    - * @param account The purple_account.
    - */
    -void purple_conversation_set_account(PurpleConversation *conv,
    - PurpleAccount *account);
    -
    -/**
    - * Returns the specified conversation's purple_account.
    - *
    - * This purple_account represents the user using purple, not the person the user
    - * is having a conversation/chat/flame with.
    - *
    - * @param conv The conversation.
    - *
    - * @return The conversation's purple_account.
    - */
    -PurpleAccount *purple_conversation_get_account(const PurpleConversation *conv);
    -
    -/**
    - * Returns the specified conversation's purple_connection.
    - *
    - * This is the same as purple_conversation_get_user(conv)->gc.
    - *
    - * @param conv The conversation.
    - *
    - * @return The conversation's purple_connection.
    - */
    -PurpleConnection *purple_conversation_get_gc(const PurpleConversation *conv);
    -
    -/**
    - * Sets the specified conversation's title.
    - *
    - * @param conv The conversation.
    - * @param title The title.
    - */
    -void purple_conversation_set_title(PurpleConversation *conv, const char *title);
    -
    -/**
    - * Returns the specified conversation's title.
    - *
    - * @param conv The conversation.
    - *
    - * @return The title.
    - */
    -const char *purple_conversation_get_title(const PurpleConversation *conv);
    -
    -/**
    - * Automatically sets the specified conversation's title.
    - *
    - * This function takes OPT_IM_ALIAS_TAB into account, as well as the
    - * user's alias.
    - *
    - * @param conv The conversation.
    - */
    -void purple_conversation_autoset_title(PurpleConversation *conv);
    -
    -/**
    - * Sets the specified conversation's name.
    - *
    - * @param conv The conversation.
    - * @param name The conversation's name.
    - */
    -void purple_conversation_set_name(PurpleConversation *conv, const char *name);
    -
    -/**
    - * Returns the specified conversation's name.
    - *
    - * @param conv The conversation.
    - *
    - * @return The conversation's name. If the conversation is an IM with a PurpleBuddy,
    - * then it's the name of the PurpleBuddy.
    - */
    -const char *purple_conversation_get_name(const PurpleConversation *conv);
    -
    -/**
    - * Get an attribute of a chat buddy
    - *
    - * @param cb The chat buddy.
    - * @param key The key of the attribute.
    - *
    - * @return The value of the attribute key.
    - */
    -const char *purple_conv_chat_cb_get_attribute(PurpleConvChatBuddy *cb, const char *key);
    -
    -/**
    - * Get the keys of all atributes of a chat buddy
    - *
    - * @param cb The chat buddy.
    - *
    - * @return A list of the attributes of a chat buddy.
    - */
    -GList *purple_conv_chat_cb_get_attribute_keys(PurpleConvChatBuddy *cb);
    -
    -/**
    - * Set an attribute of a chat buddy
    - *
    - * @param chat The chat.
    - * @param cb The chat buddy.
    - * @param key The key of the attribute.
    - * @param value The value of the attribute.
    - */
    -void purple_conv_chat_cb_set_attribute(PurpleConvChat *chat, PurpleConvChatBuddy *cb, const char *key, const char *value);
    -
    -/**
    - * Set attributes of a chat buddy
    - *
    - * @param chat The chat.
    - * @param cb The chat buddy.
    - * @param keys A GList of the keys.
    - * @param values A GList of the values.
    - */
    -void
    -purple_conv_chat_cb_set_attributes(PurpleConvChat *chat, PurpleConvChatBuddy *cb, GList *keys, GList *values);
    -
    -/**
    - * Enables or disables logging for this conversation.
    - *
    - * @param conv The conversation.
    - * @param log @c TRUE if logging should be enabled, or @c FALSE otherwise.
    - */
    -void purple_conversation_set_logging(PurpleConversation *conv, gboolean log);
    -
    -/**
    - * Returns whether or not logging is enabled for this conversation.
    - *
    - * @param conv The conversation.
    - *
    - * @return @c TRUE if logging is enabled, or @c FALSE otherwise.
    - */
    -gboolean purple_conversation_is_logging(const PurpleConversation *conv);
    -
    -/**
    - * Closes any open logs for this conversation.
    - *
    - * Note that new logs will be opened as necessary (e.g. upon receipt of a
    - * message, if the conversation has logging enabled. To disable logging for
    - * the remainder of the conversation, use purple_conversation_set_logging().
    - *
    - * @param conv The conversation.
    - */
    -void purple_conversation_close_logs(PurpleConversation *conv);
    -
    -/**
    - * Returns the specified conversation's IM-specific data.
    - *
    - * If the conversation type is not PURPLE_CONV_TYPE_IM, this will return @c NULL.
    - *
    - * @param conv The conversation.
    - *
    - * @return The IM-specific data.
    - */
    -PurpleConvIm *purple_conversation_get_im_data(const PurpleConversation *conv);
    -
    -#define PURPLE_CONV_IM(c) (purple_conversation_get_im_data(c))
    -
    -/**
    - * Returns the specified conversation's chat-specific data.
    - *
    - * If the conversation type is not PURPLE_CONV_TYPE_CHAT, this will return @c NULL.
    - *
    - * @param conv The conversation.
    - *
    - * @return The chat-specific data.
    - */
    -PurpleConvChat *purple_conversation_get_chat_data(const PurpleConversation *conv);
    -
    -#define PURPLE_CONV_CHAT(c) (purple_conversation_get_chat_data(c))
    -
    -/**
    - * Sets extra data for a conversation.
    - *
    - * @param conv The conversation.
    - * @param key The unique key.
    - * @param data The data to assign.
    - */
    -void purple_conversation_set_data(PurpleConversation *conv, const char *key,
    - gpointer data);
    -
    -/**
    - * Returns extra data in a conversation.
    - *
    - * @param conv The conversation.
    - * @param key The unqiue key.
    - *
    - * @return The data associated with the key.
    - */
    -gpointer purple_conversation_get_data(PurpleConversation *conv, const char *key);
    -
    -/**
    - * Returns a list of all conversations.
    - *
    - * This list includes both IMs and chats.
    - *
    - * @constreturn A GList of all conversations.
    - */
    -GList *purple_get_conversations(void);
    -
    -/**
    - * Returns a list of all IMs.
    - *
    - * @constreturn A GList of all IMs.
    - */
    -GList *purple_get_ims(void);
    -
    -/**
    - * Returns a list of all chats.
    - *
    - * @constreturn A GList of all chats.
    - */
    -GList *purple_get_chats(void);
    -
    -/**
    - * Finds a conversation with the specified type, name, and Purple account.
    - *
    - * @param type The type of the conversation.
    - * @param name The name of the conversation.
    - * @param account The purple_account associated with the conversation.
    - *
    - * @return The conversation if found, or @c NULL otherwise.
    - */
    -PurpleConversation *purple_find_conversation_with_account(
    - PurpleConversationType type, const char *name,
    - const PurpleAccount *account);
    -
    -/**
    - * Writes to a conversation window.
    - *
    - * This function should not be used to write IM or chat messages. Use
    - * purple_conv_im_write() and purple_conv_chat_write() instead. Those functions will
    - * most likely call this anyway, but they may do their own formatting,
    - * sound playback, etc.
    - *
    - * This can be used to write generic messages, such as "so and so closed
    - * the conversation window."
    - *
    - * @param conv The conversation.
    - * @param who The user who sent the message.
    - * @param message The message.
    - * @param flags The message flags.
    - * @param mtime The time the message was sent.
    - *
    - * @see purple_conv_im_write()
    - * @see purple_conv_chat_write()
    - */
    -void purple_conversation_write(PurpleConversation *conv, const char *who,
    - const char *message, PurpleMessageFlags flags,
    - time_t mtime);
    -
    -/**
    - Set the features as supported for the given conversation.
    - @param conv The conversation
    - @param features Bitset defining supported features
    -*/
    -void purple_conversation_set_features(PurpleConversation *conv,
    - PurpleConnectionFlags features);
    -
    -
    -/**
    - Get the features supported by the given conversation.
    - @param conv The conversation
    -*/
    -PurpleConnectionFlags purple_conversation_get_features(PurpleConversation *conv);
    -
    -/**
    - * Determines if a conversation has focus
    - *
    - * @param conv The conversation.
    - *
    - * @return @c TRUE if the conversation has focus, @c FALSE if
    - * it does not or the UI does not have a concept of conversation focus
    - */
    -gboolean purple_conversation_has_focus(PurpleConversation *conv);
    -
    -/**
    - * Updates the visual status and UI of a conversation.
    - *
    - * @param conv The conversation.
    - * @param type The update type.
    - */
    -void purple_conversation_update(PurpleConversation *conv, PurpleConvUpdateType type);
    -
    -/**
    - * Calls a function on each conversation.
    - *
    - * @param func The function.
    - */
    -void purple_conversation_foreach(void (*func)(PurpleConversation *conv));
    -
    -/**
    - * Retrieve the message history of a conversation.
    - *
    - * @param conv The conversation
    - *
    - * @return A GList of PurpleConvMessage's. The must not modify the list or the data within.
    - * The list contains the newest message at the beginning, and the oldest message at
    - * the end.
    - *
    - * @since 2.2.0
    - */
    -GList *purple_conversation_get_message_history(PurpleConversation *conv);
    -
    -/**
    - * Clear the message history of a conversation.
    - *
    - * @param conv The conversation
    - *
    - * @since 2.2.0
    - */
    -void purple_conversation_clear_message_history(PurpleConversation *conv);
    -
    -/**
    - * Get the sender from a PurpleConvMessage
    - *
    - * @param msg A PurpleConvMessage
    - *
    - * @return The name of the sender of the message
    - *
    - * @since 2.2.0
    - */
    -const char *purple_conversation_message_get_sender(PurpleConvMessage *msg);
    -
    -/**
    - * Get the message from a PurpleConvMessage
    - *
    - * @param msg A PurpleConvMessage
    - *
    - * @return The name of the sender of the message
    - *
    - * @since 2.2.0
    - */
    -const char *purple_conversation_message_get_message(PurpleConvMessage *msg);
    -
    -/**
    - * Get the message-flags of a PurpleConvMessage
    - *
    - * @param msg A PurpleConvMessage
    - *
    - * @return The message flags
    - *
    - * @since 2.2.0
    - */
    -PurpleMessageFlags purple_conversation_message_get_flags(PurpleConvMessage *msg);
    -
    -/**
    - * Get the timestamp of a PurpleConvMessage
    - *
    - * @param msg A PurpleConvMessage
    - *
    - * @return The timestamp of the message
    - *
    - * @since 2.2.0
    - */
    -time_t purple_conversation_message_get_timestamp(PurpleConvMessage *msg);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name IM Conversation API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets an IM's parent conversation.
    - *
    - * @param im The IM.
    - *
    - * @return The parent conversation.
    - */
    -PurpleConversation *purple_conv_im_get_conversation(const PurpleConvIm *im);
    -
    -/**
    - * Sets the IM's buddy icon.
    - *
    - * This should only be called from within Purple. You probably want to
    - * call purple_buddy_icon_set_data().
    - *
    - * @param im The IM.
    - * @param icon The buddy icon.
    - *
    - * @see purple_buddy_icon_set_data()
    - */
    -void purple_conv_im_set_icon(PurpleConvIm *im, PurpleBuddyIcon *icon);
    -
    -/**
    - * Returns the IM's buddy icon.
    - *
    - * @param im The IM.
    - *
    - * @return The buddy icon.
    - */
    -PurpleBuddyIcon *purple_conv_im_get_icon(const PurpleConvIm *im);
    -
    -/**
    - * Sets the IM's typing state.
    - *
    - * @param im The IM.
    - * @param state The typing state.
    - */
    -void purple_conv_im_set_typing_state(PurpleConvIm *im, PurpleTypingState state);
    -
    -/**
    - * Returns the IM's typing state.
    - *
    - * @param im The IM.
    - *
    - * @return The IM's typing state.
    - */
    -PurpleTypingState purple_conv_im_get_typing_state(const PurpleConvIm *im);
    -
    -/**
    - * Starts the IM's typing timeout.
    - *
    - * @param im The IM.
    - * @param timeout The timeout.
    - */
    -void purple_conv_im_start_typing_timeout(PurpleConvIm *im, int timeout);
    -
    -/**
    - * Stops the IM's typing timeout.
    - *
    - * @param im The IM.
    - */
    -void purple_conv_im_stop_typing_timeout(PurpleConvIm *im);
    -
    -/**
    - * Returns the IM's typing timeout.
    - *
    - * @param im The IM.
    - *
    - * @return The timeout.
    - */
    -guint purple_conv_im_get_typing_timeout(const PurpleConvIm *im);
    -
    -/**
    - * Sets the quiet-time when no PURPLE_TYPING messages will be sent.
    - * Few protocols need this (maybe only MSN). If the user is still
    - * typing after this quiet-period, then another PURPLE_TYPING message
    - * will be sent.
    - *
    - * @param im The IM.
    - * @param val The number of seconds to wait before allowing another
    - * PURPLE_TYPING message to be sent to the user. Or 0 to
    - * not send another PURPLE_TYPING message.
    - */
    -void purple_conv_im_set_type_again(PurpleConvIm *im, unsigned int val);
    -
    -/**
    - * Returns the time after which another PURPLE_TYPING message should be sent.
    - *
    - * @param im The IM.
    - *
    - * @return The time in seconds since the epoch. Or 0 if no additional
    - * PURPLE_TYPING message should be sent.
    - */
    -time_t purple_conv_im_get_type_again(const PurpleConvIm *im);
    -
    -/**
    - * Starts the IM's type again timeout.
    - *
    - * @param im The IM.
    - */
    -void purple_conv_im_start_send_typed_timeout(PurpleConvIm *im);
    -
    -/**
    - * Stops the IM's type again timeout.
    - *
    - * @param im The IM.
    - */
    -void purple_conv_im_stop_send_typed_timeout(PurpleConvIm *im);
    -
    -/**
    - * Returns the IM's type again timeout interval.
    - *
    - * @param im The IM.
    - *
    - * @return The type again timeout interval.
    - */
    -guint purple_conv_im_get_send_typed_timeout(const PurpleConvIm *im);
    -
    -/**
    - * Updates the visual typing notification for an IM conversation.
    - *
    - * @param im The IM.
    - */
    -void purple_conv_im_update_typing(PurpleConvIm *im);
    -
    -/**
    - * Writes to an IM.
    - *
    - * @param im The IM.
    - * @param who The user who sent the message.
    - * @param message The message to write.
    - * @param flags The message flags.
    - * @param mtime The time the message was sent.
    - */
    -void purple_conv_im_write(PurpleConvIm *im, const char *who,
    - const char *message, PurpleMessageFlags flags,
    - time_t mtime);
    -
    -/**
    - * Presents an IM-error to the user
    - *
    - * This is a helper function to find a conversation, write an error to it, and
    - * raise the window. If a conversation with this user doesn't already exist,
    - * the function will return FALSE and the calling function can attempt to present
    - * the error another way (purple_notify_error, most likely)
    - *
    - * @param who The user this error is about
    - * @param account The account this error is on
    - * @param what The error
    - * @return TRUE if the error was presented, else FALSE
    - */
    -gboolean purple_conv_present_error(const char *who, PurpleAccount *account, const char *what);
    -
    -/**
    - * Sends a message to this IM conversation.
    - *
    - * @param im The IM.
    - * @param message The message to send.
    - */
    -void purple_conv_im_send(PurpleConvIm *im, const char *message);
    -
    -/**
    - * Sends a message to a conversation after confirming with
    - * the user.
    - *
    - * This function is intended for use in cases where the user
    - * hasn't explicitly and knowingly caused a message to be sent.
    - * The confirmation ensures that the user isn't sending a
    - * message by mistake.
    - *
    - * @param conv The conversation.
    - * @param message The message to send.
    - */
    -void purple_conv_send_confirm(PurpleConversation *conv, const char *message);
    -
    -/**
    - * Sends a message to this IM conversation with specified flags.
    - *
    - * @param im The IM.
    - * @param message The message to send.
    - * @param flags The PurpleMessageFlags flags to use in addition to PURPLE_MESSAGE_SEND.
    - */
    -void purple_conv_im_send_with_flags(PurpleConvIm *im, const char *message, PurpleMessageFlags flags);
    -
    -/**
    - * Adds a smiley to the conversation's smiley tree. If this returns
    - * @c TRUE you should call purple_conv_custom_smiley_write() one or more
    - * times, and then purple_conv_custom_smiley_close(). If this returns
    - * @c FALSE, either the conv or smile were invalid, or the icon was
    - * found in the cache. In either case, calling write or close would
    - * be an error.
    - *
    - * @param conv The conversation to associate the smiley with.
    - * @param smile The text associated with the smiley
    - * @param cksum_type The type of checksum.
    - * @param chksum The checksum, as a NUL terminated base64 string.
    - * @param remote @c TRUE if the custom smiley is set by the remote user (buddy).
    - * @return @c TRUE if an icon is expected, else FALSE. Note that
    - * it is an error to never call purple_conv_custom_smiley_close if
    - * this function returns @c TRUE, but an error to call it if
    - * @c FALSE is returned.
    - */
    -
    -gboolean purple_conv_custom_smiley_add(PurpleConversation *conv, const char *smile,
    - const char *cksum_type, const char *chksum,
    - gboolean remote);
    -
    -
    -/**
    - * Updates the image associated with the current smiley.
    - *
    - * @param conv The conversation associated with the smiley.
    - * @param smile The text associated with the smiley.
    - * @param data The actual image data.
    - * @param size The length of the data.
    - */
    -
    -void purple_conv_custom_smiley_write(PurpleConversation *conv,
    - const char *smile,
    - const guchar *data,
    - gsize size);
    -
    -/**
    - * Close the custom smiley, all data has been written with
    - * purple_conv_custom_smiley_write, and it is no longer valid
    - * to call that function on that smiley.
    - *
    - * @param conv The purple conversation associated with the smiley.
    - * @param smile The text associated with the smiley
    - */
    -
    -void purple_conv_custom_smiley_close(PurpleConversation *conv, const char *smile);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Chat Conversation API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets a chat's parent conversation.
    - *
    - * @param chat The chat.
    - *
    - * @return The parent conversation.
    - */
    -PurpleConversation *purple_conv_chat_get_conversation(const PurpleConvChat *chat);
    -
    -/**
    - * Sets the list of users in the chat room.
    - *
    - * @note Calling this function will not update the display of the users.
    - * Please use purple_conv_chat_add_user(), purple_conv_chat_add_users(),
    - * purple_conv_chat_remove_user(), and purple_conv_chat_remove_users() instead.
    - *
    - * @param chat The chat.
    - * @param users The list of users.
    - *
    - * @return The list passed.
    - *
    - * @deprecated This function will be removed in 3.0.0. You shouldn't be using it anyway.
    - */
    -GList *purple_conv_chat_set_users(PurpleConvChat *chat, GList *users);
    -
    -/**
    - * Returns a list of users in the chat room. The members of the list
    - * are PurpleConvChatBuddy objects.
    - *
    - * @param chat The chat.
    - *
    - * @constreturn The list of users.
    - */
    -GList *purple_conv_chat_get_users(const PurpleConvChat *chat);
    -
    -/**
    - * Ignores a user in a chat room.
    - *
    - * @param chat The chat.
    - * @param name The name of the user.
    - */
    -void purple_conv_chat_ignore(PurpleConvChat *chat, const char *name);
    -
    -/**
    - * Unignores a user in a chat room.
    - *
    - * @param chat The chat.
    - * @param name The name of the user.
    - */
    -void purple_conv_chat_unignore(PurpleConvChat *chat, const char *name);
    -
    -/**
    - * Sets the list of ignored users in the chat room.
    - *
    - * @param chat The chat.
    - * @param ignored The list of ignored users.
    - *
    - * @return The list passed.
    - */
    -GList *purple_conv_chat_set_ignored(PurpleConvChat *chat, GList *ignored);
    -
    -/**
    - * Returns the list of ignored users in the chat room.
    - *
    - * @param chat The chat.
    - *
    - * @constreturn The list of ignored users.
    - */
    -GList *purple_conv_chat_get_ignored(const PurpleConvChat *chat);
    -
    -/**
    - * Returns the actual name of the specified ignored user, if it exists in
    - * the ignore list.
    - *
    - * If the user found contains a prefix, such as '+' or '\@', this is also
    - * returned. The username passed to the function does not have to have this
    - * formatting.
    - *
    - * @param chat The chat.
    - * @param user The user to check in the ignore list.
    - *
    - * @return The ignored user if found, complete with prefixes, or @c NULL
    - * if not found.
    - */
    -const char *purple_conv_chat_get_ignored_user(const PurpleConvChat *chat,
    - const char *user);
    -
    -/**
    - * Returns @c TRUE if the specified user is ignored.
    - *
    - * @param chat The chat.
    - * @param user The user.
    - *
    - * @return @c TRUE if the user is in the ignore list; @c FALSE otherwise.
    - */
    -gboolean purple_conv_chat_is_user_ignored(const PurpleConvChat *chat,
    - const char *user);
    -
    -/**
    - * Sets the chat room's topic.
    - *
    - * @param chat The chat.
    - * @param who The user that set the topic.
    - * @param topic The topic.
    - */
    -void purple_conv_chat_set_topic(PurpleConvChat *chat, const char *who,
    - const char *topic);
    -
    -/**
    - * Returns the chat room's topic.
    - *
    - * @param chat The chat.
    - *
    - * @return The chat's topic.
    - */
    -const char *purple_conv_chat_get_topic(const PurpleConvChat *chat);
    -
    -/**
    - * Sets the chat room's ID.
    - *
    - * @param chat The chat.
    - * @param id The ID.
    - */
    -void purple_conv_chat_set_id(PurpleConvChat *chat, int id);
    -
    -/**
    - * Returns the chat room's ID.
    - *
    - * @param chat The chat.
    - *
    - * @return The ID.
    - */
    -int purple_conv_chat_get_id(const PurpleConvChat *chat);
    -
    -/**
    - * Writes to a chat.
    - *
    - * @param chat The chat.
    - * @param who The user who sent the message.
    - * @param message The message to write.
    - * @param flags The flags.
    - * @param mtime The time the message was sent.
    - */
    -void purple_conv_chat_write(PurpleConvChat *chat, const char *who,
    - const char *message, PurpleMessageFlags flags,
    - time_t mtime);
    -
    -/**
    - * Sends a message to this chat conversation.
    - *
    - * @param chat The chat.
    - * @param message The message to send.
    - */
    -void purple_conv_chat_send(PurpleConvChat *chat, const char *message);
    -
    -/**
    - * Sends a message to this chat conversation with specified flags.
    - *
    - * @param chat The chat.
    - * @param message The message to send.
    - * @param flags The PurpleMessageFlags flags to use.
    - */
    -void purple_conv_chat_send_with_flags(PurpleConvChat *chat, const char *message, PurpleMessageFlags flags);
    -
    -/**
    - * Adds a user to a chat.
    - *
    - * @param chat The chat.
    - * @param user The user to add.
    - * @param extra_msg An extra message to display with the join message.
    - * @param flags The users flags
    - * @param new_arrival Decides whether or not to show a join notice.
    - */
    -void purple_conv_chat_add_user(PurpleConvChat *chat, const char *user,
    - const char *extra_msg, PurpleConvChatBuddyFlags flags,
    - gboolean new_arrival);
    -
    -/**
    - * Adds a list of users to a chat.
    - *
    - * The data is copied from @a users, @a extra_msgs, and @a flags, so it is up to
    - * the caller to free this list after calling this function.
    - *
    - * @param chat The chat.
    - * @param users The list of users to add.
    - * @param extra_msgs An extra message to display with the join message for each
    - * user. This list may be shorter than @a users, in which
    - * case, the users after the end of extra_msgs will not have
    - * an extra message. By extension, this means that extra_msgs
    - * can simply be @c NULL and none of the users will have an
    - * extra message.
    - * @param flags The list of flags for each user.
    - * @param new_arrivals Decides whether or not to show join notices.
    - */
    -void purple_conv_chat_add_users(PurpleConvChat *chat, GList *users, GList *extra_msgs,
    - GList *flags, gboolean new_arrivals);
    -
    -/**
    - * Renames a user in a chat.
    - *
    - * @param chat The chat.
    - * @param old_user The old username.
    - * @param new_user The new username.
    - */
    -void purple_conv_chat_rename_user(PurpleConvChat *chat, const char *old_user,
    - const char *new_user);
    -
    -/**
    - * Removes a user from a chat, optionally with a reason.
    - *
    - * It is up to the developer to free this list after calling this function.
    - *
    - * @param chat The chat.
    - * @param user The user that is being removed.
    - * @param reason The optional reason given for the removal. Can be @c NULL.
    - */
    -void purple_conv_chat_remove_user(PurpleConvChat *chat, const char *user,
    - const char *reason);
    -
    -/**
    - * Removes a list of users from a chat, optionally with a single reason.
    - *
    - * @param chat The chat.
    - * @param users The users that are being removed.
    - * @param reason The optional reason given for the removal. Can be @c NULL.
    - */
    -void purple_conv_chat_remove_users(PurpleConvChat *chat, GList *users,
    - const char *reason);
    -
    -/**
    - * Finds a user in a chat
    - *
    - * @param chat The chat.
    - * @param user The user to look for.
    - *
    - * @return TRUE if the user is in the chat, FALSE if not
    - */
    -gboolean purple_conv_chat_find_user(PurpleConvChat *chat, const char *user);
    -
    -/**
    - * Set a users flags in a chat
    - *
    - * @param chat The chat.
    - * @param user The user to update.
    - * @param flags The new flags.
    - */
    -void purple_conv_chat_user_set_flags(PurpleConvChat *chat, const char *user,
    - PurpleConvChatBuddyFlags flags);
    -
    -/**
    - * Get the flags for a user in a chat
    - *
    - * @param chat The chat.
    - * @param user The user to find the flags for
    - *
    - * @return The flags for the user
    - */
    -PurpleConvChatBuddyFlags purple_conv_chat_user_get_flags(PurpleConvChat *chat,
    - const char *user);
    -
    -/**
    - * Clears all users from a chat.
    - *
    - * @param chat The chat.
    - */
    -void purple_conv_chat_clear_users(PurpleConvChat *chat);
    -
    -/**
    - * Sets your nickname (used for hilighting) for a chat.
    - *
    - * @param chat The chat.
    - * @param nick The nick.
    - */
    -void purple_conv_chat_set_nick(PurpleConvChat *chat, const char *nick);
    -
    -/**
    - * Gets your nickname (used for hilighting) for a chat.
    - *
    - * @param chat The chat.
    - * @return The nick.
    - */
    -const char *purple_conv_chat_get_nick(PurpleConvChat *chat);
    -
    -/**
    - * Finds a chat with the specified chat ID.
    - *
    - * @param gc The purple_connection.
    - * @param id The chat ID.
    - *
    - * @return The chat conversation.
    - */
    -PurpleConversation *purple_find_chat(const PurpleConnection *gc, int id);
    -
    -/**
    - * Lets the core know we left a chat, without destroying it.
    - * Called from serv_got_chat_left().
    - *
    - * @param chat The chat.
    - */
    -void purple_conv_chat_left(PurpleConvChat *chat);
    -
    -/**
    - * Invite a user to a chat.
    - * The user will be prompted to enter the user's name or a message if one is
    - * not given.
    - *
    - * @param chat The chat.
    - * @param user The user to invite to the chat.
    - * @param message The message to send with the invitation.
    - * @param confirm Prompt before sending the invitation. The user is always
    - * prompted if either \a user or \a message is @c NULL.
    - *
    - * @since 2.6.0
    - */
    -void purple_conv_chat_invite_user(PurpleConvChat *chat, const char *user,
    - const char *message, gboolean confirm);
    -
    -/**
    - * Returns true if we're no longer in this chat,
    - * and just left the window open.
    - *
    - * @param chat The chat.
    - *
    - * @return @c TRUE if we left the chat already, @c FALSE if
    - * we're still there.
    - */
    -gboolean purple_conv_chat_has_left(PurpleConvChat *chat);
    -
    -/**
    - * Creates a new chat buddy
    - *
    - * @param name The name.
    - * @param alias The alias.
    - * @param flags The flags.
    - *
    - * @return The new chat buddy
    - */
    -PurpleConvChatBuddy *purple_conv_chat_cb_new(const char *name, const char *alias,
    - PurpleConvChatBuddyFlags flags);
    -
    -/**
    - * Find a chat buddy in a chat
    - *
    - * @param chat The chat.
    - * @param name The name of the chat buddy to find.
    - */
    -PurpleConvChatBuddy *purple_conv_chat_cb_find(PurpleConvChat *chat, const char *name);
    -
    -/**
    - * Get the name of a chat buddy
    - *
    - * @param cb The chat buddy.
    - *
    - * @return The name of the chat buddy.
    - */
    -const char *purple_conv_chat_cb_get_name(PurpleConvChatBuddy *cb);
    -
    -/**
    - * Destroys a chat buddy
    - *
    - * @param cb The chat buddy to destroy
    - */
    -void purple_conv_chat_cb_destroy(PurpleConvChatBuddy *cb);
    -
    -/**
    - * Retrieves the extended menu items for the conversation.
    - *
    - * @param conv The conversation.
    - *
    - * @return A list of PurpleMenuAction items, harvested by the
    - * chat-extended-menu signal. The list and the menuaction
    - * items should be freed by the caller.
    - *
    - * @since 2.1.0
    - */
    -GList * purple_conversation_get_extended_menu(PurpleConversation *conv);
    -
    -/**
    - * Perform a command in a conversation. Similar to @see purple_cmd_do_command
    - *
    - * @param conv The conversation.
    - * @param cmdline The entire command including the arguments.
    - * @param markup @c NULL, or the formatted command line.
    - * @param error If the command failed errormsg is filled in with the appropriate error
    - * message, if not @c NULL. It must be freed by the caller with g_free().
    - *
    - * @return @c TRUE if the command was executed successfully, @c FALSE otherwise.
    - *
    - * @since 2.1.0
    - */
    -gboolean purple_conversation_do_command(PurpleConversation *conv, const gchar *cmdline, const gchar *markup, gchar **error);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Conversations Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the conversation subsystem handle.
    - *
    - * @return The conversation subsystem handle.
    - */
    -void *purple_conversations_get_handle(void);
    -
    -/**
    - * Initializes the conversation subsystem.
    - */
    -void purple_conversations_init(void);
    -
    -/**
    - * Uninitializes the conversation subsystem.
    - */
    -void purple_conversations_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_CONVERSATION_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/core.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,251 +0,0 @@
    -/**
    - * @file core.h Startup and shutdown of libpurple
    - * @defgroup core libpurple
    - * @see @ref core-signals
    - */
    -
    -/* 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
    - */
    -
    -/*! @mainpage Pidgin/Finch/libpurple API Documentation
    - *
    - * <a href="group__core.html">libpurple</a> is intended to be the core of an IM
    - * program. <a href="group__pidgin.html">Pidgin</a> is a GTK+ frontend
    - * to libpurple, and <a href="group__finch.html">Finch</a> is an ncurses
    - * frontend built using <a href="group__gnt.html">libgnt</a>
    - * (GLib Ncurses Toolkit).
    - */
    -
    -#ifndef _PURPLE_CORE_H_
    -#define _PURPLE_CORE_H_
    -
    -typedef struct PurpleCore PurpleCore;
    -
    -/** Callbacks that fire at different points of the initialization and teardown
    - * of libpurple, along with a hook to return descriptive information about the
    - * UI.
    - */
    -typedef struct
    -{
    - /** Called just after the preferences subsystem is initialized; the UI
    - * could use this callback to add some preferences it needs to be in
    - * place when other subsystems are initialized.
    - */
    - void (*ui_prefs_init)(void);
    - /** Called just after the debug subsystem is initialized, but before
    - * just about every other component's initialization. The UI should
    - * use this hook to call purple_debug_set_ui_ops() so that debugging
    - * information for other components can be logged during their
    - * initialization.
    - */
    - void (*debug_ui_init)(void);
    - /** Called after all of libpurple has been initialized. The UI should
    - * use this hook to set all other necessary UiOps structures.
    - *
    - * @see @ref ui-ops
    - */
    - void (*ui_init)(void);
    - /** Called after most of libpurple has been uninitialized. */
    - void (*quit)(void);
    -
    - /** Called by purple_core_get_ui_info(); should return the information
    - * documented there.
    - */
    - GHashTable* (*get_ui_info)(void);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    -} PurpleCoreUiOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Initializes the core of purple.
    - *
    - * This will setup preferences for all the core subsystems.
    - *
    - * @param ui The ID of the UI using the core. This should be a
    - * unique ID, registered with the purple team.
    - *
    - * @return @c TRUE if successful, or @c FALSE otherwise.
    - */
    -gboolean purple_core_init(const char *ui);
    -
    -/**
    - * Quits the core of purple, which, depending on the UI, may quit the
    - * application using the purple core.
    - */
    -void purple_core_quit(void);
    -
    -/**
    - * <p>
    - * Calls purple_core_quit(). This can be used as the function
    - * passed to purple_timeout_add() when you want to shutdown Purple
    - * in a specified amount of time. When shutting down Purple
    - * from a plugin, you must use this instead of purple_core_quit();
    - * for an immediate exit, use a timeout value of 0:
    - * </p>
    - *
    - * <code>purple_timeout_add(0, purple_core_quitcb, NULL);</code>
    - *
    - * <p>
    - * This is ensures that code from your plugin is not being
    - * executed when purple_core_quit() is called. If the plugin
    - * called purple_core_quit() directly, you would get a core dump
    - * after purple_core_quit() executes and control returns to your
    - * plugin because purple_core_quit() frees all plugins.
    - * </p>
    - */
    -gboolean purple_core_quit_cb(gpointer unused);
    -
    -/**
    - * Returns the version of the core library.
    - *
    - * @return The version of the core library.
    - */
    -const char *purple_core_get_version(void);
    -
    -/**
    - * Returns the ID of the UI that is using the core, as passed to
    - * purple_core_init().
    - *
    - * @return The ID of the UI that is currently using the core.
    - */
    -const char *purple_core_get_ui(void);
    -
    -/**
    - * Returns a handle to the purple core.
    - *
    - * This is used to connect to @ref core-signals "core signals".
    - */
    -PurpleCore *purple_get_core(void);
    -
    -/**
    - * Sets the UI ops for the core.
    - *
    - * @param ops A UI ops structure for the core.
    - */
    -void purple_core_set_ui_ops(PurpleCoreUiOps *ops);
    -
    -/**
    - * Returns the UI ops for the core.
    - *
    - * @return The core's UI ops structure.
    - */
    -PurpleCoreUiOps *purple_core_get_ui_ops(void);
    -
    -/**
    - * Migrates from <tt>.gaim</tt> to <tt>.purple</tt>.
    - *
    - * UIs <strong>must not</strong> call this if they have been told to use a
    - * custom user directory.
    - *
    - * @return A boolean indicating success or migration failure. On failure,
    - * the application must display an error to the user and then exit.
    - */
    -gboolean purple_core_migrate(void);
    -
    -/**
    - * Ensures that only one instance is running. If libpurple is built with D-Bus
    - * support, this checks if another process owns the libpurple bus name and if
    - * so whether that process is using the same configuration directory as this
    - * process.
    - *
    - * @return @c TRUE if this is the first instance of libpurple running;
    - * @c FALSE if there is another instance running.
    - *
    - * @since 2.1.0
    - */
    -gboolean purple_core_ensure_single_instance(void);
    -
    -/**
    - * Returns a hash table containing various information about the UI. The
    - * following well-known entries may be in the table (along with any others the
    - * UI might choose to include):
    - *
    - * <dl>
    - * <dt><tt>name</tt></dt>
    - * <dd>the user-readable name for the UI.</dd>
    - *
    - * <dt><tt>version</tt></dt>
    - * <dd>a user-readable description of the current version of the UI.</dd>
    - *
    - * <dt><tt>website</tt></dt>
    - * <dd>the UI's website, such as http://pidgin.im.</dd>
    - *
    - * <dt><tt>dev_website</tt></dt>
    - * <dd>the UI's development/support website, such as http://developer.pidgin.im.</dd>
    - *
    - * <dt><tt>client_type</tt></dt>
    - * <dd>the type of UI. Possible values include 'pc', 'console', 'phone',
    - * 'handheld', 'web', and 'bot'. These values are compared
    - * programmatically and should not be localized.</dd>
    - *
    - * </dl>
    - *
    - * @return A GHashTable with strings for keys and values. This
    - * hash table must not be freed and should not be modified.
    - *
    - * @since 2.1.0
    - *
    - */
    -GHashTable* purple_core_get_ui_info(void);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_CORE_H_ */
    -
    -/*
    -
    - /===-
    - `//"\\ """"`---.___.-""
    - ______-==| | | \\ _-"`
    - __--""" ,-/-==\\ | | `\ ,'
    - _-" /' | \\ ___ / / \ /
    - .' / | \\ /" "\ /' / \ /'
    - / ____ / | \`\.__/-"" D O \_/' / \/'
    -/-'" """""---__ | "-/" O G R /' _--"`
    - \_| / R __--_ t ), __--""
    - '""--_/ T _-"_>--<_\ h '-" \
    - {\__--_/} / \\__>--<__\ e B \
    - /' (_/ _-" | |__>--<__| U |
    - | _/) )-" | |__>--<__| R |
    - / /" ,_/ / /__>---<__/ N |
    - o-o _// /-"_>---<__-" I /
    - (^(" /"_>---<__- N _-"
    - ,/| /__>--<__/ A _-"
    - ,//('( |__>--<__| T / .----_
    - ( ( ')) |__>--<__| | /' _---_"\
    - `-)) )) ( |__>--<__| O | /' / "\`\
    - ,/,'//( ( \__>--<__\ R \ /' // ||
    - ,( ( ((, )) "-__>--<_"-_ "--____---"' _/'/ /'
    - `"/ )` ) ,/| "-_">--<_/-__ __-" _/
    - ._-"//( )/ )) ` ""-'_/_/ /"""""""__--"
    - ;'( ')/ ,)( """"""""""
    - ' ') '( (/
    - ' ' `
    -
    -*/
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dbus-maybe.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,35 +0,0 @@
    -/* This file contains macros that wrap calls to the purple dbus module.
    - These macros call the appropriate functions if the build includes
    - dbus support and do nothing otherwise. See "dbus-server.h" for
    - documentation. */
    -
    -#ifndef _PURPLE_DBUS_MAYBE_H_
    -#define _PURPLE_DBUS_MAYBE_H_
    -
    -#ifdef HAVE_DBUS
    -
    -#ifndef DBUS_API_SUBJECT_TO_CHANGE
    -#define DBUS_API_SUBJECT_TO_CHANGE
    -#endif
    -
    -#include "dbus-server.h"
    -
    -/* this provides a type check */
    -#define PURPLE_DBUS_REGISTER_POINTER(ptr, type) { \
    - type *typed_ptr = ptr; \
    - purple_dbus_register_pointer(typed_ptr, PURPLE_DBUS_TYPE(type)); \
    -}
    -#define PURPLE_DBUS_UNREGISTER_POINTER(ptr) purple_dbus_unregister_pointer(ptr)
    -
    -#else /* !HAVE_DBUS */
    -
    -#define PURPLE_DBUS_REGISTER_POINTER(ptr, type) { \
    - if (ptr) {} \
    -}
    -
    -#define PURPLE_DBUS_UNREGISTER_POINTER(ptr)
    -#define DBUS_EXPORT
    -
    -#endif /* HAVE_DBUS */
    -
    -#endif
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/debug.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,243 +0,0 @@
    -/**
    - * @file debug.h Debug 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
    - */
    -#ifndef _PURPLE_DEBUG_H_
    -#define _PURPLE_DEBUG_H_
    -
    -#include <glib.h>
    -#include <stdarg.h>
    -
    -/**
    - * Debug levels.
    - */
    -typedef enum
    -{
    - PURPLE_DEBUG_ALL = 0, /**< All debug levels. */
    - PURPLE_DEBUG_MISC, /**< General chatter. */
    - PURPLE_DEBUG_INFO, /**< General operation Information. */
    - PURPLE_DEBUG_WARNING, /**< Warnings. */
    - PURPLE_DEBUG_ERROR, /**< Errors. */
    - PURPLE_DEBUG_FATAL /**< Fatal errors. */
    -
    -} PurpleDebugLevel;
    -
    -/**
    - * Debug UI operations.
    - */
    -typedef struct
    -{
    - void (*print)(PurpleDebugLevel level, const char *category,
    - const char *arg_s);
    - gboolean (*is_enabled)(PurpleDebugLevel level,
    - const char *category);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleDebugUiOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Debug API */
    -/**************************************************************************/
    -/**
    - * Outputs debug information.
    - *
    - * @param level The debug level.
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - */
    -void purple_debug(PurpleDebugLevel level, const char *category,
    - const char *format, ...) G_GNUC_PRINTF(3, 4);
    -
    -/**
    - * Outputs misc. level debug information.
    - *
    - * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_MISC as
    - * the level.
    - *
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - *
    - * @see purple_debug()
    - */
    -void purple_debug_misc(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    -
    -/**
    - * Outputs info level debug information.
    - *
    - * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_INFO as
    - * the level.
    - *
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - *
    - * @see purple_debug()
    - */
    -void purple_debug_info(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    -
    -/**
    - * Outputs warning level debug information.
    - *
    - * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_WARNING as
    - * the level.
    - *
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - *
    - * @see purple_debug()
    - */
    -void purple_debug_warning(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    -
    -/**
    - * Outputs error level debug information.
    - *
    - * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_ERROR as
    - * the level.
    - *
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - *
    - * @see purple_debug()
    - */
    -void purple_debug_error(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    -
    -/**
    - * Outputs fatal error level debug information.
    - *
    - * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_ERROR as
    - * the level.
    - *
    - * @param category The category (or @c NULL).
    - * @param format The format string.
    - *
    - * @see purple_debug()
    - */
    -void purple_debug_fatal(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    -
    -/**
    - * Enable or disable printing debug output to the console.
    - *
    - * @param enabled TRUE to enable debug output or FALSE to disable it.
    - */
    -void purple_debug_set_enabled(gboolean enabled);
    -
    -/**
    - * Check if console debug output is enabled.
    - *
    - * @return TRUE if debugging is enabled, FALSE if it is not.
    - */
    -gboolean purple_debug_is_enabled(void);
    -
    -/**
    - * Enable or disable verbose debugging. This ordinarily should only be called
    - * by #purple_debug_init, but there are cases where this can be useful for
    - * plugins.
    - *
    - * @param verbose TRUE to enable verbose debugging or FALSE to disable it.
    - *
    - * @since 2.6.0
    - */
    -void purple_debug_set_verbose(gboolean verbose);
    -
    -/**
    - * Check if verbose logging is enabled.
    - *
    - * @return TRUE if verbose debugging is enabled, FALSE if it is not.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_debug_is_verbose(void);
    -
    -/**
    - * Enable or disable unsafe debugging. This ordinarily should only be called
    - * by #purple_debug_init, but there are cases where this can be useful for
    - * plugins.
    - *
    - * @param unsafe TRUE to enable debug logging of messages that could
    - * potentially contain passwords and other sensitive information.
    - * FALSE to disable it.
    - *
    - * @since 2.6.0
    - */
    -void purple_debug_set_unsafe(gboolean unsafe);
    -
    -/**
    - * Check if unsafe debugging is enabled. Defaults to FALSE.
    - *
    - * @return TRUE if the debug logging of all messages is enabled, FALSE
    - * if messages that could potentially contain passwords and other
    - * sensitive information are not logged.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_debug_is_unsafe(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used when outputting debug
    - * information.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_debug_set_ui_ops(PurpleDebugUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure used when outputting debug
    - * information.
    - *
    - * @return The UI operations structure in use.
    - */
    -PurpleDebugUiOps *purple_debug_get_ui_ops(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Debug Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Initializes the debug subsystem.
    - */
    -void purple_debug_init(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_DEBUG_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/desktopitem.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,172 +0,0 @@
    -/**
    - * @file desktopitem.h Functions for managing .desktop files
    - * @ingroup core
    - */
    -
    -/* 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
    - *
    - */
    -
    -/*
    - * The following code has been adapted from gnome-desktop-item.[ch],
    - * as found on gnome-desktop-2.8.1.
    - *
    - * Copyright (C) 2004 by Alceste Scalas <alceste.scalas@gmx.net>.
    - *
    - * Original copyright notice:
    - *
    - * Copyright (C) 1999, 2000 Red Hat Inc.
    - * Copyright (C) 2001 Sid Vicious
    - * All rights reserved.
    - *
    - * This file is part of the Gnome Library.
    - *
    - * The Gnome Library is free software; you can redistribute it and/or
    - * modify it under the terms of the GNU Library General Public License as
    - * published by the Free Software Foundation; either version 2 of the
    - * License, or (at your option) any later version.
    - *
    - * The Gnome Library 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
    - * Library General Public License for more details.
    - *
    - * You should have received a copy of the GNU Library General Public
    - * License along with the Gnome Library; see the file COPYING.LIB. If not,
    - * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    - * Boston, MA 02111-1301, USA.
    - */
    -
    -#ifndef _PURPLE_DESKTOP_ITEM_H_
    -#define _PURPLE_DESKTOP_ITEM_H_
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -typedef enum {
    - PURPLE_DESKTOP_ITEM_TYPE_NULL = 0 /* This means its NULL, that is, not
    - * set */,
    - PURPLE_DESKTOP_ITEM_TYPE_OTHER /* This means it's not one of the below
    - strings types, and you must get the
    - Type attribute. */,
    -
    - /* These are the standard compliant types: */
    - PURPLE_DESKTOP_ITEM_TYPE_APPLICATION,
    - PURPLE_DESKTOP_ITEM_TYPE_LINK,
    - PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE,
    - PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE,
    - PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY,
    - PURPLE_DESKTOP_ITEM_TYPE_SERVICE,
    - PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
    -} PurpleDesktopItemType;
    -
    -typedef struct _PurpleDesktopItem PurpleDesktopItem;
    -
    -#define PURPLE_TYPE_DESKTOP_ITEM (purple_desktop_item_get_type ())
    -GType purple_desktop_item_get_type (void);
    -
    -/* standard */
    -#define PURPLE_DESKTOP_ITEM_ENCODING "Encoding" /* string */
    -#define PURPLE_DESKTOP_ITEM_VERSION "Version" /* numeric */
    -#define PURPLE_DESKTOP_ITEM_NAME "Name" /* localestring */
    -#define PURPLE_DESKTOP_ITEM_GENERIC_NAME "GenericName" /* localestring */
    -#define PURPLE_DESKTOP_ITEM_TYPE "Type" /* string */
    -#define PURPLE_DESKTOP_ITEM_FILE_PATTERN "FilePattern" /* regexp(s) */
    -#define PURPLE_DESKTOP_ITEM_TRY_EXEC "TryExec" /* string */
    -#define PURPLE_DESKTOP_ITEM_NO_DISPLAY "NoDisplay" /* boolean */
    -#define PURPLE_DESKTOP_ITEM_COMMENT "Comment" /* localestring */
    -#define PURPLE_DESKTOP_ITEM_EXEC "Exec" /* string */
    -#define PURPLE_DESKTOP_ITEM_ACTIONS "Actions" /* strings */
    -#define PURPLE_DESKTOP_ITEM_ICON "Icon" /* string */
    -#define PURPLE_DESKTOP_ITEM_MINI_ICON "MiniIcon" /* string */
    -#define PURPLE_DESKTOP_ITEM_HIDDEN "Hidden" /* boolean */
    -#define PURPLE_DESKTOP_ITEM_PATH "Path" /* string */
    -#define PURPLE_DESKTOP_ITEM_TERMINAL "Terminal" /* boolean */
    -#define PURPLE_DESKTOP_ITEM_TERMINAL_OPTIONS "TerminalOptions" /* string */
    -#define PURPLE_DESKTOP_ITEM_SWALLOW_TITLE "SwallowTitle" /* string */
    -#define PURPLE_DESKTOP_ITEM_SWALLOW_EXEC "SwallowExec" /* string */
    -#define PURPLE_DESKTOP_ITEM_MIME_TYPE "MimeType" /* regexp(s) */
    -#define PURPLE_DESKTOP_ITEM_PATTERNS "Patterns" /* regexp(s) */
    -#define PURPLE_DESKTOP_ITEM_DEFAULT_APP "DefaultApp" /* string */
    -#define PURPLE_DESKTOP_ITEM_DEV "Dev" /* string */
    -#define PURPLE_DESKTOP_ITEM_FS_TYPE "FSType" /* string */
    -#define PURPLE_DESKTOP_ITEM_MOUNT_POINT "MountPoint" /* string */
    -#define PURPLE_DESKTOP_ITEM_READ_ONLY "ReadOnly" /* boolean */
    -#define PURPLE_DESKTOP_ITEM_UNMOUNT_ICON "UnmountIcon" /* string */
    -#define PURPLE_DESKTOP_ITEM_SORT_ORDER "SortOrder" /* strings */
    -#define PURPLE_DESKTOP_ITEM_URL "URL" /* string */
    -#define PURPLE_DESKTOP_ITEM_DOC_PATH "X-GNOME-DocPath" /* string */
    -
    -/**
    - * This function loads 'filename' and turns it into a PurpleDesktopItem.
    - *
    - * @param filename The filename or directory path to load the PurpleDesktopItem from
    - *
    - * @return The newly loaded item, or NULL on error.
    - */
    -PurpleDesktopItem *purple_desktop_item_new_from_file (const char *filename);
    -
    -/**
    - * Gets the type attribute (the 'Type' field) of the item. This should
    - * usually be 'Application' for an application, but it can be 'Directory'
    - * for a directory description. There are other types available as well.
    - * The type usually indicates how the desktop item should be handeled and
    - * how the 'Exec' field should be handeled.
    - *
    - * @param item A desktop item
    - *
    - * @return The type of the specified 'item'. The returned memory
    - * remains owned by the PurpleDesktopItem and should not be freed.
    - */
    -PurpleDesktopItemType purple_desktop_item_get_entry_type (const PurpleDesktopItem *item);
    -
    -/**
    - * Gets the value of an attribute of the item, as a string.
    - *
    - * @param item A desktop item
    - * @param attr The attribute to look for
    - *
    - * @return The value of the specified item attribute.
    - */
    -const char *purple_desktop_item_get_string (const PurpleDesktopItem *item,
    - const char *attr);
    -
    -/**
    - * Creates a copy of a PurpleDesktopItem. The new copy has a refcount of 1.
    - * Note: Section stack is NOT copied.
    - *
    - * @param item The item to be copied
    - *
    - * @return The new copy
    - */
    -PurpleDesktopItem *purple_desktop_item_copy (const PurpleDesktopItem *item);
    -
    -/**
    - * Decreases the reference count of the specified item, and destroys
    - * the item if there are no more references left.
    - *
    - * @param item A desktop item
    - */
    -void purple_desktop_item_unref (PurpleDesktopItem *item);
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_DESKTOP_ITEM_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/directconn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,200 +0,0 @@
    -/**
    - * @file directconn.h MSN direct connection functions
    - *
    - * 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
    - */
    -#ifndef MSN_DIRECTCONN_H
    -#define MSN_DIRECTCONN_H
    -
    -typedef struct _MsnDirectConn MsnDirectConn;
    -
    -#include "network.h"
    -#include "proxy.h"
    -#include "circbuffer.h"
    -
    -#include "slp.h"
    -#include "slplink.h"
    -#include "slpmsg.h"
    -#include "slpmsg_part.h"
    -#include "p2p.h"
    -
    -#define MSN_DCCONN_MAX_SIZE 1352
    -
    -typedef enum
    -{
    - DC_STATE_CLOSED, /*< No socket opened yet */
    - DC_STATE_FOO, /*< Waiting for FOO message */
    - DC_STATE_HANDSHAKE, /*< Waiting for handshake message */
    - DC_STATE_HANDSHAKE_REPLY, /*< Waiting for handshake reply message */
    - DC_STATE_ESTABLISHED /*< Handshake complete */
    -} MsnDirectConnState;
    -
    -typedef enum
    -{
    - DC_PROCESS_OK = 0,
    - DC_PROCESS_ERROR,
    - DC_PROCESS_FALLBACK,
    - DC_PROCESS_CLOSE
    -
    -} MsnDirectConnProcessResult;
    -
    -typedef enum
    -{
    - DC_NONCE_UNKNOWN, /**< Invalid scheme */
    - DC_NONCE_PLAIN, /**< No hashing */
    - DC_NONCE_SHA1 /**< First 16 bytes of SHA1 of nonce */
    -
    -} MsnDirectConnNonceType;
    -
    -typedef struct _MsnDirectConnPacket MsnDirectConnPacket;
    -
    -struct _MsnDirectConnPacket {
    - guint32 length;
    - guchar *data;
    -
    - void (*sent_cb)(struct _MsnDirectConnPacket*);
    - MsnSlpMessagePart *part;
    -};
    -
    -struct _MsnDirectConn
    -{
    - MsnDirectConnState state; /**< Direct connection status */
    - MsnSlpLink *slplink; /**< The slplink using this direct connection */
    - MsnSlpCall *slpcall; /**< The slpcall which initiated the direct connection */
    - char *msg_body; /**< The body of message sent by send_connection_info_msg_cb */
    - MsnSlpMessage *prev_ack; /**< The saved SLP ACK message */
    -
    - MsnDirectConnNonceType nonce_type; /**< The type of nonce hashing */
    - guchar nonce[16]; /**< The nonce used for handshake */
    - gchar nonce_hash[37]; /**< The hash of nonce */
    - gchar remote_nonce[37]; /**< The remote side's nonce */
    -
    - PurpleNetworkListenData *listen_data; /**< The pending socket creation request */
    - PurpleProxyConnectData *connect_data; /**< The pending connection attempt */
    - int listenfd; /**< The socket we're listening for incoming connections */
    - guint listenfd_handle; /**< The timeout handle for incoming connection */
    - guint connect_timeout_handle; /**< The timeout handle for outgoing connection */
    -
    - int fd; /**< The direct connection socket */
    - guint recv_handle; /**< The incoming data callback handle */
    - guint send_handle; /**< The outgoing data callback handle */
    -
    - gchar *in_buffer; /**< The receive buffer */
    - int in_size; /**< The receive buffer size */
    - int in_pos; /**< The first free position in receive buffer */
    - GQueue *out_queue; /**< The outgoing packet queue */
    - int msg_pos; /**< The position of next byte to be sent in the actual packet */
    -
    - /** The callback used for sending information to the peer about the opened socket */
    - void (*send_connection_info_msg_cb)(MsnDirectConn *);
    -
    - gchar *ext_ip; /**< Our external IP address */
    - int ext_port; /**< Our external port */
    -
    - guint timeout_handle;
    - gboolean progress;
    -
    - /*int num_calls;*/ /**< The number of slpcalls using this direct connection */
    -};
    -
    -/* Outgoing attempt */
    -#define DC_OUTGOING_TIMEOUT (5)
    -/* Time for internal + external connection attempts */
    -#define DC_INCOMING_TIMEOUT (DC_OUTGOING_TIMEOUT * 3)
    -/* Timeout for lack of activity */
    -#define DC_TIMEOUT (60)
    -
    -/*
    - * Queues an MSN message to be sent via direct connection.
    - */
    -void
    -msn_dc_enqueue_part(MsnDirectConn *dc, MsnSlpMessagePart *part);
    -
    -/*
    - * Creates, initializes, and returns a new MsnDirectConn structure.
    - */
    -MsnDirectConn *
    -msn_dc_new(MsnSlpCall *slpcall);
    -
    -/*
    - * Destroys an MsnDirectConn structure. Frees every buffer allocated earlier
    - * restores saved callbacks, etc.
    - */
    -void
    -msn_dc_destroy(MsnDirectConn *dc);
    -
    -/*
    - * Fallback to switchboard connection. Used when neither side is able to
    - * create a listening socket.
    - */
    -void
    -msn_dc_fallback_to_sb(MsnDirectConn *dc);
    -
    -/*
    - * Increases the slpcall counter in DC. The direct connection remains open
    - * until all slpcalls using it are destroyed.
    - */
    -void
    -msn_dc_ref(MsnDirectConn *dc);
    -
    -/*
    - * Decrease the slpcall counter in DC. The direct connection remains open
    - * until all slpcalls using it are destroyed.
    - */
    -void
    -msn_dc_unref(MsnDirectConn *dc);
    -
    -/*
    - * Sends a direct connect INVITE message on the associated slplink
    - * with the corresponding connection type and information.
    - */
    -void
    -msn_dc_send_invite(MsnDirectConn *dc);
    -
    -/*
    - * Sends a direct connect OK message as a response to an INVITE received earliaer
    - * on the corresponding slplink.
    - */
    -void
    -msn_dc_send_ok(MsnDirectConn *dc);
    -
    -/*
    - * This callback will be called when we're successfully connected to
    - * the remote host.
    - */
    -void
    -msn_dc_connected_to_peer_cb(gpointer data, gint fd, const gchar *error_msg);
    -
    -/*
    - * This callback will be called when we're unable to connect to
    - * the remote host in DC_CONNECT_TIMEOUT seconds.
    - */
    -gboolean
    -msn_dc_outgoing_connection_timeout_cb(gpointer data);
    -
    -/*
    - * This callback will be called when the listening socket is successfully
    - * created and its parameters (IP/port) are available.
    - */
    -void
    -msn_dc_listen_socket_created_cb(int listenfd, gpointer data);
    -
    -#endif /* MSN_DIRECTCONN_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dnsquery.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,180 +0,0 @@
    -/**
    - * @file dnsquery.h DNS query 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
    - */
    -#ifndef _PURPLE_DNSQUERY_H_
    -#define _PURPLE_DNSQUERY_H_
    -
    -#include <glib.h>
    -#include "eventloop.h"
    -#include "account.h"
    -
    -/**
    - * An opaque structure representing a DNS query. The hostname and port
    - * associated with the query can be retrieved using
    - * purple_dnsquery_get_host() and purple_dnsquery_get_port().
    - */
    -typedef struct _PurpleDnsQueryData PurpleDnsQueryData;
    -
    -/**
    - * The "hosts" parameter is a linked list containing pairs of
    - * one size_t addrlen and one struct sockaddr *addr. It should
    - * be free'd by the callback function.
    - */
    -typedef void (*PurpleDnsQueryConnectFunction)(GSList *hosts, gpointer data, const char *error_message);
    -
    -/**
    - * Callbacks used by the UI if it handles resolving DNS
    - */
    -typedef void (*PurpleDnsQueryResolvedCallback) (PurpleDnsQueryData *query_data, GSList *hosts);
    -typedef void (*PurpleDnsQueryFailedCallback) (PurpleDnsQueryData *query_data, const gchar *error_message);
    -
    -/**
    - * DNS Request UI operations; UIs should implement this if they want to do DNS
    - * lookups themselves, rather than relying on the core.
    - *
    - * @see @ref ui-ops
    - */
    -typedef struct
    -{
    - /** If implemented, return TRUE if the UI takes responsibility for DNS
    - * queries. When returning FALSE, the standard implementation is used. */
    - gboolean (*resolve_host)(PurpleDnsQueryData *query_data,
    - PurpleDnsQueryResolvedCallback resolved_cb,
    - PurpleDnsQueryFailedCallback failed_cb);
    -
    - /** Called just before @a query_data is freed; this should cancel any
    - * further use of @a query_data the UI would make. Unneeded if
    - * #resolve_host is not implemented.
    - */
    - void (*destroy)(PurpleDnsQueryData *query_data);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleDnsQueryUiOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name DNS query API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Perform an asynchronous DNS query.
    - *
    - * @param account the account that the query is being done for (or NULL)
    - * @param hostname The hostname to resolve.
    - * @param port A port number which is stored in the struct sockaddr.
    - * @param callback The callback function to call after resolving.
    - * @param data Extra data to pass to the callback function.
    - *
    - * @return NULL if there was an error, otherwise return a reference to
    - * a data structure that can be used to cancel the pending
    - * DNS query, if needed.
    - *
    - * @since 2.8.0
    - */
    -PurpleDnsQueryData *purple_dnsquery_a_account(PurpleAccount *account, const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSQUERY_C_)
    -/**
    - * Perform an asynchronous DNS query.
    - *
    - * @param hostname The hostname to resolve.
    - * @param port A port number which is stored in the struct sockaddr.
    - * @param callback The callback function to call after resolving.
    - * @param data Extra data to pass to the callback function.
    - *
    - * @return NULL if there was an error, otherwise return a reference to
    - * a data structure that can be used to cancel the pending
    - * DNS query, if needed.
    - *
    - * @deprecated Use purple_dnsquery_a_account instead
    - */
    -PurpleDnsQueryData *purple_dnsquery_a(const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data);
    -#endif
    -
    -/**
    - * Cancel a DNS query and destroy the associated data structure.
    - *
    - * @param query_data The DNS query to cancel. This data structure
    - * is freed by this function.
    - */
    -void purple_dnsquery_destroy(PurpleDnsQueryData *query_data);
    -
    -/**
    - * Sets the UI operations structure to be used when doing a DNS
    - * resolve. The UI operations need only be set if the UI wants to
    - * handle the resolve itself; otherwise, leave it as NULL.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_dnsquery_set_ui_ops(PurpleDnsQueryUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used when doing a DNS
    - * resolve.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleDnsQueryUiOps *purple_dnsquery_get_ui_ops(void);
    -
    -/**
    - * Get the host associated with a PurpleDnsQueryData
    - *
    - * @param query_data The DNS query
    - * @return The host.
    - */
    -char *purple_dnsquery_get_host(PurpleDnsQueryData *query_data);
    -
    -/**
    - * Get the port associated with a PurpleDnsQueryData
    - *
    - * @param query_data The DNS query
    - * @return The port.
    - */
    -unsigned short purple_dnsquery_get_port(PurpleDnsQueryData *query_data);
    -
    -/**
    - * Initializes the DNS query subsystem.
    - */
    -void purple_dnsquery_init(void);
    -
    -/**
    - * Uninitializes the DNS query subsystem.
    - */
    -void purple_dnsquery_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_DNSQUERY_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/dnssrv.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,242 +0,0 @@
    -/**
    - * @file dnssrv.h
    - */
    -
    -/* purple
    - *
    - * Copyright (C) 2005, Thomas Butter <butter@uni-mannheim.de>
    - *
    - * 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
    - */
    -
    -#ifndef _PURPLE_DNSSRV_H
    -#define _PURPLE_DNSSRV_H
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -typedef struct _PurpleSrvTxtQueryData PurpleSrvTxtQueryData;
    -typedef struct _PurpleSrvResponse PurpleSrvResponse;
    -typedef struct _PurpleTxtResponse PurpleTxtResponse;
    -
    -/* For compatibility, should be removed for 3.0.0
    - */
    -typedef struct _PurpleSrvTxtQueryData PurpleSrvQueryData;
    -
    -#include <glib.h>
    -
    -enum PurpleDnsType {
    - PurpleDnsTypeTxt = 16,
    - PurpleDnsTypeSrv = 33
    -};
    -
    -struct _PurpleSrvResponse {
    - char hostname[256];
    - int port;
    - int weight;
    - int pref;
    -};
    -
    -struct _PurpleTxtResponse {
    - char *content;
    -};
    -
    -typedef void (*PurpleSrvTxtQueryResolvedCallback) (PurpleSrvTxtQueryData *query_data, GList *records);
    -typedef void (*PurpleSrvTxtQueryFailedCallback) (PurpleSrvTxtQueryData *query_data, const gchar *error_message);
    -
    -/**
    - * SRV Request UI operations; UIs should implement this if they want to do SRV
    - * lookups themselves, rather than relying on the core.
    - *
    - * @see @ref ui-ops
    - */
    -typedef struct
    -{
    - /** If implemented, return TRUE if the UI takes responsibility for SRV
    - * queries. When returning FALSE, the standard implementation is used.
    - * These callbacks MUST be called asynchronously. */
    - gboolean (*resolve)(PurpleSrvTxtQueryData *query_data,
    - PurpleSrvTxtQueryResolvedCallback resolved_cb,
    - PurpleSrvTxtQueryFailedCallback failed_cb);
    -
    - /** Called just before @a query_data is freed; this should cancel any
    - * further use of @a query_data the UI would make. Unneeded if
    - * #resolve_host is not implemented.
    - */
    - void (*destroy)(PurpleSrvTxtQueryData *query_data);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleSrvTxtQueryUiOps;
    -
    -/**
    - * @param resp An array of PurpleSrvResponse of size results. The array
    - * is sorted based on the order described in the DNS SRV RFC.
    - * Users of this API should try each record in resp in order,
    - * starting at the beginning.
    - */
    -typedef void (*PurpleSrvCallback)(PurpleSrvResponse *resp, int results, gpointer data);
    -
    -/**
    - * Callback that returns the data retrieved from a DNS TXT lookup.
    - *
    - * @param responses A GList of PurpleTxtResponse objects.
    - * @param data The extra data passed to purple_txt_resolve.
    - */
    -typedef void (*PurpleTxtCallback)(GList *responses, gpointer data);
    -
    -/**
    - * Queries an SRV record.
    - *
    - * @param account the account that the query is being done for (or NULL)
    - * @param protocol Name of the protocol (e.g. "sip")
    - * @param transport Name of the transport ("tcp" or "udp")
    - * @param domain Domain name to query (e.g. "blubb.com")
    - * @param cb A callback which will be called with the results
    - * @param extradata Extra data to be passed to the callback
    - *
    - * @since 2.8.0
    - */
    -PurpleSrvTxtQueryData *purple_srv_resolve_account(PurpleAccount *account, const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
    -/**
    - * Queries an SRV record.
    - *
    - * @param protocol Name of the protocol (e.g. "sip")
    - * @param transport Name of the transport ("tcp" or "udp")
    - * @param domain Domain name to query (e.g. "blubb.com")
    - * @param cb A callback which will be called with the results
    - * @param extradata Extra data to be passed to the callback
    - *
    - * @deprecated Use purple_srv_resolve_account instead
    - */
    -PurpleSrvTxtQueryData *purple_srv_resolve(const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata);
    -#endif
    -
    -/**
    - * Cancel an SRV or DNS query.
    - *
    - * @param query_data The request to cancel.
    - *
    - * @deprecated Use purple_srv_txt_query_destroy instead
    - */
    -void purple_srv_cancel(PurpleSrvTxtQueryData *query_data);
    -
    -/**
    - * Queries an TXT record.
    - *
    - * @param account the account that the query is being done for (or NULL)
    - * @param owner Name of the protocol (e.g. "_xmppconnect")
    - * @param domain Domain name to query (e.g. "blubb.com")
    - * @param cb A callback which will be called with the results
    - * @param extradata Extra data to be passed to the callback
    - *
    - * @since 2.8.0
    - */
    -PurpleSrvTxtQueryData *purple_txt_resolve_account(PurpleAccount *account, const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
    -/**
    - * Queries an TXT record.
    - *
    - * @param owner Name of the protocol (e.g. "_xmppconnect")
    - * @param domain Domain name to query (e.g. "blubb.com")
    - * @param cb A callback which will be called with the results
    - * @param extradata Extra data to be passed to the callback
    - *
    - * @deprecated Use purple_txt_resolve_account instead
    - *
    - * @since 2.6.0
    - */
    -PurpleSrvTxtQueryData *purple_txt_resolve(const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata);
    -#endif
    -
    -/**
    - * Cancel an TXT DNS query.
    - *
    - * @param query_data The request to cancel.
    - * @since 2.6.0
    - *
    - * @deprecated Use purple_srv_txt_query_destroy instead
    - */
    -void purple_txt_cancel(PurpleSrvTxtQueryData *query_data);
    -
    -/**
    - * Get the value of the current TXT record.
    - *
    - * @param response The TXT response record
    - * @returns The value of the current TXT record.
    - * @since 2.6.0
    - */
    -const gchar *purple_txt_response_get_content(PurpleTxtResponse *response);
    -
    -/**
    - * Destroy a TXT DNS response object.
    - *
    - * @param response The PurpleTxtResponse to destroy.
    - * @since 2.6.0
    - */
    -void purple_txt_response_destroy(PurpleTxtResponse *response);
    -
    -/**
    - * Cancel a SRV/TXT query and destroy the associated data structure.
    - *
    - * @param query_data The SRV/TXT query to cancel. This data structure
    - * is freed by this function.
    - */
    -void purple_srv_txt_query_destroy(PurpleSrvTxtQueryData *query_data);
    -
    -/**
    - * Sets the UI operations structure to be used when doing a SRV/TXT
    - * resolve. The UI operations need only be set if the UI wants to
    - * handle the resolve itself; otherwise, leave it as NULL.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_srv_txt_query_set_ui_ops(PurpleSrvTxtQueryUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used when doing a SRV/TXT
    - * resolve.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleSrvTxtQueryUiOps *purple_srv_txt_query_get_ui_ops(void);
    -
    -/**
    - * Get the query from a PurpleDnsQueryData
    - *
    - * @param query_data The SRV/TXT query
    - * @return The query.
    - */
    -char *purple_srv_txt_query_get_query(PurpleSrvTxtQueryData *query_data);
    -
    -/**
    - * Get the type from a PurpleDnsQueryData (TXT or SRV)
    - *
    - * @param query_data The query
    - * @return The query.
    - */
    -int purple_srv_txt_query_get_type(PurpleSrvTxtQueryData *query_data);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_DNSSRV_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/error.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,57 +0,0 @@
    -/**
    - * @file error.h Error functions
    - *
    - * 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
    - */
    -#ifndef MSN_ERROR_H
    -#define MSN_ERROR_H
    -
    -#include "session.h"
    -
    -/**
    - * Returns the string representation of an error type.
    - *
    - * @param type The error type.
    - * @param debug Whether this should be treated as a debug log message or a user-visible error
    - *
    - * @return The string representation of the error type.
    - */
    -const char *msn_error_get_text(unsigned int type, gboolean *debug);
    -
    -/**
    - * Handles an error.
    - *
    - * @param session The current session.
    - * @param type The error type.
    - */
    -void msn_error_handle(MsnSession *session, unsigned int type);
    -
    -/**
    - * Show the sync issue in a dialog using request api
    - *
    - * @param sesion MsnSession associated to this error.
    - * @param passport The passport associated with the error.
    - * @param group_name The group in the buddy is suppoused to be
    - */
    -void msn_error_sync_issue(MsnSession *session, const char *passport,
    - const char *group_name);
    -
    -#endif /* MSN_ERROR_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/eventloop.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,276 +0,0 @@
    -/**
    - * @file eventloop.h Purple Event Loop 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
    - */
    -#ifndef _PURPLE_EVENTLOOP_H_
    -#define _PURPLE_EVENTLOOP_H_
    -
    -#include <glib.h>
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * An input condition.
    - */
    -typedef enum
    -{
    - PURPLE_INPUT_READ = 1 << 0, /**< A read condition. */
    - PURPLE_INPUT_WRITE = 1 << 1 /**< A write condition. */
    -
    -} PurpleInputCondition;
    -
    -/** The type of callbacks to handle events on file descriptors, as passed to
    - * purple_input_add(). The callback will receive the @c user_data passed to
    - * purple_input_add(), the file descriptor on which the event occurred, and the
    - * condition that was satisfied to cause the callback to be invoked.
    - */
    -typedef void (*PurpleInputFunction)(gpointer, gint, PurpleInputCondition);
    -
    -/** @copydoc _PurpleEventLoopUiOps */
    -typedef struct _PurpleEventLoopUiOps PurpleEventLoopUiOps;
    -
    -/** An abstraction of an application's mainloop; libpurple will use this to
    - * watch file descriptors and schedule timed callbacks. If your application
    - * uses the glib mainloop, there is an implementation of this struct in
    - * <tt>libpurple/example/nullclient.c</tt> which you can use verbatim.
    - */
    -struct _PurpleEventLoopUiOps
    -{
    - /**
    - * Should create a callback timer with an interval measured in
    - * milliseconds. The supplied @a function should be called every @a
    - * interval seconds until it returns @c FALSE, after which it should not
    - * be called again.
    - *
    - * Analogous to g_timeout_add in glib.
    - *
    - * Note: On Win32, this function may be called from a thread other than
    - * the libpurple thread. You should make sure to detect this situation
    - * and to only call "function" from the libpurple thread.
    - *
    - * @param interval the interval in <em>milliseconds</em> between calls
    - * to @a function.
    - * @param data arbitrary data to be passed to @a function at each
    - * call.
    - * @todo Who is responsible for freeing @a data?
    - *
    - * @return a handle for the timeout, which can be passed to
    - * #timeout_remove.
    - *
    - * @see purple_timeout_add
    - **/
    - guint (*timeout_add)(guint interval, GSourceFunc function, gpointer data);
    -
    - /**
    - * Should remove a callback timer. Analogous to g_source_remove in glib.
    - * @param handle an identifier for a timeout, as returned by
    - * #timeout_add.
    - * @return @c TRUE if the timeout identified by @a handle was
    - * found and removed.
    - * @see purple_timeout_remove
    - */
    - gboolean (*timeout_remove)(guint handle);
    -
    - /**
    - * Should add an input handler. Analogous to g_io_add_watch_full in
    - * glib.
    - *
    - * @param fd a file descriptor to watch for events
    - * @param cond a bitwise OR of events on @a fd for which @a func
    - * should be called.
    - * @param func a callback to fire whenever a relevant event on @a
    - * fd occurs.
    - * @param user_data arbitrary data to pass to @a fd.
    - * @return an identifier for this input handler, which can be
    - * passed to #input_remove.
    - *
    - * @see purple_input_add
    - */
    - guint (*input_add)(int fd, PurpleInputCondition cond,
    - PurpleInputFunction func, gpointer user_data);
    -
    - /**
    - * Should remove an input handler. Analogous to g_source_remove in glib.
    - * @param handle an identifier, as returned by #input_add.
    - * @return @c TRUE if the input handler was found and removed.
    - * @see purple_input_remove
    - */
    - gboolean (*input_remove)(guint handle);
    -
    -
    - /**
    - * If implemented, should get the current error status for an input.
    - *
    - * Implementation of this UI op is optional. Implement it if the UI's
    - * sockets or event loop needs to customize determination of socket
    - * error status. If unimplemented, <tt>getsockopt(2)</tt> will be used
    - * instead.
    - *
    - * @see purple_input_get_error
    - */
    - int (*input_get_error)(int fd, int *error);
    -
    - /**
    - * If implemented, should create a callback timer with an interval
    - * measured in seconds. Analogous to g_timeout_add_seconds in glib.
    - *
    - * This allows UIs to group timers for better power efficiency. For
    - * this reason, @a interval may be rounded by up to a second.
    - *
    - * Implementation of this UI op is optional. If it's not implemented,
    - * calls to purple_timeout_add_seconds() will be serviced by
    - * #timeout_add.
    - *
    - * @see purple_timeout_add_seconds()
    - * @since 2.1.0
    - **/
    - guint (*timeout_add_seconds)(guint interval, GSourceFunc function,
    - gpointer data);
    -
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/**************************************************************************/
    -/** @name Event Loop API */
    -/**************************************************************************/
    -/*@{*/
    -/**
    - * Creates a callback timer.
    - *
    - * The timer will repeat until the function returns @c FALSE. The
    - * first call will be at the end of the first interval.
    - *
    - * If the timer is in a multiple of seconds, use purple_timeout_add_seconds()
    - * instead as it allows UIs to group timers for power efficiency.
    - *
    - * @param interval The time between calls of the function, in
    - * milliseconds.
    - * @param function The function to call.
    - * @param data data to pass to @a function.
    - * @return A handle to the timer which can be passed to
    - * purple_timeout_remove() to remove the timer.
    - */
    -guint purple_timeout_add(guint interval, GSourceFunc function, gpointer data);
    -
    -/**
    - * Creates a callback timer.
    - *
    - * The timer will repeat until the function returns @c FALSE. The
    - * first call will be at the end of the first interval.
    - *
    - * This function allows UIs to group timers for better power efficiency. For
    - * this reason, @a interval may be rounded by up to a second.
    - *
    - * @param interval The time between calls of the function, in
    - * seconds.
    - * @param function The function to call.
    - * @param data data to pass to @a function.
    - * @return A handle to the timer which can be passed to
    - * purple_timeout_remove() to remove the timer.
    - *
    - * @since 2.1.0
    - */
    -guint purple_timeout_add_seconds(guint interval, GSourceFunc function, gpointer data);
    -
    -/**
    - * Removes a timeout handler.
    - *
    - * @param handle The handle, as returned by purple_timeout_add().
    - *
    - * @return @c TRUE if the handler was successfully removed.
    - */
    -gboolean purple_timeout_remove(guint handle);
    -
    -/**
    - * Adds an input handler.
    - *
    - * @param fd The input file descriptor.
    - * @param cond The condition type.
    - * @param func The callback function for data.
    - * @param user_data User-specified data.
    - *
    - * @return The resulting handle (will be greater than 0).
    - * @see g_io_add_watch_full
    - */
    -guint purple_input_add(int fd, PurpleInputCondition cond,
    - PurpleInputFunction func, gpointer user_data);
    -
    -/**
    - * Removes an input handler.
    - *
    - * @param handle The handle of the input handler. Note that this is the return
    - * value from purple_input_add(), <i>not</i> the file descriptor.
    - */
    -gboolean purple_input_remove(guint handle);
    -
    -/**
    - * Get the current error status for an input.
    - *
    - * The return value and error follow getsockopt() with a level of SOL_SOCKET and an
    - * option name of SO_ERROR, and this is how the error is determined if the UI does not
    - * implement the input_get_error UI op.
    - *
    - * @param fd The input file descriptor.
    - * @param error A pointer to an @c int which on return will have the error, or
    - * @c 0 if no error.
    - *
    - * @return @c 0 if there is no error; @c -1 if there is an error, in which case
    - * @a errno will be set.
    - */
    -int
    -purple_input_get_error(int fd, int *error);
    -
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -/**
    - * Sets the UI operations structure to be used for accounts.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_eventloop_set_ui_ops(PurpleEventLoopUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure used for accounts.
    - *
    - * @return The UI operations structure in use.
    - */
    -PurpleEventLoopUiOps *purple_eventloop_get_ui_ops(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_EVENTLOOP_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ft.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,814 +0,0 @@
    -/**
    - * @file ft.h File Transfer API
    - * @ingroup core
    - * @see @ref xfer-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_FT_H_
    -#define _PURPLE_FT_H_
    -
    -/**************************************************************************/
    -/** Data Structures */
    -/**************************************************************************/
    -typedef struct _PurpleXfer PurpleXfer;
    -
    -#include <glib.h>
    -#include <stdio.h>
    -
    -#include "account.h"
    -
    -/**
    - * Types of file transfers.
    - */
    -typedef enum
    -{
    - PURPLE_XFER_UNKNOWN = 0, /**< Unknown file transfer type. */
    - PURPLE_XFER_SEND, /**< File sending. */
    - PURPLE_XFER_RECEIVE /**< File receiving. */
    -
    -} PurpleXferType;
    -
    -/**
    - * The different states of the xfer.
    - */
    -typedef enum
    -{
    - PURPLE_XFER_STATUS_UNKNOWN = 0, /**< Unknown, the xfer may be null. */
    - PURPLE_XFER_STATUS_NOT_STARTED, /**< It hasn't started yet. */
    - PURPLE_XFER_STATUS_ACCEPTED, /**< Receive accepted, but destination file not selected yet */
    - PURPLE_XFER_STATUS_STARTED, /**< purple_xfer_start has been called. */
    - PURPLE_XFER_STATUS_DONE, /**< The xfer completed successfully. */
    - PURPLE_XFER_STATUS_CANCEL_LOCAL, /**< The xfer was cancelled by us. */
    - PURPLE_XFER_STATUS_CANCEL_REMOTE /**< The xfer was cancelled by the other end, or we couldn't connect. */
    -} PurpleXferStatusType;
    -
    -/**
    - * File transfer UI operations.
    - *
    - * Any UI representing a file transfer must assign a filled-out
    - * PurpleXferUiOps structure to the purple_xfer.
    - */
    -typedef struct
    -{
    - void (*new_xfer)(PurpleXfer *xfer);
    - void (*destroy)(PurpleXfer *xfer);
    - void (*add_xfer)(PurpleXfer *xfer);
    - void (*update_progress)(PurpleXfer *xfer, double percent);
    - void (*cancel_local)(PurpleXfer *xfer);
    - void (*cancel_remote)(PurpleXfer *xfer);
    -
    - /**
    - * UI op to write data received from the prpl. The UI must deal with the
    - * entire buffer and return size, or it is treated as an error.
    - *
    - * @param xfer The file transfer structure
    - * @param buffer The buffer to write
    - * @param size The size of the buffer
    - *
    - * @return size if the write was successful, or a value between 0 and
    - * size on error.
    - * @since 2.6.0
    - */
    - gssize (*ui_write)(PurpleXfer *xfer, const guchar *buffer, gssize size);
    -
    - /**
    - * UI op to read data to send to the prpl for a file transfer.
    - *
    - * @param xfer The file transfer structure
    - * @param buffer A pointer to a buffer. The UI must allocate this buffer.
    - * libpurple will free the data.
    - * @param size The maximum amount of data to put in the buffer.
    - *
    - * @returns The amount of data in the buffer, 0 if nothing is available,
    - * and a negative value if an error occurred and the transfer
    - * should be cancelled (libpurple will cancel).
    - * @since 2.6.0
    - */
    - gssize (*ui_read)(PurpleXfer *xfer, guchar **buffer, gssize size);
    -
    - /**
    - * Op to notify the UI that not all the data read in was written. The UI
    - * should re-enqueue this data and return it the next time read is called.
    - *
    - * This MUST be implemented if read and write are implemented.
    - *
    - * @param xfer The file transfer structure
    - * @param buffer A pointer to the beginning of the unwritten data.
    - * @param size The amount of unwritten data.
    - *
    - * @since 2.6.0
    - */
    - void (*data_not_sent)(PurpleXfer *xfer, const guchar *buffer, gsize size);
    -
    - /**
    - * Op to create a thumbnail image for a file transfer
    - *
    - * @param xfer The file transfer structure
    - */
    - void (*add_thumbnail)(PurpleXfer *xfer, const gchar *formats);
    -} PurpleXferUiOps;
    -
    -/**
    - * A core representation of a file transfer.
    - */
    -struct _PurpleXfer
    -{
    - guint ref; /**< The reference count. */
    - PurpleXferType type; /**< The type of transfer. */
    -
    - PurpleAccount *account; /**< The account. */
    -
    - char *who; /**< The person on the other end of the
    - transfer. */
    -
    - char *message; /**< A message sent with the request */
    - char *filename; /**< The name sent over the network. */
    - char *local_filename; /**< The name on the local hard drive. */
    - size_t size; /**< The size of the file. */
    -
    - FILE *dest_fp; /**< The destination file pointer. */
    -
    - char *remote_ip; /**< The remote IP address. */
    - int local_port; /**< The local port. */
    - int remote_port; /**< The remote port. */
    -
    - int fd; /**< The socket file descriptor. */
    - int watcher; /**< Watcher. */
    -
    - size_t bytes_sent; /**< The number of bytes sent. */
    - size_t bytes_remaining; /**< The number of bytes remaining. */
    - time_t start_time; /**< When the transfer of data began. */
    - time_t end_time; /**< When the transfer of data ended. */
    -
    - size_t current_buffer_size; /**< This gradually increases for fast
    - network connections. */
    -
    - PurpleXferStatusType status; /**< File Transfer's status. */
    -
    - /** I/O operations, which should be set by the prpl using
    - * purple_xfer_set_init_fnc() and friends. Setting #init is
    - * mandatory; all others are optional.
    - */
    - struct
    - {
    - void (*init)(PurpleXfer *xfer);
    - void (*request_denied)(PurpleXfer *xfer);
    - void (*start)(PurpleXfer *xfer);
    - void (*end)(PurpleXfer *xfer);
    - void (*cancel_send)(PurpleXfer *xfer);
    - void (*cancel_recv)(PurpleXfer *xfer);
    - gssize (*read)(guchar **buffer, PurpleXfer *xfer);
    - gssize (*write)(const guchar *buffer, size_t size, PurpleXfer *xfer);
    - void (*ack)(PurpleXfer *xfer, const guchar *buffer, size_t size);
    - } ops;
    -
    - PurpleXferUiOps *ui_ops; /**< UI-specific operations. */
    - void *ui_data; /**< UI-specific data. */
    -
    - void *data; /**< prpl-specific data. */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name File Transfer API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new file transfer handle.
    - * This is called by prpls.
    - * The handle starts with a ref count of 1, and this reference
    - * is owned by the core. The prpl normally does not need to
    - * purple_xfer_ref or unref.
    - *
    - * @param account The account sending or receiving the file.
    - * @param type The type of file transfer.
    - * @param who The name of the remote user.
    - *
    - * @return A file transfer handle.
    - */
    -PurpleXfer *purple_xfer_new(PurpleAccount *account,
    - PurpleXferType type, const char *who);
    -
    -/**
    - * Returns all xfers
    - *
    - * @return all current xfers with refs
    - */
    -GList *purple_xfers_get_all(void);
    -
    -/**
    - * Increases the reference count on a PurpleXfer.
    - * Please call purple_xfer_unref later.
    - *
    - * @param xfer A file transfer handle.
    - */
    -void purple_xfer_ref(PurpleXfer *xfer);
    -
    -/**
    - * Decreases the reference count on a PurpleXfer.
    - * If the reference reaches 0, purple_xfer_destroy (an internal function)
    - * will destroy the xfer. It calls the ui destroy cb first.
    - * Since the core keeps a ref on the xfer, only an erroneous call to
    - * this function will destroy the xfer while still in use.
    - *
    - * @param xfer A file transfer handle.
    - */
    -void purple_xfer_unref(PurpleXfer *xfer);
    -
    -/**
    - * Requests confirmation for a file transfer from the user. If receiving
    - * a file which is known at this point, this requests user to accept and
    - * save the file. If the filename is unknown (not set) this only requests user
    - * to accept the file transfer. In this case protocol must call this function
    - * again once the filename is available.
    - *
    - * @param xfer The file transfer to request confirmation on.
    - */
    -void purple_xfer_request(PurpleXfer *xfer);
    -
    -/**
    - * Called if the user accepts the file transfer request.
    - *
    - * @param xfer The file transfer.
    - * @param filename The filename.
    - */
    -void purple_xfer_request_accepted(PurpleXfer *xfer, const char *filename);
    -
    -/**
    - * Called if the user rejects the file transfer request.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_request_denied(PurpleXfer *xfer);
    -
    -/**
    - * Returns the type of file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The type of the file transfer.
    - */
    -PurpleXferType purple_xfer_get_type(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the account the file transfer is using.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The account.
    - */
    -PurpleAccount *purple_xfer_get_account(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the name of the remote user.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The name of the remote user.
    - *
    - * @since 2.1.0
    - */
    -const char *purple_xfer_get_remote_user(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the status of the xfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The status.
    - */
    -PurpleXferStatusType purple_xfer_get_status(const PurpleXfer *xfer);
    -
    -/**
    - * Returns true if the file transfer was cancelled.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return Whether or not the transfer was cancelled.
    - * FIXME: This should be renamed using cancelled for 3.0.0.
    - */
    -gboolean purple_xfer_is_canceled(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the completed state for a file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The completed state.
    - */
    -gboolean purple_xfer_is_completed(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the name of the file being sent or received.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The filename.
    - */
    -const char *purple_xfer_get_filename(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the file's destination filename,
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The destination filename.
    - */
    -const char *purple_xfer_get_local_filename(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the number of bytes sent (or received) so far.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The number of bytes sent.
    - */
    -size_t purple_xfer_get_bytes_sent(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the number of bytes remaining to send or receive.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The number of bytes remaining.
    - */
    -size_t purple_xfer_get_bytes_remaining(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the size of the file being sent or received.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The total size of the file.
    - */
    -size_t purple_xfer_get_size(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the current percentage of progress of the transfer.
    - *
    - * This is a number between 0 (0%) and 1 (100%).
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The percentage complete.
    - */
    -double purple_xfer_get_progress(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the local port number in the file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The port number on this end.
    - */
    -unsigned int purple_xfer_get_local_port(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the remote IP address in the file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The IP address on the other end.
    - */
    -const char *purple_xfer_get_remote_ip(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the remote port number in the file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The port number on the other end.
    - */
    -unsigned int purple_xfer_get_remote_port(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the time the transfer of a file started.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The time when the transfer started.
    - * @since 2.4.0
    - */
    -time_t purple_xfer_get_start_time(const PurpleXfer *xfer);
    -
    -/**
    - * Returns the time the transfer of a file ended.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The time when the transfer ended.
    - * @since 2.4.0
    - */
    -time_t purple_xfer_get_end_time(const PurpleXfer *xfer);
    -
    -/**
    - * Sets the completed state for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param completed The completed state.
    - */
    -void purple_xfer_set_completed(PurpleXfer *xfer, gboolean completed);
    -
    -/**
    - * Sets the filename for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param message The message.
    - */
    -void purple_xfer_set_message(PurpleXfer *xfer, const char *message);
    -
    -/**
    - * Sets the filename for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param filename The filename.
    - */
    -void purple_xfer_set_filename(PurpleXfer *xfer, const char *filename);
    -
    -/**
    - * Sets the local filename for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param filename The filename
    - */
    -void purple_xfer_set_local_filename(PurpleXfer *xfer, const char *filename);
    -
    -/**
    - * Sets the size of the file in a file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param size The size of the file.
    - */
    -void purple_xfer_set_size(PurpleXfer *xfer, size_t size);
    -
    -/**
    - * Sets the current working position in the active file transfer. This
    - * can be used to jump backward in the file if the protocol detects
    - * that some bit of data needs to be resent or has been sent twice.
    - *
    - * It's used for pausing and resuming an oscar file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param bytes_sent The new current position in the file. If we're
    - * sending a file then this is the byte that we will
    - * send. If we're receiving a file, this is the
    - * next byte that we expect to receive.
    - */
    -void purple_xfer_set_bytes_sent(PurpleXfer *xfer, size_t bytes_sent);
    -
    -/**
    - * Returns the UI operations structure for a file transfer.
    - *
    - * @param xfer The file transfer.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleXferUiOps *purple_xfer_get_ui_ops(const PurpleXfer *xfer);
    -
    -/**
    - * Sets the read function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The read function.
    - */
    -void purple_xfer_set_read_fnc(PurpleXfer *xfer,
    - gssize (*fnc)(guchar **, PurpleXfer *));
    -
    -/**
    - * Sets the write function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The write function.
    - */
    -void purple_xfer_set_write_fnc(PurpleXfer *xfer,
    - gssize (*fnc)(const guchar *, size_t, PurpleXfer *));
    -
    -/**
    - * Sets the acknowledge function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The acknowledge function.
    - */
    -void purple_xfer_set_ack_fnc(PurpleXfer *xfer,
    - void (*fnc)(PurpleXfer *, const guchar *, size_t));
    -
    -/**
    - * Sets the function to be called if the request is denied.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The request denied prpl callback.
    - */
    -void purple_xfer_set_request_denied_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Sets the transfer initialization function for the file transfer.
    - *
    - * This function is required, and must call purple_xfer_start() with
    - * the necessary parameters. This will be called if the file transfer
    - * is accepted by the user.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The transfer initialization function.
    - */
    -void purple_xfer_set_init_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Sets the start transfer function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The start transfer function.
    - */
    -void purple_xfer_set_start_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Sets the end transfer function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The end transfer function.
    - */
    -void purple_xfer_set_end_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Sets the cancel send function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The cancel send function.
    - */
    -void purple_xfer_set_cancel_send_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Sets the cancel receive function for the file transfer.
    - *
    - * @param xfer The file transfer.
    - * @param fnc The cancel receive function.
    - */
    -void purple_xfer_set_cancel_recv_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    -
    -/**
    - * Reads in data from a file transfer stream.
    - *
    - * @param xfer The file transfer.
    - * @param buffer The buffer that will be created to contain the data.
    - *
    - * @return The number of bytes read, or -1.
    - */
    -gssize purple_xfer_read(PurpleXfer *xfer, guchar **buffer);
    -
    -/**
    - * Writes data to a file transfer stream.
    - *
    - * @param xfer The file transfer.
    - * @param buffer The buffer to read the data from.
    - * @param size The number of bytes to write.
    - *
    - * @return The number of bytes written, or -1.
    - */
    -gssize purple_xfer_write(PurpleXfer *xfer, const guchar *buffer, gsize size);
    -
    -/**
    - * Writes chunk of received file.
    - *
    - * @param xfer The file transfer.
    - * @param buffer The buffer to read the data from.
    - * @param size The number of bytes to write.
    - *
    - * @return TRUE on success, FALSE otherwise.
    - *
    - * @since 2.11.0
    - */
    -gboolean
    -purple_xfer_write_file(PurpleXfer *xfer, const guchar *buffer, gsize size);
    -
    -/**
    - * Writes chunk of file being sent.
    - *
    - * @param xfer The file transfer.
    - * @param buffer The buffer to write the data to.
    - * @param size The size of buffer.
    - *
    - * @return Number of bytes written (0 means, the device is busy), or -1 on
    - * failure.
    - *
    - * @since 2.11.0
    - */
    -gssize
    -purple_xfer_read_file(PurpleXfer *xfer, guchar *buffer, gsize size);
    -
    -/**
    - * Starts a file transfer.
    - *
    - * Either @a fd must be specified <i>or</i> @a ip and @a port on a
    - * file receive transfer. On send, @a fd must be specified, and
    - * @a ip and @a port are ignored.
    - *
    - * Prior to libpurple 2.6.0, passing '0' to @a fd was special-cased to
    - * allow the protocol plugin to facilitate the file transfer itself. As of
    - * 2.6.0, this is supported (for backward compatibility), but will be
    - * removed in libpurple 3.0.0. If a prpl detects that the running libpurple
    - * is running 2.6.0 or higher, it should use the invalid fd '-1'.
    - *
    - * @param xfer The file transfer.
    - * @param fd The file descriptor for the socket.
    - * @param ip The IP address to connect to.
    - * @param port The port to connect to.
    - */
    -void purple_xfer_start(PurpleXfer *xfer, int fd, const char *ip,
    - unsigned int port);
    -
    -/**
    - * Ends a file transfer.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_end(PurpleXfer *xfer);
    -
    -/**
    - * Adds a new file transfer to the list of file transfers. Call this only
    - * if you are not using purple_xfer_start.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_add(PurpleXfer *xfer);
    -
    -/**
    - * Cancels a file transfer on the local end.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_cancel_local(PurpleXfer *xfer);
    -
    -/**
    - * Cancels a file transfer from the remote end.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_cancel_remote(PurpleXfer *xfer);
    -
    -/**
    - * Displays a file transfer-related error message.
    - *
    - * This is a wrapper around purple_notify_error(), which automatically
    - * specifies a title ("File transfer to <i>user</i> failed" or
    - * "File Transfer from <i>user</i> failed").
    - *
    - * @param type The type of file transfer.
    - * @param account The account sending or receiving the file.
    - * @param who The user on the other end of the transfer.
    - * @param msg The message to display.
    - */
    -void purple_xfer_error(PurpleXferType type, PurpleAccount *account, const char *who, const char *msg);
    -
    -/**
    - * Updates file transfer progress.
    - *
    - * @param xfer The file transfer.
    - */
    -void purple_xfer_update_progress(PurpleXfer *xfer);
    -
    -/**
    - * Displays a file transfer-related message in the conversation window
    - *
    - * This is a wrapper around purple_conversation_write
    - *
    - * @param xfer The file transfer to which this message relates.
    - * @param message The message to display.
    - * @param is_error Is this an error message?.
    - */
    -void purple_xfer_conversation_write(PurpleXfer *xfer, char *message, gboolean is_error);
    -
    -/**
    - * Allows the UI to signal it's ready to send/receive data (depending on
    - * the direction of the file transfer. Used when the UI is providing
    - * read/write/data_not_sent UI ops.
    - *
    - * @param xfer The file transfer which is ready.
    - *
    - * @since 2.6.0
    - */
    -void purple_xfer_ui_ready(PurpleXfer *xfer);
    -
    -/**
    - * Allows the prpl to signal it's ready to send/receive data (depending on
    - * the direction of the file transfer. Used when the prpl provides read/write
    - * ops and cannot/does not provide a raw fd to the core.
    - *
    - * @param xfer The file transfer which is ready.
    - *
    - * @since 2.6.0
    - */
    -void purple_xfer_prpl_ready(PurpleXfer *xfer);
    -
    -/**
    - * Gets the thumbnail data for a transfer
    - *
    - * @param xfer The file transfer to get the thumbnail for
    - * @param len If not @c NULL, the length of the thumbnail data returned
    - * will be set in the location pointed to by this.
    - * @return The thumbnail data, or NULL if there is no thumbnail
    - * @since 2.7.0
    - */
    -gconstpointer purple_xfer_get_thumbnail(const PurpleXfer *xfer, gsize *len);
    -
    -/**
    - * Gets the mimetype of the thumbnail preview for a transfer
    - *
    - * @param xfer The file transfer to get the mimetype for
    - * @return The mimetype of the thumbnail, or @c NULL if not thumbnail is set
    - * @since 2.7.0
    - */
    -const gchar *purple_xfer_get_thumbnail_mimetype(const PurpleXfer *xfer);
    -
    -
    -/**
    - * Sets the thumbnail data for a transfer
    - *
    - * @param xfer The file transfer to set the data for
    - * @param thumbnail A pointer to the thumbnail data, this will be copied
    - * @param size The size in bytes of the passed in thumbnail data
    - * @param mimetype The mimetype of the generated thumbnail
    - * @since 2.7.0
    - */
    -void purple_xfer_set_thumbnail(PurpleXfer *xfer, gconstpointer thumbnail,
    - gsize size, const gchar *mimetype);
    -
    -/**
    - * Prepare a thumbnail for a transfer (if the UI supports it)
    - * will be no-op in case the UI doesn't implement thumbnail creation
    - *
    - * @param xfer The file transfer to create a thumbnail for
    - * @param formats A comma-separated list of mimetypes for image formats
    - * the protocols can use for thumbnails.
    - * @since 2.7.0
    - */
    -void purple_xfer_prepare_thumbnail(PurpleXfer *xfer, const gchar *formats);
    -
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the handle to the file transfer subsystem
    - *
    - * @return The handle
    - */
    -void *purple_xfers_get_handle(void);
    -
    -/**
    - * Initializes the file transfer subsystem
    - */
    -void purple_xfers_init(void);
    -
    -/**
    - * Uninitializes the file transfer subsystem
    - */
    -void purple_xfers_uninit(void);
    -
    -/**
    - * Sets the UI operations structure to be used in all purple file transfers.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_xfers_set_ui_ops(PurpleXferUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used in all purple file transfers.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleXferUiOps *purple_xfers_get_ui_ops(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_FT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/gaim-compat.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,2317 +0,0 @@
    -/**
    - * @file gaim-compat.h Gaim Compat macros
    - * @ingroup core
    - */
    -
    -/* pidgin
    - *
    - * Pidgin 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
    - */
    -#ifndef _GAIM_COMPAT_H_
    -#define _GAIM_COMPAT_H_
    -
    -#include <glib.h>
    -
    -/* from account.h */
    -#define GaimAccountUiOps PurpleAccountUiOps
    -#define GaimAccount PurpleAccount
    -
    -#define GaimFilterAccountFunc PurpleFilterAccountFunc
    -#define GaimAccountRequestAuthorizationCb PurpleAccountRequestAuthorizationCb
    -
    -#define gaim_account_new purple_account_new
    -#define gaim_account_destroy purple_account_destroy
    -#define gaim_account_connect purple_account_connect
    -#define gaim_account_register purple_account_register
    -#define gaim_account_disconnect purple_account_disconnect
    -#define gaim_account_notify_added purple_account_notify_added
    -#define gaim_account_request_add purple_account_request_add
    -#define gaim_account_request_close purple_account_request_close
    -
    -#define gaim_account_request_authorization purple_account_request_authorization
    -#define gaim_account_request_change_password purple_account_request_change_password
    -#define gaim_account_request_change_user_info purple_account_request_change_user_info
    -
    -#define gaim_account_set_username purple_account_set_username
    -#define gaim_account_set_password purple_account_set_password
    -#define gaim_account_set_alias purple_account_set_alias
    -#define gaim_account_set_user_info purple_account_set_user_info
    -#define gaim_account_set_buddy_icon_path purple_account_set_buddy_icon_path
    -#define gaim_account_set_protocol_id purple_account_set_protocol_id
    -#define gaim_account_set_connection purple_account_set_connection
    -#define gaim_account_set_remember_password purple_account_set_remember_password
    -#define gaim_account_set_check_mail purple_account_set_check_mail
    -#define gaim_account_set_enabled purple_account_set_enabled
    -#define gaim_account_set_proxy_info purple_account_set_proxy_info
    -#define gaim_account_set_status_types purple_account_set_status_types
    -#define gaim_account_set_status purple_account_set_status
    -#define gaim_account_set_status_list purple_account_set_status_list
    -
    -#define gaim_account_clear_settings purple_account_clear_settings
    -
    -#define gaim_account_set_int purple_account_set_int
    -#define gaim_account_set_string purple_account_set_string
    -#define gaim_account_set_bool purple_account_set_bool
    -
    -#define gaim_account_set_ui_int purple_account_set_ui_int
    -#define gaim_account_set_ui_string purple_account_set_ui_string
    -#define gaim_account_set_ui_bool purple_account_set_ui_bool
    -
    -#define gaim_account_is_connected purple_account_is_connected
    -#define gaim_account_is_connecting purple_account_is_connecting
    -#define gaim_account_is_disconnected purple_account_is_disconnected
    -
    -#define gaim_account_get_username purple_account_get_username
    -#define gaim_account_get_password purple_account_get_password
    -#define gaim_account_get_alias purple_account_get_alias
    -#define gaim_account_get_user_info purple_account_get_user_info
    -#define gaim_account_get_buddy_icon_path purple_account_get_buddy_icon_path
    -#define gaim_account_get_protocol_id purple_account_get_protocol_id
    -#define gaim_account_get_protocol_name purple_account_get_protocol_name
    -#define gaim_account_get_connection purple_account_get_connection
    -#define gaim_account_get_remember_password purple_account_get_remember_password
    -#define gaim_account_get_check_mail purple_account_get_check_mail
    -#define gaim_account_get_enabled purple_account_get_enabled
    -#define gaim_account_get_proxy_info purple_account_get_proxy_info
    -#define gaim_account_get_active_status purple_account_get_active_status
    -#define gaim_account_get_status purple_account_get_status
    -#define gaim_account_get_status_type purple_account_get_status_type
    -#define gaim_account_get_status_type_with_primitive \
    - purple_account_get_status_type_with_primitive
    -
    -#define gaim_account_get_presence purple_account_get_presence
    -#define gaim_account_is_status_active purple_account_is_status_active
    -#define gaim_account_get_status_types purple_account_get_status_types
    -
    -#define gaim_account_get_int purple_account_get_int
    -#define gaim_account_get_string purple_account_get_string
    -#define gaim_account_get_bool purple_account_get_bool
    -
    -#define gaim_account_get_ui_int purple_account_get_ui_int
    -#define gaim_account_get_ui_string purple_account_get_ui_string
    -#define gaim_account_get_ui_bool purple_account_get_ui_bool
    -
    -
    -#define gaim_account_get_log purple_account_get_log
    -#define gaim_account_destroy_log purple_account_destroy_log
    -
    -#define gaim_account_add_buddy purple_account_add_buddy
    -#define gaim_account_add_buddies purple_account_add_buddies
    -#define gaim_account_remove_buddy purple_account_remove_buddy
    -#define gaim_account_remove_buddies purple_account_remove_buddies
    -
    -#define gaim_account_remove_group purple_account_remove_group
    -
    -#define gaim_account_change_password purple_account_change_password
    -
    -#define gaim_account_supports_offline_message purple_account_supports_offline_message
    -
    -#define gaim_accounts_add purple_accounts_add
    -#define gaim_accounts_remove purple_accounts_remove
    -#define gaim_accounts_delete purple_accounts_delete
    -#define gaim_accounts_reorder purple_accounts_reorder
    -
    -#define gaim_accounts_get_all purple_accounts_get_all
    -#define gaim_accounts_get_all_active purple_accounts_get_all_active
    -
    -#define gaim_accounts_find purple_accounts_find
    -
    -#define gaim_accounts_restore_current_statuses purple_accounts_restore_current_statuses
    -
    -#define gaim_accounts_set_ui_ops purple_accounts_set_ui_ops
    -#define gaim_accounts_get_ui_ops purple_accounts_get_ui_ops
    -
    -#define gaim_accounts_get_handle purple_accounts_get_handle
    -
    -#define gaim_accounts_init purple_accounts_init
    -#define gaim_accounts_uninit purple_accounts_uninit
    -
    -/* from accountopt.h */
    -
    -#define GaimAccountOption PurpleAccountOption
    -#define GaimAccountUserSplit PurpleAccountUserSplit
    -
    -#define gaim_account_option_new purple_account_option_new
    -#define gaim_account_option_bool_new purple_account_option_bool_new
    -#define gaim_account_option_int_new purple_account_option_int_new
    -#define gaim_account_option_string_new purple_account_option_string_new
    -#define gaim_account_option_list_new purple_account_option_list_new
    -
    -#define gaim_account_option_destroy purple_account_option_destroy
    -
    -#define gaim_account_option_set_default_bool purple_account_option_set_default_bool
    -#define gaim_account_option_set_default_int purple_account_option_set_default_int
    -#define gaim_account_option_set_default_string purple_account_option_set_default_string
    -
    -#define gaim_account_option_set_masked purple_account_option_set_masked
    -
    -#define gaim_account_option_set_list purple_account_option_set_list
    -
    -#define gaim_account_option_add_list_item purple_account_option_add_list_item
    -
    -#define gaim_account_option_get_type purple_account_option_get_type
    -#define gaim_account_option_get_text purple_account_option_get_text
    -#define gaim_account_option_get_setting purple_account_option_get_setting
    -
    -#define gaim_account_option_get_default_bool purple_account_option_get_default_bool
    -#define gaim_account_option_get_default_int purple_account_option_get_default_int
    -#define gaim_account_option_get_default_string purple_account_option_get_default_string
    -#define gaim_account_option_get_default_list_value purple_account_option_get_default_list_value
    -
    -#define gaim_account_option_get_masked purple_account_option_get_masked
    -#define gaim_account_option_get_list purple_account_option_get_list
    -
    -#define gaim_account_user_split_new purple_account_user_split_new
    -#define gaim_account_user_split_destroy purple_account_user_split_destroy
    -
    -#define gaim_account_user_split_get_text purple_account_user_split_get_text
    -#define gaim_account_user_split_get_default_value purple_account_user_split_get_default_value
    -#define gaim_account_user_split_get_separator purple_account_user_split_get_separator
    -
    -/* from blist.h */
    -
    -#define GaimBuddyList PurpleBuddyList
    -#define GaimBlistUiOps PurpleBlistUiOps
    -#define GaimBlistNode PurpleBlistNode
    -
    -#define GaimChat PurpleChat
    -#define GaimGroup PurpleGroup
    -#define GaimContact PurpleContact
    -#define GaimBuddy PurpleBuddy
    -
    -#define GAIM_BLIST_GROUP_NODE PURPLE_BLIST_GROUP_NODE
    -#define GAIM_BLIST_CONTACT_NODE PURPLE_BLIST_CONTACT_NODE
    -#define GAIM_BLIST_BUDDY_NODE PURPLE_BLIST_BUDDY_NODE
    -#define GAIM_BLIST_CHAT_NODE PURPLE_BLIST_CHAT_NODE
    -#define GAIM_BLIST_OTHER_NODE PURPLE_BLIST_OTHER_NODE
    -#define GaimBlistNodeType PurpleBlistNodeType
    -
    -#define GAIM_BLIST_NODE_IS_CHAT PURPLE_BLIST_NODE_IS_CHAT
    -#define GAIM_BLIST_NODE_IS_BUDDY PURPLE_BLIST_NODE_IS_BUDDY
    -#define GAIM_BLIST_NODE_IS_CONTACT PURPLE_BLIST_NODE_IS_CONTACT
    -#define GAIM_BLIST_NODE_IS_GROUP PURPLE_BLIST_NODE_IS_GROUP
    -
    -#define GAIM_BUDDY_IS_ONLINE PURPLE_BUDDY_IS_ONLINE
    -
    -#define GAIM_BLIST_NODE_FLAG_NO_SAVE PURPLE_BLIST_NODE_FLAG_NO_SAVE
    -#define GaimBlistNodeFlags PurpleBlistNodeFlags
    -
    -#define GAIM_BLIST_NODE_HAS_FLAG PURPLE_BLIST_NODE_HAS_FLAG
    -#define GAIM_BLIST_NODE_SHOULD_SAVE PURPLE_BLIST_NODE_SHOULD_SAVE
    -
    -#define GAIM_BLIST_NODE_NAME PURPLE_BLIST_NODE_NAME
    -
    -
    -#define gaim_blist_new purple_blist_new
    -#define gaim_set_blist purple_set_blist
    -#define gaim_get_blist purple_get_blist
    -
    -#define gaim_blist_get_root purple_blist_get_root
    -#define gaim_blist_node_next purple_blist_node_next
    -
    -#define gaim_blist_show purple_blist_show
    -
    -#define gaim_blist_destroy purple_blist_destroy
    -
    -#define gaim_blist_set_visible purple_blist_set_visible
    -
    -#define gaim_blist_update_buddy_status purple_blist_update_buddy_status
    -#define gaim_blist_update_buddy_icon purple_blist_update_buddy_icon
    -
    -
    -#define gaim_blist_alias_contact purple_blist_alias_contact
    -#define gaim_blist_alias_buddy purple_blist_alias_buddy
    -#define gaim_blist_server_alias_buddy purple_blist_server_alias_buddy
    -#define gaim_blist_alias_chat purple_blist_alias_chat
    -
    -#define gaim_blist_rename_buddy purple_blist_rename_buddy
    -#define gaim_blist_rename_group purple_blist_rename_group
    -
    -#define gaim_chat_new purple_chat_new
    -#define gaim_blist_add_chat purple_blist_add_chat
    -
    -#define gaim_buddy_new purple_buddy_new
    -#define gaim_buddy_set_icon purple_buddy_set_icon
    -#define gaim_buddy_get_account purple_buddy_get_account
    -#define gaim_buddy_get_name purple_buddy_get_name
    -#define gaim_buddy_get_icon purple_buddy_get_icon
    -#define gaim_buddy_get_contact purple_buddy_get_contact
    -#define gaim_buddy_get_presence purple_buddy_get_presence
    -
    -#define gaim_blist_add_buddy purple_blist_add_buddy
    -
    -#define gaim_group_new purple_group_new
    -
    -#define gaim_blist_add_group purple_blist_add_group
    -
    -#define gaim_contact_new purple_contact_new
    -
    -#define gaim_blist_add_contact purple_blist_add_contact
    -#define gaim_blist_merge_contact purple_blist_merge_contact
    -
    -#define gaim_contact_get_priority_buddy purple_contact_get_priority_buddy
    -#define gaim_contact_set_alias purple_contact_set_alias
    -#define gaim_contact_get_alias purple_contact_get_alias
    -#define gaim_contact_on_account purple_contact_on_account
    -
    -#define gaim_contact_invalidate_priority_buddy purple_contact_invalidate_priority_buddy
    -
    -#define gaim_blist_remove_buddy purple_blist_remove_buddy
    -#define gaim_blist_remove_contact purple_blist_remove_contact
    -#define gaim_blist_remove_chat purple_blist_remove_chat
    -#define gaim_blist_remove_group purple_blist_remove_group
    -
    -#define gaim_buddy_get_alias_only purple_buddy_get_alias_only
    -#define gaim_buddy_get_server_alias purple_buddy_get_server_alias
    -#define gaim_buddy_get_contact_alias purple_buddy_get_contact_alias
    -#define gaim_buddy_get_local_alias purple_buddy_get_local_alias
    -#define gaim_buddy_get_alias purple_buddy_get_alias
    -
    -#define gaim_chat_get_name purple_chat_get_name
    -
    -#define gaim_find_buddy purple_find_buddy
    -#define gaim_find_buddy_in_group purple_find_buddy_in_group
    -#define gaim_find_buddies purple_find_buddies
    -
    -#define gaim_find_group purple_find_group
    -
    -#define gaim_blist_find_chat purple_blist_find_chat
    -
    -#define gaim_chat_get_group purple_chat_get_group
    -#define gaim_buddy_get_group purple_buddy_get_group
    -
    -#define gaim_group_get_accounts purple_group_get_accounts
    -#define gaim_group_on_account purple_group_on_account
    -
    -#define gaim_blist_add_account purple_blist_add_account
    -#define gaim_blist_remove_account purple_blist_remove_account
    -
    -#define gaim_blist_get_group_size purple_blist_get_group_size
    -#define gaim_blist_get_group_online_count purple_blist_get_group_online_count
    -
    -#define gaim_blist_load purple_blist_load
    -#define gaim_blist_schedule_save purple_blist_schedule_save
    -
    -#define gaim_blist_request_add_buddy purple_blist_request_add_buddy
    -#define gaim_blist_request_add_chat purple_blist_request_add_chat
    -#define gaim_blist_request_add_group purple_blist_request_add_group
    -
    -#define gaim_blist_node_set_bool purple_blist_node_set_bool
    -#define gaim_blist_node_get_bool purple_blist_node_get_bool
    -#define gaim_blist_node_set_int purple_blist_node_set_int
    -#define gaim_blist_node_get_int purple_blist_node_get_int
    -#define gaim_blist_node_set_string purple_blist_node_set_string
    -#define gaim_blist_node_get_string purple_blist_node_get_string
    -
    -#define gaim_blist_node_remove_setting purple_blist_node_remove_setting
    -
    -#define gaim_blist_node_set_flags purple_blist_node_set_flags
    -#define gaim_blist_node_get_flags purple_blist_node_get_flags
    -
    -#define gaim_blist_node_get_extended_menu purple_blist_node_get_extended_menu
    -
    -#define gaim_blist_set_ui_ops purple_blist_set_ui_ops
    -#define gaim_blist_get_ui_ops purple_blist_get_ui_ops
    -
    -#define gaim_blist_get_handle purple_blist_get_handle
    -
    -#define gaim_blist_init purple_blist_init
    -#define gaim_blist_uninit purple_blist_uninit
    -
    -
    -#define GaimBuddyIcon PurpleBuddyIcon
    -
    -#define gaim_buddy_icon_new(account, username, icon_data, icon_len)\
    - purple_buddy_icon_new(account, username, g_memdup(icon_data, icon_len), icon_len)
    -#define gaim_buddy_icon_ref purple_buddy_icon_ref
    -#define gaim_buddy_icon_unref purple_buddy_icon_unref
    -#define gaim_buddy_icon_update purple_buddy_icon_update
    -
    -#define gaim_buddy_icon_set_data(icon, data, len) \
    - purple_buddy_icon_set_data(icon, g_memdup(data, len), len, NULL);
    -
    -#define gaim_buddy_icon_get_account purple_buddy_icon_get_account
    -#define gaim_buddy_icon_get_username purple_buddy_icon_get_username
    -#define gaim_buddy_icon_get_data purple_buddy_icon_get_data
    -#define gaim_buddy_icon_get_type purple_buddy_icon_get_extension
    -
    -#define gaim_buddy_icons_set_for_user(icon, data, len) \
    - purple_buddy_icons_set_for_user(icon, g_memdup(data, len), len, NULL)
    -#define gaim_buddy_icons_set_caching purple_buddy_icons_set_caching
    -#define gaim_buddy_icons_is_caching purple_buddy_icons_is_caching
    -#define gaim_buddy_icons_set_cache_dir purple_buddy_icons_set_cache_dir
    -#define gaim_buddy_icons_get_cache_dir purple_buddy_icons_get_cache_dir
    -#define gaim_buddy_icons_get_handle purple_buddy_icons_get_handle
    -
    -#define gaim_buddy_icons_init purple_buddy_icons_init
    -#define gaim_buddy_icons_uninit purple_buddy_icons_uninit
    -
    -#define gaim_buddy_icon_get_scale_size purple_buddy_icon_get_scale_size
    -
    -/* from cipher.h */
    -
    -#define GAIM_CIPHER PURPLE_CIPHER
    -#define GAIM_CIPHER_OPS PURPLE_CIPHER_OPS
    -#define GAIM_CIPHER_CONTEXT PURPLE_CIPHER_CONTEXT
    -
    -#define GaimCipher PurpleCipher
    -#define GaimCipherOps PurpleCipherOps
    -#define GaimCipherContext PurpleCipherContext
    -
    -#define GAIM_CIPHER_CAPS_SET_OPT PURPLE_CIPHER_CAPS_SET_OPT
    -#define GAIM_CIPHER_CAPS_GET_OPT PURPLE_CIPHER_CAPS_GET_OPT
    -#define GAIM_CIPHER_CAPS_INIT PURPLE_CIPHER_CAPS_INIT
    -#define GAIM_CIPHER_CAPS_RESET PURPLE_CIPHER_CAPS_RESET
    -#define GAIM_CIPHER_CAPS_UNINIT PURPLE_CIPHER_CAPS_UNINIT
    -#define GAIM_CIPHER_CAPS_SET_IV PURPLE_CIPHER_CAPS_SET_IV
    -#define GAIM_CIPHER_CAPS_APPEND PURPLE_CIPHER_CAPS_APPEND
    -#define GAIM_CIPHER_CAPS_DIGEST PURPLE_CIPHER_CAPS_DIGEST
    -#define GAIM_CIPHER_CAPS_ENCRYPT PURPLE_CIPHER_CAPS_ENCRYPT
    -#define GAIM_CIPHER_CAPS_DECRYPT PURPLE_CIPHER_CAPS_DECRYPT
    -#define GAIM_CIPHER_CAPS_SET_SALT PURPLE_CIPHER_CAPS_SET_SALT
    -#define GAIM_CIPHER_CAPS_GET_SALT_SIZE PURPLE_CIPHER_CAPS_GET_SALT_SIZE
    -#define GAIM_CIPHER_CAPS_SET_KEY PURPLE_CIPHER_CAPS_SET_KEY
    -#define GAIM_CIPHER_CAPS_GET_KEY_SIZE PURPLE_CIPHER_CAPS_GET_KEY_SIZE
    -#define GAIM_CIPHER_CAPS_UNKNOWN PURPLE_CIPHER_CAPS_UNKNOWN
    -
    -#define gaim_cipher_get_name purple_cipher_get_name
    -#define gaim_cipher_get_capabilities purple_cipher_get_capabilities
    -#define gaim_cipher_digest_region purple_cipher_digest_region
    -
    -#define gaim_ciphers_find_cipher purple_ciphers_find_cipher
    -#define gaim_ciphers_register_cipher purple_ciphers_register_cipher
    -#define gaim_ciphers_unregister_cipher purple_ciphers_unregister_cipher
    -#define gaim_ciphers_get_ciphers purple_ciphers_get_ciphers
    -
    -#define gaim_ciphers_get_handle purple_ciphers_get_handle
    -#define gaim_ciphers_init purple_ciphers_init
    -#define gaim_ciphers_uninit purple_ciphers_uninit
    -
    -#define gaim_cipher_context_set_option purple_cipher_context_set_option
    -#define gaim_cipher_context_get_option purple_cipher_context_get_option
    -
    -#define gaim_cipher_context_new purple_cipher_context_new
    -#define gaim_cipher_context_new_by_name purple_cipher_context_new_by_name
    -#define gaim_cipher_context_reset purple_cipher_context_reset
    -#define gaim_cipher_context_destroy purple_cipher_context_destroy
    -#define gaim_cipher_context_set_iv purple_cipher_context_set_iv
    -#define gaim_cipher_context_append purple_cipher_context_append
    -#define gaim_cipher_context_digest purple_cipher_context_digest
    -#define gaim_cipher_context_digest_to_str purple_cipher_context_digest_to_str
    -#define gaim_cipher_context_encrypt purple_cipher_context_encrypt
    -#define gaim_cipher_context_decrypt purple_cipher_context_decrypt
    -#define gaim_cipher_context_set_salt purple_cipher_context_set_salt
    -#define gaim_cipher_context_get_salt_size purple_cipher_context_get_salt_size
    -#define gaim_cipher_context_set_key purple_cipher_context_set_key
    -#define gaim_cipher_context_get_key_size purple_cipher_context_get_key_size
    -#define gaim_cipher_context_set_data purple_cipher_context_set_data
    -#define gaim_cipher_context_get_data purple_cipher_context_get_data
    -
    -#define gaim_cipher_http_digest_calculate_session_key \
    - purple_cipher_http_digest_calculate_session_key
    -
    -#define gaim_cipher_http_digest_calculate_response \
    - purple_cipher_http_digest_calculate_response
    -
    -/* from circbuffer.h */
    -
    -#define GaimCircBuffer PurpleCircBuffer
    -
    -#define gaim_circ_buffer_new purple_circ_buffer_new
    -#define gaim_circ_buffer_destroy purple_circ_buffer_destroy
    -#define gaim_circ_buffer_append purple_circ_buffer_append
    -#define gaim_circ_buffer_get_max_read purple_circ_buffer_get_max_read
    -#define gaim_circ_buffer_mark_read purple_circ_buffer_mark_read
    -
    -/* from cmds.h */
    -
    -#define GaimCmdPriority PurpleCmdPriority
    -#define GaimCmdFlag PurpleCmdFlag
    -#define GaimCmdStatus PurpleCmdStatus
    -#define GaimCmdRet PurpleCmdRet
    -
    -#define GAIM_CMD_STATUS_OK PURPLE_CMD_STATUS_OK
    -#define GAIM_CMD_STATUS_FAILED PURPLE_CMD_STATUS_FAILED
    -#define GAIM_CMD_STATUS_NOT_FOUND PURPLE_CMD_STATUS_NOT_FOUND
    -#define GAIM_CMD_STATUS_WRONG_ARGS PURPLE_CMD_STATUS_WRONG_ARGS
    -#define GAIM_CMD_STATUS_WRONG_PRPL PURPLE_CMD_STATUS_WRONG_PRPL
    -#define GAIM_CMD_STATUS_WRONG_TYPE PURPLE_CMD_STATUS_WRONG_TYPE
    -
    -#define GAIM_CMD_FUNC PURPLE_CMD_FUNC
    -
    -#define GAIM_CMD_RET_OK PURPLE_CMD_RET_OK
    -#define GAIM_CMD_RET_FAILED PURPLE_CMD_RET_FAILED
    -#define GAIM_CMD_RET_CONTINUE PURPLE_CMD_RET_CONTINUE
    -
    -#define GAIM_CMD_P_VERY_LOW PURPLE_CMD_P_VERY_LOW
    -#define GAIM_CMD_P_LOW PURPLE_CMD_P_LOW
    -#define GAIM_CMD_P_DEFAULT PURPLE_CMD_P_DEFAULT
    -#define GAIM_CMD_P_PRPL PURPLE_CMD_P_PRPL
    -#define GAIM_CMD_P_PLUGIN PURPLE_CMD_P_PLUGIN
    -#define GAIM_CMD_P_ALIAS PURPLE_CMD_P_ALIAS
    -#define GAIM_CMD_P_HIGH PURPLE_CMD_P_HIGH
    -#define GAIM_CMD_P_VERY_HIGH PURPLE_CMD_P_VERY_HIGH
    -
    -#define GAIM_CMD_FLAG_IM PURPLE_CMD_FLAG_IM
    -#define GAIM_CMD_FLAG_CHAT PURPLE_CMD_FLAG_CHAT
    -#define GAIM_CMD_FLAG_PRPL_ONLY PURPLE_CMD_FLAG_PRPL_ONLY
    -#define GAIM_CMD_FLAG_ALLOW_WRONG_ARGS PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS
    -
    -
    -#define GaimCmdFunc PurpleCmdFunc
    -
    -#define GaimCmdId PurpleCmdId
    -
    -#define gaim_cmd_register purple_cmd_register
    -#define gaim_cmd_unregister purple_cmd_unregister
    -#define gaim_cmd_do_command purple_cmd_do_command
    -#define gaim_cmd_list purple_cmd_list
    -#define gaim_cmd_help purple_cmd_help
    -
    -/* from connection.h */
    -
    -#define GaimConnection PurpleConnection
    -
    -#define GAIM_CONNECTION_HTML PURPLE_CONNECTION_HTML
    -#define GAIM_CONNECTION_NO_BGCOLOR PURPLE_CONNECTION_NO_BGCOLOR
    -#define GAIM_CONNECTION_AUTO_RESP PURPLE_CONNECTION_AUTO_RESP
    -#define GAIM_CONNECTION_FORMATTING_WBFO PURPLE_CONNECTION_FORMATTING_WBFO
    -#define GAIM_CONNECTION_NO_NEWLINES PURPLE_CONNECTION_NO_NEWLINES
    -#define GAIM_CONNECTION_NO_FONTSIZE PURPLE_CONNECTION_NO_FONTSIZE
    -#define GAIM_CONNECTION_NO_URLDESC PURPLE_CONNECTION_NO_URLDESC
    -#define GAIM_CONNECTION_NO_IMAGES PURPLE_CONNECTION_NO_IMAGES
    -
    -#define GaimConnectionFlags PurpleConnectionFlags
    -
    -#define GAIM_DISCONNECTED PURPLE_DISCONNECTED
    -#define GAIM_CONNECTED PURPLE_CONNECTED
    -#define GAIM_CONNECTING PURPLE_CONNECTING
    -
    -#define GaimConnectionState PurpleConnectionState
    -
    -#define GaimConnectionUiOps PurpleConnectionUiOps
    -
    -#define gaim_connection_new purple_connection_new
    -#define gaim_connection_destroy purple_connection_destroy
    -
    -#define gaim_connection_set_state purple_connection_set_state
    -#define gaim_connection_set_account purple_connection_set_account
    -#define gaim_connection_set_display_name purple_connection_set_display_name
    -#define gaim_connection_get_state purple_connection_get_state
    -
    -#define GAIM_CONNECTION_IS_CONNECTED PURPLE_CONNECTION_IS_CONNECTED
    -
    -#define gaim_connection_get_account purple_connection_get_account
    -#define gaim_connection_get_password purple_connection_get_password
    -#define gaim_connection_get_display_name purple_connection_get_display_name
    -
    -#define gaim_connection_update_progress purple_connection_update_progress
    -
    -#define gaim_connection_notice purple_connection_notice
    -#define gaim_connection_error purple_connection_error
    -
    -#define gaim_connections_disconnect_all purple_connections_disconnect_all
    -
    -#define gaim_connections_get_all purple_connections_get_all
    -#define gaim_connections_get_connecting purple_connections_get_connecting
    -
    -#define GAIM_CONNECTION_IS_VALID PURPLE_CONNECTION_IS_VALID
    -
    -#define gaim_connections_set_ui_ops purple_connections_set_ui_ops
    -#define gaim_connections_get_ui_ops purple_connections_get_ui_ops
    -
    -#define gaim_connections_init purple_connections_init
    -#define gaim_connections_uninit purple_connections_uninit
    -#define gaim_connections_get_handle purple_connections_get_handle
    -
    -
    -/* from conversation.h */
    -
    -#define GaimConversationUiOps PurpleConversationUiOps
    -#define GaimConversation PurpleConversation
    -#define GaimConvIm PurpleConvIm
    -#define GaimConvChat PurpleConvChat
    -#define GaimConvChatBuddy PurpleConvChatBuddy
    -
    -#define GAIM_CONV_TYPE_UNKNOWN PURPLE_CONV_TYPE_UNKNOWN
    -#define GAIM_CONV_TYPE_IM PURPLE_CONV_TYPE_IM
    -#define GAIM_CONV_TYPE_CHAT PURPLE_CONV_TYPE_CHAT
    -#define GAIM_CONV_TYPE_MISC PURPLE_CONV_TYPE_MISC
    -#define GAIM_CONV_TYPE_ANY PURPLE_CONV_TYPE_ANY
    -
    -#define GaimConversationType PurpleConversationType
    -
    -#define GAIM_CONV_UPDATE_ADD PURPLE_CONV_UPDATE_ADD
    -#define GAIM_CONV_UPDATE_REMOVE PURPLE_CONV_UPDATE_REMOVE
    -#define GAIM_CONV_UPDATE_ACCOUNT PURPLE_CONV_UPDATE_ACCOUNT
    -#define GAIM_CONV_UPDATE_TYPING PURPLE_CONV_UPDATE_TYPING
    -#define GAIM_CONV_UPDATE_UNSEEN PURPLE_CONV_UPDATE_UNSEEN
    -#define GAIM_CONV_UPDATE_LOGGING PURPLE_CONV_UPDATE_LOGGING
    -#define GAIM_CONV_UPDATE_TOPIC PURPLE_CONV_UPDATE_TOPIC
    -#define GAIM_CONV_ACCOUNT_ONLINE PURPLE_CONV_ACCOUNT_ONLINE
    -#define GAIM_CONV_ACCOUNT_OFFLINE PURPLE_CONV_ACCOUNT_OFFLINE
    -#define GAIM_CONV_UPDATE_AWAY PURPLE_CONV_UPDATE_AWAY
    -#define GAIM_CONV_UPDATE_ICON PURPLE_CONV_UPDATE_ICON
    -#define GAIM_CONV_UPDATE_TITLE PURPLE_CONV_UPDATE_TITLE
    -#define GAIM_CONV_UPDATE_CHATLEFT PURPLE_CONV_UPDATE_CHATLEFT
    -#define GAIM_CONV_UPDATE_FEATURES PURPLE_CONV_UPDATE_FEATURES
    -
    -#define GaimConvUpdateType PurpleConvUpdateType
    -
    -#define GAIM_NOT_TYPING PURPLE_NOT_TYPING
    -#define GAIM_TYPING PURPLE_TYPING
    -#define GAIM_TYPED PURPLE_TYPED
    -
    -#define GaimTypingState PurpleTypingState
    -
    -#define GAIM_MESSAGE_SEND PURPLE_MESSAGE_SEND
    -#define GAIM_MESSAGE_RECV PURPLE_MESSAGE_RECV
    -#define GAIM_MESSAGE_SYSTEM PURPLE_MESSAGE_SYSTEM
    -#define GAIM_MESSAGE_AUTO_RESP PURPLE_MESSAGE_AUTO_RESP
    -#define GAIM_MESSAGE_ACTIVE_ONLY PURPLE_MESSAGE_ACTIVE_ONLY
    -#define GAIM_MESSAGE_NICK PURPLE_MESSAGE_NICK
    -#define GAIM_MESSAGE_NO_LOG PURPLE_MESSAGE_NO_LOG
    -#define GAIM_MESSAGE_WHISPER PURPLE_MESSAGE_WHISPER
    -#define GAIM_MESSAGE_ERROR PURPLE_MESSAGE_ERROR
    -#define GAIM_MESSAGE_DELAYED PURPLE_MESSAGE_DELAYED
    -#define GAIM_MESSAGE_RAW PURPLE_MESSAGE_RAW
    -#define GAIM_MESSAGE_IMAGES PURPLE_MESSAGE_IMAGES
    -
    -#define GaimMessageFlags PurpleMessageFlags
    -
    -#define GAIM_CBFLAGS_NONE PURPLE_CBFLAGS_NONE
    -#define GAIM_CBFLAGS_VOICE PURPLE_CBFLAGS_VOICE
    -#define GAIM_CBFLAGS_HALFOP PURPLE_CBFLAGS_HALFOP
    -#define GAIM_CBFLAGS_OP PURPLE_CBFLAGS_OP
    -#define GAIM_CBFLAGS_FOUNDER PURPLE_CBFLAGS_FOUNDER
    -#define GAIM_CBFLAGS_TYPING PURPLE_CBFLAGS_TYPING
    -
    -#define GaimConvChatBuddyFlags PurpleConvChatBuddyFlags
    -
    -#define gaim_conversations_set_ui_ops purple_conversations_set_ui_ops
    -
    -#define gaim_conversation_new purple_conversation_new
    -#define gaim_conversation_destroy purple_conversation_destroy
    -#define gaim_conversation_present purple_conversation_present
    -#define gaim_conversation_get_type purple_conversation_get_type
    -#define gaim_conversation_set_ui_ops purple_conversation_set_ui_ops
    -#define gaim_conversation_get_ui_ops purple_conversation_get_ui_ops
    -#define gaim_conversation_set_account purple_conversation_set_account
    -#define gaim_conversation_get_account purple_conversation_get_account
    -#define gaim_conversation_get_gc purple_conversation_get_gc
    -#define gaim_conversation_set_title purple_conversation_set_title
    -#define gaim_conversation_get_title purple_conversation_get_title
    -#define gaim_conversation_autoset_title purple_conversation_autoset_title
    -#define gaim_conversation_set_name purple_conversation_set_name
    -#define gaim_conversation_get_name purple_conversation_get_name
    -#define gaim_conversation_set_logging purple_conversation_set_logging
    -#define gaim_conversation_is_logging purple_conversation_is_logging
    -#define gaim_conversation_close_logs purple_conversation_close_logs
    -#define gaim_conversation_get_im_data purple_conversation_get_im_data
    -
    -#define GAIM_CONV_IM PURPLE_CONV_IM
    -
    -#define gaim_conversation_get_chat_data purple_conversation_get_chat_data
    -
    -#define GAIM_CONV_CHAT PURPLE_CONV_CHAT
    -
    -#define gaim_conversation_set_data purple_conversation_set_data
    -#define gaim_conversation_get_data purple_conversation_get_data
    -
    -#define gaim_get_conversations purple_get_conversations
    -#define gaim_get_ims purple_get_ims
    -#define gaim_get_chats purple_get_chats
    -
    -#define gaim_find_conversation_with_account \
    - purple_find_conversation_with_account
    -
    -#define gaim_conversation_write purple_conversation_write
    -#define gaim_conversation_set_features purple_conversation_set_features
    -#define gaim_conversation_get_features purple_conversation_get_features
    -#define gaim_conversation_has_focus purple_conversation_has_focus
    -#define gaim_conversation_update purple_conversation_update
    -#define gaim_conversation_foreach purple_conversation_foreach
    -
    -#define gaim_conv_im_get_conversation purple_conv_im_get_conversation
    -#define gaim_conv_im_set_icon purple_conv_im_set_icon
    -#define gaim_conv_im_get_icon purple_conv_im_get_icon
    -#define gaim_conv_im_set_typing_state purple_conv_im_set_typing_state
    -#define gaim_conv_im_get_typing_state purple_conv_im_get_typing_state
    -
    -#define gaim_conv_im_start_typing_timeout purple_conv_im_start_typing_timeout
    -#define gaim_conv_im_stop_typing_timeout purple_conv_im_stop_typing_timeout
    -#define gaim_conv_im_get_typing_timeout purple_conv_im_get_typing_timeout
    -#define gaim_conv_im_set_type_again purple_conv_im_set_type_again
    -#define gaim_conv_im_get_type_again purple_conv_im_get_type_again
    -
    -#define gaim_conv_im_start_send_typed_timeout \
    - purple_conv_im_start_send_typed_timeout
    -
    -#define gaim_conv_im_stop_send_typed_timeout \
    - purple_conv_im_stop_send_typed_timeout
    -
    -#define gaim_conv_im_get_send_typed_timeout \
    - purple_conv_im_get_send_typed_timeout
    -
    -#define gaim_conv_present_error purple_conv_present_error
    -#define gaim_conv_send_confirm purple_conv_send_confirm
    -
    -#define gaim_conv_im_update_typing purple_conv_im_update_typing
    -#define gaim_conv_im_write purple_conv_im_write
    -#define gaim_conv_im_send purple_conv_im_send
    -#define gaim_conv_im_send_with_flags purple_conv_im_send_with_flags
    -
    -#define gaim_conv_custom_smiley_add purple_conv_custom_smiley_add
    -#define gaim_conv_custom_smiley_write purple_conv_custom_smiley_write
    -#define gaim_conv_custom_smiley_close purple_conv_custom_smiley_close
    -
    -#define gaim_conv_chat_get_conversation purple_conv_chat_get_conversation
    -#define gaim_conv_chat_set_users purple_conv_chat_set_users
    -#define gaim_conv_chat_get_users purple_conv_chat_get_users
    -#define gaim_conv_chat_ignore purple_conv_chat_ignore
    -#define gaim_conv_chat_unignore purple_conv_chat_unignore
    -#define gaim_conv_chat_set_ignored purple_conv_chat_set_ignored
    -#define gaim_conv_chat_get_ignored purple_conv_chat_get_ignored
    -#define gaim_conv_chat_get_ignored_user purple_conv_chat_get_ignored_user
    -#define gaim_conv_chat_is_user_ignored purple_conv_chat_is_user_ignored
    -#define gaim_conv_chat_set_topic purple_conv_chat_set_topic
    -#define gaim_conv_chat_get_topic purple_conv_chat_get_topic
    -#define gaim_conv_chat_set_id purple_conv_chat_set_id
    -#define gaim_conv_chat_get_id purple_conv_chat_get_id
    -#define gaim_conv_chat_write purple_conv_chat_write
    -#define gaim_conv_chat_send purple_conv_chat_send
    -#define gaim_conv_chat_send_with_flags purple_conv_chat_send_with_flags
    -#define gaim_conv_chat_add_user purple_conv_chat_add_user
    -#define gaim_conv_chat_add_users purple_conv_chat_add_users
    -#define gaim_conv_chat_rename_user purple_conv_chat_rename_user
    -#define gaim_conv_chat_remove_user purple_conv_chat_remove_user
    -#define gaim_conv_chat_remove_users purple_conv_chat_remove_users
    -#define gaim_conv_chat_find_user purple_conv_chat_find_user
    -#define gaim_conv_chat_user_set_flags purple_conv_chat_user_set_flags
    -#define gaim_conv_chat_user_get_flags purple_conv_chat_user_get_flags
    -#define gaim_conv_chat_clear_users purple_conv_chat_clear_users
    -#define gaim_conv_chat_set_nick purple_conv_chat_set_nick
    -#define gaim_conv_chat_get_nick purple_conv_chat_get_nick
    -#define gaim_conv_chat_left purple_conv_chat_left
    -#define gaim_conv_chat_has_left purple_conv_chat_has_left
    -
    -#define gaim_find_chat purple_find_chat
    -
    -#define gaim_conv_chat_cb_new purple_conv_chat_cb_new
    -#define gaim_conv_chat_cb_find purple_conv_chat_cb_find
    -#define gaim_conv_chat_cb_get_name purple_conv_chat_cb_get_name
    -#define gaim_conv_chat_cb_destroy purple_conv_chat_cb_destroy
    -
    -#define gaim_conversations_get_handle purple_conversations_get_handle
    -#define gaim_conversations_init purple_conversations_init
    -#define gaim_conversations_uninit purple_conversations_uninit
    -
    -/* from core.h */
    -
    -#define GaimCore PurpleCore
    -
    -#define GaimCoreUiOps PurpleCoreUiOps
    -
    -#define gaim_core_init purple_core_init
    -#define gaim_core_quit purple_core_quit
    -
    -#define gaim_core_quit_cb purple_core_quit_cb
    -#define gaim_core_get_version purple_core_get_version
    -#define gaim_core_get_ui purple_core_get_ui
    -#define gaim_get_core purple_get_core
    -#define gaim_core_set_ui_ops purple_core_set_ui_ops
    -#define gaim_core_get_ui_ops purple_core_get_ui_ops
    -
    -/* from debug.h */
    -
    -#define GAIM_DEBUG_ALL PURPLE_DEBUG_ALL
    -#define GAIM_DEBUG_MISC PURPLE_DEBUG_MISC
    -#define GAIM_DEBUG_INFO PURPLE_DEBUG_INFO
    -#define GAIM_DEBUG_WARNING PURPLE_DEBUG_WARNING
    -#define GAIM_DEBUG_ERROR PURPLE_DEBUG_ERROR
    -#define GAIM_DEBUG_FATAL PURPLE_DEBUG_FATAL
    -
    -#define GaimDebugLevel PurpleDebugLevel
    -
    -#define GaimDebugUiOps PurpleDebugUiOps
    -
    -
    -#define gaim_debug purple_debug
    -#define gaim_debug_misc purple_debug_misc
    -#define gaim_debug_info purple_debug_info
    -#define gaim_debug_warning purple_debug_warning
    -#define gaim_debug_error purple_debug_error
    -#define gaim_debug_fatal purple_debug_fatal
    -
    -#define gaim_debug_set_enabled purple_debug_set_enabled
    -#define gaim_debug_is_enabled purple_debug_is_enabled
    -
    -#define gaim_debug_set_ui_ops purple_debug_set_ui_ops
    -#define gaim_debug_get_ui_ops purple_debug_get_ui_ops
    -
    -#define gaim_debug_init purple_debug_init
    -
    -/* from desktopitem.h */
    -
    -#define GAIM_DESKTOP_ITEM_TYPE_NULL PURPLE_DESKTOP_ITEM_TYPE_NULL
    -#define GAIM_DESKTOP_ITEM_TYPE_OTHER PURPLE_DESKTOP_ITEM_TYPE_OTHER
    -#define GAIM_DESKTOP_ITEM_TYPE_APPLICATION PURPLE_DESKTOP_ITEM_TYPE_APPLICATION
    -#define GAIM_DESKTOP_ITEM_TYPE_LINK PURPLE_DESKTOP_ITEM_TYPE_LINK
    -#define GAIM_DESKTOP_ITEM_TYPE_FSDEVICE PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE
    -#define GAIM_DESKTOP_ITEM_TYPE_MIME_TYPE PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE
    -#define GAIM_DESKTOP_ITEM_TYPE_DIRECTORY PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY
    -#define GAIM_DESKTOP_ITEM_TYPE_SERVICE PURPLE_DESKTOP_ITEM_TYPE_SERVICE
    -#define GAIM_DESKTOP_ITEM_TYPE_SERVICE_TYPE PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
    -
    -#define GaimDesktopItemType PurpleDesktopItemType
    -
    -#define GaimDesktopItem PurpleDesktopItem
    -
    -#define GAIM_TYPE_DESKTOP_ITEM PURPLE_TYPE_DESKTOP_ITEM
    -#define gaim_desktop_item_get_type purple_desktop_item_get_type
    -
    -/* standard */
    -/* ugh, i'm just copying these as strings, rather than pidginifying them */
    -#define GAIM_DESKTOP_ITEM_ENCODING "Encoding" /* string */
    -#define GAIM_DESKTOP_ITEM_VERSION "Version" /* numeric */
    -#define GAIM_DESKTOP_ITEM_NAME "Name" /* localestring */
    -#define GAIM_DESKTOP_ITEM_GENERIC_NAME "GenericName" /* localestring */
    -#define GAIM_DESKTOP_ITEM_TYPE "Type" /* string */
    -#define GAIM_DESKTOP_ITEM_FILE_PATTERN "FilePattern" /* regexp(s) */
    -#define GAIM_DESKTOP_ITEM_TRY_EXEC "TryExec" /* string */
    -#define GAIM_DESKTOP_ITEM_NO_DISPLAY "NoDisplay" /* boolean */
    -#define GAIM_DESKTOP_ITEM_COMMENT "Comment" /* localestring */
    -#define GAIM_DESKTOP_ITEM_EXEC "Exec" /* string */
    -#define GAIM_DESKTOP_ITEM_ACTIONS "Actions" /* strings */
    -#define GAIM_DESKTOP_ITEM_ICON "Icon" /* string */
    -#define GAIM_DESKTOP_ITEM_MINI_ICON "MiniIcon" /* string */
    -#define GAIM_DESKTOP_ITEM_HIDDEN "Hidden" /* boolean */
    -#define GAIM_DESKTOP_ITEM_PATH "Path" /* string */
    -#define GAIM_DESKTOP_ITEM_TERMINAL "Terminal" /* boolean */
    -#define GAIM_DESKTOP_ITEM_TERMINAL_OPTIONS "TerminalOptions" /* string */
    -#define GAIM_DESKTOP_ITEM_SWALLOW_TITLE "SwallowTitle" /* string */
    -#define GAIM_DESKTOP_ITEM_SWALLOW_EXEC "SwallowExec" /* string */
    -#define GAIM_DESKTOP_ITEM_MIME_TYPE "MimeType" /* regexp(s) */
    -#define GAIM_DESKTOP_ITEM_PATTERNS "Patterns" /* regexp(s) */
    -#define GAIM_DESKTOP_ITEM_DEFAULT_APP "DefaultApp" /* string */
    -#define GAIM_DESKTOP_ITEM_DEV "Dev" /* string */
    -#define GAIM_DESKTOP_ITEM_FS_TYPE "FSType" /* string */
    -#define GAIM_DESKTOP_ITEM_MOUNT_POINT "MountPoint" /* string */
    -#define GAIM_DESKTOP_ITEM_READ_ONLY "ReadOnly" /* boolean */
    -#define GAIM_DESKTOP_ITEM_UNMOUNT_ICON "UnmountIcon" /* string */
    -#define GAIM_DESKTOP_ITEM_SORT_ORDER "SortOrder" /* strings */
    -#define GAIM_DESKTOP_ITEM_URL "URL" /* string */
    -#define GAIM_DESKTOP_ITEM_DOC_PATH "X-GNOME-DocPath" /* string */
    -
    -#define gaim_desktop_item_new_from_file purple_desktop_item_new_from_file
    -#define gaim_desktop_item_get_entry_type purple_desktop_item_get_entry_type
    -#define gaim_desktop_item_get_string purple_desktop_item_get_string
    -#define gaim_desktop_item_copy purple_desktop_item_copy
    -#define gaim_desktop_item_unref purple_desktop_item_unref
    -
    -/* from dnsquery.h */
    -
    -#define GaimDnsQueryData PurpleDnsQueryData
    -#define GaimDnsQueryConnectFunction PurpleDnsQueryConnectFunction
    -
    -#define gaim_dnsquery_a purple_dnsquery_a
    -#define gaim_dnsquery_destroy purple_dnsquery_destroy
    -#define gaim_dnsquery_init purple_dnsquery_init
    -#define gaim_dnsquery_uninit purple_dnsquery_uninit
    -#define gaim_dnsquery_set_ui_ops purple_dnsquery_set_ui_ops
    -#define gaim_dnsquery_get_host purple_dnsquery_get_host
    -#define gaim_dnsquery_get_port purple_dnsquery_get_port
    -
    -/* from dnssrv.h */
    -
    -#define GaimSrvResponse PurpleSrvResponse
    -#define GaimSrvQueryData PurpleSrvTxtQueryData
    -#define GaimSrvCallback PurpleSrvCallback
    -
    -#define gaim_srv_resolve purple_srv_resolve
    -#define gaim_srv_cancel purple_srv_cancel
    -
    -/* from eventloop.h */
    -
    -#define GAIM_INPUT_READ PURPLE_INPUT_READ
    -#define GAIM_INPUT_WRITE PURPLE_INPUT_WRITE
    -
    -#define GaimInputCondition PurpleInputCondition
    -#define GaimInputFunction PurpleInputFunction
    -#define GaimEventLoopUiOps PurpleEventLoopUiOps
    -
    -#define gaim_timeout_add purple_timeout_add
    -#define gaim_timeout_remove purple_timeout_remove
    -#define gaim_input_add purple_input_add
    -#define gaim_input_remove purple_input_remove
    -
    -#define gaim_eventloop_set_ui_ops purple_eventloop_set_ui_ops
    -#define gaim_eventloop_get_ui_ops purple_eventloop_get_ui_ops
    -
    -/* from ft.h */
    -
    -#define GaimXfer PurpleXfer
    -
    -#define GAIM_XFER_UNKNOWN PURPLE_XFER_UNKNOWN
    -#define GAIM_XFER_SEND PURPLE_XFER_SEND
    -#define GAIM_XFER_RECEIVE PURPLE_XFER_RECEIVE
    -
    -#define GaimXferType PurpleXferType
    -
    -#define GAIM_XFER_STATUS_UNKNOWN PURPLE_XFER_STATUS_UNKNOWN
    -#define GAIM_XFER_STATUS_NOT_STARTED PURPLE_XFER_STATUS_NOT_STARTED
    -#define GAIM_XFER_STATUS_ACCEPTED PURPLE_XFER_STATUS_ACCEPTED
    -#define GAIM_XFER_STATUS_STARTED PURPLE_XFER_STATUS_STARTED
    -#define GAIM_XFER_STATUS_DONE PURPLE_XFER_STATUS_DONE
    -#define GAIM_XFER_STATUS_CANCEL_LOCAL PURPLE_XFER_STATUS_CANCEL_LOCAL
    -#define GAIM_XFER_STATUS_CANCEL_REMOTE PURPLE_XFER_STATUS_CANCEL_REMOTE
    -
    -#define GaimXferStatusType PurpleXferStatusType
    -
    -#define GaimXferUiOps PurpleXferUiOps
    -
    -#define gaim_xfer_new purple_xfer_new
    -#define gaim_xfer_ref purple_xfer_ref
    -#define gaim_xfer_unref purple_xfer_unref
    -#define gaim_xfer_request purple_xfer_request
    -#define gaim_xfer_request_accepted purple_xfer_request_accepted
    -#define gaim_xfer_request_denied purple_xfer_request_denied
    -#define gaim_xfer_get_type purple_xfer_get_type
    -#define gaim_xfer_get_account purple_xfer_get_account
    -#define gaim_xfer_get_status purple_xfer_get_status
    -#define gaim_xfer_is_canceled purple_xfer_is_canceled
    -#define gaim_xfer_is_completed purple_xfer_is_completed
    -#define gaim_xfer_get_filename purple_xfer_get_filename
    -#define gaim_xfer_get_local_filename purple_xfer_get_local_filename
    -#define gaim_xfer_get_bytes_sent purple_xfer_get_bytes_sent
    -#define gaim_xfer_get_bytes_remaining purple_xfer_get_bytes_remaining
    -#define gaim_xfer_get_size purple_xfer_get_size
    -#define gaim_xfer_get_progress purple_xfer_get_progress
    -#define gaim_xfer_get_local_port purple_xfer_get_local_port
    -#define gaim_xfer_get_remote_ip purple_xfer_get_remote_ip
    -#define gaim_xfer_get_remote_port purple_xfer_get_remote_port
    -#define gaim_xfer_set_completed purple_xfer_set_completed
    -#define gaim_xfer_set_message purple_xfer_set_message
    -#define gaim_xfer_set_filename purple_xfer_set_filename
    -#define gaim_xfer_set_local_filename purple_xfer_set_local_filename
    -#define gaim_xfer_set_size purple_xfer_set_size
    -#define gaim_xfer_set_bytes_sent purple_xfer_set_bytes_sent
    -#define gaim_xfer_get_ui_ops purple_xfer_get_ui_ops
    -#define gaim_xfer_set_read_fnc purple_xfer_set_read_fnc
    -#define gaim_xfer_set_write_fnc purple_xfer_set_write_fnc
    -#define gaim_xfer_set_ack_fnc purple_xfer_set_ack_fnc
    -#define gaim_xfer_set_request_denied_fnc purple_xfer_set_request_denied_fnc
    -#define gaim_xfer_set_init_fnc purple_xfer_set_init_fnc
    -#define gaim_xfer_set_start_fnc purple_xfer_set_start_fnc
    -#define gaim_xfer_set_end_fnc purple_xfer_set_end_fnc
    -#define gaim_xfer_set_cancel_send_fnc purple_xfer_set_cancel_send_fnc
    -#define gaim_xfer_set_cancel_recv_fnc purple_xfer_set_cancel_recv_fnc
    -
    -#define gaim_xfer_read purple_xfer_read
    -#define gaim_xfer_write purple_xfer_write
    -#define gaim_xfer_start purple_xfer_start
    -#define gaim_xfer_end purple_xfer_end
    -#define gaim_xfer_add purple_xfer_add
    -#define gaim_xfer_cancel_local purple_xfer_cancel_local
    -#define gaim_xfer_cancel_remote purple_xfer_cancel_remote
    -#define gaim_xfer_error purple_xfer_error
    -#define gaim_xfer_update_progress purple_xfer_update_progress
    -#define gaim_xfer_conversation_write purple_xfer_conversation_write
    -
    -#define gaim_xfers_get_handle purple_xfers_get_handle
    -#define gaim_xfers_init purple_xfers_init
    -#define gaim_xfers_uninit purple_xfers_uninit
    -#define gaim_xfers_set_ui_ops purple_xfers_set_ui_ops
    -#define gaim_xfers_get_ui_ops purple_xfers_get_ui_ops
    -
    -/* from gaim-client.h */
    -
    -#define gaim_init purple_init
    -
    -/* from idle.h */
    -
    -#define GaimIdleUiOps PurpleIdleUiOps
    -
    -#define gaim_idle_touch purple_idle_touch
    -#define gaim_idle_set purple_idle_set
    -#define gaim_idle_set_ui_ops purple_idle_set_ui_ops
    -#define gaim_idle_get_ui_ops purple_idle_get_ui_ops
    -#define gaim_idle_init purple_idle_init
    -#define gaim_idle_uninit purple_idle_uninit
    -
    -/* from imgstore.h */
    -
    -#define GaimStoredImage PurpleStoredImage
    -
    -#define gaim_imgstore_add(data, size, filename) \
    - purple_imgstore_add_with_id(g_memdup(data, size), size, filename)
    -#define gaim_imgstore_get purple_imgstore_find_by_id
    -#define gaim_imgstore_get_data purple_imgstore_get_data
    -#define gaim_imgstore_get_size purple_imgstore_get_size
    -#define gaim_imgstore_get_filename purple_imgstore_get_filename
    -#define gaim_imgstore_ref purple_imgstore_ref_by_id
    -#define gaim_imgstore_unref purple_imgstore_unref_by_id
    -
    -
    -/* from log.h */
    -
    -#define GaimLog PurpleLog
    -#define GaimLogLogger PurpleLogLogger
    -#define GaimLogCommonLoggerData PurpleLogCommonLoggerData
    -#define GaimLogSet PurpleLogSet
    -
    -#define GAIM_LOG_IM PURPLE_LOG_IM
    -#define GAIM_LOG_CHAT PURPLE_LOG_CHAT
    -#define GAIM_LOG_SYSTEM PURPLE_LOG_SYSTEM
    -
    -#define GaimLogType PurpleLogType
    -
    -#define GAIM_LOG_READ_NO_NEWLINE PURPLE_LOG_READ_NO_NEWLINE
    -
    -#define GaimLogReadFlags PurpleLogReadFlags
    -
    -#define GaimLogSetCallback PurpleLogSetCallback
    -
    -#define gaim_log_new purple_log_new
    -#define gaim_log_free purple_log_free
    -#define gaim_log_write purple_log_write
    -#define gaim_log_read purple_log_read
    -
    -#define gaim_log_get_logs purple_log_get_logs
    -#define gaim_log_get_log_sets purple_log_get_log_sets
    -#define gaim_log_get_system_logs purple_log_get_system_logs
    -#define gaim_log_get_size purple_log_get_size
    -#define gaim_log_get_total_size purple_log_get_total_size
    -#define gaim_log_get_log_dir purple_log_get_log_dir
    -#define gaim_log_compare purple_log_compare
    -#define gaim_log_set_compare purple_log_set_compare
    -#define gaim_log_set_free purple_log_set_free
    -
    -#define gaim_log_common_writer purple_log_common_writer
    -#define gaim_log_common_lister purple_log_common_lister
    -#define gaim_log_common_total_sizer purple_log_common_total_sizer
    -#define gaim_log_common_sizer purple_log_common_sizer
    -
    -#define gaim_log_logger_new purple_log_logger_new
    -#define gaim_log_logger_free purple_log_logger_free
    -#define gaim_log_logger_add purple_log_logger_add
    -#define gaim_log_logger_remove purple_log_logger_remove
    -#define gaim_log_logger_set purple_log_logger_set
    -#define gaim_log_logger_get purple_log_logger_get
    -
    -#define gaim_log_logger_get_options purple_log_logger_get_options
    -
    -#define gaim_log_init purple_log_init
    -#define gaim_log_get_handle purple_log_get_handle
    -#define gaim_log_uninit purple_log_uninit
    -
    -/* from mime.h */
    -
    -#define GaimMimeDocument PurpleMimeDocument
    -#define GaimMimePart PurpleMimePart
    -
    -#define gaim_mime_document_new purple_mime_document_new
    -#define gaim_mime_document_free purple_mime_document_free
    -#define gaim_mime_document_parse purple_mime_document_parse
    -#define gaim_mime_document_parsen purple_mime_document_parsen
    -#define gaim_mime_document_write purple_mime_document_write
    -#define gaim_mime_document_get_fields purple_mime_document_get_fields
    -#define gaim_mime_document_get_field purple_mime_document_get_field
    -#define gaim_mime_document_set_field purple_mime_document_set_field
    -#define gaim_mime_document_get_parts purple_mime_document_get_parts
    -
    -#define gaim_mime_part_new purple_mime_part_new
    -#define gaim_mime_part_get_fields purple_mime_part_get_fields
    -#define gaim_mime_part_get_field purple_mime_part_get_field
    -#define gaim_mime_part_get_field_decoded purple_mime_part_get_field_decoded
    -#define gaim_mime_part_set_field purple_mime_part_set_field
    -#define gaim_mime_part_get_data purple_mime_part_get_data
    -#define gaim_mime_part_get_data_decoded purple_mime_part_get_data_decoded
    -#define gaim_mime_part_get_length purple_mime_part_get_length
    -#define gaim_mime_part_set_data purple_mime_part_set_data
    -
    -
    -/* from network.h */
    -
    -#define GaimNetworkListenData PurpleNetworkListenData
    -
    -#define GaimNetworkListenCallback PurpleNetworkListenCallback
    -
    -#define gaim_network_ip_atoi purple_network_ip_atoi
    -#define gaim_network_set_public_ip purple_network_set_public_ip
    -#define gaim_network_get_public_ip purple_network_get_public_ip
    -#define gaim_network_get_local_system_ip purple_network_get_local_system_ip
    -#define gaim_network_get_my_ip purple_network_get_my_ip
    -
    -#define gaim_network_listen purple_network_listen
    -#define gaim_network_listen_range purple_network_listen_range
    -#define gaim_network_listen_cancel purple_network_listen_cancel
    -#define gaim_network_get_port_from_fd purple_network_get_port_from_fd
    -
    -#define gaim_network_is_available purple_network_is_available
    -
    -#define gaim_network_init purple_network_init
    -#define gaim_network_uninit purple_network_uninit
    -
    -/* from notify.h */
    -
    -
    -#define GaimNotifyUserInfoEntry PurpleNotifyUserInfoEntry
    -#define GaimNotifyUserInfo PurpleNotifyUserInfo
    -
    -#define GaimNotifyCloseCallback PurpleNotifyCloseCallback
    -
    -#define GAIM_NOTIFY_MESSAGE PURPLE_NOTIFY_MESSAGE
    -#define GAIM_NOTIFY_EMAIL PURPLE_NOTIFY_EMAIL
    -#define GAIM_NOTIFY_EMAILS PURPLE_NOTIFY_EMAILS
    -#define GAIM_NOTIFY_FORMATTED PURPLE_NOTIFY_FORMATTED
    -#define GAIM_NOTIFY_SEARCHRESULTS PURPLE_NOTIFY_SEARCHRESULTS
    -#define GAIM_NOTIFY_USERINFO PURPLE_NOTIFY_USERINFO
    -#define GAIM_NOTIFY_URI PURPLE_NOTIFY_URI
    -
    -#define GaimNotifyType PurpleNotifyType
    -
    -#define GAIM_NOTIFY_MSG_ERROR PURPLE_NOTIFY_MSG_ERROR
    -#define GAIM_NOTIFY_MSG_WARNING PURPLE_NOTIFY_MSG_WARNING
    -#define GAIM_NOTIFY_MSG_INFO PURPLE_NOTIFY_MSG_INFO
    -
    -#define GaimNotifyMsgType PurpleNotifyMsgType
    -
    -#define GAIM_NOTIFY_BUTTON_LABELED PURPLE_NOTIFY_BUTTON_LABELED
    -#define GAIM_NOTIFY_BUTTON_CONTINUE PURPLE_NOTIFY_BUTTON_CONTINUE
    -#define GAIM_NOTIFY_BUTTON_ADD PURPLE_NOTIFY_BUTTON_ADD
    -#define GAIM_NOTIFY_BUTTON_INFO PURPLE_NOTIFY_BUTTON_INFO
    -#define GAIM_NOTIFY_BUTTON_IM PURPLE_NOTIFY_BUTTON_IM
    -#define GAIM_NOTIFY_BUTTON_JOIN PURPLE_NOTIFY_BUTTON_JOIN
    -#define GAIM_NOTIFY_BUTTON_INVITE PURPLE_NOTIFY_BUTTON_INVITE
    -
    -#define GaimNotifySearchButtonType PurpleNotifySearchButtonType
    -
    -#define GaimNotifySearchResults PurpleNotifySearchResults
    -
    -#define GAIM_NOTIFY_USER_INFO_ENTRY_PAIR PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR
    -#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK
    -#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
    -
    -#define GaimNotifyUserInfoEntryType PurpleNotifyUserInfoEntryType
    -
    -#define GaimNotifySearchColumn PurpleNotifySearchColumn
    -#define GaimNotifySearchResultsCallback PurpleNotifySearchResultsCallback
    -#define GaimNotifySearchButton PurpleNotifySearchButton
    -
    -#define GaimNotifyUiOps PurpleNotifyUiOps
    -
    -#define gaim_notify_searchresults purple_notify_searchresults
    -#define gaim_notify_searchresults_free purple_notify_searchresults_free
    -#define gaim_notify_searchresults_new_rows purple_notify_searchresults_new_rows
    -#define gaim_notify_searchresults_button_add purple_notify_searchresults_button_add
    -#define gaim_notify_searchresults_button_add_labeled purple_notify_searchresults_button_add_labeled
    -#define gaim_notify_searchresults_new purple_notify_searchresults_new
    -#define gaim_notify_searchresults_column_new purple_notify_searchresults_column_new
    -#define gaim_notify_searchresults_column_add purple_notify_searchresults_column_add
    -#define gaim_notify_searchresults_row_add purple_notify_searchresults_row_add
    -#define gaim_notify_searchresults_get_rows_count purple_notify_searchresults_get_rows_count
    -#define gaim_notify_searchresults_get_columns_count purple_notify_searchresults_get_columns_count
    -#define gaim_notify_searchresults_row_get purple_notify_searchresults_row_get
    -#define gaim_notify_searchresults_column_get_title purple_notify_searchresults_column_get_title
    -
    -#define gaim_notify_message purple_notify_message
    -#define gaim_notify_email purple_notify_email
    -#define gaim_notify_emails purple_notify_emails
    -#define gaim_notify_formatted purple_notify_formatted
    -#define gaim_notify_userinfo purple_notify_userinfo
    -
    -#define gaim_notify_user_info_new purple_notify_user_info_new
    -#define gaim_notify_user_info_destroy purple_notify_user_info_destroy
    -#define gaim_notify_user_info_get_entries purple_notify_user_info_get_entries
    -#define gaim_notify_user_info_get_text_with_newline purple_notify_user_info_get_text_with_newline
    -#define gaim_notify_user_info_add_pair purple_notify_user_info_add_pair
    -#define gaim_notify_user_info_prepend_pair purple_notify_user_info_prepend_pair
    -#define gaim_notify_user_info_remove_entry purple_notify_user_info_remove_entry
    -#define gaim_notify_user_info_entry_new purple_notify_user_info_entry_new
    -#define gaim_notify_user_info_add_section_break purple_notify_user_info_add_section_break
    -#define gaim_notify_user_info_add_section_header purple_notify_user_info_add_section_header
    -#define gaim_notify_user_info_remove_last_item purple_notify_user_info_remove_last_item
    -#define gaim_notify_user_info_entry_get_label purple_notify_user_info_entry_get_label
    -#define gaim_notify_user_info_entry_set_label purple_notify_user_info_entry_set_label
    -#define gaim_notify_user_info_entry_get_value purple_notify_user_info_entry_get_value
    -#define gaim_notify_user_info_entry_set_value purple_notify_user_info_entry_set_value
    -#define gaim_notify_user_info_entry_get_type purple_notify_user_info_entry_get_type
    -#define gaim_notify_user_info_entry_set_type purple_notify_user_info_entry_set_type
    -
    -#define gaim_notify_uri purple_notify_uri
    -#define gaim_notify_close purple_notify_close
    -#define gaim_notify_close_with_handle purple_notify_close_with_handle
    -
    -#define gaim_notify_info purple_notify_info
    -#define gaim_notify_warning purple_notify_warning
    -#define gaim_notify_error purple_notify_error
    -
    -#define gaim_notify_set_ui_ops purple_notify_set_ui_ops
    -#define gaim_notify_get_ui_ops purple_notify_get_ui_ops
    -
    -#define gaim_notify_get_handle purple_notify_get_handle
    -
    -#define gaim_notify_init purple_notify_init
    -#define gaim_notify_uninit purple_notify_uninit
    -
    -/* from ntlm.h */
    -
    -#define gaim_ntlm_gen_type1 purple_ntlm_gen_type1
    -#define gaim_ntlm_parse_type2 purple_ntlm_parse_type2
    -#define gaim_ntlm_gen_type3 purple_ntlm_gen_type3
    -
    -/* from plugin.h */
    -
    -#ifdef GAIM_PLUGINS
    -#ifndef PURPLE_PLUGINS
    -#define PURPLE_PLUGINS
    -#endif
    -#endif
    -
    -#define GaimPlugin PurplePlugin
    -#define GaimPluginInfo PurplePluginInfo
    -#define GaimPluginUiInfo PurplePluginUiInfo
    -#define GaimPluginLoaderInfo PurplePluginLoaderInfo
    -#define GaimPluginAction PurplePluginAction
    -#define GaimPluginPriority PurplePluginPriority
    -
    -#define GAIM_PLUGIN_UNKNOWN PURPLE_PLUGIN_UNKNOWN
    -#define GAIM_PLUGIN_STANDARD PURPLE_PLUGIN_STANDARD
    -#define GAIM_PLUGIN_LOADER PURPLE_PLUGIN_LOADER
    -#define GAIM_PLUGIN_PROTOCOL PURPLE_PLUGIN_PROTOCOL
    -
    -#define GaimPluginType PurplePluginType
    -
    -#define GAIM_PRIORITY_DEFAULT PURPLE_PRIORITY_DEFAULT
    -#define GAIM_PRIORITY_HIGHEST PURPLE_PRIORITY_HIGHEST
    -#define GAIM_PRIORITY_LOWEST PURPLE_PRIORITY_LOWEST
    -
    -#define GAIM_PLUGIN_FLAG_INVISIBLE PURPLE_PLUGIN_FLAG_INVISIBLE
    -
    -#define GAIM_PLUGIN_MAGIC PURPLE_PLUGIN_MAGIC
    -
    -#define GAIM_PLUGIN_LOADER_INFO PURPLE_PLUGIN_LOADER_INFO
    -#define GAIM_PLUGIN_HAS_PREF_FRAME PURPLE_PLUGIN_HAS_PREF_FRAME
    -#define GAIM_PLUGIN_UI_INFO PURPLE_PLUGIN_UI_INFO
    -
    -#define GAIM_PLUGIN_HAS_ACTIONS PURPLE_PLUGIN_HAS_ACTIONS
    -#define GAIM_PLUGIN_ACTIONS PURPLE_PLUGIN_ACTIONS
    -
    -#define GAIM_INIT_PLUGIN PURPLE_INIT_PLUGIN
    -
    -#define gaim_plugin_new purple_plugin_new
    -#define gaim_plugin_probe purple_plugin_probe
    -#define gaim_plugin_register purple_plugin_register
    -#define gaim_plugin_load purple_plugin_load
    -#define gaim_plugin_unload purple_plugin_unload
    -#define gaim_plugin_reload purple_plugin_reload
    -#define gaim_plugin_destroy purple_plugin_destroy
    -#define gaim_plugin_is_loaded purple_plugin_is_loaded
    -#define gaim_plugin_is_unloadable purple_plugin_is_unloadable
    -#define gaim_plugin_get_id purple_plugin_get_id
    -#define gaim_plugin_get_name purple_plugin_get_name
    -#define gaim_plugin_get_version purple_plugin_get_version
    -#define gaim_plugin_get_summary purple_plugin_get_summary
    -#define gaim_plugin_get_description purple_plugin_get_description
    -#define gaim_plugin_get_author purple_plugin_get_author
    -#define gaim_plugin_get_homepage purple_plugin_get_homepage
    -
    -#define gaim_plugin_ipc_register purple_plugin_ipc_register
    -#define gaim_plugin_ipc_unregister purple_plugin_ipc_unregister
    -#define gaim_plugin_ipc_unregister_all purple_plugin_ipc_unregister_all
    -#define gaim_plugin_ipc_get_params purple_plugin_ipc_get_params
    -#define gaim_plugin_ipc_call purple_plugin_ipc_call
    -
    -#define gaim_plugins_add_search_path purple_plugins_add_search_path
    -#define gaim_plugins_unload_all purple_plugins_unload_all
    -#define gaim_plugins_destroy_all purple_plugins_destroy_all
    -#define gaim_plugins_save_loaded purple_plugins_save_loaded
    -#define gaim_plugins_load_saved purple_plugins_load_saved
    -#define gaim_plugins_probe purple_plugins_probe
    -#define gaim_plugins_enabled purple_plugins_enabled
    -
    -#define gaim_plugins_register_probe_notify_cb purple_plugins_register_probe_notify_cb
    -#define gaim_plugins_unregister_probe_notify_cb purple_plugins_unregister_probe_notify_cb
    -#define gaim_plugins_register_load_notify_cb purple_plugins_register_load_notify_cb
    -#define gaim_plugins_unregister_load_notify_cb purple_plugins_unregister_load_notify_cb
    -#define gaim_plugins_register_unload_notify_cb purple_plugins_register_unload_notify_cb
    -#define gaim_plugins_unregister_unload_notify_cb purple_plugins_unregister_unload_notify_cb
    -
    -#define gaim_plugins_find_with_name purple_plugins_find_with_name
    -#define gaim_plugins_find_with_filename purple_plugins_find_with_filename
    -#define gaim_plugins_find_with_basename purple_plugins_find_with_basename
    -#define gaim_plugins_find_with_id purple_plugins_find_with_id
    -
    -#define gaim_plugins_get_loaded purple_plugins_get_loaded
    -#define gaim_plugins_get_protocols purple_plugins_get_protocols
    -#define gaim_plugins_get_all purple_plugins_get_all
    -
    -#define gaim_plugins_get_handle purple_plugins_get_handle
    -#define gaim_plugins_init purple_plugins_init
    -#define gaim_plugins_uninit purple_plugins_uninit
    -
    -#define gaim_plugin_action_new purple_plugin_action_new
    -#define gaim_plugin_action_free purple_plugin_action_free
    -
    -/* pluginpref.h */
    -
    -#define GaimPluginPrefFrame PurplePluginPrefFrame
    -#define GaimPluginPref PurplePluginPref
    -
    -#define GAIM_STRING_FORMAT_TYPE_NONE PURPLE_STRING_FORMAT_TYPE_NONE
    -#define GAIM_STRING_FORMAT_TYPE_MULTILINE PURPLE_STRING_FORMAT_TYPE_MULTILINE
    -#define GAIM_STRING_FORMAT_TYPE_HTML PURPLE_STRING_FORMAT_TYPE_HTML
    -
    -#define GaimStringFormatType PurpleStringFormatType
    -
    -#define GAIM_PLUGIN_PREF_NONE PURPLE_PLUGIN_PREF_NONE
    -#define GAIM_PLUGIN_PREF_CHOICE PURPLE_PLUGIN_PREF_CHOICE
    -#define GAIM_PLUGIN_PREF_INFO PURPLE_PLUGIN_PREF_INFO
    -#define GAIM_PLUGIN_PREF_STRING_FORMAT PURPLE_PLUGIN_PREF_STRING_FORMAT
    -
    -#define GaimPluginPrefType PurplePluginPrefType
    -
    -#define gaim_plugin_pref_frame_new purple_plugin_pref_frame_new
    -#define gaim_plugin_pref_frame_destroy purple_plugin_pref_frame_destroy
    -#define gaim_plugin_pref_frame_add purple_plugin_pref_frame_add
    -#define gaim_plugin_pref_frame_get_prefs purple_plugin_pref_frame_get_prefs
    -
    -#define gaim_plugin_pref_new purple_plugin_pref_new
    -#define gaim_plugin_pref_new_with_name purple_plugin_pref_new_with_name
    -#define gaim_plugin_pref_new_with_label purple_plugin_pref_new_with_label
    -#define gaim_plugin_pref_new_with_name_and_label purple_plugin_pref_new_with_name_and_label
    -#define gaim_plugin_pref_destroy purple_plugin_pref_destroy
    -#define gaim_plugin_pref_set_name purple_plugin_pref_set_name
    -#define gaim_plugin_pref_get_name purple_plugin_pref_get_name
    -#define gaim_plugin_pref_set_label purple_plugin_pref_set_label
    -#define gaim_plugin_pref_get_label purple_plugin_pref_get_label
    -#define gaim_plugin_pref_set_bounds purple_plugin_pref_set_bounds
    -#define gaim_plugin_pref_get_bounds purple_plugin_pref_get_bounds
    -#define gaim_plugin_pref_set_type purple_plugin_pref_set_type
    -#define gaim_plugin_pref_get_type purple_plugin_pref_get_type
    -#define gaim_plugin_pref_add_choice purple_plugin_pref_add_choice
    -#define gaim_plugin_pref_get_choices purple_plugin_pref_get_choices
    -#define gaim_plugin_pref_set_max_length purple_plugin_pref_set_max_length
    -#define gaim_plugin_pref_get_max_length purple_plugin_pref_get_max_length
    -#define gaim_plugin_pref_set_masked purple_plugin_pref_set_masked
    -#define gaim_plugin_pref_get_masked purple_plugin_pref_get_masked
    -#define gaim_plugin_pref_set_format_type purple_plugin_pref_set_format_type
    -#define gaim_plugin_pref_get_format_type purple_plugin_pref_get_format_type
    -
    -/* from pounce.h */
    -
    -#define GaimPounce PurplePounce
    -
    -#define GAIM_POUNCE_NONE PURPLE_POUNCE_NONE
    -#define GAIM_POUNCE_SIGNON PURPLE_POUNCE_SIGNON
    -#define GAIM_POUNCE_SIGNOFF PURPLE_POUNCE_SIGNOFF
    -#define GAIM_POUNCE_AWAY PURPLE_POUNCE_AWAY
    -#define GAIM_POUNCE_AWAY_RETURN PURPLE_POUNCE_AWAY_RETURN
    -#define GAIM_POUNCE_IDLE PURPLE_POUNCE_IDLE
    -#define GAIM_POUNCE_IDLE_RETURN PURPLE_POUNCE_IDLE_RETURN
    -#define GAIM_POUNCE_TYPING PURPLE_POUNCE_TYPING
    -#define GAIM_POUNCE_TYPED PURPLE_POUNCE_TYPED
    -#define GAIM_POUNCE_TYPING_STOPPED PURPLE_POUNCE_TYPING_STOPPED
    -#define GAIM_POUNCE_MESSAGE_RECEIVED PURPLE_POUNCE_MESSAGE_RECEIVED
    -#define GaimPounceEvent PurplePounceEvent
    -
    -#define GAIM_POUNCE_OPTION_NONE PURPLE_POUNCE_OPTION_NONE
    -#define GAIM_POUNCE_OPTION_AWAY PURPLE_POUNCE_OPTION_AWAY
    -#define GaimPounceOption PurplePounceOption
    -
    -#define GaimPounceCb PurplePounceCb
    -
    -#define gaim_pounce_new purple_pounce_new
    -#define gaim_pounce_destroy purple_pounce_destroy
    -#define gaim_pounce_destroy_all_by_account purple_pounce_destroy_all_by_account
    -#define gaim_pounce_set_events purple_pounce_set_events
    -#define gaim_pounce_set_options purple_pounce_set_options
    -#define gaim_pounce_set_pouncer purple_pounce_set_pouncer
    -#define gaim_pounce_set_pouncee purple_pounce_set_pouncee
    -#define gaim_pounce_set_save purple_pounce_set_save
    -#define gaim_pounce_action_register purple_pounce_action_register
    -#define gaim_pounce_action_set_enabled purple_pounce_action_set_enabled
    -#define gaim_pounce_action_set_attribute purple_pounce_action_set_attribute
    -#define gaim_pounce_set_data purple_pounce_set_data
    -#define gaim_pounce_get_events purple_pounce_get_events
    -#define gaim_pounce_get_options purple_pounce_get_options
    -#define gaim_pounce_get_pouncer purple_pounce_get_pouncer
    -#define gaim_pounce_get_pouncee purple_pounce_get_pouncee
    -#define gaim_pounce_get_save purple_pounce_get_save
    -#define gaim_pounce_action_is_enabled purple_pounce_action_is_enabled
    -#define gaim_pounce_action_get_attribute purple_pounce_action_get_attribute
    -#define gaim_pounce_get_data purple_pounce_get_data
    -#define gaim_pounce_execute purple_pounce_execute
    -
    -#define gaim_find_pounce purple_find_pounce
    -#define gaim_pounces_load purple_pounces_load
    -#define gaim_pounces_register_handler purple_pounces_register_handler
    -#define gaim_pounces_unregister_handler purple_pounces_unregister_handler
    -#define gaim_pounces_get_all purple_pounces_get_all
    -#define gaim_pounces_get_handle purple_pounces_get_handle
    -#define gaim_pounces_init purple_pounces_init
    -#define gaim_pounces_uninit purple_pounces_uninit
    -
    -/* from prefs.h */
    -
    -
    -#define GAIM_PREF_NONE PURPLE_PREF_NONE
    -#define GAIM_PREF_BOOLEAN PURPLE_PREF_BOOLEAN
    -#define GAIM_PREF_INT PURPLE_PREF_INT
    -#define GAIM_PREF_STRING PURPLE_PREF_STRING
    -#define GAIM_PREF_STRING_LIST PURPLE_PREF_STRING_LIST
    -#define GAIM_PREF_PATH PURPLE_PREF_PATH
    -#define GAIM_PREF_PATH_LIST PURPLE_PREF_PATH_LIST
    -#define GaimPrefType PurplePrefType
    -
    -#define GaimPrefCallback PurplePrefCallback
    -
    -#define gaim_prefs_get_handle purple_prefs_get_handle
    -#define gaim_prefs_init purple_prefs_init
    -#define gaim_prefs_uninit purple_prefs_uninit
    -#define gaim_prefs_add_none purple_prefs_add_none
    -#define gaim_prefs_add_bool purple_prefs_add_bool
    -#define gaim_prefs_add_int purple_prefs_add_int
    -#define gaim_prefs_add_string purple_prefs_add_string
    -#define gaim_prefs_add_string_list purple_prefs_add_string_list
    -#define gaim_prefs_add_path purple_prefs_add_path
    -#define gaim_prefs_add_path_list purple_prefs_add_path_list
    -#define gaim_prefs_remove purple_prefs_remove
    -#define gaim_prefs_rename purple_prefs_rename
    -#define gaim_prefs_rename_boolean_toggle purple_prefs_rename_boolean_toggle
    -#define gaim_prefs_destroy purple_prefs_destroy
    -#define gaim_prefs_set_generic purple_prefs_set_generic
    -#define gaim_prefs_set_bool purple_prefs_set_bool
    -#define gaim_prefs_set_int purple_prefs_set_int
    -#define gaim_prefs_set_string purple_prefs_set_string
    -#define gaim_prefs_set_string_list purple_prefs_set_string_list
    -#define gaim_prefs_set_path purple_prefs_set_path
    -#define gaim_prefs_set_path_list purple_prefs_set_path_list
    -#define gaim_prefs_exists purple_prefs_exists
    -#define gaim_prefs_get_type purple_prefs_get_type
    -#define gaim_prefs_get_bool purple_prefs_get_bool
    -#define gaim_prefs_get_int purple_prefs_get_int
    -#define gaim_prefs_get_string purple_prefs_get_string
    -#define gaim_prefs_get_string_list purple_prefs_get_string_list
    -#define gaim_prefs_get_path purple_prefs_get_path
    -#define gaim_prefs_get_path_list purple_prefs_get_path_list
    -#define gaim_prefs_connect_callback purple_prefs_connect_callback
    -#define gaim_prefs_disconnect_callback purple_prefs_disconnect_callback
    -#define gaim_prefs_disconnect_by_handle purple_prefs_disconnect_by_handle
    -#define gaim_prefs_trigger_callback purple_prefs_trigger_callback
    -#define gaim_prefs_load purple_prefs_load
    -#define gaim_prefs_update_old purple_prefs_update_old
    -
    -/* from privacy.h */
    -
    -#define GAIM_PRIVACY_ALLOW_ALL PURPLE_PRIVACY_ALLOW_ALL
    -#define GAIM_PRIVACY_DENY_ALL PURPLE_PRIVACY_DENY_ALL
    -#define GAIM_PRIVACY_ALLOW_USERS PURPLE_PRIVACY_ALLOW_USERS
    -#define GAIM_PRIVACY_DENY_USERS PURPLE_PRIVACY_DENY_USERS
    -#define GAIM_PRIVACY_ALLOW_BUDDYLIST PURPLE_PRIVACY_ALLOW_BUDDYLIST
    -#define GaimPrivacyType PurplePrivacyType
    -
    -#define GaimPrivacyUiOps PurplePrivacyUiOps
    -
    -#define gaim_privacy_permit_add purple_privacy_permit_add
    -#define gaim_privacy_permit_remove purple_privacy_permit_remove
    -#define gaim_privacy_deny_add purple_privacy_deny_add
    -#define gaim_privacy_deny_remove purple_privacy_deny_remove
    -#define gaim_privacy_allow purple_privacy_allow
    -#define gaim_privacy_deny purple_privacy_deny
    -#define gaim_privacy_check purple_privacy_check
    -#define gaim_privacy_set_ui_ops purple_privacy_set_ui_ops
    -#define gaim_privacy_get_ui_ops purple_privacy_get_ui_ops
    -#define gaim_privacy_init purple_privacy_init
    -
    -/* from proxy.h */
    -
    -#define GAIM_PROXY_USE_GLOBAL PURPLE_PROXY_USE_GLOBAL
    -#define GAIM_PROXY_NONE PURPLE_PROXY_NONE
    -#define GAIM_PROXY_HTTP PURPLE_PROXY_HTTP
    -#define GAIM_PROXY_SOCKS4 PURPLE_PROXY_SOCKS4
    -#define GAIM_PROXY_SOCKS5 PURPLE_PROXY_SOCKS5
    -#define GAIM_PROXY_USE_ENVVAR PURPLE_PROXY_USE_ENVVAR
    -#define GaimProxyType PurpleProxyType
    -
    -#define GaimProxyInfo PurpleProxyInfo
    -
    -#define GaimProxyConnectData PurpleProxyConnectData
    -#define GaimProxyConnectFunction PurpleProxyConnectFunction
    -
    -#define gaim_proxy_info_new purple_proxy_info_new
    -#define gaim_proxy_info_destroy purple_proxy_info_destroy
    -#define gaim_proxy_info_set_type purple_proxy_info_set_type
    -#define gaim_proxy_info_set_host purple_proxy_info_set_host
    -#define gaim_proxy_info_set_port purple_proxy_info_set_port
    -#define gaim_proxy_info_set_username purple_proxy_info_set_username
    -#define gaim_proxy_info_set_password purple_proxy_info_set_password
    -#define gaim_proxy_info_get_type purple_proxy_info_get_type
    -#define gaim_proxy_info_get_host purple_proxy_info_get_host
    -#define gaim_proxy_info_get_port purple_proxy_info_get_port
    -#define gaim_proxy_info_get_username purple_proxy_info_get_username
    -#define gaim_proxy_info_get_password purple_proxy_info_get_password
    -
    -#define gaim_global_proxy_get_info purple_global_proxy_get_info
    -#define gaim_proxy_get_handle purple_proxy_get_handle
    -#define gaim_proxy_init purple_proxy_init
    -#define gaim_proxy_uninit purple_proxy_uninit
    -#define gaim_proxy_get_setup purple_proxy_get_setup
    -
    -#define gaim_proxy_connect purple_proxy_connect
    -#define gaim_proxy_connect_socks5 purple_proxy_connect_socks5
    -#define gaim_proxy_connect_cancel purple_proxy_connect_cancel
    -#define gaim_proxy_connect_cancel_with_handle purple_proxy_connect_cancel_with_handle
    -
    -/* from prpl.h */
    -
    -#define GaimPluginProtocolInfo PurplePluginProtocolInfo
    -
    -#define GAIM_ICON_SCALE_DISPLAY PURPLE_ICON_SCALE_DISPLAY
    -#define GAIM_ICON_SCALE_SEND PURPLE_ICON_SCALE_SEND
    -#define GaimIconScaleRules PurpleIconScaleRules
    -
    -#define GaimBuddyIconSpec PurpleBuddyIconSpec
    -
    -#define GaimProtocolOptions PurpleProtocolOptions
    -
    -#define GAIM_IS_PROTOCOL_PLUGIN PURPLE_IS_PROTOCOL_PLUGIN
    -
    -#define GAIM_PLUGIN_PROTOCOL_INFO PURPLE_PLUGIN_PROTOCOL_INFO
    -
    -#define gaim_prpl_got_account_idle purple_prpl_got_account_idle
    -#define gaim_prpl_got_account_login_time purple_prpl_got_account_login_time
    -#define gaim_prpl_got_account_status purple_prpl_got_account_status
    -#define gaim_prpl_got_user_idle purple_prpl_got_user_idle
    -#define gaim_prpl_got_user_login_time purple_prpl_got_user_login_time
    -#define gaim_prpl_got_user_status purple_prpl_got_user_status
    -#define gaim_prpl_change_account_status purple_prpl_change_account_status
    -#define gaim_prpl_get_statuses purple_prpl_get_statuses
    -
    -#define gaim_find_prpl purple_find_prpl
    -
    -/* from request.h */
    -
    -#define GAIM_DEFAULT_ACTION_NONE PURPLE_DEFAULT_ACTION_NONE
    -
    -#define GAIM_REQUEST_INPUT PURPLE_REQUEST_INPUT
    -#define GAIM_REQUEST_CHOICE PURPLE_REQUEST_CHOICE
    -#define GAIM_REQUEST_ACTION PURPLE_REQUEST_ACTION
    -#define GAIM_REQUEST_FIELDS PURPLE_REQUEST_FIELDS
    -#define GAIM_REQUEST_FILE PURPLE_REQUEST_FILE
    -#define GAIM_REQUEST_FOLDER PURPLE_REQUEST_FOLDER
    -#define GaimRequestType PurpleRequestType
    -
    -#define GAIM_REQUEST_FIELD_NONE PURPLE_REQUEST_FIELD_NONE
    -#define GAIM_REQUEST_FIELD_STRING PURPLE_REQUEST_FIELD_STRING
    -#define GAIM_REQUEST_FIELD_INTEGER PURPLE_REQUEST_FIELD_INTEGER
    -#define GAIM_REQUEST_FIELD_BOOLEAN PURPLE_REQUEST_FIELD_BOOLEAN
    -#define GAIM_REQUEST_FIELD_CHOICE PURPLE_REQUEST_FIELD_CHOICE
    -#define GAIM_REQUEST_FIELD_LIST PURPLE_REQUEST_FIELD_LIST
    -#define GAIM_REQUEST_FIELD_LABEL PURPLE_REQUEST_FIELD_LABEL
    -#define GAIM_REQUEST_FIELD_IMAGE PURPLE_REQUEST_FIELD_IMAGE
    -#define GAIM_REQUEST_FIELD_ACCOUNT PURPLE_REQUEST_FIELD_ACCOUNT
    -#define GaimRequestFieldType PurpleRequestFieldType
    -
    -#define GaimRequestFields PurpleRequestFields
    -
    -#define GaimRequestFieldGroup PurpleRequestFieldGroup
    -
    -#define GaimRequestField PurpleRequestField
    -
    -#define GaimRequestUiOps PurpleRequestUiOps
    -
    -#define GaimRequestInputCb PurpleRequestInputCb
    -#define GaimRequestActionCb PurpleRequestActionCb
    -#define GaimRequestChoiceCb PurpleRequestChoiceCb
    -#define GaimRequestFieldsCb PurpleRequestFieldsCb
    -#define GaimRequestFileCb PurpleRequestFileCb
    -
    -#define gaim_request_fields_new purple_request_fields_new
    -#define gaim_request_fields_destroy purple_request_fields_destroy
    -#define gaim_request_fields_add_group purple_request_fields_add_group
    -#define gaim_request_fields_get_groups purple_request_fields_get_groups
    -#define gaim_request_fields_exists purple_request_fields_exists
    -#define gaim_request_fields_get_required purple_request_fields_get_required
    -#define gaim_request_fields_is_field_required purple_request_fields_is_field_required
    -#define gaim_request_fields_all_required_filled purple_request_fields_all_required_filled
    -#define gaim_request_fields_get_field purple_request_fields_get_field
    -#define gaim_request_fields_get_string purple_request_fields_get_string
    -#define gaim_request_fields_get_integer purple_request_fields_get_integer
    -#define gaim_request_fields_get_bool purple_request_fields_get_bool
    -#define gaim_request_fields_get_choice purple_request_fields_get_choice
    -#define gaim_request_fields_get_account purple_request_fields_get_account
    -
    -#define gaim_request_field_group_new purple_request_field_group_new
    -#define gaim_request_field_group_destroy purple_request_field_group_destroy
    -#define gaim_request_field_group_add_field purple_request_field_group_add_field
    -#define gaim_request_field_group_get_title purple_request_field_group_get_title
    -#define gaim_request_field_group_get_fields purple_request_field_group_get_fields
    -
    -#define gaim_request_field_new purple_request_field_new
    -#define gaim_request_field_destroy purple_request_field_destroy
    -#define gaim_request_field_set_label purple_request_field_set_label
    -#define gaim_request_field_set_visible purple_request_field_set_visible
    -#define gaim_request_field_set_type_hint purple_request_field_set_type_hint
    -#define gaim_request_field_set_required purple_request_field_set_required
    -#define gaim_request_field_get_type purple_request_field_get_type
    -#define gaim_request_field_get_id purple_request_field_get_id
    -#define gaim_request_field_get_label purple_request_field_get_label
    -#define gaim_request_field_is_visible purple_request_field_is_visible
    -#define gaim_request_field_get_type_hint purple_request_field_get_type_hint
    -#define gaim_request_field_is_required purple_request_field_is_required
    -
    -#define gaim_request_field_string_new purple_request_field_string_new
    -#define gaim_request_field_string_set_default_value \
    - purple_request_field_string_set_default_value
    -#define gaim_request_field_string_set_value purple_request_field_string_set_value
    -#define gaim_request_field_string_set_masked purple_request_field_string_set_masked
    -#define gaim_request_field_string_set_editable purple_request_field_string_set_editable
    -#define gaim_request_field_string_get_default_value \
    - purple_request_field_string_get_default_value
    -#define gaim_request_field_string_get_value purple_request_field_string_get_value
    -#define gaim_request_field_string_is_multiline purple_request_field_string_is_multiline
    -#define gaim_request_field_string_is_masked purple_request_field_string_is_masked
    -#define gaim_request_field_string_is_editable purple_request_field_string_is_editable
    -
    -#define gaim_request_field_int_new purple_request_field_int_new
    -#define gaim_request_field_int_set_default_value \
    - purple_request_field_int_set_default_value
    -#define gaim_request_field_int_set_value purple_request_field_int_set_value
    -#define gaim_request_field_int_get_default_value \
    - purple_request_field_int_get_default_value
    -#define gaim_request_field_int_get_value purple_request_field_int_get_value
    -
    -#define gaim_request_field_bool_new purple_request_field_bool_new
    -#define gaim_request_field_bool_set_default_value \
    - purple_request_field_book_set_default_value
    -#define gaim_request_field_bool_set_value purple_request_field_bool_set_value
    -#define gaim_request_field_bool_get_default_value \
    - purple_request_field_bool_get_default_value
    -#define gaim_request_field_bool_get_value purple_request_field_bool_get_value
    -
    -#define gaim_request_field_choice_new purple_request_field_choice_new
    -#define gaim_request_field_choice_add purple_request_field_choice_add
    -#define gaim_request_field_choice_set_default_value \
    - purple_request_field_choice_set_default_value
    -#define gaim_request_field_choice_set_value purple_request_field_choice_set_value
    -#define gaim_request_field_choice_get_default_value \
    - purple_request_field_choice_get_default_value
    -#define gaim_request_field_choice_get_value purple_request_field_choice_get_value
    -#define gaim_request_field_choice_get_labels purple_request_field_choice_get_labels
    -
    -#define gaim_request_field_list_new purple_request_field_list_new
    -#define gaim_request_field_list_set_multi_select purple_request_field_list_set_multi_select
    -#define gaim_request_field_list_get_multi_select purple_request_field_list_get_multi_select
    -#define gaim_request_field_list_get_data purple_request_field_list_get_data
    -#define gaim_request_field_list_add purple_request_field_list_add
    -#define gaim_request_field_list_add_selected purple_request_field_list_add_selected
    -#define gaim_request_field_list_clear_selected purple_request_field_list_clear_selected
    -#define gaim_request_field_list_set_selected purple_request_field_list_set_selected
    -#define gaim_request_field_list_is_selected purple_request_field_list_is_selected
    -#define gaim_request_field_list_get_selected purple_request_field_list_get_selected
    -#define gaim_request_field_list_get_items purple_request_field_list_get_items
    -
    -#define gaim_request_field_label_new purple_request_field_label_new
    -
    -#define gaim_request_field_image_new purple_request_field_image_new
    -#define gaim_request_field_image_set_scale purple_request_field_image_set_scale
    -#define gaim_request_field_image_get_buffer purple_request_field_image_get_buffer
    -#define gaim_request_field_image_get_size purple_request_field_image_get_size
    -#define gaim_request_field_image_get_scale_x purple_request_field_image_get_scale_x
    -#define gaim_request_field_image_get_scale_y purple_request_field_image_get_scale_y
    -
    -#define gaim_request_field_account_new purple_request_field_account_new
    -#define gaim_request_field_account_set_default_value purple_request_field_account_set_default_value
    -#define gaim_request_field_account_set_value purple_request_field_account_set_value
    -#define gaim_request_field_account_set_show_all purple_request_field_account_set_show_all
    -#define gaim_request_field_account_set_filter purple_request_field_account_set_filter
    -#define gaim_request_field_account_get_default_value purple_request_field_account_get_default_value
    -#define gaim_request_field_account_get_value purple_request_field_account_get_value
    -#define gaim_request_field_account_get_show_all purple_request_field_account_get_show_all
    -#define gaim_request_field_account_get_filter purple_request_field_account_get_filter
    -
    -#define gaim_request_input purple_request_input
    -#define gaim_request_choice purple_request_choice
    -#define gaim_request_choice_varg purple_request_choice_varg
    -#define gaim_request_action purple_request_action
    -#define gaim_request_action_varg purple_request_action_varg
    -#define gaim_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, user_data) purple_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, NULL, NULL, NULL, user_data)
    -#define gaim_request_close purple_request_close
    -#define gaim_request_close_with_handle purple_request_close_with_handle
    -
    -#define gaim_request_yes_no purple_request_yes_no
    -#define gaim_request_ok_cancel purple_request_ok_cancel
    -#define gaim_request_accept_cancel purple_request_accept_cancel
    -
    -#define gaim_request_file purple_request_file
    -#define gaim_request_folder purple_request_folder
    -
    -#define gaim_request_set_ui_ops purple_request_set_ui_ops
    -#define gaim_request_get_ui_ops purple_request_get_ui_ops
    -
    -/* from roomlist.h */
    -
    -#define GaimRoomlist PurpleRoomlist
    -#define GaimRoomlistRoom PurpleRoomlistRoom
    -#define GaimRoomlistField PurpleRoomlistField
    -#define GaimRoomlistUiOps PurpleRoomlistUiOps
    -
    -#define GAIM_ROOMLIST_ROOMTYPE_CATEGORY PURPLE_ROOMLIST_ROOMTYPE_CATEGORY
    -#define GAIM_ROOMLIST_ROOMTYPE_ROOM PURPLE_ROOMLIST_ROOMTYPE_ROOM
    -#define GaimRoomlistRoomType PurpleRoomlistRoomType
    -
    -#define GAIM_ROOMLIST_FIELD_BOOL PURPLE_ROOMLIST_BOOL
    -#define GAIM_ROOMLIST_FIELD_INT PURPLE_ROOMLIST_INT
    -#define GAIM_ROOMLIST_FIELD_STRING PURPLE_ROOMLIST_STRING
    -#define GaimRoomlistFieldType PurpleRoomlistFieldType
    -
    -#define gaim_roomlist_show_with_account purple_roomlist_show_with_account
    -#define gaim_roomlist_new purple_roomlist_new
    -#define gaim_roomlist_ref purple_roomlist_ref
    -#define gaim_roomlist_unref purple_roomlist_unref
    -#define gaim_roomlist_set_fields purple_roomlist_set_fields
    -#define gaim_roomlist_set_in_progress purple_roomlist_set_in_progress
    -#define gaim_roomlist_get_in_progress purple_roomlist_get_in_progress
    -#define gaim_roomlist_room_add purple_roomlist_room_add
    -
    -#define gaim_roomlist_get_list purple_roomlist_get_list
    -#define gaim_roomlist_cancel_get_list purple_roomlist_cancel_get_list
    -#define gaim_roomlist_expand_category purple_roomlist_expand_category
    -
    -#define gaim_roomlist_room_new purple_roomlist_room_new
    -#define gaim_roomlist_room_add_field purple_roomlist_room_add_field
    -#define gaim_roomlist_room_join purple_roomlist_room_join
    -#define gaim_roomlist_field_new purple_roomlist_field_new
    -
    -#define gaim_roomlist_set_ui_ops purple_roomlist_set_ui_ops
    -#define gaim_roomlist_get_ui_ops purple_roomlist_get_ui_ops
    -
    -/* from savedstatuses.h */
    -
    -#define GaimSavedStatus PurpleSavedStatus
    -#define GaimSavedStatusSub PurpleSavedStatusSub
    -
    -#define gaim_savedstatus_new purple_savedstatus_new
    -#define gaim_savedstatus_set_title purple_savedstatus_set_title
    -#define gaim_savedstatus_set_type purple_savedstatus_set_type
    -#define gaim_savedstatus_set_message purple_savedstatus_set_message
    -#define gaim_savedstatus_set_substatus purple_savedstatus_set_substatus
    -#define gaim_savedstatus_unset_substatus purple_savedstatus_unset_substatus
    -#define gaim_savedstatus_delete purple_savedstatus_delete
    -
    -#define gaim_savedstatuses_get_all purple_savedstatuses_get_all
    -#define gaim_savedstatuses_get_popular purple_savedstatuses_get_popular
    -#define gaim_savedstatus_get_current purple_savedstatus_get_current
    -#define gaim_savedstatus_get_default purple_savedstatus_get_default
    -#define gaim_savedstatus_get_idleaway purple_savedstatus_get_idleaway
    -#define gaim_savedstatus_is_idleaway purple_savedstatus_is_idleaway
    -#define gaim_savedstatus_set_idleaway purple_savedstatus_set_idleaway
    -#define gaim_savedstatus_get_startup purple_savedstatus_get_startup
    -#define gaim_savedstatus_find purple_savedstatus_find
    -#define gaim_savedstatus_find_by_creation_time purple_savedstatus_find_by_creation_time
    -#define gaim_savedstatus_find_transient_by_type_and_message \
    - purple_savedstatus_find_transient_by_type_and_message
    -
    -#define gaim_savedstatus_is_transient purple_savedstatus_is_transient
    -#define gaim_savedstatus_get_title purple_savedstatus_get_title
    -#define gaim_savedstatus_get_type purple_savedstatus_get_type
    -#define gaim_savedstatus_get_message purple_savedstatus_get_message
    -#define gaim_savedstatus_get_creation_time purple_savedstatus_get_creation_time
    -#define gaim_savedstatus_has_substatuses purple_savedstatus_has_substatuses
    -#define gaim_savedstatus_get_substatus purple_savedstatus_get_substatus
    -#define gaim_savedstatus_substatus_get_type purple_savedstatus_substatus_get_type
    -#define gaim_savedstatus_substatus_get_message purple_savedstatus_substatus_get_message
    -#define gaim_savedstatus_activate purple_savedstatus_activate
    -#define gaim_savedstatus_activate_for_account purple_savedstatus_activate_for_account
    -
    -#define gaim_savedstatuses_get_handle purple_savedstatuses_get_handle
    -#define gaim_savedstatuses_init purple_savedstatuses_init
    -#define gaim_savedstatuses_uninit purple_savedstatuses_uninit
    -
    -/* from signals.h */
    -
    -#define GAIM_CALLBACK PURPLE_CALLBACK
    -
    -#define GaimCallback PurpleCallback
    -#define GaimSignalMarshalFunc PurpleSignalMarshalFunc
    -
    -#define GAIM_SIGNAL_PRIORITY_DEFAULT PURPLE_SIGNAL_PRIORITY_DEFAULT
    -#define GAIM_SIGNAL_PRIORITY_HIGHEST PURPLE_SIGNAL_PRIORITY_HIGHEST
    -#define GAIM_SIGNAL_PRIORITY_LOWEST PURPLE_SIGNAL_PRIORITY_LOWEST
    -
    -#define gaim_signal_register purple_signal_register
    -#define gaim_signal_unregister purple_signal_unregister
    -
    -#define gaim_signals_unregister_by_instance purple_signals_unregister_by_instance
    -
    -#define gaim_signal_get_values purple_signal_get_values
    -#define gaim_signal_connect_priority purple_signal_connect_priority
    -#define gaim_signal_connect purple_signal_connect
    -#define gaim_signal_connect_priority_vargs purple_signal_connect_priority_vargs
    -#define gaim_signal_connect_vargs purple_signal_connect_vargs
    -#define gaim_signal_disconnect purple_signal_disconnect
    -
    -#define gaim_signals_disconnect_by_handle purple_signals_disconnect_by_handle
    -
    -#define gaim_signal_emit purple_signal_emit
    -#define gaim_signal_emit_vargs purple_signal_emit_vargs
    -#define gaim_signal_emit_return_1 purple_signal_emit_vargs
    -#define gaim_signal_emit_vargs_return_1 purple_signal_emit_vargs_return_1
    -
    -#define gaim_signals_init purple_signals_init
    -#define gaim_signals_uninit purple_signals_uninit
    -
    -#define gaim_marshal_VOID \
    - purple_marshal_VOID
    -#define gaim_marshal_VOID__INT \
    - purple_marshal_VOID__INT
    -#define gaim_marshal_VOID__INT_INT \
    - purple_marshal_VOID_INT_INT
    -#define gaim_marshal_VOID__POINTER \
    - purple_marshal_VOID__POINTER
    -#define gaim_marshal_VOID__POINTER_UINT \
    - purple_marshal_VOID__POINTER_UINT
    -#define gaim_marshal_VOID__POINTER_INT_INT \
    - purple_marshal_VOID__POINTER_INT_INT
    -#define gaim_marshal_VOID__POINTER_POINTER \
    - purple_marshal_VOID__POINTER_POINTER
    -#define gaim_marshal_VOID__POINTER_POINTER_UINT \
    - purple_marshal_VOID__POINTER_POINTER_UINT
    -#define gaim_marshal_VOID__POINTER_POINTER_UINT_UINT \
    - purple_marshal_VOID__POINTER_POINTER_UINT_UINT
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER \
    - purple_marshal_VOID__POINTER_POINTER_POINTER
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER \
    - purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER \
    - purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT \
    - purple_marshal_VOID__POINTER_POINTER_POINTER_UINT
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT \
    - purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT
    -#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT \
    - purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT
    -
    -#define gaim_marshal_INT__INT \
    - purple_marshal_INT__INT
    -#define gaim_marshal_INT__INT_INT \
    - purple_marshal_INT__INT_INT
    -#define gaim_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER \
    - purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER
    -
    -#define gaim_marshal_BOOLEAN__POINTER \
    - purple_marshal_BOOLEAN__POINTER
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER \
    - purple_marshal_BOOLEAN__POINTER_POINTER
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER \
    - purple_marshal_BOOLEAN__POINTER_POINTER_POINTER
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER_UINT \
    - purple_marshal_BOOLEAN__POINTER_POINTER_UINT
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT \
    - purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER \
    - purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER
    -#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER \
    - purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER
    -
    -#define gaim_marshal_BOOLEAN__INT_POINTER \
    - purple_marshal_BOOLEAN__INT_POINTER
    -
    -#define gaim_marshal_POINTER__POINTER_INT \
    - purple_marshal_POINTER__POINTER_INT
    -#define gaim_marshal_POINTER__POINTER_INT64 \
    - purple_marshal_POINTER__POINTER_INT64
    -#define gaim_marshal_POINTER__POINTER_INT_BOOLEAN \
    - purple_marshal_POINTER__POINTER_INT_BOOLEAN
    -#define gaim_marshal_POINTER__POINTER_INT64_BOOLEAN \
    - purple_marshal_POINTER__POINTER_INT64_BOOLEAN
    -#define gaim_marshal_POINTER__POINTER_POINTER \
    - purple_marshal_POINTER__POINTER_POINTER
    -
    -/* from sound.h */
    -
    -#define GAIM_SOUND_BUDDY_ARRIVE PURPLE_SOUND_BUDDY_ARRIVE
    -#define GAIM_SOUND_BUDDY_LEAVE PURPLE_SOUND_BUDDY_LEAVE
    -#define GAIM_SOUND_RECEIVE PURPLE_SOUND_RECEIVE
    -#define GAIM_SOUND_FIRST_RECEIVE PURPLE_SOUND_FIRST_RECEIVE
    -#define GAIM_SOUND_SEND PURPLE_SOUND_SEND
    -#define GAIM_SOUND_CHAT_JOIN PURPLE_SOUND_CHAT_JOIN
    -#define GAIM_SOUND_CHAT_LEAVE PURPLE_SOUND_CHAT_LEAVE
    -#define GAIM_SOUND_CHAT_YOU_SAY PURPLE_SOUND_CHAT_YOU_SAY
    -#define GAIM_SOUND_CHAT_SAY PURPLE_SOUND_CHAT_SAY
    -#define GAIM_SOUND_POUNCE_DEFAULT PURPLE_SOUND_POUNCE_DEFAULT
    -#define GAIM_SOUND_CHAT_NICK PURPLE_SOUND_CHAT_NICK
    -#define GAIM_NUM_SOUNDS PURPLE_NUM_SOUNDS
    -#define GaimSoundEventID PurpleSoundEventID
    -
    -#define GaimSoundUiOps PurpleSoundUiOps
    -
    -#define gaim_sound_play_file purple_sound_play_file
    -#define gaim_sound_play_event purple_sound_play_event
    -#define gaim_sound_set_ui_ops purple_sound_set_ui_ops
    -#define gaim_sound_get_ui_ops purple_sound_get_ui_ops
    -#define gaim_sound_init purple_sound_init
    -#define gaim_sound_uninit purple_sound_uninit
    -
    -#define gaim_sounds_get_handle purple_sounds_get_handle
    -
    -/* from sslconn.h */
    -
    -#define GAIM_SSL_DEFAULT_PORT PURPLE_SSL_DEFAULT_PORT
    -
    -#define GAIM_SSL_HANDSHAKE_FAILED PURPLE_SSL_HANDSHAKE_FAILED
    -#define GAIM_SSL_CONNECT_FAILED PURPLE_SSL_CONNECT_FAILED
    -#define GaimSslErrorType PurpleSslErrorType
    -
    -#define GaimSslConnection PurpleSslConnection
    -
    -#define GaimSslInputFunction PurpleSslInputFunction
    -#define GaimSslErrorFunction PurpleSslErrorFunction
    -
    -#define GaimSslOps PurpleSslOps
    -
    -#define gaim_ssl_is_supported purple_ssl_is_supported
    -#define gaim_ssl_connect purple_ssl_connect
    -#define gaim_ssl_connect_fd purple_ssl_connect_fd
    -#define gaim_ssl_input_add purple_ssl_input_add
    -#define gaim_ssl_close purple_ssl_close
    -#define gaim_ssl_read purple_ssl_read
    -#define gaim_ssl_write purple_ssl_write
    -
    -#define gaim_ssl_set_ops purple_ssl_set_ops
    -#define gaim_ssl_get_ops purple_ssl_get_ops
    -#define gaim_ssl_init purple_ssl_init
    -#define gaim_ssl_uninit purple_ssl_uninit
    -
    -/* from status.h */
    -
    -#define GaimStatusType PurpleStatusType
    -#define GaimStatusAttr PurpleStatusAttr
    -#define GaimPresence PurplePresence
    -#define GaimStatus PurpleStatus
    -
    -#define GAIM_PRESENCE_CONTEXT_UNSET PURPLE_PRESENCE_CONTEXT_UNSET
    -#define GAIM_PRESENCE_CONTEXT_ACCOUNT PURPLE_PRESENCE_CONTEXT_ACCOUNT
    -#define GAIM_PRESENCE_CONTEXT_CONV PURPLE_PRESENCE_CONTEXT_CONV
    -#define GAIM_PRESENCE_CONTEXT_BUDDY PURPLE_PRESENCE_CONTEXT_BUDDY
    -#define GaimPresenceContext PurplePresenceContext
    -
    -#define GAIM_STATUS_UNSET PURPLE_STATUS_UNSET
    -#define GAIM_STATUS_OFFLINE PURPLE_STATUS_OFFLINE
    -#define GAIM_STATUS_AVAILABLE PURPLE_STATUS_AVAILABLE
    -#define GAIM_STATUS_UNAVAILABLE PURPLE_STATUS_UNAVAILABLE
    -#define GAIM_STATUS_INVISIBLE PURPLE_STATUS_INVISIBLE
    -#define GAIM_STATUS_AWAY PURPLE_STATUS_AWAY
    -#define GAIM_STATUS_EXTENDED_AWAY PURPLE_STATUS_EXTENDED_AWAY
    -#define GAIM_STATUS_MOBILE PURPLE_STATUS_MOBILE
    -#define GAIM_STATUS_NUM_PRIMITIVES PURPLE_STATUS_NUM_PRIMITIVES
    -#define GaimStatusPrimitive PurpleStatusPrimitive
    -
    -#define gaim_primitive_get_id_from_type purple_primitive_get_id_from_type
    -#define gaim_primitive_get_name_from_type purple_primitive_get_name_from_type
    -#define gaim_primitive_get_type_from_id purple_primitive_get_type_from_id
    -
    -#define gaim_status_type_new_full purple_status_type_new_full
    -#define gaim_status_type_new purple_status_type_new
    -#define gaim_status_type_new_with_attrs purple_status_type_new_with_attrs
    -#define gaim_status_type_destroy purple_status_type_destroy
    -#define gaim_status_type_set_primary_attr purple_status_type_set_primary_attr
    -#define gaim_status_type_add_attr purple_status_type_add_attr
    -#define gaim_status_type_add_attrs purple_status_type_add_attrs
    -#define gaim_status_type_add_attrs_vargs purple_status_type_add_attrs_vargs
    -#define gaim_status_type_get_primitive purple_status_type_get_primitive
    -#define gaim_status_type_get_id purple_status_type_get_id
    -#define gaim_status_type_get_name purple_status_type_get_name
    -#define gaim_status_type_is_saveable purple_status_type_is_saveable
    -#define gaim_status_type_is_user_settable purple_status_type_is_user_settable
    -#define gaim_status_type_is_independent purple_status_type_is_independent
    -#define gaim_status_type_is_exclusive purple_status_type_is_exclusive
    -#define gaim_status_type_is_available purple_status_type_is_available
    -#define gaim_status_type_get_primary_attr purple_status_type_get_primary_attr
    -#define gaim_status_type_get_attr purple_status_type_get_attr
    -#define gaim_status_type_get_attrs purple_status_type_get_attrs
    -#define gaim_status_type_find_with_id purple_status_type_find_with_id
    -
    -#define gaim_status_attr_new purple_status_attr_new
    -#define gaim_status_attr_destroy purple_status_attr_destroy
    -#define gaim_status_attr_get_id purple_status_attr_get_id
    -#define gaim_status_attr_get_name purple_status_attr_get_name
    -#define gaim_status_attr_get_value purple_status_attr_get_value
    -
    -#define gaim_status_new purple_status_new
    -#define gaim_status_destroy purple_status_destroy
    -#define gaim_status_set_active purple_status_set_active
    -#define gaim_status_set_active_with_attrs purple_status_set_active_with_attrs
    -#define gaim_status_set_active_with_attrs_list purple_status_set_active_with_attrs_list
    -#define gaim_status_set_attr_boolean purple_status_set_attr_boolean
    -#define gaim_status_set_attr_int purple_status_set_attr_int
    -#define gaim_status_set_attr_string purple_status_set_attr_string
    -#define gaim_status_get_type purple_status_get_type
    -#define gaim_status_get_presence purple_status_get_presence
    -#define gaim_status_get_id purple_status_get_id
    -#define gaim_status_get_name purple_status_get_name
    -#define gaim_status_is_independent purple_status_is_independent
    -#define gaim_status_is_exclusive purple_status_is_exclusive
    -#define gaim_status_is_available purple_status_is_available
    -#define gaim_status_is_active purple_status_is_active
    -#define gaim_status_is_online purple_status_is_online
    -#define gaim_status_get_attr_value purple_status_get_attr_value
    -#define gaim_status_get_attr_boolean purple_status_get_attr_boolean
    -#define gaim_status_get_attr_int purple_status_get_attr_int
    -#define gaim_status_get_attr_string purple_status_get_attr_string
    -#define gaim_status_compare purple_status_compare
    -
    -#define gaim_presence_new purple_presence_new
    -#define gaim_presence_new_for_account purple_presence_new_for_account
    -#define gaim_presence_new_for_conv purple_presence_new_for_conv
    -#define gaim_presence_new_for_buddy purple_presence_new_for_buddy
    -#define gaim_presence_destroy purple_presence_destroy
    -#define gaim_presence_add_status purple_presence_add_status
    -#define gaim_presence_add_list purple_presence_add_list
    -#define gaim_presence_set_status_active purple_presence_set_status_active
    -#define gaim_presence_switch_status purple_presence_switch_status
    -#define gaim_presence_set_idle purple_presence_set_idle
    -#define gaim_presence_set_login_time purple_presence_set_login_time
    -#define gaim_presence_get_context purple_presence_get_context
    -#define gaim_presence_get_account purple_presence_get_account
    -#define gaim_presence_get_conversation purple_presence_get_conversation
    -#define gaim_presence_get_chat_user purple_presence_get_chat_user
    -#define gaim_presence_get_statuses purple_presence_get_statuses
    -#define gaim_presence_get_status purple_presence_get_status
    -#define gaim_presence_get_active_status purple_presence_get_active_status
    -#define gaim_presence_is_available purple_presence_is_available
    -#define gaim_presence_is_online purple_presence_is_online
    -#define gaim_presence_is_status_active purple_presence_is_status_active
    -#define gaim_presence_is_status_primitive_active \
    - purple_presence_is_status_primitive_active
    -#define gaim_presence_is_idle purple_presence_is_idle
    -#define gaim_presence_get_idle_time purple_presence_get_idle_time
    -#define gaim_presence_get_login_time purple_presence_get_login_time
    -#define gaim_presence_compare purple_presence_compare
    -
    -#define gaim_status_get_handle purple_status_get_handle
    -#define gaim_status_init purple_status_init
    -#define gaim_status_uninit purple_status_uninit
    -
    -/* from stringref.h */
    -
    -#define GaimStringref PurpleStringref
    -
    -#define gaim_stringref_new purple_stringref_new
    -#define gaim_stringref_new_noref purple_stringref_new_noref
    -#define gaim_stringref_printf purple_stringref_printf
    -#define gaim_stringref_ref purple_stringref_ref
    -#define gaim_stringref_unref purple_stringref_unref
    -#define gaim_stringref_value purple_stringref_value
    -#define gaim_stringref_cmp purple_stringref_cmp
    -#define gaim_stringref_len purple_stringref_len
    -
    -/* from stun.h */
    -
    -#define GaimStunNatDiscovery PurpleStunNatDiscovery
    -
    -#define GAIM_STUN_STATUS_UNDISCOVERED PURPLE_STUN_STATUS_UNDISCOVERED
    -#define GAIM_STUN_STATUS_UNKNOWN PURPLE_STUN_STATUS_UNKNOWN
    -#define GAIM_STUN_STATUS_DISCOVERING PURPLE_STUN_STATUS_DISCOVERING
    -#define GAIM_STUN_STATUS_DISCOVERED PURPLE_STUN_STATUS_DISCOVERED
    -#define GaimStunStatus PurpleStunStatus
    -
    -#define GAIM_STUN_NAT_TYPE_PUBLIC_IP PURPLE_STUN_NAT_TYPE_PUBLIC_IP
    -#define GAIM_STUN_NAT_TYPE_UNKNOWN_NAT PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT
    -#define GAIM_STUN_NAT_TYPE_FULL_CONE PURPLE_STUN_NAT_TYPE_FULL_CONE
    -#define GAIM_STUN_NAT_TYPE_RESTRICTED_CONE PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE
    -#define GAIM_STUN_NAT_TYPE_PORT_RESTRICTED_CONE PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE
    -#define GAIM_STUN_NAT_TYPE_SYMMETRIC PURPLE_STUN_NAT_TYPE_SYMMETRIC
    -#define GaimStunNatType PurpleStunNatType
    -
    -/* why didn't this have a Gaim prefix before? */
    -#define StunCallback PurpleStunCallback
    -
    -#define gaim_stun_discover purple_stun_discover
    -#define gaim_stun_init purple_stun_init
    -
    -/* from upnp.h */
    -
    -/* suggested rename: PurpleUPnpMappingHandle */
    -#define UPnPMappingAddRemove PurpleUPnPMappingAddRemove
    -
    -#define GaimUPnPCallback PurpleUPnPCallback
    -
    -#define gaim_upnp_discover purple_upnp_discover
    -#define gaim_upnp_get_public_ip purple_upnp_get_public_ip
    -#define gaim_upnp_cancel_port_mapping purple_upnp_cancel_port_mapping
    -#define gaim_upnp_set_port_mapping purple_upnp_set_port_mapping
    -
    -#define gaim_upnp_remove_port_mapping purple_upnp_remove_port_mapping
    -
    -/* from util.h */
    -
    -#define GaimUtilFetchUrlData PurpleUtilFetchUrlData
    -#define GaimMenuAction PurpleMenuAction
    -
    -#define GaimInfoFieldFormatCallback PurpleIntoFieldFormatCallback
    -
    -#define GaimKeyValuePair PurpleKeyValuePair
    -
    -#define gaim_menu_action_new purple_menu_action_new
    -#define gaim_menu_action_free purple_menu_action_free
    -
    -#define gaim_base16_encode purple_base16_encode
    -#define gaim_base16_decode purple_base16_decode
    -#define gaim_base64_encode purple_base64_encode
    -#define gaim_base64_decode purple_base64_decode
    -#define gaim_quotedp_decode purple_quotedp_decode
    -
    -#define gaim_mime_decode_field purple_mime_deco_field
    -
    -#define gaim_utf8_strftime purple_utf8_strftime
    -#define gaim_date_format_short purple_date_format_short
    -#define gaim_date_format_long purple_date_format_long
    -#define gaim_date_format_full purple_date_format_full
    -#define gaim_time_format purple_time_format
    -#define gaim_time_build purple_time_build
    -
    -#define GAIM_NO_TZ_OFF PURPLE_NO_TZ_OFF
    -
    -#define gaim_str_to_time purple_str_to_time
    -
    -#define gaim_markup_find_tag purple_markup_find_tag
    -#define gaim_markup_extract_info_field purple_markup_extract_info_field
    -#define gaim_markup_html_to_xhtml purple_markup_html_to_xhtml
    -#define gaim_markup_strip_html purple_markup_strip_html
    -#define gaim_markup_linkify purple_markup_linkify
    -#define gaim_markup_slice purple_markup_slice
    -#define gaim_markup_get_tag_name purple_markup_get_tag_name
    -#define gaim_unescape_html purple_unescape_html
    -
    -#define gaim_home_dir purple_home_dir
    -#define gaim_user_dir purple_user_dir
    -
    -#define gaim_util_set_user_dir purple_util_set_user_dir
    -
    -#define gaim_build_dir purple_build_dir
    -
    -#define gaim_util_write_data_to_file purple_util_write_data_to_file
    -
    -#define gaim_util_read_xml_from_file purple_util_read_xml_from_file
    -
    -#define gaim_mkstemp purple_mkstemp
    -
    -#define gaim_program_is_valid purple_program_is_valid
    -
    -#define gaim_running_gnome purple_running_gnome
    -#define gaim_running_kde purple_running_kde
    -#define gaim_running_osx purple_running_osx
    -
    -#define gaim_fd_get_ip purple_fd_get_ip
    -
    -#define gaim_normalize purple_normalize
    -#define gaim_normalize_nocase purple_normalize_nocase
    -
    -#define gaim_strdup_withhtml purple_strdup_withhtml
    -
    -#define gaim_str_has_prefix purple_str_has_prefix
    -#define gaim_str_has_suffix purple_str_has_suffix
    -#define gaim_str_add_cr purple_str_add_cr
    -#define gaim_str_strip_char purple_str_strip_char
    -
    -#define gaim_util_chrreplace purple_util_chrreplace
    -
    -#define gaim_strreplace purple_strreplace
    -
    -#define gaim_utf8_ncr_encode purple_utf8_ncr_encode
    -#define gaim_utf8_ncr_decode purple_utf8_ncr_decode
    -
    -#define gaim_strcasereplace purple_strcasereplace
    -#define gaim_strcasestr purple_strcasestr
    -
    -#define gaim_str_size_to_units purple_str_size_to_units
    -#define gaim_str_seconds_to_string purple_str_seconds_to_string
    -#define gaim_str_binary_to_ascii purple_str_binary_to_ascii
    -
    -
    -#define gaim_got_protocol_handler_uri purple_got_protocol_handler_uri
    -
    -#define gaim_url_parse purple_url_parse
    -
    -#define GaimUtilFetchUrlCallback PurpleUtilFetchUrlCallback
    -#define gaim_util_fetch_url purple_util_fetch_url
    -#define gaim_util_fetch_url_request purple_util_fetch_url_request
    -#define gaim_util_fetch_url_cancel purple_util_fetch_url_cancel
    -
    -#define gaim_url_decode purple_url_decode
    -#define gaim_url_encode purple_url_encode
    -
    -#define gaim_email_is_valid purple_email_is_valid
    -
    -#define gaim_uri_list_extract_uris purple_uri_list_extract_uris
    -#define gaim_uri_list_extract_filenames purple_uri_list_extract_filenames
    -
    -#define gaim_utf8_try_convert purple_utf8_try_convert
    -#define gaim_utf8_salvage purple_utf8_salvage
    -#define gaim_utf8_strcasecmp purple_utf8_strcasecmp
    -#define gaim_utf8_has_word purple_utf8_has_word
    -
    -#define gaim_print_utf8_to_console purple_print_utf8_to_console
    -
    -#define gaim_message_meify purple_message_meify
    -
    -#define gaim_text_strip_mnemonic purple_text_strip_mnemonic
    -
    -#define gaim_unescape_filename purple_unescape_filename
    -#define gaim_escape_filename purple_escape_filename
    -
    -/* from value.h */
    -
    -#define GAIM_TYPE_UNKNOWN PURPLE_TYPE_UNKNOWN
    -#define GAIM_TYPE_SUBTYPE PURPLE_TYPE_SUBTYPE
    -#define GAIM_TYPE_CHAR PURPLE_TYPE_CHAR
    -#define GAIM_TYPE_UCHAR PURPLE_TYPE_UCHAR
    -#define GAIM_TYPE_BOOLEAN PURPLE_TYPE_BOOLEAN
    -#define GAIM_TYPE_SHORT PURPLE_TYPE_SHORT
    -#define GAIM_TYPE_USHORT PURPLE_TYPE_USHORT
    -#define GAIM_TYPE_INT PURPLE_TYPE_INT
    -#define GAIM_TYPE_UINT PURPLE_TYPE_UINT
    -#define GAIM_TYPE_LONG PURPLE_TYPE_LONG
    -#define GAIM_TYPE_ULONG PURPLE_TYPE_ULONG
    -#define GAIM_TYPE_INT64 PURPLE_TYPE_INT64
    -#define GAIM_TYPE_UINT64 PURPLE_TYPE_UINT64
    -#define GAIM_TYPE_STRING PURPLE_TYPE_STRING
    -#define GAIM_TYPE_OBJECT PURPLE_TYPE_OBJECT
    -#define GAIM_TYPE_POINTER PURPLE_TYPE_POINTER
    -#define GAIM_TYPE_ENUM PURPLE_TYPE_ENUM
    -#define GAIM_TYPE_BOXED PURPLE_TYPE_BOXED
    -#define GaimType PurpleType
    -
    -
    -#define GAIM_SUBTYPE_UNKNOWN PURPLE_SUBTYPE_UNKNOWN
    -#define GAIM_SUBTYPE_ACCOUNT PURPLE_SUBTYPE_ACCOUNT
    -#define GAIM_SUBTYPE_BLIST PURPLE_SUBTYPE_BLIST
    -#define GAIM_SUBTYPE_BLIST_BUDDY PURPLE_SUBTYPE_BLIST_BUDDY
    -#define GAIM_SUBTYPE_BLIST_GROUP PURPLE_SUBTYPE_BLIST_GROUP
    -#define GAIM_SUBTYPE_BLIST_CHAT PURPLE_SUBTYPE_BLIST_CHAT
    -#define GAIM_SUBTYPE_BUDDY_ICON PURPLE_SUBTYPE_BUDDY_ICON
    -#define GAIM_SUBTYPE_CONNECTION PURPLE_SUBTYPE_CONNECTION
    -#define GAIM_SUBTYPE_CONVERSATION PURPLE_SUBTYPE_CONVERSATION
    -#define GAIM_SUBTYPE_PLUGIN PURPLE_SUBTYPE_PLUGIN
    -#define GAIM_SUBTYPE_BLIST_NODE PURPLE_SUBTYPE_BLIST_NODE
    -#define GAIM_SUBTYPE_CIPHER PURPLE_SUBTYPE_CIPHER
    -#define GAIM_SUBTYPE_STATUS PURPLE_SUBTYPE_STATUS
    -#define GAIM_SUBTYPE_LOG PURPLE_SUBTYPE_LOG
    -#define GAIM_SUBTYPE_XFER PURPLE_SUBTYPE_XFER
    -#define GAIM_SUBTYPE_SAVEDSTATUS PURPLE_SUBTYPE_SAVEDSTATUS
    -#define GAIM_SUBTYPE_XMLNODE PURPLE_SUBTYPE_XMLNODE
    -#define GAIM_SUBTYPE_USERINFO PURPLE_SUBTYPE_USERINFO
    -#define GaimSubType PurpleSubType
    -
    -#define GaimValue PurpleValue
    -
    -#define gaim_value_new purple_value_new
    -#define gaim_value_new_outgoing purple_value_new_outgoing
    -#define gaim_value_destroy purple_value_destroy
    -#define gaim_value_dup purple_value_dup
    -#define gaim_value_purple_buddy_icon_get_extensionget_type purple_value_get_type
    -#define gaim_value_get_subtype purple_value_get_subtype
    -#define gaim_value_get_specific_type purple_value_get_specific_type
    -#define gaim_value_is_outgoing purple_value_is_outgoing
    -#define gaim_value_set_char purple_value_set_char
    -#define gaim_value_set_uchar purple_value_set_uchar
    -#define gaim_value_set_boolean purple_value_set_boolean
    -#define gaim_value_set_short purple_value_set_short
    -#define gaim_value_set_ushort purple_value_set_ushort
    -#define gaim_value_set_int purple_value_set_int
    -#define gaim_value_set_uint purple_value_set_uint
    -#define gaim_value_set_long purple_value_set_long
    -#define gaim_value_set_ulong purple_value_set_ulong
    -#define gaim_value_set_int64 purple_value_set_int64
    -#define gaim_value_set_uint64 purple_value_set_uint64
    -#define gaim_value_set_string purple_value_set_string
    -#define gaim_value_set_object purple_value_set_object
    -#define gaim_value_set_pointer purple_value_set_pointer
    -#define gaim_value_set_enum purple_value_set_enum
    -#define gaim_value_set_boxed purple_value_set_boxed
    -#define gaim_value_get_char purple_value_get_char
    -#define gaim_value_get_uchar purple_value_get_uchar
    -#define gaim_value_get_boolean purple_value_get_boolean
    -#define gaim_value_get_short purple_value_get_short
    -#define gaim_value_get_ushort purple_value_get_ushort
    -#define gaim_value_get_int purple_value_get_int
    -#define gaim_value_get_uint purple_value_get_uint
    -#define gaim_value_get_long purple_value_get_long
    -#define gaim_value_get_ulong purple_value_get_ulong
    -#define gaim_value_get_int64 purple_value_get_int64
    -#define gaim_value_get_uint64 purple_value_get_uint64
    -#define gaim_value_get_string purple_value_get_string
    -#define gaim_value_get_object purple_value_get_object
    -#define gaim_value_get_pointer purple_value_get_pointer
    -#define gaim_value_get_enum purple_value_get_enum
    -#define gaim_value_get_boxed purple_value_get_boxed
    -
    -/* from version.h */
    -
    -#define GAIM_MAJOR_VERSION PURPLE_MAJOR_VERSION
    -#define GAIM_MINOR_VERSION PURPLE_MINOR_VERSION
    -#define GAIM_MICRO_VERSION PURPLE_MICRO_VERSION
    -
    -#define GAIM_VERSION_CHECK PURPLE_VERSION_CHECK
    -
    -/* from whiteboard.h */
    -
    -#define GaimWhiteboardPrplOps PurpleWhiteboardPrplOps
    -#define GaimWhiteboard PurpleWhiteboard
    -#define GaimWhiteboardUiOps PurpleWhiteboardUiOps
    -
    -#define gaim_whiteboard_set_ui_ops purple_whiteboard_set_ui_ops
    -#define gaim_whiteboard_set_prpl_ops purple_whiteboard_set_prpl_ops
    -
    -#define gaim_whiteboard_create purple_whiteboard_create
    -#define gaim_whiteboard_destroy purple_whiteboard_destroy
    -#define gaim_whiteboard_start purple_whiteboard_start
    -#define gaim_whiteboard_get_session purple_whiteboard_get_session
    -#define gaim_whiteboard_draw_list_destroy purple_whiteboard_draw_list_destroy
    -#define gaim_whiteboard_get_dimensions purple_whiteboard_get_dimensions
    -#define gaim_whiteboard_set_dimensions purple_whiteboard_set_dimensions
    -#define gaim_whiteboard_draw_point purple_whiteboard_draw_point
    -#define gaim_whiteboard_send_draw_list purple_whiteboard_send_draw_list
    -#define gaim_whiteboard_draw_line purple_whiteboard_draw_line
    -#define gaim_whiteboard_clear purple_whiteboard_clear
    -#define gaim_whiteboard_send_clear purple_whiteboard_send_clear
    -#define gaim_whiteboard_send_brush purple_whiteboard_send_brush
    -#define gaim_whiteboard_get_brush purple_whiteboard_get_brush
    -#define gaim_whiteboard_set_brush purple_whiteboard_set_brush
    -
    -/* for static plugins */
    -#define gaim_init_ssl_plugin purple_init_ssl_plugin
    -#define gaim_init_ssl_openssl_plugin purple_init_ssl_openssl_plugin
    -#define gaim_init_ssl_gnutls_plugin purple_init_ssl_gnutls_plugin
    -#define gaim_init_gg_plugin purple_init_gg_plugin
    -#define gaim_init_jabber_plugin purple_init_jabber_plugin
    -#define gaim_init_sametime_plugin purple_init_sametime_plugin
    -#define gaim_init_msn_plugin purple_init_msn_plugin
    -#define gaim_init_novell_plugin purple_init_novell_plugin
    -#define gaim_init_qq_plugin purple_init_qq_plugin
    -#define gaim_init_simple_plugin purple_init_simple_plugin
    -#define gaim_init_yahoo_plugin purple_init_yahoo_plugin
    -#define gaim_init_zephyr_plugin purple_init_zephyr_plugin
    -#define gaim_init_aim_plugin purple_init_aim_plugin
    -#define gaim_init_icq_plugin purple_init_icq_plugin
    -
    -#endif /* _GAIM_COMPAT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/gg.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,74 +0,0 @@
    -/**
    - * @file gg.h
    - *
    - * purple
    - *
    - * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    - *
    - * 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
    - */
    -
    -
    -#ifndef _PURPLE_GG_H
    -#define _PURPLE_GG_H
    -
    -#include <libgadu.h>
    -#include "internal.h"
    -#include "dnsquery.h"
    -#include "search.h"
    -#include "connection.h"
    -
    -
    -#define PUBDIR_RESULTS_MAX 20
    -
    -
    -typedef struct
    -{
    - char *name;
    - GList *participants;
    -
    -} GGPChat;
    -
    -typedef void (*GGPTokenCallback)(PurpleConnection *);
    -
    -typedef struct
    -{
    - char *id;
    - char *data;
    - unsigned int size;
    -
    - struct gg_http *req;
    - guint inpa;
    -
    - GGPTokenCallback cb;
    -
    -} GGPToken;
    -
    -typedef struct {
    -
    - struct gg_session *session;
    - GGPToken *token;
    - GList *chats;
    - GGPSearches *searches;
    - int chats_count;
    - GList *pending_richtext_messages;
    - GHashTable *pending_images;
    - gboolean status_broadcasting; //When TRUE status is visible to all, when FALSE status is visible only to friends.
    - PurpleDnsQueryData *dns_query;
    -} GGPInfo;
    -
    -#endif /* _PURPLE_GG_H */
    -
    -/* vim: set ts=8 sts=0 sw=8 noet: */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/group.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,109 +0,0 @@
    -/**
    - * @file group.h Group functions
    - *
    - * 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
    - */
    -#ifndef MSN_GROUP_H
    -#define MSN_GROUP_H
    -
    -typedef struct _MsnGroup MsnGroup;
    -
    -#include "internal.h"
    -
    -#include "session.h"
    -#include "user.h"
    -#include "userlist.h"
    -
    -#define MSN_INDIVIDUALS_GROUP_ID "1983"
    -#define MSN_INDIVIDUALS_GROUP_NAME _("Other Contacts")
    -
    -#define MSN_NON_IM_GROUP_ID "email"
    -#define MSN_NON_IM_GROUP_NAME _("Non-IM Contacts")
    -
    -/**
    - * A group.
    - */
    -struct _MsnGroup
    -{
    - MsnSession *session; /**< The MSN session. */
    -
    - char *id; /**< The group ID. */
    - char *name; /**< The name of the group. */
    -};
    -
    -/**************************************************************************
    - ** @name Group API *
    - **************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new group structure.
    - *
    - * @param session The MSN session.
    - * @param id The group ID.
    - * @param name The name of the group.
    - *
    - * @return A new group structure.
    - */
    -MsnGroup *msn_group_new(MsnUserList *userlist, const char *id, const char *name);
    -
    -/**
    - * Destroys a group structure.
    - *
    - * @param group The group to destroy.
    - */
    -void msn_group_destroy(MsnGroup *group);
    -
    -/**
    - * Sets the ID for a group.
    - *
    - * @param group The group.
    - * @param id The ID.
    - */
    -void msn_group_set_id(MsnGroup *group, const char *id);
    -
    -/**
    - * Sets the name for a group.
    - *
    - * @param group The group.
    - * @param name The name.
    - */
    -void msn_group_set_name(MsnGroup *group, const char *name);
    -
    -/**
    - * Returns the ID for a group.
    - *
    - * @param group The group.
    - *
    - * @return The ID.
    - */
    -char* msn_group_get_id(const MsnGroup *group);
    -
    -/**
    - * Returns the name for a group.
    - *
    - * @param group The group.
    - *
    - * @return The name.
    - */
    -const char *msn_group_get_name(const MsnGroup *group);
    -
    -#endif /* MSN_GROUP_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/history.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,50 +0,0 @@
    -/**
    - * @file history.h MSN history functions
    - *
    - * 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
    - */
    -#ifndef MSN_HISTORY_H
    -#define MSN_HISTORY_H
    -
    -#include "internal.h"
    -
    -typedef struct _MsnHistory MsnHistory;
    -
    -#include "transaction.h"
    -
    -#define MSN_NS_HIST_ELEMS 0x300
    -#define MSN_SB_HIST_ELEMS 0x30
    -
    -/**
    - * The history.
    - */
    -struct _MsnHistory
    -{
    - GQueue *queue;
    - unsigned int trId;
    -};
    -
    -MsnHistory *msn_history_new(void);
    -void msn_history_destroy(MsnHistory *history);
    -MsnTransaction *msn_history_find(MsnHistory *history, unsigned int triId);
    -void msn_history_add(MsnHistory *history, MsnTransaction *trans);
    -
    -#endif /* MSN_HISTORY_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/httpconn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,112 +0,0 @@
    -/**
    - * @file httpconn.h HTTP connection
    - *
    - * 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
    - */
    -#ifndef MSN_HTTPCONN_H
    -#define MSN_HTTPCONN_H
    -
    -typedef struct _MsnHttpConn MsnHttpConn;
    -
    -#include "circbuffer.h"
    -#include "servconn.h"
    -#include "session.h"
    -
    -/**
    - * An HTTP Connection.
    - */
    -struct _MsnHttpConn
    -{
    - MsnSession *session; /**< The MSN Session. */
    - MsnServConn *servconn; /**< The connection object. */
    -
    - PurpleProxyConnectData *connect_data;
    -
    - char *full_session_id; /**< The full session id. */
    - char *session_id; /**< The trimmed session id. */
    -
    - int timer; /**< The timer for polling. */
    -
    - gboolean waiting_response; /**< The flag that states if we are waiting
    - a response from the server. */
    - gboolean connected; /**< The flag that states if the connection is on. */
    - gboolean virgin; /**< The flag that states if this connection
    - should specify the host (not gateway) to
    - connect to. */
    -
    - char *host; /**< The HTTP gateway host. */
    - GList *queue; /**< The queue of data chunks to write. */
    -
    - int fd; /**< The connection's file descriptor. */
    - guint inpa; /**< The connection's input handler. */
    -
    - char *rx_buf; /**< The receive buffer. */
    - int rx_len; /**< The receive buffer length. */
    -
    - PurpleCircBuffer *tx_buf;
    - guint tx_handler;
    -};
    -
    -/**
    - * Creates a new HTTP connection object.
    - *
    - * @param servconn The connection object.
    - *
    - * @return The new object.
    - */
    -MsnHttpConn *msn_httpconn_new(MsnServConn *servconn);
    -
    -/**
    - * Destroys an HTTP connection object.
    - *
    - * @param httpconn The HTTP connection object.
    - */
    -void msn_httpconn_destroy(MsnHttpConn *httpconn);
    -
    -/**
    - * Writes a chunk of data to the HTTP connection.
    - *
    - * @param servconn The server connection.
    - * @param data The data to write.
    - * @param data_len The size of the data to write.
    - *
    - * @return The number of bytes written.
    - */
    -gssize msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t data_len);
    -
    -/**
    - * Connects the HTTP connection object to a host.
    - *
    - * @param httpconn The HTTP connection object.
    - * @param host The host to connect to.
    - * @param port The port to connect to.
    - */
    -gboolean msn_httpconn_connect(MsnHttpConn *httpconn,
    - const char *host, int port);
    -
    -/**
    - * Disconnects the HTTP connection object.
    - *
    - * @param httpconn The HTTP connection object.
    - */
    -void msn_httpconn_disconnect(MsnHttpConn *httpconn);
    -
    -#endif /* MSN_HTTPCONN_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/idle.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,104 +0,0 @@
    -/**
    - * @file idle.h Idle 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
    - */
    -#ifndef _PURPLE_IDLE_H_
    -#define _PURPLE_IDLE_H_
    -
    -#include <time.h>
    -
    -/**
    - * Idle UI operations.
    - */
    -typedef struct
    -{
    - time_t (*get_time_idle)(void);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleIdleUiOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Idle API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Touch our idle tracker. This signifies that the user is
    - * 'active'. The conversation code calls this when the
    - * user sends an IM, for example.
    - */
    -void purple_idle_touch(void);
    -
    -/**
    - * Fake our idle time by setting the time at which our
    - * accounts purportedly became idle. This is used by
    - * the I'dle Mak'er plugin.
    - */
    -void purple_idle_set(time_t time);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Idle Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used for idle reporting.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_idle_set_ui_ops(PurpleIdleUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure used for idle reporting.
    - *
    - * @return The UI operations structure in use.
    - */
    -PurpleIdleUiOps *purple_idle_get_ui_ops(void);
    -
    -/**
    - * Initializes the idle system.
    - */
    -void purple_idle_init(void);
    -
    -/**
    - * Uninitializes the idle system.
    - */
    -void purple_idle_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_IDLE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/imgstore.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,230 +0,0 @@
    -/**
    - * @file imgstore.h IM Image Store API
    - * @ingroup core
    - * @see @ref imgstore-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_IMGSTORE_H_
    -#define _PURPLE_IMGSTORE_H_
    -
    -#include <glib.h>
    -
    -/**
    - * A set of utility functions that provide a reference-counted immutable
    - * wrapper around an image's data and filename. These functions do not
    - * cache any data to disk.
    - */
    -typedef struct _PurpleStoredImage PurpleStoredImage;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Create a new PurpleStoredImage.
    - *
    - * Despite the name of this function, the image is NOT added to the image
    - * store and no ID is assigned. If you need to reference the image by an
    - * ID, use purple_imgstore_add_with_id() instead.
    - *
    - * The caller owns a reference to this image and must dereference it with
    - * purple_imgstore_unref() for it to be freed.
    - *
    - * @param data Pointer to the image data, which the imgstore will take
    - * ownership of and free as appropriate. If you want a
    - * copy of the data, make it before calling this function.
    - * @param size Image data's size.
    - * @param filename Filename associated with image. This is for your
    - * convenience. It could be the full path to the
    - * image or, more commonly, the filename of the image
    - * without any directory information. It can also be
    - * NULL, if you don't need to keep track of a filename.
    - *
    - * @return The stored image, or NULL if the image was not added (because of
    - * empty data or size).
    - */
    -PurpleStoredImage *
    -purple_imgstore_add(gpointer data, size_t size, const char *filename);
    -
    -/**
    - * Create a PurpleStoredImage using purple_imgstore_add() by reading the
    - * given filename from disk.
    - *
    - * The image is not added to the image store and no ID is assigned. If you
    - * need to reference the image by an ID, use purple_imgstore_add_with_id()
    - * instead.
    - *
    - * The caller owns a reference to this image and must dereference it with
    - * purple_imgstore_unref() for it to be freed.
    - *
    - * @param path The path to the image.
    - *
    - * @return The stored image, or NULL if the image was not added (because of
    - * empty data or size).
    - *
    - * @since 2.5.0
    - */
    -PurpleStoredImage *
    -purple_imgstore_new_from_file(const char *path);
    -
    -/**
    - * Create a PurpleStoredImage using purple_imgstore_add() and add the
    - * image to the image store. A unique ID will be assigned to the image.
    - *
    - * The caller owns a reference to the image and must dereference it with
    - * purple_imgstore_unref() or purple_imgstore_unref_by_id() for it to be
    - * freed.
    - *
    - * @param data Pointer to the image data, which the imgstore will take
    - * ownership of and free as appropriate. If you want a
    - * copy of the data, make it before calling this function.
    - * @param size Image data's size.
    - * @param filename Filename associated with image. This is for your
    - * convenience. It could be the full path to the
    - * image or, more commonly, the filename of the image
    - * without any directory information. It can also be
    - * NULL, if you don't need to keep track of a filename.
    - *
    - * @return ID for the image. This is a unique number that can be used
    - * within libpurple to reference the image. 0 is returned if the
    - * image was not added (because of empty data or size).
    - */
    -int purple_imgstore_add_with_id(gpointer data, size_t size, const char *filename);
    -
    -/**
    - * Retrieve an image from the store. The caller does not own a
    - * reference to the image.
    - *
    - * @param id The ID for the image.
    - *
    - * @return A pointer to the requested image, or NULL if it was not found.
    - */
    -PurpleStoredImage *purple_imgstore_find_by_id(int id);
    -
    -/**
    - * Retrieves a pointer to the image's data.
    - *
    - * @param img The Image.
    - *
    - * @return A pointer to the data, which must not
    - * be freed or modified.
    - */
    -gconstpointer purple_imgstore_get_data(PurpleStoredImage *img);
    -
    -/**
    - * Retrieves the length of the image's data.
    - *
    - * @param img The Image.
    - *
    - * @return The size of the data that the pointer returned by
    - * purple_imgstore_get_data points to.
    - */
    -size_t purple_imgstore_get_size(PurpleStoredImage *img);
    -
    -/**
    - * Retrieves a pointer to the image's filename.
    - *
    - * @param img The image.
    - *
    - * @return A pointer to the filename, which must not
    - * be freed or modified.
    - */
    -const char *purple_imgstore_get_filename(const PurpleStoredImage *img);
    -
    -/**
    - * Looks at the magic numbers of the image data (the first few bytes)
    - * and returns an extension corresponding to the image's file type.
    - *
    - * @param img The image.
    - *
    - * @return The image's extension (for example "png") or "icon"
    - * if unknown.
    - */
    -const char *purple_imgstore_get_extension(PurpleStoredImage *img);
    -
    -/**
    - * Increment the reference count.
    - *
    - * @param img The image.
    - *
    - * @return @a img
    - */
    -PurpleStoredImage *
    -purple_imgstore_ref(PurpleStoredImage *img);
    -
    -/**
    - * Decrement the reference count.
    - *
    - * If the reference count reaches zero, the image will be freed.
    - *
    - * @param img The image.
    - *
    - * @return @a img or @c NULL if the reference count reached zero.
    - */
    -PurpleStoredImage *
    -purple_imgstore_unref(PurpleStoredImage *img);
    -
    -/**
    - * Increment the reference count using an ID.
    - *
    - * This is a convience wrapper for purple_imgstore_find_by_id() and
    - * purple_imgstore_ref(), so if you have a PurpleStoredImage, it'll
    - * be more efficient to call purple_imgstore_ref() directly.
    - *
    - * @param id The ID for the image.
    - */
    -void purple_imgstore_ref_by_id(int id);
    -
    -/**
    - * Decrement the reference count using an ID.
    - *
    - * This is a convience wrapper for purple_imgstore_find_by_id() and
    - * purple_imgstore_unref(), so if you have a PurpleStoredImage, it'll
    - * be more efficient to call purple_imgstore_unref() directly.
    - *
    - * @param id The ID for the image.
    - */
    -void purple_imgstore_unref_by_id(int id);
    -
    -/**
    - * Returns the image store subsystem handle.
    - *
    - * @return The subsystem handle.
    - */
    -void *purple_imgstore_get_handle(void);
    -
    -/**
    - * Initializes the image store subsystem.
    - */
    -void purple_imgstore_init(void);
    -
    -/**
    - * Uninitializes the image store subsystem.
    - */
    -void purple_imgstore_uninit(void);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_IMGSTORE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/internal.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,278 +0,0 @@
    -/**
    - * @file internal.h Internal definitions and includes
    - * @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
    - */
    -#ifndef _PURPLE_INTERNAL_H_
    -#define _PURPLE_INTERNAL_H_
    -
    -#ifdef HAVE_CONFIG_H
    -# include <config.h>
    -#endif
    -
    -/* for SIOCGIFCONF in SKYOS */
    -#ifdef SKYOS
    -#include <net/sockios.h>
    -#endif
    -/*
    - * If we're using NLS, make sure gettext works. If not, then define
    - * dummy macros in place of the normal gettext macros.
    - *
    - * Also, the perl XS config.h file sometimes defines _ So we need to
    - * make sure _ isn't already defined before trying to define it.
    - *
    - * The Singular/Plural/Number ngettext dummy definition below was
    - * taken from an email to the texinfo mailing list by Manuel Guerrero.
    - * Thank you Manuel, and thank you Alex's good friend Google.
    - */
    -#ifdef ENABLE_NLS
    -# include <locale.h>
    -# ifndef __APPLE_CC__
    -# define __APPLE_CC__ 0
    -# endif
    -# include <libintl.h>
    -# define _(String) ((const char *)dgettext(PACKAGE, String))
    -# ifdef gettext_noop
    -# define N_(String) gettext_noop (String)
    -# else
    -# define N_(String) (String)
    -# endif
    -#else
    -# include <locale.h>
    -# define N_(String) (String)
    -# ifndef _
    -# define _(String) ((const char *)String)
    -# endif
    -# define ngettext(Singular, Plural, Number) ((Number == 1) ? ((const char *)Singular) : ((const char *)Plural))
    -# define dngettext(Domain, Singular, Plural, Number) ((Number == 1) ? ((const char *)Singular) : ((const char *)Plural))
    -#endif
    -
    -#ifdef HAVE_ENDIAN_H
    -# include <endian.h>
    -#endif
    -
    -#define MSG_LEN 2048
    -/* The above should normally be the same as BUF_LEN,
    - * but just so we're explicitly asking for the max message
    - * length. */
    -#define BUF_LEN MSG_LEN
    -#define BUF_LONG BUF_LEN * 2
    -
    -#include <sys/stat.h>
    -#include <sys/types.h>
    -#ifndef _WIN32
    -#include <sys/time.h>
    -#include <sys/wait.h>
    -#include <sys/time.h>
    -#endif
    -#include <ctype.h>
    -#include <errno.h>
    -#include <fcntl.h>
    -#include <math.h>
    -#include <stdio.h>
    -#include <stdlib.h>
    -#include <string.h>
    -#include <time.h>
    -
    -#ifdef HAVE_ICONV
    -#include <iconv.h>
    -#endif
    -
    -#ifdef HAVE_LANGINFO_CODESET
    -#include <langinfo.h>
    -#endif
    -
    -#include <gmodule.h>
    -
    -#ifdef PURPLE_PLUGINS
    -# ifdef HAVE_DLFCN_H
    -# include <dlfcn.h>
    -# endif
    -#endif
    -
    -#ifndef _WIN32
    -# include <netinet/in.h>
    -# include <sys/socket.h>
    -# include <arpa/inet.h>
    -# include <sys/un.h>
    -# include <sys/utsname.h>
    -# include <netdb.h>
    -# include <signal.h>
    -# include <unistd.h>
    -#endif
    -
    -#ifndef HOST_NAME_MAX
    -# define HOST_NAME_MAX 255
    -#endif
    -
    -#include <glib.h>
    -
    -/* This wasn't introduced until Glib 2.14 :( */
    -#ifndef G_MAXSSIZE
    -# if GLIB_SIZEOF_LONG == 8
    -# define G_MAXSSIZE ((gssize) 0x7fffffffffffffff)
    -# else
    -# define G_MAXSSIZE ((gssize) 0x7fffffff)
    -# endif
    -#endif
    -
    -#include <glib/gstdio.h>
    -
    -#ifdef _WIN32
    -#include "win32dep.h"
    -#endif
    -
    -#ifdef HAVE_CONFIG_H
    -#if SIZEOF_TIME_T == 4
    -# define PURPLE_TIME_T_MODIFIER "lu"
    -#elif SIZEOF_TIME_T == 8
    -# define PURPLE_TIME_T_MODIFIER "zu"
    -#else
    -#error Unknown size of time_t
    -#endif
    -#endif
    -
    -#include <glib-object.h>
    -
    -#if !GLIB_CHECK_VERSION(2, 32, 0)
    -
    -#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS
    -#define G_GNUC_END_IGNORE_DEPRECATIONS
    -
    -#endif /* 2.32.0 */
    -
    -#ifdef __clang__
    -
    -#undef G_GNUC_BEGIN_IGNORE_DEPRECATIONS
    -#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
    - _Pragma ("clang diagnostic push") \
    - _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"")
    -
    -#undef G_GNUC_END_IGNORE_DEPRECATIONS
    -#define G_GNUC_END_IGNORE_DEPRECATIONS \
    - _Pragma ("clang diagnostic pop")
    -
    -#endif /* __clang__ */
    -
    -#ifdef __COVERITY__
    -
    -/* avoid TAINTED_SCALAR warning */
    -#undef g_utf8_next_char
    -#define g_utf8_next_char(p) (char *)((p) + 1)
    -
    -#endif
    -
    -/* Safer ways to work with static buffers. When using non-static
    - * buffers, either use g_strdup_* functions (preferred) or use
    - * g_strlcpy/g_strlcpy directly. */
    -#define purple_strlcpy(dest, src) g_strlcpy(dest, src, sizeof(dest))
    -#define purple_strlcat(dest, src) g_strlcat(dest, src, sizeof(dest))
    -
    -typedef union
    -{
    - struct sockaddr sa;
    - struct sockaddr_in in;
    - struct sockaddr_in6 in6;
    - struct sockaddr_storage storage;
    -} common_sockaddr_t;
    -
    -#define PURPLE_WEBSITE "http://pidgin.im/"
    -#define PURPLE_DEVEL_WEBSITE "http://developer.pidgin.im/"
    -
    -
    -/* INTERNAL FUNCTIONS */
    -
    -#include "account.h"
    -#include "connection.h"
    -
    -/* This is for the accounts code to notify the buddy icon code that
    - * it's done loading. We may want to replace this with a signal. */
    -void
    -_purple_buddy_icons_account_loaded_cb(void);
    -
    -/* This is for the buddy list to notify the buddy icon code that
    - * it's done loading. We may want to replace this with a signal. */
    -void
    -_purple_buddy_icons_blist_loaded_cb(void);
    -
    -/* This is for the purple_core_migrate() code to tell the buddy
    - * icon subsystem about the old icons directory so it can
    - * migrate any icons in use. */
    -void
    -_purple_buddy_icon_set_old_icons_dir(const char *dirname);
    -
    -/**
    - * Creates a connection to the specified account and either connects
    - * or attempts to register a new account. If you are logging in,
    - * the connection uses the current active status for this account.
    - * So if you want to sign on as "away," for example, you need to
    - * have called purple_account_set_status(account, "away").
    - * (And this will call purple_account_connect() automatically).
    - *
    - * @note This function should only be called by purple_account_connect()
    - * in account.c. If you're trying to sign on an account, use that
    - * function instead.
    - *
    - * @param account The account the connection should be connecting to.
    - * @param regist Whether we are registering a new account or just
    - * trying to do a normal signon.
    - * @param password The password to use.
    - */
    -void _purple_connection_new(PurpleAccount *account, gboolean regist,
    - const char *password);
    -/**
    - * Tries to unregister the account on the server. If the account is not
    - * connected, also creates a new connection.
    - *
    - * @note This function should only be called by purple_account_unregister()
    - * in account.c.
    - *
    - * @param account The account to unregister
    - * @param password The password to use.
    - * @param cb Optional callback to be called when unregistration is complete
    - * @param user_data user data to pass to the callback
    - */
    -void _purple_connection_new_unregister(PurpleAccount *account, const char *password,
    - PurpleAccountUnregistrationCb cb, void *user_data);
    -/**
    - * Disconnects and destroys a PurpleConnection.
    - *
    - * @note This function should only be called by purple_account_disconnect()
    - * in account.c. If you're trying to sign off an account, use that
    - * function instead.
    - *
    - * @param gc The purple connection to destroy.
    - */
    -void _purple_connection_destroy(PurpleConnection *gc);
    -
    -/**
    - * Sets most commonly used socket flags: O_NONBLOCK and FD_CLOEXEC.
    - *
    - * @param fd The file descriptor for the socket.
    - *
    - * @return TRUE if succeeded, FALSE otherwise.
    - */
    -gboolean
    -_purple_network_set_common_socket_flags(int fd);
    -
    -#endif /* _PURPLE_INTERNAL_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/iq.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,118 +0,0 @@
    -/**
    - * @file iq.h JabberID handlers
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_IQ_H_
    -#define PURPLE_JABBER_IQ_H_
    -
    -typedef enum {
    - JABBER_IQ_SET,
    - JABBER_IQ_GET,
    - JABBER_IQ_RESULT,
    - JABBER_IQ_ERROR,
    - JABBER_IQ_NONE
    -} JabberIqType;
    -
    -#include "jabber.h"
    -#include "connection.h"
    -
    -typedef struct _JabberIq JabberIq;
    -typedef struct _JabberIqCallbackData JabberIqCallbackData;
    -
    -/**
    - * A JabberIqHandler is called to process an incoming IQ stanza.
    - * Handlers typically process unsolicited incoming GETs or SETs for their
    - * registered namespace, but may be called to handle the results of a
    - * GET or SET that we generated if no JabberIqCallback was generated
    - * The handler may be called for the results of a GET or SET (RESULT or ERROR)
    - * that we generated
    - * if the generating function did not register a JabberIqCallback.
    - *
    - * @param js The JabberStream object.
    - * @param from The remote entity (the from attribute on the <iq/> stanza)
    - * @param type The IQ type.
    - * @param id The IQ id (the id attribute on the <iq/> stanza)
    - * @param child The child element of the <iq/> stanza that matches the name
    - * and namespace registered with jabber_iq_register_handler.
    - *
    - * @see jabber_iq_register_handler()
    - * @see JabberIqCallback
    - */
    -typedef void (JabberIqHandler)(JabberStream *js, const char *from,
    - JabberIqType type, const char *id,
    - xmlnode *child);
    -
    -/**
    - * A JabberIqCallback is called to process the results of a GET or SET that
    - * we send to a remote entity. The callback is matched based on the id
    - * of the incoming stanza (which matches the one on the initial stanza).
    - *
    - * @param js The JabberStream object.
    - * @param from The remote entity (the from attribute on the <iq/> stanza)
    - * @param type The IQ type. The only possible values are JABBER_IQ_RESULT
    - * and JABBER_IQ_ERROR.
    - * @param id The IQ id (the id attribute on the <iq/> stanza)
    - * @param packet The <iq/> stanza
    - * @param data The callback data passed to jabber_iq_set_callback()
    - *
    - * @see jabber_iq_set_callback()
    - */
    -typedef void (JabberIqCallback)(JabberStream *js, const char *from,
    - JabberIqType type, const char *id,
    - xmlnode *packet, gpointer data);
    -
    -struct _JabberIq {
    - JabberIqType type;
    - char *id;
    - xmlnode *node;
    -
    - JabberIqCallback *callback;
    - gpointer callback_data;
    -
    - JabberStream *js;
    -};
    -
    -JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type);
    -JabberIq *jabber_iq_new_query(JabberStream *js, JabberIqType type,
    - const char *xmlns);
    -
    -void jabber_iq_parse(JabberStream *js, xmlnode *packet);
    -
    -void jabber_iq_callbackdata_free(JabberIqCallbackData *jcd);
    -void jabber_iq_remove_callback_by_id(JabberStream *js, const char *id);
    -void jabber_iq_set_callback(JabberIq *iq, JabberIqCallback *cb, gpointer data);
    -void jabber_iq_set_id(JabberIq *iq, const char *id);
    -
    -void jabber_iq_send(JabberIq *iq);
    -void jabber_iq_free(JabberIq *iq);
    -
    -void jabber_iq_init(void);
    -void jabber_iq_uninit(void);
    -
    -void jabber_iq_register_handler(const char *node, const char *xmlns,
    - JabberIqHandler *func);
    -
    -/* Connected to namespace-handler registration signals */
    -void jabber_iq_signal_register(const gchar *node, const gchar *xmlns);
    -void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns);
    -
    -#endif /* PURPLE_JABBER_IQ_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/irc.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,226 +0,0 @@
    -/**
    - * @file irc.h
    - *
    - * purple
    - *
    - * Copyright (C) 2003, 2012 Ethan Blanton <elb@pidgin.im>
    - *
    - * 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
    - */
    -
    -#ifndef _PURPLE_IRC_H
    -#define _PURPLE_IRC_H
    -
    -#include <glib.h>
    -
    -#ifdef HAVE_CYRUS_SASL
    -#include <sasl/sasl.h>
    -#endif
    -
    -#include "circbuffer.h"
    -#include "ft.h"
    -#include "roomlist.h"
    -#include "sslconn.h"
    -
    -#define IRC_DEFAULT_SERVER "irc.freenode.net"
    -#define IRC_DEFAULT_PORT 6667
    -#define IRC_DEFAULT_SSL_PORT 994
    -
    -#define IRC_DEFAULT_CHARSET "UTF-8"
    -#define IRC_DEFAULT_AUTODETECT FALSE
    -#define IRC_DEFAULT_ALIAS "purple"
    -
    -#define IRC_DEFAULT_QUIT "Leaving."
    -
    -#define IRC_INITIAL_BUFSIZE 1024
    -
    -#define IRC_NAMES_FLAG "irc-namelist"
    -
    -
    -enum { IRC_USEROPT_SERVER, IRC_USEROPT_PORT, IRC_USEROPT_CHARSET };
    -enum irc_state { IRC_STATE_NEW, IRC_STATE_ESTABLISHED };
    -
    -struct irc_conn {
    - PurpleAccount *account;
    - GHashTable *msgs;
    - GHashTable *cmds;
    - char *server;
    - int fd;
    - guint timer;
    - GHashTable *buddies;
    -
    - gboolean ison_outstanding;
    - GList *buddies_outstanding;
    -
    - char *inbuf;
    - int inbuflen;
    - int inbufused;
    -
    - GString *motd;
    - GString *names;
    - struct _whois {
    - char *nick;
    - char *real;
    - char *login;
    - char *ident;
    - char *host;
    - char *away;
    - char *server;
    - char *serverinfo;
    - GString *channels;
    - int ircop;
    - int identified;
    - int idle;
    - time_t signon;
    - } whois;
    - PurpleRoomlist *roomlist;
    - PurpleSslConnection *gsc;
    -
    - gboolean quitting;
    -
    - PurpleCircBuffer *outbuf;
    - guint writeh;
    -
    - time_t recv_time;
    -
    - char *mode_chars;
    - char *reqnick;
    - gboolean nickused;
    -#ifdef HAVE_CYRUS_SASL
    - sasl_conn_t *sasl_conn;
    - const char *current_mech;
    - GString *sasl_mechs;
    - gboolean mech_works;
    - sasl_callback_t *sasl_cb;
    -#endif
    -};
    -
    -struct irc_buddy {
    - char *name;
    - gboolean online;
    - gboolean flag;
    - gboolean new_online_status;
    - int ref;
    -};
    -
    -typedef int (*IRCCmdCallback) (struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -
    -int irc_send(struct irc_conn *irc, const char *buf);
    -int irc_send_len(struct irc_conn *irc, const char *buf, int len);
    -gboolean irc_blist_timeout(struct irc_conn *irc);
    -gboolean irc_who_channel_timeout(struct irc_conn *irc);
    -void irc_buddy_query(struct irc_conn *irc);
    -
    -char *irc_escape_privmsg(const char *text, gssize length);
    -
    -char *irc_mirc2html(const char *string);
    -char *irc_mirc2txt(const char *string);
    -
    -const char *irc_nick_skip_mode(struct irc_conn *irc, const char *string);
    -
    -gboolean irc_ischannel(const char *string);
    -
    -void irc_register_commands(void);
    -void irc_msg_table_build(struct irc_conn *irc);
    -void irc_parse_msg(struct irc_conn *irc, char *input);
    -char *irc_parse_ctcp(struct irc_conn *irc, const char *from, const char *to, const char *msg, int notice);
    -char *irc_format(struct irc_conn *irc, const char *format, ...);
    -
    -void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_badmode(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_badnick(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_ban(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_banfull(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_banned(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_features(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_luser(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_motd(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_names(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nick(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nochangenick(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_notice(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_part(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_ping(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_privmsg(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_quit(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_time(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_topicinfo(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_unavailable(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_unknown(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_who(struct irc_conn *irc, const char *name, const char *from, char **args);
    -#ifdef HAVE_CYRUS_SASL
    -void irc_msg_cap(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_auth(struct irc_conn *irc, char *arg);
    -void irc_msg_authok(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_authtryagain(struct irc_conn *irc, const char *name, const char *from, char **args);
    -void irc_msg_authfail(struct irc_conn *irc, const char *name, const char *from, char **args);
    -#endif
    -
    -void irc_msg_ignore(struct irc_conn *irc, const char *name, const char *from, char **args);
    -
    -void irc_cmd_table_build(struct irc_conn *irc);
    -
    -int irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_away(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_ctcp(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_ctcp_version(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_invite(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_join(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_kick(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_list(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_mode(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_names(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_nick(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_op(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_part(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_ping(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_quote(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_query(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_remove(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_service(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_time(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_topic(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_wallops(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_whois(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -int irc_cmd_whowas(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    -
    -PurpleXfer *irc_dccsend_new_xfer(PurpleConnection *gc, const char *who);
    -void irc_dccsend_send_file(PurpleConnection *gc, const char *who, const char *file);
    -void irc_dccsend_recv(struct irc_conn *irc, const char *from, const char *msg);
    -#endif /* _PURPLE_IRC_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/jabber.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,428 +0,0 @@
    -/**
    - * @file jabber.h
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_H_
    -#define PURPLE_JABBER_H_
    -
    -typedef enum {
    - JABBER_CAP_NONE = 0,
    -/* JABBER_CAP_XHTML = 1 << 0, */
    -/* JABBER_CAP_COMPOSING = 1 << 1, */
    - JABBER_CAP_SI = 1 << 2,
    - JABBER_CAP_SI_FILE_XFER = 1 << 3,
    - JABBER_CAP_BYTESTREAMS = 1 << 4,
    - JABBER_CAP_IBB = 1 << 5,
    - JABBER_CAP_CHAT_STATES = 1 << 6,
    - JABBER_CAP_IQ_SEARCH = 1 << 7,
    - JABBER_CAP_IQ_REGISTER = 1 << 8,
    -
    - /* Google Talk extensions:
    - * http://code.google.com/apis/talk/jep_extensions/extensions.html
    - */
    - JABBER_CAP_GMAIL_NOTIFY = 1 << 9,
    - JABBER_CAP_GOOGLE_ROSTER = 1 << 10,
    -
    - JABBER_CAP_PING = 1 << 11,
    - JABBER_CAP_ADHOC = 1 << 12,
    - JABBER_CAP_BLOCKING = 1 << 13,
    -
    - JABBER_CAP_ITEMS = 1 << 14,
    - JABBER_CAP_ROSTER_VERSIONING = 1 << 15,
    -
    - JABBER_CAP_FACEBOOK = 1 << 16,
    -
    - JABBER_CAP_RETRIEVED = 1 << 31
    -} JabberCapabilities;
    -
    -typedef struct _JabberStream JabberStream;
    -
    -#include <libxml/parser.h>
    -#include <glib.h>
    -#include "circbuffer.h"
    -#include "connection.h"
    -#include "dnsquery.h"
    -#include "dnssrv.h"
    -#include "media.h"
    -#include "mediamanager.h"
    -#include "roomlist.h"
    -#include "sslconn.h"
    -
    -#include "namespaces.h"
    -
    -#include "auth.h"
    -#include "iq.h"
    -#include "jutil.h"
    -#include "xmlnode.h"
    -#include "buddy.h"
    -#include "bosh.h"
    -
    -#ifdef HAVE_CYRUS_SASL
    -#include <sasl/sasl.h>
    -#endif
    -
    -#define CAPS0115_NODE "http://pidgin.im/"
    -
    -#define JABBER_DEFAULT_REQUIRE_TLS "require_starttls"
    -#define JABBER_DEFAULT_FT_PROXIES "proxy.eu.jabber.org"
    -
    -/* Index into attention_types list */
    -#define JABBER_BUZZ 0
    -
    -typedef enum {
    - JABBER_STREAM_OFFLINE,
    - JABBER_STREAM_CONNECTING,
    - JABBER_STREAM_INITIALIZING,
    - JABBER_STREAM_INITIALIZING_ENCRYPTION,
    - JABBER_STREAM_AUTHENTICATING,
    - JABBER_STREAM_POST_AUTH,
    - JABBER_STREAM_CONNECTED
    -} JabberStreamState;
    -
    -struct _JabberStream
    -{
    - int fd;
    -
    - PurpleSrvTxtQueryData *srv_query_data;
    -
    - xmlParserCtxt *context;
    - xmlnode *current;
    -
    - struct {
    - guint8 major;
    - guint8 minor;
    - } protocol_version;
    -
    - JabberSaslMech *auth_mech;
    - gpointer auth_mech_data;
    -
    - /**
    - * The header from the opening <stream/> tag. This being NULL is treated
    - * as a special condition in the parsing code (signifying the next
    - * stanza started is an opening stream tag), and its being missing on
    - * the stream header is treated as a fatal error.
    - */
    - char *stream_id;
    - JabberStreamState state;
    -
    - GHashTable *buddies;
    -
    - /*
    - * This boolean was added to eliminate a heinous bug where we would
    - * get into a loop with the server and move a buddy back and forth
    - * from one group to another.
    - *
    - * The sequence goes something like this:
    - * 1. Our resource and another resource both approve an authorization
    - * request at the exact same time. We put the buddy in group A and
    - * the other resource put the buddy in group B.
    - * 2. The server receives the roster add for group B and sends us a
    - * roster push.
    - * 3. We receive this roster push and modify our local blist. This
    - * triggers us to send a roster add for group B.
    - * 4. The server recieves our earlier roster add for group A and sends
    - * us a roster push.
    - * 5. We receive this roster push and modify our local blist. This
    - * triggers us to send a roster add for group A.
    - * 6. The server receives our earlier roster add for group B and sends
    - * us a roster push.
    - * (repeat steps 3 through 6 ad infinitum)
    - *
    - * This boolean is used to short-circuit the sending of a roster add
    - * when we receive a roster push.
    - *
    - * See these bug reports:
    - * http://trac.adiumx.com/ticket/8834
    - * http://developer.pidgin.im/ticket/5484
    - * http://developer.pidgin.im/ticket/6188
    - */
    - gboolean currently_parsing_roster_push;
    -
    - GHashTable *chats;
    - GList *chat_servers;
    - PurpleRoomlist *roomlist;
    - GList *user_directories;
    -
    - GHashTable *iq_callbacks;
    - int next_id;
    -
    - GList *bs_proxies;
    - GList *oob_file_transfers;
    - GList *file_transfers;
    -
    - time_t idle;
    - time_t old_idle;
    -
    - /** When we last pinged the server, so we don't ping more
    - * often than once every minute.
    - */
    - time_t last_ping;
    -
    - JabberID *user;
    - JabberBuddy *user_jb;
    -
    - PurpleConnection *gc;
    - PurpleSslConnection *gsc;
    -
    - gboolean registration;
    -
    - char *initial_avatar_hash;
    - char *avatar_hash;
    - GSList *pending_avatar_requests;
    -
    - GSList *pending_buddy_info_requests;
    -
    - PurpleCircBuffer *write_buffer;
    - guint writeh;
    -
    - gboolean reinit;
    -
    - JabberCapabilities server_caps;
    - gboolean googletalk;
    - char *server_name;
    -
    - char *gmail_last_time;
    - char *gmail_last_tid;
    -
    - char *serverFQDN;
    -
    -#ifdef HAVE_CYRUS_SASL
    - sasl_conn_t *sasl;
    - sasl_callback_t *sasl_cb;
    - sasl_secret_t *sasl_secret;
    - const char *current_mech;
    - int auth_fail_count;
    -
    - int sasl_state;
    - int sasl_maxbuf;
    - GString *sasl_mechs;
    -#endif
    -
    - gboolean unregistration;
    - PurpleAccountUnregistrationCb unregistration_cb;
    - void *unregistration_user_data;
    -
    - gboolean vcard_fetched;
    - /* Timer at login to push updated avatar */
    - guint vcard_timer;
    -
    - /* Entity Capabilities hash */
    - char *caps_hash;
    -
    - /* does the local server support PEP? */
    - gboolean pep;
    -
    - /* Is Buzz enabled? */
    - gboolean allowBuzz;
    -
    - /* A list of JabberAdHocCommands supported by the server */
    - GList *commands;
    -
    - /* last presence update to check for differences */
    - JabberBuddyState old_state;
    - char *old_msg;
    - int old_priority;
    - char *old_avatarhash;
    -
    - /* same for user tune */
    - char *old_artist;
    - char *old_title;
    - char *old_source;
    - char *old_uri;
    - int old_length;
    - char *old_track;
    -
    - char *certificate_CN;
    -
    - /* A purple timeout tag for the keepalive */
    - guint keepalive_timeout;
    - guint max_inactivity;
    - guint inactivity_timer;
    -
    - PurpleSrvResponse *srv_rec;
    - guint srv_rec_idx;
    - guint max_srv_rec_idx;
    -
    - /* BOSH stuff */
    - PurpleBOSHConnection *bosh;
    -
    - /**
    - * This linked list contains PurpleUtilFetchUrlData structs
    - * for when we lookup buddy icons from a url
    - */
    - GSList *url_datas;
    -
    - /* keep a hash table of JingleSessions */
    - GHashTable *sessions;
    -
    - /* maybe this should only be present when USE_VV? */
    - gchar *stun_ip;
    - int stun_port;
    - PurpleDnsQueryData *stun_query;
    -
    - /* stuff for Google's relay handling */
    - gchar *google_relay_token;
    - gchar *google_relay_host;
    - GList *google_relay_requests; /* the HTTP requests to get */
    - /* relay info */
    -
    - /* facebook quirks */
    - gboolean facebook_roster_cleanup_performed;
    -};
    -
    -typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *namespace);
    -
    -typedef struct _JabberFeature
    -{
    - gchar *namespace;
    - JabberFeatureEnabled *is_enabled;
    -} JabberFeature;
    -
    -typedef struct _JabberIdentity
    -{
    - gchar *category;
    - gchar *type;
    - gchar *name;
    - gchar *lang;
    -} JabberIdentity;
    -
    -typedef struct _JabberBytestreamsStreamhost {
    - char *jid;
    - char *host;
    - int port;
    - char *zeroconf;
    -} JabberBytestreamsStreamhost;
    -
    -/* what kind of additional features as returned from disco#info are supported? */
    -extern GList *jabber_features;
    -/* A sorted list of identities advertised. Use jabber_add_identity to add
    - * so it remains sorted.
    - */
    -extern GList *jabber_identities;
    -
    -void jabber_stream_features_parse(JabberStream *js, xmlnode *packet);
    -void jabber_process_packet(JabberStream *js, xmlnode **packet);
    -void jabber_send(JabberStream *js, xmlnode *data);
    -void jabber_send_raw(JabberStream *js, const char *data, int len);
    -void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet,
    - gpointer unused);
    -
    -void jabber_stream_set_state(JabberStream *js, JabberStreamState state);
    -
    -void jabber_register_parse(JabberStream *js, const char *from,
    - JabberIqType type, const char *id, xmlnode *query);
    -void jabber_register_start(JabberStream *js);
    -
    -char *jabber_get_next_id(JabberStream *js);
    -
    -/** Parse an error into a human-readable string and optionally a disconnect
    - * reason.
    - * @param js the stream on which the error occurred.
    - * @param packet the error packet
    - * @param reason where to store the disconnection reason, or @c NULL if you
    - * don't care or you don't intend to close the connection.
    - */
    -char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleConnectionError *reason);
    -
    -/**
    - * Add a feature to the list of features advertised via disco#info. If you
    - * call this while accounts are connected, Bad Things(TM) will happen because
    - * the Entity Caps hash will be out-of-date (which should be fixed :/)
    - *
    - * @param namespace The namespace of the feature
    - * @param cb A callback determining whether or not this feature
    - * will advertised; may be NULL.
    - */
    -void jabber_add_feature(const gchar *namespace, JabberFeatureEnabled cb);
    -void jabber_remove_feature(const gchar *namespace);
    -
    -/** Adds an identity to this jabber library instance. For list of valid values
    - * visit the website of the XMPP Registrar
    - * (http://www.xmpp.org/registrar/disco-categories.html#client).
    - *
    - * Like with jabber_add_feature, if you call this while accounts are connected,
    - * Bad Things will happen.
    - *
    - * @param category the category of the identity.
    - * @param type the type of the identity.
    - * @param language the language localization of the name. Can be NULL.
    - * @param name the name of the identity.
    - */
    -void jabber_add_identity(const gchar *category, const gchar *type, const gchar *lang, const gchar *name);
    -
    -/**
    - * GCompareFunc for JabberIdentity structs.
    - */
    -gint jabber_identity_compare(gconstpointer a, gconstpointer b);
    -
    -/**
    - * Returns true if this connection is over a secure (SSL) stream. Use this
    - * instead of checking js->gsc because BOSH stores its PurpleSslConnection
    - * members in its own data structure.
    - */
    -gboolean jabber_stream_is_ssl(JabberStream *js);
    -
    -/**
    - * Restart the "we haven't sent anything in a while and should send
    - * something or the server will kick us off" timer (obviously
    - * called when sending something. It's exposed for BOSH.)
    - */
    -void jabber_stream_restart_inactivity_timer(JabberStream *js);
    -
    -/** PRPL functions */
    -const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b);
    -const char* jabber_list_emblem(PurpleBuddy *b);
    -char *jabber_status_text(PurpleBuddy *b);
    -void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full);
    -GList *jabber_status_types(PurpleAccount *account);
    -void jabber_login(PurpleAccount *account);
    -void jabber_close(PurpleConnection *gc);
    -void jabber_idle_set(PurpleConnection *gc, int idle);
    -void jabber_blocklist_parse_push(JabberStream *js, const char *from,
    - JabberIqType type, const char *id,
    - xmlnode *child);
    -void jabber_request_block_list(JabberStream *js);
    -void jabber_add_deny(PurpleConnection *gc, const char *who);
    -void jabber_rem_deny(PurpleConnection *gc, const char *who);
    -void jabber_keepalive(PurpleConnection *gc);
    -void jabber_register_gateway(JabberStream *js, const char *gateway);
    -void jabber_register_account(PurpleAccount *account);
    -void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
    -gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code);
    -GList *jabber_attention_types(PurpleAccount *account);
    -void jabber_convo_closed(PurpleConnection *gc, const char *who);
    -PurpleChat *jabber_find_blist_chat(PurpleAccount *account, const char *name);
    -gboolean jabber_offline_message(const PurpleBuddy *buddy);
    -int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len);
    -GList *jabber_actions(PurplePlugin *plugin, gpointer context);
    -
    -gboolean jabber_audio_enabled(JabberStream *js, const char *unused);
    -gboolean jabber_video_enabled(JabberStream *js, const char *unused);
    -gboolean jabber_initiate_media(PurpleAccount *account, const char *who,
    - PurpleMediaSessionType type);
    -PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who);
    -gboolean jabber_can_receive_file(PurpleConnection *gc, const gchar *who);
    -
    -void jabber_plugin_init(PurplePlugin *plugin);
    -void jabber_plugin_uninit(PurplePlugin *plugin);
    -
    -#endif /* PURPLE_JABBER_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/jutil.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,99 +0,0 @@
    -/**
    - * @file jutil.h utility functions
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_JUTIL_H_
    -#define PURPLE_JABBER_JUTIL_H_
    -
    -typedef struct _JabberID {
    - char *node;
    - char *domain;
    - char *resource;
    -} JabberID;
    -
    -typedef enum {
    - JABBER_BUDDY_STATE_UNKNOWN = -2,
    - JABBER_BUDDY_STATE_ERROR = -1,
    - JABBER_BUDDY_STATE_UNAVAILABLE = 0,
    - JABBER_BUDDY_STATE_ONLINE,
    - JABBER_BUDDY_STATE_CHAT,
    - JABBER_BUDDY_STATE_AWAY,
    - JABBER_BUDDY_STATE_XA,
    - JABBER_BUDDY_STATE_DND
    -} JabberBuddyState;
    -
    -#include "jabber.h"
    -
    -JabberID* jabber_id_new(const char *str);
    -
    -/**
    - * Compare two JIDs for equality. In addition to the node and domain,
    - * the resources of the two JIDs must also be equal (or both absent).
    - */
    -gboolean jabber_id_equal(const JabberID *jid1, const JabberID *jid2);
    -
    -void jabber_id_free(JabberID *jid);
    -
    -char *jabber_get_domain(const char *jid);
    -char *jabber_get_resource(const char *jid);
    -char *jabber_get_bare_jid(const char *jid);
    -char *jabber_id_get_bare_jid(const JabberID *jid);
    -char *jabber_id_get_full_jid(const JabberID *jid);
    -JabberID *jabber_id_to_bare_jid(const JabberID *jid);
    -
    -gboolean jabber_jid_is_domain(const char *jid);
    -
    -const char *jabber_normalize(const PurpleAccount *account, const char *in);
    -
    -/* Returns true if JID is the bare JID of our server. */
    -gboolean jabber_is_own_server(JabberStream *js, const char *jid);
    -
    -/* Returns true if JID is the bare JID of our account. */
    -gboolean jabber_is_own_account(JabberStream *js, const char *jid);
    -
    -gboolean jabber_nodeprep_validate(const char *);
    -gboolean jabber_domain_validate(const char *);
    -gboolean jabber_resourceprep_validate(const char *);
    -
    -/**
    - * Apply the SASLprep profile of stringprep to the string passed in.
    - *
    - * @returns A newly allocated string containing the normalized version
    - * of the input, or NULL if an error occurred (the string could
    - * not be normalized)
    - */
    -char *jabber_saslprep(const char *);
    -
    -/* state -> readable name */
    -const char *jabber_buddy_state_get_name(JabberBuddyState state);
    -/* state -> core id */
    -const char *jabber_buddy_state_get_status_id(JabberBuddyState state);
    -/* state -> show attr (for presence stanza) */
    -const char *jabber_buddy_state_get_show(JabberBuddyState state);
    -/* core id -> state */
    -JabberBuddyState jabber_buddy_status_id_get_state(const char *id);
    -/* show attr (presence stanza) -> state */
    -JabberBuddyState jabber_buddy_show_get_state(const char *id);
    -
    -char *jabber_calculate_data_hash(gconstpointer data, size_t len,
    - const gchar *hash_algo);
    -#endif /* PURPLE_JABBER_JUTIL_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libgadu.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,2639 +0,0 @@
    -/* $Id$ */
    -
    -/*
    - * (C) Copyright 2001-2009 Wojtek Kaniewski <wojtekka@irc.pl>
    - * Robert J. Woźny <speedy@ziew.org>
    - * Arkadiusz Miśkiewicz <arekm@pld-linux.org>
    - * Tomasz Chiliński <chilek@chilan.com>
    - * Piotr Wysocki <wysek@linux.bydg.org>
    - * Dawid Jarosz <dawjar@poczta.onet.pl>
    - * Jakub Zawadzki <darkjames@darkjames.ath.cx>
    - *
    - * This program is free software; you can redistribute it and/or modify
    - * it under the terms of the GNU Lesser General Public License Version
    - * 2.1 as published by the Free Software Foundation.
    - *
    - * 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 Lesser General Public License for more details.
    - *
    - * You should have received a copy of the GNU Lesser General Public
    - * License along with this program; if not, write to the Free Software
    - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
    - * USA.
    - */
    -
    -/**
    - * \file libgadu.h
    - *
    - * \brief Główny plik nagłówkowy biblioteki
    - */
    -
    -#ifndef LIBGADU_LIBGADU_H
    -#define LIBGADU_LIBGADU_H
    -
    -#ifdef _WIN32
    -#pragma pack(push, 1)
    -#endif
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#include <sys/types.h>
    -#include <stdio.h>
    -#include <stdarg.h>
    -
    -/** \cond ignore */
    -
    -/* Defined if libgadu was compiled for bigendian machine. */
    -#undef GG_CONFIG_BIGENDIAN
    -
    -/* Defined if this machine has gethostbyname_r(). */
    -#undef GG_CONFIG_HAVE_GETHOSTBYNAME_R
    -
    -/* Defined if libgadu was compiled and linked with fork support. */
    -#undef GG_CONFIG_HAVE_FORK
    -
    -/* Defined if libgadu was compiled and linked with pthread support. */
    -#undef GG_CONFIG_HAVE_PTHREAD
    -
    -/* Defined if pthread resolver is the default one. */
    -#undef GG_CONFIG_PTHREAD_DEFAULT
    -
    -/* Defined if this machine has C99-compiliant vsnprintf(). */
    -#undef GG_CONFIG_HAVE_C99_VSNPRINTF
    -
    -/* Defined if this machine has va_copy(). */
    -#undef GG_CONFIG_HAVE_VA_COPY
    -
    -/* Defined if this machine has __va_copy(). */
    -#undef GG_CONFIG_HAVE___VA_COPY
    -
    -/* Defined if this machine supports long long. */
    -#undef GG_CONFIG_HAVE_LONG_LONG
    -
    -/* Defined if libgadu was compiled and linked with GnuTLS support. */
    -#undef GG_CONFIG_HAVE_GNUTLS
    -
    -/* Defined if libgadu was compiled and linked with OpenSSL support. */
    -#undef GG_CONFIG_HAVE_OPENSSL
    -
    -/* Defined if libgadu was compiled and linked with zlib support. */
    -#undef GG_CONFIG_HAVE_ZLIB
    -
    -/* Defined if uintX_t types are defined in <stdint.h>. */
    -#undef GG_CONFIG_HAVE_STDINT_H
    -
    -/* Defined if uintX_t types are defined in <inttypes.h>. */
    -#undef GG_CONFIG_HAVE_INTTYPES_H
    -
    -/* Defined if uintX_t types are defined in <sys/inttypes.h>. */
    -#undef GG_CONFIG_HAVE_SYS_INTTYPES_H
    -
    -/* Defined if uintX_t types are defined in <sys/int_types.h>. */
    -#undef GG_CONFIG_HAVE_SYS_INT_TYPES_H
    -
    -/* Defined if uintX_t types are defined in <sys/types.h>. */
    -#undef GG_CONFIG_HAVE_SYS_TYPES_H
    -
    -/* Defined if this machine has uint64_t. */
    -#undef GG_CONFIG_HAVE_UINT64_T
    -
    -/* Defined if libgadu is GPL compliant (was not linked with OpenSSL or any
    - other non-GPL compliant library support). */
    -#undef GG_CONFIG_IS_GPL_COMPLIANT
    -
    -#include "config.h"
    -
    -#ifdef GG_CONFIG_HAVE_OPENSSL
    -#include <openssl/ssl.h>
    -#endif
    -
    -#ifdef GG_CONFIG_HAVE_STDINT_H
    -#include <stdint.h>
    -#else
    -# ifdef GG_CONFIG_HAVE_INTTYPES_H
    -# include <inttypes.h>
    -# else
    -# ifdef GG_CONFIG_HAVE_SYS_INTTYPES_H
    -# include <sys/inttypes.h>
    -# else
    -# ifdef GG_CONFIG_HAVE_SYS_INT_TYPES_H
    -# include <sys/int_types.h>
    -# else
    -# ifdef GG_CONFIG_HAVE_SYS_TYPES_H
    -# include <sys/types.h>
    -# else
    -
    -/* ISO C 9X: 7.18 Integer types <stdint.h> */
    -
    -typedef unsigned char uint8_t;
    -typedef unsigned short uint16_t;
    -typedef unsigned int uint32_t;
    -
    -# endif
    -# endif
    -# endif
    -# endif
    -#endif
    -
    -#ifndef GG_CONFIG_HAVE_UINT64_T
    -typedef unsigned long long uint64_t;
    -#endif
    -
    -#ifdef _MSC_VER
    -#include <BaseTsd.h>
    -typedef SSIZE_T ssize_t;
    -#endif
    -
    -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4))
    -# define GG_GNUC_PRINTF(format_idx, arg_idx) \
    - __attribute__((format (printf, (format_idx), (arg_idx))))
    -#else
    -# define GG_GNUC_PRINTF(format_idx, arg_idx)
    -#endif
    -
    -/** \endcond */
    -
    -/**
    - * Numer Gadu-Gadu.
    - */
    -typedef uint32_t uin_t;
    -
    -/**
    - * Identyfikator połączenia bezpośredniego Gadu-Gadu 7.x.
    - */
    -typedef struct {
    - uint8_t id[8];
    -} gg_dcc7_id_t;
    -
    -/**
    - * Identyfikator sesji multilogowania.
    - */
    -typedef struct {
    - uint8_t id[8];
    -} gg_multilogon_id_t;
    -
    -/**
    - * Makro deklarujące pola wspólne dla struktur sesji.
    - */
    -#define gg_common_head(x) \
    - int fd; /**< Obserwowany deskryptor */ \
    - int check; /**< Informacja o żądaniu odczytu/zapisu (patrz \ref gg_check_t) */ \
    - int state; /**< Aktualny stan połączenia (patrz \ref gg_state_t) */ \
    - int error; /**< Kod błędu dla \c GG_STATE_ERROR (patrz \ref gg_error_t) */ \
    - int type; /**< Rodzaj sesji (patrz \ref gg_session_t) */ \
    - int id; /**< Identyfikator sesji */ \
    - int timeout; /**< Czas pozostały do zakończenia stanu */ \
    - int (*callback)(x*); /**< Funkcja zwrotna */ \
    - void (*destroy)(x*); /**< Funkcja zwalniania zasobów */
    -
    -/**
    - * Struktura wspólna dla wszystkich sesji i połączeń. Pozwala na proste
    - * rzutowanie niezależne od rodzaju połączenia.
    - */
    -struct gg_common {
    - gg_common_head(struct gg_common)
    -};
    -
    -struct gg_image_queue;
    -
    -struct gg_dcc7;
    -
    -struct gg_dcc7_relay;
    -
    -struct gg_session_private;
    -
    -/**
    - * Sposób rozwiązywania nazw serwerów.
    - */
    -typedef enum {
    - GG_RESOLVER_DEFAULT = 0, /**< Domyślny sposób rozwiązywania nazw (jeden z poniższych) */
    - GG_RESOLVER_FORK, /**< RozwiÄ…zywanie nazw bazujÄ…ce na procesach */
    - GG_RESOLVER_PTHREAD, /**< RozwiÄ…zywanie nazw bazujÄ…ce na wÄ…tkach */
    - GG_RESOLVER_CUSTOM, /**< Funkcje rozwiÄ…zywania nazw dostarczone przed aplikacjÄ™ */
    - GG_RESOLVER_WIN32, /**< RozwiÄ…zywanie nazw bazujÄ…ce na wÄ…tkach Win32 */
    - GG_RESOLVER_INVALID = -1 /**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */
    -} gg_resolver_t;
    -
    -/**
    - * Rodzaj kodowania znaków.
    - */
    -typedef enum {
    - GG_ENCODING_CP1250 = 0, /**< Kodowanie CP1250 */
    - GG_ENCODING_UTF8, /**< Kodowanie UTF-8 */
    - GG_ENCODING_INVALID = -1 /**< Nieprawidłowe kodowanie */
    -} gg_encoding_t;
    -
    -/**
    - * Stopień kompatybilności ze starymi wersjami API.
    - */
    -typedef enum {
    - GG_COMPAT_LEGACY = 0, /**< Całkowita kompatybilność (nie wyłącza żadnych funkcji) */
    - GG_COMPAT_1_12_0 = 1 /**< Wyłącza: dostarczanie eventów GG_EVENT_ACK, stary format konferencji */
    -} gg_compat_t;
    -
    -/**
    - * Flaga połączenia szyfrowanego.
    - *
    - * \ingroup login
    - */
    -typedef enum {
    - GG_SSL_DISABLED = 0, /**< Połączenie SSL wyłączone */
    - GG_SSL_ENABLED, /**< Połączenie SSL włączone gdy dostępne. Błędny certyfikat serwera nie powoduje odrzucenia połączenia. */
    - GG_SSL_REQUIRED /**< Połączenie SSL wymagane. Błędny certyfikat serwera powoduje odrzucenie połączenia. */
    -} gg_ssl_t;
    -
    -/**
    - * Sesja Gadu-Gadu.
    - *
    - * Tworzona przez funkcjÄ™ \c gg_login(), zwalniana przez \c gg_free_session().
    - *
    - * \ingroup login
    - */
    -struct gg_session {
    - gg_common_head(struct gg_session)
    -
    - int async; /**< Flaga połączenia asynchronicznego */
    - int pid; /**< Numer procesu rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    - int port; /**< Port serwera */
    - int seq; /**< Numer sekwencyjny ostatniej wiadomości */
    - int last_pong; /**< Czas otrzymania ostatniej ramki utrzymaniowej */
    - int last_event; /**< Czas otrzymania ostatniego pakietu */
    -
    - struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
    -
    - uint32_t proxy_addr; /**< Adres serwera pośredniczącego */
    - uint16_t proxy_port; /**< Port serwera pośredniczącego */
    -
    - uint32_t hub_addr; /**< Adres huba po rozwiÄ…zaniu nazwy */
    - uint32_t server_addr; /**< Adres serwera otrzymany od huba */
    -
    - uint32_t client_addr; /**< Adres gniazda dla połączeń bezpośrednich */
    - uint16_t client_port; /**< Port gniazda dla połączeń bezpośrednich */
    -
    - uint32_t external_addr; /**< Publiczny adres dla połączeń bezpośrednich */
    - uint16_t external_port; /**< Publiczny port dla połączeń bezpośrednich */
    -
    - uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    - char *password; /**< Hasło (zwalniane po użyciu) */
    -
    - int initial_status; /**< PoczÄ…tkowy status */
    - int status; /**< Aktualny status */
    -
    - char *recv_buf; /**< Bufor na odbierane pakiety. Wskaźnik zawsze maksymalnie wyrównany, tak jak w wyniku działania \c malloc(). */
    - int recv_done; /**< Liczba wczytanych bajtów pakietu */
    - int recv_left; /**< Liczba pozostałych do wczytania bajtów pakietu */
    -
    - int protocol_version; /**< Wersja protokołu (bez flag) */
    - char *client_version; /**< Wersja klienta */
    - int last_sysmsg; /**< Numer ostatniej wiadomości systemowej */
    -
    - char *initial_descr; /**< PoczÄ…tkowy opis statusu */
    -
    - void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    -
    -#ifndef DOXYGEN
    - char *header_buf; /**< Bufor na początek nagłówka pakietu (nieaktualne) */
    - unsigned int header_done; /**< Liczba wczytanych bajtów nagłówka pakietu (nieaktualne) */
    -#endif
    -
    -#ifdef GG_CONFIG_HAVE_OPENSSL
    - SSL *ssl; /**< Struktura TLS */
    - SSL_CTX *ssl_ctx; /**< Kontekst sesji TLS */
    -#else
    - void *ssl; /**< Struktura TLS */
    - void *ssl_ctx; /**< Kontekst sesji TLS */
    -#endif
    -
    - int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    -
    - char *userlist_reply; /**< Bufor z odbieraną listą kontaktów */
    -
    - int userlist_blocks; /**< Liczba części listy kontaktów */
    -
    - struct gg_image_queue *images; /**< Lista wczytywanych obrazków */
    -
    - int hash_type; /**< Rodzaj funkcji skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1) */
    -
    - char *send_buf; /**< Bufor z danymi do wysłania */
    - int send_left; /**< Liczba bajtów do wysłania */
    -
    - struct gg_dcc7 *dcc7_list; /**< Lista połączeń bezpośrednich skojarzonych z sesją */
    -
    - int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_watch_fd() */
    -
    - int protocol_flags; /**< Flagi protokołu */
    -
    - gg_encoding_t encoding; /**< Rodzaj kodowania znaków */
    -
    - gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
    - int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynajÄ…ca rozwiÄ…zywanie nazwy */
    - void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniajÄ…ca zasoby po rozwiÄ…zaniu nazwy */
    -
    - int protocol_features; /**< Opcje protokołu */
    - int status_flags; /**< Flagi statusu */
    - int recv_msg_count; /**< Liczba odebranych wiadomości */
    -
    - const char *resolver_host; /**< Nazwa do rozwiÄ…zania */
    - struct in_addr *resolver_result; /**< Wynik rozwiÄ…zywania nazwy */
    - unsigned int resolver_index; /**< Indeks aktualnie obsługiwanego wyniku rozwiązywania nazwy */
    - unsigned int resolver_count; /**< Liczba wyników rozwiązywania nazwy */
    -
    - uint16_t connect_port[2]; /**< Lista portów do połączenia */
    - unsigned int connect_index; /**< Indeks aktualnie obsługiwanego portu */
    -
    - char *connect_host; /**< Adres serwera Gadu-Gadu, z którym się łączymy */
    - gg_ssl_t ssl_flag; /**< Flaga połączenia szyfrowanego */
    -
    - struct gg_session_private *private_data; /**< Prywatne dane sesji, nie udostępnione w API */
    -};
    -
    -/**
    - * Połączenie HTTP.
    - *
    - * Tworzone przez \c gg_http_connect(), zwalniane przez \c gg_http_free().
    - *
    - * \ingroup http
    - */
    -struct gg_http {
    - gg_common_head(struct gg_http)
    -
    - int async; /**< Flaga połączenia asynchronicznego */
    - int pid; /**< Identyfikator procesu rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    - int port; /**< Port */
    -
    - char *query; /**< Zapytanie HTTP */
    - char *header; /**< Odebrany nagłówek */
    - int header_size; /**< Rozmiar wczytanego nagłówka */
    - char *body; /**< Odebrana strona */
    - unsigned int body_size; /**< Rozmiar strony */
    -
    - void *data; /**< Dane prywatne usługi HTTP */
    -
    - char *user_data; /**< Dane prywatne użytkownika (nie są zwalniane) */
    -
    - void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ */
    -
    - unsigned int body_done; /**< Liczba odebranych bajtów strony */
    -
    - gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
    - int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynajÄ…ca rozwiÄ…zywanie nazwy */
    - void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniajÄ…ca zasoby po rozwiÄ…zaniu nazwy */
    -};
    -
    -/** \cond ignore */
    -
    -#ifdef __GNUC__
    -#define GG_PACKED __attribute__ ((packed))
    -#ifndef GG_IGNORE_DEPRECATED
    -#define GG_DEPRECATED __attribute__ ((deprecated))
    -#else
    -#define GG_DEPRECATED
    -#endif
    -#else
    -#define GG_PACKED
    -#define GG_DEPRECATED
    -#endif
    -
    -/** \endcond */
    -
    -#define GG_MAX_PATH 276 /**< Maksymalny rozmiar nazwy pliku w strukturze \c gg_file_info */
    -
    -/**
    - * Odpowiednik struktury WIN32_FIND_DATA z API WIN32.
    - *
    - * Wykorzystywana przy połączeniach bezpośrednich do wersji Gadu-Gadu 6.x.
    - */
    -struct gg_file_info {
    - uint32_t mode; /**< dwFileAttributes */
    - uint32_t ctime[2]; /**< ftCreationTime */
    - uint32_t atime[2]; /**< ftLastAccessTime */
    - uint32_t mtime[2]; /**< ftLastWriteTime */
    - uint32_t size_hi; /**< nFileSizeHigh */
    - uint32_t size; /**< nFileSizeLow */
    - uint32_t reserved0; /**< dwReserved0 */
    - uint32_t reserved1; /**< dwReserved1 */
    - unsigned char filename[GG_MAX_PATH - 14]; /**< cFileName */
    - unsigned char short_filename[14]; /**< cAlternateFileName */
    -} /** \cond ignore */ GG_PACKED /** \endcond */;
    -
    -/**
    - * Połączenie bezpośrednie do wersji Gadu-Gadu 6.x.
    - *
    - * Tworzone przez \c gg_dcc_socket_create(), \c gg_dcc_get_file(),
    - * \c gg_dcc_send_file() lub \c gg_dcc_voice_chat(), zwalniane przez
    - * \c gg_dcc_free().
    - *
    - * \ingroup dcc6
    - */
    -struct gg_dcc {
    - gg_common_head(struct gg_dcc)
    -
    - struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
    -
    - int active; /**< Flaga połączenia aktywnego (nieużywana) */
    - int port; /**< Port gniazda nasłuchującego */
    - uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    - uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
    - int file_fd; /**< deskryptor pliku */
    - unsigned int offset; /**< Położenie w pliku */
    - unsigned int chunk_size;
    - /**< Rozmiar kawałka pliku */
    - unsigned int chunk_offset;
    - /**< Położenie w aktualnym kawałku pliku */
    - struct gg_file_info file_info;
    - /**< Informacje o pliku */
    - int established; /**< Flaga ustanowienia połączenia */
    - char *voice_buf; /**< Bufor na pakiet połączenia głosowego */
    - int incoming; /**< Flaga połączenia przychodzącego */
    - char *chunk_buf; /**< Bufor na fragment danych */
    - uint32_t remote_addr; /**< Adres drugiej strony */
    - uint16_t remote_port; /**< Port drugiej strony */
    -};
    -
    -#define GG_DCC7_HASH_LEN 20 /**< Maksymalny rozmiar skrótu pliku w połączeniach bezpośrenich */
    -#define GG_DCC7_FILENAME_LEN 255 /**< Maksymalny rozmiar nazwy pliku w połączeniach bezpośrednich */
    -#define GG_DCC7_INFO_LEN 32 /**< Maksymalny rozmiar informacji o połączeniach bezpośrednich */
    -#define GG_DCC7_INFO_HASH_LEN 32 /**< Maksymalny rozmiar skrótu ip informacji o połączeniach bezpośrednich */
    -
    -/**
    - * Połączenie bezpośrednie od wersji Gadu-Gadu 7.x.
    - *
    - * \ingroup dcc7
    - */
    -struct gg_dcc7 {
    - gg_common_head(struct gg_dcc7)
    -
    - gg_dcc7_id_t cid; /**< Identyfikator połączenia */
    -
    - struct gg_event *event; /**< Struktura zdarzenia */
    -
    - uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    - uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
    -
    - int file_fd; /**< Deskryptor przesyłanego pliku */
    - unsigned int offset; /**< Aktualne położenie w przesyłanym pliku */
    - unsigned int size; /**< Rozmiar przesyłanego pliku */
    - unsigned char filename[GG_DCC7_FILENAME_LEN + 1];
    - /**< Nazwa przesyłanego pliku */
    - unsigned char hash[GG_DCC7_HASH_LEN];
    - /**< Skrót SHA1 przesyłanego pliku */
    -
    - int dcc_type; /**< Rodzaj połączenia bezpośredniego */
    - int established; /**< Flaga ustanowienia połączenia */
    - int incoming; /**< Flaga połączenia przychodzącego */
    - int reverse; /**< Flaga połączenia zwrotnego */
    -
    - uint32_t local_addr; /**< Adres lokalny */
    - uint16_t local_port; /**< Port lokalny */
    -
    - uint32_t remote_addr; /**< Adres drugiej strony */
    - uint16_t remote_port; /**< Port drugiej strony */
    -
    - struct gg_session *sess;
    - /**< Sesja do której przypisano połączenie */
    - struct gg_dcc7 *next; /**< Następne połączenie w liście */
    -
    - int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_dcc7_watch_fd() */
    - int seek; /**< Flaga mówiąca, że można zmieniać położenie w wysyłanym pliku */
    -
    - void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    -
    - int relay; /**< Flaga mówiąca, że laczymy sie przez serwer */
    - int relay_index; /**< Numer serwera pośredniczącego, do którego się łączymy */
    - int relay_count; /**< Rozmiar listy serwerów pośredniczących */
    - struct gg_dcc7_relay *relay_list; /**< Lista serwerów pośredniczących */
    -};
    -
    -/**
    - * Rodzaj sesji.
    - */
    -enum gg_session_t {
    - GG_SESSION_GG = 1, /**< Połączenie z serwerem Gadu-Gadu */
    - GG_SESSION_HTTP, /**< Połączenie HTTP */
    - GG_SESSION_SEARCH, /**< Wyszukiwanie w katalogu publicznym (nieaktualne) */
    - GG_SESSION_REGISTER, /**< Rejestracja nowego konta */
    - GG_SESSION_REMIND, /**< Przypominanie hasła */
    - GG_SESSION_PASSWD, /**< Zmiana hasła */
    - GG_SESSION_CHANGE, /**< Zmiana informacji w katalogu publicznym (nieaktualne) */
    - GG_SESSION_DCC, /**< Połączenie bezpośrednie (do wersji 6.x) */
    - GG_SESSION_DCC_SOCKET, /**< Gniazdo nasłuchujące (do wersji 6.x) */
    - GG_SESSION_DCC_SEND, /**< Wysyłanie pliku (do wersji 6.x) */
    - GG_SESSION_DCC_GET, /**< Odbieranie pliku (do wersji 6.x) */
    - GG_SESSION_DCC_VOICE, /**< Rozmowa głosowa (do wersji 6.x) */
    - GG_SESSION_USERLIST_GET, /**< Import listy kontaktów z serwera (nieaktualne) */
    - GG_SESSION_USERLIST_PUT, /**< Eksport listy kontaktów do serwera (nieaktualne) */
    - GG_SESSION_UNREGISTER, /**< Usuwanie konta */
    - GG_SESSION_USERLIST_REMOVE, /**< Usuwanie listy kontaktów z serwera (nieaktualne) */
    - GG_SESSION_TOKEN, /**< Pobieranie tokenu */
    - GG_SESSION_DCC7_SOCKET, /**< Gniazdo nasłuchujące (od wersji 7.x) */
    - GG_SESSION_DCC7_SEND, /**< Wysyłanie pliku (od wersji 7.x) */
    - GG_SESSION_DCC7_GET, /**< Odbieranie pliku (od wersji 7.x) */
    - GG_SESSION_DCC7_VOICE, /**< Rozmowa głosowa (od wersji 7.x) */
    -
    - GG_SESSION_USER0 = 256, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER1, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER2, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER3, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER4, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER5, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER6, /**< Rodzaj zadeklarowany dla użytkownika */
    - GG_SESSION_USER7 /**< Rodzaj zadeklarowany dla użytkownika */
    -};
    -
    -/**
    - * Aktualny stan sesji.
    - */
    -enum gg_state_t {
    - /* wspólne */
    - GG_STATE_IDLE = 0, /**< Nie dzieje siÄ™ nic */
    - GG_STATE_RESOLVING, /**< Oczekiwanie na rozwiÄ…zanie nazwy serwera */
    - GG_STATE_CONNECTING, /**< Oczekiwanie na połączenie */
    - GG_STATE_READING_DATA, /**< Oczekiwanie na dane */
    - GG_STATE_ERROR, /**< Kod błędu w polu \c error */
    -
    - /* gg_session */
    - GG_STATE_CONNECTING_HUB, /**< Oczekiwanie na połączenie z hubem */
    - GG_STATE_CONNECTING_GG, /**< Oczekiwanie na połączenie z serwerem */
    - GG_STATE_READING_KEY, /**< Oczekiwanie na klucz */
    - GG_STATE_READING_REPLY, /**< Oczekiwanie na odpowiedź serwera */
    - GG_STATE_CONNECTED, /**< Połączono z serwerem */
    -
    - /* gg_http */
    - GG_STATE_SENDING_QUERY, /**< Wysłano zapytanie HTTP */
    - GG_STATE_READING_HEADER, /**< Oczekiwanie na nagłówek HTTP */
    - GG_STATE_PARSING, /**< Przetwarzanie danych */
    - GG_STATE_DONE, /**< Połączenie zakończone */
    -
    - /* gg_dcc */
    - GG_STATE_LISTENING, /* czeka na połączenia */
    - GG_STATE_READING_UIN_1, /* czeka na uin peera */
    - GG_STATE_READING_UIN_2, /* czeka na swój uin */
    - GG_STATE_SENDING_ACK, /* wysyła potwierdzenie dcc */
    - GG_STATE_READING_ACK, /* czeka na potwierdzenie dcc */
    - GG_STATE_READING_REQUEST, /* czeka na komendÄ™ */
    - GG_STATE_SENDING_REQUEST, /* wysyła komendę */
    - GG_STATE_SENDING_FILE_INFO, /* wysyła informacje o pliku */
    - GG_STATE_READING_PRE_FILE_INFO, /* czeka na pakiet przed file_info */
    - GG_STATE_READING_FILE_INFO, /* czeka na informacje o pliku */
    - GG_STATE_SENDING_FILE_ACK, /* wysyła potwierdzenie pliku */
    - GG_STATE_READING_FILE_ACK, /* czeka na potwierdzenie pliku */
    - GG_STATE_SENDING_FILE_HEADER, /* wysyła nagłówek pliku */
    - GG_STATE_READING_FILE_HEADER, /* czeka na nagłówek */
    - GG_STATE_GETTING_FILE, /* odbiera plik */
    - GG_STATE_SENDING_FILE, /* wysyła plik */
    - GG_STATE_READING_VOICE_ACK, /* czeka na potwierdzenie voip */
    - GG_STATE_READING_VOICE_HEADER, /* czeka na rodzaj bloku voip */
    - GG_STATE_READING_VOICE_SIZE, /* czeka na rozmiar bloku voip */
    - GG_STATE_READING_VOICE_DATA, /* czeka na dane voip */
    - GG_STATE_SENDING_VOICE_ACK, /* wysyła potwierdzenie voip */
    - GG_STATE_SENDING_VOICE_REQUEST, /* wysyła żądanie voip */
    - GG_STATE_READING_TYPE, /* czeka na typ połączenia */
    -
    - /* nowe. bez sensu jest to API. */
    - GG_STATE_TLS_NEGOTIATION, /**< Negocjacja połączenia szyfrowanego */
    -
    - GG_STATE_REQUESTING_ID, /**< Oczekiwanie na nadanie identyfikatora połączenia bezpośredniego */
    - GG_STATE_WAITING_FOR_ACCEPT, /**< Oczekiwanie na potwierdzenie lub odrzucenie połączenia bezpośredniego */
    - GG_STATE_WAITING_FOR_INFO, /**< Oczekiwanie na informacje o połączeniu bezpośrednim */
    -
    - GG_STATE_READING_ID, /**< Odebranie identyfikatora połączenia bezpośredniego */
    - GG_STATE_SENDING_ID, /**< Wysłano identyfikator połączenia bezpośredniego */
    - GG_STATE_RESOLVING_GG, /**< Oczekiwanie na rozwiÄ…zanie nazwy serwera Gadu-Gadu */
    -
    - GG_STATE_RESOLVING_RELAY, /**< Oczekiwanie na rozwiązanie nazwy serwera pośredniczącego */
    - GG_STATE_CONNECTING_RELAY, /**< Oczekiwanie na połączenie z serwerem pośredniczącym */
    - GG_STATE_READING_RELAY, /**< Odbieranie danych */
    -
    - GG_STATE_DISCONNECTING, /**< Oczekiwanie na potwierdzenie rozłączenia */
    -
    - GG_STATE_CONNECT_HUB, /**< Nawiązanie połączenia z hubem */
    - GG_STATE_CONNECT_PROXY_HUB,
    - GG_STATE_CONNECT_GG, /**< Nawiązanie połączenia z serwerem */
    - GG_STATE_CONNECT_PROXY_GG,
    - GG_STATE_CONNECTING_PROXY_HUB,
    - GG_STATE_CONNECTING_PROXY_GG,
    - GG_STATE_RESOLVE_HUB_SYNC,
    - GG_STATE_RESOLVE_HUB_ASYNC,
    - GG_STATE_RESOLVE_PROXY_HUB_SYNC,
    - GG_STATE_RESOLVE_PROXY_HUB_ASYNC,
    - GG_STATE_RESOLVE_PROXY_GG_SYNC,
    - GG_STATE_RESOLVE_PROXY_GG_ASYNC,
    - GG_STATE_RESOLVE_GG_SYNC,
    - GG_STATE_RESOLVE_GG_ASYNC,
    - GG_STATE_RESOLVING_HUB,
    - GG_STATE_RESOLVING_PROXY_HUB,
    - GG_STATE_RESOLVING_PROXY_GG,
    - GG_STATE_SEND_HUB,
    - GG_STATE_SEND_PROXY_HUB,
    - GG_STATE_SEND_PROXY_GG,
    - GG_STATE_SENDING_HUB,
    - GG_STATE_SENDING_PROXY_HUB,
    - GG_STATE_SENDING_PROXY_GG,
    - GG_STATE_READING_HUB,
    - GG_STATE_READING_PROXY_HUB,
    - GG_STATE_READING_PROXY_GG,
    -};
    -
    -/**
    - * Informacja o tym, czy biblioteka chce zapisywać i/lub czytać
    - * z deskryptora. Maska bitowa.
    - *
    - * \ingroup events
    - */
    -enum gg_check_t {
    - GG_CHECK_NONE = 0, /**< Nie sprawdzaj niczego */
    - GG_CHECK_WRITE = 1, /**< Sprawdź możliwość zapisu */
    - GG_CHECK_READ = 2 /**< Sprawdź możliwość odczytu */
    -};
    -
    -/**
    - * Metody nawiązywania połączeń TCP/TLS.
    - *
    - * \ingroup socketmanager
    - */
    -typedef enum {
    - GG_SOCKET_MANAGER_TYPE_INTERNAL = 0, /**< Wewnętrzna obsługa gniazd (domyślne). */
    - GG_SOCKET_MANAGER_TYPE_TCP, /**< Dostarczona przez aplikację - tylko obsługa TCP. */
    - GG_SOCKET_MANAGER_TYPE_TLS /**< Dostarczona przez aplikację - obsługa zarówno TCP, jak i TLS. */
    -} gg_socket_manager_type_t;
    -
    -/**
    - * Funkcja dostarczona przez aplikacjÄ™, tworzÄ…ca nowe gniazdo TCP/TLS.
    - *
    - * Po nawiązaniu połączenia aplikacja musi wywołać gg_socket_manager_connected.
    - * Jeżeli połączenie jest asynchroniczne, wywołanie musi nastąpić po wyjściu z
    - * kontekstu tej funkcji. Dla połączeń synchronicznych z kolei, musi nastąpić
    - * jeszcze przed wyjściem z kontekstu.
    - *
    - * \param cb_data Dane prywatne aplikacji
    - * \param host Nazwa hosta
    - * \param port Numer portu
    - * \param is_tls Flaga określająca, czy ma zostać nawiązane połączenie TLS
    - * \param is_async Flaga określająca połączenie asynchroniczne (patrz szczegóły powyżej)
    - * \param priv Dane prywatne biblioteki libgadu (do przekazania do gg_socket_manager_connected)
    - *
    - * \return Uchwyt gniazda
    - *
    - * \ingroup socketmanager
    - */
    -typedef void* (*gg_socket_manager_connect_cb_t)(void *cb_data, const char *host, int port, int is_tls, int is_async, void *priv);
    -
    -/**
    - * Niszczy gniazdo i zwalnia wszystkie powiÄ…zane z nim zasoby.
    - *
    - * \param cb_data Dane prywatne aplikacji
    - * \param handle Uchwyt gniazda
    - *
    - * \ingroup socketmanager
    - */
    -typedef void (*gg_socket_manager_close_cb_t)(void *cb_data, void *handle);
    -
    -/**
    - * Odbiera z gniazda dane binarne.
    - *
    - * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
    - *
    - * \param cb_data Dane prywatne aplikacji
    - * \param handle Uchwyt gniazda
    - * \param buffer Bufor do zapisu danych
    - * \param bufsize Rozmiar bufora
    - *
    - * \return Ilość zapisanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
    - *
    - * \ingroup socketmanager
    - */
    -typedef ssize_t (*gg_socket_manager_read_cb_t)(void *cb_data, void *handle, unsigned char *buffer, size_t bufsize);
    -
    -/**
    - * Wysyła przez gniazdo dane binarne.
    - *
    - * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
    - *
    - * \param cb_data Dane prywatne aplikacji
    - * \param handle Uchwyt gniazda
    - * \param data Dane do wysłania
    - * \param length Rozmiar danych
    - *
    - * \return Ilość wysłanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
    - *
    - * \ingroup socketmanager
    - */
    -typedef ssize_t (*gg_socket_manager_write_cb_t)(void *cb_data, void *handle, const unsigned char *data, size_t length);
    -
    -/**
    - * Struktura opisująca funkcje zarządzające gniazdami, jeżeli aplikacja sama je
    - * obsługuje.
    - *
    - * \ingroup socketmanager
    - */
    -typedef struct {
    - void *cb_data; /**< Dane prywatne aplikacji */
    - gg_socket_manager_connect_cb_t connect_cb; /**< Funkcja tworzÄ…ca nowe gniazdo */
    - gg_socket_manager_close_cb_t close_cb; /**< Funkcja niszczÄ…ca gniazdo */
    - gg_socket_manager_read_cb_t read_cb; /**< Funkcja odczytujÄ…ca dane z gniazda */
    - gg_socket_manager_write_cb_t write_cb; /**< Funkcja wysyłająca dane przez gniazdo */
    -#ifndef DOXYGEN
    - void *reserved1;
    - void *reserved2;
    - void *reserved3;
    - void *reserved4;
    -#endif
    -} gg_socket_manager_t;
    -
    -int gg_socket_manager_connected(void *handle, void *priv, int fd);
    -
    -/**
    - * Parametry połączenia z serwerem Gadu-Gadu. Parametry zostały przeniesione
    - * do struktury, by uniknąć zmian API po rozszerzeniu protokołu i dodaniu
    - * kolejnych opcji połączenia. Część parametrów, które nie są już aktualne
    - * lub nie mają znaczenia, została usunięta z dokumentacji.
    - *
    - * \ingroup login
    - */
    -struct gg_login_params {
    - uin_t uin; /**< Numer Gadu-Gadu */
    - char *password; /**< Hasło */
    - int async; /**< Flaga asynchronicznego połączenia (domyślnie nie) */
    - int status; /**< Początkowy status użytkownika (domyślnie \c GG_STATUS_AVAIL) */
    - char *status_descr; /**< Początkowy opis użytkownika (domyślnie brak) */
    - uint32_t server_addr; /**< Adres serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
    - uint16_t server_port; /**< Port serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
    - uint32_t client_addr; /**< Adres połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    - uint16_t client_port; /**< Port połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    - int protocol_version; /**< Wersja protokołu wysyłana do serwera (domyślnie najnowsza obsługiwana) */
    - char *client_version; /**< Wersja klienta wysyłana do serwera (domyślnie najnowsza znana) */
    - int has_audio; /**< Flaga obsługi połączeń głosowych */
    - int last_sysmsg; /**< Numer ostatnio odebranej wiadomości systemowej */
    - uint32_t external_addr; /**< Adres publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    - uint16_t external_port; /**< Port publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    - int tls; /**< Flaga połączenia szyfrowanego (patrz \ref gg_ssl_t) */
    - int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w kilobajtach */
    -#ifndef DOXYGEN
    - int era_omnix; /**< Flaga udawania klienta Era Omnix (nieaktualna) */
    -#endif
    - int hash_type; /**< Rodzaj skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1, domyślnie SHA1) */
    - gg_encoding_t encoding; /**< Rodzaj kodowania używanego w sesji (domyślnie CP1250) */
    - gg_resolver_t resolver; /**< Sposób rozwiązywania nazw (patrz \ref build-resolver) */
    - int protocol_features; /**< Opcje protokołu (flagi GG_FEATURE_*). */
    - int status_flags; /**< Flagi statusu (flagi GG_STATUS_FLAG_*, patrz \ref status). */
    -
    - unsigned int struct_size; /**< Rozmiar struktury. To pole powinno być inicjowane wartością sizeof(struct gg_login_params) - w przeciwnym przypadku pola za nim nie będą obsługiwane. Pozwala na rozszerzanie struktury bez łamania ABI. */
    -
    - gg_compat_t compatibility; /**< Stopień kompatybilności ze starym API. */
    -
    - char *connect_host; /**< Nazwa hosta (oraz opcjonalnie port, podany po dwukropku) serwera Gadu-Gadu (domyślnie pobierany automatycznie) (patrz pole struct_size). */
    -
    - gg_socket_manager_type_t socket_manager_type; /**< Wybrana metoda nawiązywania połączeń TCP/TLS (domyślnie wewnętrzna) */
    - gg_socket_manager_t socket_manager; /**< Jeżeli wybrano metodę zewnętrzną - konfiguracja jej */
    -
    - char **host_white_list; /**< Lista zakończona wskaźnikiem NULL, domen akceptowanych w odpowiedziach od huba (domyślnie wszystkie do tej pory znane). Używane tylko przy GG_SSL_REQUIRED. Pusta lista wyłącza sprawdzanie. */
    -};
    -
    -#ifdef GG_CONFIG_IS_GPL_COMPLIANT
    -int gg_is_gpl_compliant(void);
    -#endif
    -struct gg_session *gg_login(const struct gg_login_params *p);
    -void gg_free_session(struct gg_session *sess);
    -void gg_logoff(struct gg_session *sess);
    -int gg_change_status(struct gg_session *sess, int status);
    -int gg_change_status_descr(struct gg_session *sess, int status, const char *descr);
    -int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time);
    -int gg_change_status_flags(struct gg_session *sess, int flags);
    -int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
    -int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
    -int gg_send_message_html(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *html_message);
    -int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
    -int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen);
    -int gg_send_message_confer_html(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *html_message);
    -int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
    -int gg_ping(struct gg_session *sess);
    -int gg_userlist_request(struct gg_session *sess, char type, const char *request);
    -int gg_userlist100_request(struct gg_session *sess, char type, unsigned int version, char format_type, const char *request);
    -int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32);
    -int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size);
    -int gg_typing_notification(struct gg_session *sess, uin_t recipient, int length);
    -
    -uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len);
    -
    -int gg_session_set_resolver(struct gg_session *gs, gg_resolver_t type);
    -gg_resolver_t gg_session_get_resolver(struct gg_session *gs);
    -int gg_session_set_custom_resolver(struct gg_session *gs, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    -
    -int gg_http_set_resolver(struct gg_http *gh, gg_resolver_t type);
    -gg_resolver_t gg_http_get_resolver(struct gg_http *gh);
    -int gg_http_set_custom_resolver(struct gg_http *gh, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    -
    -int gg_global_set_resolver(gg_resolver_t type);
    -gg_resolver_t gg_global_get_resolver(void);
    -int gg_global_set_custom_resolver(int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    -
    -int gg_multilogon_disconnect(struct gg_session *gs, gg_multilogon_id_t conn_id);
    -
    -int gg_chat_create(struct gg_session *gs);
    -int gg_chat_invite(struct gg_session *gs, uint64_t id, uin_t *participants, unsigned int participants_count);
    -int gg_chat_leave(struct gg_session *gs, uint64_t id);
    -int gg_chat_send_message(struct gg_session *gs, uint64_t id, const char *message, int is_html);
    -
    -/**
    - * Rodzaj zdarzenia.
    - *
    - * \ingroup events
    - */
    -enum gg_event_t {
    - GG_EVENT_NONE = 0, /**< Nie wydarzyło się nic wartego uwagi */
    - GG_EVENT_MSG, /**< \brief Otrzymano wiadomość. Przekazuje również wiadomości systemowe od numeru 0. */
    - GG_EVENT_NOTIFY, /**< \brief Informacja o statusach osób z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane. */
    - GG_EVENT_NOTIFY_DESCR, /**< \brief Informacja o statusie opisowym osoby z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. */
    - GG_EVENT_STATUS, /**< \brief Zmiana statusu osoby z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. */
    - GG_EVENT_ACK, /**< Potwierdzenie doręczenia wiadomości */
    - GG_EVENT_PONG, /**< \brief Utrzymanie połączenia. Obecnie serwer nie wysyła już do klienta ramek utrzymania połączenia, polega wyłącznie na wysyłaniu ramek przez klienta. */
    - GG_EVENT_CONN_FAILED, /**< \brief Nie udało się połączyć */
    - GG_EVENT_CONN_SUCCESS, /**< \brief Połączono z serwerem. Pierwszą rzeczą, jaką należy zrobić jest wysłanie listy kontaktów. */
    - GG_EVENT_DISCONNECT, /**< \brief Serwer zrywa połączenie. Zdarza się, gdy równolegle do serwera podłączy się druga sesja i trzeba zerwać połączenie z pierwszą. */
    -
    - GG_EVENT_DCC_NEW, /**< Nowe połączenie bezpośrednie (6.x) */
    - GG_EVENT_DCC_ERROR, /**< Błąd połączenia bezpośredniego (6.x) */
    - GG_EVENT_DCC_DONE, /**< Zakończono połączenie bezpośrednie (6.x) */
    - GG_EVENT_DCC_CLIENT_ACCEPT, /**< Moment akceptacji klienta w połączeniu bezpośrednim (6.x) */
    - GG_EVENT_DCC_CALLBACK, /**< Zwrotne połączenie bezpośrednie (6.x) */
    - GG_EVENT_DCC_NEED_FILE_INFO, /**< Należy wypełnić \c file_info dla połączenia bezpośredniego (6.x) */
    - GG_EVENT_DCC_NEED_FILE_ACK, /**< Czeka na potwierdzenie pliku w połączeniu bezpośrednim (6.x) */
    - GG_EVENT_DCC_NEED_VOICE_ACK, /**< Czeka na potwierdzenie rozmowy w połączeniu bezpośrednim (6.x) */
    - GG_EVENT_DCC_VOICE_DATA, /**< Dane bezpośredniego połączenia głosowego (6.x) */
    -
    - GG_EVENT_PUBDIR50_SEARCH_REPLY, /**< Odpowiedź katalogu publicznego */
    - GG_EVENT_PUBDIR50_READ, /**< Odczytano własne dane z katalogu publicznego */
    - GG_EVENT_PUBDIR50_WRITE, /**< Zmieniono własne dane w katalogu publicznym */
    -
    - GG_EVENT_STATUS60, /**< Zmiana statusu osoby z listy kontaktów */
    - GG_EVENT_NOTIFY60, /**< Informacja o statusach osób z listy kontaktów. Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane. */
    - GG_EVENT_USERLIST, /**< Wynik importu lub eksportu listy kontaktów */
    - GG_EVENT_IMAGE_REQUEST, /**< Żądanie przesłania obrazka z wiadomości */
    - GG_EVENT_IMAGE_REPLY, /**< Przysłano obrazek z wiadomości */
    - GG_EVENT_DCC_ACK, /**< Potwierdzenie transmisji w połączeniu bezpośrednim (6.x) */
    -
    - GG_EVENT_DCC7_NEW, /**< Nowe połączenie bezpośrednie (7.x) */
    - GG_EVENT_DCC7_ACCEPT, /**< Zaakceptowano połączenie bezpośrednie (7.x), nowy deskryptor */
    - GG_EVENT_DCC7_REJECT, /**< Odrzucono połączenie bezpośrednie (7.x) */
    - GG_EVENT_DCC7_CONNECTED, /**< Zestawiono połączenie bezpośrednie (7.x), nowy deskryptor */
    - GG_EVENT_DCC7_ERROR, /**< Błąd połączenia bezpośredniego (7.x) */
    - GG_EVENT_DCC7_DONE, /**< Zakończono połączenie bezpośrednie (7.x) */
    - GG_EVENT_DCC7_PENDING, /**< Trwa próba połączenia bezpośredniego (7.x), nowy deskryptor */
    -
    - GG_EVENT_XML_EVENT, /**< Otrzymano komunikat systemowy (7.7) */
    - GG_EVENT_DISCONNECT_ACK, /**< \brief Potwierdzenie zakończenia sesji. Informuje o tym, że zmiana stanu na niedostępny z opisem dotarła do serwera i można zakończyć połączenie TCP. */
    - GG_EVENT_TYPING_NOTIFICATION, /**< Powiadomienie o pisaniu */
    - GG_EVENT_USER_DATA, /**< Informacja o kontaktach */
    - GG_EVENT_MULTILOGON_MSG, /**< Wiadomość wysłana z innej sesji multilogowania */
    - GG_EVENT_MULTILOGON_INFO, /**< Informacja o innych sesjach multilogowania */
    -
    - GG_EVENT_USERLIST100_VERSION, /**< Otrzymano numer wersji listy kontaktów na serwerze (10.0) */
    - GG_EVENT_USERLIST100_REPLY, /**< Wynik importu lub eksportu listy kontaktów (10.0) */
    -
    - GG_EVENT_IMTOKEN, /**< Otrzymano ciÄ…g IMTOKEN (11.0) */
    - GG_EVENT_PONG110, /**< \brief Utrzymanie połączenia (11.0). Może służyć do synchronizacji czasu z serwerem. */
    - GG_EVENT_JSON_EVENT, /**< Otrzymano komunikat systemowy (11.0) */
    - GG_EVENT_ACK110, /**< Potwierdzenie wysłania wiadomości (11.0) */
    -
    - GG_EVENT_CHAT_INFO, /**< Otrzymano informacjÄ™ o konferencji (11.0). */
    - GG_EVENT_CHAT_INFO_GOT_ALL, /**< \brief Informacje o wszystkich konferencjach zostały już wysłane (11.0). Otrzymywany po ostatnim pakiecie \c GG_EVENT_CHAT_INFO */
    - GG_EVENT_CHAT_INFO_UPDATE, /**< \brief Aktualizacja informacji o konferencji (11.0). Dodanie, usunięcie jednego z uczestników. */
    - GG_EVENT_CHAT_CREATED, /**< Potwierdzenie utworzenia konferencji (11.0) */
    - GG_EVENT_CHAT_INVITE_ACK, /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) */
    -};
    -
    -#define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
    -
    -/**
    - * Powód nieudanego połączenia.
    - */
    -enum gg_failure_t {
    - GG_FAILURE_RESOLVING = 1, /**< Nie znaleziono serwera */
    - GG_FAILURE_CONNECTING, /**< Błąd połączenia */
    - GG_FAILURE_INVALID, /**< Serwer zwrócił nieprawidłowe dane */
    - GG_FAILURE_READING, /**< Zerwano połączenie podczas odczytu */
    - GG_FAILURE_WRITING, /**< Zerwano połączenie podczas zapisu */
    - GG_FAILURE_PASSWORD, /**< Nieprawidłowe hasło */
    - GG_FAILURE_404, /**< Nieużywane */
    - GG_FAILURE_TLS, /**< Błąd negocjacji szyfrowanego połączenia */
    - GG_FAILURE_NEED_EMAIL, /**< Serwer rozłączył nas z prośbą o zmianę adresu e-mail */
    - GG_FAILURE_INTRUDER, /**< Zbyt wiele prób połączenia z nieprawidłowym hasłem */
    - GG_FAILURE_UNAVAILABLE, /**< Serwery są wyłączone */
    - GG_FAILURE_PROXY, /**< Błąd serwera pośredniczącego */
    - GG_FAILURE_HUB, /**< Błąd połączenia z hubem */
    - GG_FAILURE_INTERNAL, /**< Błąd wewnętrzny */
    -};
    -
    -/**
    - * Kod błędu danej operacji.
    - *
    - * Nie zawiera przesadnie szczegółowych informacji o powodach błędów, by nie
    - * komplikować ich obsługi. Jeśli wymagana jest większa dokładność, należy
    - * sprawdzić zawartość zmiennej systemowej \c errno.
    - */
    -enum gg_error_t {
    - GG_ERROR_RESOLVING = 1, /**< Nie znaleziono hosta */
    - GG_ERROR_CONNECTING, /**< Błąd połączenia */
    - GG_ERROR_READING, /**< BÅ‚Ä…d odczytu/odbierania */
    - GG_ERROR_WRITING, /**< Błąd zapisu/wysyłania */
    -
    - GG_ERROR_DCC_HANDSHAKE, /**< BÅ‚Ä…d negocjacji */
    - GG_ERROR_DCC_FILE, /**< BÅ‚Ä…d odczytu/zapisu pliku */
    - GG_ERROR_DCC_EOF, /**< Przedwczesny koniec pliku */
    - GG_ERROR_DCC_NET, /**< Błąd wysyłania/odbierania */
    - GG_ERROR_DCC_REFUSED, /**< Połączenie odrzucone */
    -
    - GG_ERROR_DCC7_HANDSHAKE, /**< BÅ‚Ä…d negocjacji */
    - GG_ERROR_DCC7_FILE, /**< BÅ‚Ä…d odczytu/zapisu pliku */
    - GG_ERROR_DCC7_EOF, /**< Przedwczesny koniec pliku */
    - GG_ERROR_DCC7_NET, /**< Błąd wysyłania/odbierania */
    - GG_ERROR_DCC7_REFUSED, /**< Połączenie odrzucone */
    - GG_ERROR_DCC7_RELAY, /**< Problem z serwerem pośredniczącym */
    -};
    -
    -/**
    - * Pole zapytania lub odpowiedzi katalogu publicznego.
    - */
    -struct gg_pubdir50_entry {
    - int num; /**< Numer wyniku */
    - char *field; /**< Nazwa pola */
    - char *value; /**< Wartość pola */
    -} /* GG_DEPRECATED */;
    -
    -/**
    - * Zapytanie lub odpowiedź katalogu publicznego.
    - *
    - * Patrz \c gg_pubdir50_t.
    - */
    -struct gg_pubdir50_s {
    - int count; /**< Liczba wyników odpowiedzi */
    - uin_t next; /**< Numer początkowy następnego zapytania */
    - int type; /**< Rodzaj zapytania */
    - uint32_t seq; /**< Numer sekwencyjny */
    - struct gg_pubdir50_entry *entries; /**< Pola zapytania lub odpowiedzi */
    - int entries_count; /**< Liczba pól */
    -} /* GG_DEPRECATED */;
    -
    -/**
    - * Zapytanie lub odpowiedź katalogu publicznego.
    - *
    - * Do pól nie należy się odwoływać bezpośrednio -- wszystkie niezbędne
    - * informacje są dostępne za pomocą funkcji \c gg_pubdir50_*
    - */
    -typedef struct gg_pubdir50_s *gg_pubdir50_t;
    -
    -/**
    - * Opis zdarzeń \c GG_EVENT_MSG i \c GG_EVENT_MULTILOGON_MSG.
    - */
    -struct gg_event_msg {
    - uin_t sender; /**< Numer nadawcy/odbiorcy */
    - int msgclass; /**< Klasa wiadomości */
    -#ifndef _WIN32
    - time_t time; /**< Czas nadania */
    -#else
    - uint32_t time; /**< Czas nadania */
    -#endif
    - unsigned char *message; /**< Treść wiadomości */
    -
    - int recipients_count; /**< Liczba odbiorców konferencji */
    - uin_t *recipients; /**< Odbiorcy konferencji */
    -
    - int formats_length; /**< Długość informacji o formatowaniu tekstu */
    - void *formats; /**< Informacje o formatowaniu tekstu */
    - uint32_t seq; /**< Numer sekwencyjny wiadomości */
    -
    - char *xhtml_message; /**< Treść wiadomości w formacie XHTML */
    -
    - uint64_t chat_id; /**< Identyfikator konferencji lub 0, jeżeli jest to zwykła wiadomość (11.0) */
    - uint64_t flags; /**< Flagi wiadomości (11.0) */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_NOTIFY_DESCR.
    - */
    -struct gg_event_notify_descr {
    - struct gg_notify_reply *notify; /**< Informacje o liście kontaktów */
    - char *descr; /**< Opis status */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_STATUS.
    - */
    -struct gg_event_status {
    - uin_t uin; /**< Numer Gadu-Gadu */
    - uint32_t status; /**< Nowy status */
    - char *descr; /**< Opis */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_STATUS60.
    - */
    -struct gg_event_status60 {
    - uin_t uin; /**< Numer Gadu-Gadu */
    - int status; /**< Nowy status */
    - uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
    - uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
    - int version; /**< Wersja protokołu */
    - int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    - char *descr; /**< Opis statusu */
    -#ifndef _WIN32
    - time_t time; /**< Czas powrotu */
    -#else
    - uint32_t time; /**< Czas powrotu */
    -#endif
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_NOTIFY_REPLY60.
    - */
    -struct gg_event_notify60 {
    - uin_t uin; /**< Numer Gadu-Gadu. W ostatnim elemencie jest równy 0, a pozostałe pola są niezainicjowane. */
    - int status; /**< Nowy status */
    - uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
    - uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
    - int version; /**< Wersja protokołu */
    - int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    - char *descr; /**< Opis statusu */
    -#ifndef _WIN32
    - time_t time; /**< Czas powrotu */
    -#else
    - uint32_t time; /**< Czas powrotu */
    -#endif
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_ACK.
    - */
    -struct gg_event_ack {
    - uin_t recipient; /**< Numer odbiorcy */
    - int status; /**< Status doręczenia */
    - int seq; /**< Numer sekwencyjny wiadomości */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_ACK110.
    - */
    -struct gg_event_ack110 {
    - uint8_t msg_type; /**< Rodzaj wiadomości (0x01 - zwykła, 0x02 - konferencja) */
    - uint32_t seq; /**< Numer sekwencyjny */
    - uint32_t time; /**< Czas zdarzenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_USERLIST.
    - */
    -struct gg_event_userlist {
    - char type; /**< Rodzaj odpowiedzi */
    - char *reply; /**< Treść odpowiedzi */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC_VOICE_DATA.
    - */
    -struct gg_event_dcc_voice_data {
    - uint8_t *data; /**< Dane dźwiękowe */
    - int length; /**< Rozmiar danych dźwiękowych */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_IMAGE_REQUEST.
    - */
    -struct gg_event_image_request {
    - uin_t sender; /**< Nadawca żądania */
    - uint32_t size; /**< Rozmiar obrazka */
    - uint32_t crc32; /**< Suma kontrolna CRC32 */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_IMAGE_REPLY.
    - */
    -struct gg_event_image_reply {
    - uin_t sender; /**< Nadawca obrazka */
    - uint32_t size; /**< Rozmiar obrazka */
    - uint32_t crc32; /**< Suma kontrolna CRC32 */
    - char *filename; /**< Nazwa pliku */
    - char *image; /**< Bufor z obrazkiem */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_XML_EVENT.
    - */
    -struct gg_event_xml_event {
    - char *data; /**< Bufor z komunikatem */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_JSON_EVENT.
    - */
    -struct gg_event_json_event {
    - char *data; /**< Bufor z komunikatem */
    - char *type; /**< Bufor z typem komunikatu */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC7_CONNECTED.
    - */
    -struct gg_event_dcc7_connected {
    - struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC7_PENDING.
    - */
    -struct gg_event_dcc7_pending {
    - struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC7_REJECT.
    - */
    -struct gg_event_dcc7_reject {
    - struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    - int reason; /**< powód odrzucenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC7_ACCEPT.
    - */
    -struct gg_event_dcc7_accept {
    - struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    - int type; /**< Sposób połączenia (P2P, przez serwer) */
    - uint32_t remote_ip; /**< Adres zdalnego klienta */
    - uint16_t remote_port; /**< Port zdalnego klienta */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_DCC7_DONE.
    - */
    -struct gg_event_dcc7_done {
    - struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_TYPING_NOTIFICATION.
    - */
    -struct gg_event_typing_notification {
    - uin_t uin; /**< Numer rozmówcy */
    - int length; /**< Długość tekstu */
    -};
    -
    -/**
    - * Atrybut użytkownika.
    - */
    -struct gg_event_user_data_attr {
    - int type; /**< Typ atrybutu */
    - char *key; /**< Klucz */
    - char *value; /**< Wartość */
    -};
    -
    -/**
    - * Struktura opisujÄ…ca kontakt w zdarzeniu GG_EVENT_USER_DATA.
    - */
    -struct gg_event_user_data_user {
    - uin_t uin; /**< Numer kontaktu */
    - size_t attr_count; /**< Liczba atrybutów */
    - struct gg_event_user_data_attr *attrs; /**< Lista atrybutów */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_USER_DATA.
    - */
    -struct gg_event_user_data {
    - int type; /**< Rodzaj informacji o kontaktach */
    - size_t user_count; /**< Liczba kontaktów */
    - struct gg_event_user_data_user *users; /**< Lista kontaktów */
    -};
    -
    -/**
    - * Struktura opisujÄ…ca sesjÄ™ multilogowania.
    - */
    -struct gg_multilogon_session {
    - gg_multilogon_id_t id; /**< Identyfikator sesji */
    - char *name; /**< Nazwa sesji (podana w \c gg_login_params.client_version) */
    - uint32_t remote_addr; /**< Adres sesji */
    - int status_flags; /**< Flagi statusu sesji */
    - int protocol_features; /**< Opcje protokolu sesji */
    -#ifndef _WIN32
    - time_t logon_time; /**< Czas zalogowania */
    -#else
    - uint32_t logon_time; /**< Czas zalogowania */
    -#endif
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_MULTILOGON_INFO.
    - */
    -struct gg_event_multilogon_info {
    - int count; /**< Liczba sesji */
    - struct gg_multilogon_session *sessions; /** Lista sesji */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_USERLIST100_VERSION.
    - */
    -struct gg_event_userlist100_version {
    - uint32_t version; /**< Numer wersji listy kontaktów na serwerze */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_USERLIST100_REPLY.
    - */
    -struct gg_event_userlist100_reply {
    - char type; /**< Rodzaj odpowiedzi */
    - uint32_t version; /**< Aktualna wersja listy kontaktów na serwerze */
    - char format_type; /**< Typ formatu listy kontaktów (żądany w \c gg_userlist100_request.format_type) */
    - char *reply; /**< Treść listy kontaktów w przesyłanej wersji i formacie */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_IMTOKEN.
    - */
    -struct gg_event_imtoken {
    - char *imtoken; /**< Wartość IMTOKEN */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_PONG110.
    - */
    -struct gg_event_pong110 {
    -#ifndef _WIN32
    - time_t time; /**< Aktualny czas na serwerze */
    -#else
    - uint32_t time; /**< Aktualny czas na serwerze */
    -#endif
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_CHAT_INFO.
    - */
    -struct gg_event_chat_info {
    - uint64_t id; /**< Identyfikator konferencji */
    - uint32_t version; /**< Wersja informacji o konferencji */
    - uint32_t participants_count; /**< Ilość uczestników */
    - uin_t *participants; /**< Lista uczestników */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_CHAT_INFO_UPDATE.
    - */
    -struct gg_event_chat_info_update {
    - uint64_t id; /**< Identyfikator konferencji */
    - uint32_t type; /**< Typ aktualizacji (\c GG_CHAT_INFO_UPDATE_*) */
    - uin_t participant; /**< Uczestnik, którego dotyczy aktualizacja */
    - uin_t inviter; /**< Uczestnik inicjujÄ…cy aktualizacjÄ™ (zapraszajÄ…cy) */
    - uint32_t version; /**< Wersja informacji o konferencji */
    - uint32_t time; /**< Czas zdarzenia */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_CHAT_CREATED.
    - */
    -struct gg_event_chat_created {
    - uint64_t id; /**< Identyfikator konferencji */
    - uint32_t seq; /**< Numer sekwencyjny */
    -};
    -
    -/**
    - * Opis zdarzenia \c GG_EVENT_CHAT_INVITE_ACK.
    - */
    -struct gg_event_chat_invite_ack {
    - uint64_t id; /**< Identyfikator konferencji */
    - uint32_t seq; /**< Numer sekwencyjny */
    -};
    -
    -/**
    - * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(),
    - * \c gg_dcc_watch_fd() i \c gg_dcc7_watch_fd().
    - *
    - * \ingroup events
    - */
    -union gg_event_union {
    - enum gg_failure_t failure; /**< Błąd połączenia (\c GG_EVENT_CONN_FAILED) */
    - struct gg_notify_reply *notify; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY) */
    - struct gg_event_notify_descr notify_descr; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY_DESCR) */
    - struct gg_event_status status; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS) */
    - struct gg_event_status60 status60; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS60) */
    - struct gg_event_notify60 *notify60; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY60) */
    - struct gg_event_msg msg; /**< Otrzymano wiadomość (\c GG_EVENT_MSG) */
    - struct gg_event_ack ack; /**< Potwierdzenie wiadomości (\c GG_EVENT_ACK) */
    - struct gg_event_ack110 ack110; /**< Potwierdzenie wysłania wiadomości (11.0) (\c GG_EVENT_ACK110) */
    - struct gg_event_image_request image_request; /**< Żądanie wysłania obrazka (\c GG_EVENT_IMAGE_REQUEST) */
    - struct gg_event_image_reply image_reply; /**< Odpowiedź z obrazkiem (\c GG_EVENT_IMAGE_REPLY) */
    - struct gg_event_userlist userlist; /**< Odpowiedź listy kontaktów (\c GG_EVENT_USERLIST) */
    - gg_pubdir50_t pubdir50; /**< Odpowiedź katalogu publicznego (\c GG_EVENT_PUBDIR50_*) */
    - struct gg_event_xml_event xml_event; /**< Zdarzenie systemowe (\c GG_EVENT_XML_EVENT) */
    - struct gg_event_json_event json_event; /**< Zdarzenie systemowe (\c GG_EVENT_JSON_EVENT) */
    - struct gg_dcc *dcc_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC_NEW) */
    - enum gg_error_t dcc_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC_ERROR) */
    - struct gg_event_dcc_voice_data dcc_voice_data; /**< Dane połączenia głosowego (\c GG_EVENT_DCC_VOICE_DATA) */
    - struct gg_dcc7 *dcc7_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC7_NEW) */
    - enum gg_error_t dcc7_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC7_ERROR) */
    - struct gg_event_dcc7_connected dcc7_connected; /**< Informacja o zestawieniu połączenia bezpośredniego (\c GG_EVENT_DCC7_CONNECTED) */
    - struct gg_event_dcc7_pending dcc7_pending; /**< Trwa próba połączenia bezpośredniego (\c GG_EVENT_DCC7_PENDING) */
    - struct gg_event_dcc7_reject dcc7_reject; /**< Odrzucono połączenia bezpośredniego (\c GG_EVENT_DCC7_REJECT) */
    - struct gg_event_dcc7_accept dcc7_accept; /**< Zaakceptowano połączenie bezpośrednie (\c GG_EVENT_DCC7_ACCEPT) */
    - struct gg_event_dcc7_done dcc7_done; /**< Zakończono połączenie bezpośrednie (\c GG_EVENT_DCC7_DONE) */
    - struct gg_event_typing_notification typing_notification; /**< Powiadomienie o pisaniu */
    - struct gg_event_user_data user_data; /**< Informacje o kontaktach */
    - struct gg_event_msg multilogon_msg; /**< Inna sesja wysłała wiadomość (\c GG_EVENT_MULTILOGON_MSG) */
    - struct gg_event_multilogon_info multilogon_info; /**< Informacja o innych sesjach multilogowania (\c GG_EVENT_MULTILOGON_INFO) */
    - struct gg_event_userlist100_version userlist100_version; /**< Informacja o numerze wersji listy kontaktów na serwerze (\c GG_EVENT_USERLIST100_VERSION) */
    - struct gg_event_userlist100_reply userlist100_reply; /**< Odpowiedź listy kontaktów (10.0) (\c GG_EVENT_USERLIST100_REPLY) */
    - struct gg_event_imtoken imtoken; /**< CiÄ…g IMTOKEN (11.0) (\c GG_EVENT_IMTOKEN) */
    - struct gg_event_pong110 pong110; /**< Utrzymanie połączenia (11.0) (\c GG_EVENT_PONG110) */
    - struct gg_event_chat_info chat_info; /**< Informacje o konferencji (11.0) (\c GG_EVENT_CHAT_INFO) */
    - struct gg_event_chat_info_update chat_info_update; /**< Aktualizacja informacji o konferencji (11.0) (\c GG_EVENT_CHAT_INFO_UPDATE) */
    - struct gg_event_chat_created chat_created; /**< Potwierdzenie utworzenia konferencji (11.0) (\c GG_EVENT_CHAT_CREATED) */
    - struct gg_event_chat_invite_ack chat_invite_ack; /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) (\c GG_EVENT_CHAT_INVITE_ACK) */
    -};
    -
    -/**
    - * Opis zdarzenia.
    - *
    - * Zwracany przez funkcje \c gg_watch_fd(), \c gg_dcc_watch_fd()
    - * i \c gg_dcc7_watch_fd(). Po przeanalizowaniu należy zwolnić
    - * za pomocÄ… \c gg_event_free().
    - *
    - * \ingroup events
    - */
    -struct gg_event {
    - int type; /**< Rodzaj zdarzenia */
    - union gg_event_union event; /**< Informacja o zdarzeniu */
    -};
    -
    -struct gg_event *gg_watch_fd(struct gg_session *sess);
    -void gg_event_free(struct gg_event *e);
    -
    -int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count);
    -int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
    -int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type);
    -int gg_add_notify(struct gg_session *sess, uin_t uin);
    -int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type);
    -int gg_remove_notify(struct gg_session *sess, uin_t uin);
    -
    -struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header);
    -int gg_http_watch_fd(struct gg_http *h);
    -void gg_http_stop(struct gg_http *h);
    -void gg_http_free(struct gg_http *h);
    -
    -uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req);
    -gg_pubdir50_t gg_pubdir50_new(int type);
    -int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value);
    -int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq);
    -const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field);
    -int gg_pubdir50_type(gg_pubdir50_t res);
    -int gg_pubdir50_count(gg_pubdir50_t res);
    -uin_t gg_pubdir50_next(gg_pubdir50_t res);
    -uint32_t gg_pubdir50_seq(gg_pubdir50_t res);
    -void gg_pubdir50_free(gg_pubdir50_t res);
    -
    -#ifndef DOXYGEN
    -
    -#define GG_PUBDIR50_UIN "FmNumber"
    -#define GG_PUBDIR50_STATUS "FmStatus"
    -#define GG_PUBDIR50_FIRSTNAME "firstname"
    -#define GG_PUBDIR50_LASTNAME "lastname"
    -#define GG_PUBDIR50_NICKNAME "nickname"
    -#define GG_PUBDIR50_BIRTHYEAR "birthyear"
    -#define GG_PUBDIR50_CITY "city"
    -#define GG_PUBDIR50_GENDER "gender"
    -#define GG_PUBDIR50_GENDER_FEMALE "1"
    -#define GG_PUBDIR50_GENDER_MALE "2"
    -#define GG_PUBDIR50_GENDER_SET_FEMALE "2"
    -#define GG_PUBDIR50_GENDER_SET_MALE "1"
    -#define GG_PUBDIR50_ACTIVE "ActiveOnly"
    -#define GG_PUBDIR50_ACTIVE_TRUE "1"
    -#define GG_PUBDIR50_START "fmstart"
    -#define GG_PUBDIR50_FAMILYNAME "familyname"
    -#define GG_PUBDIR50_FAMILYCITY "familycity"
    -
    -#else
    -
    -/**
    - * \ingroup pubdir50
    - *
    - * Rodzaj pola zapytania.
    - */
    -enum {
    - GG_PUBDIR50_UIN, /**< Numer Gadu-Gadu */
    - GG_PUBDIR50_STATUS, /**< Status (tylko wynik wyszukiwania) */
    - GG_PUBDIR50_FIRSTNAME, /**< ImiÄ™ */
    - GG_PUBDIR50_LASTNAME, /**< Nazwisko */
    - GG_PUBDIR50_NICKNAME, /**< Pseudonim */
    - GG_PUBDIR50_BIRTHYEAR, /**< Rok urodzenia lub przedział lat oddzielony spacją */
    - GG_PUBDIR50_CITY, /**< Miejscowość */
    - GG_PUBDIR50_GENDER, /**< Płeć */
    - GG_PUBDIR50_ACTIVE, /**< Osoba dostępna (tylko wyszukiwanie) */
    - GG_PUBDIR50_START, /**< Numer poczÄ…tkowy wyszukiwania (tylko wyszukiwanie) */
    - GG_PUBDIR50_FAMILYNAME, /**< Nazwisko rodowe (tylko wysyłanie informacji o sobie) */
    - GG_PUBDIR50_FAMILYCITY, /**< Miejscowość pochodzenia (tylko wysyłanie informacji o sobie) */
    -};
    -
    -/**
    - * \ingroup pubdir50
    - *
    - * Wartość pola GG_PUBDIR50_GENDER przy wyszukiwaniu. Brak pola oznacza dowolną płeć.
    - */
    -enum {
    - GG_PUBDIR50_GENDER_FEMALE, /**< Kobieta */
    - GG_PUBDIR50_GENDER_MALE, /**< Mężczyzna */
    -};
    -
    -/**
    - * \ingroup pubdir50
    - *
    - * Wartość pola GG_PUBDIR50_GENDER przy wysyłaniu informacji o sobie.
    - */
    -enum {
    - GG_PUBDIR50_GENDER_SET_FEMALE, /**< Kobieta */
    - GG_PUBDIR50_GENDER_SET_MALE, /**< Mężczyzna */
    -};
    -
    -/**
    - * \ingroup pubdir50
    - *
    - * Wartość pola GG_PUBDIR50_ACTIVE.
    - */
    -enum {
    - GG_PUBDIR50_ACTIVE_TRUE, /**< Wyszukaj tylko osoby dostępne */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -/**
    - * Powód błędu operacji na katalogu publicznym.
    - *
    - * \ingroup http
    - */
    -typedef enum {
    - GG_PUBDIR_ERROR_NONE = 0, /**< Brak błędu */
    - GG_PUBDIR_ERROR_OTHER, /**< Nieznany błąd */
    - GG_PUBDIR_ERROR_TOKEN, /**< Błędny token */
    - GG_PUBDIR_ERROR_OLD_PASSWORD, /**< Niepoprawne stare hasło */
    - GG_PUBDIR_ERROR_NEW_PASSWORD, /**< Niepoprawne nowe hasło */
    -} gg_pubdir_error_t;
    -
    -/**
    - * Wynik operacji na katalogu publicznym.
    - *
    - * \ingroup http
    - */
    -struct gg_pubdir {
    - int success; /**< Flaga powodzenia operacji */
    - uin_t uin; /**< Otrzymany numer lub 0 w przypadku błędu */
    - gg_pubdir_error_t error; /**< Powód błędu */
    -};
    -
    -int gg_pubdir_watch_fd(struct gg_http *f);
    -void gg_pubdir_free(struct gg_http *f);
    -
    -/**
    - * Token autoryzacji niektórych operacji HTTP.
    - *
    - * \ingroup token
    - */
    -struct gg_token {
    - int width; /**< Szerokość obrazka */
    - int height; /**< Wysokość obrazka */
    - int length; /**< Liczba znaków w tokenie */
    - char *tokenid; /**< Identyfikator tokenu */
    -};
    -
    -struct gg_http *gg_token(int async);
    -int gg_token_watch_fd(struct gg_http *h);
    -void gg_token_free(struct gg_http *h);
    -
    -struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async);
    -#ifndef DOXYGEN
    -#define gg_register_watch_fd gg_pubdir_watch_fd
    -#define gg_register_free gg_pubdir_free
    -#endif
    -
    -struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async);
    -#ifndef DOXYGEN
    -#define gg_unregister_watch_fd gg_pubdir_watch_fd
    -#define gg_unregister_free gg_pubdir_free
    -#endif
    -
    -struct gg_http *gg_remind_passwd3(uin_t uin, const char *email, const char *tokenid, const char *tokenval, int async);
    -#ifndef DOXYGEN
    -#define gg_remind_passwd_watch_fd gg_pubdir_watch_fd
    -#define gg_remind_passwd_free gg_pubdir_free
    -#endif
    -
    -struct gg_http *gg_change_passwd4(uin_t uin, const char *email, const char *passwd, const char *newpasswd, const char *tokenid, const char *tokenval, int async);
    -#ifndef DOXYGEN
    -#define gg_change_passwd_watch_fd gg_pubdir_watch_fd
    -#define gg_change_passwd_free gg_pubdir_free
    -#endif
    -
    -extern int gg_dcc_port;
    -extern unsigned long gg_dcc_ip;
    -
    -int gg_dcc_request(struct gg_session *sess, uin_t uin);
    -
    -struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    -struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    -struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    -void gg_dcc_set_type(struct gg_dcc *d, int type);
    -int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename);
    -int gg_dcc_fill_file_info2(struct gg_dcc *d, const char *filename, const char *local_filename);
    -int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length);
    -
    -#define GG_DCC_VOICE_FRAME_LENGTH 195 /**< Rozmiar pakietu głosowego przed wersją Gadu-Gadu 5.0.5 */
    -#define GG_DCC_VOICE_FRAME_LENGTH_505 326 /**< Rozmiar pakietu głosowego od wersji Gadu-Gadu 5.0.5 */
    -
    -struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port);
    -#ifndef DOXYGEN
    -#define gg_dcc_socket_free gg_dcc_free
    -#define gg_dcc_socket_watch_fd gg_dcc_watch_fd
    -#endif
    -
    -struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d);
    -
    -void gg_dcc_free(struct gg_dcc *c);
    -
    -struct gg_event *gg_dcc7_watch_fd(struct gg_dcc7 *d);
    -struct gg_dcc7 *gg_dcc7_send_file(struct gg_session *sess, uin_t rcpt, const char *filename, const char *filename1250, const char *hash);
    -struct gg_dcc7 *gg_dcc7_send_file_fd(struct gg_session *sess, uin_t rcpt, int fd, size_t size, const char *filename1250, const char *hash);
    -int gg_dcc7_accept(struct gg_dcc7 *dcc, unsigned int offset);
    -int gg_dcc7_reject(struct gg_dcc7 *dcc, int reason);
    -void gg_dcc7_free(struct gg_dcc7 *d);
    -
    -extern int gg_debug_level;
    -
    -extern void (*gg_debug_handler)(int level, const char *format, va_list ap);
    -extern void (*gg_debug_handler_session)(struct gg_session *sess, int level, const char *format, va_list ap);
    -
    -extern FILE *gg_debug_file;
    -
    -/**
    - * \ingroup debug
    - * @{
    - */
    -#define GG_DEBUG_NET 1 /**< Rejestracja zdarzeń związanych z siecią */
    -#define GG_DEBUG_TRAFFIC 2 /**< Rejestracja ruchu sieciowego */
    -#define GG_DEBUG_DUMP 4 /**< Rejestracja zawartości pakietów */
    -#define GG_DEBUG_FUNCTION 8 /**< Rejestracja wywołań funkcji */
    -#define GG_DEBUG_MISC 16 /**< Rejestracja różnych informacji */
    -#define GG_DEBUG_VERBOSE 32 /**< Rejestracja informacji szczegółowych */
    -#define GG_DEBUG_WARNING 64 /**< Rejestracja ostrzeżeń */
    -#define GG_DEBUG_ERROR 128 /**< Rejestracja błędów krytycznych */
    -/** @} */
    -
    -const char *gg_debug_state(enum gg_state_t state);
    -const char *gg_debug_event(enum gg_event_t event);
    -
    -#ifdef GG_DEBUG_DISABLE
    -#define gg_debug(...) do { } while (0)
    -#define gg_debug_session(...) do { } while (0)
    -#else
    -void gg_debug(int level, const char *format, ...) GG_GNUC_PRINTF(2, 3);
    -void gg_debug_session(struct gg_session *sess, int level, const char *format, ...) GG_GNUC_PRINTF(3, 4);
    -#endif
    -
    -const char *gg_libgadu_version(void);
    -
    -/**
    - * Lista funkcji biblioteki, które zależą od zewnętrznych bibliotek.
    - *
    - * \ingroup version
    - */
    -typedef enum {
    - GG_LIBGADU_FEATURE_SSL, /**< Biblioteka obsługuje połączenia szyfrowane */
    - GG_LIBGADU_FEATURE_PTHREAD, /**< Biblioteka obsługuje rozwiązywanie nazw za pomocą wątków */
    - GG_LIBGADU_FEATURE_USERLIST100, /**< Biblioteka obsługuje listę kontaktów zgodną z Gadu-Gadu 10 */
    -} gg_libgadu_feature_t;
    -
    -int gg_libgadu_check_feature(gg_libgadu_feature_t feature);
    -
    -extern int gg_proxy_enabled;
    -extern char *gg_proxy_host;
    -extern int gg_proxy_port;
    -extern char *gg_proxy_username;
    -extern char *gg_proxy_password;
    -extern int gg_proxy_http_only;
    -
    -extern unsigned long gg_local_ip;
    -
    -#define GG_LOGIN_HASH_GG32 0x01 /**< Algorytm Gadu-Gadu */
    -#define GG_LOGIN_HASH_SHA1 0x02 /**< Algorytm SHA1 */
    -
    -#ifndef DOXYGEN
    -
    -#define GG_PUBDIR50_WRITE 0x01
    -#define GG_PUBDIR50_READ 0x02
    -#define GG_PUBDIR50_SEARCH 0x03
    -#define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH
    -#define GG_PUBDIR50_SEARCH_REPLY 0x05
    -
    -#else
    -
    -/**
    - * \ingroup pubdir50
    - *
    - * Rodzaj zapytania lub odpowiedzi katalogu publicznego.
    - */
    -enum {
    - GG_PUBDIR50_WRITE, /**< Wysłanie do serwera informacji o sobie */
    - GG_PUBDIR50_READ, /**< Pobranie z serwera informacji o sobie */
    - GG_PUBDIR50_SEARCH, /**< Wyszukiwanie w katalogu publicznym */
    - GG_PUBDIR50_SEARCH_REPLY, /**< Wynik wyszukiwania w katalogu publicznym */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -/** \cond obsolete */
    -
    -#define gg_free_event gg_event_free
    -#define gg_free_http gg_http_free
    -#define gg_free_pubdir gg_pubdir_free
    -#define gg_free_register gg_pubdir_free
    -#define gg_free_remind_passwd gg_pubdir_free
    -#define gg_free_dcc gg_dcc_free
    -#define gg_free_change_passwd gg_pubdir_free
    -
    -struct gg_search_request {
    - int active;
    - unsigned int start;
    - char *nickname;
    - char *first_name;
    - char *last_name;
    - char *city;
    - int gender;
    - int min_birth;
    - int max_birth;
    - char *email;
    - char *phone;
    - uin_t uin;
    -} /* GG_DEPRECATED */;
    -
    -struct gg_search {
    - int count;
    - struct gg_search_result *results;
    -} GG_DEPRECATED;
    -
    -struct gg_search_result {
    - uin_t uin;
    - char *first_name;
    - char *last_name;
    - char *nickname;
    - int born;
    - int gender;
    - char *city;
    - int active;
    -} GG_DEPRECATED;
    -
    -#define GG_GENDER_NONE 0
    -#define GG_GENDER_FEMALE 1
    -#define GG_GENDER_MALE 2
    -
    -struct gg_http *gg_search(const struct gg_search_request *r, int async) GG_DEPRECATED;
    -int gg_search_watch_fd(struct gg_http *f) GG_DEPRECATED;
    -void gg_free_search(struct gg_http *f) GG_DEPRECATED;
    -#define gg_search_free gg_free_search
    -
    -const struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active, int start) GG_DEPRECATED;
    -const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start) GG_DEPRECATED;
    -const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start) GG_DEPRECATED;
    -const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start) GG_DEPRECATED;
    -void gg_search_request_free(struct gg_search_request *r) GG_DEPRECATED;
    -
    -struct gg_http *gg_register(const char *email, const char *password, int async) GG_DEPRECATED;
    -struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async) GG_DEPRECATED;
    -
    -struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async) GG_DEPRECATED;
    -struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async) GG_DEPRECATED;
    -
    -struct gg_http *gg_remind_passwd(uin_t uin, int async) GG_DEPRECATED;
    -struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async) GG_DEPRECATED;
    -
    -struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async) GG_DEPRECATED;
    -struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async) GG_DEPRECATED;
    -struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async) GG_DEPRECATED;
    -
    -struct gg_change_info_request {
    - char *first_name;
    - char *last_name;
    - char *nickname;
    - char *email;
    - int born;
    - int gender;
    - char *city;
    -} /* GG_DEPRECATED */;
    -
    -struct gg_change_info_request *gg_change_info_request_new(const char *first_name, const char *last_name, const char *nickname, const char *email, int born, int gender, const char *city) GG_DEPRECATED;
    -void gg_change_info_request_free(struct gg_change_info_request *r) GG_DEPRECATED;
    -
    -struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async) GG_DEPRECATED;
    -#define gg_change_pubdir_watch_fd gg_pubdir_watch_fd
    -#define gg_change_pubdir_free gg_pubdir_free
    -#define gg_free_change_pubdir gg_pubdir_free
    -
    -struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async) GG_DEPRECATED;
    -int gg_userlist_get_watch_fd(struct gg_http *f) GG_DEPRECATED;
    -void gg_userlist_get_free(struct gg_http *f) GG_DEPRECATED;
    -
    -struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async) GG_DEPRECATED;
    -int gg_userlist_put_watch_fd(struct gg_http *f) GG_DEPRECATED;
    -void gg_userlist_put_free(struct gg_http *f) GG_DEPRECATED;
    -
    -struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async) GG_DEPRECATED;
    -int gg_userlist_remove_watch_fd(struct gg_http *f) GG_DEPRECATED;
    -void gg_userlist_remove_free(struct gg_http *f) GG_DEPRECATED;
    -
    -int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) GG_DEPRECATED;
    -
    -/** \endcond */
    -
    -int gg_file_hash_sha1(int fd, uint8_t *result) GG_DEPRECATED;
    -
    -char *gg_saprintf(const char *format, ...) GG_GNUC_PRINTF(1, 2) GG_DEPRECATED;
    -char *gg_vsaprintf(const char *format, va_list ap) GG_DEPRECATED;
    -
    -#define gg_alloc_sprintf gg_saprintf
    -
    -char *gg_get_line(char **ptr) GG_DEPRECATED;
    -
    -int gg_connect(void *addr, int port, int async) GG_DEPRECATED;
    -struct in_addr *gg_gethostbyname(const char *hostname) GG_DEPRECATED;
    -char *gg_read_line(int sock, char *buf, int length) GG_DEPRECATED;
    -void gg_chomp(char *line) GG_DEPRECATED;
    -char *gg_urlencode(const char *str) GG_DEPRECATED;
    -int gg_http_hash(const char *format, ...) GG_DEPRECATED;
    -void gg_http_free_fields(struct gg_http *h) GG_DEPRECATED;
    -int gg_read(struct gg_session *sess, char *buf, int length) GG_DEPRECATED;
    -int gg_write(struct gg_session *sess, const char *buf, int length) GG_DEPRECATED;
    -void *gg_recv_packet(struct gg_session *sess) GG_DEPRECATED;
    -int gg_send_packet(struct gg_session *sess, int type, ...) GG_DEPRECATED;
    -unsigned int gg_login_hash(const unsigned char *password, unsigned int seed) GG_DEPRECATED;
    -void gg_login_hash_sha1(const char *password, uint32_t seed, uint8_t *result) GG_DEPRECATED;
    -uint32_t gg_fix32(uint32_t x);
    -uint16_t gg_fix16(uint16_t x);
    -#define fix16 gg_fix16
    -#define fix32 gg_fix32
    -char *gg_proxy_auth(void) GG_DEPRECATED;
    -char *gg_base64_encode(const char *buf) GG_DEPRECATED;
    -char *gg_base64_decode(const char *buf) GG_DEPRECATED;
    -int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq) GG_DEPRECATED;
    -
    -/**
    - * Kolejka odbieranych obrazków.
    - */
    -struct gg_image_queue {
    - uin_t sender; /**< Nadawca obrazka */
    - uint32_t size; /**< Rozmiar obrazka */
    - uint32_t crc32; /**< Suma kontrolna CRC32 */
    - char *filename; /**< Nazwa pliku */
    - char *image; /**< Bufor z odebranymi danymi */
    - uint32_t done; /**< Rozmiar odebranych danych */
    -
    - struct gg_image_queue *next; /**< Kolejny element listy */
    -
    - uint32_t packet_type; /**< \brief Rodzaj odbieranych pakietów. W niektórych przypadkach (przy multilogowaniu) serwer wysyła nam dwie kopie obrazka jako dwa różne typy pakietów */
    -} GG_DEPRECATED;
    -
    -int gg_dcc7_handle_id(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    -int gg_dcc7_handle_new(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    -int gg_dcc7_handle_info(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    -int gg_dcc7_handle_accept(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    -int gg_dcc7_handle_reject(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    -
    -#define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
    -#define GG_APPMSG_PORT 80
    -#define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
    -#define GG_PUBDIR_PORT 80
    -#define GG_REGISTER_HOST "register.gadu-gadu.pl"
    -#define GG_REGISTER_PORT 80
    -#define GG_REMIND_HOST "retr.gadu-gadu.pl"
    -#define GG_REMIND_PORT 80
    -#define GG_RELAY_HOST "relay.gadu-gadu.pl"
    -#define GG_RELAY_PORT 80
    -
    -#define GG_DEFAULT_PORT 8074
    -#define GG_HTTPS_PORT 443
    -#define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
    -
    -#define GG_PROTOCOL_VERSION_100 0x2e
    -#define GG_PROTOCOL_VERSION_110 0x40
    -
    -/* GG_DEPRECATED */
    -#define GG_DEFAULT_CLIENT_VERSION "-"
    -
    -#define GG_DEFAULT_PROTOCOL_VERSION GG_PROTOCOL_VERSION_110
    -#define GG_DEFAULT_TIMEOUT 30
    -#define GG_HAS_AUDIO_MASK 0x40000000
    -#define GG_HAS_AUDIO7_MASK 0x20000000
    -#define GG_ERA_OMNIX_MASK 0x04000000
    -#undef GG_LIBGADU_VERSION
    -
    -#ifndef DOXYGEN
    -
    -#define GG_FEATURE_MSG77 0x0001
    -#define GG_FEATURE_STATUS77 0x0002
    -#define GG_FEATURE_UNKNOWN_4 0x0004
    -#define GG_FEATURE_UNKNOWN_8 0x0008
    -#define GG_FEATURE_DND_FFC 0x0010
    -#define GG_FEATURE_IMAGE_DESCR 0x0020
    -#define GG_FEATURE_UNKNOWN_40 0x0040
    -#define GG_FEATURE_UNKNOWN_80 0x0080
    -#define GG_FEATURE_UNKNOWN_100 0x0100
    -#define GG_FEATURE_USER_DATA 0x0200
    -#define GG_FEATURE_MSG_ACK 0x0400
    -#define GG_FEATURE_UNKNOWN_800 0x0800
    -#define GG_FEATURE_UNKNOWN_1000 0x1000
    -#define GG_FEATURE_TYPING_NOTIFICATION 0x2000
    -#define GG_FEATURE_MULTILOGON 0x4000
    -
    -/* Poniższe makra zostały zachowane dla zgodności API */
    -#define GG_FEATURE_MSG80 0
    -#define GG_FEATURE_STATUS80 0
    -#define GG_FEATURE_STATUS80BETA 0
    -
    -#define GG_FEATURE_ALL (GG_FEATURE_MSG80 | GG_FEATURE_STATUS80 | GG_FEATURE_DND_FFC | GG_FEATURE_IMAGE_DESCR | GG_FEATURE_UNKNOWN_100 | GG_FEATURE_USER_DATA | GG_FEATURE_MSG_ACK | GG_FEATURE_TYPING_NOTIFICATION)
    -
    -#else
    -
    -/**
    - * \ingroup login
    - *
    - * Flagi opcji protokołu.
    - */
    -enum {
    - GG_FEATURE_MSG77, /**< Klient życzy sobie otrzymywać wiadomości zgodnie z protokołem 7.7 */
    - GG_FEATURE_STATUS77, /**< Klient życzy sobie otrzymywać zmiany stanu zgodnie z protokołem 7.7 */
    - GG_FEATURE_DND_FFC, /**< Klient obsługuje statusy "nie przeszkadzać" i "poGGadaj ze mną" */
    - GG_FEATURE_IMAGE_DESCR, /**< Klient obsługuje opisy graficzne oraz flagę \c GG_STATUS80_DESCR_MASK */
    -};
    -
    -
    -#endif
    -
    -#define GG_DEFAULT_DCC_PORT 1550
    -
    -struct gg_header {
    - uint32_t type; /* typ pakietu */
    - uint32_t length; /* długość reszty pakietu */
    -} GG_PACKED;
    -
    -#define GG_WELCOME 0x0001
    -#define GG_NEED_EMAIL 0x0014
    -
    -struct gg_welcome {
    - uint32_t key; /* klucz szyfrowania hasła */
    -} GG_PACKED;
    -
    -#define GG_LOGIN 0x000c
    -
    -struct gg_login {
    - uint32_t uin; /* mój numerek */
    - uint32_t hash; /* hash hasła */
    - uint32_t status; /* status na dzień dobry */
    - uint32_t version; /* moja wersja klienta */
    - uint32_t local_ip; /* mój adres ip */
    - uint16_t local_port; /* port, na którym słucham */
    -} GG_PACKED;
    -
    -#define GG_LOGIN_EXT 0x0013
    -
    -struct gg_login_ext {
    - uint32_t uin; /* mój numerek */
    - uint32_t hash; /* hash hasła */
    - uint32_t status; /* status na dzień dobry */
    - uint32_t version; /* moja wersja klienta */
    - uint32_t local_ip; /* mój adres ip */
    - uint16_t local_port; /* port, na którym słucham */
    - uint32_t external_ip; /* zewnętrzny adres ip */
    - uint16_t external_port; /* zewnętrzny port */
    -} GG_PACKED;
    -
    -#define GG_LOGIN60 0x0015
    -
    -struct gg_login60 {
    - uint32_t uin; /* mój numerek */
    - uint32_t hash; /* hash hasła */
    - uint32_t status; /* status na dzień dobry */
    - uint32_t version; /* moja wersja klienta */
    - uint8_t dunno1; /* 0x00 */
    - uint32_t local_ip; /* mój adres ip */
    - uint16_t local_port; /* port, na którym słucham */
    - uint32_t external_ip; /* zewnętrzny adres ip */
    - uint16_t external_port; /* zewnętrzny port */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno2; /* 0xbe */
    -} GG_PACKED;
    -
    -#define GG_LOGIN70 0x0019
    -
    -struct gg_login70 {
    - uint32_t uin; /* mój numerek */
    - uint8_t hash_type; /* rodzaj hashowania hasła */
    - uint8_t hash[64]; /* hash hasła dopełniony zerami */
    - uint32_t status; /* status na dzień dobry */
    - uint32_t version; /* moja wersja klienta */
    - uint8_t dunno1; /* 0x00 */
    - uint32_t local_ip; /* mój adres ip */
    - uint16_t local_port; /* port, na którym słucham */
    - uint32_t external_ip; /* zewnętrzny adres ip (???) */
    - uint16_t external_port; /* zewnętrzny port (???) */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno2; /* 0xbe */
    -} GG_PACKED;
    -
    -#define GG_LOGIN_OK 0x0003
    -
    -#define GG_LOGIN_FAILED 0x0009
    -
    -#define GG_PUBDIR50_REQUEST 0x0014
    -
    -struct gg_pubdir50_request {
    - uint8_t type; /* GG_PUBDIR50_* */
    - uint32_t seq; /* czas wysłania zapytania */
    -} GG_PACKED;
    -
    -#define GG_PUBDIR50_REPLY 0x000e
    -
    -struct gg_pubdir50_reply {
    - uint8_t type; /* GG_PUBDIR50_* */
    - uint32_t seq; /* czas wysłania zapytania */
    -} GG_PACKED;
    -
    -#define GG_NEW_STATUS 0x0002
    -
    -#ifndef DOXYGEN
    -
    -#define GG_STATUS_NOT_AVAIL 0x0001
    -#define GG_STATUS_NOT_AVAIL_DESCR 0x0015
    -#define GG_STATUS_FFC 0x0017
    -#define GG_STATUS_FFC_DESCR 0x0018
    -#define GG_STATUS_AVAIL 0x0002
    -#define GG_STATUS_AVAIL_DESCR 0x0004
    -#define GG_STATUS_BUSY 0x0003
    -#define GG_STATUS_BUSY_DESCR 0x0005
    -#define GG_STATUS_DND 0x0021
    -#define GG_STATUS_DND_DESCR 0x0022
    -#define GG_STATUS_INVISIBLE 0x0014
    -#define GG_STATUS_INVISIBLE_DESCR 0x0016
    -#define GG_STATUS_BLOCKED 0x0006
    -
    -#define GG_STATUS_GGPLUS 0x0020
    -#define GG_STATUS_NOT_SET 0x0023
    -#define GG_STATUS_UNKNOWN 0x0025
    -
    -#define GG_STATUS_IMAGE_MASK 0x0100
    -#define GG_STATUS_DESCR_MASK 0x4000
    -#define GG_STATUS_FRIENDS_MASK 0x8000
    -
    -#define GG_STATUS_FLAG_UNKNOWN 0x00000001
    -#define GG_STATUS_FLAG_VIDEO 0x00000002
    -#define GG_STATUS_FLAG_INHERIT 0x00000020
    -#define GG_STATUS_FLAG_MOBILE 0x00100000
    -#define GG_STATUS_FLAG_SPAM 0x00800000
    -
    -#else
    -
    -/**
    - * Rodzaje statusów użytkownika.
    - *
    - * \ingroup status
    - */
    -enum {
    - GG_STATUS_NOT_AVAIL, /**< Niedostępny */
    - GG_STATUS_NOT_AVAIL_DESCR, /**< Niedostępny z opisem */
    - GG_STATUS_FFC, /**< PoGGadaj ze mnÄ… */
    - GG_STATUS_FFC_DESCR, /**< PoGGadaj ze mnÄ… z opisem */
    - GG_STATUS_AVAIL, /**< Dostępny */
    - GG_STATUS_AVAIL_DESCR, /**< Dostępny z opisem */
    - GG_STATUS_BUSY, /**< Zajęty */
    - GG_STATUS_BUSY_DESCR, /**< Zajęty z opisem */
    - GG_STATUS_DND, /**< Nie przeszkadzać */
    - GG_STATUS_DND_DESCR, /**< Nie przeszakdzać z opisem */
    - GG_STATUS_INVISIBLE, /**< Niewidoczny (tylko własny status) */
    - GG_STATUS_INVISIBLE_DESCR, /**< Niewidoczny z opisem (tylko własny status) */
    - GG_STATUS_BLOCKED, /**< Zablokowany (tylko status innych) */
    - GG_STATUS_GGPLUS, /**< Status "Korzystam z GG Plus" */
    - GG_STATUS_NOT_SET, /**< Status nie ustawiony (przy logowaniu siÄ™ do sieci) */
    - GG_STATUS_IMAGE_MASK, /**< Flaga bitowa oznaczająca opis graficzny (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
    - GG_STATUS_DESCR_MASK, /**< Flaga bitowa oznaczająca status z opisem (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
    - GG_STATUS_FRIENDS_MASK, /**< Flaga bitowa dostępności tylko dla znajomych */
    -};
    -
    -/**
    - * Rodzaje statusów użytkownika. Mapa bitowa.
    - *
    - * \ingroup status
    - */
    -enum {
    - GG_STATUS_FLAG_UNKNOWN, /**< Przeznaczenie nieznane, ale występuje zawsze */
    - GG_STATUS_FLAG_VIDEO, /**< Klient obsługuje wideorozmowy */
    - GG_STATUS_FLAG_INHERIT, /**< Synchronizacja statusu do innych klientów (przy logowaniu się do sieci) */
    - GG_STATUS_FLAG_MOBILE, /**< Klient mobilny (ikona telefonu komórkowego) */
    - GG_STATUS_FLAG_SPAM, /**< Klient chce otrzymywać linki od nieznajomych */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -/**
    - * \ingroup status
    - *
    - * Flaga bitowa dostepnosci informujaca ze mozemy voipowac
    - */
    -
    -#define GG_STATUS_VOICE_MASK 0x20000 /**< czy ma wlaczone audio (7.7) */
    -
    -/**
    - * \ingroup status
    - *
    - * Maksymalna długośc opisu.
    - */
    -#define GG_STATUS_DESCR_MAXSIZE 255
    -#define GG_STATUS_DESCR_MAXSIZE_PRE_8_0 70
    -
    -#define GG_STATUS_MASK 0xff
    -
    -/* GG_S_F() tryb tylko dla znajomych */
    -#define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)
    -
    -/* GG_S() stan bez uwzględnienia dodatkowych flag */
    -#define GG_S(x) ((x) & GG_STATUS_MASK)
    -
    -
    -/* GG_S_FF() chętny do rozmowy */
    -#define GG_S_FF(x) (GG_S(x) == GG_STATUS_FFC || GG_S(x) == GG_STATUS_FFC_DESCR)
    -
    -/* GG_S_AV() dostępny */
    -#define GG_S_AV(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR)
    -
    -/* GG_S_AW() zaraz wracam */
    -#define GG_S_AW(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR)
    -
    -/* GG_S_DD() nie przeszkadzać */
    -#define GG_S_DD(x) (GG_S(x) == GG_STATUS_DND || GG_S(x) == GG_STATUS_DND_DESCR)
    -
    -/* GG_S_NA() niedostępny */
    -#define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR)
    -
    -/* GG_S_I() niewidoczny */
    -#define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
    -
    -
    -/* GG_S_A() dostępny lub chętny do rozmowy */
    -#define GG_S_A(x) (GG_S_FF(x) || GG_S_AV(x))
    -
    -/* GG_S_B() zajęty lub nie przeszkadzać */
    -#define GG_S_B(x) (GG_S_AW(x) || GG_S_DD(x))
    -
    -
    -/* GG_S_D() stan opisowy */
    -#define GG_S_D(x) (GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR || \
    - GG_S(x) == GG_STATUS_FFC_DESCR || \
    - GG_S(x) == GG_STATUS_AVAIL_DESCR || \
    - GG_S(x) == GG_STATUS_BUSY_DESCR || \
    - GG_S(x) == GG_STATUS_DND_DESCR || \
    - GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
    -
    -/* GG_S_BL() blokowany lub blokujÄ…cy */
    -#define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED)
    -
    -/**
    - * Zmiana statusu (pakiet \c GG_NEW_STATUS i \c GG_NEW_STATUS80BETA)
    - */
    -struct gg_new_status {
    - uint32_t status; /**< Nowy status */
    -} GG_PACKED;
    -
    -#define GG_NOTIFY_FIRST 0x000f
    -#define GG_NOTIFY_LAST 0x0010
    -
    -#define GG_NOTIFY 0x0010
    -
    -struct gg_notify {
    - uint32_t uin; /* numerek danej osoby */
    - uint8_t dunno1; /* rodzaj wpisu w liście */
    -} GG_PACKED;
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USER_OFFLINE 0x01
    -#define GG_USER_NORMAL 0x03
    -#define GG_USER_BLOCKED 0x04
    -
    -#else
    -
    -/**
    - * \ingroup contacts
    - *
    - * Rodzaj kontaktu.
    - */
    -enum {
    - GG_USER_NORMAL, /**< Zwykły kontakt */
    - GG_USER_BLOCKED, /**< Zablokowany */
    - GG_USER_OFFLINE, /**< Niewidoczny dla kontaktu */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -#define GG_LIST_EMPTY 0x0012
    -
    -#define GG_NOTIFY_REPLY 0x000c /* tak, to samo co GG_LOGIN */
    -
    -struct gg_notify_reply {
    - uint32_t uin; /* numerek */
    - uint32_t status; /* status danej osoby */
    - uint32_t remote_ip; /* adres ip delikwenta */
    - uint16_t remote_port; /* port, na którym słucha klient */
    - uint32_t version; /* wersja klienta */
    - uint16_t dunno2; /* znowu port? */
    -} GG_PACKED;
    -
    -#define GG_NOTIFY_REPLY60 0x0011
    -
    -struct gg_notify_reply60 {
    - uint32_t uin; /* numerek plus flagi w MSB */
    - uint8_t status; /* status danej osoby */
    - uint32_t remote_ip; /* adres ip delikwenta */
    - uint16_t remote_port; /* port, na którym słucha klient */
    - uint8_t version; /* wersja klienta */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno1; /* 0x00 */
    -} GG_PACKED;
    -
    -#define GG_STATUS60 0x000f
    -
    -struct gg_status60 {
    - uint32_t uin; /* numerek plus flagi w MSB */
    - uint8_t status; /* status danej osoby */
    - uint32_t remote_ip; /* adres ip delikwenta */
    - uint16_t remote_port; /* port, na którym słucha klient */
    - uint8_t version; /* wersja klienta */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno1; /* 0x00 */
    -} GG_PACKED;
    -
    -#define GG_NOTIFY_REPLY77 0x0018
    -
    -struct gg_notify_reply77 {
    - uint32_t uin; /* numerek plus flagi w MSB */
    - uint8_t status; /* status danej osoby */
    - uint32_t remote_ip; /* adres ip delikwenta */
    - uint16_t remote_port; /* port, na którym słucha klient */
    - uint8_t version; /* wersja klienta */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno1; /* 0x00 */
    - uint32_t dunno2; /* ? */
    -} GG_PACKED;
    -
    -#define GG_STATUS77 0x0017
    -
    -struct gg_status77 {
    - uint32_t uin; /* numerek plus flagi w MSB */
    - uint8_t status; /* status danej osoby */
    - uint32_t remote_ip; /* adres ip delikwenta */
    - uint16_t remote_port; /* port, na którym słucha klient */
    - uint8_t version; /* wersja klienta */
    - uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    - uint8_t dunno1; /* 0x00 */
    - uint32_t dunno2; /* ? */
    -} GG_PACKED;
    -
    -#define GG_ADD_NOTIFY 0x000d
    -#define GG_REMOVE_NOTIFY 0x000e
    -
    -struct gg_add_remove {
    - uint32_t uin; /* numerek */
    - uint8_t dunno1; /* bitmapa */
    -} GG_PACKED;
    -
    -#define GG_STATUS 0x0002
    -
    -struct gg_status {
    - uint32_t uin; /* numerek */
    - uint32_t status; /* nowy stan */
    -} GG_PACKED;
    -
    -#define GG_SEND_MSG 0x000b
    -
    -#ifndef DOXYGEN
    -
    -#define GG_CLASS_QUEUED 0x0001
    -#define GG_CLASS_OFFLINE GG_CLASS_QUEUED
    -#define GG_CLASS_MSG 0x0004
    -#define GG_CLASS_CHAT 0x0008
    -#define GG_CLASS_CTCP 0x0010
    -#define GG_CLASS_ACK 0x0020
    -#define GG_CLASS_EXT GG_CLASS_ACK /**< Dla kompatybilności wstecz */
    -
    -#else
    -
    -/**
    - * Klasy wiadomości. Wartości są maskami bitowymi, które w większości
    - * przypadków można łączyć (połączenie \c GG_CLASS_MSG i \c GG_CLASS_CHAT
    - * nie ma sensu).
    - *
    - * \ingroup messages
    - */
    -enum {
    - GG_CLASS_MSG, /**< Wiadomość ma pojawić się w osobnym oknie */
    - GG_CLASS_CHAT, /**< Wiadomość ma pojawić się w oknie rozmowy */
    - GG_CLASS_CTCP, /**< Wiadomość przeznaczona dla klienta Gadu-Gadu */
    - GG_CLASS_ACK, /**< Klient nie życzy sobie potwierdzenia */
    - GG_CLASS_QUEUED, /**< Wiadomość zakolejkowana na serwerze (tylko przy odbieraniu) */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -/**
    - * Maksymalna długość wiadomości.
    - *
    - * \ingroup messages
    - */
    -#define GG_MSG_MAXSIZE 1989
    -
    -struct gg_send_msg {
    - uint32_t recipient;
    - uint32_t seq;
    - uint32_t msgclass;
    -} GG_PACKED;
    -
    -struct gg_msg_richtext {
    - uint8_t flag;
    - uint16_t length;
    -} GG_PACKED;
    -
    -/**
    - * Struktura opisująca formatowanie tekstu. W zależności od wartości pola
    - * \c font, zaraz za tą strukturą może wystąpić \c gg_msg_richtext_color
    - * lub \c gg_msg_richtext_image.
    - *
    - * \ingroup messages
    - */
    -struct gg_msg_richtext_format {
    - uint16_t position; /**< PoczÄ…tkowy znak formatowania (liczony od 0) */
    - uint8_t font; /**< Atrybuty formatowania */
    -} GG_PACKED;
    -
    -#ifndef DOXYGEN
    -
    -#define GG_FONT_BOLD 0x01
    -#define GG_FONT_ITALIC 0x02
    -#define GG_FONT_UNDERLINE 0x04
    -#define GG_FONT_COLOR 0x08
    -#define GG_FONT_IMAGE 0x80
    -
    -#else
    -
    -/**
    - * Atrybuty formatowania wiadomości.
    - *
    - * \ingroup messages
    - */
    -enum {
    - GG_FONT_BOLD,
    - GG_FONT_ITALIC,
    - GG_FONT_UNDERLINE,
    - GG_FONT_COLOR,
    - GG_FONT_IMAGE
    -};
    -
    -#endif /* DOXYGEN */
    -
    -/**
    - * Struktura opisujÄ…cÄ… kolor tekstu dla atrybutu \c GG_FONT_COLOR.
    - *
    - * \ingroup messages
    - */
    -struct gg_msg_richtext_color {
    - uint8_t red; /**< Składowa czerwona koloru */
    - uint8_t green; /**< Składowa zielona koloru */
    - uint8_t blue; /**< Składowa niebieska koloru */
    -} GG_PACKED;
    -
    -/**
    - * Strukturya opisująca obrazek wstawiony do wiadomości dla atrubutu
    - * \c GG_FONT_IMAGE.
    - *
    - * \ingroup messages
    - */
    -struct gg_msg_richtext_image {
    - uint16_t unknown1; /**< Nieznane pole o wartości 0x0109 */
    - uint32_t size; /**< Rozmiar obrazka */
    - uint32_t crc32; /**< Suma kontrolna CRC32 obrazka */
    -} GG_PACKED;
    -
    -struct gg_msg_recipients {
    - uint8_t flag;
    - uint32_t count;
    -} GG_PACKED;
    -
    -struct gg_msg_image_request {
    - uint8_t flag;
    - uint32_t size;
    - uint32_t crc32;
    -} GG_PACKED;
    -
    -struct gg_msg_image_reply {
    - uint8_t flag;
    - uint32_t size;
    - uint32_t crc32;
    - /* char filename[]; */
    - /* char image[]; */
    -} GG_PACKED;
    -
    -#define GG_SEND_MSG_ACK 0x0005
    -
    -#ifndef DOXYGEN
    -
    -#define GG_ACK_BLOCKED 0x0001
    -#define GG_ACK_DELIVERED 0x0002
    -#define GG_ACK_QUEUED 0x0003
    -#define GG_ACK_MBOXFULL 0x0004
    -#define GG_ACK_NOT_DELIVERED 0x0006
    -
    -#else
    -
    -/**
    - * Status doręczenia wiadomości.
    - *
    - * \ingroup messages
    - */
    -enum
    -{
    - GG_ACK_DELIVERED, /**< Wiadomość dostarczono. */
    - GG_ACK_QUEUED, /**< Wiadomość zakolejkowano z powodu niedostępności odbiorcy. */
    - GG_ACK_BLOCKED, /**< Wiadomość zablokowana przez serwer (spam, świąteczne ograniczenia itd.) */
    - GG_ACK_MBOXFULL, /**< Wiadomości nie dostarczono z powodu zapełnionej kolejki wiadomości odbiorcy. */
    - GG_ACK_NOT_DELIVERED /**< Wiadomości nie dostarczono (tylko dla \c GG_CLASS_CTCP). */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -struct gg_send_msg_ack {
    - uint32_t status;
    - uint32_t recipient;
    - uint32_t seq;
    -} GG_PACKED;
    -
    -#define GG_RECV_MSG 0x000a
    -
    -struct gg_recv_msg {
    - uint32_t sender;
    - uint32_t seq;
    - uint32_t time;
    - uint32_t msgclass;
    -} GG_PACKED;
    -
    -#define GG_PING 0x0008
    -
    -#define GG_PONG 0x0007
    -
    -#define GG_DISCONNECTING 0x000b
    -
    -#define GG_USERLIST_REQUEST 0x0016
    -
    -#define GG_XML_EVENT 0x0027
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USERLIST_PUT 0x00
    -#define GG_USERLIST_PUT_MORE 0x01
    -#define GG_USERLIST_GET 0x02
    -
    -#else
    -
    -/**
    - * \ingroup importexport
    - *
    - * Rodzaj zapytania.
    - */
    -enum {
    - GG_USERLIST_PUT, /**< Eksport listy kontaktów. */
    - GG_USERLIST_GET, /**< Import listy kontaktów. */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -struct gg_userlist_request {
    - uint8_t type;
    -} GG_PACKED;
    -
    -#define GG_USERLIST_REPLY 0x0010
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USERLIST_PUT_REPLY 0x00
    -#define GG_USERLIST_PUT_MORE_REPLY 0x02
    -#define GG_USERLIST_GET_REPLY 0x06
    -#define GG_USERLIST_GET_MORE_REPLY 0x04
    -
    -#else
    -
    -/**
    - * \ingroup importexport
    - *
    - * Rodzaj odpowiedzi.
    - */
    -enum {
    - GG_USERLIST_PUT_REPLY, /**< Wyeksportowano listy kontaktów. */
    - GG_USERLIST_GET_REPLY, /**< Zaimportowano listę kontaktów. */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -struct gg_userlist_reply {
    - uint8_t type;
    -} GG_PACKED;
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USERLIST100_PUT 0x00
    -#define GG_USERLIST100_GET 0x02
    -
    -#else
    -
    -/**
    - * \ingroup importexport
    - *
    - * Rodzaj zapytania (10.0).
    - */
    -enum {
    - GG_USERLIST100_PUT, /**< Eksport listy kontaktów. */
    - GG_USERLIST100_GET, /**< Import listy kontaktów. */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USERLIST100_FORMAT_TYPE_NONE 0x00
    -#define GG_USERLIST100_FORMAT_TYPE_GG70 0x01
    -#define GG_USERLIST100_FORMAT_TYPE_GG100 0x02
    -
    -#else
    -
    -/**
    - * \ingroup importexport
    - *
    - * Typ formatu listy kontaktów (10.0).
    - */
    -enum {
    - GG_USERLIST100_FORMAT_TYPE_NONE, /**< Brak treści listy kontaktów. */
    - GG_USERLIST100_FORMAT_TYPE_GG70, /**< Format listy kontaktów zgodny z Gadu-Gadu 7.0. */
    - GG_USERLIST100_FORMAT_TYPE_GG100, /**< Format listy kontaktów zgodny z Gadu-Gadu 10.0. */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -#ifndef DOXYGEN
    -
    -#define GG_USERLIST100_REPLY_LIST 0x00
    -#define GG_USERLIST100_REPLY_UPTODATE 0x01
    -#define GG_USERLIST100_REPLY_ACK 0x10
    -#define GG_USERLIST100_REPLY_REJECT 0x12
    -
    -#else
    -
    -/**
    - * \ingroup importexport
    - *
    - * Typ odpowiedzi listy kontaktów (10.0).
    - */
    -enum {
    - GG_USERLIST100_REPLY_LIST, /**< W odpowiedzi znajduje się aktualna lista kontaktów na serwerze. */
    - GG_USERLIST100_REPLY_UPTODATE, /**< Komunikat o tym, że lista kontaktów jest już zsynchronizowana. */
    - GG_USERLIST100_REPLY_ACK, /**< Potwierdzenie odebrania nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer nowej wersji listy kontaktów. */
    - GG_USERLIST100_REPLY_REJECT, /**< Odmowa przyjęcia nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer wersji listy kontaktów aktualnie przechowywanej przez serwer. */
    -};
    -
    -#endif /* DOXYGEN */
    -
    -struct gg_dcc_tiny_packet {
    - uint8_t type; /* rodzaj pakietu */
    -} GG_PACKED;
    -
    -struct gg_dcc_small_packet {
    - uint32_t type; /* rodzaj pakietu */
    -} GG_PACKED;
    -
    -struct gg_dcc_big_packet {
    - uint32_t type; /* rodzaj pakietu */
    - uint32_t dunno1; /* niewiadoma */
    - uint32_t dunno2; /* niewiadoma */
    -} GG_PACKED;
    -
    -/*
    - * póki co, nie znamy dokładnie protokołu. nie wiemy, co czemu odpowiada.
    - * nazwy są niepoważne i tymczasowe.
    - */
    -#define GG_DCC_WANT_FILE 0x0003 /* peer chce plik */
    -#define GG_DCC_HAVE_FILE 0x0001 /* więc mu damy */
    -#define GG_DCC_HAVE_FILEINFO 0x0003 /* niech ma informacje o pliku */
    -#define GG_DCC_GIMME_FILE 0x0006 /* peer jest pewny */
    -#define GG_DCC_CATCH_FILE 0x0002 /* wysyłamy plik */
    -
    -#define GG_DCC_FILEATTR_READONLY 0x0020
    -
    -#define GG_DCC_TIMEOUT_SEND 1800 /* 30 minut */
    -#define GG_DCC_TIMEOUT_GET 1800 /* 30 minut */
    -#define GG_DCC_TIMEOUT_FILE_ACK 300 /* 5 minut */
    -#define GG_DCC_TIMEOUT_VOICE_ACK 300 /* 5 minut */
    -
    -#define GG_DCC7_INFO 0x1f
    -
    -struct gg_dcc7_info {
    - uint32_t uin; /* numer nadawcy */
    - uint32_t type; /* sposób połączenia */
    - gg_dcc7_id_t id; /* identyfikator połączenia */
    - char info[GG_DCC7_INFO_LEN]; /* informacje o połączeniu "ip port" */
    - char hash[GG_DCC7_INFO_HASH_LEN];/* skrót "ip" */
    -} GG_PACKED;
    -
    -#define GG_DCC7_NEW 0x20
    -
    -struct gg_dcc7_new {
    - gg_dcc7_id_t id; /* identyfikator połączenia */
    - uint32_t uin_from; /* numer nadawcy */
    - uint32_t uin_to; /* numer odbiorcy */
    - uint32_t type; /* rodzaj transmisji */
    - unsigned char filename[GG_DCC7_FILENAME_LEN]; /* nazwa pliku */
    - uint32_t size; /* rozmiar pliku */
    - uint32_t size_hi; /* rozmiar pliku (starsze bajty) */
    - unsigned char hash[GG_DCC7_HASH_LEN]; /* hash SHA1 */
    -} GG_PACKED;
    -
    -#define GG_DCC7_ACCEPT 0x21
    -
    -struct gg_dcc7_accept {
    - uint32_t uin; /* numer przyjmującego połączenie */
    - gg_dcc7_id_t id; /* identyfikator połączenia */
    - uint32_t offset; /* offset przy wznawianiu transmisji */
    - uint32_t dunno1; /* 0x00000000 */
    -} GG_PACKED;
    -
    -/* XXX API */
    -#define GG_DCC7_TYPE_P2P 0x00000001 /**< Połączenie bezpośrednie */
    -#define GG_DCC7_TYPE_SERVER 0x00000002 /**< Połączenie przez serwer */
    -
    -#define GG_DCC7_REJECT 0x22
    -
    -struct gg_dcc7_reject {
    - uint32_t uin; /**< Numer odrzucającego połączenie */
    - gg_dcc7_id_t id; /**< Identyfikator połączenia */
    - uint32_t reason; /**< Powód rozłączenia */
    -} GG_PACKED;
    -
    -/* XXX API */
    -#define GG_DCC7_REJECT_BUSY 0x00000001 /**< Połączenie bezpośrednie już trwa, nie umiem obsłużyć więcej */
    -#define GG_DCC7_REJECT_USER 0x00000002 /**< Użytkownik odrzucił połączenie */
    -#define GG_DCC7_REJECT_VERSION 0x00000006 /**< Druga strona ma wersję klienta nieobsługującą połączeń bezpośrednich tego typu */
    -
    -#define GG_DCC7_ID_REQUEST 0x23
    -
    -struct gg_dcc7_id_request {
    - uint32_t type; /**< Rodzaj tranmisji */
    -} GG_PACKED;
    -
    -/* XXX API */
    -#define GG_DCC7_TYPE_VOICE 0x00000001 /**< Transmisja głosu */
    -#define GG_DCC7_TYPE_FILE 0x00000004 /**< transmisja pliku */
    -
    -#define GG_DCC7_ID_REPLY 0x23
    -
    -struct gg_dcc7_id_reply {
    - uint32_t type; /** Rodzaj transmisji */
    - gg_dcc7_id_t id; /** Przyznany identyfikator */
    -} GG_PACKED;
    -
    -#define GG_DCC7_DUNNO1 0x24
    -
    -#define GG_DCC7_TIMEOUT_CONNECT 10 /* 10 sekund */
    -#define GG_DCC7_TIMEOUT_SEND 1800 /* 30 minut */
    -#define GG_DCC7_TIMEOUT_GET 1800 /* 30 minut */
    -#define GG_DCC7_TIMEOUT_FILE_ACK 300 /* 5 minut */
    -#define GG_DCC7_TIMEOUT_VOICE_ACK 300 /* 5 minut */
    -
    -#define GG_CHAT_INFO_UPDATE_ENTERED 0x01
    -#define GG_CHAT_INFO_UPDATE_EXITED 0x03
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#ifdef _WIN32
    -#pragma pack(pop)
    -#endif
    -
    -#endif /* LIBGADU_LIBGADU_H */
    -
    -/*
    - * Local variables:
    - * c-indentation-style: k&r
    - * c-basic-offset: 8
    - * indent-tabs-mode: notnil
    - * End:
    - *
    - * vim: shiftwidth=8:
    - */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libpurple.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,22 +0,0 @@
    -#include <libpurple/gaim-compat.h>
    -#include <libpurple/connection.h>
    -#include <libpurple/conversation.h>
    -#include <libpurple/core.h>
    -#include <libpurple/debug.h>
    -#include <libpurple/dnsquery.h>
    -#include <libpurple/ft.h>
    -#include <libpurple/imgstore.h>
    -#include <libpurple/network.h>
    -#include <libpurple/notify.h>
    -#include <libpurple/plugin.h>
    -#include <libpurple/pounce.h>
    -#include <libpurple/prefs.h>
    -#include <libpurple/privacy.h>
    -#include <libpurple/proxy.h>
    -#include <libpurple/request.h>
    -#include <libpurple/roomlist.h>
    -#include <libpurple/signals.h>
    -#include <libpurple/sslconn.h>
    -#include <libpurple/sound.h>
    -#include <libpurple/util.h>
    -#include <libpurple/whiteboard.h>
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/libymsg.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,402 +0,0 @@
    -/**
    - * @file libymsg.h The Yahoo! and Yahoo! JAPAN Protocol Plugins
    - *
    - * 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
    - */
    -
    -#ifndef _LIBYMSG_H_
    -#define _LIBYMSG_H_
    -
    -#include "circbuffer.h"
    -#include "cmds.h"
    -#include "prpl.h"
    -#include "network.h"
    -
    -#define YAHOO_PAGER_HOST_REQ_URL "http://vcs2.msg.yahoo.com/capacity"
    -#define YAHOO_PAGER_HOST_FALLBACK "scsa.msg.yahoo.com"
    -#define YAHOO_PAGER_PORT 5050
    -#define YAHOO_PAGER_PORT_P2P 5101
    -#define YAHOO_LOGIN_URL "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%s"
    -#define YAHOO_TOKEN_URL "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s"
    -#define YAHOO_P2P_KEEPALIVE_SECS 300
    -#define YAHOO_P2P_SERVER_TIMEOUT 10
    -#define YAHOO_PROFILE_URL "http://profiles.yahoo.com/"
    -#define YAHOO_MAIL_URL "http://rd.yahoo.com/messenger/client/?http://mail.yahoo.com/"
    -#define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com"
    -#define YAHOO_XFER_PORT 80
    -#define YAHOO_XFER_RELAY_HOST "relay.msg.yahoo.com"
    -#define YAHOO_XFER_RELAY_PORT 80
    -#define YAHOO_ROOMLIST_URL "http://insider.msg.yahoo.com/ycontent/"
    -#define YAHOO_ROOMLIST_LOCALE "us"
    -
    -/* Yahoo! JAPAN stuff */
    -#define YAHOOJP_PAGER_HOST_REQ_URL "http://cs1.yahoo.co.jp/capacity"
    -#define YAHOOJP_TOKEN_URL "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s"
    -#define YAHOOJP_LOGIN_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s"
    -#define YAHOOJP_PROFILE_URL "http://profiles.yahoo.co.jp/"
    -#define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/"
    -#define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp"
    -#define YAHOOJP_WEBCAM_HOST "wc.yahoo.co.jp"
    -/* not sure, must test: */
    -#define YAHOOJP_XFER_RELAY_HOST "relay.msg.yahoo.co.jp"
    -#define YAHOOJP_XFER_RELAY_PORT 80
    -#define YAHOOJP_ROOMLIST_URL "http://insider.msg.yahoo.co.jp/ycontent/"
    -#define YAHOOJP_ROOMLIST_LOCALE "ja"
    -
    -#define YAHOO_AUDIBLE_URL "http://l.yimg.com/pu/dl/aud"
    -
    -#define WEBMESSENGER_URL "http://login.yahoo.com/config/login?.src=pg"
    -
    -#define YAHOO_SMS_CARRIER_URL "http://validate.msg.yahoo.com"
    -
    -#define YAHOO_USERINFO_URL "http://address.yahoo.com/yab/us?v=XM&sync=1&tags=short&useutf8=1&noclear=1&legenc=codepage-1252"
    -#define YAHOOJP_USERINFO_URL "http://address.yahoo.co.jp/yab/jp?v=XM&sync=1&tags=short&useutf8=1&noclear=1&legenc=codepage-1252"
    -
    -#define YAHOO_PICURL_SETTING "picture_url"
    -#define YAHOO_PICCKSUM_SETTING "picture_checksum"
    -#define YAHOO_PICEXPIRE_SETTING "picture_expire"
    -
    -#define YAHOO_STATUS_TYPE_OFFLINE "offline"
    -#define YAHOO_STATUS_TYPE_AVAILABLE "available"
    -#define YAHOO_STATUS_TYPE_BRB "brb"
    -#define YAHOO_STATUS_TYPE_BUSY "busy"
    -#define YAHOO_STATUS_TYPE_NOTATHOME "notathome"
    -#define YAHOO_STATUS_TYPE_NOTATDESK "notatdesk"
    -#define YAHOO_STATUS_TYPE_NOTINOFFICE "notinoffice"
    -#define YAHOO_STATUS_TYPE_ONPHONE "onphone"
    -#define YAHOO_STATUS_TYPE_ONVACATION "onvacation"
    -#define YAHOO_STATUS_TYPE_OUTTOLUNCH "outtolunch"
    -#define YAHOO_STATUS_TYPE_STEPPEDOUT "steppedout"
    -#define YAHOO_STATUS_TYPE_AWAY "away"
    -#define YAHOO_STATUS_TYPE_INVISIBLE "invisible"
    -#define YAHOO_STATUS_TYPE_MOBILE "mobile"
    -
    -#define YAHOO_CLIENT_VERSION_ID "4194239"
    -#define YAHOO_CLIENT_VERSION "9.0.0.2162"
    -
    -#define YAHOOJP_CLIENT_VERSION_ID "4186047"
    -#define YAHOOJP_CLIENT_VERSION "9.0.0.1727"
    -
    -#define YAHOO_CLIENT_USERAGENT "Mozilla/5.0"
    -#define YAHOO_CLIENT_USERAGENT_ALIAS "Mozilla/4.0 (compatible; MSIE 5.5)"
    -
    -/* Index into attention types list. */
    -#define YAHOO_BUZZ 0
    -
    -typedef enum {
    - YAHOO_PKT_TYPE_SERVER = 0,
    - YAHOO_PKT_TYPE_P2P
    -} yahoo_pkt_type;
    -
    -typedef enum {
    - YAHOO_P2P_WE_ARE_CLIENT =0,
    - YAHOO_P2P_WE_ARE_SERVER
    -} yahoo_p2p_connection_type;
    -
    -enum yahoo_status {
    - YAHOO_STATUS_AVAILABLE = 0,
    - YAHOO_STATUS_BRB,
    - YAHOO_STATUS_BUSY,
    - YAHOO_STATUS_NOTATHOME,
    - YAHOO_STATUS_NOTATDESK,
    - YAHOO_STATUS_NOTINOFFICE,
    - YAHOO_STATUS_ONPHONE,
    - YAHOO_STATUS_ONVACATION,
    - YAHOO_STATUS_OUTTOLUNCH,
    - YAHOO_STATUS_STEPPEDOUT,
    - YAHOO_STATUS_P2P = 11,
    - YAHOO_STATUS_INVISIBLE = 12,
    - YAHOO_STATUS_CUSTOM = 99,
    - YAHOO_STATUS_IDLE = 999,
    - YAHOO_STATUS_WEBLOGIN = 0x5a55aa55,
    - YAHOO_STATUS_OFFLINE = 0x5a55aa56, /* don't ask */
    - YAHOO_STATUS_TYPING = 0x16,
    - YAHOO_STATUS_DISCONNECTED = -1 /* 0xffffffff; in ymsg 15. doesnt mean the normal sense of 'disconnected' */
    -};
    -
    -/*
    - * Yahoo federated networks. Key 241 in ymsg.
    - * If it doesn't exist, it is on Yahoo's netowrk.
    - * It if does exist, send to another IM network.
    - */
    -
    -typedef enum {
    - YAHOO_FEDERATION_NONE = 0, /* No federation - Yahoo! network */
    - YAHOO_FEDERATION_OCS = 1, /* LCS or OCS private networks */
    - YAHOO_FEDERATION_MSN = 2, /* MSN or Windows Live network */
    - YAHOO_FEDERATION_IBM = 9, /* IBM/Sametime network */
    - YAHOO_FEDERATION_PBX = 100 /* Yahoo! Pingbox service */
    -} YahooFederation;
    -
    -
    -struct yahoo_buddy_icon_upload_data {
    - PurpleConnection *gc;
    - GString *str;
    - char *filename;
    - int pos;
    - int fd;
    - guint watcher;
    -};
    -
    -struct yahoo_p2p_data {
    - PurpleConnection *gc;
    - char *host_ip;
    - char *host_username;
    - int val_13;
    - guint input_event;
    - gint source;
    - int session_id;
    - yahoo_p2p_connection_type connection_type;
    -};
    -
    -struct _YchtConn;
    -
    -typedef struct _YahooPersonalDetails {
    - char *id;
    -
    - struct {
    - char *first;
    - char *last;
    - char *middle;
    - char *nick;
    - } names;
    -
    - struct {
    - char *work;
    - char *home;
    - char *mobile;
    - } phone;
    -} YahooPersonalDetails;
    -
    -typedef struct {
    - PurpleConnection *gc;
    - int fd;
    - guchar *rxqueue;
    - int rxlen;
    - PurpleCircBuffer *txbuf;
    - guint txhandler;
    - GHashTable *friends;
    -
    - char **profiles; /* Multiple profiles can be associated with an account */
    - YahooPersonalDetails ypd;
    -
    - /**
    - * This is used to keep track of the IMVironment chosen
    - * by people you talk to. We don't do very much with
    - * this right now... but at least now if the remote user
    - * selects an IMVironment we won't reset it back to the
    - * default of nothing.
    - */
    - GHashTable *imvironments;
    -
    - int current_status;
    - gboolean logged_in;
    - GString *tmp_serv_blist, *tmp_serv_ilist, *tmp_serv_plist;
    - GSList *confs;
    - unsigned int conf_id; /* just a counter */
    - gboolean chat_online;
    - gboolean in_chat;
    - char *chat_name;
    - char *pending_chat_room;
    - char *pending_chat_id;
    - char *pending_chat_topic;
    - char *pending_chat_goto;
    - char *auth;
    - gsize auth_written;
    - char *cookie_y;
    - char *cookie_t;
    - char *cookie_b;
    - int session_id;
    - gboolean jp;
    - gboolean wm; /* connected w/ web messenger method */
    - /* picture aka buddy icon stuff */
    - char *picture_url;
    - int picture_checksum;
    -
    - /* ew. we have to check the icon before we connect,
    - * but can't upload it til we're connected. */
    - struct yahoo_buddy_icon_upload_data *picture_upload_todo;
    - PurpleProxyConnectData *buddy_icon_connect_data;
    -
    - struct _YchtConn *ycht;
    -
    - /**
    - * This linked list contains PurpleUtilFetchUrlData structs
    - * for when we lookup people profile or photo information.
    - */
    - GSList *url_datas;
    - GHashTable *xfer_peer_idstring_map;/* Hey, i dont know, but putting this HashTable next to friends gives a run time fault... */
    - GSList *cookies;/* contains all cookies, including _y and _t */
    - PurpleNetworkListenData *listen_data;
    -
    - /**
    - * We may receive a list15 in multiple packets with no prior warning as to how many we'll be getting;
    - * the server expects us to keep track of the group for which it is sending us contact names.
    - */
    - char *current_list15_grp;
    - time_t last_ping;
    - time_t last_keepalive;
    - GHashTable *peers; /* information about p2p data */
    - int yahoo_p2p_timer;
    - int yahoo_local_p2p_server_fd;
    - int yahoo_p2p_server_watcher;
    - GHashTable *sms_carrier; /* sms carrier data */
    - guint yahoo_p2p_server_timeout_handle;
    -} YahooData;
    -
    -#define YAHOO_MAX_STATUS_MESSAGE_LENGTH (255)
    -
    -/*
    - * Current Maximum Length for Instant Messages
    - *
    - * This was found by experiment.
    - *
    - * The YMSG protocol allows a message of up to 948 bytes, but the official client
    - * limits to 800 characters. According to experiments I conducted, it seems that
    - * the discrepancy is to allow some leeway for messages with mixed single- and
    - * multi-byte characters, as I was able to send messages of 840 and 932 bytes
    - * by using some multibyte characters (some random Chinese or Japanese characters,
    - * to be precise). - rekkanoryo
    - */
    -#define YAHOO_MAX_MESSAGE_LENGTH_BYTES 948
    -#define YAHOO_MAX_MESSAGE_LENGTH_CHARS 800
    -
    -/* sometimes i wish prpls could #include things from other prpls. then i could just
    - * use the routines from libfaim and not have to admit to knowing how they work. */
    -#define yahoo_put16(buf, data) ( \
    - (*(buf) = (unsigned char)((data)>>8)&0xff), \
    - (*((buf)+1) = (unsigned char)(data)&0xff), \
    - 2)
    -#define yahoo_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff))
    -#define yahoo_put32(buf, data) ( \
    - (*((buf)) = (unsigned char)((data)>>24)&0xff), \
    - (*((buf)+1) = (unsigned char)((data)>>16)&0xff), \
    - (*((buf)+2) = (unsigned char)((data)>>8)&0xff), \
    - (*((buf)+3) = (unsigned char)(data)&0xff), \
    - 4)
    -#define yahoo_get32(buf) ((((*(buf))<<24)&0xff000000) + \
    - (((*((buf)+1))<<16)&0x00ff0000) + \
    - (((*((buf)+2))<< 8)&0x0000ff00) + \
    - (((*((buf)+3) )&0x000000ff)))
    -
    -/* util.c */
    -void yahoo_init_colorht(void);
    -void yahoo_dest_colorht(void);
    -char *yahoo_codes_to_html(const char *x);
    -
    -/**
    - * This function takes a normal HTML message and converts it to the message
    - * format used by Yahoo, which uses a frankensteinish combination of ANSI
    - * escape codes and broken HTML.
    - *
    - * It results in slightly different output than would be sent by official
    - * Yahoo clients. The two main differences are:
    - *
    - * 1. We always close all tags, whereas official Yahoo clients leave tags
    - * dangling open at the end of each message (and the client treats them
    - * as closed).
    - * 2. We always close inner tags first before closing outter tags.
    - *
    - * For example, if you want to send this message:
    - * <b> bold <i> bolditalic </i></b><i> italic </i>
    - * Official Yahoo clients would send:
    - * ESC[1m bold ESC[2m bolditalic ESC[x1m italic
    - * But we will send:
    - * ESC[1m bold ESC[2m bolditalic ESC[x2mESC[x1mESC[2m italic ESC[x2m
    - */
    -char *yahoo_html_to_codes(const char *src);
    -
    -gboolean
    -yahoo_account_use_http_proxy(PurpleConnection *conn);
    -
    -/**
    - * Encode some text to send to the yahoo server.
    - *
    - * @param gc The connection handle.
    - * @param str The null terminated utf8 string to encode.
    - * @param utf8 If not @c NULL, whether utf8 is okay or not.
    - * Even if it is okay, we may not use it. If we
    - * used it, we set this to @c TRUE, else to
    - * @c FALSE. If @c NULL, false is assumed, and
    - * it is not dereferenced.
    - * @return The g_malloced string in the appropriate encoding.
    - */
    -char *yahoo_string_encode(PurpleConnection *gc, const char *str, gboolean *utf8);
    -
    -/**
    - * Decode some text received from the server.
    - *
    - * @param gc The gc handle.
    - * @param str The null terminated string to decode.
    - * @param utf8 Did the server tell us it was supposed to be utf8?
    - * @return The decoded, utf-8 string, which must be g_free()'d.
    - */
    -char *yahoo_string_decode(PurpleConnection *gc, const char *str, gboolean utf8);
    -
    -char *yahoo_convert_to_numeric(const char *str);
    -
    -YahooFederation yahoo_get_federation_from_name(const char *who);
    -
    -/* yahoo_profile.c */
    -void yahoo_get_info(PurpleConnection *gc, const char *name);
    -
    -/* libymsg.h - these functions were formerly static but need not to be for the
    - * new two-prpl model. */
    -const char *yahoo_list_icon(PurpleAccount *a, PurpleBuddy *b);
    -const char *yahoo_list_emblem(PurpleBuddy *b);
    -char *yahoo_status_text(PurpleBuddy *b);
    -void yahoo_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full);
    -GList *yahoo_status_types(PurpleAccount *account);
    -GList *yahoo_blist_node_menu(PurpleBlistNode *node);
    -void yahoo_login(PurpleAccount *account);
    -void yahoo_close(PurpleConnection *gc);
    -int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, PurpleMessageFlags flags);
    -unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state);
    -void yahoo_set_status(PurpleAccount *account, PurpleStatus *status);
    -void yahoo_set_idle(PurpleConnection *gc, int idle);
    -void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g);
    -void yahoo_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group);
    -void yahoo_add_deny(PurpleConnection *gc, const char *who);
    -void yahoo_rem_deny(PurpleConnection *gc, const char *who);
    -void yahoo_set_permit_deny(PurpleConnection *gc);
    -void yahoo_keepalive(PurpleConnection *gc);
    -void yahoo_change_buddys_group(PurpleConnection *gc, const char *who, const char *old_group, const char *new_group);
    -void yahoo_rename_group(PurpleConnection *gc, const char *old_name, PurpleGroup *group, GList *moved_buddies);
    -gboolean yahoo_offline_message(const PurpleBuddy *buddy);
    -gboolean yahoo_send_attention(PurpleConnection *gc, const char *username, guint type);
    -GList *yahoo_attention_types(PurpleAccount *account);
    -
    -GList *yahoo_actions(PurplePlugin *plugin, gpointer context);
    -void yahoopurple_register_commands(void);
    -
    -PurpleCmdRet yahoopurple_cmd_buzz(PurpleConversation *c, const gchar *cmd, gchar **args, gchar **error, void *data);
    -PurpleCmdRet yahoopurple_cmd_chat_join(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data);
    -PurpleCmdRet yahoopurple_cmd_chat_list(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data);
    -/* needed for xfer, thought theyd be useful for other enhancements later on
    - Returns list of cookies stored in yahoo_data formatted as a single null terminated string
    - returned value must be g_freed
    -*/
    -gchar* yahoo_get_cookies(PurpleConnection *gc);
    -
    -/* send p2p pkt containing our encoded ip, asking peer to connect to us */
    -void yahoo_send_p2p_pkt(PurpleConnection *gc, const char *who, int val_13);
    -
    -#endif /* _LIBYMSG_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/log.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,583 +0,0 @@
    -/**
    - * @file log.h Logging API
    - * @ingroup core
    - * @see @ref log-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_LOG_H_
    -#define _PURPLE_LOG_H_
    -
    -#include <stdio.h>
    -
    -
    -/********************************************************
    - * DATA STRUCTURES **************************************
    - ********************************************************/
    -
    -typedef struct _PurpleLog PurpleLog;
    -typedef struct _PurpleLogLogger PurpleLogLogger;
    -typedef struct _PurpleLogCommonLoggerData PurpleLogCommonLoggerData;
    -typedef struct _PurpleLogSet PurpleLogSet;
    -
    -typedef enum {
    - PURPLE_LOG_IM,
    - PURPLE_LOG_CHAT,
    - PURPLE_LOG_SYSTEM
    -} PurpleLogType;
    -
    -typedef enum {
    - PURPLE_LOG_READ_NO_NEWLINE = 1
    -} PurpleLogReadFlags;
    -
    -#include "account.h"
    -#include "conversation.h"
    -
    -typedef void (*PurpleLogSetCallback) (GHashTable *sets, PurpleLogSet *set);
    -
    -/**
    - * A log logger.
    - *
    - * This struct gets filled out and is included in the PurpleLog. It contains everything
    - * needed to write and read from logs.
    - */
    -struct _PurpleLogLogger {
    - char *name; /**< The logger's name */
    - char *id; /**< an identifier to refer to this logger */
    -
    - /** This gets called when the log is first created.
    - I don't think this is actually needed. */
    - void (*create)(PurpleLog *log);
    -
    - /** This is used to write to the log file */
    - gsize (*write)(PurpleLog *log,
    - PurpleMessageFlags type,
    - const char *from,
    - time_t time,
    - const char *message);
    -
    - /** Called when the log is destroyed */
    - void (*finalize)(PurpleLog *log);
    -
    - /** This function returns a sorted GList of available PurpleLogs */
    - GList *(*list)(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    - /** Given one of the logs returned by the logger's list function,
    - * this returns the contents of the log in GtkIMHtml markup */
    - char *(*read)(PurpleLog *log, PurpleLogReadFlags *flags);
    -
    - /** Given one of the logs returned by the logger's list function,
    - * this returns the size of the log in bytes */
    - int (*size)(PurpleLog *log);
    -
    - /** Returns the total size of all the logs. If this is undefined a default
    - * implementation is used */
    - int (*total_size)(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    - /** This function returns a sorted GList of available system PurpleLogs */
    - GList *(*list_syslog)(PurpleAccount *account);
    -
    - /** Adds PurpleLogSets to a GHashTable. By passing the data in the PurpleLogSets
    - * to list, the caller can get every available PurpleLog from the logger.
    - * Loggers using purple_log_common_writer() (or otherwise storing their
    - * logs in the same directory structure as the stock loggers) do not
    - * need to implement this function.
    - *
    - * Loggers which implement this function must create a PurpleLogSet,
    - * then call @a cb with @a sets and the newly created PurpleLogSet. */
    - void (*get_log_sets)(PurpleLogSetCallback cb, GHashTable *sets);
    -
    - /* Attempts to delete the specified log, indicating success or failure */
    - gboolean (*remove)(PurpleLog *log);
    -
    - /* Tests whether a log is deletable */
    - gboolean (*is_deletable)(PurpleLog *log);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/**
    - * A log. Not the wooden type.
    - */
    -struct _PurpleLog {
    - PurpleLogType type; /**< The type of log this is */
    - char *name; /**< The name of this log */
    - PurpleAccount *account; /**< The account this log is taking
    - place on */
    - PurpleConversation *conv; /**< The conversation being logged */
    - time_t time; /**< The time this conversation
    - started, converted to the local timezone */
    -
    - PurpleLogLogger *logger; /**< The logging mechanism this log
    - is to use */
    - void *logger_data; /**< Data used by the log logger */
    - struct tm *tm; /**< The time this conversation
    - started, saved with original
    - timezone data, if available and
    - if struct tm has the BSD
    - timezone fields, else @c NULL.
    - Do NOT modify anything in this struct.*/
    -
    - /* IMPORTANT: Some code in log.c allocates these without zeroing them.
    - * IMPORTANT: Update that code if you add members here. */
    -};
    -
    -/**
    - * A common logger_data struct containing a file handle and path, as well
    - * as a pointer to something else for additional data.
    - */
    -struct _PurpleLogCommonLoggerData {
    - char *path;
    - FILE *file;
    - void *extra_data;
    -};
    -
    -/**
    - * Describes available logs.
    - *
    - * By passing the elements of this struct to purple_log_get_logs(), the caller
    - * can get all available PurpleLogs.
    - */
    -struct _PurpleLogSet {
    - PurpleLogType type; /**< The type of logs available */
    - char *name; /**< The name of the logs available */
    - PurpleAccount *account; /**< The account the available logs
    - took place on. This will be
    - @c NULL if the account no longer
    - exists. (Depending on a
    - logger's implementation of
    - list, it may not be possible
    - to load such logs.) */
    - gboolean buddy; /**< Is this (account, name) a buddy
    - on the buddy list? */
    - char *normalized_name; /**< The normalized version of
    - @a name. It must be set, and
    - may be set to the same pointer
    - value as @a name. */
    -
    - /* IMPORTANT: Some code in log.c allocates these without zeroing them.
    - * IMPORTANT: Update that code if you add members here. */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/***************************************/
    -/** @name Log Functions */
    -/***************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new log
    - *
    - * @param type The type of log this is.
    - * @param name The name of this conversation (buddy name, chat name,
    - * etc.)
    - * @param account The account the conversation is occurring on
    - * @param conv The conversation being logged
    - * @param time The time this conversation started
    - * @param tm The time this conversation started, with timezone data,
    - * if available and if struct tm has the BSD timezone fields.
    - * @return The new log
    - */
    -PurpleLog *purple_log_new(PurpleLogType type, const char *name, PurpleAccount *account,
    - PurpleConversation *conv, time_t time, const struct tm *tm);
    -
    -/**
    - * Frees a log
    - *
    - * @param log The log to destroy
    - */
    -void purple_log_free(PurpleLog *log);
    -
    -/**
    - * Writes to a log file. Assumes you have checked preferences already.
    - *
    - * @param log The log to write to
    - * @param type The type of message being logged
    - * @param from Whom this message is coming from, or @c NULL for
    - * system messages
    - * @param time A timestamp in UNIX time
    - * @param message The message to log
    - */
    -void purple_log_write(PurpleLog *log,
    - PurpleMessageFlags type,
    - const char *from,
    - time_t time,
    - const char *message);
    -
    -/**
    - * Reads from a log
    - *
    - * @param log The log to read from
    - * @param flags The returned logging flags.
    - *
    - * @return The contents of this log in Purple Markup.
    - */
    -char *purple_log_read(PurpleLog *log, PurpleLogReadFlags *flags);
    -
    -/**
    - * Returns a list of all available logs
    - *
    - * @param type The type of the log
    - * @param name The name of the log
    - * @param account The account
    - * @return A sorted list of PurpleLogs
    - */
    -GList *purple_log_get_logs(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    -/**
    - * Returns a GHashTable of PurpleLogSets.
    - *
    - * A "log set" here means the information necessary to gather the
    - * PurpleLogs for a given buddy/chat. This information would be passed
    - * to purple_log_list to get a list of PurpleLogs.
    - *
    - * The primary use of this function is to get a list of everyone the
    - * user has ever talked to (assuming he or she uses logging).
    - *
    - * The GHashTable that's returned will free all log sets in it when
    - * destroyed. If a PurpleLogSet is removed from the GHashTable, it
    - * must be freed with purple_log_set_free().
    - *
    - * @return A GHashTable of all available unique PurpleLogSets
    - */
    -GHashTable *purple_log_get_log_sets(void);
    -
    -/**
    - * Returns a list of all available system logs
    - *
    - * @param account The account
    - * @return A sorted list of PurpleLogs
    - */
    -GList *purple_log_get_system_logs(PurpleAccount *account);
    -
    -/**
    - * Returns the size of a log
    - *
    - * @param log The log
    - * @return The size of the log, in bytes
    - */
    -int purple_log_get_size(PurpleLog *log);
    -
    -/**
    - * Returns the size, in bytes, of all available logs in this conversation
    - *
    - * @param type The type of the log
    - * @param name The name of the log
    - * @param account The account
    - * @return The size in bytes
    - */
    -int purple_log_get_total_size(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    -/**
    - * Returns the activity score of a log, based on total size in bytes,
    - * which is then decayed based on age
    - *
    - * @param type The type of the log
    - * @param name The name of the log
    - * @param account The account
    - * @return The activity score
    - *
    - * @since 2.6.0
    - */
    -int purple_log_get_activity_score(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    -/**
    - * Tests whether a log is deletable
    - *
    - * A return value of @c FALSE indicates that purple_log_delete() will fail on this
    - * log, unless something changes between the two calls. A return value of @c TRUE,
    - * however, does not guarantee the log can be deleted.
    - *
    - * @param log The log
    - * @return A boolean indicating if the log is deletable
    - */
    -gboolean purple_log_is_deletable(PurpleLog *log);
    -
    -/**
    - * Deletes a log
    - *
    - * @param log The log
    - * @return A boolean indicating success or failure
    - */
    -gboolean purple_log_delete(PurpleLog *log);
    -
    -/**
    - * Returns the default logger directory Purple uses for a given account
    - * and username. This would be where Purple stores logs created by
    - * the built-in text or HTML loggers.
    - *
    - * @param type The type of the log.
    - * @param name The name of the log.
    - * @param account The account.
    - * @return The default logger directory for Purple.
    - */
    -char *purple_log_get_log_dir(PurpleLogType type, const char *name, PurpleAccount *account);
    -
    -/**
    - * Implements GCompareFunc for PurpleLogs
    - *
    - * @param y A PurpleLog
    - * @param z Another PurpleLog
    - * @return A value as specified by GCompareFunc
    - */
    -gint purple_log_compare(gconstpointer y, gconstpointer z);
    -
    -/**
    - * Implements GCompareFunc for PurpleLogSets
    - *
    - * @param y A PurpleLogSet
    - * @param z Another PurpleLogSet
    - * @return A value as specified by GCompareFunc
    - */
    -gint purple_log_set_compare(gconstpointer y, gconstpointer z);
    -
    -/**
    - * Frees a log set
    - *
    - * @param set The log set to destroy
    - */
    -void purple_log_set_free(PurpleLogSet *set);
    -
    -/*@}*/
    -
    -/******************************************/
    -/** @name Common Logger Functions */
    -/******************************************/
    -/*@{*/
    -
    -/**
    - * Opens a new log file in the standard Purple log location
    - * with the given file extension, named for the current time,
    - * for writing. If a log file is already open, the existing
    - * file handle is retained. The log's logger_data value is
    - * set to a PurpleLogCommonLoggerData struct containing the log
    - * file handle and log path.
    - *
    - * This function is intended to be used as a "common"
    - * implementation of a logger's @c write function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param log The log to write to.
    - * @param ext The file extension to give to this log file.
    - */
    -void purple_log_common_writer(PurpleLog *log, const char *ext);
    -
    -/**
    - * Returns a sorted GList of PurpleLogs of the requested type.
    - *
    - * This function should only be used with logs that are written
    - * with purple_log_common_writer(). It's intended to be used as
    - * a "common" implementation of a logger's @c list function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param type The type of the logs being listed.
    - * @param name The name of the log.
    - * @param account The account of the log.
    - * @param ext The file extension this log format uses.
    - * @param logger A reference to the logger struct for this log.
    - *
    - * @return A sorted GList of PurpleLogs matching the parameters.
    - */
    -GList *purple_log_common_lister(PurpleLogType type, const char *name,
    - PurpleAccount *account, const char *ext,
    - PurpleLogLogger *logger);
    -
    -/**
    - * Returns the total size of all the logs for a given user, with
    - * a given extension.
    - *
    - * This function should only be used with logs that are written
    - * with purple_log_common_writer(). It's intended to be used as
    - * a "common" implementation of a logger's @c total_size function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param type The type of the logs being sized.
    - * @param name The name of the logs to size
    - * (e.g. the username or chat name).
    - * @param account The account of the log.
    - * @param ext The file extension this log format uses.
    - *
    - * @return The size of all the logs with the specified extension
    - * for the specified user.
    - */
    -int purple_log_common_total_sizer(PurpleLogType type, const char *name,
    - PurpleAccount *account, const char *ext);
    -
    -/**
    - * Returns the size of a given PurpleLog.
    - *
    - * This function should only be used with logs that are written
    - * with purple_log_common_writer(). It's intended to be used as
    - * a "common" implementation of a logger's @c size function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param log The PurpleLog to size.
    - *
    - * @return An integer indicating the size of the log in bytes.
    - */
    -int purple_log_common_sizer(PurpleLog *log);
    -
    -/**
    - * Deletes a log
    - *
    - * This function should only be used with logs that are written
    - * with purple_log_common_writer(). It's intended to be used as
    - * a "common" implementation of a logger's @c delete function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param log The PurpleLog to delete.
    - *
    - * @return A boolean indicating success or failure.
    - */
    -gboolean purple_log_common_deleter(PurpleLog *log);
    -
    -/**
    - * Checks to see if a log is deletable
    - *
    - * This function should only be used with logs that are written
    - * with purple_log_common_writer(). It's intended to be used as
    - * a "common" implementation of a logger's @c is_deletable function.
    - * It should only be passed to purple_log_logger_new() and never
    - * called directly.
    - *
    - * @param log The PurpleLog to check.
    - *
    - * @return A boolean indicating if the log is deletable.
    - */
    -gboolean purple_log_common_is_deletable(PurpleLog *log);
    -
    -/*@}*/
    -
    -/******************************************/
    -/** @name Logger Functions */
    -/******************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new logger
    - *
    - * @param id The logger's id.
    - * @param name The logger's name.
    - * @param functions The number of functions being passed. The following
    - * functions are currently available (in order): @c create,
    - * @c write, @c finalize, @c list, @c read, @c size,
    - * @c total_size, @c list_syslog, @c get_log_sets,
    - * @c remove, @c is_deletable.
    - * For details on these functions, see PurpleLogLogger.
    - * Functions may not be skipped. For example, passing
    - * @c create and @c write is acceptable (for a total of
    - * two functions). Passing @c create and @c finalize,
    - * however, is not. To accomplish that, the caller must
    - * pass @c create, @c NULL (a placeholder for @c write),
    - * and @c finalize (for a total of 3 functions).
    - *
    - * @return The new logger
    - */
    -PurpleLogLogger *purple_log_logger_new(const char *id, const char *name, int functions, ...);
    -
    -/**
    - * Frees a logger
    - *
    - * @param logger The logger to free
    - */
    -void purple_log_logger_free(PurpleLogLogger *logger);
    -
    -/**
    - * Adds a new logger
    - *
    - * @param logger The new logger to add
    - */
    -void purple_log_logger_add (PurpleLogLogger *logger);
    -
    -/**
    - *
    - * Removes a logger
    - *
    - * @param logger The logger to remove
    - */
    -void purple_log_logger_remove (PurpleLogLogger *logger);
    -
    -/**
    - *
    - * Sets the current logger
    - *
    - * @param logger The logger to set
    - */
    -void purple_log_logger_set (PurpleLogLogger *logger);
    -
    -/**
    - *
    - * Returns the current logger
    - *
    - * @return logger The current logger
    - */
    -PurpleLogLogger *purple_log_logger_get (void);
    -
    -/**
    - * Returns a GList containing the IDs and names of the registered
    - * loggers.
    - *
    - * @return The list of IDs and names.
    - */
    -GList *purple_log_logger_get_options(void);
    -
    -/**************************************************************************/
    -/** @name Log Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Initializes the log subsystem.
    - */
    -void purple_log_init(void);
    -
    -/**
    - * Returns the log subsystem handle.
    - *
    - * @return The log subsystem handle.
    - */
    -void *purple_log_get_handle(void);
    -
    -/**
    - * Uninitializes the log subsystem.
    - */
    -void purple_log_uninit(void);
    -
    -/*@}*/
    -
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_LOG_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/marshallers.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,84 +0,0 @@
    -
    -#ifndef __purple_smarshal_MARSHAL_H__
    -#define __purple_smarshal_MARSHAL_H__
    -
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -/* VOID:POINTER,POINTER,OBJECT (./marshallers.list:1) */
    -extern void purple_smarshal_VOID__POINTER_POINTER_OBJECT (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* BOOLEAN:OBJECT,POINTER,STRING (./marshallers.list:2) */
    -extern void purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:STRING,STRING (./marshallers.list:3) */
    -extern void purple_smarshal_VOID__STRING_STRING (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:STRING,STRING,DOUBLE (./marshallers.list:4) */
    -extern void purple_smarshal_VOID__STRING_STRING_DOUBLE (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:ENUM,STRING,STRING (./marshallers.list:5) */
    -extern void purple_smarshal_VOID__ENUM_STRING_STRING (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:ENUM,STRING,STRING,BOOLEAN (./marshallers.list:6) */
    -extern void purple_smarshal_VOID__ENUM_STRING_STRING_BOOLEAN (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:FLAGS,FLAGS (./marshallers.list:7) */
    -extern void purple_smarshal_VOID__FLAGS_FLAGS (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:STRING,STRING,OBJECT,OBJECT (./marshallers.list:8) */
    -extern void purple_smarshal_VOID__STRING_STRING_OBJECT_OBJECT (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -/* VOID:POINTER,POINTER,OBJECT,OBJECT (./marshallers.list:9) */
    -extern void purple_smarshal_VOID__POINTER_POINTER_OBJECT_OBJECT (GClosure *closure,
    - GValue *return_value,
    - guint n_param_values,
    - const GValue *param_values,
    - gpointer invocation_hint,
    - gpointer marshal_data);
    -
    -G_END_DECLS
    -
    -#endif /* __purple_smarshal_MARSHAL_H__ */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media-gst.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,202 +0,0 @@
    -/**
    - * @file media-gst.h Media 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_GST_H_
    -#define _PURPLE_MEDIA_GST_H_
    -
    -#include "media.h"
    -#include "mediamanager.h"
    -
    -#include <gst/gst.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_ELEMENT_TYPE (purple_media_element_type_get_type())
    -#define PURPLE_TYPE_MEDIA_ELEMENT_INFO (purple_media_element_info_get_type())
    -#define PURPLE_MEDIA_ELEMENT_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    -#define PURPLE_MEDIA_ELEMENT_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    -#define PURPLE_IS_MEDIA_ELEMENT_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO))
    -#define PURPLE_IS_MEDIA_ELEMENT_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_ELEMENT_INFO))
    -#define PURPLE_MEDIA_ELEMENT_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    -
    -/** An opaque structure representing an audio/video source/sink. */
    -typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo;
    -typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass;
    -typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -typedef enum {
    - PURPLE_MEDIA_ELEMENT_NONE = 0, /** empty element */
    - PURPLE_MEDIA_ELEMENT_AUDIO = 1, /** supports audio */
    - PURPLE_MEDIA_ELEMENT_VIDEO = 1 << 1, /** supports video */
    - PURPLE_MEDIA_ELEMENT_AUDIO_VIDEO = PURPLE_MEDIA_ELEMENT_AUDIO
    - | PURPLE_MEDIA_ELEMENT_VIDEO, /** supports audio and video */
    -
    - PURPLE_MEDIA_ELEMENT_NO_SRCS = 0, /** has no src pads */
    - PURPLE_MEDIA_ELEMENT_ONE_SRC = 1 << 2, /** has one src pad */
    - PURPLE_MEDIA_ELEMENT_MULTI_SRC = 1 << 3, /** has multiple src pads */
    - PURPLE_MEDIA_ELEMENT_REQUEST_SRC = 1 << 4, /** src pads must be requested */
    -
    - PURPLE_MEDIA_ELEMENT_NO_SINKS = 0, /** has no sink pads */
    - PURPLE_MEDIA_ELEMENT_ONE_SINK = 1 << 5, /** has one sink pad */
    - PURPLE_MEDIA_ELEMENT_MULTI_SINK = 1 << 6, /** has multiple sink pads */
    - PURPLE_MEDIA_ELEMENT_REQUEST_SINK = 1 << 7, /** sink pads must be requested */
    -
    - PURPLE_MEDIA_ELEMENT_UNIQUE = 1 << 8, /** This element is unique and
    - only one instance of it should
    - be created at a time */
    -
    - PURPLE_MEDIA_ELEMENT_SRC = 1 << 9, /** can be set as an active src */
    - PURPLE_MEDIA_ELEMENT_SINK = 1 << 10, /** can be set as an active sink */
    - PURPLE_MEDIA_ELEMENT_APPLICATION = 1 << 11, /** supports application data */
    -} PurpleMediaElementType;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Gets the element type's GType.
    - *
    - * @return The element type's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_element_type_get_type(void);
    -
    -/**
    - * Gets the element info's GType.
    - *
    - * @return The element info's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_element_info_get_type(void);
    -
    -/**
    - * Gets the source from a session
    - *
    - * @param media The media object the session is in.
    - * @param sess_id The session id of the session to get the source from.
    - *
    - * @return The source retrieved.
    - *
    - * @since 2.6.0
    - */
    -GstElement *purple_media_get_src(PurpleMedia *media, const gchar *sess_id);
    -
    -/**
    - * Gets the tee from a given session/stream.
    - *
    - * @param media The instance to get the tee from.
    - * @param session_id The id of the session to get the tee from.
    - * @param participant Optionally, the participant of the stream to get the tee from.
    - *
    - * @return The GstTee element from the chosen session/stream.
    - *
    - * @since 2.6.0
    - */
    -GstElement *purple_media_get_tee(PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -
    -/**
    - * Gets the pipeline from the media manager.
    - *
    - * @param manager The media manager to get the pipeline from.
    - *
    - * @return The pipeline.
    - *
    - * @since 2.6.0
    - */
    -GstElement *purple_media_manager_get_pipeline(PurpleMediaManager *manager);
    -
    -/**
    - * Returns a GStreamer source or sink for audio or video.
    - *
    - * @param manager The media manager to use to obtain the source/sink.
    - * @param type The type of source/sink to get.
    - * @param media The media call this element is requested for.
    - * @param session_id The id of the session this element is requested for or NULL.
    - * @param participant The remote user this element is requested for or NULL.
    - *
    - * @since 2.6.0
    - */
    -GstElement *purple_media_manager_get_element(PurpleMediaManager *manager,
    - PurpleMediaSessionType type, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -PurpleMediaElementInfo *purple_media_manager_get_element_info(
    - PurpleMediaManager *manager, const gchar *name);
    -gboolean purple_media_manager_register_element(PurpleMediaManager *manager,
    - PurpleMediaElementInfo *info);
    -gboolean purple_media_manager_unregister_element(PurpleMediaManager *manager,
    - const gchar *name);
    -gboolean purple_media_manager_set_active_element(PurpleMediaManager *manager,
    - PurpleMediaElementInfo *info);
    -PurpleMediaElementInfo *purple_media_manager_get_active_element(
    - PurpleMediaManager *manager, PurpleMediaElementType type);
    -
    -/**
    - * Reduces media formats supported by the video source to given set.
    - *
    - * Useful to force negotiation of smaller picture resolution more suitable for
    - * use with particular codec and communication protocol without rescaling.
    - *
    - * @param manager The media manager to set the media formats.
    - * @param caps Set of allowed media formats.
    - *
    - * @since 2.8.0
    - */
    -void purple_media_manager_set_video_caps(PurpleMediaManager *manager,
    - GstCaps *caps);
    -
    -/**
    - * Returns current set of media formats limiting the output from video source.
    - *
    - * @param manager The media manager to get the media formats from.
    - *
    - * @return @c GstCaps limiting the video source's formats.
    - *
    - * @since 2.8.0
    - */
    -GstCaps *purple_media_manager_get_video_caps(PurpleMediaManager *manager);
    -
    -gchar *purple_media_element_info_get_id(PurpleMediaElementInfo *info);
    -gchar *purple_media_element_info_get_name(PurpleMediaElementInfo *info);
    -PurpleMediaElementType purple_media_element_info_get_element_type(
    - PurpleMediaElementInfo *info);
    -GstElement *purple_media_element_info_call_create(
    - PurpleMediaElementInfo *info, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_GST_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,511 +0,0 @@
    -/**
    - * @file media.h Media 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_H_
    -#define _PURPLE_MEDIA_H_
    -
    -#include "media/candidate.h"
    -#include "media/codec.h"
    -#include "media/enum-types.h"
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA (purple_media_get_type())
    -#define PURPLE_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA, PurpleMedia))
    -#define PURPLE_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA, PurpleMediaClass))
    -#define PURPLE_IS_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA))
    -#define PURPLE_IS_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA))
    -#define PURPLE_MEDIA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA, PurpleMediaClass))
    -
    -/** An opaque structure representing a media call. */
    -typedef struct _PurpleMedia PurpleMedia;
    -
    -#include "signals.h"
    -#include "util.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Gets the media class's GType
    - *
    - * @return The media class's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_get_type(void);
    -
    -/**
    - * Gets a list of session IDs.
    - *
    - * @param media The media session from which to retrieve session IDs.
    - *
    - * @return GList of session IDs. The caller must free the list.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_get_session_ids(PurpleMedia *media);
    -
    -/**
    - * Gets the PurpleAccount this media session is on.
    - *
    - * @param media The media session to retrieve the account from.
    - *
    - * @return The account retrieved.
    - *
    - * @since 2.6.0
    - */
    -PurpleAccount *purple_media_get_account(PurpleMedia *media);
    -
    -/**
    - * Gets the prpl data from the media session.
    - *
    - * @param media The media session to retrieve the prpl data from.
    - *
    - * @return The prpl data retrieved.
    - *
    - * @since 2.6.0
    - */
    -gpointer purple_media_get_prpl_data(PurpleMedia *media);
    -
    -/**
    - * Sets the prpl data on the media session.
    - *
    - * @param media The media session to set the prpl data on.
    - * @param prpl_data The data to set on the media session.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_set_prpl_data(PurpleMedia *media, gpointer prpl_data);
    -
    -/**
    - * Signals an error in the media session.
    - *
    - * @param media The media object to set the state on.
    - * @param error The format of the error message to send in the signal.
    - * @param ... The arguments to plug into the format.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_error(PurpleMedia *media, const gchar *error, ...);
    -
    -/**
    - * Ends all streams that match the given parameters
    - *
    - * @param media The media object with which to end streams.
    - * @param session_id The session to end streams on.
    - * @param participant The participant to end streams with.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_end(PurpleMedia *media, const gchar *session_id,
    - const gchar *participant);
    -
    -/**
    - * Signals different information about the given stream.
    - *
    - * @param media The media instance to containing the stream to signal.
    - * @param type The type of info being signaled.
    - * @param session_id The id of the session of the stream being signaled.
    - * @param participant The participant of the stream being signaled.
    - * @param local TRUE if the info originated locally, FALSE if on the remote end.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_stream_info(PurpleMedia *media, PurpleMediaInfoType type,
    - const gchar *session_id, const gchar *participant,
    - gboolean local);
    -
    -/**
    - * Sets various optional parameters of the media call.
    - *
    - * Currently supported are:
    - * - "sdes-cname" : The CNAME for the RTP sessions
    - * - "sdes-name" : Real name used to describe the source in SDES messages
    - * - "sdes-tool" : The TOOL to put in SDES messages
    - * - "sdes-email" : Email address to put in SDES messages
    - * - "sdes-location" : The LOCATION to put in SDES messages
    - * - "sdes-note" : The NOTE to put in SDES messages
    - * - "sdes-phone" : The PHONE to put in SDES messages
    - *
    - * @param media The media object to set the parameters on.
    - * @param num_params The number of parameters to pass
    - * @param params Array of @c GParameter to pass
    - *
    - * @since 2.8.0
    - */
    -void purple_media_set_params(PurpleMedia *media,
    - guint num_params, GParameter *params);
    -
    -/**
    - * Gets the list of optional parameters supported by the media backend.
    - *
    - * The list is owned by the @c PurpleMedia internals and should NOT be freed.
    - *
    - * @param media The media object
    - *
    - * @return NULL-terminated array of names of supported parameters.
    - *
    - * @since 2.8.0
    - */
    -const gchar **purple_media_get_available_params(PurpleMedia *media);
    -
    -/**
    - * Checks if given optional parameter is supported by the media backend.
    - *
    - * @param media The media object
    - * @param param name of parameter
    - *
    - * @return @c TRUE if backend recognizes the parameter, @c FALSE otherwise.
    - *
    - * @since 2.8.0
    - */
    -gboolean purple_media_param_is_supported(PurpleMedia *media, const gchar *param);
    -
    -/**
    - * Adds a stream to a session.
    - *
    - * It only adds a stream to one audio session or video session as
    - * the @c sess_id must be unique between sessions.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to add the stream to.
    - * @param who The name of the remote user to add the stream for.
    - * @param type The type of stream to create.
    - * @param initiator Whether or not the local user initiated the stream.
    - * @param transmitter The transmitter to use for the stream.
    - * @param num_params The number of parameters to pass to Farsight.
    - * @param params The parameters to pass to Farsight.
    - *
    - * @return @c TRUE The stream was added successfully, @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
    - const gchar *who, PurpleMediaSessionType type,
    - gboolean initiator, const gchar *transmitter,
    - guint num_params, GParameter *params);
    -
    -/**
    - * Gets the session type from a session
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to get the type from.
    - *
    - * @return The retreived session type.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaSessionType purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id);
    -
    -/**
    - * Gets the PurpleMediaManager this media session is a part of.
    - *
    - * @param media The media object to get the manager instance from.
    - *
    - * @return The PurpleMediaManager instance retrieved.
    - *
    - * @since 2.6.0
    - */
    -struct _PurpleMediaManager *purple_media_get_manager(PurpleMedia *media);
    -
    -/**
    - * Gets the codecs from a session.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to get the codecs from.
    - *
    - * @return The retreieved codecs.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_get_codecs(PurpleMedia *media, const gchar *sess_id);
    -
    -/**
    - * Adds remote candidates to the stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session find the stream in.
    - * @param participant The name of the remote user to add the candidates for.
    - * @param remote_candidates The remote candidates to add.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_add_remote_candidates(PurpleMedia *media,
    - const gchar *sess_id,
    - const gchar *participant,
    - GList *remote_candidates);
    -
    -/**
    - * Gets the local candidates from a stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to find the stream in.
    - * @param participant The name of the remote user to get the candidates from.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_get_local_candidates(PurpleMedia *media,
    - const gchar *sess_id,
    - const gchar *participant);
    -
    -/**
    - * Gets the active local candidates for the stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to find the stream in.
    - * @param participant The name of the remote user to get the active candidate
    - * from.
    - *
    - * @return The active candidates retrieved.
    - *
    - * @since 2.8.0
    - */
    -GList *purple_media_get_active_local_candidates(PurpleMedia *media,
    - const gchar *sess_id, const gchar *participant);
    -
    -/**
    - * Gets the active remote candidates for the stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to find the stream in.
    - * @param participant The name of the remote user to get the remote candidate
    - * from.
    - *
    - * @return The remote candidates retrieved.
    - *
    - * @since 2.8.0
    - */
    -GList *purple_media_get_active_remote_candidates(PurpleMedia *media,
    - const gchar *sess_id, const gchar *participant);
    -
    -/**
    - * Sets remote candidates from the stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session find the stream in.
    - * @param participant The name of the remote user to set the candidates from.
    - * @param codecs The list of remote codecs to set.
    - *
    - * @return @c TRUE The codecs were set successfully, or @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id,
    - const gchar *participant, GList *codecs);
    -
    -/**
    - * Returns whether or not the candidates for set of streams are prepared
    - *
    - * @param media The media object to find the remote user in.
    - * @param session_id The session id of the session to check.
    - * @param participant The remote user to check for.
    - *
    - * @return @c TRUE All streams for the given session_id/participant combination have candidates prepared, @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_candidates_prepared(PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -/**
    - * Sets the send codec for the a session.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to set the codec for.
    - * @param codec The codec to set the session to stream.
    - *
    - * @return @c TRUE The codec was successfully changed, or @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_set_send_codec(PurpleMedia *media, const gchar *sess_id, PurpleMediaCodec *codec);
    -
    -/**
    - * Sets the encryption parameters of our media in the session.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to set parameters of.
    - * @param cipher The cipher to use to encrypt our media in the session.
    - * @param auth The algorithm to use to compute authentication codes for our
    - * media frames.
    - * @param key The encryption key.
    - * @param key_len Byte length of the encryption key.
    - *
    - * @since 2.11.0
    - */
    -gboolean purple_media_set_encryption_parameters(PurpleMedia *media,
    - const gchar *sess_id, const gchar *cipher,
    - const gchar *auth, const gchar *key, gsize key_len);
    -
    -/**
    - * Sets the decryption parameters for a session participant's media.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to set parameters of.
    - * @param participant The participant of the session to set parameters of.
    - * @param cipher The cipher to use to decrypt media coming from this session's
    - * participant.
    - * @param auth The algorithm to use for authentication of the media coming
    - * from the session's participant.
    - * @param key The decryption key.
    - * @param key_len Byte length of the decryption key.
    - *
    - * @since 2.11.0
    - */
    -gboolean purple_media_set_decryption_parameters(PurpleMedia *media,
    - const gchar *sess_id, const gchar *participant,
    - const gchar *cipher, const gchar *auth,
    - const gchar *key, gsize key_len);
    -
    -/**
    - * Gets whether a session's codecs are ready to be used.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to check.
    - *
    - * @return @c TRUE The codecs are ready, or @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_codecs_ready(PurpleMedia *media, const gchar *sess_id);
    -
    -/**
    - * Sets the rtcp-mux option for the stream.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session find the stream in.
    - * @param participant The name of the remote user to set the rtcp-mux for.
    - * @paran send_rtcp_mux Whether to enable the rtcp-mux option
    - *
    - * @return @c TRUE RTCP-Mux was set successfully, or @c FALSE otherwise.
    - */
    -gboolean purple_media_set_send_rtcp_mux(PurpleMedia *media,
    - const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    -
    -/**
    - * Gets whether the local user is the conference/session/stream's initiator.
    - *
    - * @param media The media instance to find the session in.
    - * @param sess_id The session id of the session to check.
    - * @param participant The participant of the stream to check.
    - *
    - * @return TRUE if the local user is the stream's initator, else FALSE.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_is_initiator(PurpleMedia *media,
    - const gchar *sess_id, const gchar *participant);
    -
    -/**
    - * Gets whether a streams selected have been accepted.
    - *
    - * @param media The media object to find the session in.
    - * @param sess_id The session id of the session to check.
    - * @param participant The participant to check.
    - *
    - * @return @c TRUE The selected streams have been accepted, or @c FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_accepted(PurpleMedia *media, const gchar *sess_id,
    - const gchar *participant);
    -
    -/**
    - * Sets the input volume of all the selected sessions.
    - *
    - * @param media The media object the sessions are in.
    - * @param session_id The session to select (if any).
    - * @param level The level to set the volume to.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_set_input_volume(PurpleMedia *media, const gchar *session_id, double level);
    -
    -/**
    - * Sets the output volume of all the selected streams.
    - *
    - * @param media The media object the streams are in.
    - * @param session_id The session to limit the streams to (if any).
    - * @param participant The participant to limit the streams to (if any).
    - * @param level The level to set the volume to.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_set_output_volume(PurpleMedia *media, const gchar *session_id,
    - const gchar *participant, double level);
    -
    -/**
    - * Sets a video output window for the given session/stream.
    - *
    - * @param media The media instance to set the output window on.
    - * @param session_id The session to set the output window on.
    - * @param participant Optionally, the participant to set the output window on.
    - * @param window_id The window id use for embedding the video in.
    - *
    - * @return An id to reference the output window.
    - *
    - * @since 2.6.0
    - */
    -gulong purple_media_set_output_window(PurpleMedia *media,
    - const gchar *session_id, const gchar *participant,
    - gulong window_id);
    -
    -/**
    - * Removes all output windows from a given media session.
    - *
    - * @param media The instance to remove all output windows from.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_remove_output_windows(PurpleMedia *media);
    -
    -/**
    - * Sends a DTMF signal out-of-band.
    - *
    - * @param media The media instance to send a DTMF signal to.
    - * @param sess_id The session id of the session to send the DTMF signal on.
    - * @param dtmf The character representing the DTMF in the range [0-9#*A-D].
    - * @param volume The power level expressed in dBm0 after dropping the sign
    - * in the range of 0 to 63. A larger value represents a lower volume.
    - * @param duration The duration of the tone in milliseconds.
    - *
    - * @since 2.11
    - */
    -gboolean purple_media_send_dtmf(PurpleMedia *media, const gchar *session_id,
    - gchar dtmf, guint8 volume, guint16 duration);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/backend-iface.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,288 +0,0 @@
    -/**
    - * @file backend-iface.h Interface for media backends
    - * @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
    - */
    -
    -#ifndef _MEDIA_BACKEND_IFACE_H_
    -#define _MEDIA_BACKEND_IFACE_H_
    -
    -#include "codec.h"
    -#include "enum-types.h"
    -
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_BACKEND (purple_media_backend_get_type())
    -#define PURPLE_IS_MEDIA_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_BACKEND))
    -#define PURPLE_MEDIA_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_BACKEND, PurpleMediaBackend))
    -#define PURPLE_MEDIA_BACKEND_GET_INTERFACE(inst)(G_TYPE_INSTANCE_GET_INTERFACE((inst), PURPLE_TYPE_MEDIA_BACKEND, PurpleMediaBackendIface))
    -
    -/** A placeholder to represent any media backend */
    -typedef struct _PurpleMediaBackend PurpleMediaBackend;
    -/** A structure to derive media backends from. */
    -typedef struct _PurpleMediaBackendIface PurpleMediaBackendIface;
    -
    -struct _PurpleMediaBackendIface
    -{
    - GTypeInterface parent_iface; /**< The parent iface class */
    -
    - /** Implementable functions called with purple_media_backend_* */
    - gboolean (*add_stream) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *who,
    - PurpleMediaSessionType type, gboolean initiator,
    - const gchar *transmitter,
    - guint num_params, GParameter *params);
    - void (*add_remote_candidates) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - GList *remote_candidates);
    - gboolean (*codecs_ready) (PurpleMediaBackend *self,
    - const gchar *sess_id);
    - GList *(*get_codecs) (PurpleMediaBackend *self,
    - const gchar *sess_id);
    - GList *(*get_local_candidates) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant);
    - gboolean (*set_remote_codecs) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - GList *codecs);
    - gboolean (*set_send_codec) (PurpleMediaBackend *self,
    - const gchar *sess_id, PurpleMediaCodec *codec);
    - gboolean (*set_encryption_parameters) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *cipher,
    - const gchar *auth, const gchar *key, gsize key_len);
    - gboolean (*set_decryption_parameters) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - const gchar *cipher, const gchar *auth,
    - const gchar *key, gsize key_len);
    - void (*set_params) (PurpleMediaBackend *self,
    - guint num_params, GParameter *params);
    - const gchar **(*get_available_params) (void);
    - gboolean (*send_dtmf) (PurpleMediaBackend *self,
    - const gchar *sess_id, gchar dtmf, guint8 volume,
    - guint16 duration);
    - gboolean (*set_send_rtcp_mux) (PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    -};
    -
    -/**
    - * Gets the media backend's GType.
    - *
    - * @return The media backend's GType.
    - *
    - * @since 2.7.0
    - */
    -GType purple_media_backend_get_type(void);
    -
    -/**
    - * Creates and adds a stream to the media backend.
    - *
    - * @param self The backend to add the stream to.
    - * @param sess_id The session id of the stream to add.
    - * @param who The remote participant of the stream to add.
    - * @param type The media type and direction of the stream to add.
    - * @param initiator True if the local user initiated the stream.
    - * @param transmitter The string id of the tranmsitter to use.
    - * @param num_params The number of parameters in the param parameter.
    - * @param params The additional parameters to pass when creating the stream.
    - *
    - * @return True if the stream was successfully created, othewise False.
    - *
    - * @since 2.7.0
    - */
    -gboolean purple_media_backend_add_stream(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *who,
    - PurpleMediaSessionType type, gboolean initiator,
    - const gchar *transmitter,
    - guint num_params, GParameter *params);
    -
    -/**
    - * Add remote candidates to a stream.
    - *
    - * @param self The backend the stream is in.
    - * @param sess_id The session id associated with the stream.
    - * @param participant The participant associated with the stream.
    - * @param remote_candidates The list of remote candidates to add.
    - *
    - * @since 2.7.0
    - */
    -void purple_media_backend_add_remote_candidates(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - GList *remote_candidates);
    -
    -/**
    - * Get whether or not a session's codecs are ready.
    - *
    - * A codec is ready if all of the attributes and additional
    - * parameters have been collected.
    - *
    - * @param self The media backend the session is in.
    - * @param sess_id The session id of the session to check.
    - *
    - * @return True if the codecs are ready, otherwise False.
    - *
    - * @since 2.7.0
    - */
    -gboolean purple_media_backend_codecs_ready(PurpleMediaBackend *self,
    - const gchar *sess_id);
    -
    -/**
    - * Gets the codec intersection list for a session.
    - *
    - * The intersection list consists of all codecs that are compatible
    - * between the local and remote software.
    - *
    - * @param self The media backend the session is in.
    - * @param sess_id The session id of the session to use.
    - *
    - * @return The codec intersection list.
    - *
    - * @since 2.7.0
    - */
    -GList *purple_media_backend_get_codecs(PurpleMediaBackend *self,
    - const gchar *sess_id);
    -
    -/**
    - * Gets the list of local candidates for a stream.
    - *
    - * @param self The media backend the stream is in.
    - * @param sess_id The session id associated with the stream.
    - * @param particilant The participant associated with the stream.
    - *
    - * @return The list of local candidates.
    - *
    - * @since 2.7.0
    - */
    -GList *purple_media_backend_get_local_candidates(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant);
    -
    -/**
    - * Sets the remote codecs on a stream.
    - *
    - * @param self The media backend the stream is in.
    - * @param sess_id The session id the stream is associated with.
    - * @param participant The participant the stream is associated with.
    - * @param codecs The list of remote codecs to set.
    - *
    - * @return True if the remote codecs were set successfully, otherwise False.
    - *
    - * @since 2.7.0
    - */
    -gboolean purple_media_backend_set_remote_codecs(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - GList *codecs);
    -
    -/**
    - * Sets which codec format to send media content in for a session.
    - *
    - * @param self The media backend the session is in.
    - * @param sess_id The session id of the session to set the codec for.
    - * @param codec The codec to set.
    - *
    - * @return True if set successfully, otherwise False.
    - *
    - * @since 2.7.0
    - */
    -gboolean purple_media_backend_set_send_codec(PurpleMediaBackend *self,
    - const gchar *sess_id, PurpleMediaCodec *codec);
    -
    -/**
    - * Sets the encryption parameters of our media in the session.
    - *
    - * @param self The media backend the session is in.
    - * @param sess_id The session id of the session to set parameters of.
    - * @param cipher The cipher to use to encrypt our media in the session.
    - * @param auth The algorithm to use to compute authentication codes for our
    - * media frames.
    - * @param key The encryption key.
    - * @param key_len Byte length of the encryption key.
    - *
    - * @since 2.11.0
    - */
    -gboolean purple_media_backend_set_encryption_parameters(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *cipher,
    - const gchar *auth, const gchar *key, gsize key_len);
    -
    -/**
    - * Sets the decryption parameters for a session participant's media.
    - *
    - * @param self The media backend the session is in.
    - * @param sess_id The session id of the session to set parameters of.
    - * @param participant The participant of the session to set parameters of.
    - * @param cipher The cipher to use to decrypt media coming from this session's
    - * participant.
    - * @param auth The algorithm to use for authentication of the media coming
    - * from the session's participant.
    - * @param key The decryption key.
    - * @param key_len Byte length of the decryption key.
    - *
    - * @since 2.11.0
    - */
    -gboolean purple_media_backend_set_decryption_parameters(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant,
    - const gchar *cipher, const gchar *auth,
    - const gchar *key, gsize key_len);
    -
    -/**
    - * Sets various optional parameters of the media backend.
    - *
    - * @param self The media backend to set the parameters on.
    - * @param num_params The number of parameters to pass to backend
    - * @param params Array of @c GParameter to pass to backend
    - *
    - * @since 2.8.0
    - */
    -void purple_media_backend_set_params(PurpleMediaBackend *self,
    - guint num_params, GParameter *params);
    -
    -/**
    - * Gets the list of optional parameters supported by the media backend.
    - *
    - * The list should NOT be freed.
    - *
    - * @param self The media backend
    - *
    - * @return NULL-terminated array of names of supported parameters.
    - *
    - * @since 2.8.0
    - */
    -const gchar **purple_media_backend_get_available_params(PurpleMediaBackend *self);
    -
    -/**
    - * purple_media_backend_set_send_rtcp_mux:
    - * @self: The media backend the session is in.
    - * @sess_id: The session id of the session to set the rtcp-mux option to
    - * @participant: The participant the stream is associated with.
    - * @send_rtcp_mux: Whether or not to enable rtcp-mux
    - *
    - * Controls whether or not the RTCP should be muxed with the RTP
    - *
    - * Returns: True if set successfully, otherwise False.
    - */
    -gboolean purple_media_backend_set_send_rtcp_mux(PurpleMediaBackend *self,
    - const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    -
    -
    -G_END_DECLS
    -
    -#endif /* _MEDIA_BACKEND_IFACE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/candidate.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,252 +0,0 @@
    -/**
    - * @file candidate.h Candidate for Media 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_CANDIDATE_H_
    -#define _PURPLE_MEDIA_CANDIDATE_H_
    -
    -#include "enum-types.h"
    -
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_CANDIDATE (purple_media_candidate_get_type())
    -#define PURPLE_IS_MEDIA_CANDIDATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CANDIDATE))
    -#define PURPLE_IS_MEDIA_CANDIDATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CANDIDATE))
    -#define PURPLE_MEDIA_CANDIDATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    -#define PURPLE_MEDIA_CANDIDATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    -#define PURPLE_MEDIA_CANDIDATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    -
    -/** An opaque structure representing a network candidate (IP Address and port pair). */
    -typedef struct _PurpleMediaCandidate PurpleMediaCandidate;
    -
    -/**
    - * Gets the type of the media candidate structure.
    - *
    - * @return The media canditate's GType
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_candidate_get_type(void);
    -
    -/**
    - * Creates a PurpleMediaCandidate instance.
    - *
    - * @param foundation The foundation of the candidate.
    - * @param component_id The component this candidate is for.
    - * @param type The type of candidate.
    - * @param proto The protocol this component is for.
    - * @param ip The IP address of this component.
    - * @param port The network port.
    - *
    - * @return The newly created PurpleMediaCandidate instance.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaCandidate *purple_media_candidate_new(
    - const gchar *foundation, guint component_id,
    - PurpleMediaCandidateType type,
    - PurpleMediaNetworkProtocol proto,
    - const gchar *ip, guint port);
    -
    -/**
    - * Copies a PurpleMediaCandidate.
    - *
    - * @param candidate The candidate to copy.
    - *
    - * @return The copy of the PurpleMediaCandidate.
    - *
    - * @since 2.7.0
    - */
    -PurpleMediaCandidate *purple_media_candidate_copy(
    - PurpleMediaCandidate *candidate);
    -
    -/**
    - * Copies a GList of PurpleMediaCandidate and its contents.
    - *
    - * @param candidates The list of candidates to be copied.
    - *
    - * @return The copy of the GList.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_candidate_list_copy(GList *candidates);
    -
    -/**
    - * Frees a GList of PurpleMediaCandidate and its contents.
    - *
    - * @param candidates The list of candidates to be freed.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_candidate_list_free(GList *candidates);
    -
    -/**
    - * Gets the foundation (identifier) from the candidate.
    - *
    - * @param candidate The candidate to get the foundation from.
    - *
    - * @return The foundation.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_candidate_get_foundation(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the component id (rtp or rtcp)
    - *
    - * @param candidate The candidate to get the compnent id from.
    - *
    - * @return The component id.
    - *
    - * @since 2.6.0
    - */
    -guint purple_media_candidate_get_component_id(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the IP address.
    - *
    - * @param candidate The candidate to get the IP address from.
    - *
    - * @return The IP address.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_candidate_get_ip(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the port.
    - *
    - * @param candidate The candidate to get the port from.
    - *
    - * @return The port.
    - *
    - * @since 2.6.0
    - */
    -guint16 purple_media_candidate_get_port(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the base (internal) IP address.
    - *
    - * This can be NULL.
    - *
    - * @param candidate The candidate to get the base IP address from.
    - *
    - * @return The base IP address.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_candidate_get_base_ip(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the base (internal) port.
    - *
    - * Invalid if the base IP is NULL.
    - *
    - * @param candidate The candidate to get the base port.
    - *
    - * @return The base port.
    - *
    - * @since 2.6.0
    - */
    -guint16 purple_media_candidate_get_base_port(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the protocol (TCP or UDP).
    - *
    - * @param candidate The candidate to get the protocol from.
    - *
    - * @return The protocol.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaNetworkProtocol purple_media_candidate_get_protocol(
    - PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the priority.
    - *
    - * @param candidate The candidate to get the priority from.
    - *
    - * @return The priority.
    - *
    - * @since 2.6.0
    - */
    -guint32 purple_media_candidate_get_priority(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the candidate type.
    - *
    - * @param candidate The candidate to get the candidate type from.
    - *
    - * @return The candidate type.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaCandidateType purple_media_candidate_get_candidate_type(
    - PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the username.
    - *
    - * This can be NULL. It depends on the transmission type.
    - *
    - * @param The candidate to get the username from.
    - *
    - * @return The username.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_candidate_get_username(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the password.
    - *
    - * This can be NULL. It depends on the transmission type.
    - *
    - * @param The candidate to get the password from.
    - *
    - * @return The password.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_candidate_get_password(PurpleMediaCandidate *candidate);
    -
    -/**
    - * Gets the TTL.
    - *
    - * @param The candidate to get the TTL from.
    - *
    - * @return The TTL.
    - *
    - * @since 2.6.0
    - */
    -guint purple_media_candidate_get_ttl(PurpleMediaCandidate *candidate);
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_CANDIDATE_H_ */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/codec.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,214 +0,0 @@
    -/**
    - * @file codec.h Codec for Media 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_CODEC_H_
    -#define _PURPLE_MEDIA_CODEC_H_
    -
    -#include "enum-types.h"
    -
    -/** An opaque structure representing an audio or video codec. */
    -typedef struct _PurpleMediaCodec PurpleMediaCodec;
    -
    -#include "../util.h"
    -
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_CODEC (purple_media_codec_get_type())
    -#define PURPLE_IS_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CODEC))
    -#define PURPLE_IS_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CODEC))
    -#define PURPLE_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    -#define PURPLE_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    -#define PURPLE_MEDIA_CODEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    -
    -
    -/**
    - * Gets the type of the media codec structure.
    - *
    - * @return The media codec's GType
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_codec_get_type(void);
    -
    -/**
    - * Creates a new PurpleMediaCodec instance.
    - *
    - * @param id Codec identifier.
    - * @param encoding_name Name of the media type this encodes.
    - * @param media_type PurpleMediaSessionType of this codec.
    - * @param clock_rate The clock rate this codec encodes at, if applicable.
    - *
    - * @return The newly created PurpleMediaCodec.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaCodec *purple_media_codec_new(int id, const char *encoding_name,
    - PurpleMediaSessionType media_type, guint clock_rate);
    -
    -/**
    - * Gets the codec id.
    - *
    - * @param The codec to get the id from.
    - *
    - * @return The codec id.
    - *
    - * @since 2.6.0
    - */
    -guint purple_media_codec_get_id(PurpleMediaCodec *codec);
    -
    -/**
    - * Gets the encoding name.
    - *
    - * @param The codec to get the encoding name from.
    - *
    - * @return The encoding name.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_codec_get_encoding_name(PurpleMediaCodec *codec);
    -
    -/**
    - * Gets the clock rate.
    - *
    - * @param The codec to get the clock rate from.
    - *
    - * @return The clock rate.
    - *
    - * @since 2.6.0
    - */
    -guint purple_media_codec_get_clock_rate(PurpleMediaCodec *codec);
    -
    -/**
    - * Gets the number of channels.
    - *
    - * @param The codec to get the number of channels from.
    - *
    - * @return The number of channels.
    - *
    - * @since 2.6.0
    - */
    -guint purple_media_codec_get_channels(PurpleMediaCodec *codec);
    -
    -/**
    - * Gets a list of the optional parameters.
    - *
    - * The list consists of PurpleKeyValuePair's.
    - *
    - * @param The codec to get the optional parameters from.
    - *
    - * @return The list of optional parameters. The list is owned by the codec and
    - * should not be freed.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec);
    -
    -/**
    - * Adds an optional parameter to the codec.
    - *
    - * @param codec The codec to add the parameter to.
    - * @param name The name of the parameter to add.
    - * @param value The value of the parameter to add.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
    - const gchar *name, const gchar *value);
    -
    -/**
    - * Removes an optional parameter from the codec.
    - *
    - * @param codec The codec to remove the parameter from.
    - * @param param A pointer to the parameter to remove.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
    - PurpleKeyValuePair *param);
    -
    -/**
    - * Gets an optional parameter based on the values given.
    - *
    - * @param codec The codec to find the parameter in.
    - * @param name The name of the parameter to search for.
    - * @param value The value to search for or NULL.
    - *
    - * @return The value found or NULL.
    - *
    - * @since 2.6.0
    - */
    -PurpleKeyValuePair *purple_media_codec_get_optional_parameter(
    - PurpleMediaCodec *codec, const gchar *name,
    - const gchar *value);
    -
    -/**
    - * Copies a PurpleMediaCodec object.
    - *
    - * @param codec The codec to copy.
    - *
    - * @return The copy of the codec.
    - *
    - * @since 2.7.0
    - */
    -PurpleMediaCodec *purple_media_codec_copy(PurpleMediaCodec *codec);
    -
    -/**
    - * Copies a GList of PurpleMediaCodec and its contents.
    - *
    - * @param codecs The list of codecs to be copied.
    - *
    - * @return The copy of the GList.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_codec_list_copy(GList *codecs);
    -
    -/**
    - * Frees a GList of PurpleMediaCodec and its contents.
    - *
    - * @param codecs The list of codecs to be freed.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_codec_list_free(GList *codecs);
    -
    -/**
    - * Creates a string representation of the codec.
    - *
    - * @param codec The codec to create the string of.
    - *
    - * @return The new string representation.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_media_codec_to_string(const PurpleMediaCodec *codec);
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_CODEC_H_ */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/media/enum-types.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,168 +0,0 @@
    -/**
    - * @file enum-types.h Enum types for Media 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_ENUM_TYPES_H_
    -#define _PURPLE_MEDIA_ENUM_TYPES_H_
    -
    -#include <glib-object.h>
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_CANDIDATE_TYPE (purple_media_candidate_type_get_type())
    -#define PURPLE_MEDIA_TYPE_CAPS (purple_media_caps_get_type())
    -#define PURPLE_MEDIA_TYPE_INFO_TYPE (purple_media_info_type_get_type())
    -#define PURPLE_TYPE_MEDIA_NETWORK_PROTOCOL (purple_media_network_protocol_get_type())
    -#define PURPLE_TYPE_MEDIA_SESSION_TYPE (purple_media_session_type_get_type())
    -#define PURPLE_MEDIA_TYPE_STATE (purple_media_state_changed_get_type())
    -
    -/** Media candidate types */
    -typedef enum {
    - PURPLE_MEDIA_CANDIDATE_TYPE_HOST,
    - PURPLE_MEDIA_CANDIDATE_TYPE_SRFLX,
    - PURPLE_MEDIA_CANDIDATE_TYPE_PRFLX,
    - PURPLE_MEDIA_CANDIDATE_TYPE_RELAY,
    - PURPLE_MEDIA_CANDIDATE_TYPE_MULTICAST
    -} PurpleMediaCandidateType;
    -
    -/** Media caps */
    -typedef enum {
    - PURPLE_MEDIA_CAPS_NONE = 0,
    - PURPLE_MEDIA_CAPS_AUDIO = 1,
    - PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION = 1 << 1,
    - PURPLE_MEDIA_CAPS_VIDEO = 1 << 2,
    - PURPLE_MEDIA_CAPS_VIDEO_SINGLE_DIRECTION = 1 << 3,
    - PURPLE_MEDIA_CAPS_AUDIO_VIDEO = 1 << 4,
    - PURPLE_MEDIA_CAPS_MODIFY_SESSION = 1 << 5,
    - PURPLE_MEDIA_CAPS_CHANGE_DIRECTION = 1 << 6
    -} PurpleMediaCaps;
    -
    -/** Media component types */
    -typedef enum {
    - PURPLE_MEDIA_COMPONENT_NONE = 0,
    - PURPLE_MEDIA_COMPONENT_RTP = 1,
    - PURPLE_MEDIA_COMPONENT_RTCP = 2
    -} PurpleMediaComponentType;
    -
    -/** Media info types */
    -typedef enum {
    - PURPLE_MEDIA_INFO_HANGUP = 0,
    - PURPLE_MEDIA_INFO_ACCEPT,
    - PURPLE_MEDIA_INFO_REJECT,
    - PURPLE_MEDIA_INFO_MUTE,
    - PURPLE_MEDIA_INFO_UNMUTE,
    - PURPLE_MEDIA_INFO_PAUSE,
    - PURPLE_MEDIA_INFO_UNPAUSE,
    - PURPLE_MEDIA_INFO_HOLD,
    - PURPLE_MEDIA_INFO_UNHOLD
    -} PurpleMediaInfoType;
    -
    -/** Media network protocols */
    -typedef enum {
    - PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
    - PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_PASSIVE,
    - PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_ACTIVE,
    - PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_SO,
    -} PurpleMediaNetworkProtocol;
    -
    -/** Media session types */
    -typedef enum {
    - PURPLE_MEDIA_NONE = 0,
    - PURPLE_MEDIA_RECV_AUDIO = 1 << 0,
    - PURPLE_MEDIA_SEND_AUDIO = 1 << 1,
    - PURPLE_MEDIA_RECV_VIDEO = 1 << 2,
    - PURPLE_MEDIA_SEND_VIDEO = 1 << 3,
    - PURPLE_MEDIA_RECV_APPLICATION = 1 << 4,
    - PURPLE_MEDIA_SEND_APPLICATION = 1 << 5,
    - PURPLE_MEDIA_AUDIO = PURPLE_MEDIA_RECV_AUDIO | PURPLE_MEDIA_SEND_AUDIO,
    - PURPLE_MEDIA_VIDEO = PURPLE_MEDIA_RECV_VIDEO | PURPLE_MEDIA_SEND_VIDEO,
    - PURPLE_MEDIA_APPLICATION = PURPLE_MEDIA_RECV_APPLICATION |
    - PURPLE_MEDIA_SEND_APPLICATION
    -} PurpleMediaSessionType;
    -
    -/** Media state-changed types */
    -typedef enum {
    - PURPLE_MEDIA_STATE_NEW = 0,
    - PURPLE_MEDIA_STATE_CONNECTED,
    - PURPLE_MEDIA_STATE_END
    -} PurpleMediaState;
    -
    -/**
    - * Gets the media candidate type's GType
    - *
    - * @return The media candidate type's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_candidate_type_get_type(void);
    -
    -/**
    - * Gets the type of the media caps flags
    - *
    - * @return The media caps flags' GType
    - *
    - * @since 2.7.0
    - */
    -GType purple_media_caps_get_type(void);
    -
    -/**
    - * Gets the type of the info type enum
    - *
    - * @return The info type enum's GType
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_info_type_get_type(void);
    -
    -/**
    - * Gets the media network protocol's GType
    - *
    - * @return The media network protocol's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_network_protocol_get_type(void);
    -
    -/**
    - * Gets the media session type's GType
    - *
    - * @return The media session type's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_session_type_get_type(void);
    -
    -/**
    - * Gets the type of the state-changed enum
    - *
    - * @return The state-changed enum's GType
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_state_changed_get_type(void);
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_ENUM_TYPES_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/mediamanager.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,385 +0,0 @@
    -/**
    - * @file mediamanager.h Media Manager 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
    - */
    -
    -#ifndef _PURPLE_MEDIA_MANAGER_H_
    -#define _PURPLE_MEDIA_MANAGER_H_
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -
    -/** An opaque structure representing a group of (usually all) media calls. */
    -typedef struct _PurpleMediaManager PurpleMediaManager;
    -/** The GObject class structure of the PurpleMediaManager object. */
    -typedef struct _PurpleMediaManagerClass PurpleMediaManagerClass;
    -
    -#include "account.h"
    -#include "media.h"
    -
    -/**
    - * PurpleMediaAppDataCallbacks:
    - * @readable: Called when the stream has received data and is readable.
    - * @writable: Called when the stream has become writable or has stopped being
    - * writable.
    - *
    - * A set of callbacks that can be installed on an Application data session with
    - * purple_media_manager_set_application_data_callbacks()
    - *
    - * Once installed the @readable callback will get called as long as data is
    - * available to read, so the data must be read completely.
    - * The @writable callback will only be called when the writable state of the
    - * stream changes. The @writable argument defines whether the stream has
    - * become writable or stopped being writable.
    - *
    - */
    -typedef struct {
    - void (*readable) (PurpleMediaManager *manager, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant, gpointer user_data);
    - void (*writable) (PurpleMediaManager *manager, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant, gboolean writable,
    - gpointer user_data);
    -} PurpleMediaAppDataCallbacks;
    -
    -G_BEGIN_DECLS
    -
    -#define PURPLE_TYPE_MEDIA_MANAGER (purple_media_manager_get_type())
    -#define PURPLE_MEDIA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManager))
    -#define PURPLE_MEDIA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerClass))
    -#define PURPLE_IS_MEDIA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_MANAGER))
    -#define PURPLE_IS_MEDIA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_MANAGER))
    -#define PURPLE_MEDIA_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerClass))
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Media Manager API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Gets the media manager's GType.
    - *
    - * @return The media manager's GType.
    - *
    - * @since 2.6.0
    - */
    -GType purple_media_manager_get_type(void);
    -
    -/**
    - * Gets the "global" media manager object. It's created if it doesn't already exist.
    - *
    - * @return The "global" instance of the media manager object.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaManager *purple_media_manager_get(void);
    -
    -/**
    - * Creates a media session.
    - *
    - * @param manager The media manager to create the session under.
    - * @param account The account to create the session on.
    - * @param conference_type The conference type to feed into Farsight2.
    - * @param remote_user The remote user to initiate the session with.
    - * @param initiator TRUE if the local user is the initiator of this media call, FALSE otherwise.
    - *
    - * @return A newly created media session.
    - *
    - * @since 2.6.0
    - */
    -PurpleMedia *purple_media_manager_create_media(PurpleMediaManager *manager,
    - PurpleAccount *account,
    - const char *conference_type,
    - const char *remote_user,
    - gboolean initiator);
    -
    -/**
    - * Gets all of the media sessions.
    - *
    - * @param manager The media manager to get all of the sessions from.
    - *
    - * @return A list of all the media sessions.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_manager_get_media(PurpleMediaManager *manager);
    -
    -/**
    - * Gets all of the media sessions for a given account.
    - *
    - * @param manager The media manager to get the sessions from.
    - * @param account The account the sessions are on.
    - *
    - * @return A list of the media sessions on the given account.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_media_manager_get_media_by_account(
    - PurpleMediaManager *manager, PurpleAccount *account);
    -
    -/**
    - * Removes a media session from the media manager.
    - *
    - * @param manager The media manager to remove the media session from.
    - * @param media The media session to remove.
    - *
    - * @since 2.6.0
    - */
    -void
    -purple_media_manager_remove_media(PurpleMediaManager *manager,
    - PurpleMedia *media);
    -
    -/**
    - * Creates a private media session. A private media session is a
    - * media session which is private to the caller. It is meant to be
    - * used by plugins to create a media session that the front-end does
    - * not get notified about. It is useful especially for sessions with a
    - * type of PURPLE_MEDIA_APPLICATION which the front-end wouldn't know
    - * how to handle.
    - *
    - * @param manager The media manager to create the session under.
    - * @param account The account to create the session on.
    - * @param conference_type The conference type to feed into Farsight2.
    - * @param remote_user The remote user to initiate the session with.
    - * @param initiator TRUE if the local user is the initiator of this media
    - * call, FALSE otherwise.
    - *
    - * @return A newly created media session.
    - *
    - * @since 2.11.0
    - */
    -PurpleMedia *purple_media_manager_create_private_media(
    - PurpleMediaManager *manager,
    - PurpleAccount *account,
    - const char *conference_type,
    - const char *remote_user,
    - gboolean initiator);
    -
    -/**
    - * Gets all of the private media sessions.
    - *
    - * @param manager The media manager to get all of the sessions from.
    - *
    - * @return A list of all the private media sessions.
    - *
    - * @since 2.11.0
    - */
    -GList *purple_media_manager_get_private_media(PurpleMediaManager *manager);
    -
    -/**
    - * Gets all of the private media sessions for a given account.
    - *
    - * @param manager The media manager to get the sessions from.
    - * @param account The account the sessions are on.
    - *
    - * @return A list of the private media sessions on the given account.
    - *
    - * @since 2.11.0
    - */
    -GList *purple_media_manager_get_private_media_by_account(
    - PurpleMediaManager *manager, PurpleAccount *account);
    -
    -/**
    - * Signals that output windows should be created for the chosen stream.
    - *
    - * This shouldn't be called outside of mediamanager.c and media.c
    - *
    - * @param manager Manager the output windows are registered with.
    - * @param media Media session the output windows are registered for.
    - * @param session_id The session the output windows are registered with.
    - * @param participant The participant the output windows are registered with.
    - *
    - * @return TRUE if it succeeded, FALSE if it failed.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_manager_create_output_window(
    - PurpleMediaManager *manager, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -/**
    - * Registers a video output window to be created for a given stream.
    - *
    - * @param manager The manager to register the output window with.
    - * @param media The media instance to find the stream in.
    - * @param session_id The session the stream is associated with.
    - * @param participant The participant the stream is associated with.
    - * @param window_id The window ID to embed the video in.
    - *
    - * @return A unique ID to the registered output window, 0 if it failed.
    - *
    - * @since 2.6.0
    - */
    -gulong purple_media_manager_set_output_window(PurpleMediaManager *manager,
    - PurpleMedia *media, const gchar *session_id,
    - const gchar *participant, gulong window_id);
    -
    -/**
    - * Remove a previously registerd output window.
    - *
    - * @param manager The manager the output window was registered with.
    - * @param output_window_id The ID of the output window.
    - *
    - * @return TRUE if it found the output window and was successful, else FALSE.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_media_manager_remove_output_window(
    - PurpleMediaManager *manager, gulong output_window_id);
    -
    -/**
    - * Remove all output windows for a given conference/session/participant/stream.
    - *
    - * @param manager The manager the output windows were registered with.
    - * @param media The media instance the output windows were registered for.
    - * @param session_id The session the output windows were registered for.
    - * @param participant The participant the output windows were registered for.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_manager_remove_output_windows(
    - PurpleMediaManager *manager, PurpleMedia *media,
    - const gchar *session_id, const gchar *participant);
    -
    -/**
    - * Sets which media caps the UI supports.
    - *
    - * @param manager The manager to set the caps on.
    - * @param caps The caps to set.
    - *
    - * @since 2.6.0
    - */
    -void purple_media_manager_set_ui_caps(PurpleMediaManager *manager,
    - PurpleMediaCaps caps);
    -
    -/**
    - * Gets which media caps the UI supports.
    - *
    - * @param manager The manager to get caps from.
    - *
    - * @return caps The caps retrieved.
    - *
    - * @since 2.6.0
    - */
    -PurpleMediaCaps purple_media_manager_get_ui_caps(PurpleMediaManager *manager);
    -
    -/**
    - * Sets which media backend type media objects will use.
    - *
    - * @param manager The manager to set the caps on.
    - * @param backend_type The media backend type to use.
    - *
    - * @since 2.7.0
    - */
    -void purple_media_manager_set_backend_type(PurpleMediaManager *manager,
    - GType backend_type);
    -
    -/**
    - * Gets which media backend type media objects will use.
    - *
    - * @param manager The manager to get the media backend type from.
    - *
    - * @return The type of media backend type media objects will use.
    - *
    - * @since 2.7.0
    - */
    -GType purple_media_manager_get_backend_type(PurpleMediaManager *manager);
    -
    -/**
    - * purple_media_manager_set_application_data_callbacks:
    - * @manager: The manager to register the callbacks with.
    - * @media: The media instance to register the callbacks with.
    - * @session_id: The session to register the callbacks with.
    - * @participant: The participant to register the callbacks with.
    - * @callbacks: The callbacks to be set on the session.
    - * @user_data: a user_data argument for the callbacks.
    - * @notify: a destroy notify function.
    - *
    - * Set callbacks on a session to be called when the stream becomes writable
    - * or readable for media sessions of type #PURPLE_MEDIA_APPLICATION
    - */
    -void purple_media_manager_set_application_data_callbacks(
    - PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    - const gchar *participant, PurpleMediaAppDataCallbacks *callbacks,
    - gpointer user_data, GDestroyNotify notify);
    -
    -/**
    - * purple_media_manager_send_application_data:
    - * @manager: The manager to send data with.
    - * @media: The media instance to which the session belongs.
    - * @session_id: The session to send data to.
    - * @participant: The participant to send data to.
    - * @buffer: The buffer of data to send.
    - * @size: The size of @buffer
    - * @blocking: Whether to block until the data was send or not.
    - *
    - * Sends a buffer of data to a #PURPLE_MEDIA_APPLICATION session.
    - * If @blocking is set, unless an error occured, the function will not return
    - * until the data has been flushed into the network.
    - * If the stream is not writable, the data will be queued. It is the
    - * responsability of the user to stop sending data when the stream isn't
    - * writable anymore. It is also the responsability of the user to only start
    - * sending data after the stream has been configured correctly (encryption
    - * parameters for example).
    - *
    - * Returns: Number of bytes sent or -1 in case of error.
    - */
    -gint purple_media_manager_send_application_data (
    - PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    - const gchar *participant, gpointer buffer, guint size, gboolean blocking);
    -
    -/**
    - * purple_media_manager_receive_application_data:
    - * @manager: The manager to receive data with.
    - * @media: The media instance to which the session belongs.
    - * @session_id: The session to receive data from.
    - * @participant: The participant to receive data from.
    - * @buffer: The buffer to receive data into.
    - * @max_size: The max_size of @buffer
    - * @blocking: Whether to block until the buffer is entirely filled or return
    - * with currently available data.
    - *
    - * Receive a buffer of data from a #PURPLE_MEDIA_APPLICATION session.
    - * If @blocking is set, unless an error occured, the function will not return
    - * until @max_size bytes are read.
    - *
    - * Returns: Number of bytes received or -1 in case of error.
    - */
    -gint purple_media_manager_receive_application_data (
    - PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    - const gchar *participant, gpointer buffer, guint max_size,
    - gboolean blocking);
    -
    -/*}@*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -G_END_DECLS
    -
    -#endif /* _PURPLE_MEDIA_MANAGER_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/mime.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,218 +0,0 @@
    -/*
    - * 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.
    - */
    -
    -#ifndef _PURPLE_MIME_H
    -#define _PURPLE_MIME_H
    -
    -#include <glib.h>
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * @file mime.h
    - * @ingroup core
    - *
    - * Rudimentary parsing of multi-part MIME messages into more
    - * accessible structures.
    - */
    -
    -/**
    - * A MIME document.
    - */
    -typedef struct _PurpleMimeDocument PurpleMimeDocument;
    -
    -/**
    - * A part of a multipart MIME document.
    - */
    -typedef struct _PurpleMimePart PurpleMimePart;
    -
    -/**
    - * Allocate an empty MIME document.
    - */
    -PurpleMimeDocument *purple_mime_document_new(void);
    -
    -/**
    - * Frees memory used in a MIME document and all of its parts and fields
    - *
    - * @param doc The MIME document to free.
    - */
    -void purple_mime_document_free(PurpleMimeDocument *doc);
    -
    -/**
    - * Parse a MIME document from a NUL-terminated string.
    - *
    - * @param buf The NULL-terminated string containing the MIME-encoded data.
    - *
    - * @returns A MIME document.
    - */
    -PurpleMimeDocument *purple_mime_document_parse(const char *buf);
    -
    -/**
    - * Parse a MIME document from a string
    - *
    - * @param buf The string containing the MIME-encoded data.
    - * @param len Length of buf.
    - *
    - * @returns A MIME document.
    - */
    -PurpleMimeDocument *purple_mime_document_parsen(const char *buf, gsize len);
    -
    -/**
    - * Write (append) a MIME document onto a GString.
    - */
    -void purple_mime_document_write(PurpleMimeDocument *doc, GString *str);
    -
    -/**
    - * The list of fields in the header of a document
    - *
    - * @param doc The MIME document.
    - *
    - * @constreturn A list of strings indicating the fields (but not the values
    - * of the fields) in the header of doc.
    - */
    -GList *purple_mime_document_get_fields(PurpleMimeDocument *doc);
    -
    -/**
    - * Get the value of a specific field in the header of a document.
    - *
    - * @param doc The MIME document.
    - * @param field Case-insensitive field name.
    - *
    - * @returns Value associated with the indicated header field, or
    - * NULL if the field doesn't exist.
    - */
    -const char *purple_mime_document_get_field(PurpleMimeDocument *doc,
    - const char *field);
    -
    -/**
    - * Set or replace the value of a specific field in the header of a
    - * document.
    - *
    - * @param doc The MIME document.
    - * @param field Case-insensitive field name.
    - * @param value Value to associate with the indicated header field,
    - * of NULL to remove the field.
    - */
    -void purple_mime_document_set_field(PurpleMimeDocument *doc,
    - const char *field,
    - const char *value);
    -
    -/**
    - * The list of parts in a multipart document.
    - *
    - * @param doc The MIME document.
    - *
    - * @constreturn List of PurpleMimePart contained within doc.
    - */
    -GList *purple_mime_document_get_parts(PurpleMimeDocument *doc);
    -
    -/**
    - * Create and insert a new part into a MIME document.
    - *
    - * @param doc The new part's parent MIME document.
    - */
    -PurpleMimePart *purple_mime_part_new(PurpleMimeDocument *doc);
    -
    -
    -/**
    - * The list of fields in the header of a document part.
    - *
    - * @param part The MIME document part.
    - *
    - * @constreturn List of strings indicating the fields (but not the values
    - * of the fields) in the header of part.
    - */
    -GList *purple_mime_part_get_fields(PurpleMimePart *part);
    -
    -
    -/**
    - * Get the value of a specific field in the header of a document part.
    - *
    - * @param part The MIME document part.
    - * @param field Case-insensitive name of the header field.
    - *
    - * @returns Value of the specified header field, or NULL if the
    - * field doesn't exist.
    - */
    -const char *purple_mime_part_get_field(PurpleMimePart *part,
    - const char *field);
    -
    -/**
    - * Get the decoded value of a specific field in the header of a
    - * document part.
    - */
    -char *purple_mime_part_get_field_decoded(PurpleMimePart *part,
    - const char *field);
    -
    -/**
    - * Set or replace the value of a specific field in the header of a
    - * document.
    - *
    - * @param part The part of the MIME document.
    - * @param field Case-insensitive field name
    - * @param value Value to associate with the indicated header field,
    - * of NULL to remove the field.
    - */
    -void purple_mime_part_set_field(PurpleMimePart *part,
    - const char *field,
    - const char *value);
    -
    -/**
    - * Get the (possibly encoded) data portion of a MIME document part.
    - *
    - * @param part The MIME document part.
    - *
    - * @returns NULL-terminated data found in the document part
    - */
    -const char *purple_mime_part_get_data(PurpleMimePart *part);
    -
    -/**
    - * Get the data portion of a MIME document part, after attempting to
    - * decode it according to the content-transfer-encoding field. If the
    - * specified encoding method is not supported, this function will
    - * return NULL.
    - *
    - * @param part The MIME documemt part.
    - * @param data Buffer for the data.
    - * @param len The length of the buffer.
    - */
    -void purple_mime_part_get_data_decoded(PurpleMimePart *part,
    - guchar **data, gsize *len);
    -
    -/**
    - * Get the length of the data portion of a MIME document part.
    - *
    - * @param part The MIME document part.
    - * @returns Length of the data in the document part.
    - */
    -gsize purple_mime_part_get_length(PurpleMimePart *part);
    -
    -void purple_mime_part_set_data(PurpleMimePart *part, const char *data);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msg.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,325 +0,0 @@
    -/**
    - * @file msg.h Message functions
    - *
    - * 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
    - */
    -#ifndef MSN_MSG_H
    -#define MSN_MSG_H
    -
    -typedef struct _MsnMessage MsnMessage;
    -
    -/*
    -typedef enum
    -{
    - MSN_MSG_NORMAL,
    - MSN_MSG_SLP_SB,
    - MSN_MSG_SLP_DC
    -} MsnMsgType;
    -*/
    -
    -typedef enum
    -{
    - MSN_MSG_UNKNOWN,
    - MSN_MSG_TEXT,
    - MSN_MSG_TYPING,
    - MSN_MSG_CAPS,
    - MSN_MSG_SLP,
    - MSN_MSG_NUDGE
    -} MsnMsgType;
    -
    -typedef enum
    -{
    - MSN_MSG_ERROR_NONE, /**< No error. */
    - MSN_MSG_ERROR_TIMEOUT, /**< The message timedout. */
    - MSN_MSG_ERROR_NAK, /**< The message could not be sent. */
    - MSN_MSG_ERROR_SB, /**< The error comes from the switchboard. */
    - MSN_MSG_ERROR_UNKNOWN /**< An unknown error occurred. */
    -} MsnMsgErrorType;
    -
    -#include "command.h"
    -#include "session.h"
    -#include "transaction.h"
    -#include "user.h"
    -#include "slpmsg.h"
    -#include "slpmsg_part.h"
    -
    -typedef void (*MsnMsgCb)(MsnMessage *, void *data);
    -
    -#define MSG_BODY_DEM "\r\n\r\n"
    -#define MSG_LINE_DEM "\r\n"
    -
    -#define MSG_OIM_BODY_DEM "\n\n"
    -#define MSG_OIM_LINE_DEM "\n"
    -
    -/**
    - * A message.
    - */
    -struct _MsnMessage
    -{
    - guint ref_count; /**< The reference count. */
    -
    - MsnMsgType type;
    -
    - MsnSlpMessagePart *part;
    -
    - char *remote_user;
    - char flag;
    -
    - char *content_type;
    - char *charset;
    - char *body;
    - gsize body_len;
    - guint total_chunks; /**< How many chunks in this multi-part message */
    - guint received_chunks; /**< How many chunks we've received so far */
    -
    - GHashTable *header_table;
    - GList *header_list;
    -
    - gboolean ack_ref; /**< A flag that states if this message has
    - been ref'ed for using it in a callback. */
    -
    - MsnCommand *cmd;
    -
    - MsnMsgCb ack_cb; /**< The callback to call when we receive an ACK of this
    - message. */
    - MsnMsgCb nak_cb; /**< The callback to call when we receive a NAK of this
    - message. */
    - void *ack_data; /**< The data used by callbacks. */
    -
    - guint32 retries;
    -};
    -
    -/**
    - * Creates a new, empty message.
    - *
    - * @return A new message.
    - */
    -MsnMessage *msn_message_new(MsnMsgType type);
    -
    -/**
    - * Creates a new, empty MSNSLP message.
    - *
    - * @return A new MSNSLP message.
    - */
    -MsnMessage *msn_message_new_msnslp(void);
    -
    -/**
    - * Creates a new nudge message.
    - *
    - * @return A new nudge message.
    - */
    -MsnMessage *msn_message_new_nudge(void);
    -
    -/**
    - * Creates a new plain message.
    - *
    - * @return A new plain message.
    - */
    -MsnMessage *msn_message_new_plain(const char *message);
    -
    -/**
    - * Creates a new message based off a command.
    - *
    - * @param session The MSN session.
    - * @param cmd The command.
    - *
    - * @return The new message.
    - */
    -MsnMessage *msn_message_new_from_cmd(MsnSession *session, MsnCommand *cmd);
    -
    -/**
    - * Parses the payload of a message.
    - *
    - * @param msg The message.
    - * @param payload The payload.
    - * @param payload_len The length of the payload.
    - */
    -void msn_message_parse_payload(MsnMessage *msg, const char *payload,
    - size_t payload_len,
    - const char *line_dem,const char *body_dem);
    -
    -/**
    - * Increments the reference count on a message.
    - *
    - * @param msg The message.
    - *
    - * @return @a msg
    - */
    -MsnMessage *msn_message_ref(MsnMessage *msg);
    -
    -/**
    - * Decrements the reference count on a message.
    - *
    - * This will destroy the structure if the count hits 0.
    - *
    - * @param msg The message.
    - *
    - * @return @a msg, or @c NULL if the new count is 0.
    - */
    -void msn_message_unref(MsnMessage *msg);
    -
    -/**
    - * Generates the payload data of a message.
    - *
    - * @param msg The message.
    - * @param ret_size The returned size of the payload.
    - *
    - * @return The payload data of the message.
    - */
    -char *msn_message_gen_payload(MsnMessage *msg, size_t *ret_size);
    -
    -/**
    - * Sets the flag for an outgoing message.
    - *
    - * @param msg The message.
    - * @param flag The flag.
    - */
    -void msn_message_set_flag(MsnMessage *msg, char flag);
    -
    -/**
    - * Returns the flag for an outgoing message.
    - *
    - * @param msg The message.
    - *
    - * @return The flag.
    - */
    -char msn_message_get_flag(const MsnMessage *msg);
    -
    -/**
    - * Sets the binary content of the message.
    - *
    - * @param msg The message.
    - * @param data The binary data.
    - * @param len The length of the data.
    - */
    -void msn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len);
    -
    -/**
    - * Returns the binary content of the message.
    - *
    - * @param msg The message.
    - * @param len The returned length of the data.
    - *
    - * @return The binary data.
    - */
    -const void *msn_message_get_bin_data(const MsnMessage *msg, size_t *len);
    -
    -/**
    - * Sets the content type in a message.
    - *
    - * @param msg The message.
    - * @param type The content-type.
    - */
    -void msn_message_set_content_type(MsnMessage *msg, const char *type);
    -
    -/**
    - * Returns the content type in a message.
    - *
    - * @param msg The message.
    - *
    - * @return The content-type.
    - */
    -const char *msn_message_get_content_type(const MsnMessage *msg);
    -
    -/**
    - * Sets the charset in a message.
    - *
    - * @param msg The message.
    - * @param charset The charset.
    - */
    -void msn_message_set_charset(MsnMessage *msg, const char *charset);
    -
    -/**
    - * Returns the charset in a message.
    - *
    - * @param msg The message.
    - *
    - * @return The charset.
    - */
    -const char *msn_message_get_charset(const MsnMessage *msg);
    -
    -/**
    - * Sets a header in a message.
    - *
    - * @param msg The message.
    - * @param header The header name.
    - * @param value The header value.
    - */
    -void msn_message_set_header(MsnMessage *msg, const char *name,
    - const char *value);
    -
    -/**
    - * Returns the value of a header from a message.
    - *
    - * @param msg The message.
    - * @param header The header value.
    - *
    - * @return The value, or @c NULL if not found.
    - */
    -const char *msn_message_get_header_value(const MsnMessage *msg, const char *name);
    -
    -/**
    - * Parses the body and returns it in the form of a hashtable.
    - *
    - * @param msg The message.
    - *
    - * @return The resulting hashtable.
    - */
    -GHashTable *msn_message_get_hashtable_from_body(const MsnMessage *msg);
    -
    -void msn_message_show_readable(MsnMessage *msg, const char *info,
    - gboolean text_body);
    -
    -char *msn_message_to_string(MsnMessage *msg);
    -
    -void msn_plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -void msn_control_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -/**
    - * Processes peer to peer messages.
    - *
    - * @param cmdproc The command processor.
    - * @param msg The message.
    - */
    -void msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -/**
    - * Processes emoticon messages.
    - *
    - * @param cmdproc The command processor.
    - * @param msg The message.
    - */
    -void msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -void msn_datacast_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -/**
    - * Processes INVITE messages.
    - *
    - * @param cmdproc The command processor.
    - * @param msg The message.
    - */
    -void msn_invite_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -void msn_handwritten_msg(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -#endif /* MSN_MSG_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,158 +0,0 @@
    -/**
    - * @file msn.h The MSN protocol plugin
    - *
    - * 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
    - */
    -#ifndef MSN_H
    -#define MSN_H
    -
    -typedef enum
    -{
    - MSN_CAP_VIA_MOBILE = 0x0000001,
    - MSN_CAP_VIA_TEXAS = 0x0000002,
    - MSN_CAP_INK_GIF = 0x0000004,
    - MSN_CAP_INK_ISF = 0x0000008,
    - MSN_CAP_VIDEO_CHAT = 0x0000010,
    - MSN_CAP_PACKET = 0x0000020,
    - MSN_CAP_MOBILE_ON = 0x0000040,
    - MSN_CAP_WEB_WATCH = 0x0000080,
    - MSN_CAP_ACTIVITIES = 0x0000100,
    - MSN_CAP_VIA_WEBIM = 0x0000200,
    - MSN_CAP_MOBILE_DEV = 0x0000400,
    - MSN_CAP_VIA_FEDERATED = 0x0000800,
    - MSN_CAP_SPACE = 0x0001000,
    - MSN_CAP_MCE = 0x0002000,
    - MSN_CAP_DIRECTIM = 0x0004000,
    - MSN_CAP_WINKS = 0x0008000,
    - MSN_CAP_SEARCH = 0x0010000,
    - MSN_CAP_BOT = 0x0020000,
    - MSN_CAP_VOICEIM = 0x0040000,
    - MSN_CAP_SCHANNEL = 0x0080000,
    - MSN_CAP_SIP_INVITE = 0x0100000,
    - MSN_CAP_MULTI_VV = 0x0200000,
    - MSN_CAP_SDRIVE = 0x0400000,
    - MSN_CAP_PAGEMODE_MSG = 0x080000,
    - MSN_CAP_ONECARE = 0x1000000,
    - MSN_CAP_P2P_TURN = 0x2000000,
    - MSN_CAP_P2P_BOOTSTRAP_VIA_UUN = 0x4000000,
    - MSN_CAP_ALIASED = 0x8000000
    -} MsnClientCaps;
    -
    -typedef enum
    -{
    - MSN_EXT_CAP_SMS_ONLY = 0x1,
    - MSN_EXT_CAP_VOICE_OVER_MSNP = 0x2,
    - MSN_EXT_CAP_UUCP_SIP = 0x4,
    - MSN_EXT_CAP_APP_MSGS = 0x8,
    - MSN_EXT_CAP_RTC_VIDEO = 0x10,
    - MSN_EXT_CAP_P2PV2 = 0x20,
    - MSN_EXT_CAP_AUTH_WEBIM = 0x40,
    - MSN_EXT_CAP_1ON1_VIA_GROUP = 0x80,
    - MSN_EXT_CAP_OFFLINEIM = 0x100,
    - MSN_EXT_CAP_SHARING_VIDEO = 0x200,
    - MSN_EXT_CAP_NUDGE = 0x400,
    - MSN_EXT_CAP_CIRCLE_VOICEIM = 0x800,
    - MSN_EXT_CAP_SHARING = 0x1000,
    - MSN_EXT_CAP_P2P_MIXER_RELAY = 0x8000,
    - MSN_EXT_CAP_CONV_WINDOW_FT = 0x20000,
    - MSN_EXT_CAP_VIDEO_16x9 = 0x40000,
    - MSN_EXT_CAP_P2P_ENVELOPE = 0x80000,
    - MSN_EXT_CAP_YAHOOIM_DISABLE = 0x400000,
    - MSN_EXT_CAP_SIP_TUNNELv2 = 0x800000,
    - MSN_EXT_CAP_VOICE_CLIP_WMA = 0x1000000,
    - MSN_EXT_CAP_VOICE_CLIP_CIRCLEIM = 0x2000000,
    - MSN_EXT_CAP_SOCIAL_NEWS = 0x4000000,
    - MSN_EXT_CAP_CUSTOM_SMILEY = 0x8000000,
    - MSN_EXT_CAP_UTF8_MOODS = 0x10000000,
    - MSN_EXT_CAP_FTURN = 0x20000000,
    - MSN_EXT_CAP_P4_ACTIVITY = 0x40000000,
    - MSN_EXT_CAP_MUC = 0x80000000
    -} MsnClientExtCaps;
    -
    -typedef enum
    -{
    - MSN_CLIENT_VER_5_0 = 0x00,
    - MSN_CLIENT_VER_6_0 = 0x10, /* MSNC1 */
    - MSN_CLIENT_VER_6_1 = 0x20, /* MSNC2 */
    - MSN_CLIENT_VER_6_2 = 0x30, /* MSNC3 */
    - MSN_CLIENT_VER_7_0 = 0x40, /* MSNC4 */
    - MSN_CLIENT_VER_7_5 = 0x50, /* MSNC5 */
    - MSN_CLIENT_VER_8_0 = 0x60, /* MSNC6 */
    - MSN_CLIENT_VER_8_1 = 0x70, /* MSNC7 */
    - MSN_CLIENT_VER_8_5 = 0x80, /* MSNC8 */
    - MSN_CLIENT_VER_9_0 = 0x90, /* MSNC9 */
    - MSN_CLIENT_VER_14_0 = 0xA0, /* MSNC10 */
    - MSN_CLIENT_VER_15_0 = 0xB0 /* MSNC11 */
    -} MsnClientVerId;
    -
    -#include "internal.h"
    -
    -#include "session.h"
    -
    -#include "msg.h"
    -
    -#define MSN_BUF_LEN 8192
    -
    -/* Windows Live Messenger Server*/
    -#define MSN_SERVER "messenger.hotmail.com"
    -#define MSN_HTTPCONN_SERVER "gateway.messenger.hotmail.com"
    -#define MSN_PORT 1863
    -#define WLM_PROT_VER 18
    -
    -#define WLM_MAX_PROTOCOL 18
    -#define WLM_MIN_PROTOCOL 18
    -
    -#define MSN_TYPING_RECV_TIMEOUT 6
    -#define MSN_TYPING_SEND_TIMEOUT 4
    -
    -#define PROFILE_URL "http://spaces.live.com/profile.aspx?mem="
    -#define PHOTO_URL " contactparams:photopreauthurl=\""
    -
    -#define BUDDY_ALIAS_MAXLEN 387
    -
    -#define MSN_CAM_GUID "4BD96FC0-AB17-4425-A14A-439185962DC8"
    -#define MSN_CAM_REQUEST_GUID "1C9AA97E-9C05-4583-A3BD-908A196F1E92"
    -#define MSN_FT_GUID "5D3E02AB-6190-11D3-BBBB-00C04F795683"
    -#define MSN_OBJ_GUID "A4268EEC-FEC5-49E5-95C3-F126696BDBF6"
    -
    -#define MSN_CLIENTINFO \
    - "Client-Name: Purple/" VERSION "\r\n" \
    - "Chat-Logging: Y\r\n"
    -
    -/* Index into attention_types */
    -#define MSN_NUDGE 0
    -
    -#define MSN_CLIENT_ID_VERSION MSN_CLIENT_VER_9_0
    -#define MSN_CLIENT_ID_CAPABILITIES (MSN_CAP_PACKET|MSN_CAP_INK_GIF|MSN_CAP_VOICEIM)
    -#define MSN_CLIENT_ID_EXT_CAPS (0)
    -
    -#define MSN_CLIENT_ID \
    - ((MSN_CLIENT_ID_VERSION << 24) | \
    - (MSN_CLIENT_ID_CAPABILITIES))
    -
    -void
    -msn_set_public_alias(PurpleConnection *gc, const char *alias,
    - PurpleSetPublicAliasSuccessCallback success_cb,
    - PurpleSetPublicAliasFailureCallback failure_cb);
    -void msn_send_privacy(PurpleConnection *gc);
    -void msn_send_im_message(MsnSession *session, MsnMessage *msg);
    -
    -#endif /* MSN_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/msnutils.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,244 +0,0 @@
    -/**
    - * @file msnutils.h Utility functions
    - *
    - * 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
    - */
    -#ifndef MSN_UTILS_H
    -#define MSN_UTILS_H
    -
    -/*encode the str to RFC2047 style*/
    -char *msn_encode_mime(const char *str);
    -
    -/**
    - * Generate the Random GUID
    - */
    -char *rand_guid(void);
    -
    -/**
    - * Encodes the spaces in a string
    - *
    - * @param str The string to be encoded.
    - * @param buf The buffer to hold the encoded string.
    - * @param len The maximum length (including NUL) to put in @buf.
    - *
    - * @return Whether @str was able to fit in @buf.
    - */
    -gboolean
    -msn_encode_spaces(const char *str, char *buf, size_t len);
    -
    -/**
    - * Parses the MSN message formatting into a format compatible with Purple.
    - *
    - * @param mime The mime header with the formatting.
    - * @param pre_ret The returned prefix string.
    - * @param post_ret The returned postfix string.
    - *
    - * @return The new message.
    - */
    -void msn_parse_format(const char *mime, char **pre_ret, char **post_ret);
    -
    -/**
    - * Parses the Purple message formatting (html) into the MSN format.
    - *
    - * @param html The html message to format.
    - * @param attributes The returned attributes string.
    - * @param message The returned message string.
    - *
    - * @return The new message.
    - */
    -void msn_import_html(const char *html, char **attributes, char **message);
    -
    -/**
    - * Parses a socket string.
    - *
    - * @param str A host:port string.
    - * @param ret_host Return string value of the host.
    - * @param ret_port Return integer value of the port.
    - */
    -void msn_parse_socket(const char *str, char **ret_host, int *ret_port);
    -
    -/**
    - * Parses a user name
    - *
    - * @param str A network:username string.
    - * @param ret_user Return of the user's passport.
    - * @param ret_network Return of the user's network.
    - */
    -void msn_parse_user(const char *str, char **ret_user, int *ret_network);
    -
    -/**
    - * Verify if the email is a vaild passport.
    - *
    - * @param passport The email
    - *
    - * @return True if it is a valid passport, else FALSE
    - */
    -gboolean msn_email_is_valid(const char *passport);
    -
    -/**
    - * Handle MSN Challenge Computation
    - * This algorithm references
    - * http://imfreedom.org/wiki/index.php/MSN:NS/Challenges
    - *
    - * @param input Challenge input.
    - * @param output Callenge output.
    - */
    -void msn_handle_chl(char *input, char *output);
    -
    -/**
    - * Read a byte from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 8-bit byte
    - */
    -guint8 msn_read8(const char *buf);
    -
    -/**
    - * Read a little-endian short from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 16-bit short
    - */
    -guint16 msn_read16le(const char *buf);
    -
    -/**
    - * Read a big-endian short from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 16-bit short
    - */
    -guint16 msn_read16be(const char *buf);
    -
    -/**
    - * Read a little-endian int from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 32-bit int
    - */
    -guint32 msn_read32le(const char *buf);
    -
    -/**
    - * Read a big-endian int from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 32-bit int
    - */
    -guint32 msn_read32be(const char *buf);
    -
    -/**
    - * Read a little-endian long from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 64-bit long
    - */
    -guint64 msn_read64le(const char *buf);
    -
    -/**
    - * Read a big-endian long from a buffer
    - *
    - * @param buf Pointer to buffer.
    - *
    - * @return 64-bit long
    - */
    -guint64 msn_read64be(const char *buf);
    -
    -/**
    - * Write a byte to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data 8-bit byte.
    - */
    -void msn_write8(char *buf, guint8 data);
    -
    -/**
    - * Write a little-endian short to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data short.
    - */
    -void msn_write16le(char *buf, guint16 data);
    -
    -/**
    - * Write a big-endian short to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data short.
    - */
    -void msn_write16be(char *buf, guint16 data);
    -
    -/**
    - * Write a little-endian int to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data int.
    - */
    -void msn_write32le(char *buf, guint32 data);
    -
    -/**
    - * Write a big-endian int to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data int.
    - */
    -void msn_write32be(char *buf, guint32 data);
    -
    -/**
    - * Write a little-endian long to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data long.
    - */
    -void msn_write64le(char *buf, guint64 data);
    -
    -/**
    - * Write a big-endian long to a buffer
    - *
    - * @param buf Pointer to buffer.
    - * @param data short
    - */
    -void msn_write64be(char *buf, guint64 data);
    -
    -/**
    - * Same as above, but these increment the buf pointer.
    - */
    -#define msn_pop8(buf) msn_read8((buf+=1)-1)
    -#define msn_pop16le(buf) msn_read16le((buf+=2)-2)
    -#define msn_pop16be(buf) msn_read16be((buf+=2)-2)
    -#define msn_pop32le(buf) msn_read32le((buf+=4)-4)
    -#define msn_pop32be(buf) msn_read32be((buf+=4)-4)
    -#define msn_pop64le(buf) msn_read64le((buf+=8)-8)
    -#define msn_pop64be(buf) msn_read64be((buf+=8)-8)
    -#define msn_push8(buf, data) msn_write8(buf, data), buf+=1
    -#define msn_push16le(buf, data) msn_write16le(buf, data), buf+=2
    -#define msn_push16be(buf, data) msn_write16be(buf, data), buf+=2
    -#define msn_push32le(buf, data) msn_write32le(buf, data), buf+=4
    -#define msn_push32be(buf, data) msn_write32be(buf, data), buf+=4
    -#define msn_push64le(buf, data) msn_write64le(buf, data), buf+=8
    -#define msn_push64be(buf, data) msn_write64be(buf, data), buf+=8
    -
    -#endif /* MSN_UTILS_H */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/namespaces.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,112 +0,0 @@
    -/*
    - * purple - Jabber Protocol Plugin
    - *
    - * 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
    - *
    - */
    -
    -#ifndef PURPLE_JABBER_NAMESPACES_H_
    -#define PURPLE_JABBER_NAMESPACES_H_
    -
    -#define NS_XMPP_BIND "urn:ietf:params:xml:ns:xmpp-bind"
    -#define NS_XMPP_CLIENT "jabber:client"
    -#define NS_XMPP_SASL "urn:ietf:params:xml:ns:xmpp-sasl"
    -#define NS_XMPP_SESSION "urn:ietf:params:xml:ns:xmpp-session"
    -#define NS_XMPP_STANZAS "urn:ietf:params:xml:ns:xmpp-stanzas"
    -#define NS_XMPP_STREAMS "http://etherx.jabber.org/streams"
    -#define NS_XMPP_TLS "urn:ietf:params:xml:ns:xmpp-tls"
    -
    -/* XEP-0012 Last Activity (and XEP-0256 Last Activity in Presence) */
    -#define NS_LAST_ACTIVITY "jabber:iq:last"
    -
    -/* XEP-0030 Service Discovery */
    -#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info"
    -#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items"
    -
    -/* XEP-0047 IBB (In-band bytestreams) */
    -#define NS_IBB "http://jabber.org/protocol/ibb"
    -
    -/* XEP-0065 SOCKS5 Bytestreams */
    -#define NS_BYTESTREAMS "http://jabber.org/protocol/bytestreams"
    -
    -/* XEP-0066 Out of Band Data (OOB) */
    -#define NS_OOB_IQ_DATA "jabber:iq:oob"
    -#define NS_OOB_X_DATA "jabber:x:oob"
    -
    -/* XEP-0071 XHTML-IM (rich-text messages) */
    -#define NS_XHTML_IM "http://jabber.org/protocol/xhtml-im"
    -#define NS_XHTML "http://www.w3.org/1999/xhtml"
    -
    -/* XEP-0084 v0.12 User Avatar */
    -#define NS_AVATAR_0_12_DATA "http://www.xmpp.org/extensions/xep-0084.html#ns-data"
    -#define NS_AVATAR_0_12_METADATA "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata"
    -
    -/* XEP-0084 v1.1 User Avatar */
    -#define NS_AVATAR_1_1_DATA "urn:xmpp:avatar:data"
    -#define NS_AVATAR_1_1_METADATA "urn:xmpp:avatar:metadata"
    -
    -/* XEP-0096 SI File Transfer */
    -#define NS_SI_FILE_TRANSFER "http://jabber.org/protocol/si/profile/file-transfer"
    -
    -/* XEP-0124 Bidirectional-streams Over Synchronous HTTP (BOSH) */
    -#define NS_BOSH "http://jabber.org/protocol/httpbind"
    -
    -/* XEP-0191 Simple Communications Blocking */
    -#define NS_SIMPLE_BLOCKING "urn:xmpp:blocking"
    -
    -/* XEP-0199 Ping */
    -#define NS_PING "urn:xmpp:ping"
    -
    -/* XEP-0202 Entity Time */
    -#define NS_ENTITY_TIME "urn:xmpp:time"
    -
    -/* XEP-0203 Delayed Delivery (and legacy delayed delivery) */
    -#define NS_DELAYED_DELIVERY "urn:xmpp:delay"
    -#define NS_DELAYED_DELIVERY_LEGACY "jabber:x:delay"
    -
    -/* XEP-0206 XMPP over BOSH */
    -#define NS_XMPP_BOSH "urn:xmpp:xbosh"
    -
    -/* XEP-0224 Attention */
    -#define NS_ATTENTION "urn:xmpp:attention:0"
    -
    -/* XEP-0231 BoB (Bits of Binary) */
    -#define NS_BOB "urn:xmpp:bob"
    -
    -/* XEP-0237 Roster Versioning */
    -#define NS_ROSTER_VERSIONING "urn:xmpp:features:rosterver"
    -
    -/* XEP-0264 File Transfer Thumbnails (Thumbs) */
    -#define NS_THUMBS "urn:xmpp:thumbs:0"
    -
    -/* Google extensions */
    -#define NS_GOOGLE_CAMERA "http://www.google.com/xmpp/protocol/camera/v1"
    -#define NS_GOOGLE_VIDEO "http://www.google.com/xmpp/protocol/video/v1"
    -#define NS_GOOGLE_VOICE "http://www.google.com/xmpp/protocol/voice/v1"
    -#define NS_GOOGLE_JINGLE_INFO "google:jingleinfo"
    -
    -#define NS_GOOGLE_MAIL_NOTIFY "google:mail:notify"
    -#define NS_GOOGLE_ROSTER "google:roster"
    -
    -#define NS_GOOGLE_PROTOCOL_SESSION "http://www.google.com/xmpp/protocol/session"
    -#define NS_GOOGLE_SESSION "http://www.google.com/session"
    -#define NS_GOOGLE_SESSION_PHONE "http://www.google.com/session/phone"
    -#define NS_GOOGLE_SESSION_VIDEO "http://www.google.com/session/video"
    -
    -#endif /* PURPLE_JABBER_NAMESPACES_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/nat-pmp.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,77 +0,0 @@
    -/**
    - * @file nat-pmp.h NAT-PMP Implementation
    - * @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.
    - *
    - * Most code in nat-pmp.h copyright (C) 2007, R. Tyler Ballance, bleep, LLC.
    - * This file is distributed under the 3-clause (modified) BSD license:
    - * Redistribution and use in source and binary forms, with or without modification, are permitted
    - * provided that the following conditions are met:
    - *
    - * Redistributions of source code must retain the above copyright notice, this list of conditions and
    - * the following disclaimer.
    - * Neither the name of the bleep. LLC nor the names of its contributors may be used to endorse or promote
    - * products derived from this software without specific prior written permission.
    - *
    - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
    - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
    - * OF SUCH DAMAGE.
    - */
    -
    -#ifndef _PURPLE_NAT_PMP_H
    -#define _PURPLE_NAT_PMP_H
    -
    -#include <glib.h>
    -
    -#define PURPLE_PMP_LIFETIME 3600 /* 3600 seconds */
    -
    -typedef enum {
    - PURPLE_PMP_TYPE_UDP,
    - PURPLE_PMP_TYPE_TCP
    -} PurplePmpType;
    -
    -/**
    - * Initialize nat-pmp
    - */
    -void purple_pmp_init(void);
    -
    -/**
    - *
    - */
    -char *purple_pmp_get_public_ip(void);
    -
    -/**
    - * Remove the NAT-PMP mapping for a specified type on a specified port
    - *
    - * @param type The PurplePmpType
    - * @param privateport The private port on which we are listening locally
    - * @param publicport The public port on which we are expecting a response
    - * @param lifetime The lifetime of the mapping. It is recommended that this be PURPLE_PMP_LIFETIME.
    - *
    - * @returns TRUE if succesful; FALSE if unsuccessful
    - */
    -gboolean purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime);
    -
    -/**
    - * Remove the NAT-PMP mapping for a specified type on a specified port
    - *
    - * @param type The PurplePmpType
    - * @param privateport The private port on which the mapping was previously made
    - *
    - * @returns TRUE if succesful; FALSE if unsuccessful
    - */
    -gboolean purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport);
    -
    -#endif
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/network.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,359 +0,0 @@
    -/**
    - * @file network.h Network 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
    - */
    -#ifndef _PURPLE_NETWORK_H_
    -#define _PURPLE_NETWORK_H_
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Network API */
    -/**************************************************************************/
    -/*@{*/
    -
    -typedef struct _PurpleNetworkListenData PurpleNetworkListenData;
    -
    -typedef void (*PurpleNetworkListenCallback) (int listenfd, gpointer data);
    -
    -/**
    - * Converts a dot-decimal IP address to an array of unsigned
    - * chars. For example, converts 192.168.0.1 to a 4 byte
    - * array containing 192, 168, 0 and 1.
    - *
    - * @param ip An IP address in dot-decimal notiation.
    - * @return An array of 4 bytes containing an IP addresses
    - * equivalent to the given parameter, or NULL if
    - * the given IP address is invalid. This value
    - * is statically allocated and should not be
    - * freed.
    - */
    -const unsigned char *purple_network_ip_atoi(const char *ip);
    -
    -/**
    - * Sets the IP address of the local system in preferences. This
    - * is the IP address that should be used for incoming connections
    - * (file transfer, direct IM, etc.) and should therefore be
    - * publicly accessible.
    - *
    - * @param ip The local IP address.
    - */
    -void purple_network_set_public_ip(const char *ip);
    -
    -/**
    - * Returns the IP address of the local system set in preferences.
    - *
    - * This returns the value set via purple_network_set_public_ip().
    - * You probably want to use purple_network_get_my_ip() instead.
    - *
    - * @return The local IP address set in preferences.
    - */
    -const char *purple_network_get_public_ip(void);
    -
    -/**
    - * Returns the IP address of the local system.
    - *
    - * You probably want to use purple_network_get_my_ip() instead.
    - *
    - * @note The returned string is a pointer to a static buffer. If this
    - * function is called twice, it may be important to make a copy
    - * of the returned string.
    - *
    - * @param fd The fd to use to help figure out the IP, or else -1.
    - * @return The local IP address.
    - */
    -const char *purple_network_get_local_system_ip(int fd);
    -
    -/**
    - * Returns all IP addresses of the local system.
    - *
    - * @note The caller must free this list. If libpurple was built with
    - * support for it, this function also enumerates IPv6 addresses.
    - * @since 2.7.0
    - *
    - * @return A list of local IP addresses.
    - */
    -GList *purple_network_get_all_local_system_ips(void);
    -
    -/**
    - * Returns the IP address that should be used anywhere a
    - * public IP addresses is needed (listening for an incoming
    - * file transfer, etc).
    - *
    - * If the user has manually specified an IP address via
    - * preferences, then this IP is returned. Otherwise the
    - * IP address returned by purple_network_get_local_system_ip()
    - * is returned.
    - *
    - * @note The returned string is a pointer to a static buffer. If this
    - * function is called twice, it may be important to make a copy
    - * of the returned string.
    - *
    - * @param fd The fd to use to help figure out the IP, or -1.
    - * @return The local IP address to be used.
    - */
    -const char *purple_network_get_my_ip(int fd);
    -
    -/**
    - * Should calls to purple_network_listen() and purple_network_listen_range()
    - * map the port externally using NAT-PMP or UPnP?
    - * The default value is TRUE
    - *
    - * @param map_external Should the open port be mapped externally?
    - * @deprecated In 3.0.0 a boolean will be added to the functions mentioned
    - * above to perform the same function.
    - * @since 2.3.0
    - */
    -void purple_network_listen_map_external(gboolean map_external);
    -
    -/**
    - * Attempts to open a listening port ONLY on the specified port number.
    - * You probably want to use purple_network_listen_range() instead of this.
    - * This function is useful, for example, if you wanted to write a telnet
    - * server as a Purple plugin, and you HAD to listen on port 23. Why anyone
    - * would want to do that is beyond me.
    - *
    - * This opens a listening port. The caller will want to set up a watcher
    - * of type PURPLE_INPUT_READ on the fd returned in cb. It will probably call
    - * accept in the watcher callback, and then possibly remove the watcher and
    - * close the listening socket, and add a new watcher on the new socket accept
    - * returned.
    - *
    - * @param port The port number to bind to. Must be greater than 0.
    - * @param socket_type The type of socket to open for listening.
    - * This will be either SOCK_STREAM for TCP or SOCK_DGRAM for UDP.
    - * @param cb The callback to be invoked when the port to listen on is available.
    - * The file descriptor of the listening socket will be specified in
    - * this callback, or -1 if no socket could be established.
    - * @param cb_data extra data to be returned when cb is called
    - *
    - * @return A pointer to a data structure that can be used to cancel
    - * the pending listener, or NULL if unable to obtain a local
    - * socket to listen on.
    - */
    -PurpleNetworkListenData *purple_network_listen(unsigned short port,
    - int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data);
    -
    -/**
    - * \copydoc purple_network_listen
    - *
    - * Libpurple does not currently do any port mapping (stateful firewall hole
    - * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
    - * addresses, a mapping is done).
    - *
    - * @param socket_family The protocol family of the socket. This should be
    - * AF_INET for IPv4 or AF_INET6 for IPv6. IPv6 sockets
    - * may or may not be able to accept IPv4 connections
    - * based on the system configuration (use
    - * purple_socket_speaks_ipv4 to check). If an IPv6
    - * socket doesn't accept V4-mapped addresses, you will
    - * need a second listener to support both v4 and v6.
    - * @since 2.7.0
    - * @deprecated This function will be renamed to purple_network_listen in 3.0.0.
    - */
    -PurpleNetworkListenData *purple_network_listen_family(unsigned short port,
    - int socket_family, int socket_type, PurpleNetworkListenCallback cb,
    - gpointer cb_data);
    -
    -/**
    - * Opens a listening port selected from a range of ports. The range of
    - * ports used is chosen in the following manner:
    - * If a range is specified in preferences, these values are used.
    - * If a non-0 values are passed to the function as parameters, these
    - * values are used.
    - * Otherwise a port is chosen at random by the operating system.
    - *
    - * This opens a listening port. The caller will want to set up a watcher
    - * of type PURPLE_INPUT_READ on the fd returned in cb. It will probably call
    - * accept in the watcher callback, and then possibly remove the watcher and close
    - * the listening socket, and add a new watcher on the new socket accept
    - * returned.
    - *
    - * @param start The port number to bind to, or 0 to pick a random port.
    - * Users are allowed to override this arg in prefs.
    - * @param end The highest possible port in the range of ports to listen on,
    - * or 0 to pick a random port. Users are allowed to override this
    - * arg in prefs.
    - * @param socket_type The type of socket to open for listening.
    - * This will be either SOCK_STREAM for TCP or SOCK_DGRAM for UDP.
    - * @param cb The callback to be invoked when the port to listen on is available.
    - * The file descriptor of the listening socket will be specified in
    - * this callback, or -1 if no socket could be established.
    - * @param cb_data extra data to be returned when cb is called
    - *
    - * @return A pointer to a data structure that can be used to cancel
    - * the pending listener, or NULL if unable to obtain a local
    - * socket to listen on.
    - */
    -PurpleNetworkListenData *purple_network_listen_range(unsigned short start,
    - unsigned short end, int socket_type,
    - PurpleNetworkListenCallback cb, gpointer cb_data);
    -
    -/**
    - * \copydoc purple_network_listen_range
    - *
    - * Libpurple does not currently do any port mapping (stateful firewall hole
    - * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
    - * addresses, a mapping is done).
    - *
    - * @param socket_family The protocol family of the socket. This should be
    - * AF_INET for IPv4 or AF_INET6 for IPv6. IPv6 sockets
    - * may or may not be able to accept IPv4 connections
    - * based on the system configuration (use
    - * purple_socket_speaks_ipv4 to check). If an IPv6
    - * socket doesn't accept V4-mapped addresses, you will
    - * need a second listener to support both v4 and v6.
    - * @since 2.7.0
    - * @deprecated This function will be renamed to purple_network_listen_range
    - * in 3.0.0.
    - */
    -PurpleNetworkListenData *purple_network_listen_range_family(
    - unsigned short start, unsigned short end, int socket_family,
    - int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data);
    -
    -/**
    - * This can be used to cancel any in-progress listener connection
    - * by passing in the return value from either purple_network_listen()
    - * or purple_network_listen_range().
    - *
    - * @param listen_data This listener attempt will be cancelled and
    - * the struct will be freed.
    - */
    -void purple_network_listen_cancel(PurpleNetworkListenData *listen_data);
    -
    -/**
    - * Gets a port number from a file descriptor.
    - *
    - * @param fd The file descriptor. This should be a tcp socket. The current
    - * implementation probably dies on anything but IPv4. Perhaps this
    - * possible bug will inspire new and valuable contributors to Purple.
    - * @return The port number, in host byte order.
    - */
    -unsigned short purple_network_get_port_from_fd(int fd);
    -
    -/**
    - * Detects if there is an available network connection.
    - *
    - * @return TRUE if the network is available
    - */
    -gboolean purple_network_is_available(void);
    -
    -/**
    - * Makes purple_network_is_available() always return @c TRUE.
    - *
    - * This is what backs the --force-online command line argument in Pidgin,
    - * for example. This is useful for offline testing, especially when
    - * combined with nullprpl.
    - *
    - * @since 2.6.0
    - */
    -void purple_network_force_online(void);
    -
    -/**
    - * Get the handle for the network system
    - *
    - * @return the handle to the network system
    - */
    -void *purple_network_get_handle(void);
    -
    -/**
    - * Update the STUN server IP given the host name
    - * Will result in a DNS query being executed asynchronous
    - *
    - * @param stun_server The host name of the STUN server to set
    - * @since 2.6.0
    - */
    -void purple_network_set_stun_server(const gchar *stun_server);
    -
    -/**
    - * Get the IP address of the STUN server as a string representation
    - *
    - * @return the IP address
    - * @since 2.6.0
    - */
    -const gchar *purple_network_get_stun_ip(void);
    -
    -/**
    - * Update the TURN server IP given the host name
    - * Will result in a DNS query being executed asynchronous
    - *
    - * @param turn_server The host name of the TURN server to set
    - * @since 2.6.0
    - */
    -void purple_network_set_turn_server(const gchar *turn_server);
    -
    -/**
    - * Get the IP address of the TURN server as a string representation
    - *
    - * @return the IP address
    - * @since 2.6.0
    - */
    -const gchar *purple_network_get_turn_ip(void);
    -
    -/**
    - * Remove a port mapping (UPnP or NAT-PMP) associated with listening socket
    - *
    - * @param fd Socket to remove the port mapping for
    - * @since 2.6.0
    - */
    -void purple_network_remove_port_mapping(gint fd);
    -
    -/**
    - * Convert a UTF-8 domain name to ASCII in accordance with the IDNA
    - * specification. If libpurple is compiled without IDN support, this function
    - * copies the input into the output buffer.
    - *
    - * Because this function is used by DNS resolver child/threads, it uses no
    - * other libpurple API and is threadsafe.
    - *
    - * In general, a buffer of about 512 bytes is the appropriate size to use.
    - *
    - * @param in The hostname to be converted.
    - * @param out The output buffer where an allocated string will be returned.
    - * The caller is responsible for freeing this.
    - * @returns 0 on success, -1 if the out is NULL, or an error code
    - * that currently corresponds to the Idna_rc enum in libidn.
    - * @since 2.6.0
    - */
    -int purple_network_convert_idn_to_ascii(const gchar *in, gchar **out);
    -
    -/**
    - * Initializes the network subsystem.
    - */
    -void purple_network_init(void);
    -
    -/**
    - * Shuts down the network subsystem.
    - */
    -void purple_network_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_NETWORK_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/nexus.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,219 +0,0 @@
    -/**
    - * @file nexus.h MSN Nexus functions
    - *
    - * 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
    - */
    -#ifndef MSN_NEXUS_H
    -#define MSN_NEXUS_H
    -
    -#include "internal.h"
    -
    -typedef struct _MsnNexus MsnNexus;
    -typedef struct _MsnTicketToken MsnTicketToken;
    -
    -/* Index into ticket_tokens in nexus.c Keep updated! */
    -typedef enum
    -{
    - MSN_AUTH_MESSENGER = 0,
    - MSN_AUTH_MESSENGER_WEB = 1,
    - MSN_AUTH_CONTACTS = 2,
    - MSN_AUTH_LIVE_SECURE = 3,
    - MSN_AUTH_STORAGE = 4,
    - MSN_AUTH_WHATSNEW = 5
    -} MsnAuthDomains;
    -
    -#define MSN_SSO_SERVER "login.live.com"
    -#define SSO_POST_URL "/RST.srf"
    -
    -#define MSN_SSO_RST_TEMPLATE \
    -"<wst:RequestSecurityToken xmlns=\"http://schemas.xmlsoap.org/ws/2004/04/trust\" Id=\"RST%d\">"\
    - "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
    - "<wsp:AppliesTo xmlns=\"http://schemas.xmlsoap.org/ws/2002/12/policy\">"\
    - "<wsa:EndpointReference xmlns=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\">"\
    - "<wsa:Address>%s</wsa:Address>"\
    - "</wsa:EndpointReference>"\
    - "</wsp:AppliesTo>"\
    - "<wsse:PolicyReference xmlns=\"http://schemas.xmlsoap.org/ws/2003/06/secext\" URI=\"%s\"></wsse:PolicyReference>"\
    -"</wst:RequestSecurityToken>"
    -
    -#define MSN_SSO_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\
    -"<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\""\
    - " xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\""\
    - " xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\""\
    - " xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\""\
    - " xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\""\
    - " xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\""\
    - " xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\
    - "<Header>"\
    - "<ps:AuthInfo"\
    - " xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\""\
    - " Id=\"PPAuthInfo\">"\
    - "<ps:HostingApp>{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}</ps:HostingApp>"\
    - "<ps:BinaryVersion>4</ps:BinaryVersion>"\
    - "<ps:UIVersion>1</ps:UIVersion>"\
    - "<ps:Cookies></ps:Cookies>"\
    - "<ps:RequestParams>AQAAAAIAAABsYwQAAAAxMDMz</ps:RequestParams>"\
    - "</ps:AuthInfo>"\
    - "<wsse:Security>"\
    - "<wsse:UsernameToken Id=\"user\">"\
    - "<wsse:Username>%s</wsse:Username>"\
    - "<wsse:Password>%s</wsse:Password>"\
    - "</wsse:UsernameToken>"\
    - "</wsse:Security>"\
    - "</Header>"\
    - "<Body>"\
    - "<ps:RequestMultipleSecurityTokens"\
    - " xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\""\
    - " Id=\"RSTS\">"\
    - "<wst:RequestSecurityToken Id=\"RST0\">"\
    - "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
    - "<wsp:AppliesTo>"\
    - "<wsa:EndpointReference>"\
    - "<wsa:Address>http://Passport.NET/tb</wsa:Address>"\
    - "</wsa:EndpointReference>"\
    - "</wsp:AppliesTo>"\
    - "</wst:RequestSecurityToken>"\
    - "%s" /* Other RSTn tokens */\
    - "</ps:RequestMultipleSecurityTokens>"\
    - "</Body>"\
    -"</Envelope>"
    -
    -#define MSN_SSO_AUTHINFO_TEMPLATE \
    -"<ps:AuthInfo xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"PPAuthInfo\">"\
    - "<ps:HostingApp>{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}</ps:HostingApp>"\
    - "<ps:BinaryVersion>4</ps:BinaryVersion>"\
    - "<ps:UIVersion>1</ps:UIVersion>"\
    - "<ps:Cookies></ps:Cookies>"\
    - "<ps:RequestParams>AQAAAAIAAABsYwQAAAA0MTA1</ps:RequestParams>"\
    -"</ps:AuthInfo>"
    -/* Not sure what's editable here, so I'll just hard-code the SHA1 hash */
    -#define MSN_SSO_AUTHINFO_SHA1_BASE64 "d2IeTF4DAkPEa/tVETHznsivEpc="
    -
    -#define MSN_SSO_TIMESTAMP_TEMPLATE \
    -"<wsu:Timestamp xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" Id=\"Timestamp\">"\
    - "<wsu:Created>%s</wsu:Created>"\
    - "<wsu:Expires>%s</wsu:Expires>"\
    -"</wsu:Timestamp>"
    -
    -#define MSN_SSO_SIGNEDINFO_TEMPLATE \
    -"<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">"\
    - "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></CanonicalizationMethod>"\
    - "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#hmac-sha1\"></SignatureMethod>"\
    - "<Reference URI=\"#RST%d\">"\
    - "<Transforms>"\
    - "<Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></Transform>"\
    - "</Transforms>"\
    - "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></DigestMethod>"\
    - "<DigestValue>%s</DigestValue>"\
    - "</Reference>"\
    - "<Reference URI=\"#Timestamp\">"\
    - "<Transforms>"\
    - "<Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></Transform>"\
    - "</Transforms>"\
    - "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></DigestMethod>"\
    - "<DigestValue>%s</DigestValue>"\
    - "</Reference>"\
    - "<Reference URI=\"#PPAuthInfo\">"\
    - "<Transforms>"\
    - "<Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></Transform>"\
    - "</Transforms>"\
    - "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></DigestMethod>"\
    - "<DigestValue>" MSN_SSO_AUTHINFO_SHA1_BASE64 "</DigestValue>"\
    - "</Reference>"\
    -"</SignedInfo>"
    -
    -#define MSN_SSO_TOKEN_UPDATE_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<Envelope"\
    - " xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\""\
    - " xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\""\
    - " xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\""\
    - " xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\""\
    - " xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\""\
    - " xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\""\
    - " xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\""\
    - " xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\
    - "<Header>"\
    - MSN_SSO_AUTHINFO_TEMPLATE /* ps:AuthInfo */ \
    - "<wsse:Security>"\
    - "<EncryptedData xmlns=\"http://www.w3.org/2001/04/xmlenc#\" Id=\"BinaryDAToken0\" Type=\"http://www.w3.org/2001/04/xmlenc#Element\">"\
    - "<EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#tripledes-cbc\"></EncryptionMethod>"\
    - "<ds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">"\
    - "<ds:KeyName>http://Passport.NET/STS</ds:KeyName>"\
    - "</ds:KeyInfo>"\
    - "<CipherData>"\
    - "<CipherValue>%s</CipherValue>"\
    - "</CipherData>"\
    - "</EncryptedData>"\
    - "<wssc:DerivedKeyToken Id=\"SignKey\">"\
    - "<wsse:RequestedTokenReference>"\
    - "<wsse:KeyIdentifier ValueType=\"http://docs.oasis-open.org/wss/2004/XX/oasis-2004XX-wss-saml-token-profile-1.0#SAMLAssertionID\" />"\
    - "<wsse:Reference URI=\"#BinaryDAToken0\" />"\
    - "</wsse:RequestedTokenReference>"\
    - "<wssc:Nonce>%s</wssc:Nonce>"\
    - "</wssc:DerivedKeyToken>"\
    - "%s" /* wsu:Timestamp */\
    - "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">"\
    - "%s" /* SignedInfo */\
    - "<SignatureValue>%s</SignatureValue>"\
    - "<KeyInfo>"\
    - "<wsse:SecurityTokenReference>"\
    - "<wsse:Reference URI=\"#SignKey\" />"\
    - "</wsse:SecurityTokenReference>"\
    - "</KeyInfo>"\
    - "</Signature>"\
    - "</wsse:Security>"\
    - "</Header>"\
    - "<Body>"\
    - "%s" /* wst:RequestSecurityToken */ \
    - "</Body>"\
    -"</Envelope>"
    -
    -struct _MsnTicketToken {
    - GHashTable *token;
    - char *secret;
    - time_t expiry;
    - GSList *updates;
    -};
    -
    -struct _MsnNexus
    -{
    - MsnSession *session;
    -
    - /* From server via USR command */
    - char *policy;
    - char *nonce;
    -
    - /* From server via SOAP stuff */
    - char *cipher;
    - char *secret;
    - MsnTicketToken *tokens;
    - gsize token_len;
    -};
    -
    -void msn_nexus_connect(MsnNexus *nexus);
    -MsnNexus *msn_nexus_new(MsnSession *session);
    -void msn_nexus_destroy(MsnNexus *nexus);
    -GHashTable *msn_nexus_get_token(MsnNexus *nexus, MsnAuthDomains id);
    -const char *msn_nexus_get_token_str(MsnNexus *nexus, MsnAuthDomains id);
    -void msn_nexus_update_token(MsnNexus *nexus, int id, GSourceFunc cb, gpointer data);
    -
    -#endif /* MSN_NEXUS_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/notification.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,124 +0,0 @@
    -/**
    - * @file notification.h Notification server functions
    - *
    - * 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
    - */
    -#ifndef MSN_NOTIFICATION_H
    -#define MSN_NOTIFICATION_H
    -
    -typedef struct _MsnNotification MsnNotification;
    -
    -/* MSN protocol challenge info */
    -
    -/* MSNP18 challenge: WLM Version 2009 (Build 14.0.8089.726) */
    -#define MSNP18_WLM_PRODUCT_KEY "C1BX{V4W}Q3*10SM"
    -#define MSNP18_WLM_PRODUCT_ID "PROD0120PW!CCV9@"
    -
    -/* MSNP15 challenge: WLM 8.5.1288.816 */
    -#define MSNP15_WLM_PRODUCT_KEY "ILTXC!4IXB5FB*PX"
    -#define MSNP15_WLM_PRODUCT_ID "PROD0119GSJUC$18"
    -
    -/* MSNP13 challenge */
    -#define MSNP13_WLM_PRODUCT_KEY "O4BG@C7BWLYQX?5G"
    -#define MSNP13_WLM_PRODUCT_ID "PROD01065C%ZFN6F"
    -
    -#define MSNP10_PRODUCT_KEY "VT6PX?UQTM4WM%YR"
    -#define MSNP10_PRODUCT_ID "PROD0038W!61ZTF9"
    -
    -#include "cmdproc.h"
    -#include "msg.h"
    -#include "session.h"
    -#include "servconn.h"
    -#include "state.h"
    -#include "user.h"
    -#include "userlist.h"
    -
    -struct _MsnNotification
    -{
    - MsnSession *session;
    -
    - /**
    - * This is a convenience pointer that always points to
    - * servconn->cmdproc
    - */
    - MsnCmdProc *cmdproc;
    - MsnServConn *servconn;
    -
    - gboolean in_use;
    -};
    -
    -typedef void (*MsnFqyCb)(MsnSession *session, const char *passport, MsnNetwork network, gpointer data);
    -
    -/* Type used for msn_notification_send_uun */
    -typedef enum {
    - MSN_UNIFIED_NOTIFICATION_SHARED_FOLDERS = 1,
    - MSN_UNIFIED_NOTIFICATION_UNKNOWN1 = 2,
    - MSN_UNIFIED_NOTIFICATION_P2P = 3,
    - MSN_UNIFIED_NOTIFICATION_MPOP = 4
    -
    -} MsnUnifiedNotificationType;
    -
    -void msn_notification_end(void);
    -void msn_notification_init(void);
    -
    -void msn_notification_add_buddy_to_list(MsnNotification *notification,
    - MsnListId list_id, MsnUser *user);
    -void msn_notification_rem_buddy_from_list(MsnNotification *notification,
    - MsnListId list_id, MsnUser *user);
    -
    -void msn_notification_send_fqy(MsnSession *session,
    - const char *payload, int payload_len,
    - MsnFqyCb cb, gpointer cb_data);
    -
    -MsnNotification *msn_notification_new(MsnSession *session);
    -void msn_notification_destroy(MsnNotification *notification);
    -gboolean msn_notification_connect(MsnNotification *notification,
    - const char *host, int port);
    -void msn_notification_disconnect(MsnNotification *notification);
    -void msn_notification_dump_contact(MsnSession *session);
    -
    -void msn_notification_send_uum(MsnSession *session, MsnMessage *msg);
    -
    -void msn_notification_send_uux(MsnSession *session, const char *payload);
    -
    -void msn_notification_send_uux_endpointdata(MsnSession *session);
    -
    -void msn_notification_send_uux_private_endpointdata(MsnSession *session);
    -
    -void msn_notification_send_uun(MsnSession *session,
    - const char *user,
    - MsnUnifiedNotificationType type,
    - const char *payload);
    -
    -void msn_notification_send_circle_auth(MsnSession *session, const char *ticket);
    -
    -/**
    - * Closes a notification.
    - *
    - * It's first closed, and then disconnected.
    - *
    - * @param notification The notification object to close.
    - */
    -void msn_notification_close(MsnNotification *notification);
    -
    -void msn_got_login_params(MsnSession *session, const char *ticket, const char *response);
    -
    -#endif /* MSN_NOTIFICATION_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/notify.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,814 +0,0 @@
    -/**
    - * @file notify.h Notification API
    - * @ingroup core
    - * @see @ref notify-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_NOTIFY_H_
    -#define _PURPLE_NOTIFY_H_
    -
    -#include <stdlib.h>
    -#include <glib-object.h>
    -#include <glib.h>
    -
    -typedef struct _PurpleNotifyUserInfoEntry PurpleNotifyUserInfoEntry;
    -typedef struct _PurpleNotifyUserInfo PurpleNotifyUserInfo;
    -
    -#include "connection.h"
    -
    -/**
    - * Notification close callbacks.
    - */
    -typedef void (*PurpleNotifyCloseCallback) (gpointer user_data);
    -
    -
    -/**
    - * Notification types.
    - */
    -typedef enum
    -{
    - PURPLE_NOTIFY_MESSAGE = 0, /**< Message notification. */
    - PURPLE_NOTIFY_EMAIL, /**< Single email notification. */
    - PURPLE_NOTIFY_EMAILS, /**< Multiple email notification. */
    - PURPLE_NOTIFY_FORMATTED, /**< Formatted text. */
    - PURPLE_NOTIFY_SEARCHRESULTS, /**< Buddy search results. */
    - PURPLE_NOTIFY_USERINFO, /**< Formatted userinfo text. */
    - PURPLE_NOTIFY_URI /**< URI notification or display. */
    -
    -} PurpleNotifyType;
    -
    -
    -/**
    - * Notification message types.
    - */
    -typedef enum
    -{
    - PURPLE_NOTIFY_MSG_ERROR = 0, /**< Error notification. */
    - PURPLE_NOTIFY_MSG_WARNING, /**< Warning notification. */
    - PURPLE_NOTIFY_MSG_INFO /**< Information notification. */
    -
    -} PurpleNotifyMsgType;
    -
    -
    -/**
    - * The types of buttons
    - */
    -typedef enum
    -{
    - PURPLE_NOTIFY_BUTTON_LABELED = 0, /**< special use, see _button_add_labeled */
    - PURPLE_NOTIFY_BUTTON_CONTINUE = 1,
    - PURPLE_NOTIFY_BUTTON_ADD,
    - PURPLE_NOTIFY_BUTTON_INFO,
    - PURPLE_NOTIFY_BUTTON_IM,
    - PURPLE_NOTIFY_BUTTON_JOIN,
    - PURPLE_NOTIFY_BUTTON_INVITE
    -} PurpleNotifySearchButtonType;
    -
    -
    -/**
    - * Search results object.
    - */
    -typedef struct
    -{
    - GList *columns; /**< List of the search column objects. */
    - GList *rows; /**< List of rows in the result. */
    - GList *buttons; /**< List of buttons to display. */
    -
    -} PurpleNotifySearchResults;
    -
    -/**
    - * Types of PurpleNotifyUserInfoEntry objects
    - */
    -typedef enum
    -{
    - PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR = 0,
    - PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK,
    - PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
    -} PurpleNotifyUserInfoEntryType;
    -
    -/**
    - * Single column of a search result.
    - */
    -typedef struct
    -{
    - char *title; /**< Title of the column. */
    -
    -} PurpleNotifySearchColumn;
    -
    -
    -/**
    - * Callback for a button in a search result.
    - *
    - * @param c the PurpleConnection passed to purple_notify_searchresults
    - * @param row the contents of the selected row
    - * @param user_data User defined data.
    - */
    -typedef void (*PurpleNotifySearchResultsCallback)(PurpleConnection *c, GList *row,
    - gpointer user_data);
    -
    -
    -/**
    - * Definition of a button.
    - */
    -typedef struct
    -{
    - PurpleNotifySearchButtonType type;
    - PurpleNotifySearchResultsCallback callback; /**< Function to be called when clicked. */
    - char *label; /**< only for PURPLE_NOTIFY_BUTTON_LABELED */
    -} PurpleNotifySearchButton;
    -
    -
    -/**
    - * Notification UI operations.
    - */
    -typedef struct
    -{
    - void *(*notify_message)(PurpleNotifyMsgType type, const char *title,
    - const char *primary, const char *secondary);
    -
    - void *(*notify_email)(PurpleConnection *gc,
    - const char *subject, const char *from,
    - const char *to, const char *url);
    -
    - void *(*notify_emails)(PurpleConnection *gc,
    - size_t count, gboolean detailed,
    - const char **subjects, const char **froms,
    - const char **tos, const char **urls);
    -
    - void *(*notify_formatted)(const char *title, const char *primary,
    - const char *secondary, const char *text);
    -
    - void *(*notify_searchresults)(PurpleConnection *gc, const char *title,
    - const char *primary, const char *secondary,
    - PurpleNotifySearchResults *results, gpointer user_data);
    -
    - void (*notify_searchresults_new_rows)(PurpleConnection *gc,
    - PurpleNotifySearchResults *results,
    - void *data);
    -
    - void *(*notify_userinfo)(PurpleConnection *gc, const char *who,
    - PurpleNotifyUserInfo *user_info);
    -
    - void *(*notify_uri)(const char *uri);
    -
    - void (*close_notify)(PurpleNotifyType type, void *ui_handle);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleNotifyUiOps;
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -
    -/**************************************************************************/
    -/** Search results notification API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Displays results from a buddy search. This can be, for example,
    - * a window with a list of all found buddies, where you are given the
    - * option of adding buddies to your buddy list.
    - *
    - * @param gc The PurpleConnection handle associated with the information.
    - * @param title The title of the message. If this is NULL, the title
    - * will be "Search Results."
    - * @param primary The main point of the message.
    - * @param secondary The secondary information.
    - * @param results The PurpleNotifySearchResults instance.
    - * @param cb The callback to call when the user closes
    - * the notification.
    - * @param user_data The data to pass to the close callback and any other
    - * callback associated with a button.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_searchresults(PurpleConnection *gc, const char *title,
    - const char *primary, const char *secondary,
    - PurpleNotifySearchResults *results, PurpleNotifyCloseCallback cb,
    - gpointer user_data);
    -
    -/**
    - * Frees a PurpleNotifySearchResults object.
    - *
    - * @param results The PurpleNotifySearchResults to free.
    - */
    -void purple_notify_searchresults_free(PurpleNotifySearchResults *results);
    -
    -/**
    - * Replace old rows with the new. Reuse an existing window.
    - *
    - * @param gc The PurpleConnection structure.
    - * @param results The PurpleNotifySearchResults structure.
    - * @param data Data returned by the purple_notify_searchresults().
    - */
    -void purple_notify_searchresults_new_rows(PurpleConnection *gc,
    - PurpleNotifySearchResults *results,
    - void *data);
    -
    -
    -/**
    - * Adds a stock button that will be displayed in the search results dialog.
    - *
    - * @param results The search results object.
    - * @param type Type of the button. (TODO: Only one button of a given type
    - * can be displayed.)
    - * @param cb Function that will be called on the click event.
    - */
    -void purple_notify_searchresults_button_add(PurpleNotifySearchResults *results,
    - PurpleNotifySearchButtonType type,
    - PurpleNotifySearchResultsCallback cb);
    -
    -
    -/**
    - * Adds a plain labelled button that will be displayed in the search results
    - * dialog.
    - *
    - * @param results The search results object
    - * @param label The label to display
    - * @param cb Function that will be called on the click event
    - */
    -void purple_notify_searchresults_button_add_labeled(PurpleNotifySearchResults *results,
    - const char *label,
    - PurpleNotifySearchResultsCallback cb);
    -
    -
    -/**
    - * Returns a newly created search results object.
    - *
    - * @return The new search results object.
    - */
    -PurpleNotifySearchResults *purple_notify_searchresults_new(void);
    -
    -/**
    - * Returns a newly created search result column object.
    - *
    - * @param title Title of the column. NOTE: Title will get g_strdup()ed.
    - *
    - * @return The new search column object.
    - */
    -PurpleNotifySearchColumn *purple_notify_searchresults_column_new(const char *title);
    -
    -/**
    - * Adds a new column to the search result object.
    - *
    - * @param results The result object to which the column will be added.
    - * @param column The column that will be added to the result object.
    - */
    -void purple_notify_searchresults_column_add(PurpleNotifySearchResults *results,
    - PurpleNotifySearchColumn *column);
    -
    -/**
    - * Adds a new row of the results to the search results object.
    - *
    - * @param results The search results object.
    - * @param row The row of the results.
    - */
    -void purple_notify_searchresults_row_add(PurpleNotifySearchResults *results,
    - GList *row);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    -/**
    - * Returns a number of the rows in the search results object.
    - *
    - * @deprecated This function will be removed in Pidgin 3.0.0 unless
    - * there is sufficient demand to keep it. Using this
    - * function encourages looping through the results
    - * inefficiently. Instead of using this function you
    - * should iterate through the results using a loop
    - * similar to this:
    - * for (l = results->rows; l != NULL; l = l->next)
    - * If you really need to get the number of rows you
    - * can use g_list_length(results->rows).
    - *
    - * @param results The search results object.
    - *
    - * @return Number of the result rows.
    - */
    -guint purple_notify_searchresults_get_rows_count(PurpleNotifySearchResults *results);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    -/**
    - * Returns a number of the columns in the search results object.
    - *
    - * @deprecated This function will be removed in Pidgin 3.0.0 unless
    - * there is sufficient demand to keep it. Using this
    - * function encourages looping through the columns
    - * inefficiently. Instead of using this function you
    - * should iterate through the columns using a loop
    - * similar to this:
    - * for (l = results->columns; l != NULL; l = l->next)
    - * If you really need to get the number of columns you
    - * can use g_list_length(results->columns).
    - *
    - * @param results The search results object.
    - *
    - * @return Number of the columns.
    - */
    -guint purple_notify_searchresults_get_columns_count(PurpleNotifySearchResults *results);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    -/**
    - * Returns a row of the results from the search results object.
    - *
    - * @deprecated This function will be removed in Pidgin 3.0.0 unless
    - * there is sufficient demand to keep it. Using this
    - * function encourages looping through the results
    - * inefficiently. Instead of using this function you
    - * should iterate through the results using a loop
    - * similar to this:
    - * for (l = results->rows; l != NULL; l = l->next)
    - * If you really need to get the data for a particular
    - * row you can use g_list_nth_data(results->rows, row_id).
    - *
    - * @param results The search results object.
    - * @param row_id Index of the row to be returned.
    - *
    - * @return Row of the results.
    - */
    -GList *purple_notify_searchresults_row_get(PurpleNotifySearchResults *results,
    - unsigned int row_id);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    -/**
    - * Returns a title of the search results object's column.
    - *
    - * @deprecated This function will be removed in Pidgin 3.0.0 unless
    - * there is sufficient demand to keep it. Using this
    - * function encourages looping through the columns
    - * inefficiently. Instead of using this function you
    - * should iterate through the name of a particular
    - * column you can use
    - * g_list_nth_data(results->columns, row_id).
    - *
    - * @param results The search results object.
    - * @param column_id Index of the column.
    - *
    - * @return Title of the column.
    - */
    -char *purple_notify_searchresults_column_get_title(PurpleNotifySearchResults *results,
    - unsigned int column_id);
    -#endif
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Notification API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Displays a notification message to the user.
    - *
    - * @param handle The plugin or connection handle.
    - * @param type The notification type.
    - * @param title The title of the message.
    - * @param primary The main point of the message.
    - * @param secondary The secondary information.
    - * @param cb The callback to call when the user closes
    - * the notification.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_message(void *handle, PurpleNotifyMsgType type,
    - const char *title, const char *primary,
    - const char *secondary, PurpleNotifyCloseCallback cb,
    - gpointer user_data);
    -
    -/**
    - * Displays a single email notification to the user.
    - *
    - * @param handle The plugin or connection handle.
    - * @param subject The subject of the email.
    - * @param from The from address.
    - * @param to The destination address.
    - * @param url The URL where the message can be read.
    - * @param cb The callback to call when the user closes
    - * the notification.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_email(void *handle, const char *subject,
    - const char *from, const char *to,
    - const char *url, PurpleNotifyCloseCallback cb,
    - gpointer user_data);
    -
    -/**
    - * Displays a notification for multiple emails to the user.
    - *
    - * @param handle The plugin or connection handle.
    - * @param count The number of emails. '0' can be used to signify that
    - * the user has no unread emails and the UI should remove
    - * the mail notification.
    - * @param detailed @c TRUE if there is information for each email in the
    - * arrays.
    - * @param subjects The array of subjects.
    - * @param froms The array of from addresses.
    - * @param tos The array of destination addresses.
    - * @param urls The URLs where the messages can be read.
    - * @param cb The callback to call when the user closes
    - * the notification.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_emails(void *handle, size_t count, gboolean detailed,
    - const char **subjects, const char **froms,
    - const char **tos, const char **urls,
    - PurpleNotifyCloseCallback cb, gpointer user_data);
    -
    -/**
    - * Displays a notification with formatted text.
    - *
    - * The text is essentially a stripped-down format of HTML, the same that
    - * IMs may send.
    - *
    - * @param handle The plugin or connection handle.
    - * @param title The title of the message.
    - * @param primary The main point of the message.
    - * @param secondary The secondary information.
    - * @param text The formatted text.
    - * @param cb The callback to call when the user closes
    - * the notification.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_formatted(void *handle, const char *title,
    - const char *primary, const char *secondary,
    - const char *text, PurpleNotifyCloseCallback cb, gpointer user_data);
    -
    -/**
    - * Displays user information with formatted text, passing information giving
    - * the connection and username from which the user information came.
    - *
    - * The text is essentially a stripped-down format of HTML, the same that
    - * IMs may send.
    - *
    - * @param gc The PurpleConnection handle associated with the information.
    - * @param who The username associated with the information.
    - * @param user_info The PurpleNotifyUserInfo which contains the information
    - * @param cb The callback to call when the user closes the notification.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_notify_userinfo(PurpleConnection *gc, const char *who,
    - PurpleNotifyUserInfo *user_info, PurpleNotifyCloseCallback cb,
    - gpointer user_data);
    -
    -/**
    - * Create a new PurpleNotifyUserInfo which is suitable for passing to
    - * purple_notify_userinfo()
    - *
    - * @return A new PurpleNotifyUserInfo, which the caller must destroy when done
    - */
    -PurpleNotifyUserInfo *purple_notify_user_info_new(void);
    -
    -/**
    - * Destroy a PurpleNotifyUserInfo
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - */
    -void purple_notify_user_info_destroy(PurpleNotifyUserInfo *user_info);
    -
    -/**
    - * Retrieve the array of PurpleNotifyUserInfoEntry objects from a
    - * PurpleNotifyUserInfo
    - *
    - * This GList may be manipulated directly with normal GList functions such
    - * as g_list_insert(). Only PurpleNotifyUserInfoEntry are allowed in the
    - * list. If a PurpleNotifyUserInfoEntry item is added to the list, it
    - * should not be g_free()'d by the caller; PurpleNotifyUserInfo will g_free
    - * it when destroyed.
    - *
    - * To remove a PurpleNotifyUserInfoEntry, use
    - * purple_notify_user_info_remove_entry(). Do not use the GList directly.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - *
    - * @constreturn A GList of PurpleNotifyUserInfoEntry objects
    - */
    -GList *purple_notify_user_info_get_entries(PurpleNotifyUserInfo *user_info);
    -
    -/**
    - * Create a textual representation of a PurpleNotifyUserInfo, separating
    - * entries with newline
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param newline The separation character
    - */
    -char *purple_notify_user_info_get_text_with_newline(PurpleNotifyUserInfo *user_info, const char *newline);
    -
    -/**
    - * Add a label/value pair to a PurpleNotifyUserInfo object.
    - * PurpleNotifyUserInfo keeps track of the order in which pairs are added.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param label A label, which for example might be displayed by a
    - * UI with a colon after it ("Status:"). Do not include
    - * a colon. If NULL, value will be displayed without a
    - * label.
    - * @param value The value, which might be displayed by a UI after
    - * the label. This should be valid HTML. If you want
    - * to insert plaintext then use
    - * purple_notify_user_info_add_pair_plaintext(), instead.
    - * If this is NULL the label will still be displayed;
    - * the UI should treat label as independent and not
    - * include a colon if it would otherwise.
    - */
    -/*
    - * TODO: In 3.0.0 this function should be renamed to
    - * purple_notify_user_info_add_pair_html(). And optionally
    - * purple_notify_user_info_add_pair_plaintext() could be renamed to
    - * purple_notify_user_info_add_pair().
    - */
    -void purple_notify_user_info_add_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    -
    -/**
    - * Like purple_notify_user_info_add_pair, but value should be plaintext
    - * and will be escaped using g_markup_escape_text().
    - */
    -void purple_notify_user_info_add_pair_plaintext(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    -
    -/**
    - * Prepend a label/value pair to a PurpleNotifyUserInfo object
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param label A label, which for example might be displayed by a
    - * UI with a colon after it ("Status:"). Do not include
    - * a colon. If NULL, value will be displayed without a
    - * label.
    - * @param value The value, which might be displayed by a UI after
    - * the label. If NULL, label will still be displayed;
    - * the UI should then treat label as independent and not
    - * include a colon if it would otherwise.
    - */
    -void purple_notify_user_info_prepend_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    -/**
    - * Remove a PurpleNotifyUserInfoEntry from a PurpleNotifyUserInfo object
    - * without freeing the entry.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - *
    - * @deprecated Nothing is using this function and it should be removed
    - * in 3.0.0. Or, if we decide we want to keep it in 3.0.0
    - * then we should make purple_notify_user_info_entry_destroy
    - * public so that entries can be free'd after they're removed.
    - */
    -void purple_notify_user_info_remove_entry(PurpleNotifyUserInfo *user_info, PurpleNotifyUserInfoEntry *user_info_entry);
    -#endif
    -
    -/**
    - * Create a new PurpleNotifyUserInfoEntry
    - *
    - * If added to a PurpleNotifyUserInfo object, this should not be free()'d,
    - * as PurpleNotifyUserInfo will do so when destroyed.
    - * purple_notify_user_info_add_pair() and
    - * purple_notify_user_info_prepend_pair() are convenience methods for
    - * creating entries and adding them to a PurpleNotifyUserInfo.
    - *
    - * @param label A label, which for example might be displayed by a UI
    - * with a colon after it ("Status:"). Do not include a
    - * colon. If NULL, value will be displayed without a label.
    - * @param value The value, which might be displayed by a UI after the
    - * label. If NULL, label will still be displayed; the UI
    - * should then treat label as independent and not include a
    - * colon if it would otherwise.
    - *
    - * @result A new PurpleNotifyUserInfoEntry
    - */
    -PurpleNotifyUserInfoEntry *purple_notify_user_info_entry_new(const char *label, const char *value);
    -
    -/**
    - * Add a section break. A UI might display this as a horizontal line.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - */
    -void purple_notify_user_info_add_section_break(PurpleNotifyUserInfo *user_info);
    -
    -/**
    - * Prepend a section break. A UI might display this as a horizontal line.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @since 2.5.0
    - */
    -void purple_notify_user_info_prepend_section_break(PurpleNotifyUserInfo *user_info);
    -
    -/**
    - * Add a section header. A UI might display this in a different font
    - * from other text.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param label The name of the section
    - */
    -void purple_notify_user_info_add_section_header(PurpleNotifyUserInfo *user_info, const char *label);
    -
    -/**
    - * Prepend a section header. A UI might display this in a different font
    - * from other text.
    - *
    - * @param user_info The PurpleNotifyUserInfo
    - * @param label The name of the section
    - * @since 2.5.0
    - */
    -void purple_notify_user_info_prepend_section_header(PurpleNotifyUserInfo *user_info, const char *label);
    -
    -/**
    - * Remove the last item which was added to a PurpleNotifyUserInfo. This
    - * could be used to remove a section header which is not needed.
    - */
    -void purple_notify_user_info_remove_last_item(PurpleNotifyUserInfo *user_info);
    -
    -/**
    - * Get the label for a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - *
    - * @return The label
    - */
    -const gchar *purple_notify_user_info_entry_get_label(PurpleNotifyUserInfoEntry *user_info_entry);
    -
    -/**
    - * Set the label for a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - * @param label The label
    - */
    -void purple_notify_user_info_entry_set_label(PurpleNotifyUserInfoEntry *user_info_entry, const char *label);
    -
    -/**
    - * Get the value for a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - *
    - * @result The value
    - */
    -const gchar *purple_notify_user_info_entry_get_value(PurpleNotifyUserInfoEntry *user_info_entry);
    -
    -/**
    - * Set the value for a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - * @param value The value
    - */
    -void purple_notify_user_info_entry_set_value(PurpleNotifyUserInfoEntry *user_info_entry, const char *value);
    -
    -
    -/**
    - * Get the type of a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - *
    - * @return The PurpleNotifyUserInfoEntryType
    - */
    -PurpleNotifyUserInfoEntryType purple_notify_user_info_entry_get_type(PurpleNotifyUserInfoEntry *user_info_entry);
    -
    -/**
    - * Set the type of a PurpleNotifyUserInfoEntry
    - *
    - * @param user_info_entry The PurpleNotifyUserInfoEntry
    - * @param type The PurpleNotifyUserInfoEntryType
    - */
    -void purple_notify_user_info_entry_set_type(PurpleNotifyUserInfoEntry *user_info_entry,
    - PurpleNotifyUserInfoEntryType type);
    -
    -/**
    - * Opens a URI or somehow presents it to the user.
    - *
    - * @param handle The plugin or connection handle.
    - * @param uri The URI to display or go to.
    - *
    - * @return A UI-specific handle, if any. This may only be presented if
    - * the UI code displays a dialog instead of a webpage, or something
    - * similar.
    - */
    -void *purple_notify_uri(void *handle, const char *uri);
    -
    -/**
    - * Closes a notification.
    - *
    - * This should be used only by the UI operation functions and part of the
    - * core.
    - *
    - * @param type The notification type.
    - * @param ui_handle The notification UI handle.
    - */
    -void purple_notify_close(PurpleNotifyType type, void *ui_handle);
    -
    -/**
    - * Closes all notifications registered with the specified handle.
    - *
    - * @param handle The handle.
    - */
    -void purple_notify_close_with_handle(void *handle);
    -
    -/**
    - * A wrapper for purple_notify_message that displays an information message.
    - */
    -#define purple_notify_info(handle, title, primary, secondary) \
    - purple_notify_message((handle), PURPLE_NOTIFY_MSG_INFO, (title), \
    - (primary), (secondary), NULL, NULL)
    -
    -/**
    - * A wrapper for purple_notify_message that displays a warning message.
    - */
    -#define purple_notify_warning(handle, title, primary, secondary) \
    - purple_notify_message((handle), PURPLE_NOTIFY_MSG_WARNING, (title), \
    - (primary), (secondary), NULL, NULL)
    -
    -/**
    - * A wrapper for purple_notify_message that displays an error message.
    - */
    -#define purple_notify_error(handle, title, primary, secondary) \
    - purple_notify_message((handle), PURPLE_NOTIFY_MSG_ERROR, (title), \
    - (primary), (secondary), NULL, NULL)
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used when displaying a
    - * notification.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_notify_set_ui_ops(PurpleNotifyUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used when displaying a
    - * notification.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleNotifyUiOps *purple_notify_get_ui_ops(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Notify Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the notify subsystem handle.
    - *
    - * @return The notify subsystem handle.
    - */
    -void *purple_notify_get_handle(void);
    -
    -/**
    - * Initializes the notify subsystem.
    - */
    -void purple_notify_init(void);
    -
    -/**
    - * Uninitializes the notify subsystem.
    - */
    -void purple_notify_uninit(void);
    -
    -/*@}*/
    -
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_NOTIFY_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ntlm.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,73 +0,0 @@
    -/**
    - * @file ntlm.h
    - */
    -
    -/* purple
    - *
    - * Copyright (C) 2005, Thomas Butter <butter@uni-mannheim.de>
    - *
    - * ntlm structs are taken from NTLM description on
    - * http://www.innovation.ch/java/ntlm.html
    - *
    - * 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
    - */
    -
    -#ifndef _PURPLE_NTLM_H
    -#define _PURPLE_NTLM_H
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Generates the base64 encoded type 1 message needed for NTLM authentication
    - *
    - * @param hostname Your hostname
    - * @param domain The domain to authenticate to
    - * @return base64 encoded string to send to the server. This should
    - * be g_free'd by the caller.
    - */
    -gchar *purple_ntlm_gen_type1(const gchar *hostname, const gchar *domain);
    -
    -/**
    - * Parses the ntlm type 2 message
    - *
    - * @param type2 String containing the base64 encoded type2 message
    - * @param flags If not @c NULL, this will store the flags for the message
    - *
    - * @return The nonce for use in message type3. This is a statically
    - * allocated 8 byte binary string.
    - */
    -guint8 *purple_ntlm_parse_type2(const gchar *type2, guint32 *flags);
    -
    -/**
    - * Generates a type3 message
    - *
    - * @param username The username
    - * @param passw The password
    - * @param hostname The hostname
    - * @param domain The domain to authenticate against
    - * @param nonce The nonce returned by purple_ntlm_parse_type2
    - * @param flags Pointer to the flags returned by purple_ntlm_parse_type2
    - * @return A base64 encoded type3 message. This should be g_free'd by
    - * the caller.
    - */
    -gchar *purple_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, const guint8 *nonce, guint32 *flags);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_NTLM_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/object.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,276 +0,0 @@
    -/**
    - * @file object.h MSNObject API
    - *
    - * 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
    - */
    -#ifndef MSN_OBJECT_H
    -#define MSN_OBJECT_H
    -
    -typedef enum
    -{
    - MSN_OBJECT_UNKNOWN = -1, /**< Unknown object */
    - MSN_OBJECT_RESERVED1 = 1, /**< Reserved */
    - MSN_OBJECT_EMOTICON = 2, /**< Custom Emoticon */
    - MSN_OBJECT_USERTILE = 3, /**< UserTile (buddy icon) */
    - MSN_OBJECT_RESERVED2 = 4, /**< Reserved */
    - MSN_OBJECT_BACKGROUND = 5 /**< Background */
    -} MsnObjectType;
    -
    -#include "internal.h"
    -
    -#include "imgstore.h"
    -
    -typedef struct
    -{
    - gboolean local;
    -
    - char *creator;
    - int size;
    - MsnObjectType type;
    - PurpleStoredImage *img;
    - char *location;
    - char *friendly;
    - char *sha1d;
    - char *sha1c;
    - char *url;
    - char *url1;
    -} MsnObject;
    -
    -/**
    - * Creates a MsnObject structure.
    - *
    - * @return A new MsnObject structure.
    - */
    -MsnObject *msn_object_new(void);
    -
    -/**
    - * Creates a MsnObject structure from a string.
    - *
    - * @param str The string.
    - *
    - * @return The new MsnObject structure.
    - */
    -MsnObject *msn_object_new_from_string(const char *str);
    -
    -/**
    - * Creates a MsnObject structure from a stored image
    - *
    - * @param img The image associated to object
    - * @param location The object location as stored in MsnObject
    - * @param creator The creator of the object
    - * @param type The type of the object
    - *
    - * @return A new MsnObject structure
    - */
    -MsnObject *msn_object_new_from_image(PurpleStoredImage *img,
    - const char *location, const char *creator, MsnObjectType type);
    -
    -/**
    - * Destroys an MsnObject structure.
    - *
    - * @param obj The object structure.
    - */
    -void msn_object_destroy(MsnObject *obj);
    -
    -/**
    - * Outputs a string representation of an MsnObject.
    - *
    - * @param obj The object.
    - *
    - * @return The string representation. This must be freed.
    - */
    -char *msn_object_to_string(const MsnObject *obj);
    -
    -/**
    - * Sets the creator field in a MsnObject.
    - *
    - * @param creator The creator value.
    - */
    -void msn_object_set_creator(MsnObject *obj, const char *creator);
    -
    -/**
    - * Sets the size field in a MsnObject.
    - *
    - * @param size The size value.
    - */
    -void msn_object_set_size(MsnObject *obj, int size);
    -
    -/**
    - * Sets the type field in a MsnObject.
    - *
    - * @param type The type value.
    - */
    -void msn_object_set_type(MsnObject *obj, MsnObjectType type);
    -
    -/**
    - * Sets the location field in a MsnObject.
    - *
    - * @param location The location value.
    - */
    -void msn_object_set_location(MsnObject *obj, const char *location);
    -
    -/**
    - * Sets the friendly name field in a MsnObject.
    - *
    - * @param friendly The friendly name value.
    - */
    -void msn_object_set_friendly(MsnObject *obj, const char *friendly);
    -
    -/**
    - * Sets the SHA1D field in a MsnObject.
    - *
    - * @param sha1d The sha1d value.
    - */
    -void msn_object_set_sha1d(MsnObject *obj, const char *sha1d);
    -
    -/**
    - * Sets the SHA1C field in a MsnObject.
    - *
    - * @param sha1c The sha1c value.
    - */
    -void msn_object_set_sha1c(MsnObject *obj, const char *sha1c);
    -
    -/**
    - * Associates an image with a MsnObject.
    - *
    - * @param obj The object.
    - * @param img The image to associate.
    - */
    -void msn_object_set_image(MsnObject *obj, PurpleStoredImage *img);
    -
    -/**
    - * Sets the url field in a MsnObject.
    - *
    - * @param url The url value.
    - */
    -void msn_object_set_url(MsnObject *obj, const char *url);
    -
    -/**
    - * Sets the url1 field in a MsnObject.
    - *
    - * @param url1 The url1 value.
    - */
    -void msn_object_set_url1(MsnObject *obj, const char *url);
    -
    -/**
    - * Returns a MsnObject's creator value.
    - *
    - * @param obj The object.
    - *
    - * @return The creator value.
    - */
    -const char *msn_object_get_creator(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's size value.
    - *
    - * @param obj The object.
    - *
    - * @return The size value.
    - */
    -int msn_object_get_size(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's type.
    - *
    - * @param obj The object.
    - *
    - * @return The object type.
    - */
    -MsnObjectType msn_object_get_type(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's location value.
    - *
    - * @param obj The object.
    - *
    - * @return The location value.
    - */
    -const char *msn_object_get_location(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's friendly name value.
    - *
    - * @param obj The object.
    - *
    - * @return The friendly name value.
    - */
    -const char *msn_object_get_friendly(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's SHA1D value.
    - *
    - * @param obj The object.
    - *
    - * @return The SHA1D value.
    - */
    -const char *msn_object_get_sha1d(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's SHA1C value.
    - *
    - * @param obj The object.
    - *
    - * @return The SHA1C value.
    - */
    -const char *msn_object_get_sha1c(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's SHA1C value if it exists, otherwise SHA1D.
    - *
    - * @param obj The object.
    - *
    - * @return The SHA1C value.
    - */
    -const char *msn_object_get_sha1(const MsnObject *obj);
    -
    -/**
    - * Returns the image associated with the MsnObject.
    - *
    - * @param obj The object.
    - *
    - * @return The associated image.
    - */
    -PurpleStoredImage *msn_object_get_image(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's url value.
    - *
    - * @param obj The object.
    - *
    - * @return The url value.
    - */
    -const char *msn_object_get_url(const MsnObject *obj);
    -
    -/**
    - * Returns a MsnObject's url1 value.
    - *
    - * @param obj The object.
    - *
    - * @return The url1 value.
    - */
    -const char *msn_object_get_url1(const MsnObject *obj);
    -
    -MsnObject * msn_object_find_local(const char *sha1);
    -
    -void msn_object_set_local(MsnObject *obj);
    -
    -#endif /* MSN_OBJECT_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/oim.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,163 +0,0 @@
    -/**
    - * @file oim.h Header file for oim.c
    - * Author
    - * MaYuan<mayuan2006@gmail.com>
    - * 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 02110-1301, USA
    - */
    -#ifndef MSN_OIM_H
    -#define MSN_OIM_H
    -
    -typedef struct _MsnOim MsnOim;
    -
    -/* OIM Retrieval Info */
    -#define MSN_OIM_RETRIEVE_HOST "rsi.hotmail.com"
    -#define MSN_OIM_RETRIEVE_URL "/rsi/rsi.asmx"
    -
    -/* OIM GetMetadata SOAP Template */
    -#define MSN_OIM_GET_METADATA_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata"
    -
    -#define MSN_OIM_GET_METADATA_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<soap:Header>"\
    - "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
    - "<t>EMPTY</t>"\
    - "<p>EMPTY</p>"\
    - "</PassportCookie>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<GetMetadata xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\" />"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/*OIM GetMessage SOAP Template*/
    -#define MSN_OIM_GET_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage"
    -
    -#define MSN_OIM_GET_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<soap:Header>"\
    - "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
    - "<t>EMPTY</t>"\
    - "<p>EMPTY</p>"\
    - "</PassportCookie>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<GetMessage xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
    - "<messageId>%s</messageId>"\
    - "<alsoMarkAsRead>false</alsoMarkAsRead>"\
    - "</GetMessage>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/*OIM DeleteMessages SOAP Template*/
    -#define MSN_OIM_DEL_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages"
    -
    -#define MSN_OIM_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<soap:Header>"\
    - "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
    - "<t>EMPTY</t>"\
    - "<p>EMPTY</p>"\
    - "</PassportCookie>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<DeleteMessages xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
    - "<messageIds>"\
    - "<messageId>%s</messageId>"\
    - "</messageIds>"\
    - "</DeleteMessages>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -/*OIM Send SOAP Template*/
    -#define MSN_OIM_MSG_TEMPLATE "MIME-Version: 1.0\n"\
    - "Content-Type: text/plain; charset=UTF-8\n"\
    - "Content-Transfer-Encoding: base64\n"\
    - "X-OIM-Message-Type: OfflineMessage\n"\
    - "X-OIM-Run-Id: {%s}\n"\
    - "X-OIM-Sequence-Num: %d\n\n"
    -
    -#define MSN_OIM_SEND_HOST "ows.messenger.msn.com"
    -#define MSN_OIM_SEND_URL "/OimWS/oim.asmx"
    -#define MSN_OIM_SEND_SOAP_ACTION "http://messenger.live.com/ws/2006/09/oim/Store2"
    -#define MSN_OIM_SEND_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
    -"<soap:Envelope"\
    - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
    - " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
    - " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
    - "<soap:Header>"\
    - "<From"\
    - " memberName=\"%s\""\
    - " friendlyName=\"%s\""\
    - " xml:lang=\"en-US\""\
    - " proxy=\"MSNMSGR\""\
    - " xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\""\
    - " msnpVer=\"MSNP15\""\
    - " buildVer=\"8.5.1288\"/>"\
    - "<To memberName=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\
    - "<Ticket passport=\"EMPTY\" appid=\"%s\" lockkey=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\
    - "<Sequence xmlns=\"http://schemas.xmlsoap.org/ws/2003/03/rm\">"\
    - "<Identifier xmlns=\"http://schemas.xmlsoap.org/ws/2002/07/utility\">http://messenger.msn.com</Identifier>"\
    - "<MessageNumber>%d</MessageNumber>"\
    - "</Sequence>"\
    - "</soap:Header>"\
    - "<soap:Body>"\
    - "<MessageType xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\">text</MessageType>"\
    - "<Content xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\">%s</Content>"\
    - "</soap:Body>"\
    -"</soap:Envelope>"
    -
    -struct _MsnOim
    -{
    - MsnSession *session;
    -
    - GList * oim_list;
    -
    - char *challenge;
    - char *run_id;
    - gint send_seq;
    - GQueue *send_queue;
    -};
    -
    -/****************************************************
    - * function prototype
    - * **************************************************/
    -MsnOim * msn_oim_new(MsnSession *session);
    -void msn_oim_destroy(MsnOim *oim);
    -
    -void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg);
    -
    -/*Send OIM Message*/
    -void msn_oim_prep_send_msg_info(MsnOim *oim, const char *membername,
    - const char *friendname, const char *tomember,
    - const char * msg);
    -
    -void msn_oim_send_msg(MsnOim *oim);
    -
    -#endif/* MSN_OIM_H*/
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/oscar.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1350 +0,0 @@
    -/*
    - * Purple's oscar protocol plugin
    - * This file is the legal property of its developers.
    - * Please see the AUTHORS file distributed alongside this file.
    - *
    - * This library is free software; you can redistribute it and/or
    - * modify it under the terms of the GNU Lesser General Public
    - * License as published by the Free Software Foundation; either
    - * version 2 of the License, or (at your option) any later version.
    - *
    - * This library 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
    - * Lesser General Public License for more details.
    - *
    - * You should have received a copy of the GNU Lesser General Public
    - * License along with this library; if not, write to the Free Software
    - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    -*/
    -
    -/*
    - * Main libfaim header. Must be included in client for prototypes/macros.
    - *
    - * "come on, i turned a chick lesbian; i think this is the hackish equivalent"
    - * -- Josh Myer
    - *
    - */
    -
    -#ifndef _OSCAR_H_
    -#define _OSCAR_H_
    -
    -#include "internal.h"
    -#include "circbuffer.h"
    -#include "debug.h"
    -#include "eventloop.h"
    -#include "proxy.h"
    -#include "sslconn.h"
    -
    -#include <stdio.h>
    -#include <string.h>
    -#include <fcntl.h>
    -#include <sys/types.h>
    -#include <stdlib.h>
    -#include <stdarg.h>
    -#include <errno.h>
    -#include <time.h>
    -
    -#ifndef _WIN32
    -#include <sys/time.h>
    -#include <unistd.h>
    -#include <netdb.h>
    -#include <netinet/in.h>
    -#include <sys/socket.h>
    -#else
    -#include "libc_interface.h"
    -#endif
    -
    -typedef struct _ByteStream ByteStream;
    -typedef struct _ClientInfo ClientInfo;
    -typedef struct _FlapConnection FlapConnection;
    -typedef struct _FlapFrame FlapFrame;
    -typedef struct _IcbmArgsCh2 IcbmArgsCh2;
    -typedef struct _IcbmCookie IcbmCookie;
    -typedef struct _OscarData OscarData;
    -typedef struct _QueuedSnac QueuedSnac;
    -
    -typedef guint32 aim_snacid_t;
    -
    -#include "snactypes.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -#define FAIM_SNAC_HASH_SIZE 16
    -
    -/*
    - * Current Maximum Length for usernames (not including NULL)
    - *
    - * Currently only names up to 16 characters can be registered
    - * however it is apparently legal for them to be larger.
    - */
    -#define MAXSNLEN 97
    -
    -/*
    - * Current Maximum Length for Instant Messages
    - *
    - * This was found basically by experiment, but not wholly
    - * accurate experiment. It should not be regarded
    - * as completely correct. But its a decent approximation.
    - *
    - * Note that although we can send this much, its impossible
    - * for WinAIM clients (up through the latest (4.0.1957)) to
    - * send any more than 1kb. Amaze all your windows friends
    - * with utterly oversized instant messages!
    - */
    -#define MAXMSGLEN 2544
    -
    -/*
    - * Maximum size of a Buddy Icon.
    - */
    -#define MAXICONLEN 7168
    -#define AIM_ICONIDENT "AVT1picture.id"
    -
    -/*
    - * Found by trial and error.
    - */
    -#define MAXAVAILMSGLEN 251
    -
    -/**
    - * Maximum length for the password of an ICQ account
    - */
    -#define MAXICQPASSLEN 8
    -
    -#define AIM_MD5_STRING "AOL Instant Messenger (SM)"
    -
    -/*
    - * Client info. Filled in by the client and passed in to
    - * aim_send_login(). The information ends up getting passed to OSCAR
    - * through the initial login command.
    - *
    - */
    -struct _ClientInfo
    -{
    - const char *clientstring;
    - guint16 clientid;
    - guint16 major;
    - guint16 minor;
    - guint16 point;
    - guint16 build;
    - guint32 distrib;
    - const char *country; /* two-letter abbrev */
    - const char *lang; /* two-letter abbrev */
    -};
    -
    -/*
    - * We need to use the major-minor-micro versions from the official
    - * AIM and ICQ programs here or AOL won't let us use certain features.
    - *
    - * 0x00000611 is the distid given to us by AOL for use as the default
    - * libpurple distid.
    - */
    -#define CLIENTINFO_PURPLE_AIM { \
    - NULL, \
    - 0x0109, \
    - 0x0005, 0x0001, \
    - 0x0000, 0x0bdc, \
    - 0x00000611, \
    - "us", "en", \
    -}
    -
    -#define CLIENTINFO_PURPLE_ICQ { \
    - NULL, \
    - 0x010a, \
    - 0x0014, 0x0034, \
    - 0x0000, 0x0c18, \
    - 0x00000611, \
    - "us", "en", \
    -}
    -
    -typedef enum
    -{
    - OSCAR_DISCONNECT_DONE, /* not considered an error */
    - OSCAR_DISCONNECT_LOCAL_CLOSED, /* peer connections only, not considered an error */
    - OSCAR_DISCONNECT_REMOTE_CLOSED,
    - OSCAR_DISCONNECT_REMOTE_REFUSED, /* peer connections only */
    - OSCAR_DISCONNECT_LOST_CONNECTION,
    - OSCAR_DISCONNECT_INVALID_DATA,
    - OSCAR_DISCONNECT_COULD_NOT_CONNECT,
    - OSCAR_DISCONNECT_RETRYING /* peer connections only */
    -} OscarDisconnectReason;
    -
    -#define OSCAR_CAPABILITY_BUDDYICON 0x0000000000000001LL
    -#define OSCAR_CAPABILITY_TALK 0x0000000000000002LL
    -#define OSCAR_CAPABILITY_DIRECTIM 0x0000000000000004LL
    -#define OSCAR_CAPABILITY_CHAT 0x0000000000000008LL
    -#define OSCAR_CAPABILITY_GETFILE 0x0000000000000010LL
    -#define OSCAR_CAPABILITY_SENDFILE 0x0000000000000020LL
    -#define OSCAR_CAPABILITY_GAMES 0x0000000000000040LL
    -#define OSCAR_CAPABILITY_ADDINS 0x0000000000000080LL
    -#define OSCAR_CAPABILITY_SENDBUDDYLIST 0x0000000000000100LL
    -#define OSCAR_CAPABILITY_GAMES2 0x0000000000000200LL
    -#define OSCAR_CAPABILITY_ICQ_DIRECT 0x0000000000000400LL
    -#define OSCAR_CAPABILITY_APINFO 0x0000000000000800LL
    -#define OSCAR_CAPABILITY_ICQRTF 0x0000000000001000LL
    -#define OSCAR_CAPABILITY_EMPTY 0x0000000000002000LL
    -#define OSCAR_CAPABILITY_ICQSERVERRELAY 0x0000000000004000LL
    -#define OSCAR_CAPABILITY_UNICODEOLD 0x0000000000008000LL
    -#define OSCAR_CAPABILITY_TRILLIANCRYPT 0x0000000000010000LL
    -#define OSCAR_CAPABILITY_UNICODE 0x0000000000020000LL
    -#define OSCAR_CAPABILITY_INTEROPERATE 0x0000000000040000LL
    -#define OSCAR_CAPABILITY_SHORTCAPS 0x0000000000080000LL
    -#define OSCAR_CAPABILITY_HIPTOP 0x0000000000100000LL
    -#define OSCAR_CAPABILITY_SECUREIM 0x0000000000200000LL
    -#define OSCAR_CAPABILITY_SMS 0x0000000000400000LL
    -#define OSCAR_CAPABILITY_VIDEO 0x0000000000800000LL
    -#define OSCAR_CAPABILITY_ICHATAV 0x0000000001000000LL
    -#define OSCAR_CAPABILITY_LIVEVIDEO 0x0000000002000000LL
    -#define OSCAR_CAPABILITY_CAMERA 0x0000000004000000LL
    -#define OSCAR_CAPABILITY_ICHAT_SCREENSHARE 0x0000000008000000LL
    -#define OSCAR_CAPABILITY_TYPING 0x0000000010000000LL
    -#define OSCAR_CAPABILITY_NEWCAPS 0x0000000020000000LL
    -#define OSCAR_CAPABILITY_XTRAZ 0x0000000040000000LL
    -#define OSCAR_CAPABILITY_GENERICUNKNOWN 0x0000000080000000LL
    -#define OSCAR_CAPABILITY_HTML_MSGS 0x0000000100000000LL
    -#define OSCAR_CAPABILITY_LAST 0x0000000200000000LL
    -
    -#define OSCAR_STATUS_ID_INVISIBLE "invisible"
    -#define OSCAR_STATUS_ID_OFFLINE "offline"
    -#define OSCAR_STATUS_ID_AVAILABLE "available"
    -#define OSCAR_STATUS_ID_AWAY "away"
    -#define OSCAR_STATUS_ID_DND "dnd"
    -#define OSCAR_STATUS_ID_NA "na"
    -#define OSCAR_STATUS_ID_OCCUPIED "occupied"
    -#define OSCAR_STATUS_ID_FREE4CHAT "free4chat"
    -#define OSCAR_STATUS_ID_CUSTOM "custom"
    -#define OSCAR_STATUS_ID_MOBILE "mobile"
    -#define OSCAR_STATUS_ID_EVIL "evil"
    -#define OSCAR_STATUS_ID_DEPRESSION "depression"
    -#define OSCAR_STATUS_ID_ATHOME "athome"
    -#define OSCAR_STATUS_ID_ATWORK "atwork"
    -#define OSCAR_STATUS_ID_LUNCH "lunch"
    -
    -/*
    - * Byte Stream type. Sort of.
    - *
    - * Use of this type serves a couple purposes:
    - * - Buffer/buflen pairs are passed all around everywhere. This turns
    - * that into one value, as well as abstracting it slightly.
    - * - Through the abstraction, it is possible to enable bounds checking
    - * for robustness at the cost of performance. But a clean failure on
    - * weird packets is much better than a segfault.
    - * - I like having variables named "bs".
    - *
    - * Don't touch the insides of this struct. Or I'll have to kill you.
    - *
    - */
    -struct _ByteStream
    -{
    - guint8 *data;
    - size_t len;
    - size_t offset;
    -};
    -
    -struct _QueuedSnac
    -{
    - guint16 family;
    - guint16 subtype;
    - FlapFrame *frame;
    -};
    -
    -struct _FlapFrame
    -{
    - guint8 channel;
    - guint16 seqnum;
    - ByteStream data; /* payload stream */
    -};
    -
    -struct _FlapConnection
    -{
    - OscarData *od; /**< Pointer to parent session. */
    - gboolean connected;
    - time_t lastactivity; /**< Time of last transmit. */
    - guint destroy_timeout;
    - OscarDisconnectReason disconnect_reason;
    - gchar *error_message;
    - guint16 disconnect_code;
    -
    - /* A few variables that are only used when connecting */
    - PurpleProxyConnectData *connect_data;
    - guint16 cookielen;
    - guint8 *cookie;
    - gpointer new_conn_data;
    -
    - int fd;
    - PurpleSslConnection *gsc;
    - guint8 header[6];
    - gssize header_received;
    - FlapFrame buffer_incoming;
    - PurpleCircBuffer *buffer_outgoing;
    - guint watcher_incoming;
    - guint watcher_outgoing;
    -
    - guint16 type;
    - guint16 subtype;
    - guint16 seqnum_out; /**< The sequence number of most recently sent packet. */
    - guint16 seqnum_in; /**< The sequence number of most recently received packet. */
    - GSList *groups;
    - GSList *rateclasses; /* Contains nodes of struct rateclass. */
    - struct rateclass *default_rateclass;
    - GHashTable *rateclass_members; /* Key is family and subtype, value is pointer to the rateclass struct to use. */
    -
    - GQueue *queued_snacs; /**< Contains QueuedSnacs. */
    - GQueue *queued_lowpriority_snacs; /**< Contains QueuedSnacs to send only once queued_snacs is empty */
    - guint queued_timeout;
    -
    - void *internal; /* internal conn-specific libfaim data */
    -};
    -
    -struct _IcbmCookie
    -{
    - guchar cookie[8];
    - int type;
    - void *data;
    - time_t addtime;
    - struct _IcbmCookie *next;
    -};
    -
    -#include "peer.h"
    -
    -/*
    - * AIM Session: The main client-data interface.
    - *
    - */
    -struct _OscarData
    -{
    - /** Only used when connecting with clientLogin */
    - PurpleUtilFetchUrlData *url_data;
    -
    - gboolean iconconnecting;
    - gboolean set_icon;
    -
    - GSList *create_rooms;
    -
    - gboolean conf;
    - gboolean reqemail;
    - gboolean setemail;
    - char *email;
    - gboolean setnick;
    - char *newformatting;
    - gboolean chpass;
    - char *oldp;
    - char *newp;
    -
    - GSList *oscar_chats;
    - GHashTable *buddyinfo;
    - GSList *requesticon;
    -
    - gboolean use_ssl;
    - gboolean icq;
    - guint getblisttimer;
    -
    - struct {
    - guint maxwatchers; /* max users who can watch you */
    - guint maxbuddies; /* max users you can watch */
    - guint maxgroups; /* max groups in server list */
    - guint maxpermits; /* max users on permit list */
    - guint maxdenies; /* max users on deny list */
    - guint maxsiglen; /* max size (bytes) of profile */
    - guint maxawaymsglen; /* max size (bytes) of posted away message */
    - } rights;
    -
    - PurpleConnection *gc;
    -
    - void *modlistv;
    -
    - /*
    - * Outstanding snac handling
    - *
    - * TODO: Should these be per-connection? -mid
    - */
    - void *snac_hash[FAIM_SNAC_HASH_SIZE];
    - aim_snacid_t snacid_next;
    -
    - /*
    - * TODO: Data specific to a certain family should go into a
    - * hashtable and the core parts of libfaim shouldn't
    - * need to know about them.
    - */
    -
    - IcbmCookie *msgcookies;
    - GSList *icq_info;
    -
    - /** Only used when connecting with the old-style BUCP login. */
    - struct aim_authresp_info *authinfo;
    - struct aim_emailinfo *emailinfo;
    -
    - struct {
    - struct aim_userinfo_s *userinfo;
    - } locate;
    -
    - struct {
    - gboolean have_rights;
    - } bos;
    -
    - /* Server-stored information (ssi) */
    - struct {
    - gboolean received_data;
    - guint16 numitems;
    - struct aim_ssi_item *official;
    - struct aim_ssi_item *local;
    - struct aim_ssi_tmp *pending;
    - time_t timestamp;
    - gboolean waiting_for_ack;
    - gboolean in_transaction;
    - } ssi;
    -
    - /** Contains pointers to handler functions for each family/subtype. */
    - GHashTable *handlerlist;
    -
    - /** A linked list containing FlapConnections. */
    - GSList *oscar_connections;
    - guint16 default_port;
    -
    - /** A linked list containing PeerConnections. */
    - GSList *peer_connections;
    -};
    -
    -/* Valid for calling aim_icq_setstatus() and for aim_userinfo_t->icqinfo.status */
    -#define AIM_ICQ_STATE_NORMAL 0x00000000
    -#define AIM_ICQ_STATE_AWAY 0x00000001
    -#define AIM_ICQ_STATE_DND 0x00000002
    -#define AIM_ICQ_STATE_OUT 0x00000004
    -#define AIM_ICQ_STATE_BUSY 0x00000010
    -#define AIM_ICQ_STATE_CHAT 0x00000020
    -#define AIM_ICQ_STATE_INVISIBLE 0x00000100
    -#define AIM_ICQ_STATE_EVIL 0x00003000
    -#define AIM_ICQ_STATE_DEPRESSION 0x00004000
    -#define AIM_ICQ_STATE_ATHOME 0x00005000
    -#define AIM_ICQ_STATE_ATWORK 0x00006000
    -#define AIM_ICQ_STATE_LUNCH 0x00002001
    -#define AIM_ICQ_STATE_EVIL 0x00003000
    -#define AIM_ICQ_STATE_WEBAWARE 0x00010000
    -#define AIM_ICQ_STATE_HIDEIP 0x00020000
    -#define AIM_ICQ_STATE_BIRTHDAY 0x00080000
    -#define AIM_ICQ_STATE_ICQHOMEPAGE 0x00200000
    -#define AIM_ICQ_STATE_DIRECTREQUIREAUTH 0x10000000
    -
    -/**
    - * Only used when connecting with the old-style BUCP login.
    - */
    -struct aim_clientrelease
    -{
    - char *name;
    - guint32 build;
    - char *url;
    - char *info;
    -};
    -
    -/**
    - * Only used when connecting with the old-style BUCP login.
    - */
    -struct aim_authresp_info
    -{
    - char *bn;
    - guint16 errorcode;
    - char *errorurl;
    - guint16 regstatus;
    - char *email;
    - char *bosip;
    - guint16 cookielen;
    - guint8 *cookie;
    - char *chpassurl;
    - struct aim_clientrelease latestrelease;
    - struct aim_clientrelease latestbeta;
    -};
    -
    -/* Callback data for redirect. */
    -struct aim_redirect_data
    -{
    - guint16 group;
    - const char *ip;
    - guint16 cookielen;
    - const guint8 *cookie;
    - const char *ssl_cert_cn;
    - guint8 use_ssl;
    - struct { /* group == SNAC_FAMILY_CHAT */
    - guint16 exchange;
    - const char *room;
    - guint16 instance;
    - } chat;
    -};
    -
    -int oscar_connect_to_bos(PurpleConnection *gc, OscarData *od, const char *host, guint16 port, guint8 *cookie, guint16 cookielen, const char *tls_certname);
    -
    -/* family_auth.c */
    -
    -/**
    - * Only used when connecting with the old-style BUCP login.
    - */
    -int aim_request_login(OscarData *od, FlapConnection *conn, const char *bn);
    -
    -/**
    - * Only used when connecting with the old-style BUCP login.
    - */
    -int aim_send_login(OscarData *od, FlapConnection *conn, const char *bn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key, gboolean allow_multiple_logins);
    -
    -/**
    - * Only used when connecting with the old-style BUCP login.
    - */
    -/* 0x000b */ int aim_auth_securid_send(OscarData *od, const char *securid);
    -
    -/**
    - * Only used when connecting with clientLogin.
    - */
    -void send_client_login(OscarData *od, const char *username);
    -
    -/* flap_connection.c */
    -FlapConnection *flap_connection_new(OscarData *, int type);
    -void flap_connection_close(OscarData *od, FlapConnection *conn);
    -void flap_connection_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    -void flap_connection_schedule_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    -FlapConnection *flap_connection_findbygroup(OscarData *od, guint16 group);
    -FlapConnection *flap_connection_getbytype(OscarData *, int type);
    -FlapConnection *flap_connection_getbytype_all(OscarData *, int type);
    -void flap_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond);
    -void flap_connection_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond);
    -
    -void flap_connection_send(FlapConnection *conn, FlapFrame *frame);
    -void flap_connection_send_version(OscarData *od, FlapConnection *conn);
    -void flap_connection_send_version_with_cookie(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy);
    -void flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci, gboolean allow_multiple_login);
    -void flap_connection_send_snac(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, aim_snacid_t snacid, ByteStream *data);
    -void flap_connection_send_snac_with_priority(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, aim_snacid_t snacid, ByteStream *data, gboolean high_priority);
    -void flap_connection_send_keepalive(OscarData *od, FlapConnection *conn);
    -FlapFrame *flap_frame_new(OscarData *od, guint16 channel, int datalen);
    -
    -/* oscar_data.c */
    -typedef int (*aim_rxcallback_t)(OscarData *od, FlapConnection *conn, FlapFrame *frame, ...);
    -
    -OscarData *oscar_data_new(void);
    -void oscar_data_destroy(OscarData *);
    -void oscar_data_addhandler(OscarData *od, guint16 family, guint16 subtype, aim_rxcallback_t newhandler, guint16 flags);
    -aim_rxcallback_t aim_callhandler(OscarData *od, guint16 family, guint16 subtype);
    -
    -/* 0x0001 - family_oservice.c */
    -/* 0x0002 */ void aim_srv_clientready(OscarData *od, FlapConnection *conn);
    -/* 0x0004 */ void aim_srv_requestnew(OscarData *od, guint16 serviceid);
    -/* 0x0006 */ void aim_srv_reqrates(OscarData *od, FlapConnection *conn);
    -/* 0x0008 */ void aim_srv_rates_addparam(OscarData *od, FlapConnection *conn);
    -/* 0x000e */ void aim_srv_reqpersonalinfo(OscarData *od, FlapConnection *conn);
    -/* 0x0011 */ void aim_srv_setidle(OscarData *od, guint32 idletime);
    -/* 0x0017 */ void aim_srv_setversions(OscarData *od, FlapConnection *conn);
    -/* 0x001e */ int aim_srv_setextrainfo(OscarData *od, gboolean seticqstatus, guint32 icqstatus, gboolean setstatusmsg, const char *statusmsg, const char *itmsurl);
    -void aim_srv_set_dc_info(OscarData *od);
    -
    -
    -void aim_bos_reqrights(OscarData *od, FlapConnection *conn);
    -
    -#define AIM_RATE_CODE_LIMIT 0x0003
    -
    -/* family_icbm.c */
    -#define AIM_OFT_SUBTYPE_SEND_DIR 0x0002
    -
    -#define AIM_TRANSFER_DENY_DECLINE 0x0001
    -
    -#define AIM_IMPARAM_FLAG_CHANNEL_MSGS_ALLOWED 0x00000001
    -#define AIM_IMPARAM_FLAG_MISSED_CALLS_ENABLED 0x00000002
    -#define AIM_IMPARAM_FLAG_EVENTS_ALLOWED 0x00000008
    -#define AIM_IMPARAM_FLAG_SMS_SUPPORTED 0x00000010
    -#define AIM_IMPARAM_FLAG_OFFLINE_MSGS_ALLOWED 0x00000100
    -
    -/**
    - * This flag tells the server that we always send HTML in messages
    - * sent from an ICQ account to an ICQ account. (If this flag is
    - * not sent then plaintext is sent ICQ<-->ICQ (HTML is sent in all
    - * other cases)).
    - *
    - * If we send an HTML message to an old client that doesn't support
    - * HTML messages, then the oscar servers will merrily strip the HTML
    - * for us.
    - *
    - * All incoming IMs are treated as HTML.
    - */
    -#define AIM_IMPARAM_FLAG_USE_HTML_FOR_ICQ 0x00000400
    -
    -struct aim_icbmparameters
    -{
    - guint16 maxchan;
    - guint32 flags; /* AIM_IMPARAM_FLAG_ */
    - guint16 maxmsglen; /* message size that you will accept */
    - guint16 maxsenderwarn; /* this and below are *10 (999=99.9%) */
    - guint16 maxrecverwarn;
    - guint32 minmsginterval; /* in milliseconds? */
    -};
    -
    -/*
    - * TODO: Should probably combine this with struct chat_connection.
    - */
    -struct aim_chat_roominfo
    -{
    - guint16 exchange;
    - char *name;
    - guint8 namelen;
    - guint16 instance;
    -};
    -
    -struct chat_connection
    -{
    - char *name;
    - char *show; /* AOL did something funny to us */
    - guint16 exchange;
    - guint16 instance;
    - FlapConnection *conn;
    - int id;
    - PurpleConnection *gc;
    - PurpleConversation *conv;
    - guint16 maxlen;
    - guint16 maxvis;
    -};
    -
    -/*
    - * All this chat struct stuff should be in family_chat.c
    - */
    -void oscar_chat_destroy(struct chat_connection *cc);
    -
    -#define AIM_IMFLAGS_AWAY 0x0001 /* mark as an autoreply */
    -#define AIM_IMFLAGS_ACK 0x0002 /* request a receipt notice */
    -#define AIM_IMFLAGS_BUDDYREQ 0x0010 /* buddy icon requested */
    -#define AIM_IMFLAGS_HASICON 0x0020 /* already has icon */
    -#define AIM_IMFLAGS_SUBENC_MACINTOSH 0x0040 /* damn that Steve Jobs! */
    -#define AIM_IMFLAGS_CUSTOMFEATURES 0x0080 /* features field present */
    -#define AIM_IMFLAGS_OFFLINE 0x0800 /* send to offline user */
    -#define AIM_IMFLAGS_TYPINGNOT 0x1000 /* typing notification */
    -
    -#define AIM_CHARSET_ASCII 0x0000 /* ISO 646 */
    -#define AIM_CHARSET_UNICODE 0x0002 /* ISO 10646 (UTF-16/UCS-2BE) */
    -#define AIM_CHARSET_LATIN_1 0x0003 /* ISO 8859-1 */
    -
    -/*
    - * Arguments to aim_send_im_ext().
    - *
    - * This is really complicated. But immensely versatile.
    - *
    - */
    -struct aim_sendimext_args
    -{
    - /* These are _required_ */
    - const char *destbn;
    - guint32 flags; /* often 0 */
    -
    - const char *msg;
    - gsize msglen;
    -
    - /* Only used if AIM_IMFLAGS_HASICON is set */
    - guint32 iconlen;
    - time_t iconstamp;
    - guint32 iconsum;
    -
    - guint16 featureslen;
    - guint8 *features;
    -
    - guint16 charset;
    -};
    -
    -/*
    - * This information is provided in the Incoming ICBM callback for
    - * Channel 1 ICBM's.
    - */
    -struct aim_incomingim_ch1_args
    -{
    - guint32 icbmflags; /* some flags apply only to ->msg, not all mpmsg */
    - time_t timestamp; /* Only set for offline messages */
    -
    - gchar *msg;
    -
    - /* Only provided if AIM_IMFLAGS_HASICON is set */
    - time_t iconstamp;
    - guint32 iconlen;
    - guint16 iconsum;
    -};
    -
    -/* Valid values for channel 2 args->status */
    -#define AIM_RENDEZVOUS_PROPOSE 0x0000
    -#define AIM_RENDEZVOUS_CANCEL 0x0001
    -#define AIM_RENDEZVOUS_CONNECTED 0x0002
    -
    -struct _IcbmArgsCh2
    -{
    - guint16 status;
    - guchar cookie[8];
    - guint64 type; /* One of the OSCAR_CAPABILITY_ constants */
    - const char *proxyip;
    - const char *clientip;
    - const char *verifiedip;
    - guint16 port;
    - gboolean use_proxy;
    - guint16 errorcode;
    - const char *msg; /* invite message or file description */
    - guint16 msglen;
    - const char *encoding;
    - const char *language;
    - guint16 requestnumber;
    - union {
    - struct {
    - guint32 checksum;
    - guint32 length;
    - time_t timestamp;
    - guint8 *icon;
    - } icon;
    - struct {
    - struct aim_chat_roominfo roominfo;
    - } chat;
    - struct {
    - guint8 msgtype;
    - const char *msg;
    - } rtfmsg;
    - struct {
    - guint16 subtype;
    - guint16 totfiles;
    - guint32 totsize;
    - char *filename;
    - } sendfile;
    - } info;
    - void *destructor; /* used internally only */
    -};
    -
    -struct aim_incomingim_ch4_args
    -{
    - guint32 uin; /* Of the sender of the ICBM */
    - guint8 type;
    - guint8 flags;
    - gchar *msg; /* Reason for auth request, deny, or accept */
    - int msglen;
    -};
    -
    -/* SNAC sending functions */
    -/* 0x0002 */ int aim_im_setparams(OscarData *od, struct aim_icbmparameters *params);
    -/* 0x0004 */ int aim_im_reqparams(OscarData *od);
    -/* 0x0006 */ int aim_im_sendch1_ext(OscarData *od, struct aim_sendimext_args *args);
    -/* 0x0006 */ int aim_im_sendch1(OscarData *, const char *destbn, guint16 flags, const char *msg);
    -/* 0x0006 */ int aim_im_sendch2_chatinvite(OscarData *od, const char *bn, const char *msg, guint16 exchange, const char *roomname, guint16 instance);
    -/* 0x0006 */ int aim_im_sendch2_icon(OscarData *od, const char *bn, const guint8 *icon, int iconlen, time_t stamp, guint16 iconsum);
    -
    -/* 0x0006 */ void aim_im_sendch2_cancel(PeerConnection *peer_conn);
    -/* 0x0006 */ void aim_im_sendch2_connected(PeerConnection *peer_conn);
    -/* 0x0006 */ void aim_im_sendch2_odc_requestdirect(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 port, guint16 requestnumber);
    -/* 0x0006 */ void aim_im_sendch2_odc_requestproxy(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 pin, guint16 requestnumber);
    -/* 0x0006 */ void aim_im_sendch2_sendfile_requestdirect(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 port, guint16 requestnumber, const gchar *filename, guint32 size, guint16 numfiles);
    -/* 0x0006 */ void aim_im_sendch2_sendfile_requestproxy(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 pin, guint16 requestnumber, const gchar *filename, guint32 size, guint16 numfiles);
    -
    -/* 0x000b */ int aim_im_denytransfer(OscarData *od, const char *bn, const guchar *cookie, guint16 code);
    -/* 0x0010 */ int aim_im_reqofflinemsgs(OscarData *od);
    -/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2);
    -/* 0x000b */ int icq_relay_xstatus (OscarData *od, const char *sn, const guchar* cookie);
    -void aim_icbm_makecookie(guchar* cookie);
    -void aim_im_send_icq_confirmation(OscarData *od, const char *bn, const guchar *cookie);
    -
    -/* 0x0002 - family_locate.c */
    -/*
    - * AIM User Info, Standard Form.
    - */
    -#define AIM_FLAG_ADMINISTRATOR 0x0002
    -#define AIM_FLAG_AOL 0x0004
    -#define AIM_FLAG_AWAY 0x0020
    -#define AIM_FLAG_WIRELESS 0x0080
    -#define AIM_FLAG_ICQ 0x0040
    -#define AIM_FLAG_ACTIVEBUDDY 0x0400
    -
    -#define AIM_USERINFO_PRESENT_FLAGS 0x00000001
    -#define AIM_USERINFO_PRESENT_MEMBERSINCE 0x00000002
    -#define AIM_USERINFO_PRESENT_ONLINESINCE 0x00000004
    -#define AIM_USERINFO_PRESENT_IDLE 0x00000008
    -#define AIM_USERINFO_PRESENT_ICQEXTSTATUS 0x00000010
    -#define AIM_USERINFO_PRESENT_ICQIPADDR 0x00000020
    -#define AIM_USERINFO_PRESENT_ICQDATA 0x00000040
    -#define AIM_USERINFO_PRESENT_CAPABILITIES 0x00000080
    -#define AIM_USERINFO_PRESENT_SESSIONLEN 0x00000100
    -#define AIM_USERINFO_PRESENT_CREATETIME 0x00000200
    -
    -struct userinfo_node
    -{
    - char *bn;
    - struct userinfo_node *next;
    -};
    -
    -typedef struct aim_userinfo_s
    -{
    - char *bn;
    - guint16 warnlevel; /* evil percent * 10 (999 = 99.9%) */
    - guint16 idletime; /* in seconds */
    - guint16 flags;
    - guint32 createtime; /* time_t */
    - guint32 membersince; /* time_t */
    - guint32 onlinesince; /* time_t */
    - guint32 sessionlen; /* in seconds */
    - guint64 capabilities;
    - struct {
    - guint32 status;
    - guint32 ipaddr;
    - guint8 crap[0x25]; /* until we figure it out... */
    - } icqinfo;
    - guint32 present;
    -
    - guint8 iconcsumtype;
    - guint16 iconcsumlen;
    - guint8 *iconcsum;
    -
    - char *info;
    - char *info_encoding;
    - guint16 info_len;
    -
    - char *status;
    - char *status_encoding;
    - guint16 status_len;
    -
    - char *itmsurl;
    - char *itmsurl_encoding;
    - guint16 itmsurl_len;
    -
    - char *away;
    - char *away_encoding;
    - guint16 away_len;
    -
    - struct aim_userinfo_s *next;
    -} aim_userinfo_t;
    -
    -#define AIM_SENDMEMBLOCK_FLAG_ISREQUEST 0
    -#define AIM_SENDMEMBLOCK_FLAG_ISHASH 1
    -
    -int aim_sendmemblock(OscarData *od, FlapConnection *conn, guint32 offset, guint32 len, const guint8 *buf, guint8 flag);
    -
    -struct aim_invite_priv
    -{
    - char *bn;
    - char *roomname;
    - guint16 exchange;
    - guint16 instance;
    -};
    -
    -#define AIM_COOKIETYPE_CHAT 0x01
    -#define AIM_COOKIETYPE_INVITE 0x02
    -
    -aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *bn);
    -void aim_locate_dorequest(OscarData *od);
    -
    -/* 0x0002 */ int aim_locate_reqrights(OscarData *od);
    -/* 0x0004 */ int aim_locate_setcaps(OscarData *od, guint64 caps);
    -/* 0x0004 */ int aim_locate_setprofile(OscarData *od, const char *profile_encoding, const gchar *profile, const int profile_len, const char *awaymsg_encoding, const gchar *awaymsg, const int awaymsg_len);
    -/* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *bn, guint32 flags);
    -
    -guint64 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len);
    -guint64 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len);
    -void aim_info_free(aim_userinfo_t *);
    -int aim_info_extract(OscarData *od, ByteStream *bs, aim_userinfo_t *);
    -int aim_putuserinfo(ByteStream *bs, aim_userinfo_t *info);
    -PurpleMood* icq_get_purple_moods(PurpleAccount *account);
    -const char* icq_get_custom_icon_description(const char *mood);
    -guint8* icq_get_custom_icon_data(const char *mood);
    -int icq_im_xstatus_request(OscarData *od, const char *sn);
    -
    -/* 0x0003 - family_buddy.c */
    -/* 0x0002 */ void aim_buddylist_reqrights(OscarData *, FlapConnection *);
    -
    -
    -/* 0x000a - family_userlookup.c */
    -int aim_search_address(OscarData *, const char *);
    -
    -struct aim_chat_exchangeinfo
    -{
    - guint16 number;
    - guint16 flags;
    - char *name;
    - char *charset1;
    - char *lang1;
    - char *charset2;
    - char *lang2;
    -};
    -
    -#define AIM_CHATFLAGS_NOREFLECT 0x0001
    -#define AIM_CHATFLAGS_AWAY 0x0002
    -int aim_chat_send_im(OscarData *od, FlapConnection *conn, guint16 flags, const gchar *msg, int msglen, const char *encoding, const char *language);
    -int aim_chat_join(OscarData *od, guint16 exchange, const char *roomname, guint16 instance);
    -
    -void aim_chatnav_reqrights(OscarData *od, FlapConnection *conn);
    -
    -int aim_chatnav_createroom(OscarData *od, FlapConnection *conn, const char *name, guint16 exchange);
    -
    -
    -/* 0x0010 - family_bart.c */
    -int aim_bart_upload(OscarData *od, const guint8 *icon, guint16 iconlen);
    -int aim_bart_request(OscarData *od, const char *bn, guint8 iconcsumtype, const guint8 *iconstr, guint16 iconstrlen);
    -
    -
    -
    -/* 0x0013 - family_feedbag.c */
    -#define AIM_SSI_TYPE_BUDDY 0x0000
    -#define AIM_SSI_TYPE_GROUP 0x0001
    -#define AIM_SSI_TYPE_PERMIT 0x0002
    -#define AIM_SSI_TYPE_DENY 0x0003
    -#define AIM_SSI_TYPE_PDINFO 0x0004
    -#define AIM_SSI_TYPE_PRESENCEPREFS 0x0005
    -#define AIM_SSI_TYPE_ICQDENY 0x000e
    -#define AIM_SSI_TYPE_ICONINFO 0x0014
    -
    -/* These flags are set in the 0x00c9 TLV of SSI type 0x0005 */
    -#define AIM_SSI_PRESENCE_FLAG_SHOWIDLE 0x00000400
    -#define AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES 0x00020000
    -
    -struct aim_ssi_item
    -{
    - char *name;
    - guint16 gid;
    - guint16 bid;
    - guint16 type;
    - GSList *data;
    - struct aim_ssi_item *next;
    -};
    -
    -struct aim_ssi_tmp
    -{
    - guint16 action;
    - guint16 ack;
    - char *name;
    - struct aim_ssi_item *item;
    - struct aim_ssi_tmp *next;
    -};
    -
    -/* These build the actual SNACs and queue them to be sent */
    -/* 0x0002 */ int aim_ssi_reqrights(OscarData *od);
    -/* 0x0004 */ int aim_ssi_reqdata(OscarData *od);
    -/* 0x0007 */ int aim_ssi_enable(OscarData *od);
    -/* 0x0011 */ int aim_ssi_modbegin(OscarData *od);
    -/* 0x0012 */ int aim_ssi_modend(OscarData *od);
    -/* 0x0018 */ int aim_ssi_sendauthrequest(OscarData *od, const char *bn, const char *msg);
    -/* 0x001a */ int aim_ssi_sendauthreply(OscarData *od, const char *bn, guint8 reply, const char *msg);
    -
    -/* Client functions for retrieving SSI data */
    -struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, guint16 gid, guint16 bid);
    -struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, const char *gn, const char *bn, guint16 type);
    -struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *bn);
    -char *aim_ssi_itemlist_findparentname(struct aim_ssi_item *list, const char *bn);
    -int aim_ssi_getpermdeny(struct aim_ssi_item *list);
    -guint32 aim_ssi_getpresence(struct aim_ssi_item *list);
    -char *aim_ssi_getalias(struct aim_ssi_item *list, const char *gn, const char *bn);
    -char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *bn);
    -gboolean aim_ssi_waitingforauth(struct aim_ssi_item *list, const char *gn, const char *bn);
    -
    -/* Client functions for changing SSI data */
    -int aim_ssi_addbuddy(OscarData *od, const char *name, const char *group, GSList *tlvlist, const char *alias, const char *comment, const char *smsnum, gboolean needauth);
    -int aim_ssi_delbuddy(OscarData *od, const char *name, const char *group);
    -int aim_ssi_delgroup(OscarData *od, const char *group);
    -int aim_ssi_movebuddy(OscarData *od, const char *oldgn, const char *newgn, const char *bn);
    -int aim_ssi_aliasbuddy(OscarData *od, const char *gn, const char *bn, const char *alias);
    -int aim_ssi_editcomment(OscarData *od, const char *gn, const char *bn, const char *alias);
    -int aim_ssi_rename_group(OscarData *od, const char *oldgn, const char *newgn);
    -int aim_ssi_cleanlist(OscarData *od);
    -int aim_ssi_deletelist(OscarData *od);
    -int aim_ssi_setpermdeny(OscarData *od, guint8 permdeny);
    -int aim_ssi_setpresence(OscarData *od, guint32 presence);
    -int aim_ssi_seticon(OscarData *od, const guint8 *iconsum, guint8 iconsumlen);
    -int aim_ssi_delicon(OscarData *od);
    -int aim_ssi_add_to_private_list(OscarData *od, const char* name, guint16 list_type);
    -int aim_ssi_del_from_private_list(OscarData* od, const char* name, guint16 list_type);
    -
    -guint16 aim_ssi_getdenyentrytype(OscarData* od);
    -
    -struct aim_icq_info
    -{
    - guint16 reqid;
    -
    - /* simple */
    - guint32 uin;
    -
    - /* general and "home" information (0x00c8) */
    - char *nick;
    - char *first;
    - char *last;
    - char *email;
    - char *homecity;
    - char *homestate;
    - char *homephone;
    - char *homefax;
    - char *homeaddr;
    - char *mobile;
    - char *homezip;
    - guint16 homecountry;
    -/* guint8 timezone;
    - guint8 hideemail; */
    -
    - /* personal (0x00dc) */
    - guint8 age;
    - guint8 unknown;
    - guint8 gender;
    - char *personalwebpage;
    - guint16 birthyear;
    - guint8 birthmonth;
    - guint8 birthday;
    - guint8 language1;
    - guint8 language2;
    - guint8 language3;
    -
    - /* work (0x00d2) */
    - char *workcity;
    - char *workstate;
    - char *workphone;
    - char *workfax;
    - char *workaddr;
    - char *workzip;
    - guint16 workcountry;
    - char *workcompany;
    - char *workdivision;
    - char *workposition;
    - char *workwebpage;
    -
    - /* additional personal information (0x00e6) */
    - char *info;
    -
    - /* email (0x00eb) */
    - guint16 numaddresses;
    - char **email2;
    -
    - /* status note info */
    - guint8 icbm_cookie[8];
    - char *status_note_title;
    -
    - gboolean for_auth_request;
    - char *auth_request_reason;
    -};
    -
    -int aim_icq_setsecurity(OscarData *od, gboolean auth_required, gboolean webaware);
    -int aim_icq_changepasswd(OscarData *od, const char *passwd);
    -int aim_icq_getalias(OscarData *od, const char *uin, gboolean for_auth_request, char *auth_request_reason);
    -int aim_icq_getallinfo(OscarData *od, const char *uin);
    -int aim_icq_sendsms(OscarData *od, const char *name, const char *msg, const char *alias);
    -
    -
    -/* 0x0017 - family_auth.c */
    -void aim_sendcookie(OscarData *, FlapConnection *, const guint16 length, const guint8 *);
    -void aim_admin_changepasswd(OscarData *, FlapConnection *, const char *newpw, const char *curpw);
    -void aim_admin_reqconfirm(OscarData *od, FlapConnection *conn);
    -void aim_admin_getinfo(OscarData *od, FlapConnection *conn, guint16 info);
    -void aim_admin_setemail(OscarData *od, FlapConnection *conn, const char *newemail);
    -void aim_admin_setnick(OscarData *od, FlapConnection *conn, const char *newnick);
    -
    -
    -
    -/* 0x0018 - family_alert.c */
    -struct aim_emailinfo
    -{
    - guint8 *cookie16;
    - guint8 *cookie8;
    - char *url;
    - guint16 nummsgs;
    - guint8 unread;
    - char *domain;
    - guint16 flag;
    - struct aim_emailinfo *next;
    -};
    -
    -int aim_email_sendcookies(OscarData *od);
    -int aim_email_activate(OscarData *od);
    -
    -
    -
    -/* tlv.c - TLV handling */
    -
    -/* TLV structure */
    -typedef struct aim_tlv_s
    -{
    - guint16 type;
    - guint16 length;
    - guint8 *value;
    -} aim_tlv_t;
    -
    -/* TLV handling functions */
    -char *aim_tlv_getvalue_as_string(aim_tlv_t *tlv);
    -
    -aim_tlv_t *aim_tlv_gettlv(GSList *list, const guint16 type, const int nth);
    -int aim_tlv_getlength(GSList *list, const guint16 type, const int nth);
    -char *aim_tlv_getstr(GSList *list, const guint16 type, const int nth);
    -guint8 aim_tlv_get8(GSList *list, const guint16 type, const int nth);
    -guint16 aim_tlv_get16(GSList *list, const guint16 type, const int nth);
    -guint32 aim_tlv_get32(GSList *list, const guint16 type, const int nth);
    -
    -/* TLV list handling functions */
    -GSList *aim_tlvlist_read(ByteStream *bs);
    -GSList *aim_tlvlist_readnum(ByteStream *bs, guint16 num);
    -GSList *aim_tlvlist_readlen(ByteStream *bs, guint16 len);
    -GSList *aim_tlvlist_copy(GSList *orig);
    -
    -int aim_tlvlist_count(GSList *list);
    -int aim_tlvlist_size(GSList *list);
    -int aim_tlvlist_cmp(GSList *one, GSList *two);
    -int aim_tlvlist_write(ByteStream *bs, GSList **list);
    -void aim_tlvlist_free(GSList *list);
    -
    -int aim_tlvlist_add_raw(GSList **list, const guint16 type, const guint16 length, const guint8 *value);
    -int aim_tlvlist_add_noval(GSList **list, const guint16 type);
    -int aim_tlvlist_add_8(GSList **list, const guint16 type, const guint8 value);
    -int aim_tlvlist_add_16(GSList **list, const guint16 type, const guint16 value);
    -int aim_tlvlist_add_32(GSList **list, const guint16 type, const guint32 value);
    -int aim_tlvlist_add_str(GSList **list, const guint16 type, const char *value);
    -int aim_tlvlist_add_caps(GSList **list, const guint16 type, const guint64 caps, const char *mood);
    -int aim_tlvlist_add_userinfo(GSList **list, guint16 type, aim_userinfo_t *userinfo);
    -int aim_tlvlist_add_chatroom(GSList **list, guint16 type, guint16 exchange, const char *roomname, guint16 instance);
    -int aim_tlvlist_add_frozentlvlist(GSList **list, guint16 type, GSList **tl);
    -
    -int aim_tlvlist_replace_raw(GSList **list, const guint16 type, const guint16 lenth, const guint8 *value);
    -int aim_tlvlist_replace_str(GSList **list, const guint16 type, const char *str);
    -int aim_tlvlist_replace_noval(GSList **list, const guint16 type);
    -int aim_tlvlist_replace_8(GSList **list, const guint16 type, const guint8 value);
    -int aim_tlvlist_replace_16(GSList **list, const guint16 type, const guint16 value);
    -int aim_tlvlist_replace_32(GSList **list, const guint16 type, const guint32 value);
    -
    -void aim_tlvlist_remove(GSList **list, const guint16 type);
    -
    -
    -
    -/* util.c */
    -/* These are really ugly. You'd think this was LISP. I wish it was. */
    -#define aimutil_put8(buf, data) ((*(buf) = (guint8)(data)&0xff),1)
    -#define aimutil_get8(buf) ((*(buf))&0xff)
    -#define aimutil_put16(buf, data) ( \
    - (*(buf) = (guint8)((data)>>8)&0xff), \
    - (*((buf)+1) = (guint8)(data)&0xff), \
    - 2)
    -#define aimutil_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff))
    -#define aimutil_put32(buf, data) ( \
    - (*((buf)) = (guint8)((data)>>24)&0xff), \
    - (*((buf)+1) = (guint8)((data)>>16)&0xff), \
    - (*((buf)+2) = (guint8)((data)>>8)&0xff), \
    - (*((buf)+3) = (guint8)(data)&0xff), \
    - 4)
    -#define aimutil_get32(buf) ((((*(buf))<<24)&0xff000000) + \
    - (((*((buf)+1))<<16)&0x00ff0000) + \
    - (((*((buf)+2))<< 8)&0x0000ff00) + \
    - (((*((buf)+3) )&0x000000ff)))
    -
    -/* Little-endian versions (damn ICQ) */
    -#define aimutil_putle8(buf, data) ( \
    - (*(buf) = (guint8)(data) & 0xff), \
    - 1)
    -#define aimutil_getle8(buf) ( \
    - (*(buf)) & 0xff \
    - )
    -#define aimutil_putle16(buf, data) ( \
    - (*((buf)+0) = (guint8)((data) >> 0) & 0xff), \
    - (*((buf)+1) = (guint8)((data) >> 8) & 0xff), \
    - 2)
    -#define aimutil_getle16(buf) ( \
    - (((*((buf)+0)) << 0) & 0x00ff) + \
    - (((*((buf)+1)) << 8) & 0xff00) \
    - )
    -#define aimutil_putle32(buf, data) ( \
    - (*((buf)+0) = (guint8)((data) >> 0) & 0xff), \
    - (*((buf)+1) = (guint8)((data) >> 8) & 0xff), \
    - (*((buf)+2) = (guint8)((data) >> 16) & 0xff), \
    - (*((buf)+3) = (guint8)((data) >> 24) & 0xff), \
    - 4)
    -#define aimutil_getle32(buf) ( \
    - (((*((buf)+0)) << 0) & 0x000000ff) + \
    - (((*((buf)+1)) << 8) & 0x0000ff00) + \
    - (((*((buf)+2)) << 16) & 0x00ff0000) + \
    - (((*((buf)+3)) << 24) & 0xff000000))
    -
    -const char *oscar_get_msgerr_reason(size_t reason);
    -int oscar_get_ui_info_int(const char *str, int default_value);
    -const char *oscar_get_ui_info_string(const char *str, const char *default_value);
    -gchar *oscar_get_clientstring(void);
    -
    -guint16 aimutil_iconsum(const guint8 *buf, int buflen);
    -
    -gboolean oscar_util_valid_name(const char *bn);
    -gboolean oscar_util_valid_name_icq(const char *bn);
    -gboolean oscar_util_valid_name_sms(const char *bn);
    -int oscar_util_name_compare(const char *bn1, const char *bn2);
    -gchar *oscar_util_format_string(const char *str, const char *name);
    -gchar *oscar_format_buddies(GSList *buddies, const gchar *no_buddies_message);
    -
    -typedef struct {
    - guint16 family;
    - guint16 subtype;
    - guint16 flags;
    - guint32 id;
    -} aim_modsnac_t;
    -
    -#define AIM_MODULENAME_MAXLEN 16
    -#define AIM_MODFLAG_MULTIFAMILY 0x0001
    -typedef struct aim_module_s
    -{
    - guint16 family;
    - guint16 version;
    - guint16 toolid;
    - guint16 toolversion;
    - guint16 flags;
    - char name[AIM_MODULENAME_MAXLEN+1];
    - int (*snachandler)(OscarData *od, FlapConnection *conn, struct aim_module_s *mod, FlapFrame *rx, aim_modsnac_t *snac, ByteStream *bs);
    - void (*shutdown)(OscarData *od, struct aim_module_s *mod);
    - void *priv;
    - struct aim_module_s *next;
    -} aim_module_t;
    -
    -int aim__registermodule(OscarData *od, int (*modfirst)(OscarData *, aim_module_t *));
    -void aim__shutdownmodules(OscarData *od);
    -aim_module_t *aim__findmodulebygroup(OscarData *od, guint16 group);
    -aim_module_t *aim__findmodule(OscarData *od, const char *name);
    -
    -int admin_modfirst(OscarData *od, aim_module_t *mod);
    -int buddylist_modfirst(OscarData *od, aim_module_t *mod);
    -int bos_modfirst(OscarData *od, aim_module_t *mod);
    -int search_modfirst(OscarData *od, aim_module_t *mod);
    -int stats_modfirst(OscarData *od, aim_module_t *mod);
    -int auth_modfirst(OscarData *od, aim_module_t *mod);
    -int msg_modfirst(OscarData *od, aim_module_t *mod);
    -int misc_modfirst(OscarData *od, aim_module_t *mod);
    -int chatnav_modfirst(OscarData *od, aim_module_t *mod);
    -int chat_modfirst(OscarData *od, aim_module_t *mod);
    -int locate_modfirst(OscarData *od, aim_module_t *mod);
    -int service_modfirst(OscarData *od, aim_module_t *mod);
    -int popups_modfirst(OscarData *od, aim_module_t *mod);
    -int bart_modfirst(OscarData *od, aim_module_t *mod);
    -int ssi_modfirst(OscarData *od, aim_module_t *mod);
    -int icq_modfirst(OscarData *od, aim_module_t *mod);
    -int email_modfirst(OscarData *od, aim_module_t *mod);
    -
    -void aim_genericreq_n(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype);
    -void aim_genericreq_n_snacid(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype);
    -void aim_genericreq_l(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype, guint32 *);
    -
    -/* bstream.c */
    -int byte_stream_new(ByteStream *bs, size_t len);
    -int byte_stream_init(ByteStream *bs, guint8 *data, size_t len);
    -void byte_stream_destroy(ByteStream *bs);
    -size_t byte_stream_bytes_left(ByteStream *bs);
    -int byte_stream_curpos(ByteStream *bs);
    -int byte_stream_setpos(ByteStream *bs, size_t off);
    -void byte_stream_rewind(ByteStream *bs);
    -int byte_stream_advance(ByteStream *bs, int n);
    -guint8 byte_stream_get8(ByteStream *bs);
    -guint16 byte_stream_get16(ByteStream *bs);
    -guint32 byte_stream_get32(ByteStream *bs);
    -guint8 byte_stream_getle8(ByteStream *bs);
    -guint16 byte_stream_getle16(ByteStream *bs);
    -guint32 byte_stream_getle32(ByteStream *bs);
    -int byte_stream_getrawbuf(ByteStream *bs, guint8 *buf, size_t len);
    -guint8 *byte_stream_getraw(ByteStream *bs, size_t len);
    -char *byte_stream_getstr(ByteStream *bs, size_t len);
    -int byte_stream_put8(ByteStream *bs, guint8 v);
    -int byte_stream_put16(ByteStream *bs, guint16 v);
    -int byte_stream_put32(ByteStream *bs, guint32 v);
    -int byte_stream_putle8(ByteStream *bs, guint8 v);
    -int byte_stream_putle16(ByteStream *bs, guint16 v);
    -int byte_stream_putle32(ByteStream *bs, guint32 v);
    -int byte_stream_putraw(ByteStream *bs, const guint8 *v, size_t len);
    -int byte_stream_putstr(ByteStream *bs, const char *str);
    -int byte_stream_putbs(ByteStream *bs, ByteStream *srcbs, size_t len);
    -int byte_stream_putuid(ByteStream *bs, OscarData *od);
    -int byte_stream_putcaps(ByteStream *bs, guint64 caps);
    -
    -/**
    - * Inserts a BART asset block into the given byte stream. The flags
    - * and length are set appropriately based on the value of data.
    - */
    -void byte_stream_put_bart_asset(ByteStream *bs, guint16 type, ByteStream *data);
    -
    -/**
    - * A helper function that calls byte_stream_put_bart_asset with the
    - * appropriate data ByteStream given the datastr.
    - */
    -void byte_stream_put_bart_asset_str(ByteStream *bs, guint16 type, const char *datastr);
    -
    -/*
    - * Generic SNAC structure. Rarely if ever used.
    - */
    -typedef struct aim_snac_s {
    - aim_snacid_t id;
    - guint16 family;
    - guint16 type;
    - guint16 flags;
    - void *data;
    - time_t issuetime;
    - struct aim_snac_s *next;
    -} aim_snac_t;
    -
    -/* snac.c */
    -void aim_initsnachash(OscarData *od);
    -aim_snacid_t aim_newsnac(OscarData *, aim_snac_t *newsnac);
    -aim_snacid_t aim_cachesnac(OscarData *od, const guint16 family, const guint16 type, const guint16 flags, const void *data, const int datalen);
    -aim_snac_t *aim_remsnac(OscarData *, aim_snacid_t id);
    -void aim_cleansnacs(OscarData *, int maxage);
    -int aim_putsnac(ByteStream *, guint16 family, guint16 type, aim_snacid_t id);
    -
    -struct chatsnacinfo {
    - guint16 exchange;
    - char name[128];
    - guint16 instance;
    -};
    -
    -struct rateclass {
    - guint16 classid;
    - guint32 windowsize;
    - guint32 clear;
    - guint32 alert;
    - guint32 limit;
    - guint32 disconnect;
    - guint32 current;
    - guint32 max;
    - guint8 dropping_snacs;
    -
    - struct timeval last; /**< The time when we last sent a SNAC of this rate class. */
    -};
    -
    -int aim_cachecookie(OscarData *od, IcbmCookie *cookie);
    -IcbmCookie *aim_uncachecookie(OscarData *od, guint8 *cookie, int type);
    -IcbmCookie *aim_mkcookie(guint8 *, int, void *);
    -IcbmCookie *aim_checkcookie(OscarData *, const unsigned char *, const int);
    -int aim_freecookie(OscarData *od, IcbmCookie *cookie);
    -int aim_cookie_free(OscarData *od, IcbmCookie *cookie);
    -
    -int aim_chat_readroominfo(ByteStream *bs, struct aim_chat_roominfo *outinfo);
    -
    -void flap_connection_destroy_chat(OscarData *od, FlapConnection *conn);
    -
    -/* userinfo.c - displaying user information */
    -
    -void oscar_user_info_append_status(PurpleConnection *gc, PurpleNotifyUserInfo *user_info, PurpleBuddy *b, aim_userinfo_t *userinfo, gboolean use_html_status);
    -void oscar_user_info_append_extra_info(PurpleConnection *gc, PurpleNotifyUserInfo *user_info, PurpleBuddy *b, aim_userinfo_t *userinfo);
    -void oscar_user_info_display_error(OscarData *od, guint16 error_reason, char *buddy);
    -void oscar_user_info_display_icq(OscarData *od, struct aim_icq_info *info);
    -void oscar_user_info_display_aim(OscarData *od, aim_userinfo_t *userinfo);
    -
    -/* authorization.c - OSCAR authorization requests */
    -void oscar_auth_sendrequest(PurpleConnection *gc, const char *name, const char *msg);
    -void oscar_auth_sendrequest_menu(PurpleBlistNode *node, gpointer ignored);
    -void oscar_auth_recvrequest(PurpleConnection *gc, gchar *name, gchar *nick, gchar *reason);
    -
    -void oscar_set_aim_permdeny(PurpleConnection *gc);
    -
    -struct buddyinfo
    -{
    - gboolean typingnot;
    - guint32 ipaddr;
    -
    - unsigned long ico_me_len;
    - unsigned long ico_me_csum;
    - time_t ico_me_time;
    - gboolean ico_informed;
    -
    - unsigned long ico_len;
    - unsigned long ico_csum;
    - time_t ico_time;
    - gboolean ico_need;
    - gboolean ico_sent;
    -};
    -
    -struct name_data
    -{
    - PurpleConnection *gc;
    - gchar *name;
    - gchar *nick;
    -};
    -
    -void oscar_free_name_data(struct name_data *data);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _OSCAR_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/p2p.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,264 +0,0 @@
    -/**
    - * @file p2p.h MSN P2P functions
    - *
    - * 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
    - */
    -
    -#ifndef MSN_P2P_H
    -#define MSN_P2P_H
    -
    -typedef struct {
    - guint32 session_id;
    - guint32 id;
    - /**
    - * In a MsnSlpMessage:
    - * For outgoing messages this is the number of bytes from buffer that
    - * have already been sent out. For incoming messages this is the
    - * number of bytes that have been written to buffer.
    - */
    - guint64 offset;
    - guint64 total_size;
    - guint32 length;
    - guint32 flags;
    - guint32 ack_id;
    - guint32 ack_sub_id;
    - guint64 ack_size;
    -/* guint8 body[1]; */
    -} MsnP2PHeader;
    -#define P2P_PACKET_HEADER_SIZE (6 * 4 + 3 * 8)
    -
    -typedef struct {
    - guint8 header_len;
    - guint8 opcode;
    - guint16 message_len;
    - guint32 base_id;
    - GSList *header_tlv;
    - guint8 data_header_len;
    - guint8 data_tf;
    - guint16 package_number;
    - guint32 session_id;
    - GSList *data_tlv;
    -/* guint8 body[1]; */
    -} MsnP2Pv2Header;
    -
    -typedef struct {
    - guint16 protocol_version;
    - guint16 implementation_id;
    - guint16 version;
    - guint16 reserved;
    - guint32 caps;
    -} P2PPeerInfo;
    -
    -typedef enum
    -{
    - TF_FIRST = 0x01, /**< The first package. */
    - TF_MSNOBJ = 0x04, /**< Payload contains binary data for MsnObject. */
    - TF_FILE = 0x06 /**< Payload contains binary data. */
    -} TF;
    -
    -typedef enum
    -{
    - P2P_HEADER_TLV_TYPE_PEER_INFO = 0x01, /**< Client peer info */
    - P2P_HEADER_TLV_TYPE_ACK = 0x02, /**< ACK */
    - P2P_HEADER_TLV_TYPE_NAK = 0x03 /**< NAK */
    -} P2PHeaderTLVType;
    -
    -typedef enum
    -{
    - P2P_DATA_TLV_REMAINING = 0x01, /**< Indicates the remaining data to transfer.*/
    -} P2PDataTLVType;
    -
    -typedef enum
    -{
    - P2P_PI_PVER = 0x0200,
    - P2P_PI_IMP_ID = 0,
    - P2P_PI_VER = 0x0e00,
    - P2P_PI_RES = 0,
    - P2P_PI_CAPS = 0x0000010f
    -} P2PPeerInfoVal;
    -
    -typedef struct
    -{
    - guint32 value;
    -} MsnP2PFooter;
    -#define P2P_PACKET_FOOTER_SIZE (1 * 4)
    -
    -typedef enum
    -{
    - MSN_P2P_VERSION_ONE = 0,
    - MSN_P2P_VERSION_TWO = 1,
    -} MsnP2PVersion;
    -
    -typedef struct {
    - MsnP2PVersion version;
    - union {
    - MsnP2PHeader v1;
    - MsnP2Pv2Header v2;
    - } header;
    - MsnP2PFooter footer;
    -} MsnP2PInfo;
    -
    -typedef enum
    -{
    - P2P_NO_FLAG = 0x0, /**< No flags specified */
    - P2P_OUT_OF_ORDER = 0x1, /**< Chunk out-of-order */
    - P2P_ACK = 0x2, /**< Acknowledgement */
    - P2P_PENDING_INVITE = 0x4, /**< There is a pending invite */
    - P2P_BINARY_ERROR = 0x8, /**< Error on the binary level */
    - P2P_FILE = 0x10, /**< File */
    - P2P_MSN_OBJ_DATA = 0x20, /**< MsnObject data */
    - P2P_CLOSE = 0x40, /**< Close session */
    - P2P_TLP_ERROR = 0x80, /**< Error at transport layer protocol */
    - P2P_DC_HANDSHAKE = 0x100, /**< Direct Handshake */
    - P2P_WLM2009_COMP = 0x1000000, /**< Compatibility with WLM 2009 */
    - P2P_FILE_DATA = 0x1000030 /**< File transfer data */
    -} MsnP2PHeaderFlag;
    -/* Info From:
    - * http://msnpiki.msnfanatic.com/index.php/MSNC:P2Pv1_Headers#Flags
    - * http://trac.kmess.org/changeset/ba04d0c825769d23370511031c47f6be75fe9b86
    - * #7180
    - */
    -
    -typedef enum
    -{
    - P2P_APPID_SESSION = 0x0, /**< Negotiating session */
    - P2P_APPID_OBJ = 0x1, /**< MsnObject (Display or Emoticon) */
    - P2P_APPID_FILE = 0x2, /**< File transfer */
    - P2P_APPID_EMOTE = 0xB, /**< CustomEmoticon */
    - P2P_APPID_DISPLAY = 0xC /**< Display Image */
    -} MsnP2PAppId;
    -
    -typedef enum
    -{
    - P2P_OPCODE_NONE = 0x00,
    - P2P_OPCODE_SYN = 0x01,
    - P2P_OPCODE_RAK = 0x02
    -} MsnP2Pv2OpCode;
    -
    -MsnP2PInfo *
    -msn_p2p_info_new(MsnP2PVersion version);
    -
    -MsnP2PInfo *
    -msn_p2p_info_dup(MsnP2PInfo *info);
    -
    -void
    -msn_p2p_info_free(MsnP2PInfo *info);
    -
    -size_t
    -msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire, size_t max_len);
    -
    -char *
    -msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len);
    -
    -size_t
    -msn_p2p_footer_from_wire(MsnP2PInfo *info, const char *wire);
    -
    -char *
    -msn_p2p_footer_to_wire(MsnP2PInfo *info, size_t *len);
    -
    -void
    -msn_p2p_info_to_string(MsnP2PInfo *info, GString *str);
    -
    -gboolean
    -msn_p2p_msg_is_data(const MsnP2PInfo *info);
    -
    -gboolean
    -msn_p2p_info_is_valid(MsnP2PInfo *info);
    -
    -gboolean
    -msn_p2p_info_is_first(MsnP2PInfo *info);
    -
    -gboolean
    -msn_p2p_info_is_final(MsnP2PInfo *info);
    -
    -void
    -msn_p2p_info_create_ack(MsnP2PInfo *old_info, MsnP2PInfo *new_info);
    -
    -gboolean
    -msn_p2p_info_require_ack(MsnP2PInfo *info);
    -
    -gboolean
    -msn_p2p_info_is_ack(MsnP2PInfo *info);
    -
    -void
    -msn_p2p_info_init_first(MsnP2PInfo *new_info, MsnP2PInfo *old_info);
    -
    -guint32
    -msn_p2p_info_get_session_id(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_id(MsnP2PInfo *info);
    -
    -guint64
    -msn_p2p_info_get_offset(MsnP2PInfo *info);
    -
    -guint64
    -msn_p2p_info_get_total_size(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_length(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_flags(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_ack_id(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info);
    -
    -guint64
    -msn_p2p_info_get_ack_size(MsnP2PInfo *info);
    -
    -guint32
    -msn_p2p_info_get_app_id(MsnP2PInfo *info);
    -
    -void
    -msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id);
    -
    -void
    -msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id);
    -
    -void
    -msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset);
    -
    -void
    -msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size);
    -
    -void
    -msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length);
    -
    -void
    -msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags);
    -
    -void
    -msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id);
    -
    -void
    -msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id);
    -
    -void
    -msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size);
    -
    -void
    -msn_p2p_info_set_app_id(MsnP2PInfo *info, guint32 app_id);
    -
    -#endif /* MSN_P2P_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/page.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,81 +0,0 @@
    -/**
    - * @file page.h Paging functions
    - *
    - * 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
    - */
    -#ifndef MSN_PAGE_H
    -#define MSN_PAGE_H
    -
    -typedef struct _MsnPage MsnPage;
    -
    -#include "session.h"
    -
    -/**
    - * A page.
    - */
    -struct _MsnPage
    -{
    - char *from_location;
    - char *from_phone;
    -
    - char *body;
    -};
    -
    -/**
    - * Creates a new, empty page.
    - *
    - * @return A new page.
    - */
    -MsnPage *msn_page_new(void);
    -
    -/**
    - * Destroys a page.
    - */
    -void msn_page_destroy(MsnPage *page);
    -
    -/**
    - * Generates the payload data of a page.
    - *
    - * @param page The page.
    - * @param ret_size The returned size of the payload.
    - *
    - * @return The payload data of a page.
    - */
    -char *msn_page_gen_payload(const MsnPage *page, size_t *ret_size);
    -
    -/**
    - * Sets the body of a page.
    - *
    - * @param page The page.
    - * @param body The body of the page.
    - */
    -void msn_page_set_body(MsnPage *page, const char *body);
    -
    -/**
    - * Returns the body of the page.
    - *
    - * @param page The page.
    - *
    - * @return The body of the page.
    - */
    -const char *msn_page_get_body(const MsnPage *page);
    -
    -#endif /* MSN_PAGE_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/peer.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,282 +0,0 @@
    -/*
    - * Purple's oscar protocol plugin
    - * This file is the legal property of its developers.
    - * Please see the AUTHORS file distributed alongside this file.
    - *
    - * This library is free software; you can redistribute it and/or
    - * modify it under the terms of the GNU Lesser General Public
    - * License as published by the Free Software Foundation; either
    - * version 2 of the License, or (at your option) any later version.
    - *
    - * This library 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
    - * Lesser General Public License for more details.
    - *
    - * You should have received a copy of the GNU Lesser General Public
    - * License along with this library; if not, write to the Free Software
    - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    -*/
    -
    -/*
    - * OFT and ODC Services
    - */
    -
    -#ifndef _PEER_H_
    -#define _PEER_H_
    -
    -#include "ft.h"
    -#include "network.h"
    -#include "proxy.h"
    -
    -typedef struct _ChecksumData ChecksumData;
    -typedef struct _OdcFrame OdcFrame;
    -typedef struct _OftFrame OftFrame;
    -typedef struct _ProxyFrame ProxyFrame;
    -typedef struct _PeerConnection PeerConnection;
    -
    -#define PEER_CONNECTION_FLAG_INITIATED_BY_ME 0x0001
    -#define PEER_CONNECTION_FLAG_APPROVED 0x0002
    -#define PEER_CONNECTION_FLAG_TRIED_DIRECT 0x0004
    -#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0008
    -#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0010
    -#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0020
    -
    -#define PEER_TYPE_PROMPT 0x0101 /* "I am going to send you this file, is that ok?" */
    -#define PEER_TYPE_RESUMEACCEPT 0x0106 /* We are accepting the resume */
    -#define PEER_TYPE_ACK 0x0202 /* "Yes, it is ok for you to send me that file" */
    -#define PEER_TYPE_DONE 0x0204 /* "I received that file with no problems" or "I already have that file, great!" */
    -#define PEER_TYPE_RESUME 0x0205 /* Resume transferring, sent by whoever receives */
    -#define PEER_TYPE_RESUMEACK 0x0207 /* Our resume accept was ACKed */
    -
    -#define PEER_TYPE_GETFILE_REQUESTLISTING 0x1108 /* "I have a listing.txt file, do you want it?" */
    -#define PEER_TYPE_GETFILE_RECEIVELISTING 0x1209 /* "Yes, please send me your listing.txt file" */
    -#define PEER_TYPE_GETFILE_RECEIVEDLISTING 0x120a /* received corrupt listing.txt file? I'm just guessing about this one... */
    -#define PEER_TYPE_GETFILE_ACKLISTING 0x120b /* "I received the listing.txt file successfully" */
    -#define PEER_TYPE_GETFILE_REQUESTFILE 0x120c /* "Please send me this file" */
    -
    -/*
    - * For peer proxying
    - */
    -#define AIM_PEER_PROXY_SERVER "ars.oscar.aol.com"
    -#define ICQ_PEER_PROXY_SERVER "ars.icq.com"
    -#define PEER_PROXY_PORT 5190 /* The port we should always connect to */
    -#define PEER_PROXY_PACKET_VERSION 0x044a
    -
    -/* Thanks to Keith Lea and the Joust project for documenting these */
    -#define PEER_PROXY_TYPE_ERROR 0x0001
    -#define PEER_PROXY_TYPE_CREATE 0x0002
    -#define PEER_PROXY_TYPE_CREATED 0x0003
    -#define PEER_PROXY_TYPE_JOIN 0x0004
    -#define PEER_PROXY_TYPE_READY 0x0005
    -
    -struct _OdcFrame
    -{
    - /* guchar magic[4]; */ /* 0 */
    - /* guint16 length; */ /* 4 */
    - guint16 type; /* 6 */
    - guint16 subtype; /* 8 */
    - /* Unknown */ /* 10 */
    - guchar cookie[8]; /* 12 */
    - /* Unknown */
    - /* guint32 payloadlength; */ /* 28 */
    - guint16 encoding; /* 32 */
    - /* Unknown */
    - guint16 flags; /* 38 */
    - /* Unknown */
    - guchar bn[32]; /* 44 */
    - /* Unknown */
    - ByteStream payload; /* 76 */
    -};
    -
    -struct _OftFrame
    -{
    - /* guchar magic[4]; */ /* 0 */
    - /* guint16 length; */ /* 4 */
    - guint16 type; /* 6 */
    - guchar cookie[8]; /* 8 */
    - guint16 encrypt; /* 16 */
    - guint16 compress; /* 18 */
    - guint16 totfiles; /* 20 */
    - guint16 filesleft; /* 22 */
    - guint16 totparts; /* 24 */
    - guint16 partsleft; /* 26 */
    - guint32 totsize; /* 28 */
    - guint32 size; /* 32 */
    - guint32 modtime; /* 36 */
    - guint32 checksum; /* 40 */
    - guint32 rfrcsum; /* 44 */
    - guint32 rfsize; /* 48 */
    - guint32 cretime; /* 52 */
    - guint32 rfcsum; /* 56 */
    - guint32 nrecvd; /* 60 */
    - guint32 recvcsum; /* 64 */
    - guchar idstring[32]; /* 68 */
    - guint8 flags; /* 100 */
    - guint8 lnameoffset; /* 101 */
    - guint8 lsizeoffset; /* 102 */
    - guchar dummy[69]; /* 103 */
    - guchar macfileinfo[16]; /* 172 */
    - guint16 nencode; /* 188 */
    - guint16 nlanguage; /* 190 */
    - guchar *name; /* 192 */
    - size_t name_length;
    - /* Payload? */ /* 256 */
    -};
    -
    -struct _ProxyFrame
    -{
    - /* guint16 length; */ /* 0 */
    - guint16 version; /* 2 */
    - guint16 type; /* 4 */
    - guint32 unknown; /* 6 */
    - guint16 flags; /* 10 */
    - ByteStream payload; /* 12 */
    -};
    -
    -struct _PeerConnection
    -{
    - OscarData *od;
    - guint64 type;
    - char *bn;
    - guchar magic[4];
    - guchar cookie[8];
    - guint16 lastrequestnumber;
    -
    - gboolean ready;
    - int flags; /**< Bitmask of PEER_CONNECTION_FLAG_ */
    - time_t lastactivity; /**< Time of last transmit. */
    - guint destroy_timeout;
    - OscarDisconnectReason disconnect_reason;
    - char *error_message;
    -
    - /**
    - * A pointer to either an OdcFrame or an OftFrame.
    - */
    - gpointer frame;
    -
    - /**
    - * This is only used when the peer connection is being established.
    - */
    - PurpleProxyConnectData *client_connect_data;
    - PurpleProxyConnectData *verified_connect_data;
    -
    - /**
    - * This is only used when the peer connection is being established.
    - */
    - PurpleNetworkListenData *listen_data;
    -
    -
    - /**
    - * This is only used when the peer connection is being established.
    - */
    - guint connect_timeout_timer;
    -
    - /**
    - * This is only used while the remote user is attempting to
    - * connect to us.
    - */
    - int listenerfd;
    -
    - int fd;
    - guint8 header[6];
    - gssize header_received;
    - guint8 proxy_header[12];
    - gssize proxy_header_received;
    - ByteStream buffer_incoming;
    - PurpleCircBuffer *buffer_outgoing;
    - guint watcher_incoming;
    - guint watcher_outgoing;
    -
    - /**
    - * IP address of the proxy server, if applicable.
    - */
    - gchar *proxyip;
    -
    - /**
    - * IP address of the remote user from THEIR point of view.
    - */
    - gchar *clientip;
    -
    - /**
    - * IP address of the remote user from the oscar server's
    - * point of view.
    - */
    - gchar *verifiedip;
    -
    - guint16 port;
    - gboolean use_proxy;
    -
    - /**
    - * Checksumming
    - */
    - ChecksumData *checksum_data;
    -
    - /* TODOFT */
    - PurpleXfer *xfer;
    - OftFrame xferdata;
    - guint sending_data_timer;
    -};
    -
    -/*
    - * For all peer connections
    - */
    -
    -/**
    - * Create a new PeerConnection structure and initialize it with some
    - * sane defaults.
    - *
    - * @param type The type of the peer connection. One of
    - * OSCAR_CAPABILITY_DIRECTIM or OSCAR_CAPABILITY_SENDFILE.
    - */
    -PeerConnection *peer_connection_new(OscarData *od, guint64 type, const char *bn);
    -
    -void peer_connection_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    -void peer_connection_schedule_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    -PeerConnection *peer_connection_find_by_type(OscarData *od, const char *bn, guint64 type);
    -PeerConnection *peer_connection_find_by_cookie(OscarData *od, const char *bn, const guchar *cookie);
    -
    -void peer_connection_listen_cb(gpointer data, gint source, PurpleInputCondition cond);
    -void peer_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond);
    -void peer_connection_send(PeerConnection *conn, ByteStream *bs);
    -
    -void peer_connection_trynext(PeerConnection *conn);
    -void peer_connection_finalize_connection(PeerConnection *conn);
    -void peer_connection_propose(OscarData *od, guint64 type, const char *bn);
    -void peer_connection_got_proposition(OscarData *od, const gchar *bn, const gchar *message, IcbmArgsCh2 *args);
    -
    -/*
    - * For ODC
    - */
    -void peer_odc_close(PeerConnection *conn);
    -void peer_odc_recv_frame(PeerConnection *conn, ByteStream *bs);
    -void peer_odc_send_cookie(PeerConnection *conn);
    -void peer_odc_send_typing(PeerConnection *conn, PurpleTypingState typing);
    -void peer_odc_send_im(PeerConnection *conn, const char *msg, int len, int encoding, gboolean autoreply);
    -
    -/*
    - * For OFT
    - */
    -void peer_oft_close(PeerConnection *conn);
    -void peer_oft_recv_frame(PeerConnection *conn, ByteStream *bs);
    -void peer_oft_send_prompt(PeerConnection *conn);
    -void peer_oft_checksum_destroy(ChecksumData *checksum_data);
    -
    -/* Xfer callbacks for receiving a file */
    -void peer_oft_recvcb_init(PurpleXfer *xfer);
    -void peer_oft_recvcb_end(PurpleXfer *xfer);
    -void peer_oft_recvcb_ack_recv(PurpleXfer *xfer, const guchar *buffer, size_t size);
    -
    -/* Xfer callbacks for sending a file */
    -void peer_oft_sendcb_init(PurpleXfer *xfer);
    -void peer_oft_sendcb_ack(PurpleXfer *xfer, const guchar *buffer, size_t size);
    -
    -/* Xfer callbacks for both sending and receiving */
    -void peer_oft_cb_generic_cancel(PurpleXfer *xfer);
    -
    -/*
    - * For peer proxying
    - */
    -void peer_proxy_connection_established_cb(gpointer data, gint source, const gchar *error_message);
    -
    -#endif /* _PEER_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/plugin.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,740 +0,0 @@
    -/**
    - * @file plugin.h Plugin API
    - * @ingroup core
    - * @see @ref plugin-signals
    - * @see @ref plugin-ids
    - * @see @ref plugin-i18n
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_PLUGIN_H_
    -#define _PURPLE_PLUGIN_H_
    -
    -#include <glib.h>
    -#include <gmodule.h>
    -#include "signals.h"
    -#include "value.h"
    -
    -/** @copydoc _PurplePlugin */
    -typedef struct _PurplePlugin PurplePlugin;
    -/** @copydoc _PurplePluginInfo */
    -typedef struct _PurplePluginInfo PurplePluginInfo;
    -/** @copydoc _PurplePluginUiInfo */
    -typedef struct _PurplePluginUiInfo PurplePluginUiInfo;
    -/** @copydoc _PurplePluginLoaderInfo */
    -typedef struct _PurplePluginLoaderInfo PurplePluginLoaderInfo;
    -
    -/** @copydoc _PurplePluginAction */
    -typedef struct _PurplePluginAction PurplePluginAction;
    -
    -typedef int PurplePluginPriority; /**< Plugin priority. */
    -
    -#include "pluginpref.h"
    -
    -/**
    - * Plugin types.
    - */
    -typedef enum
    -{
    - PURPLE_PLUGIN_UNKNOWN = -1, /**< Unknown type. */
    - PURPLE_PLUGIN_STANDARD = 0, /**< Standard plugin. */
    - PURPLE_PLUGIN_LOADER, /**< Loader plugin. */
    - PURPLE_PLUGIN_PROTOCOL /**< Protocol plugin. */
    -
    -} PurplePluginType;
    -
    -#define PURPLE_PRIORITY_DEFAULT 0
    -#define PURPLE_PRIORITY_HIGHEST 9999
    -#define PURPLE_PRIORITY_LOWEST -9999
    -
    -#define PURPLE_PLUGIN_FLAG_INVISIBLE 0x01
    -
    -#define PURPLE_PLUGIN_MAGIC 5 /* once we hit 6.0.0 I think we can remove this */
    -
    -/**
    - * Detailed information about a plugin.
    - *
    - * This is used in the version 2.0 API and up.
    - */
    -struct _PurplePluginInfo
    -{
    - unsigned int magic;
    - unsigned int major_version;
    - unsigned int minor_version;
    - PurplePluginType type;
    - char *ui_requirement;
    - unsigned long flags;
    - GList *dependencies;
    - PurplePluginPriority priority;
    -
    - char *id;
    - char *name;
    - char *version;
    - char *summary;
    - char *description;
    - char *author;
    - char *homepage;
    -
    - /**
    - * If a plugin defines a 'load' function, and it returns FALSE,
    - * then the plugin will not be loaded.
    - */
    - gboolean (*load)(PurplePlugin *plugin);
    - gboolean (*unload)(PurplePlugin *plugin);
    - void (*destroy)(PurplePlugin *plugin);
    -
    - void *ui_info; /**< Used only by UI-specific plugins to build a preference screen with a custom UI */
    - void *extra_info;
    - PurplePluginUiInfo *prefs_info; /**< Used by any plugin to display preferences. If #ui_info has been specified, this will be ignored. */
    -
    - /**
    - * This callback has a different use depending on whether this
    - * plugin type is PURPLE_PLUGIN_STANDARD or PURPLE_PLUGIN_PROTOCOL.
    - *
    - * If PURPLE_PLUGIN_STANDARD then the list of actions will show up
    - * in the Tools menu, under a submenu with the name of the plugin.
    - * context will be NULL.
    - *
    - * If PURPLE_PLUGIN_PROTOCOL then the list of actions will show up
    - * in the Accounts menu, under a submenu with the name of the
    - * account. context will be set to the PurpleConnection for that
    - * account. This callback will only be called for online accounts.
    - */
    - GList *(*actions)(PurplePlugin *plugin, gpointer context);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/**
    - * Extra information for loader plugins.
    - */
    -struct _PurplePluginLoaderInfo
    -{
    - GList *exts;
    -
    - gboolean (*probe)(PurplePlugin *plugin);
    - gboolean (*load)(PurplePlugin *plugin);
    - gboolean (*unload)(PurplePlugin *plugin);
    - void (*destroy)(PurplePlugin *plugin);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -/**
    - * A plugin handle.
    - */
    -struct _PurplePlugin
    -{
    - gboolean native_plugin; /**< Native C plugin. */
    - gboolean loaded; /**< The loaded state. */
    - void *handle; /**< The module handle. */
    - char *path; /**< The path to the plugin. */
    - PurplePluginInfo *info; /**< The plugin information. */
    - char *error;
    - void *ipc_data; /**< IPC data. */
    - void *extra; /**< Plugin-specific data. */
    - gboolean unloadable; /**< Unloadable */
    - GList *dependent_plugins; /**< Plugins depending on this */
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -#define PURPLE_PLUGIN_LOADER_INFO(plugin) \
    - ((PurplePluginLoaderInfo *)(plugin)->info->extra_info)
    -
    -struct _PurplePluginUiInfo {
    - PurplePluginPrefFrame *(*get_plugin_pref_frame)(PurplePlugin *plugin);
    -
    - int page_num; /**< Reserved */
    - PurplePluginPrefFrame *frame; /**< Reserved */
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -#define PURPLE_PLUGIN_HAS_PREF_FRAME(plugin) \
    - ((plugin)->info != NULL && (plugin)->info->prefs_info != NULL)
    -
    -#define PURPLE_PLUGIN_UI_INFO(plugin) \
    - ((PurplePluginUiInfo*)(plugin)->info->prefs_info)
    -
    -
    -/**
    - * The structure used in the actions member of PurplePluginInfo
    - */
    -struct _PurplePluginAction {
    - char *label;
    - void (*callback)(PurplePluginAction *);
    -
    - /** set to the owning plugin */
    - PurplePlugin *plugin;
    -
    - /** NULL for plugin actions menu, set to the PurpleConnection for
    - account actions menu */
    - gpointer context;
    -
    - gpointer user_data;
    -};
    -
    -#define PURPLE_PLUGIN_HAS_ACTIONS(plugin) \
    - ((plugin)->info != NULL && (plugin)->info->actions != NULL)
    -
    -#define PURPLE_PLUGIN_ACTIONS(plugin, context) \
    - (PURPLE_PLUGIN_HAS_ACTIONS(plugin)? \
    - (plugin)->info->actions(plugin, context): NULL)
    -
    -
    -/**
    - * Handles the initialization of modules.
    - */
    -#if !defined(PURPLE_PLUGINS) || defined(PURPLE_STATIC_PRPL)
    -# define _FUNC_NAME(x) purple_init_##x##_plugin
    -# define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
    - gboolean _FUNC_NAME(pluginname)(void);\
    - gboolean _FUNC_NAME(pluginname)(void) { \
    - PurplePlugin *plugin = purple_plugin_new(TRUE, NULL); \
    - plugin->info = &(plugininfo); \
    - initfunc((plugin)); \
    - purple_plugin_load((plugin)); \
    - return purple_plugin_register(plugin); \
    - }
    -#else /* PURPLE_PLUGINS && !PURPLE_STATIC_PRPL */
    -# define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
    - G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin); \
    - G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin) { \
    - plugin->info = &(plugininfo); \
    - initfunc((plugin)); \
    - return purple_plugin_register(plugin); \
    - }
    -#endif
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Plugin API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new plugin structure.
    - *
    - * @param native Whether or not the plugin is native.
    - * @param path The path to the plugin, or @c NULL if statically compiled.
    - *
    - * @return A new PurplePlugin structure.
    - */
    -PurplePlugin *purple_plugin_new(gboolean native, const char *path);
    -
    -/**
    - * Probes a plugin, retrieving the information on it and adding it to the
    - * list of available plugins.
    - *
    - * @param filename The plugin's filename.
    - *
    - * @return The plugin handle.
    - *
    - * @see purple_plugin_load()
    - * @see purple_plugin_destroy()
    - */
    -PurplePlugin *purple_plugin_probe(const char *filename);
    -
    -/**
    - * Registers a plugin and prepares it for loading.
    - *
    - * This shouldn't be called by anything but the internal module code.
    - * Plugins should use the PURPLE_INIT_PLUGIN() macro to register themselves
    - * with the core.
    - *
    - * @param plugin The plugin to register.
    - *
    - * @return @c TRUE if the plugin was registered successfully. Otherwise
    - * @c FALSE is returned (this happens if the plugin does not contain
    - * the necessary information).
    - */
    -gboolean purple_plugin_register(PurplePlugin *plugin);
    -
    -/**
    - * Attempts to load a previously probed plugin.
    - *
    - * @param plugin The plugin to load.
    - *
    - * @return @c TRUE if successful, or @c FALSE otherwise.
    - *
    - * @see purple_plugin_reload()
    - * @see purple_plugin_unload()
    - */
    -gboolean purple_plugin_load(PurplePlugin *plugin);
    -
    -/**
    - * Unloads the specified plugin.
    - *
    - * @param plugin The plugin handle.
    - *
    - * @return @c TRUE if successful, or @c FALSE otherwise.
    - *
    - * @see purple_plugin_load()
    - * @see purple_plugin_reload()
    - */
    -gboolean purple_plugin_unload(PurplePlugin *plugin);
    -
    -/**
    - * Disable a plugin.
    - *
    - * This function adds the plugin to a list of plugins to "disable at the next
    - * startup" by excluding said plugins from the list of plugins to save. The
    - * UI needs to call purple_plugins_save_loaded() after calling this for it
    - * to have any effect.
    - *
    - * @since 2.3.0
    - */
    -void purple_plugin_disable(PurplePlugin *plugin);
    -
    -/**
    - * Reloads a plugin.
    - *
    - * @param plugin The old plugin handle.
    - *
    - * @return @c TRUE if successful, or @c FALSE otherwise.
    - *
    - * @see purple_plugin_load()
    - * @see purple_plugin_unload()
    - */
    -gboolean purple_plugin_reload(PurplePlugin *plugin);
    -
    -/**
    - * Unloads a plugin and destroys the structure from memory.
    - *
    - * @param plugin The plugin handle.
    - */
    -void purple_plugin_destroy(PurplePlugin *plugin);
    -
    -/**
    - * Returns whether or not a plugin is currently loaded.
    - *
    - * @param plugin The plugin.
    - *
    - * @return @c TRUE if loaded, or @c FALSE otherwise.
    - */
    -gboolean purple_plugin_is_loaded(const PurplePlugin *plugin);
    -
    -/**
    - * Returns whether or not a plugin is unloadable.
    - *
    - * If this returns @c TRUE, the plugin is guaranteed to not
    - * be loadable. However, a return value of @c FALSE does not
    - * guarantee the plugin is loadable.
    - *
    - * @param plugin The plugin.
    - *
    - * @return @c TRUE if the plugin is known to be unloadable,\
    - * @c FALSE otherwise
    - */
    -gboolean purple_plugin_is_unloadable(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's id.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's id.
    - */
    -const gchar *purple_plugin_get_id(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's name.
    - *
    - * @param plugin The plugin.
    - *
    - * @return THe name of the plugin, or @c NULL.
    - */
    -const gchar *purple_plugin_get_name(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's version.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's version or @c NULL.
    - */
    -const gchar *purple_plugin_get_version(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's summary.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's summary.
    - */
    -const gchar *purple_plugin_get_summary(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's description.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's description.
    - */
    -const gchar *purple_plugin_get_description(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's author.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's author.
    - */
    -const gchar *purple_plugin_get_author(const PurplePlugin *plugin);
    -
    -/**
    - * Returns a plugin's homepage.
    - *
    - * @param plugin The plugin.
    - *
    - * @return The plugin's homepage.
    - */
    -const gchar *purple_plugin_get_homepage(const PurplePlugin *plugin);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Plugin IPC API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Registers an IPC command in a plugin.
    - *
    - * @param plugin The plugin to register the command with.
    - * @param command The name of the command.
    - * @param func The function to execute.
    - * @param marshal The marshalling function.
    - * @param ret_value The return value type.
    - * @param num_params The number of parameters.
    - * @param ... The parameter types.
    - *
    - * @return TRUE if the function was registered successfully, or
    - * FALSE otherwise.
    - */
    -gboolean purple_plugin_ipc_register(PurplePlugin *plugin, const char *command,
    - PurpleCallback func,
    - PurpleSignalMarshalFunc marshal,
    - PurpleValue *ret_value, int num_params, ...);
    -
    -/**
    - * Unregisters an IPC command in a plugin.
    - *
    - * @param plugin The plugin to unregister the command from.
    - * @param command The name of the command.
    - */
    -void purple_plugin_ipc_unregister(PurplePlugin *plugin, const char *command);
    -
    -/**
    - * Unregisters all IPC commands in a plugin.
    - *
    - * @param plugin The plugin to unregister the commands from.
    - */
    -void purple_plugin_ipc_unregister_all(PurplePlugin *plugin);
    -
    -/**
    - * Returns a list of value types used for an IPC command.
    - *
    - * @param plugin The plugin.
    - * @param command The name of the command.
    - * @param ret_value The returned return value.
    - * @param num_params The returned number of parameters.
    - * @param params The returned list of parameters.
    - *
    - * @return TRUE if the command was found, or FALSE otherwise.
    - */
    -gboolean purple_plugin_ipc_get_params(PurplePlugin *plugin, const char *command,
    - PurpleValue **ret_value, int *num_params,
    - PurpleValue ***params);
    -
    -/**
    - * Executes an IPC command.
    - *
    - * @param plugin The plugin to execute the command on.
    - * @param command The name of the command.
    - * @param ok TRUE if the call was successful, or FALSE otherwise.
    - * @param ... The parameters to pass.
    - *
    - * @return The return value, which will be NULL if the command doesn't
    - * return a value.
    - */
    -void *purple_plugin_ipc_call(PurplePlugin *plugin, const char *command,
    - gboolean *ok, ...);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Plugins API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Add a new directory to search for plugins
    - *
    - * @param path The new search path.
    - */
    -void purple_plugins_add_search_path(const char *path);
    -
    -/**
    - * Returns a list of plugin search paths.
    - *
    - * @constreturn A list of searched paths.
    - *
    - * @since 2.6.0
    - */
    -GList *purple_plugins_get_search_paths(void);
    -
    -/**
    - * Unloads all loaded plugins.
    - */
    -void purple_plugins_unload_all(void);
    -
    -/**
    - * Unloads all plugins of a specific type.
    - */
    -void purple_plugins_unload(PurplePluginType type);
    -
    -/**
    - * Destroys all registered plugins.
    - */
    -void purple_plugins_destroy_all(void);
    -
    -/**
    - * Saves the list of loaded plugins to the specified preference key
    - *
    - * @param key The preference key to save the list of plugins to.
    - */
    -void purple_plugins_save_loaded(const char *key);
    -
    -/**
    - * Attempts to load all the plugins in the specified preference key
    - * that were loaded when purple last quit.
    - *
    - * @param key The preference key containing the list of plugins.
    - */
    -void purple_plugins_load_saved(const char *key);
    -
    -/**
    - * Probes for plugins in the registered module paths.
    - *
    - * @param ext The extension type to probe for, or @c NULL for all.
    - *
    - * @see purple_plugin_set_probe_path()
    - */
    -void purple_plugins_probe(const char *ext);
    -
    -/**
    - * Returns whether or not plugin support is enabled.
    - *
    - * @return TRUE if plugin support is enabled, or FALSE otherwise.
    - */
    -gboolean purple_plugins_enabled(void);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Registers a function that will be called when probing is finished.
    - *
    - * @param func The callback function.
    - * @param data Data to pass to the callback.
    - * @deprecated If you need this, ask for a plugin-probe signal to be added.
    - */
    -void purple_plugins_register_probe_notify_cb(void (*func)(void *), void *data);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Unregisters a function that would be called when probing is finished.
    - *
    - * @param func The callback function.
    - * @deprecated If you need this, ask for a plugin-probe signal to be added.
    - */
    -void purple_plugins_unregister_probe_notify_cb(void (*func)(void *));
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Registers a function that will be called when a plugin is loaded.
    - *
    - * @param func The callback function.
    - * @param data Data to pass to the callback.
    - * @deprecated Use the plugin-load signal instead.
    - */
    -void purple_plugins_register_load_notify_cb(void (*func)(PurplePlugin *, void *),
    - void *data);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Unregisters a function that would be called when a plugin is loaded.
    - *
    - * @param func The callback function.
    - * @deprecated Use the plugin-load signal instead.
    - */
    -void purple_plugins_unregister_load_notify_cb(void (*func)(PurplePlugin *, void *));
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Registers a function that will be called when a plugin is unloaded.
    - *
    - * @param func The callback function.
    - * @param data Data to pass to the callback.
    - * @deprecated Use the plugin-unload signal instead.
    - */
    -void purple_plugins_register_unload_notify_cb(void (*func)(PurplePlugin *, void *),
    - void *data);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    -/**
    - * Unregisters a function that would be called when a plugin is unloaded.
    - *
    - * @param func The callback function.
    - * @deprecated Use the plugin-unload signal instead.
    - */
    -void purple_plugins_unregister_unload_notify_cb(void (*func)(PurplePlugin *,
    - void *));
    -#endif
    -
    -/**
    - * Finds a plugin with the specified name.
    - *
    - * @param name The plugin name.
    - *
    - * @return The plugin if found, or @c NULL if not found.
    - */
    -PurplePlugin *purple_plugins_find_with_name(const char *name);
    -
    -/**
    - * Finds a plugin with the specified filename (filename with a path).
    - *
    - * @param filename The plugin filename.
    - *
    - * @return The plugin if found, or @c NULL if not found.
    - */
    -PurplePlugin *purple_plugins_find_with_filename(const char *filename);
    -
    -/**
    - * Finds a plugin with the specified basename (filename without a path).
    - *
    - * @param basename The plugin basename.
    - *
    - * @return The plugin if found, or @c NULL if not found.
    - */
    -PurplePlugin *purple_plugins_find_with_basename(const char *basename);
    -
    -/**
    - * Finds a plugin with the specified plugin ID.
    - *
    - * @param id The plugin ID.
    - *
    - * @return The plugin if found, or @c NULL if not found.
    - */
    -PurplePlugin *purple_plugins_find_with_id(const char *id);
    -
    -/**
    - * Returns a list of all loaded plugins.
    - *
    - * @constreturn A list of all loaded plugins.
    - */
    -GList *purple_plugins_get_loaded(void);
    -
    -/**
    - * Returns a list of all valid protocol plugins. A protocol
    - * plugin is considered invalid if it does not contain the call
    - * to the PURPLE_INIT_PLUGIN() macro, or if it was compiled
    - * against an incompatable API version.
    - *
    - * @constreturn A list of all protocol plugins.
    - */
    -GList *purple_plugins_get_protocols(void);
    -
    -/**
    - * Returns a list of all plugins, whether loaded or not.
    - *
    - * @constreturn A list of all plugins.
    - */
    -GList *purple_plugins_get_all(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Plugins SubSytem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the plugin subsystem handle.
    - *
    - * @return The plugin sybsystem handle.
    - */
    -void *purple_plugins_get_handle(void);
    -
    -/**
    - * Initializes the plugin subsystem
    - */
    -void purple_plugins_init(void);
    -
    -/**
    - * Uninitializes the plugin subsystem
    - */
    -void purple_plugins_uninit(void);
    -
    -/*@}*/
    -
    -/**
    - * Allocates and returns a new PurplePluginAction.
    - *
    - * @param label The description of the action to show to the user.
    - * @param callback The callback to call when the user selects this action.
    - */
    -PurplePluginAction *purple_plugin_action_new(const char* label, void (*callback)(PurplePluginAction *));
    -
    -/**
    - * Frees a PurplePluginAction
    - *
    - * @param action The PurplePluginAction to free.
    - */
    -void purple_plugin_action_free(PurplePluginAction *action);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_PLUGIN_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/pluginpref.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,269 +0,0 @@
    -/**
    - * @file pluginpref.h Plugin Preferences 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
    - *
    - */
    -#ifndef _PURPLE_PLUGINPREF_H_
    -#define _PURPLE_PLUGINPREF_H_
    -
    -typedef struct _PurplePluginPrefFrame PurplePluginPrefFrame;
    -typedef struct _PurplePluginPref PurplePluginPref;
    -
    -/**
    - * String format for preferences.
    - */
    -typedef enum
    -{
    - PURPLE_STRING_FORMAT_TYPE_NONE = 0, /**< The string is plain text. */
    - PURPLE_STRING_FORMAT_TYPE_MULTILINE = 1 << 0, /**< The string can have newlines. */
    - PURPLE_STRING_FORMAT_TYPE_HTML = 1 << 1 /**< The string can be in HTML. */
    -} PurpleStringFormatType;
    -
    -typedef enum {
    - PURPLE_PLUGIN_PREF_NONE,
    - PURPLE_PLUGIN_PREF_CHOICE,
    - PURPLE_PLUGIN_PREF_INFO, /**< no-value label */
    - PURPLE_PLUGIN_PREF_STRING_FORMAT /**< The preference has a string value. */
    -} PurplePluginPrefType;
    -
    -#include <glib.h>
    -#include "prefs.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Plugin Preference API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Create a new plugin preference frame
    - *
    - * @return a new PurplePluginPrefFrame
    - */
    -PurplePluginPrefFrame *purple_plugin_pref_frame_new(void);
    -
    -/**
    - * Destroy a plugin preference frame
    - *
    - * @param frame The plugin frame to destroy
    - */
    -void purple_plugin_pref_frame_destroy(PurplePluginPrefFrame *frame);
    -
    -/**
    - * Adds a plugin preference to a plugin preference frame
    - *
    - * @param frame The plugin frame to add the preference to
    - * @param pref The preference to add to the frame
    - */
    -void purple_plugin_pref_frame_add(PurplePluginPrefFrame *frame, PurplePluginPref *pref);
    -
    -/**
    - * Get the plugin preferences from a plugin preference frame
    - *
    - * @param frame The plugin frame to get the plugin preferences from
    - * @constreturn a GList of plugin preferences
    - */
    -GList *purple_plugin_pref_frame_get_prefs(PurplePluginPrefFrame *frame);
    -
    -/**
    - * Create a new plugin preference
    - *
    - * @return a new PurplePluginPref
    - */
    -PurplePluginPref *purple_plugin_pref_new(void);
    -
    -/**
    - * Create a new plugin preference with name
    - *
    - * @param name The name of the pref
    - * @return a new PurplePluginPref
    - */
    -PurplePluginPref *purple_plugin_pref_new_with_name(const char *name);
    -
    -/**
    - * Create a new plugin preference with label
    - *
    - * @param label The label to be displayed
    - * @return a new PurplePluginPref
    - */
    -PurplePluginPref *purple_plugin_pref_new_with_label(const char *label);
    -
    -/**
    - * Create a new plugin preference with name and label
    - *
    - * @param name The name of the pref
    - * @param label The label to be displayed
    - * @return a new PurplePluginPref
    - */
    -PurplePluginPref *purple_plugin_pref_new_with_name_and_label(const char *name, const char *label);
    -
    -/**
    - * Destroy a plugin preference
    - *
    - * @param pref The preference to destroy
    - */
    -void purple_plugin_pref_destroy(PurplePluginPref *pref);
    -
    -/**
    - * Set a plugin pref name
    - *
    - * @param pref The plugin pref
    - * @param name The name of the pref
    - */
    -void purple_plugin_pref_set_name(PurplePluginPref *pref, const char *name);
    -
    -/**
    - * Get a plugin pref name
    - *
    - * @param pref The plugin pref
    - * @return The name of the pref
    - */
    -const char *purple_plugin_pref_get_name(PurplePluginPref *pref);
    -
    -/**
    - * Set a plugin pref label
    - *
    - * @param pref The plugin pref
    - * @param label The label for the plugin pref
    - */
    -void purple_plugin_pref_set_label(PurplePluginPref *pref, const char *label);
    -
    -/**
    - * Get a plugin pref label
    - *
    - * @param pref The plugin pref
    - * @return The label for the plugin pref
    - */
    -const char *purple_plugin_pref_get_label(PurplePluginPref *pref);
    -
    -/**
    - * Set the bounds for an integer pref
    - *
    - * @param pref The plugin pref
    - * @param min The min value
    - * @param max The max value
    - */
    -void purple_plugin_pref_set_bounds(PurplePluginPref *pref, int min, int max);
    -
    -/**
    - * Get the bounds for an integer pref
    - *
    - * @param pref The plugin pref
    - * @param min The min value
    - * @param max The max value
    - */
    -void purple_plugin_pref_get_bounds(PurplePluginPref *pref, int *min, int *max);
    -
    -/**
    - * Set the type of a plugin pref
    - *
    - * @param pref The plugin pref
    - * @param type The type
    - */
    -void purple_plugin_pref_set_type(PurplePluginPref *pref, PurplePluginPrefType type);
    -
    -/**
    - * Get the type of a plugin pref
    - *
    - * @param pref The plugin pref
    - * @return The type
    - */
    -PurplePluginPrefType purple_plugin_pref_get_type(PurplePluginPref *pref);
    -
    -/**
    - * Set the choices for a choices plugin pref
    - *
    - * @param pref The plugin pref
    - * @param label The label for the choice
    - * @param choice A gpointer of the choice
    - */
    -void purple_plugin_pref_add_choice(PurplePluginPref *pref, const char *label, gpointer choice);
    -
    -/**
    - * Get the choices for a choices plugin pref
    - *
    - * @param pref The plugin pref
    - * @constreturn GList of the choices
    - */
    -GList *purple_plugin_pref_get_choices(PurplePluginPref *pref);
    -
    -/**
    - * Set the max length for a string plugin pref
    - *
    - * @param pref The plugin pref
    - * @param max_length The max length of the string
    - */
    -void purple_plugin_pref_set_max_length(PurplePluginPref *pref, unsigned int max_length);
    -
    -/**
    - * Get the max length for a string plugin pref
    - *
    - * @param pref The plugin pref
    - * @return the max length
    - */
    -unsigned int purple_plugin_pref_get_max_length(PurplePluginPref *pref);
    -
    -/**
    - * Sets the masking of a string plugin pref
    - *
    - * @param pref The plugin pref
    - * @param mask The value to set
    - */
    -void purple_plugin_pref_set_masked(PurplePluginPref *pref, gboolean mask);
    -
    -/**
    - * Gets the masking of a string plugin pref
    - *
    - * @param pref The plugin pref
    - * @return The masking
    - */
    -gboolean purple_plugin_pref_get_masked(PurplePluginPref *pref);
    -
    -/**
    - * Sets the format type for a formattable-string plugin pref. You need to set the
    - * pref type to PURPLE_PLUGIN_PREF_STRING_FORMAT first before setting the format.
    - *
    - * @param pref The plugin pref
    - * @param format The format of the string
    - */
    -void purple_plugin_pref_set_format_type(PurplePluginPref *pref, PurpleStringFormatType format);
    -
    -/**
    - * Gets the format type of the formattable-string plugin pref.
    - *
    - * @param pref The plugin pref
    - * @return The format of the pref
    - */
    -PurpleStringFormatType purple_plugin_pref_get_format_type(PurplePluginPref *pref);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_PLUGINPREF_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/pounce.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,389 +0,0 @@
    -/**
    - * @file pounce.h Buddy Pounce 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
    - */
    -#ifndef _PURPLE_POUNCE_H_
    -#define _PURPLE_POUNCE_H_
    -
    -typedef struct _PurplePounce PurplePounce;
    -
    -#include <glib.h>
    -#include "account.h"
    -
    -/**
    - * Events that trigger buddy pounces.
    - */
    -typedef enum
    -{
    - PURPLE_POUNCE_NONE = 0x000, /**< No events. */
    - PURPLE_POUNCE_SIGNON = 0x001, /**< The buddy signed on. */
    - PURPLE_POUNCE_SIGNOFF = 0x002, /**< The buddy signed off. */
    - PURPLE_POUNCE_AWAY = 0x004, /**< The buddy went away. */
    - PURPLE_POUNCE_AWAY_RETURN = 0x008, /**< The buddy returned from away. */
    - PURPLE_POUNCE_IDLE = 0x010, /**< The buddy became idle. */
    - PURPLE_POUNCE_IDLE_RETURN = 0x020, /**< The buddy is no longer idle. */
    - PURPLE_POUNCE_TYPING = 0x040, /**< The buddy started typing. */
    - PURPLE_POUNCE_TYPED = 0x080, /**< The buddy has entered text. */
    - PURPLE_POUNCE_TYPING_STOPPED = 0x100, /**< The buddy stopped typing. */
    - PURPLE_POUNCE_MESSAGE_RECEIVED = 0x200 /**< The buddy sent a message */
    -
    -} PurplePounceEvent;
    -
    -typedef enum
    -{
    - PURPLE_POUNCE_OPTION_NONE = 0x00, /**< No Option */
    - PURPLE_POUNCE_OPTION_AWAY = 0x01 /**< Pounce only when away */
    -} PurplePounceOption;
    -
    -/** A pounce callback. */
    -typedef void (*PurplePounceCb)(PurplePounce *, PurplePounceEvent, void *);
    -
    -/**
    - * A buddy pounce structure.
    - *
    - * Buddy pounces are actions triggered by a buddy-related event. For
    - * example, a sound can be played or an IM window opened when a buddy
    - * signs on or returns from away. Such responses are handled in the
    - * UI. The events themselves are done in the core.
    - */
    -struct _PurplePounce
    -{
    - char *ui_type; /**< The type of UI. */
    -
    - PurplePounceEvent events; /**< The event(s) to pounce on. */
    - PurplePounceOption options; /**< The pounce options */
    - PurpleAccount *pouncer; /**< The user who is pouncing. */
    -
    - char *pouncee; /**< The buddy to pounce on. */
    -
    - GHashTable *actions; /**< The registered actions. */
    -
    - gboolean save; /**< Whether or not the pounce should
    - be saved after activation. */
    - void *data; /**< Pounce-specific data. */
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Buddy Pounce API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new buddy pounce.
    - *
    - * @param ui_type The type of UI the pounce is for.
    - * @param pouncer The account that will pounce.
    - * @param pouncee The buddy to pounce on.
    - * @param event The event(s) to pounce on.
    - * @param option Pounce options.
    - *
    - * @return The new buddy pounce structure.
    - */
    -PurplePounce *purple_pounce_new(const char *ui_type, PurpleAccount *pouncer,
    - const char *pouncee, PurplePounceEvent event,
    - PurplePounceOption option);
    -
    -/**
    - * Destroys a buddy pounce.
    - *
    - * @param pounce The buddy pounce.
    - */
    -void purple_pounce_destroy(PurplePounce *pounce);
    -
    -/**
    - * Destroys all buddy pounces for the account
    - *
    - * @param account The account to remove all pounces from.
    - */
    -void purple_pounce_destroy_all_by_account(PurpleAccount *account);
    -
    -/**
    - * Destroys all buddy pounces for a buddy
    - *
    - * @param buddy The buddy whose pounces are to be removed
    - *
    - * @since 2.8.0
    - */
    -void purple_pounce_destroy_all_by_buddy(PurpleBuddy *buddy);
    -
    -/**
    - * Sets the events a pounce should watch for.
    - *
    - * @param pounce The buddy pounce.
    - * @param events The events to watch for.
    - */
    -void purple_pounce_set_events(PurplePounce *pounce, PurplePounceEvent events);
    -
    -/**
    - * Sets the options for a pounce.
    - *
    - * @param pounce The buddy pounce.
    - * @param options The options for the pounce.
    - */
    -void purple_pounce_set_options(PurplePounce *pounce, PurplePounceOption options);
    -
    -/**
    - * Sets the account that will do the pouncing.
    - *
    - * @param pounce The buddy pounce.
    - * @param pouncer The account that will pounce.
    - */
    -void purple_pounce_set_pouncer(PurplePounce *pounce, PurpleAccount *pouncer);
    -
    -/**
    - * Sets the buddy a pounce should pounce on.
    - *
    - * @param pounce The buddy pounce.
    - * @param pouncee The buddy to pounce on.
    - */
    -void purple_pounce_set_pouncee(PurplePounce *pounce, const char *pouncee);
    -
    -/**
    - * Sets whether or not the pounce should be saved after execution.
    - *
    - * @param pounce The buddy pounce.
    - * @param save @c TRUE if the pounce should be saved, or @c FALSE otherwise.
    - */
    -void purple_pounce_set_save(PurplePounce *pounce, gboolean save);
    -
    -/**
    - * Registers an action type for the pounce.
    - *
    - * @param pounce The buddy pounce.
    - * @param name The action name.
    - */
    -void purple_pounce_action_register(PurplePounce *pounce, const char *name);
    -
    -/**
    - * Enables or disables an action for a pounce.
    - *
    - * @param pounce The buddy pounce.
    - * @param action The name of the action.
    - * @param enabled The enabled state.
    - */
    -void purple_pounce_action_set_enabled(PurplePounce *pounce, const char *action,
    - gboolean enabled);
    -
    -/**
    - * Sets a value for an attribute in an action.
    - *
    - * If @a value is @c NULL, the value will be unset.
    - *
    - * @param pounce The buddy pounce.
    - * @param action The action name.
    - * @param attr The attribute name.
    - * @param value The value.
    - */
    -void purple_pounce_action_set_attribute(PurplePounce *pounce, const char *action,
    - const char *attr, const char *value);
    -
    -/**
    - * Sets the pounce-specific data.
    - *
    - * @param pounce The buddy pounce.
    - * @param data Data specific to the pounce.
    - */
    -void purple_pounce_set_data(PurplePounce *pounce, void *data);
    -
    -/**
    - * Returns the events a pounce should watch for.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return The events the pounce is watching for.
    - */
    -PurplePounceEvent purple_pounce_get_events(const PurplePounce *pounce);
    -
    -/**
    - * Returns the options for a pounce.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return The options for the pounce.
    - */
    -PurplePounceOption purple_pounce_get_options(const PurplePounce *pounce);
    -
    -/**
    - * Returns the account that will do the pouncing.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return The account that will pounce.
    - */
    -PurpleAccount *purple_pounce_get_pouncer(const PurplePounce *pounce);
    -
    -/**
    - * Returns the buddy a pounce should pounce on.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return The buddy to pounce on.
    - */
    -const char *purple_pounce_get_pouncee(const PurplePounce *pounce);
    -
    -/**
    - * Returns whether or not the pounce should save after execution.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return @c TRUE if the pounce should be saved after execution, or
    - * @c FALSE otherwise.
    - */
    -gboolean purple_pounce_get_save(const PurplePounce *pounce);
    -
    -/**
    - * Returns whether or not an action is enabled.
    - *
    - * @param pounce The buddy pounce.
    - * @param action The action name.
    - *
    - * @return @c TRUE if the action is enabled, or @c FALSE otherwise.
    - */
    -gboolean purple_pounce_action_is_enabled(const PurplePounce *pounce,
    - const char *action);
    -
    -/**
    - * Returns the value for an attribute in an action.
    - *
    - * @param pounce The buddy pounce.
    - * @param action The action name.
    - * @param attr The attribute name.
    - *
    - * @return The attribute value, if it exists, or @c NULL.
    - */
    -const char *purple_pounce_action_get_attribute(const PurplePounce *pounce,
    - const char *action,
    - const char *attr);
    -
    -/**
    - * Returns the pounce-specific data.
    - *
    - * @param pounce The buddy pounce.
    - *
    - * @return The data specific to a buddy pounce.
    - */
    -void *purple_pounce_get_data(const PurplePounce *pounce);
    -
    -/**
    - * Executes a pounce with the specified pouncer, pouncee, and event type.
    - *
    - * @param pouncer The account that will do the pouncing.
    - * @param pouncee The buddy that is being pounced.
    - * @param events The events that triggered the pounce.
    - */
    -void purple_pounce_execute(const PurpleAccount *pouncer, const char *pouncee,
    - PurplePounceEvent events);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Buddy Pounce Subsystem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Finds a pounce with the specified event(s) and buddy.
    - *
    - * @param pouncer The account to match against.
    - * @param pouncee The buddy to match against.
    - * @param events The event(s) to match against.
    - *
    - * @return The pounce if found, or @c NULL otherwise.
    - */
    -PurplePounce *purple_find_pounce(const PurpleAccount *pouncer,
    - const char *pouncee, PurplePounceEvent events);
    -
    -
    -/**
    - * Loads the pounces.
    - *
    - * @return @c TRUE if the pounces could be loaded.
    - */
    -gboolean purple_pounces_load(void);
    -
    -/**
    - * Registers a pounce handler for a UI.
    - *
    - * @param ui The UI name.
    - * @param cb The callback function.
    - * @param new_pounce The function called when a pounce is created.
    - * @param free_pounce The function called when a pounce is freed.
    - */
    -void purple_pounces_register_handler(const char *ui, PurplePounceCb cb,
    - void (*new_pounce)(PurplePounce *pounce),
    - void (*free_pounce)(PurplePounce *pounce));
    -
    -/**
    - * Unregisters a pounce handle for a UI.
    - *
    - * @param ui The UI name.
    - */
    -void purple_pounces_unregister_handler(const char *ui);
    -
    -/**
    - * Returns a list of all registered buddy pounces.
    - *
    - * @constreturn The list of buddy pounces.
    - */
    -GList *purple_pounces_get_all(void);
    -
    -/**
    - * Returns a list of registered buddy pounces for the ui-type.
    - *
    - * @param ui The ID of the UI using the core.
    - *
    - * @return The list of buddy pounces. The list should be freed by
    - * the caller when it's no longer used.
    - * @since 2.1.0
    - */
    -GList *purple_pounces_get_all_for_ui(const char *ui);
    -
    -/**
    - * Returns the buddy pounce subsystem handle.
    - *
    - * @return The subsystem handle.
    - */
    -void *purple_pounces_get_handle(void);
    -
    -/**
    - * Initializes the pounces subsystem.
    - */
    -void purple_pounces_init(void);
    -
    -/**
    - * Uninitializes the pounces subsystem.
    - */
    -void purple_pounces_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_POUNCE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/prefs.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,371 +0,0 @@
    -/**
    - * @file prefs.h Prefs 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
    - *
    - */
    -#ifndef _PURPLE_PREFS_H_
    -#define _PURPLE_PREFS_H_
    -
    -#include <glib.h>
    -
    -/**
    - * Preference data types.
    - */
    -typedef enum _PurplePrefType
    -{
    - PURPLE_PREF_NONE, /**< No type. */
    - PURPLE_PREF_BOOLEAN, /**< Boolean. */
    - PURPLE_PREF_INT, /**< Integer. */
    - PURPLE_PREF_STRING, /**< String. */
    - PURPLE_PREF_STRING_LIST, /**< List of strings. */
    - PURPLE_PREF_PATH, /**< Path. */
    - PURPLE_PREF_PATH_LIST /**< List of paths. */
    -
    -} PurplePrefType;
    -
    -/**
    - * The type of callbacks for preference changes.
    - *
    - * @param name the name of the preference which has changed.
    - * @param type the type of the preferenced named @a name
    - * @param val the new value of the preferencs; should be cast to the correct
    - * type. For instance, to recover the value of a #PURPLE_PREF_INT
    - * preference, use <tt>GPOINTER_TO_INT(val)</tt>. Alternatively,
    - * just call purple_prefs_get_int(), purple_prefs_get_string_list()
    - * etc.
    - * @param data Arbitrary data specified when the callback was connected with
    - * purple_prefs_connect_callback().
    - *
    - * @see purple_prefs_connect_callback()
    - */
    -typedef void (*PurplePrefCallback) (const char *name, PurplePrefType type,
    - gconstpointer val, gpointer data);
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Prefs API
    - Preferences are named according to a directory-like structure.
    - Example: "/plugins/core/potato/is_from_idaho" (probably a boolean) */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the prefs subsystem handle.
    - *
    - * @return The prefs subsystem handle.
    - */
    -void *purple_prefs_get_handle(void);
    -
    -/**
    - * Initialize core prefs
    - */
    -void purple_prefs_init(void);
    -
    -/**
    - * Uninitializes the prefs subsystem.
    - */
    -void purple_prefs_uninit(void);
    -
    -/**
    - * Add a new typeless pref.
    - *
    - * @param name The name of the pref
    - */
    -void purple_prefs_add_none(const char *name);
    -
    -/**
    - * Add a new boolean pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - */
    -void purple_prefs_add_bool(const char *name, gboolean value);
    -
    -/**
    - * Add a new integer pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - */
    -void purple_prefs_add_int(const char *name, int value);
    -
    -/**
    - * Add a new string pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - */
    -void purple_prefs_add_string(const char *name, const char *value);
    -
    -/**
    - * Add a new string list pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - * @note This function takes a copy of the strings in the value list. The list
    - * itself and original copies of the strings are up to the caller to
    - * free.
    - */
    -void purple_prefs_add_string_list(const char *name, GList *value);
    -
    -/**
    - * Add a new path pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - */
    -void purple_prefs_add_path(const char *name, const char *value);
    -
    -/**
    - * Add a new path list pref.
    - *
    - * @param name The name of the pref
    - * @param value The initial value to set
    - * @note This function takes a copy of the strings in the value list. The list
    - * itself and original copies of the strings are up to the caller to
    - * free.
    - */
    -void purple_prefs_add_path_list(const char *name, GList *value);
    -
    -
    -/**
    - * Remove a pref.
    - *
    - * @param name The name of the pref
    - */
    -void purple_prefs_remove(const char *name);
    -
    -/**
    - * Rename a pref
    - *
    - * @param oldname The old name of the pref
    - * @param newname The new name for the pref
    - */
    -void purple_prefs_rename(const char *oldname, const char *newname);
    -
    -/**
    - * Rename a boolean pref, toggling it's value
    - *
    - * @param oldname The old name of the pref
    - * @param newname The new name for the pref
    - */
    -void purple_prefs_rename_boolean_toggle(const char *oldname, const char *newname);
    -
    -/**
    - * Remove all prefs.
    - */
    -void purple_prefs_destroy(void);
    -
    -/**
    - * Set raw pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - *
    - * @deprecated We're not really sure what purpose this function serves, so it
    - * will be removed in 3.0.0. Preferences values set using this
    - * function aren't serialized to prefs.xml, which could be
    - * misleading. There is also no purple_prefs_get_generic, which
    - * means that if you can't really get the value (other in a
    - * connected callback). If you think you have a use for this then
    - * please let us know.
    - */
    -/* TODO: When this is removed, also remove struct purple_pref->value.generic */
    -void purple_prefs_set_generic(const char *name, gpointer value);
    -
    -/**
    - * Set boolean pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_bool(const char *name, gboolean value);
    -
    -/**
    - * Set integer pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_int(const char *name, int value);
    -
    -/**
    - * Set string pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_string(const char *name, const char *value);
    -
    -/**
    - * Set string list pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_string_list(const char *name, GList *value);
    -
    -/**
    - * Set path pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_path(const char *name, const char *value);
    -
    -/**
    - * Set path list pref value
    - *
    - * @param name The name of the pref
    - * @param value The value to set
    - */
    -void purple_prefs_set_path_list(const char *name, GList *value);
    -
    -
    -/**
    - * Check if a pref exists
    - *
    - * @param name The name of the pref
    - * @return TRUE if the pref exists. Otherwise FALSE.
    - */
    -gboolean purple_prefs_exists(const char *name);
    -
    -/**
    - * Get pref type
    - *
    - * @param name The name of the pref
    - * @return The type of the pref
    - */
    -PurplePrefType purple_prefs_get_type(const char *name);
    -
    -/**
    - * Get boolean pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -gboolean purple_prefs_get_bool(const char *name);
    -
    -/**
    - * Get integer pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -int purple_prefs_get_int(const char *name);
    -
    -/**
    - * Get string pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -const char *purple_prefs_get_string(const char *name);
    -
    -/**
    - * Get string list pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -GList *purple_prefs_get_string_list(const char *name);
    -
    -/**
    - * Get path pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -const char *purple_prefs_get_path(const char *name);
    -
    -/**
    - * Get path list pref value
    - *
    - * @param name The name of the pref
    - * @return The value of the pref
    - */
    -GList *purple_prefs_get_path_list(const char *name);
    -
    -/**
    - * Returns a list of children for a pref
    - *
    - * @param name The parent pref
    - * @return A list of newly allocated strings denoting the names of the children.
    - * Returns @c NULL if there are no children or if pref doesn't exist.
    - * The caller must free all the strings and the list.
    - *
    - * @since 2.1.0
    - */
    -GList *purple_prefs_get_children_names(const char *name);
    -
    -/**
    - * Add a callback to a pref (and its children)
    - *
    - * @param handle The handle of the receiver.
    - * @param name The name of the preference
    - * @param cb The callback function
    - * @param data The data to pass to the callback function.
    - *
    - * @return An id to disconnect the callback
    - *
    - * @see purple_prefs_disconnect_callback
    - */
    -guint purple_prefs_connect_callback(void *handle, const char *name, PurplePrefCallback cb,
    - gpointer data);
    -
    -/**
    - * Remove a callback to a pref
    - */
    -void purple_prefs_disconnect_callback(guint callback_id);
    -
    -/**
    - * Remove all pref callbacks by handle
    - */
    -void purple_prefs_disconnect_by_handle(void *handle);
    -
    -/**
    - * Trigger callbacks as if the pref changed
    - */
    -void purple_prefs_trigger_callback(const char *name);
    -
    -/**
    - * Read preferences
    - */
    -gboolean purple_prefs_load(void);
    -
    -/**
    - * Rename legacy prefs and delete some that no longer exist.
    - */
    -void purple_prefs_update_old(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_PREFS_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/presence.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,103 +0,0 @@
    -/**
    - * @file presence.h Presence
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_PRESENCE_H_
    -#define PURPLE_JABBER_PRESENCE_H_
    -
    -typedef enum {
    - JABBER_PRESENCE_ERROR = -2,
    - JABBER_PRESENCE_PROBE = -1,
    - JABBER_PRESENCE_AVAILABLE,
    - JABBER_PRESENCE_UNAVAILABLE,
    - JABBER_PRESENCE_SUBSCRIBE,
    - JABBER_PRESENCE_SUBSCRIBED,
    - JABBER_PRESENCE_UNSUBSCRIBE,
    - JABBER_PRESENCE_UNSUBSCRIBED
    -} JabberPresenceType;
    -
    -typedef struct _JabberPresenceChatInfo JabberPresenceChatInfo;
    -typedef struct _JabberPresence JabberPresence;
    -
    -#include "buddy.h"
    -#include "chat.h"
    -#include "jabber.h"
    -#include "jutil.h"
    -#include "xmlnode.h"
    -
    -struct _JabberPresenceChatInfo {
    - GSList *codes;
    - xmlnode *item;
    -};
    -
    -struct _JabberPresence {
    - JabberPresenceType type;
    - JabberID *jid_from;
    - const char *from;
    - const char *to;
    - const char *id;
    -
    - JabberBuddy *jb;
    - JabberChat *chat;
    - JabberPresenceChatInfo chat_info;
    - xmlnode *caps; /* TODO: Temporary, see presence.c:parse_caps */
    -
    - JabberBuddyState state;
    - gchar *status;
    - int priority;
    -
    - char *vcard_avatar_hash;
    - char *nickname;
    -
    - gboolean delayed;
    - time_t sent;
    - int idle;
    -};
    -
    -typedef void (JabberPresenceHandler)(JabberStream *js, JabberPresence *presence,
    - xmlnode *child);
    -void jabber_presence_register_handler(const char *node, const char *xmlns,
    - JabberPresenceHandler *handler);
    -
    -void jabber_presence_init(void);
    -void jabber_presence_uninit(void);
    -
    -void jabber_set_status(PurpleAccount *account, PurpleStatus *status);
    -
    -/**
    - * Send a full presence stanza.
    - *
    - * @param js A JabberStream object.
    - * @param force Force sending the presence stanza, irrespective of whether
    - * the contents seem to have changed.
    - */
    -void jabber_presence_send(JabberStream *js, gboolean force);
    -
    -xmlnode *jabber_presence_create(JabberBuddyState state, const char *msg, int priority); /* DEPRECATED */
    -xmlnode *jabber_presence_create_js(JabberStream *js, JabberBuddyState state, const char *msg, int priority);
    -void jabber_presence_parse(JabberStream *js, xmlnode *packet);
    -void jabber_presence_subscription_set(JabberStream *js, const char *who,
    - const char *type);
    -void jabber_presence_fake_to_self(JabberStream *js, PurpleStatus *status);
    -void purple_status_to_jabber(const PurpleStatus *status, JabberBuddyState *state, char **msg, int *priority);
    -
    -#endif /* PURPLE_JABBER_PRESENCE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/privacy.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,194 +0,0 @@
    -/**
    - * @file privacy.h Privacy 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
    - */
    -#ifndef _PURPLE_PRIVACY_H_
    -#define _PURPLE_PRIVACY_H_
    -
    -/**
    - * Privacy data types.
    - */
    -typedef enum _PurplePrivacyType
    -{
    - PURPLE_PRIVACY_ALLOW_ALL = 1,
    - PURPLE_PRIVACY_DENY_ALL,
    - PURPLE_PRIVACY_ALLOW_USERS,
    - PURPLE_PRIVACY_DENY_USERS,
    - PURPLE_PRIVACY_ALLOW_BUDDYLIST
    -} PurplePrivacyType;
    -
    -#include "account.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Privacy core/UI operations.
    - */
    -typedef struct
    -{
    - void (*permit_added)(PurpleAccount *account, const char *name);
    - void (*permit_removed)(PurpleAccount *account, const char *name);
    - void (*deny_added)(PurpleAccount *account, const char *name);
    - void (*deny_removed)(PurpleAccount *account, const char *name);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurplePrivacyUiOps;
    -
    -/**
    - * Adds a user to the account's permit list.
    - *
    - * @param account The account.
    - * @param name The name of the user to add to the list.
    - * @param local_only If TRUE, only the local list is updated, and not
    - * the server.
    - *
    - * @return TRUE if the user was added successfully, or @c FALSE otherwise.
    - */
    -gboolean purple_privacy_permit_add(PurpleAccount *account, const char *name,
    - gboolean local_only);
    -
    -/**
    - * Removes a user from the account's permit list.
    - *
    - * @param account The account.
    - * @param name The name of the user to add to the list.
    - * @param local_only If TRUE, only the local list is updated, and not
    - * the server.
    - *
    - * @return TRUE if the user was removed successfully, or @c FALSE otherwise.
    - */
    -gboolean purple_privacy_permit_remove(PurpleAccount *account, const char *name,
    - gboolean local_only);
    -
    -/**
    - * Adds a user to the account's deny list.
    - *
    - * @param account The account.
    - * @param name The name of the user to add to the list.
    - * @param local_only If TRUE, only the local list is updated, and not
    - * the server.
    - *
    - * @return TRUE if the user was added successfully, or @c FALSE otherwise.
    - */
    -gboolean purple_privacy_deny_add(PurpleAccount *account, const char *name,
    - gboolean local_only);
    -
    -/**
    - * Removes a user from the account's deny list.
    - *
    - * @param account The account.
    - * @param name The name of the user to add to the list.
    - * @param local_only If TRUE, only the local list is updated, and not
    - * the server.
    - *
    - * @return TRUE if the user was removed successfully, or @c FALSE otherwise.
    - */
    -gboolean purple_privacy_deny_remove(PurpleAccount *account, const char *name,
    - gboolean local_only);
    -
    -/**
    - * Allow a user to send messages. If current privacy setting for the account is:
    - * PURPLE_PRIVACY_ALLOW_USERS: The user is added to the allow-list.
    - * PURPLE_PRIVACY_DENY_USERS : The user is removed from the deny-list.
    - * PURPLE_PRIVACY_ALLOW_ALL : No changes made.
    - * PURPLE_PRIVACY_DENY_ALL : The privacy setting is changed to
    - * PURPLE_PRIVACY_ALLOW_USERS and the user
    - * is added to the allow-list.
    - * PURPLE_PRIVACY_ALLOW_BUDDYLIST: No changes made if the user is already in
    - * the buddy-list. Otherwise the setting is
    - * changed to PURPLE_PRIVACY_ALLOW_USERS, all the
    - * buddies are added to the allow-list, and the
    - * user is also added to the allow-list.
    - *
    - * @param account The account.
    - * @param who The name of the user.
    - * @param local Whether the change is local-only.
    - * @param restore Should the previous allow/deny list be restored if the
    - * privacy setting is changed.
    - */
    -void purple_privacy_allow(PurpleAccount *account, const char *who, gboolean local,
    - gboolean restore);
    -
    -/**
    - * Block messages from a user. If current privacy setting for the account is:
    - * PURPLE_PRIVACY_ALLOW_USERS: The user is removed from the allow-list.
    - * PURPLE_PRIVACY_DENY_USERS : The user is added to the deny-list.
    - * PURPLE_PRIVACY_DENY_ALL : No changes made.
    - * PURPLE_PRIVACY_ALLOW_ALL : The privacy setting is changed to
    - * PURPLE_PRIVACY_DENY_USERS and the user is
    - * added to the deny-list.
    - * PURPLE_PRIVACY_ALLOW_BUDDYLIST: If the user is not in the buddy-list,
    - * then no changes made. Otherwise, the setting
    - * is changed to PURPLE_PRIVACY_ALLOW_USERS, all
    - * the buddies are added to the allow-list, and
    - * this user is removed from the list.
    - *
    - * @param account The account.
    - * @param who The name of the user.
    - * @param local Whether the change is local-only.
    - * @param restore Should the previous allow/deny list be restored if the
    - * privacy setting is changed.
    - */
    -void purple_privacy_deny(PurpleAccount *account, const char *who, gboolean local,
    - gboolean restore);
    -
    -/**
    - * Check the privacy-setting for a user.
    - *
    - * @param account The account.
    - * @param who The name of the user.
    - *
    - * @return @c FALSE if the specified account's privacy settings block the user or @c TRUE otherwise. The meaning of "block" is protocol-dependent and generally relates to status and/or sending of messages.
    - */
    -gboolean purple_privacy_check(PurpleAccount *account, const char *who);
    -
    -/**
    - * Sets the UI operations structure for the privacy subsystem.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_privacy_set_ui_ops(PurplePrivacyUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure for the privacy subsystem.
    - *
    - * @return The UI operations structure.
    - */
    -PurplePrivacyUiOps *purple_privacy_get_ui_ops(void);
    -
    -/**
    - * Initializes the privacy subsystem.
    - */
    -void purple_privacy_init(void);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_PRIVACY_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/proxy.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,372 +0,0 @@
    -/**
    - * @file proxy.h Proxy 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
    - */
    -#ifndef _PURPLE_PROXY_H_
    -#define _PURPLE_PROXY_H_
    -
    -#include <glib.h>
    -#include "eventloop.h"
    -
    -/**
    - * A type of proxy connection.
    - */
    -typedef enum
    -{
    - PURPLE_PROXY_USE_GLOBAL = -1, /**< Use the global proxy information. */
    - PURPLE_PROXY_NONE = 0, /**< No proxy. */
    - PURPLE_PROXY_HTTP, /**< HTTP proxy. */
    - PURPLE_PROXY_SOCKS4, /**< SOCKS 4 proxy. */
    - PURPLE_PROXY_SOCKS5, /**< SOCKS 5 proxy. */
    - PURPLE_PROXY_USE_ENVVAR, /**< Use environmental settings. */
    - PURPLE_PROXY_TOR /**< Use a Tor proxy (SOCKS 5 really) */
    -
    -} PurpleProxyType;
    -
    -/**
    - * Information on proxy settings.
    - */
    -typedef struct
    -{
    - PurpleProxyType type; /**< The proxy type. */
    -
    - char *host; /**< The host. */
    - int port; /**< The port number. */
    - char *username; /**< The username. */
    - char *password; /**< The password. */
    -
    -} PurpleProxyInfo;
    -
    -typedef struct _PurpleProxyConnectData PurpleProxyConnectData;
    -
    -typedef void (*PurpleProxyConnectFunction)(gpointer data, gint source, const gchar *error_message);
    -
    -
    -#include "account.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Proxy structure API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a proxy information structure.
    - *
    - * @return The proxy information structure.
    - */
    -PurpleProxyInfo *purple_proxy_info_new(void);
    -
    -/**
    - * Destroys a proxy information structure.
    - *
    - * @param info The proxy information structure to destroy.
    - */
    -void purple_proxy_info_destroy(PurpleProxyInfo *info);
    -
    -/**
    - * Sets the type of proxy.
    - *
    - * @param info The proxy information.
    - * @param type The proxy type.
    - */
    -void purple_proxy_info_set_type(PurpleProxyInfo *info, PurpleProxyType type);
    -
    -/**
    - * Sets the proxy host.
    - *
    - * @param info The proxy information.
    - * @param host The host.
    - */
    -void purple_proxy_info_set_host(PurpleProxyInfo *info, const char *host);
    -
    -/**
    - * Sets the proxy port.
    - *
    - * @param info The proxy information.
    - * @param port The port.
    - */
    -void purple_proxy_info_set_port(PurpleProxyInfo *info, int port);
    -
    -/**
    - * Sets the proxy username.
    - *
    - * @param info The proxy information.
    - * @param username The username.
    - */
    -void purple_proxy_info_set_username(PurpleProxyInfo *info, const char *username);
    -
    -/**
    - * Sets the proxy password.
    - *
    - * @param info The proxy information.
    - * @param password The password.
    - */
    -void purple_proxy_info_set_password(PurpleProxyInfo *info, const char *password);
    -
    -/**
    - * Returns the proxy's type.
    - *
    - * @param info The proxy information.
    - *
    - * @return The type.
    - */
    -PurpleProxyType purple_proxy_info_get_type(const PurpleProxyInfo *info);
    -
    -/**
    - * Returns the proxy's host.
    - *
    - * @param info The proxy information.
    - *
    - * @return The host.
    - */
    -const char *purple_proxy_info_get_host(const PurpleProxyInfo *info);
    -
    -/**
    - * Returns the proxy's port.
    - *
    - * @param info The proxy information.
    - *
    - * @return The port.
    - */
    -int purple_proxy_info_get_port(const PurpleProxyInfo *info);
    -
    -/**
    - * Returns the proxy's username.
    - *
    - * @param info The proxy information.
    - *
    - * @return The username.
    - */
    -const char *purple_proxy_info_get_username(const PurpleProxyInfo *info);
    -
    -/**
    - * Returns the proxy's password.
    - *
    - * @param info The proxy information.
    - *
    - * @return The password.
    - */
    -const char *purple_proxy_info_get_password(const PurpleProxyInfo *info);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Global Proxy API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns purple's global proxy information.
    - *
    - * @return The global proxy information.
    - */
    -PurpleProxyInfo *purple_global_proxy_get_info(void);
    -
    -/**
    - * Set purple's global proxy information.
    - *
    - * @param info The proxy information.
    - * @since 2.6.0
    - */
    -void purple_global_proxy_set_info(PurpleProxyInfo *info);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Proxy API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the proxy subsystem handle.
    - *
    - * @return The proxy subsystem handle.
    - */
    -void *purple_proxy_get_handle(void);
    -
    -/**
    - * Initializes the proxy subsystem.
    - */
    -void purple_proxy_init(void);
    -
    -/**
    - * Uninitializes the proxy subsystem.
    - */
    -void purple_proxy_uninit(void);
    -
    -/**
    - * Returns configuration of a proxy.
    - *
    - * @param account The account for which the configuration is needed.
    - *
    - * @return The configuration of a proxy.
    - */
    -PurpleProxyInfo *purple_proxy_get_setup(PurpleAccount *account);
    -
    -/**
    - * Makes a connection to the specified host and port. Note that this
    - * function name can be misleading--although it is called "proxy
    - * connect," it is used for establishing any outgoing TCP connection,
    - * whether through a proxy or not.
    - *
    - * @param handle A handle that should be associated with this
    - * connection attempt. The handle can be used
    - * to cancel the connection attempt using the
    - * purple_proxy_connect_cancel_with_handle()
    - * function.
    - * @param account The account making the connection.
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param connect_cb The function to call when the connection is
    - * established. If the connection failed then
    - * fd will be -1 and error message will be set
    - * to something descriptive (hopefully).
    - * @param data User-defined data.
    - *
    - * @return NULL if there was an error, or a reference to an
    - * opaque data structure that can be used to cancel
    - * the pending connection, if needed.
    - */
    -PurpleProxyConnectData *purple_proxy_connect(void *handle,
    - PurpleAccount *account,
    - const char *host, int port,
    - PurpleProxyConnectFunction connect_cb, gpointer data);
    -
    -/**
    - * Makes a connection to the specified host and port. Note that this
    - * function name can be misleading--although it is called "proxy
    - * connect," it is used for establishing any outgoing UDP connection,
    - * whether through a proxy or not.
    - *
    - * @param handle A handle that should be associated with this
    - * connection attempt. The handle can be used
    - * to cancel the connection attempt using the
    - * purple_proxy_connect_cancel_with_handle()
    - * function.
    - * @param account The account making the connection.
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param connect_cb The function to call when the connection is
    - * established. If the connection failed then
    - * fd will be -1 and error message will be set
    - * to something descriptive (hopefully).
    - * @param data User-defined data.
    - *
    - * @return NULL if there was an error, or a reference to an
    - * opaque data structure that can be used to cancel
    - * the pending connection, if needed.
    - */
    -PurpleProxyConnectData *purple_proxy_connect_udp(void *handle,
    - PurpleAccount *account,
    - const char *host, int port,
    - PurpleProxyConnectFunction connect_cb, gpointer data);
    -
    -/**
    - * Makes a connection through a SOCKS5 proxy.
    - *
    - * Note that if the account that is making the connection uses a proxy, this
    - * connection to a SOCKS5 proxy will be made through the account proxy.
    - *
    - * @param handle A handle that should be associated with this
    - * connection attempt. The handle can be used
    - * to cancel the connection attempt using the
    - * purple_proxy_connect_cancel_with_handle()
    - * function.
    - * @param account The account making the connection.
    - * @param gpi The PurpleProxyInfo specifying the proxy settings
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param connect_cb The function to call when the connection is
    - * established. If the connection failed then
    - * fd will be -1 and error message will be set
    - * to something descriptive (hopefully).
    - * @param data User-defined data.
    - *
    - * @return NULL if there was an error, or a reference to an
    - * opaque data structure that can be used to cancel
    - * the pending connection, if needed.
    - */
    -PurpleProxyConnectData *purple_proxy_connect_socks5_account(void *handle,
    - PurpleAccount *account, PurpleProxyInfo *gpi,
    - const char *host, int port,
    - PurpleProxyConnectFunction connect_cb, gpointer data);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PROXY_C_)
    -/**
    - * Makes a connection through a SOCKS5 proxy.
    - *
    - * @param handle A handle that should be associated with this
    - * connection attempt. The handle can be used
    - * to cancel the connection attempt using the
    - * purple_proxy_connect_cancel_with_handle()
    - * function.
    - * @param gpi The PurpleProxyInfo specifying the proxy settings
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param connect_cb The function to call when the connection is
    - * established. If the connection failed then
    - * fd will be -1 and error message will be set
    - * to something descriptive (hopefully).
    - * @param data User-defined data.
    - *
    - * @return NULL if there was an error, or a reference to an
    - * opaque data structure that can be used to cancel
    - * the pending connection, if needed.
    - * @deprecated Use purple_proxy_connect_socks5_account instead
    - */
    -PurpleProxyConnectData *purple_proxy_connect_socks5(void *handle,
    - PurpleProxyInfo *gpi,
    - const char *host, int port,
    - PurpleProxyConnectFunction connect_cb, gpointer data);
    -#endif
    -
    -/**
    - * Cancel an in-progress connection attempt. This should be called
    - * by the PRPL if the user disables an account while it is still
    - * performing the initial sign on. Or when establishing a file
    - * transfer, if we attempt to connect to a remote user but they
    - * are behind a firewall then the PRPL can cancel the connection
    - * attempt early rather than just letting the OS's TCP/IP stack
    - * time-out the connection.
    - */
    -void purple_proxy_connect_cancel(PurpleProxyConnectData *connect_data);
    -
    -/*
    - * Closes all proxy connections registered with the specified handle.
    - *
    - * @param handle The handle.
    - */
    -void purple_proxy_connect_cancel_with_handle(void *handle);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_PROXY_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/prpl.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1019 +0,0 @@
    -/**
    - * @file prpl.h Protocol Plugin functions
    - * @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
    - */
    -
    -/* this file should be all that prpls need to include. therefore, by including
    - * this file, they should get glib, proxy, purple_connection, prpl, etc. */
    -
    -#ifndef _PURPLE_PRPL_H_
    -#define _PURPLE_PRPL_H_
    -
    -typedef struct _PurplePluginProtocolInfo PurplePluginProtocolInfo;
    -/** @copydoc _PurpleAttentionType */
    -typedef struct _PurpleAttentionType PurpleAttentionType;
    -
    -/**************************************************************************/
    -/** @name Basic Protocol Information */
    -/**************************************************************************/
    -
    -typedef enum {
    - PURPLE_ICON_SCALE_DISPLAY = 0x01, /**< We scale the icon when we display it */
    - PURPLE_ICON_SCALE_SEND = 0x02 /**< We scale the icon before we send it to the server */
    -} PurpleIconScaleRules;
    -
    -
    -/**
    - * A description of a Buddy Icon specification. This tells Purple what kind of image file
    - * it should give this prpl, and what kind of image file it should expect back.
    - * Dimensions less than 1 should be ignored and the image not scaled.
    - */
    -typedef struct _PurpleBuddyIconSpec PurpleBuddyIconSpec;
    -
    -/**
    - * A description of a file transfer thumbnail specification.
    - * This tells the UI if and what image formats the prpl support for file
    - * transfer thumbnails.
    - */
    -typedef struct _PurpleThumbnailSpec PurpleThumbnailSpec;
    -
    -/**
    - * This \#define exists just to make it easier to fill out the buddy icon
    - * field in the prpl info struct for protocols that couldn't care less.
    - */
    -#define NO_BUDDY_ICONS {NULL, 0, 0, 0, 0, 0, 0}
    -
    -#ifdef HAVE_UNISTD_H
    -#include <unistd.h>
    -#endif
    -
    -#include "blist.h"
    -#include "conversation.h"
    -#include "ft.h"
    -#include "imgstore.h"
    -#include "media.h"
    -#include "notify.h"
    -#include "proxy.h"
    -#include "plugin.h"
    -#include "roomlist.h"
    -#include "status.h"
    -#include "whiteboard.h"
    -
    -
    -/** @copydoc PurpleBuddyIconSpec */
    -struct _PurpleBuddyIconSpec {
    - /** This is a comma-delimited list of image formats or @c NULL if icons
    - * are not supported. Neither the core nor the prpl will actually
    - * check to see if the data it's given matches this; it's entirely up
    - * to the UI to do what it wants
    - */
    - char *format;
    -
    - int min_width; /**< Minimum width of this icon */
    - int min_height; /**< Minimum height of this icon */
    - int max_width; /**< Maximum width of this icon */
    - int max_height; /**< Maximum height of this icon */
    - size_t max_filesize; /**< Maximum size in bytes */
    - PurpleIconScaleRules scale_rules; /**< How to stretch this icon */
    -};
    -
    -/** Represents an entry containing information that must be supplied by the
    - * user when joining a chat.
    - */
    -struct proto_chat_entry {
    - const char *label; /**< User-friendly name of the entry */
    - const char *identifier; /**< Used by the PRPL to identify the option */
    - gboolean required; /**< True if it's required */
    - gboolean is_int; /**< True if the entry expects an integer */
    - int min; /**< Minimum value in case of integer */
    - int max; /**< Maximum value in case of integer */
    - gboolean secret; /**< True if the entry is secret (password) */
    -};
    -
    -/** Represents "nudges" and "buzzes" that you may send to a buddy to attract
    - * their attention (or vice-versa).
    - */
    -struct _PurpleAttentionType
    -{
    - const char *name; /**< Shown in GUI elements */
    - const char *incoming_description; /**< Shown when sent */
    - const char *outgoing_description; /**< Shown when receied */
    - const char *icon_name; /**< Icon to display (optional) */
    - const char *unlocalized_name; /**< Unlocalized name for UIs needing it */
    -
    - /* Reserved fields for future purposes */
    - gpointer _reserved2;
    - gpointer _reserved3;
    - gpointer _reserved4;
    -};
    -
    -/**
    - * Protocol options
    - *
    - * These should all be stuff that some plugins can do and others can't.
    - */
    -typedef enum
    -{
    - /**
    - * User names are unique to a chat and are not shared between rooms.
    - *
    - * XMPP lets you choose what name you want in chats, so it shouldn't
    - * be pulling the aliases from the buddy list for the chat list;
    - * it gets annoying.
    - */
    - OPT_PROTO_UNIQUE_CHATNAME = 0x00000004,
    -
    - /**
    - * Chat rooms have topics.
    - *
    - * IRC and XMPP support this.
    - */
    - OPT_PROTO_CHAT_TOPIC = 0x00000008,
    -
    - /**
    - * Don't require passwords for sign-in.
    - *
    - * Zephyr doesn't require passwords, so there's no
    - * need for a password prompt.
    - */
    - OPT_PROTO_NO_PASSWORD = 0x00000010,
    -
    - /**
    - * Notify on new mail.
    - *
    - * MSN and Yahoo notify you when you have new mail.
    - */
    - OPT_PROTO_MAIL_CHECK = 0x00000020,
    -
    - /**
    - * Images in IMs.
    - *
    - * Oscar lets you send images in direct IMs.
    - */
    - OPT_PROTO_IM_IMAGE = 0x00000040,
    -
    - /**
    - * Allow passwords to be optional.
    - *
    - * Passwords in IRC are optional, and are needed for certain
    - * functionality.
    - */
    - OPT_PROTO_PASSWORD_OPTIONAL = 0x00000080,
    -
    - /**
    - * Allows font size to be specified in sane point size
    - *
    - * Probably just XMPP and Y!M
    - */
    - OPT_PROTO_USE_POINTSIZE = 0x00000100,
    -
    - /**
    - * Set the Register button active even when the username has not
    - * been specified.
    - *
    - * Gadu-Gadu doesn't need a username to register new account (because
    - * usernames are assigned by the server).
    - */
    - OPT_PROTO_REGISTER_NOSCREENNAME = 0x00000200,
    -
    - /**
    - * Indicates that slash commands are native to this protocol.
    - * Used as a hint that unknown commands should not be sent as messages.
    - * @since 2.1.0
    - */
    - OPT_PROTO_SLASH_COMMANDS_NATIVE = 0x00000400,
    -
    - /**
    - * Indicates that this protocol supports sending a user-supplied message
    - * along with an invitation.
    - * @since 2.8.0
    - */
    - OPT_PROTO_INVITE_MESSAGE = 0x00000800
    -
    -} PurpleProtocolOptions;
    -
    -/**
    - * A protocol plugin information structure.
    - *
    - * Every protocol plugin initializes this structure. It is the gateway
    - * between purple and the protocol plugin. Many of these callbacks can be
    - * NULL. If a callback must be implemented, it has a comment indicating so.
    - */
    -struct _PurplePluginProtocolInfo
    -{
    - PurpleProtocolOptions options; /**< Protocol options. */
    -
    - GList *user_splits; /**< A GList of PurpleAccountUserSplit */
    - GList *protocol_options; /**< A GList of PurpleAccountOption */
    -
    - PurpleBuddyIconSpec icon_spec; /**< The icon spec. */
    -
    - /**
    - * Returns the base icon name for the given buddy and account.
    - * If buddy is NULL and the account is non-NULL, it will return the
    - * name to use for the account's icon. If both are NULL, it will
    - * return the name to use for the protocol's icon.
    - *
    - * This must be implemented.
    - */
    - const char *(*list_icon)(PurpleAccount *account, PurpleBuddy *buddy);
    -
    - /**
    - * Fills the four char**'s with string identifiers for "emblems"
    - * that the UI will interpret and display as relevant
    - */
    - const char *(*list_emblem)(PurpleBuddy *buddy);
    -
    - /**
    - * Gets a short string representing this buddy's status. This will
    - * be shown on the buddy list.
    - */
    - char *(*status_text)(PurpleBuddy *buddy);
    -
    - /**
    - * Allows the prpl to add text to a buddy's tooltip.
    - */
    - void (*tooltip_text)(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboolean full);
    -
    - /**
    - * Returns a list of #PurpleStatusType which exist for this account;
    - * this must be implemented, and must add at least the offline and
    - * online states.
    - */
    - GList *(*status_types)(PurpleAccount *account);
    -
    - /**
    - * Returns a list of #PurpleMenuAction structs, which represent extra
    - * actions to be shown in (for example) the right-click menu for @a
    - * node.
    - */
    - GList *(*blist_node_menu)(PurpleBlistNode *node);
    -
    - /**
    - * Returns a list of #proto_chat_entry structs, which represent
    - * information required by the PRPL to join a chat. libpurple will
    - * call join_chat along with the information filled by the user.
    - *
    - * @return A list of #proto_chat_entry structs
    - */
    - GList *(*chat_info)(PurpleConnection *);
    -
    - /**
    - * Returns a hashtable which maps #proto_chat_entry struct identifiers
    - * to default options as strings based on chat_name. The resulting
    - * hashtable should be created with g_hash_table_new_full(g_str_hash,
    - * g_str_equal, NULL, g_free);. Use #get_chat_name if you instead need
    - * to extract a chat name from a hashtable.
    - *
    - * @param chat_name The chat name to be turned into components
    - * @return Hashtable containing the information extracted from chat_name
    - */
    - GHashTable *(*chat_info_defaults)(PurpleConnection *, const char *chat_name);
    -
    - /* All the server-related functions */
    -
    - /** This must be implemented. */
    - void (*login)(PurpleAccount *);
    -
    - /** This must be implemented. */
    - void (*close)(PurpleConnection *);
    -
    - /**
    - * This PRPL function should return a positive value on success.
    - * If the message is too big to be sent, return -E2BIG. If
    - * the account is not connected, return -ENOTCONN. If the
    - * PRPL is unable to send the message for another reason, return
    - * some other negative value. You can use one of the valid
    - * errno values, or just big something. If the message should
    - * not be echoed to the conversation window, return 0.
    - */
    - int (*send_im)(PurpleConnection *, const char *who,
    - const char *message,
    - PurpleMessageFlags flags);
    -
    - void (*set_info)(PurpleConnection *, const char *info);
    -
    - /**
    - * @return If this protocol requires the PURPLE_TYPING message to
    - * be sent repeatedly to signify that the user is still
    - * typing, then the PRPL should return the number of
    - * seconds to wait before sending a subsequent notification.
    - * Otherwise the PRPL should return 0.
    - */
    - unsigned int (*send_typing)(PurpleConnection *, const char *name, PurpleTypingState state);
    -
    - /**
    - * Should arrange for purple_notify_userinfo() to be called with
    - * @a who's user info.
    - */
    - void (*get_info)(PurpleConnection *, const char *who);
    - void (*set_status)(PurpleAccount *account, PurpleStatus *status);
    -
    - void (*set_idle)(PurpleConnection *, int idletime);
    - void (*change_passwd)(PurpleConnection *, const char *old_pass,
    - const char *new_pass);
    - /**
    - * Add a buddy to a group on the server.
    - *
    - * This PRPL function may be called in situations in which the buddy is
    - * already in the specified group. If the protocol supports
    - * authorization and the user is not already authorized to see the
    - * status of \a buddy, \a add_buddy should request authorization.
    - *
    - * @deprecated Since 2.8.0, add_buddy_with_invite is preferred.
    - * @see add_buddy_with_invite
    - */
    - void (*add_buddy)(PurpleConnection *, PurpleBuddy *buddy, PurpleGroup *group);
    - void (*add_buddies)(PurpleConnection *, GList *buddies, GList *groups);
    - void (*remove_buddy)(PurpleConnection *, PurpleBuddy *buddy, PurpleGroup *group);
    - void (*remove_buddies)(PurpleConnection *, GList *buddies, GList *groups);
    - void (*add_permit)(PurpleConnection *, const char *name);
    - void (*add_deny)(PurpleConnection *, const char *name);
    - void (*rem_permit)(PurpleConnection *, const char *name);
    - void (*rem_deny)(PurpleConnection *, const char *name);
    - void (*set_permit_deny)(PurpleConnection *);
    -
    - /**
    - * Called when the user requests joining a chat. Should arrange for
    - * #serv_got_joined_chat to be called.
    - *
    - * @param components A hashtable containing information required to
    - * join the chat as described by the entries returned
    - * by #chat_info. It may also be called when accepting
    - * an invitation, in which case this matches the
    - * data parameter passed to #serv_got_chat_invite.
    - */
    - void (*join_chat)(PurpleConnection *, GHashTable *components);
    -
    - /**
    - * Called when the user refuses a chat invitation.
    - *
    - * @param components A hashtable containing information required to
    - * join the chat as passed to #serv_got_chat_invite.
    - */
    - void (*reject_chat)(PurpleConnection *, GHashTable *components);
    -
    - /**
    - * Returns a chat name based on the information in components. Use
    - * #chat_info_defaults if you instead need to generate a hashtable
    - * from a chat name.
    - *
    - * @param components A hashtable containing information about the chat.
    - */
    - char *(*get_chat_name)(GHashTable *components);
    -
    - /**
    - * Invite a user to join a chat.
    - *
    - * @param id The id of the chat to invite the user to.
    - * @param message A message displayed to the user when the invitation
    - * is received.
    - * @param who The name of the user to send the invation to.
    - */
    - void (*chat_invite)(PurpleConnection *, int id,
    - const char *message, const char *who);
    - /**
    - * Called when the user requests leaving a chat.
    - *
    - * @param id The id of the chat to leave
    - */
    - void (*chat_leave)(PurpleConnection *, int id);
    -
    - /**
    - * Send a whisper to a user in a chat.
    - *
    - * @param id The id of the chat.
    - * @param who The name of the user to send the whisper to.
    - * @param message The message of the whisper.
    - */
    - void (*chat_whisper)(PurpleConnection *, int id,
    - const char *who, const char *message);
    -
    - /**
    - * Send a message to a chat.
    - * This PRPL function should return a positive value on success.
    - * If the message is too big to be sent, return -E2BIG. If
    - * the account is not connected, return -ENOTCONN. If the
    - * PRPL is unable to send the message for another reason, return
    - * some other negative value. You can use one of the valid
    - * errno values, or just big something.
    - *
    - * @param id The id of the chat to send the message to.
    - * @param message The message to send to the chat.
    - * @param flags A bitwise OR of #PurpleMessageFlags representing
    - * message flags.
    - * @return A positive number or 0 in case of success,
    - * a negative error number in case of failure.
    - */
    - int (*chat_send)(PurpleConnection *, int id, const char *message, PurpleMessageFlags flags);
    -
    - /** If implemented, this will be called regularly for this prpl's
    - * active connections. You'd want to do this if you need to repeatedly
    - * send some kind of keepalive packet to the server to avoid being
    - * disconnected. ("Regularly" is defined by
    - * <code>KEEPALIVE_INTERVAL</code> in <tt>libpurple/connection.c</tt>.)
    - */
    - void (*keepalive)(PurpleConnection *);
    -
    - /** new user registration */
    - void (*register_user)(PurpleAccount *);
    -
    - /**
    - * @deprecated Use #PurplePluginProtocolInfo.get_info instead.
    - */
    - void (*get_cb_info)(PurpleConnection *, int, const char *who);
    - /**
    - * @deprecated Use #PurplePluginProtocolInfo.get_cb_real_name and
    - * #PurplePluginProtocolInfo.status_text instead.
    - */
    - void (*get_cb_away)(PurpleConnection *, int, const char *who);
    -
    - /** save/store buddy's alias on server list/roster */
    - void (*alias_buddy)(PurpleConnection *, const char *who,
    - const char *alias);
    -
    - /** change a buddy's group on a server list/roster */
    - void (*group_buddy)(PurpleConnection *, const char *who,
    - const char *old_group, const char *new_group);
    -
    - /** rename a group on a server list/roster */
    - void (*rename_group)(PurpleConnection *, const char *old_name,
    - PurpleGroup *group, GList *moved_buddies);
    -
    - void (*buddy_free)(PurpleBuddy *);
    -
    - void (*convo_closed)(PurpleConnection *, const char *who);
    -
    - /**
    - * Convert the username @a who to its canonical form. (For example,
    - * AIM treats "fOo BaR" and "foobar" as the same user; this function
    - * should return the same normalized string for both of those.)
    - */
    - const char *(*normalize)(const PurpleAccount *, const char *who);
    -
    - /**
    - * Set the buddy icon for the given connection to @a img. The prpl
    - * does NOT own a reference to @a img; if it needs one, it must
    - * #purple_imgstore_ref(@a img) itself.
    - */
    - void (*set_buddy_icon)(PurpleConnection *, PurpleStoredImage *img);
    -
    - void (*remove_group)(PurpleConnection *gc, PurpleGroup *group);
    -
    - /** Gets the real name of a participant in a chat. For example, on
    - * XMPP this turns a chat room nick <tt>foo</tt> into
    - * <tt>room\@server/foo</tt>
    - * @param gc the connection on which the room is.
    - * @param id the ID of the chat room.
    - * @param who the nickname of the chat participant.
    - * @return the real name of the participant. This string must be
    - * freed by the caller.
    - */
    - char *(*get_cb_real_name)(PurpleConnection *gc, int id, const char *who);
    -
    - void (*set_chat_topic)(PurpleConnection *gc, int id, const char *topic);
    -
    - PurpleChat *(*find_blist_chat)(PurpleAccount *account, const char *name);
    -
    - /* room listing prpl callbacks */
    - PurpleRoomlist *(*roomlist_get_list)(PurpleConnection *gc);
    - void (*roomlist_cancel)(PurpleRoomlist *list);
    - void (*roomlist_expand_category)(PurpleRoomlist *list, PurpleRoomlistRoom *category);
    -
    - /* file transfer callbacks */
    - gboolean (*can_receive_file)(PurpleConnection *, const char *who);
    - void (*send_file)(PurpleConnection *, const char *who, const char *filename);
    - PurpleXfer *(*new_xfer)(PurpleConnection *, const char *who);
    -
    - /** Checks whether offline messages to @a buddy are supported.
    - * @return @c TRUE if @a buddy can be sent messages while they are
    - * offline, or @c FALSE if not.
    - */
    - gboolean (*offline_message)(const PurpleBuddy *buddy);
    -
    - PurpleWhiteboardPrplOps *whiteboard_prpl_ops;
    -
    - /** For use in plugins that may understand the underlying protocol */
    - int (*send_raw)(PurpleConnection *gc, const char *buf, int len);
    -
    - /* room list serialize */
    - char *(*roomlist_room_serialize)(PurpleRoomlistRoom *room);
    -
    - /** Remove the user from the server. The account can either be
    - * connected or disconnected. After the removal is finished, the
    - * connection will stay open and has to be closed!
    - */
    - /* This is here rather than next to register_user for API compatibility
    - * reasons.
    - */
    - void (*unregister_user)(PurpleAccount *, PurpleAccountUnregistrationCb cb, void *user_data);
    -
    - /* Attention API for sending & receiving zaps/nudges/buzzes etc. */
    - gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type);
    - GList *(*get_attention_types)(PurpleAccount *acct);
    -
    - /**
    - * The size of the PurplePluginProtocolInfo. This should always be sizeof(PurplePluginProtocolInfo).
    - * This allows adding more functions to this struct without requiring a major version bump.
    - */
    - unsigned long struct_size;
    -
    - /* NOTE:
    - * If more functions are added, they should accessed using the following syntax:
    - *
    - * if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, new_function))
    - * prpl->new_function(...);
    - *
    - * instead of
    - *
    - * if (prpl->new_function != NULL)
    - * prpl->new_function(...);
    - *
    - * The PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro can be used for the older member
    - * functions (e.g. login, send_im etc.) too.
    - */
    -
    - /** This allows protocols to specify additional strings to be used for
    - * various purposes. The idea is to stuff a bunch of strings in this hash
    - * table instead of expanding the struct for every addition. This hash
    - * table is allocated every call and MUST be unrefed by the caller.
    - *
    - * @param account The account to specify. This can be NULL.
    - * @return The protocol's string hash table. The hash table should be
    - * destroyed by the caller when it's no longer needed.
    - */
    - GHashTable *(*get_account_text_table)(PurpleAccount *account);
    -
    - /**
    - * Initiate a media session with the given contact.
    - *
    - * @param account The account to initiate the media session on.
    - * @param who The remote user to initiate the session with.
    - * @param type The type of media session to initiate.
    - * @return TRUE if the call succeeded else FALSE. (Doesn't imply the media session or stream will be successfully created)
    - */
    - gboolean (*initiate_media)(PurpleAccount *account, const char *who,
    - PurpleMediaSessionType type);
    -
    - /**
    - * Checks to see if the given contact supports the given type of media session.
    - *
    - * @param account The account the contact is on.
    - * @param who The remote user to check for media capability with.
    - * @return The media caps the contact supports.
    - */
    - PurpleMediaCaps (*get_media_caps)(PurpleAccount *account,
    - const char *who);
    -
    - /**
    - * Returns an array of "PurpleMood"s, with the last one having
    - * "mood" set to @c NULL.
    - * @since 2.7.0
    - */
    - PurpleMood *(*get_moods)(PurpleAccount *account);
    -
    - /**
    - * Set the user's "friendly name" (or alias or nickname or
    - * whatever term you want to call it) on the server. The
    - * protocol plugin should call success_cb or failure_cb
    - * *asynchronously* (if it knows immediately that the set will fail,
    - * call one of the callbacks from an idle/0-second timeout) depending
    - * on if the nickname is set successfully.
    - *
    - * @param gc The connection for which to set an alias
    - * @param alias The new server-side alias/nickname for this account,
    - * or NULL to unset the alias/nickname (or return it to
    - * a protocol-specific "default").
    - * @param success_cb Callback to be called if the public alias is set
    - * @param failure_cb Callback to be called if setting the public alias
    - * fails
    - * @see purple_account_set_public_alias
    - * @since 2.7.0
    - */
    - void (*set_public_alias)(PurpleConnection *gc, const char *alias,
    - PurpleSetPublicAliasSuccessCallback success_cb,
    - PurpleSetPublicAliasFailureCallback failure_cb);
    - /**
    - * Retrieve the user's "friendly name" as set on the server.
    - * The protocol plugin should call success_cb or failure_cb
    - * *asynchronously* (even if it knows immediately that the get will fail,
    - * call one of the callbacks from an idle/0-second timeout) depending
    - * on if the nickname is retrieved.
    - *
    - * @param gc The connection for which to retireve the alias
    - * @param success_cb Callback to be called with the retrieved alias
    - * @param failure_cb Callback to be called if the prpl is unable to
    - * retrieve the alias
    - * @see purple_account_get_public_alias
    - * @since 2.7.0
    - */
    - void (*get_public_alias)(PurpleConnection *gc,
    - PurpleGetPublicAliasSuccessCallback success_cb,
    - PurpleGetPublicAliasFailureCallback failure_cb);
    -
    - /**
    - * Add a buddy to a group on the server.
    - *
    - * This PRPL function may be called in situations in which the buddy is
    - * already in the specified group. If the protocol supports
    - * authorization and the user is not already authorized to see the
    - * status of \a buddy, \a add_buddy should request authorization.
    - *
    - * If authorization is required, then use the supplied invite message.
    - *
    - * @since 2.8.0
    - */
    - void (*add_buddy_with_invite)(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char *message);
    - void (*add_buddies_with_invite)(PurpleConnection *pc, GList *buddies, GList *groups, const char *message);
    -};
    -
    -#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \
    - (((G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < G_STRUCT_OFFSET(PurplePluginProtocolInfo, struct_size)) \
    - || (G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < prpl->struct_size)) && \
    - prpl->member != NULL)
    -
    -
    -#define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \
    - ((plugin)->info->type == PURPLE_PLUGIN_PROTOCOL)
    -
    -#define PURPLE_PLUGIN_PROTOCOL_INFO(plugin) \
    - ((PurplePluginProtocolInfo *)(plugin)->info->extra_info)
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Attention Type API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new #PurpleAttentionType object and sets its mandatory parameters.
    - *
    - * @param ulname A non-localized string that can be used by UIs in need of such
    - * non-localized strings. This should be the same as @a name,
    - * without localization.
    - * @param name A localized string that the UI may display for the event. This
    - * should be the same string as @a ulname, with localization.
    - * @param inc_desc A localized description shown when the event is received.
    - * @param out_desc A localized description shown when the event is sent.
    - * @return A pointer to the new object.
    - * @since 2.4.0
    - */
    -PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name,
    - const char *inc_desc, const char *out_desc);
    -
    -/**
    - * Sets the displayed name of the attention-demanding event.
    - *
    - * @param type The attention type.
    - * @param name The localized name that will be displayed by UIs. This should be
    - * the same string given as the unlocalized name, but with
    - * localization.
    - * @since 2.4.0
    - */
    -void purple_attention_type_set_name(PurpleAttentionType *type, const char *name);
    -
    -/**
    - * Sets the description of the attention-demanding event shown in conversations
    - * when the event is received.
    - *
    - * @param type The attention type.
    - * @param desc The localized description for incoming events.
    - * @since 2.4.0
    - */
    -void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc);
    -
    -/**
    - * Sets the description of the attention-demanding event shown in conversations
    - * when the event is sent.
    - *
    - * @param type The attention type.
    - * @param desc The localized description for outgoing events.
    - * @since 2.4.0
    - */
    -void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc);
    -
    -/**
    - * Sets the name of the icon to display for the attention event; this is optional.
    - *
    - * @param type The attention type.
    - * @param name The icon's name.
    - * @note Icons are optional for attention events.
    - * @since 2.4.0
    - */
    -void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name);
    -
    -/**
    - * Sets the unlocalized name of the attention event; some UIs may need this,
    - * thus it is required.
    - *
    - * @param type The attention type.
    - * @param ulname The unlocalized name. This should be the same string given as
    - * the localized name, but without localization.
    - * @since 2.4.0
    - */
    -void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname);
    -
    -/**
    - * Get the attention type's name as displayed by the UI.
    - *
    - * @param type The attention type.
    - * @return The name.
    - * @since 2.4.0
    - */
    -const char *purple_attention_type_get_name(const PurpleAttentionType *type);
    -
    -/**
    - * Get the attention type's description shown when the event is received.
    - *
    - * @param type The attention type.
    - * @return The description.
    - * @since 2.4.0
    - */
    -const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type);
    -
    -/**
    - * Get the attention type's description shown when the event is sent.
    - *
    - * @param type The attention type.
    - * @return The description.
    - * @since 2.4.0
    - */
    -const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type);
    -
    -/**
    - * Get the attention type's icon name.
    - *
    - * @param type The attention type.
    - * @return The icon name or @c NULL if unset/empty.
    - * @note Icons are optional for attention events.
    - * @since 2.4.0
    - */
    -const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type);
    -
    -/**
    - * Get the attention type's unlocalized name; this is useful for some UIs.
    - *
    - * @param type The attention type
    - * @return The unlocalized name.
    - * @since 2.4.0
    - */
    -const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Protocol Plugin API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Notifies Purple that our account's idle state and time have changed.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account.
    - * @param idle The user's idle state.
    - * @param idle_time The user's idle time.
    - */
    -void purple_prpl_got_account_idle(PurpleAccount *account, gboolean idle,
    - time_t idle_time);
    -
    -/**
    - * Notifies Purple of our account's log-in time.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param login_time The user's log-in time.
    - */
    -void purple_prpl_got_account_login_time(PurpleAccount *account, time_t login_time);
    -
    -/**
    - * Notifies Purple that our account's status has changed.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param status_id The status ID.
    - * @param ... A NULL-terminated list of attribute IDs and values,
    - * beginning with the value for @a attr_id.
    - */
    -void purple_prpl_got_account_status(PurpleAccount *account,
    - const char *status_id, ...) G_GNUC_NULL_TERMINATED;
    -
    -/**
    - * Notifies Purple that our account's actions have changed. This is only
    - * called after the initial connection. Emits the account-actions-changed
    - * signal.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account.
    - *
    - * @see account-actions-changed
    - * @since 2.6.0
    - */
    -void purple_prpl_got_account_actions(PurpleAccount *account);
    -
    -/**
    - * Notifies Purple that a buddy's idle state and time have changed.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param name The name of the buddy.
    - * @param idle The user's idle state.
    - * @param idle_time The user's idle time. This is the time at
    - * which the user became idle, in seconds since
    - * the epoch. If the PRPL does not know this value
    - * then it should pass 0.
    - */
    -void purple_prpl_got_user_idle(PurpleAccount *account, const char *name,
    - gboolean idle, time_t idle_time);
    -
    -/**
    - * Notifies Purple of a buddy's log-in time.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param name The name of the buddy.
    - * @param login_time The user's log-in time.
    - */
    -void purple_prpl_got_user_login_time(PurpleAccount *account, const char *name,
    - time_t login_time);
    -
    -/**
    - * Notifies Purple that a buddy's status has been activated.
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param name The name of the buddy.
    - * @param status_id The status ID.
    - * @param ... A NULL-terminated list of attribute IDs and values,
    - * beginning with the value for @a attr_id.
    - */
    -void purple_prpl_got_user_status(PurpleAccount *account, const char *name,
    - const char *status_id, ...) G_GNUC_NULL_TERMINATED;
    -
    -/**
    - * Notifies libpurple that a buddy's status has been deactivated
    - *
    - * This is meant to be called from protocol plugins.
    - *
    - * @param account The account the user is on.
    - * @param name The name of the buddy.
    - * @param status_id The status ID.
    - */
    -void purple_prpl_got_user_status_deactive(PurpleAccount *account, const char *name,
    - const char *status_id);
    -
    -/**
    - * Informs the server that our account's status changed.
    - *
    - * @param account The account the user is on.
    - * @param old_status The previous status.
    - * @param new_status The status that was activated, or deactivated
    - * (in the case of independent statuses).
    - */
    -void purple_prpl_change_account_status(PurpleAccount *account,
    - PurpleStatus *old_status,
    - PurpleStatus *new_status);
    -
    -/**
    - * Retrieves the list of stock status types from a prpl.
    - *
    - * @param account The account the user is on.
    - * @param presence The presence for which we're going to get statuses
    - *
    - * @return List of statuses
    - */
    -GList *purple_prpl_get_statuses(PurpleAccount *account, PurplePresence *presence);
    -
    -/**
    - * Send an attention request message.
    - *
    - * @param gc The connection to send the message on.
    - * @param who Whose attention to request.
    - * @param type_code An index into the prpl's attention_types list determining the type
    - * of the attention request command to send. 0 if prpl only defines one
    - * (for example, Yahoo and MSN), but some protocols define more (MySpaceIM).
    - *
    - * Note that you can't send arbitrary PurpleAttentionType's, because there is
    - * only a fixed set of attention commands.
    - *
    - * @since 2.5.0
    - */
    -void purple_prpl_send_attention(PurpleConnection *gc, const char *who, guint type_code);
    -
    -/**
    - * Process an incoming attention message.
    - *
    - * @param gc The connection that received the attention message.
    - * @param who Who requested your attention.
    - * @param type_code An index into the prpl's attention_types list determining the type
    - * of the attention request command to send.
    - *
    - * @since 2.5.0
    - */
    -void purple_prpl_got_attention(PurpleConnection *gc, const char *who, guint type_code);
    -
    -/**
    - * Process an incoming attention message in a chat.
    - *
    - * @param gc The connection that received the attention message.
    - * @param id The chat id.
    - * @param who Who requested your attention.
    - * @param type_code An index into the prpl's attention_types list determining the type
    - * of the attention request command to send.
    - *
    - * @since 2.5.0
    - */
    -void purple_prpl_got_attention_in_chat(PurpleConnection *gc, int id, const char *who, guint type_code);
    -
    -/**
    - * Determines if the contact supports the given media session type.
    - *
    - * @param account The account the user is on.
    - * @param who The name of the contact to check capabilities for.
    - *
    - * @return The media caps the contact supports.
    - */
    -PurpleMediaCaps purple_prpl_get_media_caps(PurpleAccount *account,
    - const char *who);
    -
    -/**
    - * Initiates a media session with the given contact.
    - *
    - * @param account The account the user is on.
    - * @param who The name of the contact to start a session with.
    - * @param type The type of media session to start.
    - *
    - * @return TRUE if the call succeeded else FALSE. (Doesn't imply the media session or stream will be successfully created)
    - */
    -gboolean purple_prpl_initiate_media(PurpleAccount *account,
    - const char *who,
    - PurpleMediaSessionType type);
    -
    -/**
    - * Signals that the prpl received capabilities for the given contact.
    - *
    - * This function is intended to be used only by prpls.
    - *
    - * @param account The account the user is on.
    - * @param who The name of the contact for which capabilities have been received.
    - * @since 2.7.0
    - */
    -void purple_prpl_got_media_caps(PurpleAccount *account, const char *who);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Protocol Plugin Subsystem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Finds a protocol plugin structure of the specified type.
    - *
    - * @param id The protocol plugin;
    - */
    -PurplePlugin *purple_find_prpl(const char *id);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#ifdef __COVERITY__
    -#undef PURPLE_PROTOCOL_PLUGIN_HAS_FUNC
    -#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) (prpl->member != NULL)
    -#endif
    -
    -#endif /* _PRPL_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/purple.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,105 +0,0 @@
    -/**
    - * @file purple.h Header files and defines
    - * This file contains all the necessary preprocessor directives to include
    - * libpurple's headers and other preprocessor directives required for plugins
    - * or UIs to build. Including this file eliminates the need to directly
    - * include any other libpurple files.
    - *
    - * @ingroup core libpurple
    - * @since 2.3.0
    - */
    -
    -/* 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
    - */
    -
    -#ifndef _PURPLE_PURPLE_H_
    -#define _PURPLE_PURPLE_H_
    -
    -#include <glib.h>
    -
    -#ifndef G_GNUC_NULL_TERMINATED
    -# if __GNUC__ >= 4
    -# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
    -# else
    -# define G_GNUC_NULL_TERMINATED
    -# endif
    -#endif
    -
    -#undef PURPLE_PLUGINS
    -
    -#include <account.h>
    -#include <accountopt.h>
    -#include <blist.h>
    -#include <buddyicon.h>
    -#include <certificate.h>
    -#include <cipher.h>
    -#include <circbuffer.h>
    -#include <cmds.h>
    -#include <connection.h>
    -#include <conversation.h>
    -#include <core.h>
    -#include <debug.h>
    -#include <desktopitem.h>
    -#include <dnsquery.h>
    -#include <dnssrv.h>
    -#include <eventloop.h>
    -#include <ft.h>
    -#include <idle.h>
    -#include <imgstore.h>
    -#include <log.h>
    -#include <media.h>
    -#include <mediamanager.h>
    -#include <mime.h>
    -#include <nat-pmp.h>
    -#include <network.h>
    -#include <notify.h>
    -#include <ntlm.h>
    -#include <plugin.h>
    -#include <pluginpref.h>
    -#include <pounce.h>
    -#include <prefs.h>
    -#include <privacy.h>
    -#include <proxy.h>
    -#include <prpl.h>
    -#include <request.h>
    -#include <roomlist.h>
    -#include <savedstatuses.h>
    -#include <server.h>
    -#include <signals.h>
    -#include <smiley.h>
    -#include <sound.h>
    -#include <sound-theme.h>
    -#include <sound-theme-loader.h>
    -#include <sslconn.h>
    -#include <status.h>
    -#include <stringref.h>
    -#include <stun.h>
    -#include <theme.h>
    -#include <theme-loader.h>
    -#include <theme-manager.h>
    -#include <upnp.h>
    -#include <util.h>
    -#include <value.h>
    -#include <version.h>
    -#include <whiteboard.h>
    -#include <xmlnode.h>
    -
    -#endif
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/request.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1608 +0,0 @@
    -/**
    - * @file request.h Request 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
    - */
    -#ifndef _PURPLE_REQUEST_H_
    -#define _PURPLE_REQUEST_H_
    -
    -#include <stdlib.h>
    -#include <glib-object.h>
    -#include <glib.h>
    -
    -/** @copydoc _PurpleRequestField */
    -typedef struct _PurpleRequestField PurpleRequestField;
    -
    -#include "account.h"
    -
    -#define PURPLE_DEFAULT_ACTION_NONE -1
    -
    -/**
    - * Request types.
    - */
    -typedef enum
    -{
    - PURPLE_REQUEST_INPUT = 0, /**< Text input request. */
    - PURPLE_REQUEST_CHOICE, /**< Multiple-choice request. */
    - PURPLE_REQUEST_ACTION, /**< Action request. */
    - PURPLE_REQUEST_FIELDS, /**< Multiple fields request. */
    - PURPLE_REQUEST_FILE, /**< File open or save request. */
    - PURPLE_REQUEST_FOLDER /**< Folder selection request. */
    -
    -} PurpleRequestType;
    -
    -/**
    - * A type of field.
    - */
    -typedef enum
    -{
    - PURPLE_REQUEST_FIELD_NONE,
    - PURPLE_REQUEST_FIELD_STRING,
    - PURPLE_REQUEST_FIELD_INTEGER,
    - PURPLE_REQUEST_FIELD_BOOLEAN,
    - PURPLE_REQUEST_FIELD_CHOICE,
    - PURPLE_REQUEST_FIELD_LIST,
    - PURPLE_REQUEST_FIELD_LABEL,
    - PURPLE_REQUEST_FIELD_IMAGE,
    - PURPLE_REQUEST_FIELD_ACCOUNT
    -
    -} PurpleRequestFieldType;
    -
    -/**
    - * Multiple fields request data.
    - */
    -typedef struct
    -{
    - GList *groups;
    -
    - GHashTable *fields;
    -
    - GList *required_fields;
    -
    - void *ui_data;
    -
    -} PurpleRequestFields;
    -
    -/**
    - * A group of fields with a title.
    - */
    -typedef struct
    -{
    - PurpleRequestFields *fields_list;
    -
    - char *title;
    -
    - GList *fields;
    -
    -} PurpleRequestFieldGroup;
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_REQUEST_C_)
    -/**
    - * A request field.
    - */
    -struct _PurpleRequestField
    -{
    - PurpleRequestFieldType type;
    - PurpleRequestFieldGroup *group;
    -
    - char *id;
    - char *label;
    - char *type_hint;
    -
    - gboolean visible;
    - gboolean required;
    -
    - union
    - {
    - struct
    - {
    - gboolean multiline;
    - gboolean masked;
    - gboolean editable;
    - char *default_value;
    - char *value;
    -
    - } string;
    -
    - struct
    - {
    - int default_value;
    - int value;
    -
    - } integer;
    -
    - struct
    - {
    - gboolean default_value;
    - gboolean value;
    -
    - } boolean;
    -
    - struct
    - {
    - int default_value;
    - int value;
    -
    - GList *labels;
    -
    - } choice;
    -
    - struct
    - {
    - GList *items;
    - GList *icons;
    - GHashTable *item_data;
    - GList *selected;
    - GHashTable *selected_table;
    -
    - gboolean multiple_selection;
    -
    - } list;
    -
    - struct
    - {
    - PurpleAccount *default_account;
    - PurpleAccount *account;
    - gboolean show_all;
    -
    - PurpleFilterAccountFunc filter_func;
    -
    - } account;
    -
    - struct
    - {
    - unsigned int scale_x;
    - unsigned int scale_y;
    - const char *buffer;
    - gsize size;
    - } image;
    -
    - } u;
    -
    - void *ui_data;
    -
    -};
    -#endif
    -
    -/**
    - * Request UI operations.
    - */
    -typedef struct
    -{
    - /** @see purple_request_input(). */
    - void *(*request_input)(const char *title, const char *primary,
    - const char *secondary, const char *default_value,
    - gboolean multiline, gboolean masked, gchar *hint,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv, void *user_data);
    -
    - /** @see purple_request_choice_varg(). */
    - void *(*request_choice)(const char *title, const char *primary,
    - const char *secondary, int default_value,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv, void *user_data,
    - va_list choices);
    -
    - /** @see purple_request_action_varg(). */
    - void *(*request_action)(const char *title, const char *primary,
    - const char *secondary, int default_action,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv, void *user_data,
    - size_t action_count, va_list actions);
    -
    - /** @see purple_request_fields(). */
    - void *(*request_fields)(const char *title, const char *primary,
    - const char *secondary, PurpleRequestFields *fields,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv, void *user_data);
    -
    - /** @see purple_request_file(). */
    - void *(*request_file)(const char *title, const char *filename,
    - gboolean savedialog, GCallback ok_cb,
    - GCallback cancel_cb, PurpleAccount *account,
    - const char *who, PurpleConversation *conv,
    - void *user_data);
    -
    - void (*close_request)(PurpleRequestType type, void *ui_handle);
    -
    - /** @see purple_request_folder(). */
    - void *(*request_folder)(const char *title, const char *dirname,
    - GCallback ok_cb, GCallback cancel_cb,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv, void *user_data);
    -
    - /** @see purple_request_action_with_icon_varg(). */
    - void *(*request_action_with_icon)(const char *title, const char *primary,
    - const char *secondary, int default_action,
    - PurpleAccount *account, const char *who,
    - PurpleConversation *conv,
    - gconstpointer icon_data, gsize icon_size,
    - void *user_data,
    - size_t action_count, va_list actions);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    -} PurpleRequestUiOps;
    -
    -typedef void (*PurpleRequestInputCb)(void *, const char *);
    -
    -/** The type of callbacks passed to purple_request_action(). The first
    - * argument is the @a user_data parameter; the second is the index in the list
    - * of actions of the one chosen.
    - */
    -typedef void (*PurpleRequestActionCb)(void *, int);
    -typedef void (*PurpleRequestChoiceCb)(void *, int);
    -typedef void (*PurpleRequestFieldsCb)(void *, PurpleRequestFields *fields);
    -typedef void (*PurpleRequestFileCb)(void *, const char *filename);
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Field List API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a list of fields to pass to purple_request_fields().
    - *
    - * @return A PurpleRequestFields structure.
    - */
    -PurpleRequestFields *purple_request_fields_new(void);
    -
    -/**
    - * Destroys a list of fields.
    - *
    - * @param fields The list of fields to destroy.
    - */
    -void purple_request_fields_destroy(PurpleRequestFields *fields);
    -
    -/**
    - * Adds a group of fields to the list.
    - *
    - * @param fields The fields list.
    - * @param group The group to add.
    - */
    -void purple_request_fields_add_group(PurpleRequestFields *fields,
    - PurpleRequestFieldGroup *group);
    -
    -/**
    - * Returns a list of all groups in a field list.
    - *
    - * @param fields The fields list.
    - *
    - * @constreturn A list of groups.
    - */
    -GList *purple_request_fields_get_groups(const PurpleRequestFields *fields);
    -
    -/**
    - * Returns whether or not the field with the specified ID exists.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return TRUE if the field exists, or FALSE.
    - */
    -gboolean purple_request_fields_exists(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns a list of all required fields.
    - *
    - * @param fields The fields list.
    - *
    - * @constreturn The list of required fields.
    - */
    -GList *purple_request_fields_get_required(const PurpleRequestFields *fields);
    -
    -/**
    - * Returns whether or not a field with the specified ID is required.
    - *
    - * @param fields The fields list.
    - * @param id The field ID.
    - *
    - * @return TRUE if the specified field is required, or FALSE.
    - */
    -gboolean purple_request_fields_is_field_required(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns whether or not all required fields have values.
    - *
    - * @param fields The fields list.
    - *
    - * @return TRUE if all required fields have values, or FALSE.
    - */
    -gboolean purple_request_fields_all_required_filled(
    - const PurpleRequestFields *fields);
    -
    -/**
    - * Return the field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The field, if found.
    - */
    -PurpleRequestField *purple_request_fields_get_field(
    - const PurpleRequestFields *fields, const char *id);
    -
    -/**
    - * Returns the string value of a field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The string value, if found, or @c NULL otherwise.
    - */
    -const char *purple_request_fields_get_string(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns the integer value of a field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The integer value, if found, or 0 otherwise.
    - */
    -int purple_request_fields_get_integer(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns the boolean value of a field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The boolean value, if found, or @c FALSE otherwise.
    - */
    -gboolean purple_request_fields_get_bool(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns the choice index of a field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The choice index, if found, or -1 otherwise.
    - */
    -int purple_request_fields_get_choice(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/**
    - * Returns the account of a field with the specified ID.
    - *
    - * @param fields The fields list.
    - * @param id The ID of the field.
    - *
    - * @return The account value, if found, or NULL otherwise.
    - */
    -PurpleAccount *purple_request_fields_get_account(const PurpleRequestFields *fields,
    - const char *id);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Fields Group API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a fields group with an optional title.
    - *
    - * @param title The optional title to give the group.
    - *
    - * @return A new fields group
    - */
    -PurpleRequestFieldGroup *purple_request_field_group_new(const char *title);
    -
    -/**
    - * Destroys a fields group.
    - *
    - * @param group The group to destroy.
    - */
    -void purple_request_field_group_destroy(PurpleRequestFieldGroup *group);
    -
    -/**
    - * Adds a field to the group.
    - *
    - * @param group The group to add the field to.
    - * @param field The field to add to the group.
    - */
    -void purple_request_field_group_add_field(PurpleRequestFieldGroup *group,
    - PurpleRequestField *field);
    -
    -/**
    - * Returns the title of a fields group.
    - *
    - * @param group The group.
    - *
    - * @return The title, if set.
    - */
    -const char *purple_request_field_group_get_title(
    - const PurpleRequestFieldGroup *group);
    -
    -/**
    - * Returns a list of all fields in a group.
    - *
    - * @param group The group.
    - *
    - * @constreturn The list of fields in the group.
    - */
    -GList *purple_request_field_group_get_fields(
    - const PurpleRequestFieldGroup *group);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a field of the specified type.
    - *
    - * @param id The field ID.
    - * @param text The text label of the field.
    - * @param type The type of field.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_new(const char *id, const char *text,
    - PurpleRequestFieldType type);
    -
    -/**
    - * Destroys a field.
    - *
    - * @param field The field to destroy.
    - */
    -void purple_request_field_destroy(PurpleRequestField *field);
    -
    -/**
    - * Sets the label text of a field.
    - *
    - * @param field The field.
    - * @param label The text label.
    - */
    -void purple_request_field_set_label(PurpleRequestField *field, const char *label);
    -
    -/**
    - * Sets whether or not a field is visible.
    - *
    - * @param field The field.
    - * @param visible TRUE if visible, or FALSE if not.
    - */
    -void purple_request_field_set_visible(PurpleRequestField *field, gboolean visible);
    -
    -/**
    - * Sets the type hint for the field.
    - *
    - * This is optionally used by the UIs to provide such features as
    - * auto-completion for type hints like "account" and "screenname".
    - *
    - * @param field The field.
    - * @param type_hint The type hint.
    - */
    -void purple_request_field_set_type_hint(PurpleRequestField *field,
    - const char *type_hint);
    -
    -/**
    - * Sets whether or not a field is required.
    - *
    - * @param field The field.
    - * @param required TRUE if required, or FALSE.
    - */
    -void purple_request_field_set_required(PurpleRequestField *field,
    - gboolean required);
    -
    -/**
    - * Returns the type of a field.
    - *
    - * @param field The field.
    - *
    - * @return The field's type.
    - */
    -PurpleRequestFieldType purple_request_field_get_type(const PurpleRequestField *field);
    -
    -/**
    - * Returns the group for the field.
    - *
    - * @param field The field.
    - *
    - * @return The UI data.
    - *
    - * @since 2.6.0
    - */
    -PurpleRequestFieldGroup *purple_request_field_get_group(const PurpleRequestField *field);
    -
    -/**
    - * Returns the ID of a field.
    - *
    - * @param field The field.
    - *
    - * @return The ID
    - */
    -const char *purple_request_field_get_id(const PurpleRequestField *field);
    -
    -/**
    - * Returns the label text of a field.
    - *
    - * @param field The field.
    - *
    - * @return The label text.
    - */
    -const char *purple_request_field_get_label(const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not a field is visible.
    - *
    - * @param field The field.
    - *
    - * @return TRUE if the field is visible. FALSE otherwise.
    - */
    -gboolean purple_request_field_is_visible(const PurpleRequestField *field);
    -
    -/**
    - * Returns the field's type hint.
    - *
    - * @param field The field.
    - *
    - * @return The field's type hint.
    - */
    -const char *purple_request_field_get_type_hint(const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not a field is required.
    - *
    - * @param field The field.
    - *
    - * @return TRUE if the field is required, or FALSE.
    - */
    -gboolean purple_request_field_is_required(const PurpleRequestField *field);
    -
    -/**
    - * Returns the ui_data for a field.
    - *
    - * @param field The field.
    - *
    - * @return The UI data.
    - *
    - * @since 2.6.0
    - */
    -gpointer purple_request_field_get_ui_data(const PurpleRequestField *field);
    -
    -/**
    - * Sets the ui_data for a field.
    - *
    - * @param field The field.
    - * @param ui_data The UI data.
    - *
    - * @return The UI data.
    - *
    - * @since 2.6.0
    - */
    -void purple_request_field_set_ui_data(PurpleRequestField *field,
    - gpointer ui_data);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name String Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a string request field.
    - *
    - * @param id The field ID.
    - * @param text The text label of the field.
    - * @param default_value The optional default value.
    - * @param multiline Whether or not this should be a multiline string.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_string_new(const char *id,
    - const char *text,
    - const char *default_value,
    - gboolean multiline);
    -
    -/**
    - * Sets the default value in a string field.
    - *
    - * @param field The field.
    - * @param default_value The default value.
    - */
    -void purple_request_field_string_set_default_value(PurpleRequestField *field,
    - const char *default_value);
    -
    -/**
    - * Sets the value in a string field.
    - *
    - * @param field The field.
    - * @param value The value.
    - */
    -void purple_request_field_string_set_value(PurpleRequestField *field,
    - const char *value);
    -
    -/**
    - * Sets whether or not a string field is masked
    - * (commonly used for password fields).
    - *
    - * @param field The field.
    - * @param masked The masked value.
    - */
    -void purple_request_field_string_set_masked(PurpleRequestField *field,
    - gboolean masked);
    -
    -/**
    - * Sets whether or not a string field is editable.
    - *
    - * @param field The field.
    - * @param editable The editable value.
    - */
    -void purple_request_field_string_set_editable(PurpleRequestField *field,
    - gboolean editable);
    -
    -/**
    - * Returns the default value in a string field.
    - *
    - * @param field The field.
    - *
    - * @return The default value.
    - */
    -const char *purple_request_field_string_get_default_value(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns the user-entered value in a string field.
    - *
    - * @param field The field.
    - *
    - * @return The value.
    - */
    -const char *purple_request_field_string_get_value(const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not a string field is multi-line.
    - *
    - * @param field The field.
    - *
    - * @return @c TRUE if the field is mulit-line, or @c FALSE otherwise.
    - */
    -gboolean purple_request_field_string_is_multiline(const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not a string field is masked.
    - *
    - * @param field The field.
    - *
    - * @return @c TRUE if the field is masked, or @c FALSE otherwise.
    - */
    -gboolean purple_request_field_string_is_masked(const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not a string field is editable.
    - *
    - * @param field The field.
    - *
    - * @return @c TRUE if the field is editable, or @c FALSE otherwise.
    - */
    -gboolean purple_request_field_string_is_editable(const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Integer Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates an integer field.
    - *
    - * @param id The field ID.
    - * @param text The text label of the field.
    - * @param default_value The default value.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_int_new(const char *id,
    - const char *text,
    - int default_value);
    -
    -/**
    - * Sets the default value in an integer field.
    - *
    - * @param field The field.
    - * @param default_value The default value.
    - */
    -void purple_request_field_int_set_default_value(PurpleRequestField *field,
    - int default_value);
    -
    -/**
    - * Sets the value in an integer field.
    - *
    - * @param field The field.
    - * @param value The value.
    - */
    -void purple_request_field_int_set_value(PurpleRequestField *field, int value);
    -
    -/**
    - * Returns the default value in an integer field.
    - *
    - * @param field The field.
    - *
    - * @return The default value.
    - */
    -int purple_request_field_int_get_default_value(const PurpleRequestField *field);
    -
    -/**
    - * Returns the user-entered value in an integer field.
    - *
    - * @param field The field.
    - *
    - * @return The value.
    - */
    -int purple_request_field_int_get_value(const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Boolean Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a boolean field.
    - *
    - * This is often represented as a checkbox.
    - *
    - * @param id The field ID.
    - * @param text The text label of the field.
    - * @param default_value The default value.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_bool_new(const char *id,
    - const char *text,
    - gboolean default_value);
    -
    -/**
    - * Sets the default value in an boolean field.
    - *
    - * @param field The field.
    - * @param default_value The default value.
    - */
    -void purple_request_field_bool_set_default_value(PurpleRequestField *field,
    - gboolean default_value);
    -
    -/**
    - * Sets the value in an boolean field.
    - *
    - * @param field The field.
    - * @param value The value.
    - */
    -void purple_request_field_bool_set_value(PurpleRequestField *field,
    - gboolean value);
    -
    -/**
    - * Returns the default value in an boolean field.
    - *
    - * @param field The field.
    - *
    - * @return The default value.
    - */
    -gboolean purple_request_field_bool_get_default_value(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns the user-entered value in an boolean field.
    - *
    - * @param field The field.
    - *
    - * @return The value.
    - */
    -gboolean purple_request_field_bool_get_value(const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Choice Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a multiple choice field.
    - *
    - * This is often represented as a group of radio buttons.
    - *
    - * @param id The field ID.
    - * @param text The optional label of the field.
    - * @param default_value The default choice.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_choice_new(const char *id,
    - const char *text,
    - int default_value);
    -
    -/**
    - * Adds a choice to a multiple choice field.
    - *
    - * @param field The choice field.
    - * @param label The choice label.
    - */
    -void purple_request_field_choice_add(PurpleRequestField *field,
    - const char *label);
    -
    -/**
    - * Sets the default value in an choice field.
    - *
    - * @param field The field.
    - * @param default_value The default value.
    - */
    -void purple_request_field_choice_set_default_value(PurpleRequestField *field,
    - int default_value);
    -
    -/**
    - * Sets the value in an choice field.
    - *
    - * @param field The field.
    - * @param value The value.
    - */
    -void purple_request_field_choice_set_value(PurpleRequestField *field, int value);
    -
    -/**
    - * Returns the default value in an choice field.
    - *
    - * @param field The field.
    - *
    - * @return The default value.
    - */
    -int purple_request_field_choice_get_default_value(const PurpleRequestField *field);
    -
    -/**
    - * Returns the user-entered value in an choice field.
    - *
    - * @param field The field.
    - *
    - * @return The value.
    - */
    -int purple_request_field_choice_get_value(const PurpleRequestField *field);
    -
    -/**
    - * Returns a list of labels in a choice field.
    - *
    - * @param field The field.
    - *
    - * @constreturn The list of labels.
    - */
    -GList *purple_request_field_choice_get_labels(const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name List Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a multiple list item field.
    - *
    - * @param id The field ID.
    - * @param text The optional label of the field.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_list_new(const char *id, const char *text);
    -
    -/**
    - * Sets whether or not a list field allows multiple selection.
    - *
    - * @param field The list field.
    - * @param multi_select TRUE if multiple selection is enabled,
    - * or FALSE otherwise.
    - */
    -void purple_request_field_list_set_multi_select(PurpleRequestField *field,
    - gboolean multi_select);
    -
    -/**
    - * Returns whether or not a list field allows multiple selection.
    - *
    - * @param field The list field.
    - *
    - * @return TRUE if multiple selection is enabled, or FALSE otherwise.
    - */
    -gboolean purple_request_field_list_get_multi_select(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns the data for a particular item.
    - *
    - * @param field The list field.
    - * @param text The item text.
    - *
    - * @return The data associated with the item.
    - */
    -void *purple_request_field_list_get_data(const PurpleRequestField *field,
    - const char *text);
    -
    -/**
    - * Adds an item to a list field.
    - *
    - * @param field The list field.
    - * @param item The list item.
    - * @param data The associated data.
    - *
    - * @deprecated Use purple_request_field_list_add_icon() instead.
    - */
    -void purple_request_field_list_add(PurpleRequestField *field,
    - const char *item, void *data);
    -
    -/**
    - * Adds an item to a list field.
    - *
    - * @param field The list field.
    - * @param item The list item.
    - * @param icon_path The path to icon file, or @c NULL for no icon.
    - * @param data The associated data.
    - */
    -void purple_request_field_list_add_icon(PurpleRequestField *field,
    - const char *item, const char* icon_path, void* data);
    -
    -/**
    - * Adds a selected item to the list field.
    - *
    - * @param field The field.
    - * @param item The item to add.
    - */
    -void purple_request_field_list_add_selected(PurpleRequestField *field,
    - const char *item);
    -
    -/**
    - * Clears the list of selected items in a list field.
    - *
    - * @param field The field.
    - */
    -void purple_request_field_list_clear_selected(PurpleRequestField *field);
    -
    -/**
    - * Sets a list of selected items in a list field.
    - *
    - * @param field The field.
    - * @param items The list of selected items, which is not modified or freed.
    - */
    -void purple_request_field_list_set_selected(PurpleRequestField *field,
    - GList *items);
    -
    -/**
    - * Returns whether or not a particular item is selected in a list field.
    - *
    - * @param field The field.
    - * @param item The item.
    - *
    - * @return TRUE if the item is selected. FALSE otherwise.
    - */
    -gboolean purple_request_field_list_is_selected(const PurpleRequestField *field,
    - const char *item);
    -
    -/**
    - * Returns a list of selected items in a list field.
    - *
    - * To retrieve the data for each item, use
    - * purple_request_field_list_get_data().
    - *
    - * @param field The field.
    - *
    - * @constreturn The list of selected items.
    - */
    -GList *purple_request_field_list_get_selected(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns a list of items in a list field.
    - *
    - * @param field The field.
    - *
    - * @constreturn The list of items.
    - */
    -GList *purple_request_field_list_get_items(const PurpleRequestField *field);
    -
    -/**
    - * Returns a list of icons in a list field.
    - *
    - * The icons will correspond with the items, in order.
    - *
    - * @param field The field.
    - *
    - * @constreturn The list of icons or @c NULL (i.e. the empty GList) if no
    - * items have icons.
    - */
    -GList *purple_request_field_list_get_icons(const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Label Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a label field.
    - *
    - * @param id The field ID.
    - * @param text The label of the field.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_label_new(const char *id,
    - const char *text);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Image Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates an image field.
    - *
    - * @param id The field ID.
    - * @param text The label of the field.
    - * @param buf The image data.
    - * @param size The size of the data in @a buffer.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_image_new(const char *id, const char *text,
    - const char *buf, gsize size);
    -
    -/**
    - * Sets the scale factors of an image field.
    - *
    - * @param field The image field.
    - * @param x The x scale factor.
    - * @param y The y scale factor.
    - */
    -void purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y);
    -
    -/**
    - * Returns pointer to the image.
    - *
    - * @param field The image field.
    - *
    - * @return Pointer to the image.
    - */
    -const char *purple_request_field_image_get_buffer(PurpleRequestField *field);
    -
    -/**
    - * Returns size (in bytes) of the image.
    - *
    - * @param field The image field.
    - *
    - * @return Size of the image.
    - */
    -gsize purple_request_field_image_get_size(PurpleRequestField *field);
    -
    -/**
    - * Returns X scale coefficient of the image.
    - *
    - * @param field The image field.
    - *
    - * @return X scale coefficient of the image.
    - */
    -unsigned int purple_request_field_image_get_scale_x(PurpleRequestField *field);
    -
    -/**
    - * Returns Y scale coefficient of the image.
    - *
    - * @param field The image field.
    - *
    - * @return Y scale coefficient of the image.
    - */
    -unsigned int purple_request_field_image_get_scale_y(PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Account Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates an account field.
    - *
    - * By default, this field will not show offline accounts.
    - *
    - * @param id The field ID.
    - * @param text The text label of the field.
    - * @param account The optional default account.
    - *
    - * @return The new field.
    - */
    -PurpleRequestField *purple_request_field_account_new(const char *id,
    - const char *text,
    - PurpleAccount *account);
    -
    -/**
    - * Sets the default account on an account field.
    - *
    - * @param field The account field.
    - * @param default_value The default account.
    - */
    -void purple_request_field_account_set_default_value(PurpleRequestField *field,
    - PurpleAccount *default_value);
    -
    -/**
    - * Sets the account in an account field.
    - *
    - * @param field The account field.
    - * @param value The account.
    - */
    -void purple_request_field_account_set_value(PurpleRequestField *field,
    - PurpleAccount *value);
    -
    -/**
    - * Sets whether or not to show all accounts in an account field.
    - *
    - * If TRUE, all accounts, online or offline, will be shown. If FALSE,
    - * only online accounts will be shown.
    - *
    - * @param field The account field.
    - * @param show_all Whether or not to show all accounts.
    - */
    -void purple_request_field_account_set_show_all(PurpleRequestField *field,
    - gboolean show_all);
    -
    -/**
    - * Sets the account filter function in an account field.
    - *
    - * This function will determine which accounts get displayed and which
    - * don't.
    - *
    - * @param field The account field.
    - * @param filter_func The account filter function.
    - */
    -void purple_request_field_account_set_filter(PurpleRequestField *field,
    - PurpleFilterAccountFunc filter_func);
    -
    -/**
    - * Returns the default account in an account field.
    - *
    - * @param field The field.
    - *
    - * @return The default account.
    - */
    -PurpleAccount *purple_request_field_account_get_default_value(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns the user-entered account in an account field.
    - *
    - * @param field The field.
    - *
    - * @return The user-entered account.
    - */
    -PurpleAccount *purple_request_field_account_get_value(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns whether or not to show all accounts in an account field.
    - *
    - * If TRUE, all accounts, online or offline, will be shown. If FALSE,
    - * only online accounts will be shown.
    - *
    - * @param field The account field.
    - * @return Whether or not to show all accounts.
    - */
    -gboolean purple_request_field_account_get_show_all(
    - const PurpleRequestField *field);
    -
    -/**
    - * Returns the account filter function in an account field.
    - *
    - * This function will determine which accounts get displayed and which
    - * don't.
    - *
    - * @param field The account field.
    - *
    - * @return The account filter function.
    - */
    -PurpleFilterAccountFunc purple_request_field_account_get_filter(
    - const PurpleRequestField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Request API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Prompts the user for text input.
    - *
    - * @param handle The plugin or connection handle. For some
    - * things this is <em>extremely</em> important. The
    - * handle is used to programmatically close the request
    - * dialog when it is no longer needed. For PRPLs this
    - * is often a pointer to the #PurpleConnection
    - * instance. For plugins this should be a similar,
    - * unique memory location. This value is important
    - * because it allows a request to be closed with
    - * purple_request_close_with_handle() when, for
    - * example, you sign offline. If the request is
    - * <em>not</em> closed it is <strong>very</strong>
    - * likely to cause a crash whenever the callback
    - * handler functions are triggered.
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param primary The main point of the message, or @c NULL if you're
    - * feeling enigmatic.
    - * @param secondary Secondary information, or @c NULL if there is none.
    - * @param default_value The default value.
    - * @param multiline @c TRUE if the inputted text can span multiple lines.
    - * @param masked @c TRUE if the inputted text should be masked in some
    - * way (such as by displaying characters as stars). This
    - * might be because the input is some kind of password.
    - * @param hint Optionally suggest how the input box should appear.
    - * Use "html", for example, to allow the user to enter
    - * HTML.
    - * @param ok_text The text for the @c OK button, which may not be @c NULL.
    - * @param ok_cb The callback for the @c OK button, which may not be @c
    - * NULL.
    - * @param cancel_text The text for the @c Cancel button, which may not be @c
    - * NULL.
    - * @param cancel_cb The callback for the @c Cancel button, which may be
    - * @c NULL.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is.
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is.
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is.
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_input(void *handle, const char *title, const char *primary,
    - const char *secondary, const char *default_value, gboolean multiline,
    - gboolean masked, gchar *hint,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data);
    -
    -/**
    - * Prompts the user for multiple-choice input.
    - *
    - * @param handle The plugin or connection handle. For some things this
    - * is <em>extremely</em> important. See the comments on
    - * purple_request_input().
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param primary The main point of the message, or @c NULL if you're
    - * feeling enigmatic.
    - * @param secondary Secondary information, or @c NULL if there is none.
    - * @param default_value The default choice; this should be one of the values
    - * listed in the varargs.
    - * @param ok_text The text for the @c OK button, which may not be @c NULL.
    - * @param ok_cb The callback for the @c OK button, which may not be @c
    - * NULL.
    - * @param cancel_text The text for the @c Cancel button, which may not be @c
    - * NULL.
    - * @param cancel_cb The callback for the @c Cancel button, or @c NULL to
    - * do nothing.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is.
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is.
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is.
    - * @param user_data The data to pass to the callback.
    - * @param ... The choices, which should be pairs of <tt>char *</tt>
    - * descriptions and <tt>int</tt> values, terminated with a
    - * @c NULL parameter.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_choice(void *handle, const char *title, const char *primary,
    - const char *secondary, int default_value,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data, ...) G_GNUC_NULL_TERMINATED;
    -
    -/**
    - * <tt>va_list</tt> version of purple_request_choice(); see its documentation.
    - */
    -void *purple_request_choice_varg(void *handle, const char *title,
    - const char *primary, const char *secondary, int default_value,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data, va_list choices);
    -
    -/**
    - * Prompts the user for an action.
    - *
    - * This is often represented as a dialog with a button for each action.
    - *
    - * @param handle The plugin or connection handle. For some things this
    - * is <em>extremely</em> important. See the comments on
    - * purple_request_input().
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param primary The main point of the message, or @c NULL if you're
    - * feeling enigmatic.
    - * @param secondary Secondary information, or @c NULL if there is none.
    - * @param default_action The default action, zero-indexed; if the third action
    - * supplied should be the default, supply <tt>2</tt>.
    - * The should be the action that users are most likely
    - * to select.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is.
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is.
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is.
    - * @param user_data The data to pass to the callback.
    - * @param action_count The number of actions.
    - * @param ... A list of actions. These are pairs of
    - * arguments. The first of each pair is the
    - * <tt>char *</tt> label that appears on the button. It
    - * should have an underscore before the letter you want
    - * to use as the accelerator key for the button. The
    - * second of each pair is the #PurpleRequestActionCb
    - * function to use when the button is clicked.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_action(void *handle, const char *title, const char *primary,
    - const char *secondary, int default_action, PurpleAccount *account,
    - const char *who, PurpleConversation *conv, void *user_data,
    - size_t action_count, ...);
    -
    -/**
    - * <tt>va_list</tt> version of purple_request_action(); see its documentation.
    - */
    -void *purple_request_action_varg(void *handle, const char *title,
    - const char *primary, const char *secondary, int default_action,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data, size_t action_count, va_list actions);
    -
    -/**
    - * Version of purple_request_action() supplying an image for the UI to
    - * optionally display as an icon in the dialog; see its documentation
    - * @since 2.7.0
    - */
    -void *purple_request_action_with_icon(void *handle, const char *title,
    - const char *primary, const char *secondary, int default_action,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - gconstpointer icon_data, gsize icon_size, void *user_data,
    - size_t action_count, ...);
    -
    -/**
    - * <tt>va_list</tt> version of purple_request_action_with_icon();
    - * see its documentation.
    - * @since 2.7.0
    - */
    -void *purple_request_action_with_icon_varg(void *handle, const char *title,
    - const char *primary, const char *secondary, int default_action,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - gconstpointer icon_data, gsize icon_size,
    - void *user_data, size_t action_count, va_list actions);
    -
    -
    -/**
    - * Displays groups of fields for the user to fill in.
    - *
    - * @param handle The plugin or connection handle. For some things this
    - * is <em>extremely</em> important. See the comments on
    - * purple_request_input().
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param primary The main point of the message, or @c NULL if you're
    - * feeling enigmatic.
    - * @param secondary Secondary information, or @c NULL if there is none.
    - * @param fields The list of fields.
    - * @param ok_text The text for the @c OK button, which may not be @c NULL.
    - * @param ok_cb The callback for the @c OK button, which may not be @c
    - * NULL.
    - * @param cancel_text The text for the @c Cancel button, which may not be @c
    - * NULL.
    - * @param cancel_cb The callback for the @c Cancel button, which may be
    - * @c NULL.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_fields(void *handle, const char *title, const char *primary,
    - const char *secondary, PurpleRequestFields *fields,
    - const char *ok_text, GCallback ok_cb,
    - const char *cancel_text, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data);
    -
    -/**
    - * Closes a request.
    - *
    - * @param type The request type.
    - * @param uihandle The request UI handle.
    - */
    -void purple_request_close(PurpleRequestType type, void *uihandle);
    -
    -/**
    - * Closes all requests registered with the specified handle.
    - *
    - * @param handle The handle, as supplied as the @a handle parameter to one of the
    - * <tt>purple_request_*</tt> functions.
    - *
    - * @see purple_request_input().
    - */
    -void purple_request_close_with_handle(void *handle);
    -
    -/**
    - * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
    - */
    -#define purple_request_yes_no(handle, title, primary, secondary, \
    - default_action, account, who, conv, \
    - user_data, yes_cb, no_cb) \
    - purple_request_action((handle), (title), (primary), (secondary), \
    - (default_action), account, who, conv, (user_data), 2, \
    - _("_Yes"), (yes_cb), _("_No"), (no_cb))
    -
    -/**
    - * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
    - */
    -#define purple_request_ok_cancel(handle, title, primary, secondary, \
    - default_action, account, who, conv, \
    - user_data, ok_cb, cancel_cb) \
    - purple_request_action((handle), (title), (primary), (secondary), \
    - (default_action), account, who, conv, (user_data), 2, \
    - _("_OK"), (ok_cb), _("_Cancel"), (cancel_cb))
    -
    -/**
    - * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
    - */
    -#define purple_request_accept_cancel(handle, title, primary, secondary, \
    - default_action, account, who, conv, \
    - user_data, accept_cb, cancel_cb) \
    - purple_request_action((handle), (title), (primary), (secondary), \
    - (default_action), account, who, conv, (user_data), 2, \
    - _("_Accept"), (accept_cb), _("_Cancel"), (cancel_cb))
    -
    -/**
    - * A wrapper for purple_request_action_with_icon() that uses Accept and Cancel
    - * buttons.
    - */
    -#define purple_request_accept_cancel_with_icon(handle, title, primary, secondary, \
    - default_action, account, who, conv, \
    - icon_data, icon_size, \
    - user_data, accept_cb, cancel_cb) \
    - purple_request_action_with_icon((handle), (title), (primary), (secondary), \
    - (default_action), account, who, conv, icon_data, icon_size, \
    - (user_data), 2, \
    - _("_Accept"), (accept_cb), _("_Cancel"), (cancel_cb))
    -
    -/**
    - * Displays a file selector request dialog. Returns the selected filename to
    - * the callback. Can be used for either opening a file or saving a file.
    - *
    - * @param handle The plugin or connection handle. For some things this
    - * is <em>extremely</em> important. See the comments on
    - * purple_request_input().
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param filename The default filename (may be @c NULL)
    - * @param savedialog True if this dialog is being used to save a file.
    - * False if it is being used to open a file.
    - * @param ok_cb The callback for the @c OK button.
    - * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_file(void *handle, const char *title, const char *filename,
    - gboolean savedialog, GCallback ok_cb, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data);
    -
    -/**
    - * Displays a folder select dialog. Returns the selected filename to
    - * the callback.
    - *
    - * @param handle The plugin or connection handle. For some things this
    - * is <em>extremely</em> important. See the comments on
    - * purple_request_input().
    - * @param title The title of the message, or @c NULL if it should have
    - * no title.
    - * @param dirname The default directory name (may be @c NULL)
    - * @param ok_cb The callback for the @c OK button.
    - * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL.
    - * @param account The #PurpleAccount associated with this request, or @c
    - * NULL if none is
    - * @param who The username of the buddy associated with this request,
    - * or @c NULL if none is
    - * @param conv The #PurpleConversation associated with this request, or
    - * @c NULL if none is
    - * @param user_data The data to pass to the callback.
    - *
    - * @return A UI-specific handle.
    - */
    -void *purple_request_folder(void *handle, const char *title, const char *dirname,
    - GCallback ok_cb, GCallback cancel_cb,
    - PurpleAccount *account, const char *who, PurpleConversation *conv,
    - void *user_data);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used when displaying a
    - * request.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_request_set_ui_ops(PurpleRequestUiOps *ops);
    -
    -/**
    - * Returns the UI operations structure to be used when displaying a
    - * request.
    - *
    - * @return The UI operations structure.
    - */
    -PurpleRequestUiOps *purple_request_get_ui_ops(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_REQUEST_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/roomlist.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,398 +0,0 @@
    -/**
    - * @file roomlist.h Room List 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
    - */
    -
    -#ifndef _PURPLE_ROOMLIST_H_
    -#define _PURPLE_ROOMLIST_H_
    -
    -typedef struct _PurpleRoomlist PurpleRoomlist;
    -typedef struct _PurpleRoomlistRoom PurpleRoomlistRoom;
    -typedef struct _PurpleRoomlistField PurpleRoomlistField;
    -/** @copydoc _PurpleRoomlistUiOps */
    -typedef struct _PurpleRoomlistUiOps PurpleRoomlistUiOps;
    -
    -/**
    - * The types of rooms.
    - *
    - * These are ORable flags.
    - */
    -typedef enum
    -{
    - PURPLE_ROOMLIST_ROOMTYPE_CATEGORY = 0x01, /**< It's a category, but not a room you can join. */
    - PURPLE_ROOMLIST_ROOMTYPE_ROOM = 0x02 /**< It's a room, like the kind you can join. */
    -
    -} PurpleRoomlistRoomType;
    -
    -/**
    - * The types of fields.
    - */
    -typedef enum
    -{
    - PURPLE_ROOMLIST_FIELD_BOOL,
    - PURPLE_ROOMLIST_FIELD_INT,
    - PURPLE_ROOMLIST_FIELD_STRING /**< We do a g_strdup on the passed value if it's this type. */
    -
    -} PurpleRoomlistFieldType;
    -
    -#include "account.h"
    -#include <glib.h>
    -
    -/**************************************************************************/
    -/** Data Structures */
    -/**************************************************************************/
    -
    -/**
    - * Represents a list of rooms for a given connection on a given protocol.
    - */
    -struct _PurpleRoomlist {
    - PurpleAccount *account; /**< The account this list belongs to. */
    - GList *fields; /**< The fields. */
    - GList *rooms; /**< The list of rooms. */
    - gboolean in_progress; /**< The listing is in progress. */
    - gpointer ui_data; /**< UI private data. */
    - gpointer proto_data; /** Prpl private data. */
    - guint ref; /**< The reference count. */
    -};
    -
    -/**
    - * Represents a room.
    - */
    -struct _PurpleRoomlistRoom {
    - PurpleRoomlistRoomType type; /**< The type of room. */
    - gchar *name; /**< The name of the room. */
    - GList *fields; /**< Other fields. */
    - PurpleRoomlistRoom *parent; /**< The parent room, or NULL. */
    - gboolean expanded_once; /**< A flag the UI uses to avoid multiple expand prpl cbs. */
    -};
    -
    -/**
    - * A field a room might have.
    - */
    -struct _PurpleRoomlistField {
    - PurpleRoomlistFieldType type; /**< The type of field. */
    - gchar *label; /**< The i18n user displayed name of the field. */
    - gchar *name; /**< The internal name of the field. */
    - gboolean hidden; /**< Hidden? */
    -};
    -
    -/**
    - * The room list ops to be filled out by the UI.
    - */
    -struct _PurpleRoomlistUiOps {
    - void (*show_with_account)(PurpleAccount *account); /**< Force the ui to pop up a dialog and get the list */
    - void (*create)(PurpleRoomlist *list); /**< A new list was created. */
    - void (*set_fields)(PurpleRoomlist *list, GList *fields); /**< Sets the columns. */
    - void (*add_room)(PurpleRoomlist *list, PurpleRoomlistRoom *room); /**< Add a room to the list. */
    - void (*in_progress)(PurpleRoomlist *list, gboolean flag); /**< Are we fetching stuff still? */
    - void (*destroy)(PurpleRoomlist *list); /**< We're destroying list. */
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Room List API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * This is used to get the room list on an account, asking the UI
    - * to pop up a dialog with the specified account already selected,
    - * and pretend the user clicked the get list button.
    - * While we're pretending, predend I didn't say anything about dialogs
    - * or buttons, since this is the core.
    - *
    - * @param account The account to get the list on.
    - */
    -void purple_roomlist_show_with_account(PurpleAccount *account);
    -
    -/**
    - * Returns a newly created room list object.
    - *
    - * It has an initial reference count of 1.
    - *
    - * @param account The account that's listing rooms.
    - * @return The new room list handle.
    - */
    -PurpleRoomlist *purple_roomlist_new(PurpleAccount *account);
    -
    -/**
    - * Increases the reference count on the room list.
    - *
    - * @param list The object to ref.
    - */
    -void purple_roomlist_ref(PurpleRoomlist *list);
    -
    -/**
    - * Decreases the reference count on the room list.
    - *
    - * The room list will be destroyed when this reaches 0.
    - *
    - * @param list The room list object to unref and possibly
    - * destroy.
    - */
    -void purple_roomlist_unref(PurpleRoomlist *list);
    -
    -/**
    - * Set the different field types and their names for this protocol.
    - *
    - * This must be called before purple_roomlist_room_add().
    - *
    - * @param list The room list.
    - * @param fields A GList of PurpleRoomlistField's. UI's are encouraged
    - * to default to displaying them in the order given.
    - */
    -void purple_roomlist_set_fields(PurpleRoomlist *list, GList *fields);
    -
    -/**
    - * Set the "in progress" state of the room list.
    - *
    - * The UI is encouraged to somehow hint to the user
    - * whether or not we're busy downloading a room list or not.
    - *
    - * @param list The room list.
    - * @param in_progress We're downloading it, or we're not.
    - */
    -void purple_roomlist_set_in_progress(PurpleRoomlist *list, gboolean in_progress);
    -
    -/**
    - * Gets the "in progress" state of the room list.
    - *
    - * The UI is encouraged to somehow hint to the user
    - * whether or not we're busy downloading a room list or not.
    - *
    - * @param list The room list.
    - * @return True if we're downloading it, or false if we're not.
    - */
    -gboolean purple_roomlist_get_in_progress(PurpleRoomlist *list);
    -
    -/**
    - * Adds a room to the list of them.
    - *
    - * @param list The room list.
    - * @param room The room to add to the list. The GList of fields must be in the same
    - order as was given in purple_roomlist_set_fields().
    -*/
    -void purple_roomlist_room_add(PurpleRoomlist *list, PurpleRoomlistRoom *room);
    -
    -/**
    - * Returns a PurpleRoomlist structure from the prpl, and
    - * instructs the prpl to start fetching the list.
    - *
    - * @param gc The PurpleConnection to have get a list.
    - *
    - * @return A PurpleRoomlist* or @c NULL if the protocol
    - * doesn't support that.
    - */
    -PurpleRoomlist *purple_roomlist_get_list(PurpleConnection *gc);
    -
    -/**
    - * Tells the prpl to stop fetching the list.
    - * If this is possible and done, the prpl will
    - * call set_in_progress with @c FALSE and possibly
    - * unref the list if it took a reference.
    - *
    - * @param list The room list to cancel a get_list on.
    - */
    -void purple_roomlist_cancel_get_list(PurpleRoomlist *list);
    -
    -/**
    - * Tells the prpl that a category was expanded.
    - *
    - * On some protocols, the rooms in the category
    - * won't be fetched until this is called.
    - *
    - * @param list The room list.
    - * @param category The category that was expanded. The expression
    - * (category->type & PURPLE_ROOMLIST_ROOMTYPE_CATEGORY)
    - * must be true.
    - */
    -void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category);
    -
    -/**
    - * Get the list of fields for a roomlist.
    - *
    - * @param roomlist The roomlist, which must not be @c NULL.
    - * @constreturn A list of fields
    - * @since 2.4.0
    - */
    -GList * purple_roomlist_get_fields(PurpleRoomlist *roomlist);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Room API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new room, to be added to the list.
    - *
    - * @param type The type of room.
    - * @param name The name of the room.
    - * @param parent The room's parent, if any.
    - *
    - * @return A new room.
    - */
    -PurpleRoomlistRoom *purple_roomlist_room_new(PurpleRoomlistRoomType type, const gchar *name,
    - PurpleRoomlistRoom *parent);
    -
    -/**
    - * Adds a field to a room.
    - *
    - * @param list The room list the room belongs to.
    - * @param room The room.
    - * @param field The field to append. Strings get g_strdup'd internally.
    - */
    -void purple_roomlist_room_add_field(PurpleRoomlist *list, PurpleRoomlistRoom *room, gconstpointer field);
    -
    -/**
    - * Join a room, given a PurpleRoomlistRoom and it's associated PurpleRoomlist.
    - *
    - * @param list The room list the room belongs to.
    - * @param room The room to join.
    - */
    -void purple_roomlist_room_join(PurpleRoomlist *list, PurpleRoomlistRoom *room);
    -
    -/**
    - * Get the type of a room.
    - * @param room The room, which must not be @c NULL.
    - * @return The type of the room.
    - * @since 2.4.0
    - */
    -PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room);
    -
    -/**
    - * Get the name of a room.
    - * @param room The room, which must not be @c NULL.
    - * @return The name of the room.
    - * @since 2.4.0
    - */
    -const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
    -
    -/**
    - * Get the parent of a room.
    - * @param room The room, which must not be @c NULL.
    - * @return The parent of the room, which can be @c NULL.
    - * @since 2.4.0
    - */
    -PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room);
    -
    -/**
    - * Get the list of fields for a room.
    - *
    - * @param room The room, which must not be @c NULL.
    - * @constreturn A list of fields
    - * @since 2.4.0
    - */
    -GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Room Field API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new field.
    - *
    - * @param type The type of the field.
    - * @param label The i18n'ed, user displayable name.
    - * @param name The internal name of the field.
    - * @param hidden Hide the field.
    - *
    - * @return A new PurpleRoomlistField, ready to be added to a GList and passed to
    - * purple_roomlist_set_fields().
    - */
    -PurpleRoomlistField *purple_roomlist_field_new(PurpleRoomlistFieldType type,
    - const gchar *label, const gchar *name,
    - gboolean hidden);
    -
    -/**
    - * Get the type of a field.
    - *
    - * @param field A PurpleRoomlistField, which must not be @c NULL.
    - *
    - * @return The type of the field.
    - * @since 2.4.0
    - */
    -PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field);
    -
    -/**
    - * Get the label of a field.
    - *
    - * @param field A PurpleRoomlistField, which must not be @c NULL.
    - *
    - * @return The label of the field.
    - * @since 2.4.0
    - */
    -const char * purple_roomlist_field_get_label(PurpleRoomlistField *field);
    -
    -/**
    - * Check whether a roomlist-field is hidden.
    - * @param field A PurpleRoomlistField, which must not be @c NULL.
    - *
    - * @return @c TRUE if the field is hidden, @c FALSE otherwise.
    - * @since 2.4.0
    - */
    -gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name UI Registration Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations structure to be used in all purple room lists.
    - *
    - * @param ops The UI operations structure.
    - */
    -void purple_roomlist_set_ui_ops(PurpleRoomlistUiOps *ops);
    -
    -/**
    - * Returns the purple window UI operations structure to be used in
    - * new windows.
    - *
    - * @return A filled-out PurpleRoomlistUiOps structure.
    - */
    -PurpleRoomlistUiOps *purple_roomlist_get_ui_ops(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_ROOMLIST_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/savedstatuses.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,425 +0,0 @@
    -/**
    - * @file savedstatuses.h Saved Status API
    - * @ingroup core
    - * @see @ref savedstatus-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_SAVEDSTATUSES_H_
    -#define _PURPLE_SAVEDSTATUSES_H_
    -
    -/**
    - * Saved statuses don't really interact much with the rest of Purple. It
    - * could really be a plugin. It's just a list of away states. When
    - * a user chooses one of the saved states, their Purple accounts are set
    - * to the settings of that state.
    - *
    - * In the savedstatus API, there is the concept of a 'transient'
    - * saved status. A transient saved status is one that is not
    - * permanent. Purple will removed it automatically if it isn't
    - * used for a period of time. Transient saved statuses don't
    - * have titles and they don't show up in the list of saved
    - * statuses. In fact, if a saved status does not have a title
    - * then it is transient. If it does have a title, then it is not
    - * transient.
    - *
    - * What good is a transient status, you ask? They can be used to
    - * keep track of the user's 5 most recently used statuses, for
    - * example. Basically if they just set a message on the fly,
    - * we'll cache it for them in case they want to use it again. If
    - * they don't use it again, we'll just delete it.
    - */
    -
    -/*
    - * TODO: Hmm. We should probably just be saving PurplePresences. That's
    - * something we should look into once the status box gets fleshed
    - * out more.
    - */
    -
    -typedef struct _PurpleSavedStatus PurpleSavedStatus;
    -typedef struct _PurpleSavedStatusSub PurpleSavedStatusSub;
    -
    -#include "status.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Saved status subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Create a new saved status. This will add the saved status to the
    - * list of saved statuses and writes the revised list to status.xml.
    - *
    - * @param title The title of the saved status. This must be
    - * unique. Or, if you want to create a transient
    - * saved status, then pass in NULL.
    - * @param type The type of saved status.
    - *
    - * @return The newly created saved status, or NULL if the title you
    - * used was already taken.
    - */
    -PurpleSavedStatus *purple_savedstatus_new(const char *title,
    - PurpleStatusPrimitive type);
    -
    -/**
    - * Set the title for the given saved status.
    - *
    - * @param status The saved status.
    - * @param title The title of the saved status.
    - */
    -void purple_savedstatus_set_title(PurpleSavedStatus *status,
    - const char *title);
    -
    -/**
    - * Set the type for the given saved status.
    - *
    - * @param status The saved status.
    - * @param type The type of saved status.
    - */
    -void purple_savedstatus_set_type(PurpleSavedStatus *status,
    - PurpleStatusPrimitive type);
    -
    -/**
    - * Set the message for the given saved status.
    - *
    - * @param status The saved status.
    - * @param message The message, or NULL if you want to unset the
    - * message for this status.
    - */
    -void purple_savedstatus_set_message(PurpleSavedStatus *status,
    - const char *message);
    -
    -/**
    - * Set a substatus for an account in a saved status.
    - *
    - * @param status The saved status.
    - * @param account The account.
    - * @param type The status type for the account in the staved
    - * status.
    - * @param message The message for the account in the substatus.
    - */
    -void purple_savedstatus_set_substatus(PurpleSavedStatus *status,
    - const PurpleAccount *account,
    - const PurpleStatusType *type,
    - const char *message);
    -
    -/**
    - * Unset a substatus for an account in a saved status. This clears
    - * the previosly set substatus for the PurpleSavedStatus. If this
    - * saved status is activated then this account will use the default
    - * status type and message.
    - *
    - * @param saved_status The saved status.
    - * @param account The account.
    -*/
    -void purple_savedstatus_unset_substatus(PurpleSavedStatus *saved_status,
    - const PurpleAccount *account);
    -
    -/**
    - * Delete a saved status. This removes the saved status from the list
    - * of saved statuses, and writes the revised list to status.xml.
    - *
    - * @param title The title of the saved status.
    - *
    - * @return TRUE if the status was successfully deleted. FALSE if the
    - * status could not be deleted because no saved status exists
    - * with the given title.
    - */
    -gboolean purple_savedstatus_delete(const char *title);
    -
    -/**
    - * Delete a saved status. This removes the saved status from the list
    - * of saved statuses, and writes the revised list to status.xml.
    - *
    - * @param saved_status the status to delete, the pointer is invalid after
    - * the call
    - *
    - */
    -void purple_savedstatus_delete_by_status(PurpleSavedStatus *saved_status);
    -
    -/**
    - * Returns all saved statuses.
    - *
    - * @constreturn A list of saved statuses.
    - */
    -GList *purple_savedstatuses_get_all(void);
    -
    -/**
    - * Returns the n most popular saved statuses. "Popularity" is
    - * determined by when the last time a saved_status was used and
    - * how many times it has been used. Transient statuses without
    - * messages are not included in the list.
    - *
    - * @param how_many The maximum number of saved statuses
    - * to return, or '0' to get all saved
    - * statuses sorted by popularity.
    - * @return A linked list containing at most how_many
    - * PurpleSavedStatuses. This list should be
    - * g_list_free'd by the caller (but the
    - * PurpleSavedStatuses must not be free'd).
    - */
    -GList *purple_savedstatuses_get_popular(unsigned int how_many);
    -
    -/**
    - * Returns the currently selected saved status. If we are idle
    - * then this returns purple_savedstatus_get_idleaway(). Otherwise
    - * it returns purple_savedstatus_get_default().
    - *
    - * @return A pointer to the in-use PurpleSavedStatus.
    - * This function never returns NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_get_current(void);
    -
    -/**
    - * Returns the default saved status that is used when our
    - * accounts are not idle-away.
    - *
    - * @return A pointer to the in-use PurpleSavedStatus.
    - * This function never returns NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_get_default(void);
    -
    -/**
    - * Returns the saved status that is used when your
    - * accounts become idle-away.
    - *
    - * @return A pointer to the idle-away PurpleSavedStatus.
    - * This function never returns NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_get_idleaway(void);
    -
    -/**
    - * Return TRUE if we are currently idle-away. Otherwise
    - * returns FALSE.
    - *
    - * @return TRUE if our accounts have been set to idle-away.
    - */
    -gboolean purple_savedstatus_is_idleaway(void);
    -
    -/**
    - * Set whether accounts in Purple are idle-away or not.
    - *
    - * @param idleaway TRUE if accounts should be switched to use the
    - * idle-away saved status. FALSE if they should
    - * be switched to use the default status.
    - */
    -void purple_savedstatus_set_idleaway(gboolean idleaway);
    -
    -/**
    - * Returns the status to be used when purple is starting up
    - *
    - * @return A pointer to the startup PurpleSavedStatus.
    - * This function never returns NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_get_startup(void);
    -
    -/**
    - * Finds a saved status with the specified title.
    - *
    - * @param title The name of the saved status.
    - *
    - * @return The saved status if found, or NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_find(const char *title);
    -
    -/**
    - * Finds a saved status with the specified creation time.
    - *
    - * @param creation_time The timestamp when the saved
    - * status was created.
    - *
    - * @return The saved status if found, or NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_find_by_creation_time(time_t creation_time);
    -
    -/**
    - * Finds a saved status with the specified primitive and message.
    - *
    - * @param type The PurpleStatusPrimitive for the status you're trying
    - * to find.
    - * @param message The message for the status you're trying
    - * to find.
    - *
    - * @return The saved status if found, or NULL.
    - */
    -PurpleSavedStatus *purple_savedstatus_find_transient_by_type_and_message(PurpleStatusPrimitive type, const char *message);
    -
    -/**
    - * Determines if a given saved status is "transient."
    - * A transient saved status is one that was not
    - * explicitly added by the user. Transient statuses
    - * are automatically removed if they are not used
    - * for a period of time.
    - *
    - * A transient saved statuses is automatically
    - * created by the status box when the user sets himself
    - * to one of the generic primitive statuses. The reason
    - * we need to save this status information is so we can
    - * restore it when Purple restarts.
    - *
    - * @param saved_status The saved status.
    - *
    - * @return TRUE if the saved status is transient.
    - */
    -gboolean purple_savedstatus_is_transient(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Return the name of a given saved status.
    - *
    - * @param saved_status The saved status.
    - *
    - * @return The title. This value may be a static buffer which may
    - * be overwritten on subsequent calls to this function. If
    - * you need a reference to the title for prolonged use then
    - * you should make a copy of it.
    - */
    -const char *purple_savedstatus_get_title(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Return the type of a given saved status.
    - *
    - * @param saved_status The saved status.
    - *
    - * @return The name.
    - */
    -PurpleStatusPrimitive purple_savedstatus_get_type(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Return the default message of a given saved status.
    - *
    - * @param saved_status The saved status.
    - *
    - * @return The message. This will return NULL if the saved
    - * status does not have a message. This will
    - * contain the normal markup that is created by
    - * Purple's IMHTML (basically HTML markup).
    - */
    -const char *purple_savedstatus_get_message(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Return the time in seconds-since-the-epoch when this
    - * saved status was created. Note: For any status created
    - * by Purple 1.5.0 or older this value will be invalid and
    - * very small (close to 0). This is because Purple 1.5.0
    - * and older did not record the timestamp when the status
    - * was created.
    - *
    - * However, this value is guaranteed to be a unique
    - * identifier for the given saved status.
    - *
    - * @param saved_status The saved status.
    - *
    - * @return The timestamp when this saved status was created.
    - */
    -time_t purple_savedstatus_get_creation_time(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Determine if a given saved status has "substatuses,"
    - * or if it is a simple status (the same for all
    - * accounts).
    - *
    - * @param saved_status The saved status.
    - *
    - * @return TRUE if the saved_status has substatuses.
    - * FALSE otherwise.
    - */
    -gboolean purple_savedstatus_has_substatuses(const PurpleSavedStatus *saved_status);
    -
    -/**
    - * Get the substatus for an account in a saved status.
    - *
    - * @param saved_status The saved status.
    - * @param account The account.
    - *
    - * @return The PurpleSavedStatusSub for the account, or NULL if
    - * the given account does not have a substatus that
    - * differs from the default status of this PurpleSavedStatus.
    - */
    -PurpleSavedStatusSub *purple_savedstatus_get_substatus(
    - const PurpleSavedStatus *saved_status,
    - const PurpleAccount *account);
    -
    -/**
    - * Get the status type of a given substatus.
    - *
    - * @param substatus The substatus.
    - *
    - * @return The status type.
    - */
    -const PurpleStatusType *purple_savedstatus_substatus_get_type(const PurpleSavedStatusSub *substatus);
    -
    -/**
    - * Get the message of a given substatus.
    - *
    - * @param substatus The substatus.
    - *
    - * @return The message of the substatus, or NULL if this substatus does
    - * not have a message.
    - */
    -const char *purple_savedstatus_substatus_get_message(const PurpleSavedStatusSub *substatus);
    -
    -/**
    - * Sets the statuses for all your accounts to those specified
    - * by the given saved_status. This function calls
    - * purple_savedstatus_activate_for_account() for all your accounts.
    - *
    - * @param saved_status The status you want to set your accounts to.
    - */
    -void purple_savedstatus_activate(PurpleSavedStatus *saved_status);
    -
    -/**
    - * Sets the statuses for a given account to those specified
    - * by the given saved_status.
    - *
    - * @param saved_status The status you want to set your accounts to.
    - * @param account The account whose statuses you want to change.
    - */
    -void purple_savedstatus_activate_for_account(const PurpleSavedStatus *saved_status, PurpleAccount *account);
    -
    -/**
    - * Get the handle for the status subsystem.
    - *
    - * @return the handle to the status subsystem
    - */
    -void *purple_savedstatuses_get_handle(void);
    -
    -/**
    - * Initializes the status subsystem.
    - */
    -void purple_savedstatuses_init(void);
    -
    -/**
    - * Uninitializes the status subsystem.
    - */
    -void purple_savedstatuses_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SAVEDSTATUSES_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sbconn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,41 +0,0 @@
    -/**
    - * @file sbconn.h MSN Switchboard Connection
    - *
    - * 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
    - */
    -
    -#ifndef MSN_SBCONN_H
    -#define MSN_SBCONN_H
    -
    -#include "msg.h"
    -#include "slplink.h"
    -
    -#define MSN_SBCONN_MAX_SIZE 1202
    -
    -void msn_sbconn_send_part(MsnSlpLink *slplink, MsnSlpMessagePart *part);
    -
    -void msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
    - gboolean queue);
    -
    -void
    -msn_sbconn_process_queue(MsnSwitchBoard *swboard);
    -
    -#endif /* MSN_SBCONN_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/search.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,152 +0,0 @@
    -/**
    - * @file search.h
    - *
    - * purple
    - *
    - * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    - *
    - * 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
    - */
    -
    -
    -#ifndef _PURPLE_GG_SEARCH_H
    -#define _PURPLE_GG_SEARCH_H
    -
    -#include "connection.h"
    -
    -#include <libgadu.h>
    -#include "gg.h"
    -
    -
    -typedef enum {
    - GGP_SEARCH_TYPE_INFO,
    - GGP_SEARCH_TYPE_FULL
    -
    -} GGPSearchType;
    -
    -typedef struct {
    -
    - char *uin;
    - char *lastname;
    - char *firstname;
    - char *nickname;
    - char *city;
    - char *birthyear;
    - char *gender;
    - char *active;
    -
    - GGPSearchType search_type;
    - guint32 seq;
    - guint16 page_number;
    - guint16 page_size; /* how many contacts fits into one page of results */
    -
    - void *user_data;
    - void *window;
    -} GGPSearchForm;
    -
    -typedef GHashTable GGPSearches;
    -
    -
    -/**
    - * Create a new GGPSearchForm structure, and set the fields
    - * to the sane defaults.
    - *
    - * @return Newly allocated GGPSearchForm.
    - */
    -GGPSearchForm *
    -ggp_search_form_new(GGPSearchType st);
    -
    -/**
    - * Destroy a Search Form.
    - *
    - * @param form Search Form to destroy.
    - */
    -void
    -ggp_search_form_destroy(GGPSearchForm *form);
    -
    -/**
    - * Add a search to the list of searches.
    - *
    - * @param searches The list of searches.
    - * @param seq Search (form) ID number.
    - * @param form The search form to add.
    - */
    -void
    -ggp_search_add(GGPSearches *searches, guint32 seq, GGPSearchForm *form);
    -
    -/**
    - * Remove a search from the list.
    - *
    - * If you want to destory the search completely also call:
    - * ggp_search_form_destroy().
    - *
    - * @param searches The list of searches.
    - * @param seq ID number of the search.
    - */
    -void
    -ggp_search_remove(GGPSearches *searches, guint32 seq);
    -
    -/**
    - * Return the search with the specified ID.
    - *
    - * @param searches The list of searches.
    - * @param seq ID number of the search.
    - */
    -GGPSearchForm *
    -ggp_search_get(GGPSearches *searches, guint32 seq);
    -
    -/**
    - * Create a new GGPSearches structure.
    - *
    - * @return GGPSearches instance.
    - */
    -GGPSearches *
    -ggp_search_new(void);
    -
    -/**
    - * Destroy GGPSearches instance.
    - *
    - * @param searches GGPSearches instance.
    - */
    -void
    -ggp_search_destroy(GGPSearches *searches);
    -
    -/**
    - * Initiate a search in the public directory.
    - *
    - * @param gc PurpleConnection.
    - * @param form Filled in GGPSearchForm.
    - *
    - * @return Sequence number of a search or 0 if an error occurred.
    - */
    -guint32
    -ggp_search_start(PurpleConnection *gc, GGPSearchForm *form);
    -
    -/*
    - * Return converted to the UTF-8 value of the specified field.
    - *
    - * @param res Public directory look-up result.
    - * @param num Id of the record.
    - * @param fileld Name of the field.
    - *
    - * @return UTF-8 encoded value of the field.
    - */
    -char *
    -ggp_search_get_result(gg_pubdir50_t res, int num, const char *field);
    -
    -
    -#endif /* _PURPLE_GG_SEARCH_H */
    -
    -/* vim: set ts=8 sts=0 sw=8 noet: */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/servconn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,193 +0,0 @@
    -/**
    - * @file servconn.h Server connection functions
    - *
    - * 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
    - */
    -#ifndef MSN_SERVCONN_H
    -#define MSN_SERVCONN_H
    -
    -typedef struct _MsnServConn MsnServConn;
    -
    -/**
    - * Connection error types.
    - */
    -typedef enum
    -{
    - MSN_SERVCONN_ERROR_NONE,
    - MSN_SERVCONN_ERROR_CONNECT,
    - MSN_SERVCONN_ERROR_WRITE,
    - MSN_SERVCONN_ERROR_READ
    -} MsnServConnError;
    -
    -/**
    - * Connection types.
    - */
    -typedef enum
    -{
    - MSN_SERVCONN_NS,
    - MSN_SERVCONN_SB
    -} MsnServConnType;
    -
    -#include "internal.h"
    -#include "proxy.h"
    -
    -#include "cmdproc.h"
    -#include "httpconn.h"
    -#include "session.h"
    -
    -/**
    - * A Connection.
    - */
    -struct _MsnServConn
    -{
    - MsnServConnType type; /**< The type of this connection. */
    - MsnSession *session; /**< The MSN session of this connection. */
    - MsnCmdProc *cmdproc; /**< The command processor of this connection. */
    -
    - PurpleProxyConnectData *connect_data;
    -
    - gboolean connected; /**< A flag that states if it's connected. */
    - gboolean processing; /**< A flag that states if something is working
    - with this connection. */
    - gboolean wasted; /**< A flag that states if it should be destroyed. */
    -
    - char *host; /**< The host this connection is connected or should be
    - connected to. */
    - int num; /**< A number id of this connection. */
    -
    - MsnHttpConn *httpconn; /**< The HTTP connection this connection should use. */
    -
    - int fd; /**< The connection's file descriptor. */
    - int inpa; /**< The connection's input handler. */
    -
    - char *rx_buf; /**< The receive buffer. */
    - int rx_len; /**< The receive buffer lenght. */
    -
    - size_t payload_len; /**< The length of the payload.
    - It's only set when we've received a command that
    - has a payload. */
    -
    - PurpleCircBuffer *tx_buf;
    - guint tx_handler;
    - guint timeout_sec;
    - guint timeout_handle;
    -
    - void (*connect_cb)(MsnServConn *); /**< The callback to call when connecting. */
    - void (*disconnect_cb)(MsnServConn *); /**< The callback to call when disconnecting. */
    - void (*destroy_cb)(MsnServConn *); /**< The callback to call when destroying. */
    -};
    -
    -/**
    - * Creates a new connection object.
    - *
    - * @param session The session.
    - * @param type The type of the connection.
    - */
    -MsnServConn *msn_servconn_new(MsnSession *session, MsnServConnType type);
    -
    -/**
    - * Destroys a connection object.
    - *
    - * @param servconn The connection.
    - */
    -void msn_servconn_destroy(MsnServConn *servconn);
    -
    -/**
    - * Connects to a host.
    - *
    - * @param servconn The connection.
    - * @param host The host.
    - * @param port The port.
    - * @param force Force this servconn to connect to a new server.
    - */
    -gboolean msn_servconn_connect(MsnServConn *servconn, const char *host, int port,
    - gboolean force);
    -
    -/**
    - * Disconnects.
    - *
    - * @param servconn The connection.
    - */
    -void msn_servconn_disconnect(MsnServConn *servconn);
    -
    -/**
    - * Sets the connect callback.
    - *
    - * @param servconn The servconn.
    - * @param connect_cb The connect callback.
    - */
    -void msn_servconn_set_connect_cb(MsnServConn *servconn,
    - void (*connect_cb)(MsnServConn *));
    -/**
    - * Sets the disconnect callback.
    - *
    - * @param servconn The servconn.
    - * @param disconnect_cb The disconnect callback.
    - */
    -void msn_servconn_set_disconnect_cb(MsnServConn *servconn,
    - void (*disconnect_cb)(MsnServConn *));
    -/**
    - * Sets the destroy callback.
    - *
    - * @param servconn The servconn that's being destroyed.
    - * @param destroy_cb The destroy callback.
    - */
    -void msn_servconn_set_destroy_cb(MsnServConn *servconn,
    - void (*destroy_cb)(MsnServConn *));
    -
    -/**
    - * Writes a chunck of data to the servconn.
    - *
    - * @param servconn The servconn.
    - * @param buf The data to write.
    - * @param size The size of the data.
    - */
    -gssize msn_servconn_write(MsnServConn *servconn, const char *buf,
    - size_t size);
    -
    -/**
    - * Function to call whenever an error related to a switchboard occurs.
    - *
    - * @param servconn The servconn.
    - * @param error The error that happened.
    - */
    -void msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error,
    - const char *reason);
    -
    -/**
    - * Process the data in servconn->rx_buf. This is called after reading
    - * data from the socket.
    - *
    - * @param servconn The servconn.
    - *
    - * @return @c NULL if servconn was destroyed, 'servconn' otherwise.
    - */
    -MsnServConn *msn_servconn_process_data(MsnServConn *servconn);
    -
    -/**
    - * Set a idle timeout fot this servconn
    - *
    - * @param servconn The servconn
    - * @param seconds The idle timeout in seconds
    - */
    -void msn_servconn_set_idle_timeout(MsnServConn *servconn, guint seconds);
    -
    -#endif /* MSN_SERVCONN_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/server.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,218 +0,0 @@
    -/**
    - * @file server.h Server 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
    - */
    -#ifndef _PURPLE_SERVER_H_
    -#define _PURPLE_SERVER_H_
    -
    -#include "account.h"
    -#include "conversation.h"
    -#include "prpl.h"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Send a typing message to a given user over a given connection.
    - *
    - * TODO: Could probably move this into the conversation API.
    - *
    - * @param gc The connection over which to send the typing notification.
    - * @param name The user to send the typing notification to.
    - * @param state One of PURPLE_TYPING, PURPLE_TYPED, or PURPLE_NOT_TYPING.
    - * @return A quiet-period, specified in seconds, where Purple will not
    - * send any additional typing notification messages. Most
    - * protocols should return 0, which means that no additional
    - * PURPLE_TYPING messages need to be sent. If this is 5, for
    - * example, then Purple will wait five seconds, and if the Purple
    - * user is still typing then Purple will send another PURPLE_TYPING
    - * message.
    - */
    -unsigned int serv_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state);
    -
    -void serv_move_buddy(PurpleBuddy *, PurpleGroup *, PurpleGroup *);
    -int serv_send_im(PurpleConnection *, const char *, const char *, PurpleMessageFlags flags);
    -
    -/** Get information about an account's attention commands, from the prpl.
    - *
    - * @return The attention command numbered 'code' from the prpl's attention_types, or NULL.
    - */
    -PurpleAttentionType *purple_get_attention_type_from_code(PurpleAccount *account, guint type_code);
    -
    -/** Send an attention request message.
    - *
    - * @deprecated Use purple_prpl_send_attention() instead.
    - *
    - * @param gc The connection to send the message on.
    - * @param who Whose attention to request.
    - * @param type_code An index into the prpl's attention_types list determining the type
    - * of the attention request command to send. 0 if prpl only defines one
    - * (for example, Yahoo and MSN), but some protocols define more (MySpaceIM).
    - *
    - * Note that you can't send arbitrary PurpleAttentionType's, because there is
    - * only a fixed set of attention commands.
    - */
    -void serv_send_attention(PurpleConnection *gc, const char *who, guint type_code);
    -
    -/** Process an incoming attention message.
    - *
    - * @deprecated Use purple_prpl_got_attention() instead.
    - *
    - * @param gc The connection that received the attention message.
    - * @param who Who requested your attention.
    - * @param type_code An index into the prpl's attention_types list determining the type
    - * of the attention request command to send.
    - */
    -void serv_got_attention(PurpleConnection *gc, const char *who, guint type_code);
    -
    -void serv_get_info(PurpleConnection *, const char *);
    -void serv_set_info(PurpleConnection *, const char *);
    -
    -void serv_add_permit(PurpleConnection *, const char *);
    -void serv_add_deny(PurpleConnection *, const char *);
    -void serv_rem_permit(PurpleConnection *, const char *);
    -void serv_rem_deny(PurpleConnection *, const char *);
    -void serv_set_permit_deny(PurpleConnection *);
    -void serv_chat_invite(PurpleConnection *, int, const char *, const char *);
    -void serv_chat_leave(PurpleConnection *, int);
    -void serv_chat_whisper(PurpleConnection *, int, const char *, const char *);
    -int serv_chat_send(PurpleConnection *, int, const char *, PurpleMessageFlags flags);
    -void serv_alias_buddy(PurpleBuddy *);
    -void serv_got_alias(PurpleConnection *gc, const char *who, const char *alias);
    -
    -/**
    - * A protocol plugin should call this when it retrieves a private alias from
    - * the server. Private aliases are the aliases the user sets, while public
    - * aliases are the aliases or display names that buddies set for themselves.
    - *
    - * @param gc The connection on which the alias was received.
    - * @param who The name of the buddy whose alias was received.
    - * @param alias The alias that was received.
    - */
    -void purple_serv_got_private_alias(PurpleConnection *gc, const char *who, const char *alias);
    -
    -
    -/**
    - * Receive a typing message from a remote user. Either PURPLE_TYPING
    - * or PURPLE_TYPED. If the user has stopped typing then use
    - * serv_got_typing_stopped instead.
    - *
    - * TODO: Could probably move this into the conversation API.
    - *
    - * @param gc The connection on which the typing message was received.
    - * @param name The name of the remote user.
    - * @param timeout If this is a number greater than 0, then
    - * Purple will wait this number of seconds and then
    - * set this buddy to the PURPLE_NOT_TYPING state. This
    - * is used by protocols that send repeated typing messages
    - * while the user is composing the message.
    - * @param state The typing state received
    - */
    -void serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
    - PurpleTypingState state);
    -
    -/**
    - * TODO: Could probably move this into the conversation API.
    - */
    -void serv_got_typing_stopped(PurpleConnection *gc, const char *name);
    -
    -void serv_got_im(PurpleConnection *gc, const char *who, const char *msg,
    - PurpleMessageFlags flags, time_t mtime);
    -
    -/**
    - * @param data The hash function should be g_str_hash() and the equal
    - * function should be g_str_equal().
    - */
    -void serv_join_chat(PurpleConnection *, GHashTable *data);
    -
    -/**
    - * @param data The hash function should be g_str_hash() and the equal
    - * function should be g_str_equal().
    - */
    -void serv_reject_chat(PurpleConnection *, GHashTable *data);
    -
    -/**
    - * Called by a prpl when an account is invited into a chat.
    - *
    - * @param gc The connection on which the invite arrived.
    - * @param name The name of the chat you're being invited to.
    - * @param who The username of the person inviting the account.
    - * @param message The optional invite message.
    - * @param data The components necessary if you want to call serv_join_chat().
    - * The hash function should be g_str_hash() and the equal
    - * function should be g_str_equal().
    - */
    -void serv_got_chat_invite(PurpleConnection *gc, const char *name,
    - const char *who, const char *message,
    - GHashTable *data);
    -
    -/**
    - * Called by a prpl when an account has joined a chat.
    - *
    - * @param gc The connection on which the chat was joined.
    - * @param id The id of the chat, assigned by the prpl.
    - * @param name The name of the chat.
    - * @return The resulting conversation
    - */
    -PurpleConversation *serv_got_joined_chat(PurpleConnection *gc,
    - int id, const char *name);
    -/**
    - * Called by a prpl when an attempt to join a chat via serv_join_chat()
    - * fails.
    - *
    - * @param gc The connection on which chat joining failed
    - * @param data The components passed to serv_join_chat() originally.
    - * The hash function should be g_str_hash() and the equal
    - * function should be g_str_equal().
    - */
    -void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data);
    -
    -/**
    - * Called by a prpl when an account has left a chat.
    - *
    - * @param g The connection on which the chat was left.
    - * @param id The id of the chat, as assigned by the prpl.
    - */
    -void serv_got_chat_left(PurpleConnection *g, int id);
    -
    -/**
    - * Called by a prpl when a message has been received in a chat.
    - *
    - * @param g The connection on which the message was received.
    - * @param id The id of the chat, as assigned by the prpl.
    - * @param who The name of the user who sent the message.
    - * @param flags The flags of the message.
    - * @param message The message received in the chat.
    - * @param mtime The time when the message was received.
    - */
    -void serv_got_chat_in(PurpleConnection *g, int id, const char *who,
    - PurpleMessageFlags flags, const char *message, time_t mtime);
    -void serv_send_file(PurpleConnection *gc, const char *who, const char *file);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SERVER_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/session.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,245 +0,0 @@
    -/**
    - * @file session.h MSN session functions
    - *
    - * 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
    - */
    -#ifndef MSN_SESSION_H
    -#define MSN_SESSION_H
    -
    -typedef struct _MsnSession MsnSession;
    -
    -/**
    - * Types of errors.
    - */
    -typedef enum
    -{
    - MSN_ERROR_SERVCONN,
    - MSN_ERROR_UNSUPPORTED_PROTOCOL,
    - MSN_ERROR_HTTP_MALFORMED,
    - MSN_ERROR_AUTH,
    - MSN_ERROR_BAD_BLIST,
    - MSN_ERROR_SIGN_OTHER,
    - MSN_ERROR_SERV_DOWN,
    - MSN_ERROR_SERV_UNAVAILABLE
    -} MsnErrorType;
    -
    -/**
    - * Login steps.
    - */
    -typedef enum
    -{
    - MSN_LOGIN_STEP_START,
    - MSN_LOGIN_STEP_HANDSHAKE,
    - MSN_LOGIN_STEP_TRANSFER,
    - MSN_LOGIN_STEP_HANDSHAKE2,
    - MSN_LOGIN_STEP_AUTH_START,
    - MSN_LOGIN_STEP_GET_COOKIE,
    - MSN_LOGIN_STEP_AUTH_END,
    - MSN_LOGIN_STEP_SYN,
    - MSN_LOGIN_STEP_END
    -} MsnLoginStep;
    -
    -#define MSN_LOGIN_STEPS MSN_LOGIN_STEP_END
    -
    -#define MSN_LOGIN_FQY_TIMEOUT 30
    -
    -#define MSN_LOGIN_FQY_TIMEOUT 30
    -
    -#include "nexus.h"
    -#include "notification.h"
    -#include "oim.h"
    -#include "switchboard.h"
    -#include "user.h"
    -#include "userlist.h"
    -
    -struct _MsnSession
    -{
    - PurpleAccount *account;
    - MsnUser *user;
    -
    - guint protocol_ver;
    -
    - MsnLoginStep login_step; /**< The current step in the login process. */
    -
    - gboolean connected:1;
    - gboolean logged_in:1; /**< A temporal flag to ignore local buddy list adds. */
    - gboolean destroying:1; /**< A flag that states if the session is being destroyed. */
    - gboolean http_method:1;
    - gboolean enable_mpop:1; /**< Use Multiple Points of Presence? */
    - int adl_fqy; /**< A count of ADL/FQY so status is only changed once. */
    - guint login_timeout; /**< Timeout to force status change if ADL/FQY fail. */
    -
    - MsnNotification *notification;
    - MsnNexus *nexus;
    - MsnOim *oim;
    - MsnUserList *userlist;
    - char *abch_cachekey;
    -
    - int servconns_count; /**< The count of server connections. */
    - GList *switches; /**< The list of all the switchboards. */
    - GList *slplinks; /**< The list of all the slplinks. */
    -
    - /*psm info*/
    - char *psm;
    -
    -#if 0
    - char *blocked_text;
    -#endif
    -
    - struct
    - {
    - char *sid;
    - char *mspauth;
    - unsigned long sl;
    - char *client_ip;
    - int client_port;
    - char *mail_url;
    - gulong mail_timestamp;
    - gboolean email_enabled;
    - } passport_info;
    -
    - GHashTable *soap_table;
    - guint soap_cleanup_handle;
    - char *guid;
    -
    - GSList *url_datas; /**< PurpleUtilFetchUrlData to be cancelled on exit */
    -};
    -
    -/**
    - * Creates an MSN session.
    - *
    - * @param account The account.
    - *
    - * @return The new MSN session.
    - */
    -MsnSession *msn_session_new(PurpleAccount *account);
    -
    -/**
    - * Destroys an MSN session.
    - *
    - * @param session The MSN session to destroy.
    - */
    -void msn_session_destroy(MsnSession *session);
    -
    -/**
    - * Connects to and initiates an MSN session.
    - *
    - * @param session The MSN session.
    - * @param host The dispatch server host.
    - * @param port The dispatch server port.
    - * @param http_method Whether to use or not http_method.
    - *
    - * @return @c TRUE on success, @c FALSE on failure.
    - */
    -gboolean msn_session_connect(MsnSession *session,
    - const char *host, int port,
    - gboolean http_method);
    -
    -/**
    - * Disconnects from an MSN session.
    - *
    - * @param session The MSN session.
    - */
    -void msn_session_disconnect(MsnSession *session);
    -
    - /**
    - * Finds a switchboard with the given username.
    - *
    - * @param session The MSN session.
    - * @param username The username to search for.
    - *
    - * @return The switchboard, if found.
    - */
    -MsnSwitchBoard *msn_session_find_swboard(MsnSession *session,
    - const char *username);
    -
    - /**
    - * Finds a switchboard with the given conversation.
    - *
    - * @param session The MSN session.
    - * @param conv The conversation to search for.
    - *
    - * @return The switchboard, if found.
    - */
    -MsnSwitchBoard *msn_session_find_swboard_with_conv(MsnSession *session,
    - PurpleConversation *conv);
    -/**
    - * Finds a switchboard with the given chat ID.
    - *
    - * @param session The MSN session.
    - * @param chat_id The chat ID to search for.
    - *
    - * @return The switchboard, if found.
    - */
    -MsnSwitchBoard *msn_session_find_swboard_with_id(const MsnSession *session,
    - int chat_id);
    -
    -/**
    - * Returns a switchboard to communicate with certain username.
    - *
    - * @param session The MSN session.
    - * @param username The username to search for.
    - * @param flag The flag of the switchboard
    - *
    - * @return The switchboard.
    - */
    -MsnSwitchBoard *msn_session_get_swboard(MsnSession *session,
    - const char *username, MsnSBFlag flag);
    -
    -/**
    - * Sets an error for the MSN session.
    - *
    - * @param session The MSN session.
    - * @param error The error.
    - * @param info Extra information.
    - */
    -void msn_session_set_error(MsnSession *session, MsnErrorType error,
    - const char *info);
    -
    -/**
    - * Starts a timeout to initiate finishing login. Sometimes the server ignores
    - * our FQY requests, so this forces ourselves online eventually.
    - *
    - * @param session The MSN session.
    - */
    -void
    -msn_session_activate_login_timeout(MsnSession *session);
    -
    -/**
    - * Sets the current step in the login process.
    - *
    - * @param session The MSN session.
    - * @param step The current step.
    - */
    -void msn_session_set_login_step(MsnSession *session, MsnLoginStep step);
    -
    -/**
    - * Finish the login proccess.
    - *
    - * @param session The MSN session.
    - */
    -void msn_session_finish_login(MsnSession *session);
    -
    -/*post message to User*/
    -void msn_session_report_user(MsnSession *session,const char *passport,
    - const char *msg,PurpleMessageFlags flags);
    -
    -#endif /* MSN_SESSION_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/si.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,40 +0,0 @@
    -/**
    - * @file si.h SI transfer functions
    - *
    - * 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
    - */
    -#ifndef PURPLE_JABBER_SI_H_
    -#define PURPLE_JABBER_SI_H_
    -
    -#include "ft.h"
    -
    -#include "jabber.h"
    -
    -void jabber_bytestreams_parse(JabberStream *js, const char *from,
    - JabberIqType type, const char *id, xmlnode *query);
    -void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type,
    - const char *id, xmlnode *si);
    -PurpleXfer *jabber_si_new_xfer(PurpleConnection *gc, const char *who);
    -void jabber_si_xfer_send(PurpleConnection *gc, const char *who, const char *file);
    -void jabber_si_init(void);
    -void jabber_si_uninit(void);
    -
    -#endif /* PURPLE_JABBER_SI_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/signals.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,380 +0,0 @@
    -/**
    - * @file signals.h Signal 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
    - */
    -#ifndef _PURPLE_SIGNALS_H_
    -#define _PURPLE_SIGNALS_H_
    -
    -#include <glib.h>
    -#include "value.h"
    -
    -#define PURPLE_CALLBACK(func) ((PurpleCallback)func)
    -
    -typedef void (*PurpleCallback)(void);
    -typedef void (*PurpleSignalMarshalFunc)(PurpleCallback cb, va_list args,
    - void *data, void **return_val);
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Signal API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/** The priority of a signal connected using purple_signal_connect().
    - *
    - * @see purple_signal_connect_priority()
    - */
    -#define PURPLE_SIGNAL_PRIORITY_DEFAULT 0
    -/** The largest signal priority; signals with this priority will be called
    - * <em>last</em>. (This is highest as in numerical value, not as in order of
    - * importance.)
    - *
    - * @see purple_signal_connect_priority().
    - */
    -#define PURPLE_SIGNAL_PRIORITY_HIGHEST 9999
    -/** The smallest signal priority; signals with this priority will be called
    - * <em>first</em>. (This is lowest as in numerical value, not as in order of
    - * importance.)
    - *
    - * @see purple_signal_connect_priority().
    - */
    -#define PURPLE_SIGNAL_PRIORITY_LOWEST -9999
    -
    -/**
    - * Registers a signal in an instance.
    - *
    - * @param instance The instance to register the signal for.
    - * @param signal The signal name.
    - * @param marshal The marshal function.
    - * @param ret_value The return value type, or NULL for no return value.
    - * @param num_values The number of values to be passed to the callbacks.
    - * @param ... The values to pass to the callbacks.
    - *
    - * @return The signal ID local to that instance, or 0 if the signal
    - * couldn't be registered.
    - *
    - * @see PurpleValue
    - */
    -gulong purple_signal_register(void *instance, const char *signal,
    - PurpleSignalMarshalFunc marshal,
    - PurpleValue *ret_value, int num_values, ...);
    -
    -/**
    - * Unregisters a signal in an instance.
    - *
    - * @param instance The instance to unregister the signal for.
    - * @param signal The signal name.
    - */
    -void purple_signal_unregister(void *instance, const char *signal);
    -
    -/**
    - * Unregisters all signals in an instance.
    - *
    - * @param instance The instance to unregister the signal for.
    - */
    -void purple_signals_unregister_by_instance(void *instance);
    -
    -/**
    - * Returns a list of value types used for a signal.
    - *
    - * @param instance The instance the signal is registered to.
    - * @param signal The signal.
    - * @param ret_value The return value from the last signal handler.
    - * @param num_values The returned number of values.
    - * @param values The returned list of values.
    - */
    -void purple_signal_get_values(void *instance, const char *signal,
    - PurpleValue **ret_value,
    - int *num_values, PurpleValue ***values);
    -
    -/**
    - * Connects a signal handler to a signal for a particular object.
    - *
    - * Take care not to register a handler function twice. Purple will
    - * not correct any mistakes for you in this area.
    - *
    - * @param instance The instance to connect to.
    - * @param signal The name of the signal to connect.
    - * @param handle The handle of the receiver.
    - * @param func The callback function.
    - * @param data The data to pass to the callback function.
    - * @param priority The priority with which the handler should be called. Signal
    - * handlers are called in ascending numerical order of @a
    - * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
    - * #PURPLE_SIGNAL_PRIORITY_HIGHEST.
    - *
    - * @return The signal handler ID.
    - *
    - * @see purple_signal_disconnect()
    - */
    -gulong purple_signal_connect_priority(void *instance, const char *signal,
    - void *handle, PurpleCallback func, void *data, int priority);
    -
    -/**
    - * Connects a signal handler to a signal for a particular object.
    - * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
    - *
    - * Take care not to register a handler function twice. Purple will
    - * not correct any mistakes for you in this area.
    - *
    - * @param instance The instance to connect to.
    - * @param signal The name of the signal to connect.
    - * @param handle The handle of the receiver.
    - * @param func The callback function.
    - * @param data The data to pass to the callback function.
    - *
    - * @return The signal handler ID.
    - *
    - * @see purple_signal_disconnect()
    - */
    -gulong purple_signal_connect(void *instance, const char *signal,
    - void *handle, PurpleCallback func, void *data);
    -
    -/**
    - * Connects a signal handler to a signal for a particular object.
    - *
    - * The signal handler will take a va_args of arguments, instead of
    - * individual arguments.
    - *
    - * Take care not to register a handler function twice. Purple will
    - * not correct any mistakes for you in this area.
    - *
    - * @param instance The instance to connect to.
    - * @param signal The name of the signal to connect.
    - * @param handle The handle of the receiver.
    - * @param func The callback function.
    - * @param data The data to pass to the callback function.
    - * @param priority The priority with which the handler should be called. Signal
    - * handlers are called in ascending numerical order of @a
    - * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
    - * #PURPLE_SIGNAL_PRIORITY_HIGHEST.
    - *
    - * @return The signal handler ID.
    - *
    - * @see purple_signal_disconnect()
    - */
    -gulong purple_signal_connect_priority_vargs(void *instance, const char *signal,
    - void *handle, PurpleCallback func, void *data, int priority);
    -
    -/**
    - * Connects a signal handler to a signal for a particular object.
    - * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
    - *
    - * The signal handler will take a va_args of arguments, instead of
    - * individual arguments.
    - *
    - * Take care not to register a handler function twice. Purple will
    - * not correct any mistakes for you in this area.
    - *
    - * @param instance The instance to connect to.
    - * @param signal The name of the signal to connect.
    - * @param handle The handle of the receiver.
    - * @param func The callback function.
    - * @param data The data to pass to the callback function.
    - *
    - * @return The signal handler ID.
    - *
    - * @see purple_signal_disconnect()
    - */
    -gulong purple_signal_connect_vargs(void *instance, const char *signal,
    - void *handle, PurpleCallback func, void *data);
    -
    -/**
    - * Disconnects a signal handler from a signal on an object.
    - *
    - * @param instance The instance to disconnect from.
    - * @param signal The name of the signal to disconnect.
    - * @param handle The handle of the receiver.
    - * @param func The registered function to disconnect.
    - *
    - * @see purple_signal_connect()
    - */
    -void purple_signal_disconnect(void *instance, const char *signal,
    - void *handle, PurpleCallback func);
    -
    -/**
    - * Removes all callbacks associated with a receiver handle.
    - *
    - * @param handle The receiver handle.
    - */
    -void purple_signals_disconnect_by_handle(void *handle);
    -
    -/**
    - * Emits a signal.
    - *
    - * @param instance The instance emitting the signal.
    - * @param signal The signal being emitted.
    - *
    - * @see purple_signal_connect()
    - * @see purple_signal_disconnect()
    - */
    -void purple_signal_emit(void *instance, const char *signal, ...);
    -
    -/**
    - * Emits a signal, using a va_list of arguments.
    - *
    - * @param instance The instance emitting the signal.
    - * @param signal The signal being emitted.
    - * @param args The arguments list.
    - *
    - * @see purple_signal_connect()
    - * @see purple_signal_disconnect()
    - */
    -void purple_signal_emit_vargs(void *instance, const char *signal, va_list args);
    -
    -/**
    - * Emits a signal and returns the first non-NULL return value.
    - *
    - * Further signal handlers are NOT called after a handler returns
    - * something other than NULL.
    - *
    - * @param instance The instance emitting the signal.
    - * @param signal The signal being emitted.
    - *
    - * @return The first non-NULL return value
    - */
    -void *purple_signal_emit_return_1(void *instance, const char *signal, ...);
    -
    -/**
    - * Emits a signal and returns the first non-NULL return value.
    - *
    - * Further signal handlers are NOT called after a handler returns
    - * something other than NULL.
    - *
    - * @param instance The instance emitting the signal.
    - * @param signal The signal being emitted.
    - * @param args The arguments list.
    - *
    - * @return The first non-NULL return value
    - */
    -void *purple_signal_emit_vargs_return_1(void *instance, const char *signal,
    - va_list args);
    -
    -/**
    - * Initializes the signals subsystem.
    - */
    -void purple_signals_init(void);
    -
    -/**
    - * Uninitializes the signals subsystem.
    - */
    -void purple_signals_uninit(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Marshal Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -void purple_marshal_VOID(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__INT_INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_INT_INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_INT_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_UINT_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -
    -void purple_marshal_INT__INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_INT__INT_INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_INT__POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_INT__POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -
    -void purple_marshal_BOOLEAN__POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_BOOLEAN(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_UINT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -
    -void purple_marshal_BOOLEAN__INT_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -
    -void purple_marshal_POINTER__POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_POINTER__POINTER_INT(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_POINTER__POINTER_INT64(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_POINTER__POINTER_INT_BOOLEAN(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_POINTER__POINTER_INT64_BOOLEAN(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -void purple_marshal_POINTER__POINTER_POINTER(
    - PurpleCallback cb, va_list args, void *data, void **return_val);
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SIGNALS_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slp.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,51 +0,0 @@
    -/**
    - * @file slp.h MSNSLP support
    - *
    - * 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
    - */
    -#ifndef MSN_SLP_H
    -#define MSN_SLP_H
    -
    -#include "internal.h"
    -#include "ft.h"
    -
    -#include "session.h"
    -#include "slpcall.h"
    -#include "slplink.h"
    -#include "user.h"
    -
    -void
    -msn_slp_send_ok(MsnSlpCall *slpcall, const char *branch,
    - const char *type, const char *content);
    -
    -void
    -msn_slp_send_decline(MsnSlpCall *slpcall, const char *branch,
    - const char *type, const char *content);
    -
    -
    -void send_bye(MsnSlpCall *slpcall, const char *type);
    -
    -
    -void msn_request_user_display(MsnUser *user);
    -
    -void msn_request_ft(PurpleXfer *xfer);
    -
    -#endif /* MSN_SLP_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpcall.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,98 +0,0 @@
    -/**
    - * @file slpcall.h SLP Call functions
    - *
    - * 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
    - */
    -#ifndef MSN_SLPCALL_H
    -#define MSN_SLPCALL_H
    -
    -typedef struct _MsnSlpCall MsnSlpCall;
    -
    -typedef enum
    -{
    - MSN_SLPCALL_ANY,
    - MSN_SLPCALL_DC
    -} MsnSlpCallType;
    -
    -#include "internal.h"
    -
    -#include "slplink.h"
    -
    -/* The official client seems to timeout slp calls after 5 minutes */
    -#define MSN_SLPCALL_TIMEOUT 300
    -
    -struct _MsnSlpCall
    -{
    - /* Our parent slplink */
    - MsnSlpLink *slplink;
    -
    - MsnSlpCallType type;
    -
    - /* Call-ID */
    - char *id;
    - char *branch;
    -
    - long session_id;
    - long app_id;
    -
    - gboolean pending; /**< A flag that states if we should wait for this
    - slpcall to start and do not time out. */
    - gboolean progress; /**< A flag that states if there has been progress since
    - the last time out. */
    - gboolean wasted; /**< A flag that states if this slpcall is going to be
    - destroyed. */
    - gboolean started; /**< A flag that states if this slpcall's session has
    - been initiated. */
    -
    - gboolean wait_for_socket;
    -
    - void (*progress_cb)(MsnSlpCall *slpcall,
    - gsize total_length, gsize len);
    - void (*session_init_cb)(MsnSlpCall *slpcall);
    -
    - /* Can be checksum, or smile */
    - char *data_info;
    -
    - PurpleXfer *xfer;
    - union {
    - GByteArray *incoming_data;
    - struct {
    - gsize len;
    - const guchar *data;
    - } outgoing;
    - } u;
    - MsnSlpMessage *xfer_msg; /* A dirty hack */
    -
    - MsnSlpCb cb;
    - void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session);
    -
    - guint timer;
    -};
    -
    -MsnSlpCall *msn_slpcall_new(MsnSlpLink *slplink);
    -void msn_slpcall_init(MsnSlpCall *slpcall, MsnSlpCallType type);
    -void msn_slpcall_session_init(MsnSlpCall *slpcall);
    -void msn_slpcall_destroy(MsnSlpCall *slpcall);
    -void msn_slpcall_invite(MsnSlpCall *slpcall, const char *euf_guid,
    - MsnP2PAppId app_id, const char *context);
    -void msn_slpcall_close(MsnSlpCall *slpcall);
    -
    -#endif /* MSN_SLPCALL_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slplink.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,98 +0,0 @@
    -/**
    - * @file slplink.h MSNSLP Link support
    - *
    - * 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
    - */
    -#ifndef MSN_SLPLINK_H
    -#define MSN_SLPLINK_H
    -
    -typedef struct _MsnSlpLink MsnSlpLink;
    -
    -#include "directconn.h"
    -#include "session.h"
    -#include "slpcall.h"
    -#include "slpmsg.h"
    -#include "switchboard.h"
    -
    -typedef void (*MsnSlpCb)(MsnSlpCall *slpcall,
    - const guchar *data, gsize size);
    -typedef void (*MsnSlpEndCb)(MsnSlpCall *slpcall, MsnSession *session);
    -
    -struct _MsnSlpLink
    -{
    - MsnSession *session;
    - MsnSwitchBoard *swboard;
    - MsnDirectConn *dc;
    -
    - guint refs;
    -
    - char *remote_user;
    - MsnP2PVersion p2p_version;
    -
    - int slp_seq_id;
    -
    - GList *slp_calls;
    - GList *slp_msgs;
    -
    - GQueue *slp_msg_queue;
    -};
    -
    -MsnSlpLink *msn_slplink_ref(MsnSlpLink *slplink);
    -void msn_slplink_unref(MsnSlpLink *slplink);
    -
    -/**
    - * @return An MsnSlpLink for the given user, or NULL if there is no
    - * existing MsnSlpLink.
    - */
    -MsnSlpLink *msn_session_find_slplink(MsnSession *session,
    - const char *who);
    -
    -/**
    - * @return An MsnSlpLink for the given user. One will be created if
    - * it does not already exist.
    - */
    -MsnSlpLink *msn_session_get_slplink(MsnSession *session, const char *username);
    -
    -void msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
    -void msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
    -MsnSlpCall *msn_slplink_find_slp_call(MsnSlpLink *slplink,
    - const char *id);
    -MsnSlpCall *msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id);
    -MsnP2PVersion msn_slplink_get_p2p_version(MsnSlpLink *slplink);
    -
    -void msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
    -void msn_slplink_send_slpmsg(MsnSlpLink *slplink,
    - MsnSlpMessage *slpmsg);
    -void msn_slplink_send_queued_slpmsgs(MsnSlpLink *slplink);
    -void msn_slplink_process_msg(MsnSlpLink *slplink, MsnSlpMessagePart *part);
    -
    -/* Only exported for msn_xfer_write */
    -void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
    -
    -void msn_slplink_request_object(MsnSlpLink *slplink,
    - const char *info,
    - MsnSlpCb cb,
    - MsnSlpEndCb end_cb,
    - const MsnObject *obj);
    -
    -MsnSlpCall *msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg);
    -
    -#endif /* MSN_SLPLINK_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpmsg.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,150 +0,0 @@
    -/**
    - * @file slpmsg.h SLP Message functions
    - *
    - * 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
    - */
    -#ifndef _MSN_SLPMSG_H_
    -#define _MSN_SLPMSG_H_
    -
    -typedef struct _MsnSlpMessage MsnSlpMessage;
    -
    -#include "imgstore.h"
    -
    -#include "slpcall.h"
    -#include "slplink.h"
    -#include "session.h"
    -#include "p2p.h"
    -
    -#include "slp.h"
    -
    -/**
    - * A SLP Message This contains everything that we will need to send a SLP
    - * Message even if has to be sent in several parts.
    - */
    -struct _MsnSlpMessage
    -{
    - MsnSlpCall *slpcall; /**< The slpcall to which this slp message belongs (if applicable). */
    - MsnSlpLink *slplink; /**< The slplink through which this slp message is being sent. */
    - MsnSession *session;
    -
    - MsnP2PInfo *p2p_info;
    -
    - long id;
    -
    - gboolean ft;
    - PurpleStoredImage *img;
    - guchar *buffer;
    -
    - /**
    - * This is the size of buffer, unless this is an outgoing file transfer,
    - * in which case this is the size of the file.
    - */
    - gsize size;
    -
    - GList *parts; /**< A list with the SlpMsgParts */
    -
    - const char *info;
    - gboolean text_body;
    -};
    -
    -/**
    - * Creates a new slp message
    - *
    - * @param slplink The slplink through which this slp message will be sent.
    - * If it's set to NULL, it is a temporary SlpMessage.
    - * @return The created slp message.
    - */
    -MsnSlpMessage *msn_slpmsg_new(MsnSlpLink *slplink, MsnSlpCall *slpcall);
    -
    -/**
    - * Destroys a slp message
    - *
    - * @param slpmsg The slp message to destory.
    - */
    -void msn_slpmsg_destroy(MsnSlpMessage *slpmsg);
    -
    -/**
    - * Relate this SlpMessage with an existing SlpLink
    - *
    - * @param slplink The SlpLink that will send this message.
    - */
    -void msn_slpmsg_set_slplink(MsnSlpMessage *slpmsg, MsnSlpLink *slplink);
    -
    -void msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
    - long long size);
    -void msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img);
    -MsnSlpMessage * msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
    - const char *header,
    - const char *branch,
    - const char *content_type,
    - const char *content);
    -
    -/**
    - * Create a new SLP Ack message
    - *
    - * @param header the value of the header in this slpmsg.
    - *
    - * @return A new SlpMessage with ACK headers
    - */
    -MsnSlpMessage *msn_slpmsg_ack_new(MsnSlpLink *slplink, MsnP2PInfo *info);
    -
    -/**
    - * Create a new SLP message for MsnObject data.
    - *
    - * @param slpcall The slpcall that manages this message.
    - * @param img The image to be sent in this message.
    - *
    - * @return A new SlpMessage with MsnObject info.
    - */
    -MsnSlpMessage *msn_slpmsg_obj_new(MsnSlpCall *slpcall, PurpleStoredImage *img);
    -
    -/**
    - * Create a new SLP message for data preparation.
    - *
    - * @param slpcall The slpcall that manages this message.
    - *
    - * @return A new SlpMessage with data preparation info.
    - */
    -MsnSlpMessage *msn_slpmsg_dataprep_new(MsnSlpCall *slpcall);
    -
    -/**
    - * Create a new SLP message for File transfer.
    - *
    - * @param slpcall The slpcall that manages this message.
    - * @param size The size of the file being transsmited.
    - *
    - * @return A new SlpMessage with the file transfer info.
    - */
    -MsnSlpMessage *msn_slpmsg_file_new(MsnSlpCall *slpcall, size_t size);
    -
    -/**
    - * Serialize the MsnSlpMessage in a way it can be used to be transmited
    - *
    - * @param slpmsg The MsnSlpMessage.
    - * @param ret_size The size of the buffer cointaining the message.
    - *
    - * @return a buffer with the serialized data.
    - */
    -char *msn_slpmsg_serialize(MsnSlpMessage *slpmsg, size_t *ret_size);
    -
    -void msn_slpmsg_show_readable(MsnSlpMessage *slpmsg);
    -
    -#endif /* _MSN_SLPMSG_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/slpmsg_part.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,66 +0,0 @@
    -/**
    - * @file slpmsg_part.h MSNSLP Parts
    - *
    - * 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
    - */
    -
    -#ifndef MSN_SLPMSG_PART_H
    -#define MSN_SLPMSG_PART_H
    -
    -#include "p2p.h"
    -
    -typedef struct _MsnSlpMessagePart MsnSlpMessagePart;
    -typedef void (*MsnSlpPartCb)(MsnSlpMessagePart *part, void *data);
    -
    -struct _MsnSlpMessagePart
    -{
    - guint ref_count;
    -
    - MsnP2PInfo *info;
    -
    - MsnSlpPartCb ack_cb;
    - MsnSlpPartCb nak_cb;
    - void *ack_data;
    -
    - guchar *buffer;
    - size_t size;
    -};
    -
    -MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PInfo *info);
    -
    -MsnSlpMessagePart *msn_slpmsgpart_new_from_data(MsnP2PVersion p2p, const char *data, size_t data_len);
    -
    -MsnSlpMessagePart *msn_slpmsgpart_ref(MsnSlpMessagePart *part);
    -
    -void msn_slpmsgpart_unref(MsnSlpMessagePart *part);
    -
    -void msn_slpmsgpart_set_bin_data(MsnSlpMessagePart *part, const void *data, size_t len);
    -
    -char *msn_slpmsgpart_serialize(MsnSlpMessagePart *part, size_t *ret_size);
    -
    -void msn_slpmsgpart_ack(MsnSlpMessagePart *part, void *data);
    -
    -void msn_slpmsgpart_nak(MsnSlpMessagePart *part, void *data);
    -
    -void msn_slpmsgpart_to_string(MsnSlpMessagePart *part, GString *str);
    -
    -#endif /* MSN_SLPMSG_PART_H */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/smiley.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,262 +0,0 @@
    -/**
    - * @file smiley.h Smiley API
    - * @ingroup core
    - * @since 2.5.0
    - */
    -
    -/* 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
    - *
    - */
    -
    -#ifndef _PURPLE_SMILEY_H_
    -#define _PURPLE_SMILEY_H_
    -
    -#include <glib-object.h>
    -
    -#include "imgstore.h"
    -#include "util.h"
    -
    -/**
    - * A custom smiley.
    - * This contains everything Purple will ever need to know about a custom smiley.
    - * Everything.
    - *
    - * PurpleSmiley is a GObject.
    - */
    -typedef struct _PurpleSmiley PurpleSmiley;
    -typedef struct _PurpleSmileyClass PurpleSmileyClass;
    -
    -#define PURPLE_TYPE_SMILEY (purple_smiley_get_type ())
    -#define PURPLE_SMILEY(smiley) (G_TYPE_CHECK_INSTANCE_CAST ((smiley), PURPLE_TYPE_SMILEY, PurpleSmiley))
    -#define PURPLE_SMILEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PURPLE_TYPE_SMILEY, PurpleSmileyClass))
    -#define PURPLE_IS_SMILEY(smiley) (G_TYPE_CHECK_INSTANCE_TYPE ((smiley), PURPLE_TYPE_SMILEY))
    -#define PURPLE_IS_SMILEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PURPLE_TYPE_SMILEY))
    -#define PURPLE_SMILEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PURPLE_TYPE_SMILEY, PurpleSmileyClass))
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Custom Smiley API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * GObject-fu.
    - * @internal.
    - */
    -GType purple_smiley_get_type(void);
    -
    -/**
    - * Creates a new custom smiley from a PurpleStoredImage.
    - *
    - * If a custom smiley with the given shortcut already exists, it
    - * will be automaticaly returned.
    - *
    - * @param img The image associated with the smiley.
    - * @param shortcut The associated shortcut (e.g. "(homer)").
    - *
    - * @return The custom smiley.
    - */
    -PurpleSmiley *
    -purple_smiley_new(PurpleStoredImage *img, const char *shortcut);
    -
    -/**
    - * Creates a new custom smiley, reading the image data from a file.
    - *
    - * If a custom smiley with the given shortcut already exists, it
    - * will be automaticaly returned.
    - *
    - * @param shortcut The associated shortcut (e.g. "(homer)").
    - * @param filepath The image file.
    - *
    - * @return The custom smiley.
    - */
    -PurpleSmiley *
    -purple_smiley_new_from_file(const char *shortcut, const char *filepath);
    -
    -/**
    - * Destroys the custom smiley and releases the associated resources.
    - *
    - * @param smiley The custom smiley.
    - */
    -void
    -purple_smiley_delete(PurpleSmiley *smiley);
    -
    -/**
    - * Changes the custom smiley's shortcut.
    - *
    - * @param smiley The custom smiley.
    - * @param shortcut The new shortcut. A custom smiley with this shortcut
    - * cannot already be in use.
    - *
    - * @return TRUE if the shortcut was changed. FALSE otherwise.
    - */
    -gboolean
    -purple_smiley_set_shortcut(PurpleSmiley *smiley, const char *shortcut);
    -
    -/**
    - * Changes the custom smiley's image data.
    - *
    - * @param smiley The custom smiley.
    - * @param smiley_data The custom smiley data, which the smiley code
    - * takes ownership of and will free.
    - * @param smiley_data_len The length of the data in @a smiley_data.
    - */
    -void
    -purple_smiley_set_data(PurpleSmiley *smiley, guchar *smiley_data,
    - size_t smiley_data_len);
    -
    -/**
    - * Returns the custom smiley's associated shortcut (e.g. "(homer)").
    - *
    - * @param smiley The custom smiley.
    - *
    - * @return The shortcut.
    - */
    -const char *purple_smiley_get_shortcut(const PurpleSmiley *smiley);
    -
    -/**
    - * Returns the custom smiley data's checksum.
    - *
    - * @param smiley The custom smiley.
    - *
    - * @return The checksum.
    - */
    -const char *purple_smiley_get_checksum(const PurpleSmiley *smiley);
    -
    -/**
    - * Returns the PurpleStoredImage with the reference counter incremented.
    - *
    - * The returned PurpleStoredImage reference counter must be decremented
    - * when the caller is done using it.
    - *
    - * @param smiley The custom smiley.
    - *
    - * @return A PurpleStoredImage.
    - */
    -PurpleStoredImage *purple_smiley_get_stored_image(const PurpleSmiley *smiley);
    -
    -/**
    - * Returns the custom smiley's data.
    - *
    - * @param smiley The custom smiley.
    - * @param len If not @c NULL, the length of the image data returned
    - * will be set in the location pointed to by this.
    - *
    - * @return A pointer to the custom smiley data.
    - */
    -gconstpointer purple_smiley_get_data(const PurpleSmiley *smiley, size_t *len);
    -
    -/**
    - * Returns an extension corresponding to the custom smiley's file type.
    - *
    - * @param smiley The custom smiley.
    - *
    - * @return The custom smiley's extension, "icon" if unknown, or @c NULL if
    - * the image data has disappeared.
    - */
    -const char *purple_smiley_get_extension(const PurpleSmiley *smiley);
    -
    -/**
    - * Returns a full path to an custom smiley.
    - *
    - * If the custom smiley has data and the file exists in the cache, this
    - * will return a full path to the cached file.
    - *
    - * In general, it is not appropriate to be poking in the file cache
    - * directly. If you find yourself wanting to use this function, think
    - * very long and hard about it, and then don't.
    - *
    - * Think some more.
    - *
    - * @param smiley The custom smiley.
    - *
    - * @return A full path to the file, or @c NULL under various conditions.
    - * The caller should use g_free to free the returned string.
    - */
    -char *purple_smiley_get_full_path(PurpleSmiley *smiley);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Custom Smiley Subsystem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns a list of all custom smileys. The caller is responsible for freeing
    - * the list.
    - *
    - * @return A list of all custom smileys.
    - */
    -GList *
    -purple_smileys_get_all(void);
    -
    -/**
    - * Returns a custom smiley given its shortcut.
    - *
    - * @param shortcut The custom smiley's shortcut.
    - *
    - * @return The custom smiley if found, or @c NULL if not found.
    - */
    -PurpleSmiley *
    -purple_smileys_find_by_shortcut(const char *shortcut);
    -
    -/**
    - * Returns a custom smiley given its checksum.
    - *
    - * @param checksum The custom smiley's checksum.
    - *
    - * @return The custom smiley if found, or @c NULL if not found.
    - */
    -PurpleSmiley *
    -purple_smileys_find_by_checksum(const char *checksum);
    -
    -/**
    - * Returns the directory used to store custom smiley cached files.
    - *
    - * The default directory is PURPLEDIR/custom_smiley.
    - *
    - * @return The directory in which to store custom smileys cached files.
    - */
    -const char *purple_smileys_get_storing_dir(void);
    -
    -/**
    - * Initializes the custom smiley subsystem.
    - */
    -void purple_smileys_init(void);
    -
    -/**
    - * Uninitializes the custom smiley subsystem.
    - */
    -void purple_smileys_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SMILEY_H_ */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/snactypes.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,287 +0,0 @@
    -/*
    - * Purple's oscar protocol plugin
    - * This file is the legal property of its developers.
    - * Please see the AUTHORS file distributed alongside this file.
    - *
    - * This library is free software; you can redistribute it and/or
    - * modify it under the terms of the GNU Lesser General Public
    - * License as published by the Free Software Foundation; either
    - * version 2 of the License, or (at your option) any later version.
    - *
    - * This library 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
    - * Lesser General Public License for more details.
    - *
    - * You should have received a copy of the GNU Lesser General Public
    - * License along with this library; if not, write to the Free Software
    - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    -*/
    -
    -/*
    - * AIM Callback Types
    - *
    - */
    -#ifndef _SNACTYPES_H_
    -#define _SNACTYPES_H_
    -
    -/*
    - * SNAC Families.
    - */
    -#define SNAC_FAMILY_OSERVICE 0x0001
    -#define SNAC_FAMILY_LOCATE 0x0002
    -#define SNAC_FAMILY_BUDDY 0x0003
    -#define SNAC_FAMILY_ICBM 0x0004
    -#define SNAC_FAMILY_ADVERT 0x0005
    -#define SNAC_FAMILY_INVITE 0x0006
    -#define SNAC_FAMILY_ADMIN 0x0007
    -#define SNAC_FAMILY_POPUP 0x0008
    -#define SNAC_FAMILY_BOS 0x0009
    -#define SNAC_FAMILY_USERLOOKUP 0x000a
    -#define SNAC_FAMILY_STATS 0x000b
    -#define SNAC_FAMILY_TRANSLATE 0x000c
    -#define SNAC_FAMILY_CHATNAV 0x000d
    -#define SNAC_FAMILY_CHAT 0x000e
    -#define SNAC_FAMILY_ODIR 0x000f
    -#define SNAC_FAMILY_BART 0x0010
    -#define SNAC_FAMILY_FEEDBAG 0x0013
    -#define SNAC_FAMILY_ICQ 0x0015
    -#define SNAC_FAMILY_AUTH 0x0017
    -#define SNAC_FAMILY_ALERT 0x0018
    -
    -#define AIM_CB_FAM_SPECIAL 0xffff /* Internal libfaim use */
    -
    -/*
    - * SNAC Family: Ack.
    - *
    - * Not really a family, but treating it as one really
    - * helps it fit into the libfaim callback structure better.
    - *
    - */
    -#define AIM_CB_ACK_ACK 0x0001
    -
    -/*
    - * SNAC Family: General.
    - */
    -#define SNAC_SUBTYPE_OSERVICE_ERROR 0x0001
    -#define SNAC_SUBTYPE_OSERVICE_CLIENTREADY 0x0002
    -#define SNAC_SUBTYPE_OSERVICE_SERVERREADY 0x0003
    -#define SNAC_SUBTYPE_OSERVICE_SERVICEREQ 0x0004
    -#define SNAC_SUBTYPE_OSERVICE_REDIRECT 0x0005
    -#define SNAC_SUBTYPE_OSERVICE_RATEINFOREQ 0x0006
    -#define SNAC_SUBTYPE_OSERVICE_RATEINFO 0x0007
    -#define SNAC_SUBTYPE_OSERVICE_RATEINFOACK 0x0008
    -#define SNAC_SUBTYPE_OSERVICE_RATECHANGE 0x000a
    -#define SNAC_SUBTYPE_OSERVICE_SERVERPAUSE 0x000b
    -#define SNAC_SUBTYPE_OSERVICE_SERVERRESUME 0x000d
    -#define SNAC_SUBTYPE_OSERVICE_REQSELFINFO 0x000e
    -#define SNAC_SUBTYPE_OSERVICE_SELFINFO 0x000f
    -#define SNAC_SUBTYPE_OSERVICE_EVIL 0x0010
    -#define SNAC_SUBTYPE_OSERVICE_SETIDLE 0x0011
    -#define SNAC_SUBTYPE_OSERVICE_MIGRATIONREQ 0x0012
    -#define SNAC_SUBTYPE_OSERVICE_MOTD 0x0013
    -#define SNAC_SUBTYPE_OSERVICE_SETPRIVFLAGS 0x0014
    -#define SNAC_SUBTYPE_OSERVICE_WELLKNOWNURL 0x0015
    -#define SNAC_SUBTYPE_OSERVICE_NOP 0x0016
    -#define SNAC_SUBTYPE_OSERVICE_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Location Services.
    - */
    -#define SNAC_SUBTYPE_LOCATE_ERROR 0x0001
    -#define SNAC_SUBTYPE_LOCATE_REQRIGHTS 0x0002
    -#define SNAC_SUBTYPE_LOCATE_RIGHTSINFO 0x0003
    -#define SNAC_SUBTYPE_LOCATE_SETUSERINFO 0x0004
    -#define SNAC_SUBTYPE_LOCATE_REQUSERINFO 0x0005
    -#define SNAC_SUBTYPE_LOCATE_USERINFO 0x0006
    -#define SNAC_SUBTYPE_LOCATE_WATCHERSUBREQ 0x0007
    -#define SNAC_SUBTYPE_LOCATE_WATCHERNOT 0x0008
    -#define SNAC_SUBTYPE_LOCATE_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Buddy List Management Services.
    - */
    -#define SNAC_SUBTYPE_BUDDY_ERROR 0x0001
    -#define SNAC_SUBTYPE_BUDDY_REQRIGHTS 0x0002
    -#define SNAC_SUBTYPE_BUDDY_RIGHTSINFO 0x0003
    -#define SNAC_SUBTYPE_BUDDY_ADDBUDDY 0x0004
    -#define SNAC_SUBTYPE_BUDDY_REMBUDDY 0x0005
    -#define SNAC_SUBTYPE_BUDDY_REJECT 0x000a
    -#define SNAC_SUBTYPE_BUDDY_ONCOMING 0x000b
    -#define SNAC_SUBTYPE_BUDDY_OFFGOING 0x000c
    -#define SNAC_SUBTYPE_BUDDY_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Messaging Services.
    - */
    -#define SNAC_SUBTYPE_ICBM_ERROR 0x0001
    -#define SNAC_SUBTYPE_ICBM_PARAMINFO 0x0005
    -#define SNAC_SUBTYPE_ICBM_INCOMING 0x0007
    -#define SNAC_SUBTYPE_ICBM_EVIL 0x0009
    -#define SNAC_SUBTYPE_ICBM_MISSEDCALL 0x000a
    -#define SNAC_SUBTYPE_ICBM_CLIENTAUTORESP 0x000b
    -#define SNAC_SUBTYPE_ICBM_ACK 0x000c
    -#define SNAC_SUBTYPE_ICBM_MTN 0x0014
    -#define SNAC_SUBTYPE_ICBM_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Advertisement Services
    - */
    -#define SNAC_SUBTYPE_ADVERT_ERROR 0x0001
    -#define SNAC_SUBTYPE_ADVERT_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Invitation Services.
    - */
    -#define SNAC_SUBTYPE_INVITE_ERROR 0x0001
    -#define SNAC_SUBTYPE_INVITE_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Administrative Services.
    - */
    -#define SNAC_SUBTYPE_ADMIN_ERROR 0x0001
    -#define SNAC_SUBTYPE_ADMIN_INFOCHANGE_REPLY 0x0005
    -#define SNAC_SUBTYPE_ADMIN_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Popup Messages
    - */
    -#define SNAC_SUBTYPE_POPUP_ERROR 0x0001
    -#define SNAC_SUBTYPE_POPUP_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Misc BOS Services.
    - */
    -#define SNAC_SUBTYPE_BOS_ERROR 0x0001
    -#define SNAC_SUBTYPE_BOS_RIGHTSQUERY 0x0002
    -#define SNAC_SUBTYPE_BOS_RIGHTS 0x0003
    -#define SNAC_SUBTYPE_BOS_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: User Lookup Services
    - */
    -#define SNAC_SUBTYPE_USERLOOKUP_ERROR 0x0001
    -#define SNAC_SUBTYPE_USERLOOKUP_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: User Status Services
    - */
    -#define SNAC_SUBTYPE_STATS_ERROR 0x0001
    -#define SNAC_SUBTYPE_STATS_SETREPORTINTERVAL 0x0002
    -#define SNAC_SUBTYPE_STATS_REPORTACK 0x0004
    -#define SNAC_SUBTYPE_STATS_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Translation Services
    - */
    -#define SNAC_SUBTYPE_TRANSLATE_ERROR 0x0001
    -#define SNAC_SUBTYPE_TRANSLATE_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Chat Navigation Services
    - */
    -#define SNAC_SUBTYPE_CHATNAV_ERROR 0x0001
    -#define SNAC_SUBTYPE_CHATNAV_CREATE 0x0008
    -#define SNAC_SUBTYPE_CHATNAV_INFO 0x0009
    -#define SNAC_SUBTYPE_CHATNAV_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Chat Services
    - */
    -#define SNAC_SUBTYPE_CHAT_ERROR 0x0001
    -#define SNAC_SUBTYPE_CHAT_ROOMINFOUPDATE 0x0002
    -#define SNAC_SUBTYPE_CHAT_USERJOIN 0x0003
    -#define SNAC_SUBTYPE_CHAT_USERLEAVE 0x0004
    -#define SNAC_SUBTYPE_CHAT_OUTGOINGMSG 0x0005
    -#define SNAC_SUBTYPE_CHAT_INCOMINGMSG 0x0006
    -#define SNAC_SUBTYPE_CHAT_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: "New" Search
    - */
    -#define SNAC_SUBTYPE_ODIR_ERROR 0x0001
    -#define SNAC_SUBTYPE_ODIR_SEARCH 0x0002
    -#define SNAC_SUBTYPE_ODIR_RESULTS 0x0003
    -
    -/*
    - * SNAC Family: Buddy icons
    - */
    -#define SNAC_SUBTYPE_BART_ERROR 0x0001
    -#define SNAC_SUBTYPE_BART_REQUEST 0x0004
    -#define SNAC_SUBTYPE_BART_RESPONSE 0x0005
    -
    -/*
    - * SNAC Family: Server-Stored Buddy Lists
    - */
    -#define SNAC_SUBTYPE_FEEDBAG_ERROR 0x0001
    -#define SNAC_SUBTYPE_FEEDBAG_REQRIGHTS 0x0002
    -#define SNAC_SUBTYPE_FEEDBAG_RIGHTSINFO 0x0003
    -#define SNAC_SUBTYPE_FEEDBAG_REQDATA 0x0004
    -#define SNAC_SUBTYPE_FEEDBAG_REQIFCHANGED 0x0005
    -#define SNAC_SUBTYPE_FEEDBAG_LIST 0x0006
    -#define SNAC_SUBTYPE_FEEDBAG_ACTIVATE 0x0007
    -#define SNAC_SUBTYPE_FEEDBAG_ADD 0x0008
    -#define SNAC_SUBTYPE_FEEDBAG_MOD 0x0009
    -#define SNAC_SUBTYPE_FEEDBAG_DEL 0x000A
    -#define SNAC_SUBTYPE_FEEDBAG_SRVACK 0x000E
    -#define SNAC_SUBTYPE_FEEDBAG_NOLIST 0x000F
    -#define SNAC_SUBTYPE_FEEDBAG_EDITSTART 0x0011
    -#define SNAC_SUBTYPE_FEEDBAG_EDITSTOP 0x0012
    -#define SNAC_SUBTYPE_FEEDBAG_SENDAUTH 0x0014
    -#define SNAC_SUBTYPE_FEEDBAG_RECVAUTH 0x0015
    -#define SNAC_SUBTYPE_FEEDBAG_SENDAUTHREQ 0x0018
    -#define SNAC_SUBTYPE_FEEDBAG_RECVAUTHREQ 0x0019
    -#define SNAC_SUBTYPE_FEEDBAG_SENDAUTHREP 0x001a
    -#define SNAC_SUBTYPE_FEEDBAG_RECVAUTHREP 0x001b
    -#define SNAC_SUBTYPE_FEEDBAG_ADDED 0x001c
    -
    -/*
    - * SNAC Family: ICQ
    - *
    - * Most of these are actually special.
    - */
    -#define SNAC_SUBTYPE_ICQ_ERROR 0x0001
    -#define SNAC_SUBTYPE_ICQ_OFFLINEMSG 0x00f0
    -#define SNAC_SUBTYPE_ICQ_OFFLINEMSGCOMPLETE 0x00f1
    -#define SNAC_SUBTYPE_ICQ_INFO 0x00f2
    -#define SNAC_SUBTYPE_ICQ_ALIAS 0x00f3
    -#define SNAC_SUBTYPE_ICQ_DEFAULT 0xffff
    -
    -/*
    - * SNAC Family: Authorizer
    - *
    - * Used only in protocol versions three and above.
    - */
    -#define SNAC_SUBTYPE_AUTH_ERROR 0x0001
    -#define SNAC_SUBTYPE_AUTH_LOGINREQEST 0x0002
    -#define SNAC_SUBTYPE_AUTH_LOGINRESPONSE 0x0003
    -#define SNAC_SUBTYPE_AUTH_AUTHREQ 0x0006
    -#define SNAC_SUBTYPE_AUTH_AUTHRESPONSE 0x0007
    -#define SNAC_SUBTYPE_AUTH_SECURID_REQUEST 0x000a
    -#define SNAC_SUBTYPE_AUTH_SECURID_RESPONSE 0x000b
    -
    -/*
    - * SNAC Family: Email
    - *
    - * Used for getting information on the email address
    - * associated with your username.
    - */
    -#define SNAC_SUBTYPE_ALERT_ERROR 0x0001
    -#define SNAC_SUBTYPE_ALERT_SENDCOOKIES 0x0006
    -#define SNAC_SUBTYPE_ALERT_MAILSTATUS 0x0007
    -#define SNAC_SUBTYPE_ALERT_INIT 0x0016
    -
    -/*
    - * SNAC Family: Internal Messages
    - *
    - * This isn't truly a SNAC family either, but using
    - * these, we can integrated non-SNAC services into
    - * the SNAC-centered libfaim callback structure.
    - */
    -#define AIM_CB_SPECIAL_CONNERR 0x0003
    -#define AIM_CB_SPECIAL_CONNINITDONE 0x0006
    -
    -/* SNAC flags */
    -#define AIM_SNACFLAGS_DESTRUCTOR 0x0001
    -
    -#endif /* _SNACTYPES_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/soap.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,52 +0,0 @@
    -/**
    - * @file soap.h
    - * header file for SOAP connection related process
    - *
    - * 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 02110-1301, USA
    - */
    -#ifndef MSN_SOAP_H
    -#define MSN_SOAP_H
    -
    -typedef struct _MsnSoapMessage MsnSoapMessage;
    -
    -#include <glib.h>
    -
    -#include "xmlnode.h"
    -
    -#include "session.h"
    -#include "sslconn.h"
    -
    -typedef void (*MsnSoapCallback)(MsnSoapMessage *request,
    - MsnSoapMessage *response, gpointer cb_data);
    -
    -struct _MsnSoapMessage {
    - char *action;
    - xmlnode *xml;
    - GSList *headers;
    -};
    -
    -MsnSoapMessage *msn_soap_message_new(const char *action, xmlnode *xml);
    -
    -void msn_soap_message_send(MsnSession *session, MsnSoapMessage *message,
    - const char *host, const char *path, gboolean secure,
    - MsnSoapCallback cb, gpointer cb_data);
    -
    -#endif /* MSN_SOAP_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound-theme-loader.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,71 +0,0 @@
    -/**
    - * @file sound-theme-loader.h Purple Sound Theme Loader Class API
    - */
    -
    -/* 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
    - */
    -
    -#ifndef PURPLE_SOUND_THEME_LOADER_H
    -#define PURPLE_SOUND_THEME_LOADER_H
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -#include "theme-loader.h"
    -
    -/**
    - * A purple sound theme loader. extends PurpleThemeLoader (theme-loader.h)
    - * This is a class designed to build sound themes
    - *
    - * PurpleSoundThemeLoader is a GObject.
    - */
    -typedef struct _PurpleSoundThemeLoader PurpleSoundThemeLoader;
    -typedef struct _PurpleSoundThemeLoaderClass PurpleSoundThemeLoaderClass;
    -
    -#define PURPLE_TYPE_SOUND_THEME_LOADER (purple_sound_theme_loader_get_type())
    -#define PURPLE_SOUND_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoader))
    -#define PURPLE_SOUND_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoaderClass))
    -#define PURPLE_IS_SOUND_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_SOUND_THEME_LOADER))
    -#define PURPLE_IS_SOUND_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_SOUND_THEME_LOADER))
    -#define PURPLE_SOUND_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoaderClass))
    -
    -struct _PurpleSoundThemeLoader
    -{
    - PurpleThemeLoader parent;
    -};
    -
    -struct _PurpleSoundThemeLoaderClass
    -{
    - PurpleThemeLoaderClass parent_class;
    -};
    -
    -/**************************************************************************/
    -/** @name Purple Theme-Loader API */
    -/**************************************************************************/
    -G_BEGIN_DECLS
    -
    -/**
    - * GObject foo.
    - * @internal.
    - */
    -GType purple_sound_theme_loader_get_type(void);
    -
    -G_END_DECLS
    -#endif /* PURPLE_SOUND_THEME_LOADER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound-theme.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,108 +0,0 @@
    -/**
    - * @file sound-theme.h Purple Sound Theme Abstact Class API
    - */
    -
    -/* 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
    - */
    -
    -#ifndef PURPLE_SOUND_THEME_H
    -#define PURPLE_SOUND_THEME_H
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -#include "theme.h"
    -#include "sound.h"
    -
    -/**
    - * extends PurpleTheme (theme.h)
    - * A purple sound theme.
    - * This is an object for Purple to represent a sound theme.
    - *
    - * PurpleSoundTheme is a PurpleTheme Object.
    - */
    -typedef struct _PurpleSoundTheme PurpleSoundTheme;
    -typedef struct _PurpleSoundThemeClass PurpleSoundThemeClass;
    -
    -#define PURPLE_TYPE_SOUND_THEME (purple_sound_theme_get_type())
    -#define PURPLE_SOUND_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_SOUND_THEME, PurpleSoundTheme))
    -#define PURPLE_SOUND_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_SOUND_THEME, PurpleSoundThemeClass))
    -#define PURPLE_IS_SOUND_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_SOUND_THEME))
    -#define PURPLE_IS_SOUND_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_SOUND_THEME))
    -#define PURPLE_SOUND_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_SOUND_THEME, PurpleSoundThemeClass))
    -
    -struct _PurpleSoundTheme
    -{
    - PurpleTheme parent;
    - gpointer priv;
    -};
    -
    -struct _PurpleSoundThemeClass
    -{
    - PurpleThemeClass parent_class;
    -};
    -
    -/**************************************************************************/
    -/** @name Purple Sound Theme API */
    -/**************************************************************************/
    -G_BEGIN_DECLS
    -
    -/**
    - * GObject foo.
    - * @internal.
    - */
    -GType purple_sound_theme_get_type(void);
    -
    -/**
    - * Returns a copy of the filename for the sound event.
    - *
    - * @param theme The theme.
    - * @param event The purple sound event to look up.
    - *
    - * @returns The filename of the sound event.
    - */
    -const gchar *purple_sound_theme_get_file(PurpleSoundTheme *theme,
    - const gchar *event);
    -
    -/**
    - * Returns a copy of the directory and filename for the sound event
    - *
    - * @param theme The theme.
    - * @param event The purple sound event to look up
    - *
    - * @returns The directory + '/' + filename of the sound event. This is
    - * a newly allocated string that should be freed with g_free.
    - */
    -gchar *purple_sound_theme_get_file_full(PurpleSoundTheme *theme,
    - const gchar *event);
    -
    -/**
    - * Sets the filename for a given sound event
    - *
    - * @param theme The theme.
    - * @param event the purple sound event to look up
    - * @param filename the name of the file to be used for the event
    - */
    -void purple_sound_theme_set_file(PurpleSoundTheme *theme,
    - const gchar *event,
    - const gchar *filename);
    -
    -G_END_DECLS
    -#endif /* PURPLE_SOUND_THEME_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sound.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,143 +0,0 @@
    -/**
    - * @file sound.h Sound API
    - * @ingroup core
    - * @see @ref sound-signals
    - */
    -
    -/* 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
    - */
    -#ifndef _PURPLE_SOUND_H_
    -#define _PURPLE_SOUND_H_
    -
    -#include "account.h"
    -
    -/**************************************************************************/
    -/** Data Structures */
    -/**************************************************************************/
    -
    -
    -/**
    - * A type of sound.
    - */
    -
    -typedef enum _PurpleSoundEventID
    -{
    - PURPLE_SOUND_BUDDY_ARRIVE = 0, /**< Buddy signs on. */
    - PURPLE_SOUND_BUDDY_LEAVE, /**< Buddy signs off. */
    - PURPLE_SOUND_RECEIVE, /**< Receive an IM. */
    - PURPLE_SOUND_FIRST_RECEIVE, /**< Receive an IM that starts a conv. */
    - PURPLE_SOUND_SEND, /**< Send an IM. */
    - PURPLE_SOUND_CHAT_JOIN, /**< Someone joins a chat. */
    - PURPLE_SOUND_CHAT_LEAVE, /**< Someone leaves a chat. */
    - PURPLE_SOUND_CHAT_YOU_SAY, /**< You say something in a chat. */
    - PURPLE_SOUND_CHAT_SAY, /**< Someone else says somthing in a chat. */
    - PURPLE_SOUND_POUNCE_DEFAULT, /**< Default sound for a buddy pounce. */
    - PURPLE_SOUND_CHAT_NICK, /**< Someone says your name in a chat. */
    - PURPLE_SOUND_GOT_ATTENTION, /**< Got an attention */
    - PURPLE_NUM_SOUNDS /**< Total number of sounds. */
    -
    -} PurpleSoundEventID;
    -
    -/** Operations used by the core to request that particular sound files, or the
    - * sound associated with a particular event, should be played.
    - */
    -typedef struct _PurpleSoundUiOps
    -{
    - void (*init)(void);
    - void (*uninit)(void);
    - void (*play_file)(const char *filename);
    - void (*play_event)(PurpleSoundEventID event);
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleSoundUiOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name Sound API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Plays the specified sound file.
    - *
    - * @param filename The file to play.
    - * @param account The account that this sound is associated with, or
    - * NULL if the sound is not associated with any specific
    - * account. This is needed for the "sounds while away?"
    - * preference to work correctly.
    - */
    -void purple_sound_play_file(const char *filename, const PurpleAccount *account);
    -
    -/**
    - * Plays the sound associated with the specified event.
    - *
    - * @param event The event.
    - * @param account The account that this sound is associated with, or
    - * NULL if the sound is not associated with any specific
    - * account. This is needed for the "sounds while away?"
    - * preference to work correctly.
    - */
    -void purple_sound_play_event(PurpleSoundEventID event, const PurpleAccount *account);
    -
    -/**
    - * Sets the UI sound operations
    - *
    - * @param ops The UI sound operations structure.
    - */
    -void purple_sound_set_ui_ops(PurpleSoundUiOps *ops);
    -
    -/**
    - * Gets the UI sound operations
    - *
    - * @return The UI sound operations structure.
    - */
    -PurpleSoundUiOps *purple_sound_get_ui_ops(void);
    -
    -/**
    - * Initializes the sound subsystem
    - */
    -void purple_sound_init(void);
    -
    -/**
    - * Shuts down the sound subsystem
    - */
    -void purple_sound_uninit(void);
    -
    -/**
    - * Returns the sound subsystem handle.
    - *
    - * @return The sound subsystem handle.
    - */
    -void *purple_sounds_get_handle(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SOUND_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/sslconn.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,346 +0,0 @@
    -/**
    - * @file sslconn.h SSL 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
    - */
    -#ifndef _PURPLE_SSLCONN_H_
    -#define _PURPLE_SSLCONN_H_
    -
    -/** Possible SSL errors. */
    -typedef enum
    -{
    - PURPLE_SSL_HANDSHAKE_FAILED = 1,
    - PURPLE_SSL_CONNECT_FAILED = 2,
    - PURPLE_SSL_CERTIFICATE_INVALID = 3
    -} PurpleSslErrorType;
    -
    -#include "certificate.h"
    -#include "proxy.h"
    -
    -#define PURPLE_SSL_DEFAULT_PORT 443
    -
    -/** @copydoc _PurpleSslConnection */
    -typedef struct _PurpleSslConnection PurpleSslConnection;
    -
    -typedef void (*PurpleSslInputFunction)(gpointer, PurpleSslConnection *,
    - PurpleInputCondition);
    -typedef void (*PurpleSslErrorFunction)(PurpleSslConnection *, PurpleSslErrorType,
    - gpointer);
    -
    -struct _PurpleSslConnection
    -{
    - /** Hostname to which the SSL connection will be made */
    - char *host;
    - /** Port to connect to */
    - int port;
    - /** Data to pass to PurpleSslConnection::connect_cb() */
    - void *connect_cb_data;
    - /** Callback triggered once the SSL handshake is complete */
    - PurpleSslInputFunction connect_cb;
    - /** Callback triggered if there is an error during connection */
    - PurpleSslErrorFunction error_cb;
    - /** Data passed to PurpleSslConnection::recv_cb() */
    - void *recv_cb_data;
    - /** User-defined callback executed when the SSL connection receives data */
    - PurpleSslInputFunction recv_cb;
    -
    - /** File descriptor used to refer to the socket */
    - int fd;
    - /** Glib event source ID; used to refer to the received data callback
    - * in the glib eventloop */
    - guint inpa;
    - /** Data related to the underlying TCP connection */
    - PurpleProxyConnectData *connect_data;
    -
    - /** Internal connection data managed by the SSL backend (GnuTLS/LibNSS/whatever) */
    - void *private_data;
    -
    - /** Verifier to use in authenticating the peer */
    - PurpleCertificateVerifier *verifier;
    -
    - /** Handle to the account for which this connection is being made. Can be NULL. */
    - PurpleAccount *account;
    -};
    -
    -/**
    - * SSL implementation operations structure.
    - *
    - * Every SSL implementation must provide all of these and register it via purple_ssl_set_ops()
    - * These should not be called directly! Instead, use the purple_ssl_* functions.
    - */
    -typedef struct
    -{
    - /** Initializes the SSL system provided.
    - * @return @a TRUE if initialization succeeded
    - * @see purple_ssl_init
    - */
    - gboolean (*init)(void);
    - /** Unloads the SSL system. Inverse of PurpleSslOps::init.
    - * @see purple_ssl_uninit
    - */
    - void (*uninit)(void);
    - /** Sets up the SSL connection for a #PurpleSslConnection once
    - * the TCP connection has been established
    - * @see purple_ssl_connect
    - */
    - void (*connectfunc)(PurpleSslConnection *gsc);
    - /** Destroys the internal data of the SSL connection provided.
    - * Freeing gsc itself is left to purple_ssl_close()
    - * @see purple_ssl_close
    - */
    - void (*close)(PurpleSslConnection *gsc);
    - /** Reads data from a connection (like POSIX read())
    - * @param gsc Connection context
    - * @param data Pointer to buffer to drop data into
    - * @param len Maximum number of bytes to read
    - * @return Number of bytes actually written into @a data (which may be
    - * less than @a len), or <0 on error
    - * @see purple_ssl_read
    - */
    - size_t (*read)(PurpleSslConnection *gsc, void *data, size_t len);
    - /** Writes data to a connection (like POSIX send())
    - * @param gsc Connection context
    - * @param data Data buffer to send data from
    - * @param len Number of bytes to send from buffer
    - * @return The number of bytes written to @a data (may be less than
    - * @a len) or <0 on error
    - * @see purple_ssl_write
    - */
    - size_t (*write)(PurpleSslConnection *gsc, const void *data, size_t len);
    - /** Obtains the certificate chain provided by the peer
    - *
    - * @param gsc Connection context
    - * @return A newly allocated list containing the certificates
    - * the peer provided.
    - * @see PurpleCertificate
    - * @todo Decide whether the ordering of certificates in this
    - * list can be guaranteed.
    - */
    - GList * (* get_peer_certificates)(PurpleSslConnection * gsc);
    -
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleSslOps;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name SSL API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns whether or not SSL is currently supported.
    - *
    - * @return @a TRUE if SSL is supported, or @a FALSE otherwise.
    - */
    -gboolean purple_ssl_is_supported(void);
    -
    -/**
    - * Returns a human-readable string for an SSL error.
    - *
    - * @param error Error code
    - * @return Human-readable error explanation
    - */
    -const gchar * purple_ssl_strerror(PurpleSslErrorType error);
    -
    -/**
    - * Makes a SSL connection to the specified host and port. The caller
    - * should keep track of the returned value and use it to cancel the
    - * connection, if needed.
    - *
    - * @param account The account making the connection.
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param func The SSL input handler function.
    - * @param error_func The SSL error handler function. This function
    - * should <strong>NOT</strong> call purple_ssl_close(). In
    - * the event of an error the #PurpleSslConnection will be
    - * destroyed for you.
    - * @param data User-defined data.
    - *
    - * @return The SSL connection handle.
    - */
    -PurpleSslConnection *purple_ssl_connect(PurpleAccount *account, const char *host,
    - int port, PurpleSslInputFunction func,
    - PurpleSslErrorFunction error_func,
    - void *data);
    -
    -/**
    - * Makes a SSL connection to the specified host and port, using the separate
    - * name to verify with the certificate. The caller should keep track of the
    - * returned value and use it to cancel the connection, if needed.
    - *
    - * @param account The account making the connection.
    - * @param host The destination host.
    - * @param port The destination port.
    - * @param func The SSL input handler function.
    - * @param error_func The SSL error handler function. This function
    - * should <strong>NOT</strong> call purple_ssl_close(). In
    - * the event of an error the #PurpleSslConnection will be
    - * destroyed for you.
    - * @param ssl_host The hostname of the other peer (to verify the CN)
    - * @param data User-defined data.
    - *
    - * @return The SSL connection handle.
    - * @since 2.6.0
    - */
    -PurpleSslConnection *purple_ssl_connect_with_ssl_cn(PurpleAccount *account, const char *host,
    - int port, PurpleSslInputFunction func,
    - PurpleSslErrorFunction error_func,
    - const char *ssl_host,
    - void *data);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_SSLCONN_C_)
    -/**
    - * Makes a SSL connection using an already open file descriptor.
    - *
    - * @deprecated Use purple_ssl_connect_with_host_fd() instead.
    - *
    - * @param account The account making the connection.
    - * @param fd The file descriptor.
    - * @param func The SSL input handler function.
    - * @param error_func The SSL error handler function.
    - * @param data User-defined data.
    - *
    - * @return The SSL connection handle.
    - */
    -PurpleSslConnection *purple_ssl_connect_fd(PurpleAccount *account, int fd,
    - PurpleSslInputFunction func,
    - PurpleSslErrorFunction error_func,
    - void *data);
    -#endif
    -
    -/**
    - * Makes a SSL connection using an already open file descriptor.
    - *
    - * @param account The account making the connection.
    - * @param fd The file descriptor.
    - * @param func The SSL input handler function.
    - * @param error_func The SSL error handler function.
    - * @param host The hostname of the other peer (to verify the CN)
    - * @param data User-defined data.
    - *
    - * @return The SSL connection handle.
    - *
    - * @since 2.2.0
    - */
    -PurpleSslConnection *purple_ssl_connect_with_host_fd(PurpleAccount *account, int fd,
    - PurpleSslInputFunction func,
    - PurpleSslErrorFunction error_func,
    - const char *host,
    - void *data);
    -
    -/**
    - * Adds an input watcher for the specified SSL connection.
    - * Once the SSL handshake is complete, use this to watch for actual data across it.
    - *
    - * @param gsc The SSL connection handle.
    - * @param func The callback function.
    - * @param data User-defined data.
    - */
    -void purple_ssl_input_add(PurpleSslConnection *gsc, PurpleSslInputFunction func,
    - void *data);
    -
    -/**
    - * Closes a SSL connection.
    - *
    - * @param gsc The SSL connection to close.
    - */
    -void purple_ssl_close(PurpleSslConnection *gsc);
    -
    -/**
    - * Reads data from an SSL connection.
    - *
    - * @param gsc The SSL connection handle.
    - * @param buffer The destination buffer.
    - * @param len The maximum number of bytes to read.
    - *
    - * @return The number of bytes read.
    - */
    -size_t purple_ssl_read(PurpleSslConnection *gsc, void *buffer, size_t len);
    -
    -/**
    - * Writes data to an SSL connection.
    - *
    - * @param gsc The SSL connection handle.
    - * @param buffer The buffer to write.
    - * @param len The length of the data to write.
    - *
    - * @return The number of bytes written.
    - */
    -size_t purple_ssl_write(PurpleSslConnection *gsc, const void *buffer, size_t len);
    -
    -/**
    - * Obtains the peer's presented certificates
    - *
    - * @param gsc The SSL connection handle
    - *
    - * @return The peer certificate chain, in the order of certificate, issuer,
    - * issuer's issuer, etc. @a NULL if no certificates have been provided,
    - *
    - * @since 2.2.0
    - */
    -GList * purple_ssl_get_peer_certificates(PurpleSslConnection *gsc);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Subsystem API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the current SSL operations structure.
    - *
    - * @param ops The SSL operations structure to assign.
    - */
    -void purple_ssl_set_ops(PurpleSslOps *ops);
    -
    -/**
    - * Returns the current SSL operations structure.
    - *
    - * @return The SSL operations structure.
    - */
    -PurpleSslOps *purple_ssl_get_ops(void);
    -
    -/**
    - * Initializes the SSL subsystem.
    - */
    -void purple_ssl_init(void);
    -
    -/**
    - * Uninitializes the SSL subsystem.
    - */
    -void purple_ssl_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_SSLCONN_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/state.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,69 +0,0 @@
    -/**
    - * @file state.h State functions and definitions
    - *
    - * 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
    - */
    -#ifndef MSN_STATE_H
    -#define MSN_STATE_H
    -
    -/**
    - * Away types.
    - */
    -typedef enum
    -{
    - MSN_ONLINE = 1,
    - MSN_BUSY = 2,
    - MSN_IDLE = 3,
    - MSN_BRB = 4,
    - MSN_AWAY = 5,
    - MSN_PHONE = 6,
    - MSN_LUNCH = 7,
    - MSN_OFFLINE = 8,
    - MSN_HIDDEN = 9
    -} MsnAwayType;
    -
    -/**
    - * Changes the status of the user.
    - *
    - * @param session The MSN session.
    - */
    -void msn_change_status(MsnSession *session);
    -
    -/**
    - * Returns the string representation of an away type.
    - *
    - * @param type The away type.
    - *
    - * @return The string representation of the away type.
    - */
    -const char *msn_away_get_text(MsnAwayType type);
    -
    -const char *msn_state_get_text(MsnAwayType state);
    -
    -/* Get the CurrentMedia info from the XML node */
    -char *msn_get_currentmedia(xmlnode *payloadNode);
    -
    -/* Get the PSM info from the XML node */
    -char *msn_get_psm(xmlnode *payloadNode);
    -
    -MsnAwayType msn_state_from_account(PurpleAccount *account);
    -
    -#endif /* MSN_STATE_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/status.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1103 +0,0 @@
    -/*
    - * 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
    - */
    -#ifndef _PURPLE_STATUS_H_
    -#define _PURPLE_STATUS_H_
    -
    -/**
    - * @file status.h Status API
    - * @ingroup core
    - *
    - * A brief explanation of the status API:
    - *
    - * PurpleStatusType's are created by each PRPL. They outline the
    - * available statuses of the protocol. AIM, for example, supports
    - * an available state with an optional available message, an away
    - * state with a mandatory message, and an invisible state (which is
    - * technically "independent" of the other two, but we'll get into
    - * that later). PurpleStatusTypes are very permanent. They are
    - * hardcoded in each PRPL and will not change often. And because
    - * they are hardcoded, they do not need to be saved to any XML file.
    - *
    - * A PurpleStatus can be thought of as an "instance" of a PurpleStatusType.
    - * If you're familiar with object-oriented programming languages
    - * then this should be immediately clear. Say, for example, that
    - * one of your AIM buddies has set himself as "away." You have a
    - * PurpleBuddy node for this person in your buddy list. Purple wants
    - * to mark this buddy as "away," so it creates a new PurpleStatus.
    - * The PurpleStatus has its PurpleStatusType set to the "away" state
    - * for the oscar PRPL. The PurpleStatus also contains the buddy's
    - * away message. PurpleStatuses are sometimes saved, depending on
    - * the context. The current PurpleStatuses associated with each of
    - * your accounts are saved so that the next time you start Purple,
    - * your accounts will be set to their last known statuses. There
    - * is also a list of saved statuses that are written to the
    - * status.xml file. Also, each PurpleStatus has a "saveable" boolean.
    - * If "saveable" is set to FALSE then the status is NEVER saved.
    - * All PurpleStatuses should be inside a PurplePresence.
    - *
    - *
    - * A PurpleStatus is either "independent" or "exclusive."
    - * Independent statuses can be active or inactive and they don't
    - * affect anything else. However, you can only have one exclusive
    - * status per PurplePresence. If you activate one exclusive status,
    - * then the previous exclusive status is automatically deactivated.
    - *
    - * A PurplePresence is like a collection of PurpleStatuses (plus some
    - * other random info). For any buddy, or for any one of your accounts,
    - * or for any person with which you're chatting, you may know various
    - * amounts of information. This information is all contained in
    - * one PurplePresence. If one of your buddies is away and idle,
    - * then the presence contains the PurpleStatus for their awayness,
    - * and it contains their current idle time. PurplePresences are
    - * never saved to disk. The information they contain is only relevant
    - * for the current PurpleSession.
    - */
    -
    -/**
    - * PurpleStatusType's are created by each PRPL. They outline the
    - * available statuses of the protocol. AIM, for example, supports
    - * an available state with an optional available message, an away
    - * state with a mandatory message, and an invisible state (which is
    - * technically "independent" of the other two, but we'll get into
    - * that later). PurpleStatusTypes are very permanent. They are
    - * hardcoded in each PRPL and will not change often. And because
    - * they are hardcoded, they do not need to be saved to any XML file.
    - */
    -typedef struct _PurpleStatusType PurpleStatusType;
    -typedef struct _PurpleStatusAttr PurpleStatusAttr;
    -typedef struct _PurplePresence PurplePresence;
    -typedef struct _PurpleStatus PurpleStatus;
    -
    -typedef struct _PurpleMood {
    - const char *mood;
    - const char *description;
    - gpointer *padding;
    -} PurpleMood;
    -
    -/**
    - * A context for a presence.
    - *
    - * The context indicates to what the presence applies.
    - */
    -typedef enum
    -{
    - PURPLE_PRESENCE_CONTEXT_UNSET = 0,
    - PURPLE_PRESENCE_CONTEXT_ACCOUNT,
    - PURPLE_PRESENCE_CONTEXT_CONV,
    - PURPLE_PRESENCE_CONTEXT_BUDDY
    -
    -} PurplePresenceContext;
    -
    -/**
    - * A primitive defining the basic structure of a status type.
    - */
    -/*
    - * If you add a value to this enum, make sure you update
    - * the status_primitive_map and primitive_scores arrays in status.c.
    - */
    -typedef enum
    -{
    - PURPLE_STATUS_UNSET = 0,
    - PURPLE_STATUS_OFFLINE,
    - PURPLE_STATUS_AVAILABLE,
    - PURPLE_STATUS_UNAVAILABLE,
    - PURPLE_STATUS_INVISIBLE,
    - PURPLE_STATUS_AWAY,
    - PURPLE_STATUS_EXTENDED_AWAY,
    - PURPLE_STATUS_MOBILE,
    - PURPLE_STATUS_TUNE,
    - PURPLE_STATUS_MOOD,
    - PURPLE_STATUS_NUM_PRIMITIVES
    -} PurpleStatusPrimitive;
    -
    -#include "account.h"
    -#include "blist.h"
    -#include "conversation.h"
    -#include "value.h"
    -
    -#define PURPLE_TUNE_ARTIST "tune_artist"
    -#define PURPLE_TUNE_TITLE "tune_title"
    -#define PURPLE_TUNE_ALBUM "tune_album"
    -#define PURPLE_TUNE_GENRE "tune_genre"
    -#define PURPLE_TUNE_COMMENT "tune_comment"
    -#define PURPLE_TUNE_TRACK "tune_track"
    -#define PURPLE_TUNE_TIME "tune_time"
    -#define PURPLE_TUNE_YEAR "tune_year"
    -#define PURPLE_TUNE_URL "tune_url"
    -#define PURPLE_TUNE_FULL "tune_full"
    -
    -#define PURPLE_MOOD_NAME "mood"
    -#define PURPLE_MOOD_COMMENT "moodtext"
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name PurpleStatusPrimitive API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Lookup the id of a primitive status type based on the type. This
    - * ID is a unique plain-text name of the status, without spaces.
    - *
    - * @param type A primitive status type.
    - *
    - * @return The unique ID for this type.
    - */
    -const char *purple_primitive_get_id_from_type(PurpleStatusPrimitive type);
    -
    -/**
    - * Lookup the name of a primitive status type based on the type. This
    - * name is the plain-English name of the status type. It is usually one
    - * or two words.
    - *
    - * @param type A primitive status type.
    - *
    - * @return The name of this type, suitable for users to see.
    - */
    -const char *purple_primitive_get_name_from_type(PurpleStatusPrimitive type);
    -
    -/**
    - * Lookup the value of a primitive status type based on the id. The
    - * ID is a unique plain-text name of the status, without spaces.
    - *
    - * @param id The unique ID of a primitive status type.
    - *
    - * @return The PurpleStatusPrimitive value.
    - */
    -PurpleStatusPrimitive purple_primitive_get_type_from_id(const char *id);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name PurpleStatusType API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new status type.
    - *
    - * @param primitive The primitive status type.
    - * @param id The ID of the status type, or @c NULL to use the id of
    - * the primitive status type.
    - * @param name The name presented to the user, or @c NULL to use the
    - * name of the primitive status type.
    - * @param saveable TRUE if the information set for this status by the
    - * user can be saved for future sessions.
    - * @param user_settable TRUE if this is a status the user can manually set.
    - * @param independent TRUE if this is an independent (non-exclusive)
    - * status type.
    - *
    - * @return A new status type.
    - */
    -PurpleStatusType *purple_status_type_new_full(PurpleStatusPrimitive primitive,
    - const char *id, const char *name,
    - gboolean saveable,
    - gboolean user_settable,
    - gboolean independent);
    -
    -/**
    - * Creates a new status type with some default values (
    - * saveable and not independent).
    - *
    - * @param primitive The primitive status type.
    - * @param id The ID of the status type, or @c NULL to use the id of
    - * the primitive status type.
    - * @param name The name presented to the user, or @c NULL to use the
    - * name of the primitive status type.
    - * @param user_settable TRUE if this is a status the user can manually set.
    - *
    - * @return A new status type.
    - */
    -PurpleStatusType *purple_status_type_new(PurpleStatusPrimitive primitive,
    - const char *id, const char *name,
    - gboolean user_settable);
    -
    -/**
    - * Creates a new status type with attributes.
    - *
    - * @param primitive The primitive status type.
    - * @param id The ID of the status type, or @c NULL to use the id of
    - * the primitive status type.
    - * @param name The name presented to the user, or @c NULL to use the
    - * name of the primitive status type.
    - * @param saveable TRUE if the information set for this status by the
    - * user can be saved for future sessions.
    - * @param user_settable TRUE if this is a status the user can manually set.
    - * @param independent TRUE if this is an independent (non-exclusive)
    - * status type.
    - * @param attr_id The ID of the first attribute.
    - * @param attr_name The name of the first attribute.
    - * @param attr_value The value type of the first attribute attribute.
    - * @param ... Additional attribute information.
    - *
    - * @return A new status type.
    - */
    -PurpleStatusType *purple_status_type_new_with_attrs(PurpleStatusPrimitive primitive,
    - const char *id,
    - const char *name,
    - gboolean saveable,
    - gboolean user_settable,
    - gboolean independent,
    - const char *attr_id,
    - const char *attr_name,
    - PurpleValue *attr_value, ...) G_GNUC_NULL_TERMINATED;
    -
    -/**
    - * Destroys a status type.
    - *
    - * @param status_type The status type to destroy.
    - */
    -void purple_status_type_destroy(PurpleStatusType *status_type);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Sets a status type's primary attribute.
    - *
    - * The value for the primary attribute is used as the description for
    - * the particular status type. An example is an away message. The message
    - * would be the primary attribute.
    - *
    - * @param status_type The status type.
    - * @param attr_id The ID of the primary attribute.
    - *
    - * @deprecated This function isn't used and should be removed in 3.0.0.
    - */
    -void purple_status_type_set_primary_attr(PurpleStatusType *status_type,
    - const char *attr_id);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Adds an attribute to a status type.
    - *
    - * @param status_type The status type to add the attribute to.
    - * @param id The ID of the attribute.
    - * @param name The name presented to the user.
    - * @param value The value type of this attribute.
    - *
    - * @deprecated This function isn't needed and should be removed in 3.0.0.
    - * Status type attributes should be set when the status type
    - * is created, in the call to purple_status_type_new_with_attrs.
    - */
    -void purple_status_type_add_attr(PurpleStatusType *status_type, const char *id,
    - const char *name, PurpleValue *value);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Adds multiple attributes to a status type.
    - *
    - * @param status_type The status type to add the attribute to.
    - * @param id The ID of the first attribute.
    - * @param name The description of the first attribute.
    - * @param value The value type of the first attribute attribute.
    - * @param ... Additional attribute information.
    - *
    - * @deprecated This function isn't needed and should be removed in 3.0.0.
    - * Status type attributes should be set when the status type
    - * is created, in the call to purple_status_type_new_with_attrs.
    - */
    -void purple_status_type_add_attrs(PurpleStatusType *status_type, const char *id,
    - const char *name, PurpleValue *value, ...) G_GNUC_NULL_TERMINATED;
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Adds multiple attributes to a status type using a va_list.
    - *
    - * @param status_type The status type to add the attribute to.
    - * @param args The va_list of attributes.
    - *
    - * @deprecated This function isn't needed and should be removed in 3.0.0.
    - * Status type attributes should be set when the status type
    - * is created, in the call to purple_status_type_new_with_attrs.
    - */
    -void purple_status_type_add_attrs_vargs(PurpleStatusType *status_type,
    - va_list args);
    -#endif
    -
    -/**
    - * Returns the primitive type of a status type.
    - *
    - * @param status_type The status type.
    - *
    - * @return The primitive type of the status type.
    - */
    -PurpleStatusPrimitive purple_status_type_get_primitive(
    - const PurpleStatusType *status_type);
    -
    -/**
    - * Returns the ID of a status type.
    - *
    - * @param status_type The status type.
    - *
    - * @return The ID of the status type.
    - */
    -const char *purple_status_type_get_id(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns the name of a status type.
    - *
    - * @param status_type The status type.
    - *
    - * @return The name of the status type.
    - */
    -const char *purple_status_type_get_name(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns whether or not the status type is saveable.
    - *
    - * @param status_type The status type.
    - *
    - * @return TRUE if user-defined statuses based off this type are saveable.
    - * FALSE otherwise.
    - */
    -gboolean purple_status_type_is_saveable(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns whether or not the status type can be set or modified by the
    - * user.
    - *
    - * @param status_type The status type.
    - *
    - * @return TRUE if the status type can be set or modified by the user.
    - * FALSE if it's a protocol-set setting.
    - */
    -gboolean purple_status_type_is_user_settable(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns whether or not the status type is independent.
    - *
    - * Independent status types are non-exclusive. If other status types on
    - * the same hierarchy level are set, this one will not be affected.
    - *
    - * @param status_type The status type.
    - *
    - * @return TRUE if the status type is independent, or FALSE otherwise.
    - */
    -gboolean purple_status_type_is_independent(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns whether the status type is exclusive.
    - *
    - * @param status_type The status type.
    - *
    - * @return TRUE if the status type is exclusive, FALSE otherwise.
    - */
    -gboolean purple_status_type_is_exclusive(const PurpleStatusType *status_type);
    -
    -/**
    - * Returns whether or not a status type is available.
    - *
    - * Available status types are online and possibly invisible, but not away.
    - *
    - * @param status_type The status type.
    - *
    - * @return TRUE if the status is available, or FALSE otherwise.
    - */
    -gboolean purple_status_type_is_available(const PurpleStatusType *status_type);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Returns a status type's primary attribute ID.
    - *
    - * @param type The status type.
    - *
    - * @return The primary attribute's ID.
    - *
    - * @deprecated This function isn't used and should be removed in 3.0.0.
    - */
    -const char *purple_status_type_get_primary_attr(const PurpleStatusType *type);
    -#endif
    -
    -/**
    - * Returns the attribute with the specified ID.
    - *
    - * @param status_type The status type containing the attribute.
    - * @param id The ID of the desired attribute.
    - *
    - * @return The attribute, if found. NULL otherwise.
    - */
    -PurpleStatusAttr *purple_status_type_get_attr(const PurpleStatusType *status_type,
    - const char *id);
    -
    -/**
    - * Returns a list of all attributes in a status type.
    - *
    - * @param status_type The status type.
    - *
    - * @constreturn The list of attributes.
    - */
    -GList *purple_status_type_get_attrs(const PurpleStatusType *status_type);
    -
    -/**
    - * Find the PurpleStatusType with the given id.
    - *
    - * @param status_types A list of status types. Often account->status_types.
    - * @param id The unique ID of the status type you wish to find.
    - *
    - * @return The status type with the given ID, or NULL if one could
    - * not be found.
    - */
    -const PurpleStatusType *purple_status_type_find_with_id(GList *status_types,
    - const char *id);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name PurpleStatusAttr API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new status attribute.
    - *
    - * @param id The ID of the attribute.
    - * @param name The name presented to the user.
    - * @param value_type The type of data contained in the attribute.
    - *
    - * @return A new status attribute.
    - */
    -PurpleStatusAttr *purple_status_attr_new(const char *id, const char *name,
    - PurpleValue *value_type);
    -
    -/**
    - * Destroys a status attribute.
    - *
    - * @param attr The status attribute to destroy.
    - */
    -void purple_status_attr_destroy(PurpleStatusAttr *attr);
    -
    -/**
    - * Returns the ID of a status attribute.
    - *
    - * @param attr The status attribute.
    - *
    - * @return The status attribute's ID.
    - */
    -const char *purple_status_attr_get_id(const PurpleStatusAttr *attr);
    -
    -/**
    - * Returns the name of a status attribute.
    - *
    - * @param attr The status attribute.
    - *
    - * @return The status attribute's name.
    - */
    -const char *purple_status_attr_get_name(const PurpleStatusAttr *attr);
    -
    -/**
    - * Returns the value of a status attribute.
    - *
    - * @param attr The status attribute.
    - *
    - * @return The status attribute's value.
    - */
    -PurpleValue *purple_status_attr_get_value(const PurpleStatusAttr *attr);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name PurpleStatus API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new status.
    - *
    - * @param status_type The type of status.
    - * @param presence The parent presence.
    - *
    - * @return The new status.
    - */
    -PurpleStatus *purple_status_new(PurpleStatusType *status_type,
    - PurplePresence *presence);
    -
    -/**
    - * Destroys a status.
    - *
    - * @param status The status to destroy.
    - */
    -void purple_status_destroy(PurpleStatus *status);
    -
    -/**
    - * Sets whether or not a status is active.
    - *
    - * This should only be called by the account, conversation, and buddy APIs.
    - *
    - * @param status The status.
    - * @param active The active state.
    - */
    -void purple_status_set_active(PurpleStatus *status, gboolean active);
    -
    -/**
    - * Sets whether or not a status is active.
    - *
    - * This should only be called by the account, conversation, and buddy APIs.
    - *
    - * @param status The status.
    - * @param active The active state.
    - * @param args A list of attributes to set on the status. This list is
    - * composed of key/value pairs, where each key is a valid
    - * attribute name for this PurpleStatusType. The list should
    - * be NULL terminated.
    - */
    -void purple_status_set_active_with_attrs(PurpleStatus *status, gboolean active,
    - va_list args);
    -
    -/**
    - * Sets whether or not a status is active.
    - *
    - * This should only be called by the account, conversation, and buddy APIs.
    - *
    - * @param status The status.
    - * @param active The active state.
    - * @param attrs A list of attributes to set on the status. This list is
    - * composed of key/value pairs, where each key is a valid
    - * attribute name for this PurpleStatusType. The list is
    - * not modified or freed by this function.
    - */
    -void purple_status_set_active_with_attrs_list(PurpleStatus *status, gboolean active,
    - GList *attrs);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Sets the boolean value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - * @param value The boolean value.
    - *
    - * @deprecated This function is only used by status.c and should be made
    - * static in 3.0.0.
    - */
    -void purple_status_set_attr_boolean(PurpleStatus *status, const char *id,
    - gboolean value);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Sets the integer value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - * @param value The integer value.
    - *
    - * @deprecated This function is only used by status.c and should be made
    - * static in 3.0.0.
    - */
    -void purple_status_set_attr_int(PurpleStatus *status, const char *id,
    - int value);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Sets the string value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - * @param value The string value.
    - *
    - * @deprecated This function is only used by status.c and should be made
    - * static in 3.0.0.
    - */
    -void purple_status_set_attr_string(PurpleStatus *status, const char *id,
    - const char *value);
    -#endif
    -
    -/**
    - * Returns the status's type.
    - *
    - * @param status The status.
    - *
    - * @return The status's type.
    - */
    -PurpleStatusType *purple_status_get_type(const PurpleStatus *status);
    -
    -/**
    - * Returns the status's presence.
    - *
    - * @param status The status.
    - *
    - * @return The status's presence.
    - */
    -PurplePresence *purple_status_get_presence(const PurpleStatus *status);
    -
    -/**
    - * Returns the status's type ID.
    - *
    - * This is a convenience method for
    - * purple_status_type_get_id(purple_status_get_type(status)).
    - *
    - * @param status The status.
    - *
    - * @return The status's ID.
    - */
    -const char *purple_status_get_id(const PurpleStatus *status);
    -
    -/**
    - * Returns the status's name.
    - *
    - * This is a convenience method for
    - * purple_status_type_get_name(purple_status_get_type(status)).
    - *
    - * @param status The status.
    - *
    - * @return The status's name.
    - */
    -const char *purple_status_get_name(const PurpleStatus *status);
    -
    -/**
    - * Returns whether or not a status is independent.
    - *
    - * This is a convenience method for
    - * purple_status_type_is_independent(purple_status_get_type(status)).
    - *
    - * @param status The status.
    - *
    - * @return TRUE if the status is independent, or FALSE otherwise.
    - */
    -gboolean purple_status_is_independent(const PurpleStatus *status);
    -
    -/**
    - * Returns whether or not a status is exclusive.
    - *
    - * This is a convenience method for
    - * purple_status_type_is_exclusive(purple_status_get_type(status)).
    - *
    - * @param status The status.
    - *
    - * @return TRUE if the status is exclusive, FALSE otherwise.
    - */
    -gboolean purple_status_is_exclusive(const PurpleStatus *status);
    -
    -/**
    - * Returns whether or not a status is available.
    - *
    - * Available statuses are online and possibly invisible, but not away or idle.
    - *
    - * This is a convenience method for
    - * purple_status_type_is_available(purple_status_get_type(status)).
    - *
    - * @param status The status.
    - *
    - * @return TRUE if the status is available, or FALSE otherwise.
    - */
    -gboolean purple_status_is_available(const PurpleStatus *status);
    -
    -/**
    - * Returns the active state of a status.
    - *
    - * @param status The status.
    - *
    - * @return The active state of the status.
    - */
    -gboolean purple_status_is_active(const PurpleStatus *status);
    -
    -/**
    - * Returns whether or not a status is considered 'online'
    - *
    - * @param status The status.
    - *
    - * @return TRUE if the status is considered online, FALSE otherwise
    - */
    -gboolean purple_status_is_online(const PurpleStatus *status);
    -
    -/**
    - * Returns the value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - *
    - * @return The value of the attribute.
    - */
    -PurpleValue *purple_status_get_attr_value(const PurpleStatus *status,
    - const char *id);
    -
    -/**
    - * Returns the boolean value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - *
    - * @return The boolean value of the attribute.
    - */
    -gboolean purple_status_get_attr_boolean(const PurpleStatus *status,
    - const char *id);
    -
    -/**
    - * Returns the integer value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - *
    - * @return The integer value of the attribute.
    - */
    -int purple_status_get_attr_int(const PurpleStatus *status, const char *id);
    -
    -/**
    - * Returns the string value of an attribute in a status with the specified ID.
    - *
    - * @param status The status.
    - * @param id The attribute ID.
    - *
    - * @return The string value of the attribute.
    - */
    -const char *purple_status_get_attr_string(const PurpleStatus *status,
    - const char *id);
    -
    -/**
    - * Compares two statuses for availability.
    - *
    - * @param status1 The first status.
    - * @param status2 The second status.
    - *
    - * @return -1 if @a status1 is more available than @a status2.
    - * 0 if @a status1 is equal to @a status2.
    - * 1 if @a status2 is more available than @a status1.
    - */
    -gint purple_status_compare(const PurpleStatus *status1, const PurpleStatus *status2);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name PurplePresence API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new presence.
    - *
    - * @param context The presence context.
    - *
    - * @return A new presence.
    - */
    -PurplePresence *purple_presence_new(PurplePresenceContext context);
    -
    -/**
    - * Creates a presence for an account.
    - *
    - * @param account The account.
    - *
    - * @return The new presence.
    - */
    -PurplePresence *purple_presence_new_for_account(PurpleAccount *account);
    -
    -/**
    - * Creates a presence for a conversation.
    - *
    - * @param conv The conversation.
    - *
    - * @return The new presence.
    - */
    -PurplePresence *purple_presence_new_for_conv(PurpleConversation *conv);
    -
    -/**
    - * Creates a presence for a buddy.
    - *
    - * @param buddy The buddy.
    - *
    - * @return The new presence.
    - */
    -PurplePresence *purple_presence_new_for_buddy(PurpleBuddy *buddy);
    -
    -/**
    - * Destroys a presence.
    - *
    - * All statuses added to this list will be destroyed along with
    - * the presence.
    - *
    - * @param presence The presence to destroy.
    - */
    -void purple_presence_destroy(PurplePresence *presence);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Adds a status to a presence.
    - *
    - * @param presence The presence.
    - * @param status The status to add.
    - *
    - * @deprecated This function is only used by purple_presence_add_list,
    - * and both should be removed in 3.0.0.
    - */
    -void purple_presence_add_status(PurplePresence *presence, PurpleStatus *status);
    -#endif
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    -/**
    - * Adds a list of statuses to the presence.
    - *
    - * @param presence The presence.
    - * @param source_list The source list of statuses to add, which is not
    - * modified or freed by this function.
    - *
    - * @deprecated This function isn't used and should be removed in 3.0.0.
    - */
    -void purple_presence_add_list(PurplePresence *presence, GList *source_list);
    -#endif
    -
    -/**
    - * Sets the active state of a status in a presence.
    - *
    - * Only independent statuses can be set unactive. Normal statuses can only
    - * be set active, so if you wish to disable a status, set another
    - * non-independent status to active, or use purple_presence_switch_status().
    - *
    - * @param presence The presence.
    - * @param status_id The ID of the status.
    - * @param active The active state.
    - */
    -void purple_presence_set_status_active(PurplePresence *presence,
    - const char *status_id, gboolean active);
    -
    -/**
    - * Switches the active status in a presence.
    - *
    - * This is similar to purple_presence_set_status_active(), except it won't
    - * activate independent statuses.
    - *
    - * @param presence The presence.
    - * @param status_id The status ID to switch to.
    - */
    -void purple_presence_switch_status(PurplePresence *presence,
    - const char *status_id);
    -
    -/**
    - * Sets the idle state and time on a presence.
    - *
    - * @param presence The presence.
    - * @param idle The idle state.
    - * @param idle_time The idle time, if @a idle is TRUE. This
    - * is the time at which the user became idle,
    - * in seconds since the epoch. If this value is
    - * unknown then 0 should be used.
    - */
    -void purple_presence_set_idle(PurplePresence *presence, gboolean idle,
    - time_t idle_time);
    -
    -/**
    - * Sets the login time on a presence.
    - *
    - * @param presence The presence.
    - * @param login_time The login time.
    - */
    -void purple_presence_set_login_time(PurplePresence *presence, time_t login_time);
    -
    -
    -/**
    - * Returns the presence's context.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's context.
    - */
    -PurplePresenceContext purple_presence_get_context(const PurplePresence *presence);
    -
    -/**
    - * Returns a presence's account.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's account.
    - */
    -PurpleAccount *purple_presence_get_account(const PurplePresence *presence);
    -
    -/**
    - * Returns a presence's conversation.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's conversation.
    - */
    -PurpleConversation *purple_presence_get_conversation(const PurplePresence *presence);
    -
    -/**
    - * Returns a presence's chat user.
    - *
    - * @param presence The presence.
    - *
    - * @return The chat's user.
    - */
    -const char *purple_presence_get_chat_user(const PurplePresence *presence);
    -
    -/**
    - * Returns the presence's buddy.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's buddy.
    - */
    -PurpleBuddy *purple_presence_get_buddy(const PurplePresence *presence);
    -
    -/**
    - * Returns all the statuses in a presence.
    - *
    - * @param presence The presence.
    - *
    - * @constreturn The statuses.
    - */
    -GList *purple_presence_get_statuses(const PurplePresence *presence);
    -
    -/**
    - * Returns the status with the specified ID from a presence.
    - *
    - * @param presence The presence.
    - * @param status_id The ID of the status.
    - *
    - * @return The status if found, or NULL.
    - */
    -PurpleStatus *purple_presence_get_status(const PurplePresence *presence,
    - const char *status_id);
    -
    -/**
    - * Returns the active exclusive status from a presence.
    - *
    - * @param presence The presence.
    - *
    - * @return The active exclusive status.
    - */
    -PurpleStatus *purple_presence_get_active_status(const PurplePresence *presence);
    -
    -/**
    - * Returns whether or not a presence is available.
    - *
    - * Available presences are online and possibly invisible, but not away or idle.
    - *
    - * @param presence The presence.
    - *
    - * @return TRUE if the presence is available, or FALSE otherwise.
    - */
    -gboolean purple_presence_is_available(const PurplePresence *presence);
    -
    -/**
    - * Returns whether or not a presence is online.
    - *
    - * @param presence The presence.
    - *
    - * @return TRUE if the presence is online, or FALSE otherwise.
    - */
    -gboolean purple_presence_is_online(const PurplePresence *presence);
    -
    -/**
    - * Returns whether or not a status in a presence is active.
    - *
    - * A status is active if itself or any of its sub-statuses are active.
    - *
    - * @param presence The presence.
    - * @param status_id The ID of the status.
    - *
    - * @return TRUE if the status is active, or FALSE.
    - */
    -gboolean purple_presence_is_status_active(const PurplePresence *presence,
    - const char *status_id);
    -
    -/**
    - * Returns whether or not a status with the specified primitive type
    - * in a presence is active.
    - *
    - * A status is active if itself or any of its sub-statuses are active.
    - *
    - * @param presence The presence.
    - * @param primitive The status primitive.
    - *
    - * @return TRUE if the status is active, or FALSE.
    - */
    -gboolean purple_presence_is_status_primitive_active(
    - const PurplePresence *presence, PurpleStatusPrimitive primitive);
    -
    -/**
    - * Returns whether or not a presence is idle.
    - *
    - * @param presence The presence.
    - *
    - * @return TRUE if the presence is idle, or FALSE otherwise.
    - * If the presence is offline (purple_presence_is_online()
    - * returns FALSE) then FALSE is returned.
    - */
    -gboolean purple_presence_is_idle(const PurplePresence *presence);
    -
    -/**
    - * Returns the presence's idle time.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's idle time.
    - */
    -time_t purple_presence_get_idle_time(const PurplePresence *presence);
    -
    -/**
    - * Returns the presence's login time.
    - *
    - * @param presence The presence.
    - *
    - * @return The presence's login time.
    - */
    -time_t purple_presence_get_login_time(const PurplePresence *presence);
    -
    -/**
    - * Compares two presences for availability.
    - *
    - * @param presence1 The first presence.
    - * @param presence2 The second presence.
    - *
    - * @return -1 if @a presence1 is more available than @a presence2.
    - * 0 if @a presence1 is equal to @a presence2.
    - * 1 if @a presence1 is less available than @a presence2.
    - */
    -gint purple_presence_compare(const PurplePresence *presence1,
    - const PurplePresence *presence2);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Status subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Get the handle for the status subsystem.
    - *
    - * @return the handle to the status subsystem
    - */
    -void *purple_status_get_handle(void);
    -
    -/**
    - * Initializes the status subsystem.
    - */
    -void purple_status_init(void);
    -
    -/**
    - * Uninitializes the status subsystem.
    - */
    -void purple_status_uninit(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_STATUS_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/stringref.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,138 +0,0 @@
    -/* TODO: Can we just replace this whole thing with a GCache */
    -
    -/**
    - * @file stringref.h Reference-counted immutable strings
    - * @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
    - *
    - */
    -#ifndef _PURPLE_STRINGREF_H_
    -#define _PURPLE_STRINGREF_H_
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -typedef struct _PurpleStringref PurpleStringref;
    -
    -/**
    - * Creates an immutable reference-counted string object. The newly
    - * created object will have a reference count of 1.
    - *
    - * @param value This will be the value of the string; it will be
    - * duplicated.
    - *
    - * @return A newly allocated string reference object with a refcount
    - * of 1.
    - */
    -PurpleStringref *purple_stringref_new(const char *value);
    -
    -/**
    - * Creates an immutable reference-counted string object. The newly
    - * created object will have a reference count of zero, and if it is
    - * not referenced before the next iteration of the mainloop it will
    - * be freed at that time.
    - *
    - * @param value This will be the value of the string; it will be
    - * duplicated.
    - *
    - * @return A newly allocated string reference object with a refcount
    - * of zero.
    - */
    -PurpleStringref *purple_stringref_new_noref(const char *value);
    -
    -/**
    - * Creates an immutable reference-counted string object from a printf
    - * format specification and arguments. The created object will have a
    - * reference count of 1.
    - *
    - * @param format A printf-style format specification.
    - *
    - * @return A newly allocated string reference object with a refcount
    - * of 1.
    - */
    -PurpleStringref *purple_stringref_printf(const char *format, ...);
    -
    -/**
    - * Increase the reference count of the given stringref.
    - *
    - * @param stringref String to be referenced.
    - *
    - * @return A pointer to the referenced string.
    - */
    -PurpleStringref *purple_stringref_ref(PurpleStringref *stringref);
    -
    -/**
    - * Decrease the reference count of the given stringref. If this
    - * reference count reaches zero, the stringref will be freed; thus
    - * you MUST NOT use this string after dereferencing it.
    - *
    - * @param stringref String to be dereferenced.
    - */
    -void purple_stringref_unref(PurpleStringref *stringref);
    -
    -/**
    - * Retrieve the value of a stringref.
    - *
    - * @note This value should not be cached or stored in a local variable.
    - * While there is nothing inherently incorrect about doing so, it
    - * is easy to forget that the cached value is in fact a
    - * reference-counted object and accidentally use it after
    - * dereferencing. This is more problematic for a reference-
    - * counted object than a heap-allocated object, as it may seem to
    - * be valid or invalid nondeterministically based on how many
    - * other references to it exist.
    - *
    - * @param stringref String reference from which to retrieve the value.
    - *
    - * @return The contents of the string reference.
    - */
    -const char *purple_stringref_value(const PurpleStringref *stringref);
    -
    -/**
    - * Compare two stringrefs for string equality. This returns the same
    - * value as strcmp would, where <0 indicates that s1 is "less than" s2
    - * in the ASCII lexicography, 0 indicates equality, etc.
    - *
    - * @param s1 The reference string.
    - *
    - * @param s2 The string to compare against the reference.
    - *
    - * @return An ordering indication on s1 and s2.
    - */
    -int purple_stringref_cmp(const PurpleStringref *s1, const PurpleStringref *s2);
    -
    -/**
    - * Find the length of the string inside a stringref.
    - *
    - * @param stringref The string in whose length we are interested.
    - *
    - * @return The length of the string in stringref
    - */
    -size_t purple_stringref_len(const PurpleStringref *stringref);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_STRINGREF_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/stun.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,88 +0,0 @@
    -/**
    - * @file stun.h STUN 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
    - */
    -#ifndef _PURPLE_STUN_H_
    -#define _PURPLE_STUN_H_
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name STUN API */
    -/**************************************************************************/
    -/*@{*/
    -
    -typedef struct _PurpleStunNatDiscovery PurpleStunNatDiscovery;
    -
    -typedef enum {
    - PURPLE_STUN_STATUS_UNDISCOVERED = -1,
    - PURPLE_STUN_STATUS_UNKNOWN, /* no STUN server reachable */
    - PURPLE_STUN_STATUS_DISCOVERING,
    - PURPLE_STUN_STATUS_DISCOVERED
    -} PurpleStunStatus;
    -
    -typedef enum {
    - PURPLE_STUN_NAT_TYPE_PUBLIC_IP,
    - PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT,
    - PURPLE_STUN_NAT_TYPE_FULL_CONE,
    - PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE,
    - PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE,
    - PURPLE_STUN_NAT_TYPE_SYMMETRIC
    -} PurpleStunNatType;
    -
    -struct _PurpleStunNatDiscovery {
    - PurpleStunStatus status;
    - PurpleStunNatType type;
    - char publicip[16];
    - char *servername;
    - time_t lookup_time;
    -};
    -
    -typedef void (*StunCallback) (PurpleStunNatDiscovery *);
    -
    -/**
    - * Starts a NAT discovery. It returns a PurpleStunNatDiscovery if the discovery
    - * is already done. Otherwise the callback is called when the discovery is over
    - * and NULL is returned.
    - *
    - * @param cb The callback to call when the STUN discovery is finished if the
    - * discovery would block. If the discovery is done, this is NOT
    - * called.
    - *
    - * @return a PurpleStunNatDiscovery which includes the public IP and the type
    - * of NAT or NULL is discovery would block
    - */
    -PurpleStunNatDiscovery *purple_stun_discover(StunCallback cb);
    -
    -void purple_stun_init(void);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_STUN_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/switchboard.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,266 +0,0 @@
    -/**
    - * @file switchboard.h MSN switchboard functions
    - *
    - * 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
    - */
    -#ifndef MSN_SWITCHBOARD_H
    -#define MSN_SWITCHBOARD_H
    -
    -typedef struct _MsnSwitchBoard MsnSwitchBoard;
    -
    -/**
    - * A switchboard error.
    - */
    -typedef enum
    -{
    - MSN_SB_ERROR_NONE, /**< No error. */
    - MSN_SB_ERROR_CAL, /**< The user could not join (answer the call). */
    - MSN_SB_ERROR_OFFLINE, /**< The account is offline. */
    - MSN_SB_ERROR_USER_OFFLINE, /**< The user to call is offline. */
    - MSN_SB_ERROR_CONNECTION, /**< There was a connection error. */
    - MSN_SB_ERROR_TOO_FAST, /**< We are sending too fast */
    - MSN_SB_ERROR_AUTHFAILED, /**< Authentication failed joining the switchboard session */
    - MSN_SB_ERROR_UNKNOWN /**< An unknown error occurred. */
    -} MsnSBErrorType;
    -
    -/**
    - * A switchboard flag.
    - */
    -typedef enum
    -{
    - MSN_SB_FLAG_IM = 0x01, /**< This switchboard is being used for a conversation. */
    - MSN_SB_FLAG_FT = 0x02 /**< This switchboard is being used for file transfer. */
    -} MsnSBFlag;
    -
    -#include "cmdproc.h"
    -#include "msg.h"
    -#include "servconn.h"
    -#include "session.h"
    -
    -/**
    - * A switchboard.
    - *
    - * A place where a bunch of users send messages to the rest of the users.
    - */
    -struct _MsnSwitchBoard
    -{
    - MsnSession *session; /**< Our parent session. */
    - MsnServConn *servconn; /**< The physical connection for this switchboard. */
    - MsnCmdProc *cmdproc; /**< Convenience variable for servconn->cmdproc. */
    - char *im_user;
    -
    - MsnSBFlag flag;
    - char *auth_key;
    - char *session_id;
    -
    - PurpleConversation *conv; /**< The conversation that displays the
    - messages of this switchboard, or @c NULL if
    - this is a helper switchboard. */
    -
    - gboolean empty; /**< A flag that states if the swithcboard has no
    - users in it. */
    - gboolean invited; /**< A flag that states if we were invited to the
    - switchboard. */
    - gboolean ready; /**< A flag that states if this switchboard is
    - ready to be used. */
    - gboolean closed; /**< A flag that states if the switchboard has
    - been closed by the user. */
    - gboolean destroying; /**< A flag that states if the switchboard is
    - alredy on the process of destruction. */
    -
    - int current_users;
    - int total_users;
    - GList *users;
    -
    - int chat_id;
    -
    - GQueue *msg_queue; /**< Queue of messages to send. */
    - GList *ack_list; /**< List of messages waiting for an ack. */
    -
    - MsnSBErrorType error; /**< The error that occurred in this switchboard
    - (if applicable). */
    - GList *slplinks; /**< The list of slplinks that are using this switchboard. */
    - guint reconn_timeout_h;
    -};
    -
    -/**
    - * Initialize the variables for switchboard creation.
    - */
    -void msn_switchboard_init(void);
    -
    -/**
    - * Destroy the variables for switchboard creation.
    - */
    -void msn_switchboard_end(void);
    -
    -/**
    - * Creates a new switchboard.
    - *
    - * @param session The MSN session.
    - *
    - * @return The new switchboard.
    - */
    -MsnSwitchBoard *msn_switchboard_new(MsnSession *session);
    -
    -/**
    - * Destroys a switchboard.
    - *
    - * @param swboard The switchboard to destroy.
    - */
    -void msn_switchboard_destroy(MsnSwitchBoard *swboard);
    -
    -/**
    - * Sets the auth key the switchboard must use when connecting.
    - *
    - * @param swboard The switchboard.
    - * @param key The auth key.
    - */
    -void msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key);
    -
    -/**
    - * Returns the auth key the switchboard must use when connecting.
    - *
    - * @param swboard The switchboard.
    - *
    - * @return The auth key.
    - */
    -const char *msn_switchboard_get_auth_key(MsnSwitchBoard *swboard);
    -
    -/**
    - * Sets the session ID the switchboard must use when connecting.
    - *
    - * @param swboard The switchboard.
    - * @param id The session ID.
    - */
    -void msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id);
    -
    -/**
    - * Returns the session ID the switchboard must use when connecting.
    - *
    - * @param swboard The switchboard.
    - *
    - * @return The session ID.
    - */
    -const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard);
    -
    -/**
    - * Returns the next chat ID for use by a switchboard.
    - *
    - * @return The chat ID.
    - */
    -int msn_switchboard_get_chat_id(void);
    -
    -/**
    - * Sets whether or not we were invited to this switchboard.
    - *
    - * @param swboard The switchboard.
    - * @param invite @c TRUE if invited, @c FALSE otherwise.
    - */
    -void msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited);
    -
    -/**
    - * Returns whether or not we were invited to this switchboard.
    - *
    - * @param swboard The switchboard.
    - *
    - * @return @c TRUE if invited, @c FALSE otherwise.
    - */
    -gboolean msn_switchboard_is_invited(MsnSwitchBoard *swboard);
    -
    -/**
    - * Connects to a switchboard.
    - *
    - * @param swboard The switchboard.
    - * @param host The switchboard server host.
    - * @param port The switcbharod server port.
    - *
    - * @return @c TRUE if able to connect, or @c FALSE otherwise.
    - */
    -gboolean msn_switchboard_connect(MsnSwitchBoard *swboard,
    - const char *host, int port);
    -
    -/**
    - * Disconnects from a switchboard.
    - *
    - * @param swboard The switchboard to disconnect from.
    - */
    -void msn_switchboard_disconnect(MsnSwitchBoard *swboard);
    -
    -/**
    - * Closes the switchboard.
    - *
    - * Called when a conversation is closed.
    - *
    - * @param swboard The switchboard to close.
    - */
    -void msn_switchboard_close(MsnSwitchBoard *swboard);
    -
    -/**
    - * Release a switchboard from a certain function.
    - *
    - * @param swboard The switchboard to release.
    - * @param flag The flag that states the function.
    - */
    -void msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag);
    -
    -/**
    - * Returns whether or not we currently can send a message through this
    - * switchboard.
    - *
    - * @param swboard The switchboard.
    - *
    - * @return @c TRUE if a message can be sent, @c FALSE otherwise.
    - */
    -gboolean msn_switchboard_can_send(MsnSwitchBoard *swboard);
    -
    -/**
    - * Sends a message through this switchboard.
    - *
    - * @param swboard The switchboard.
    - * @param msg The message.
    - * @param queue A flag that states if we want this message to be queued (in
    - * the case it cannot currently be sent).
    - *
    - * @return @c TRUE if a message can be sent, @c FALSE otherwise.
    - */
    -void msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
    - gboolean queue);
    -
    -void
    -msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, MsnMsgErrorType error);
    -
    -gboolean msn_switchboard_chat_leave(MsnSwitchBoard *swboard);
    -gboolean msn_switchboard_chat_invite(MsnSwitchBoard *swboard, const char *who);
    -
    -gboolean msn_switchboard_request(MsnSwitchBoard *swboard);
    -void msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user);
    -
    -/**
    - * Shows an ink message from this switchboard.
    - *
    - * @param swboard The switchboard.
    - * @param passport The user that sent the ink.
    - * @param data The ink data.
    - */
    -void msn_switchboard_show_ink(MsnSwitchBoard *swboard, const char *passport,
    - const char *data);
    -
    -#endif /* MSN_SWITCHBOARD_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/table.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,93 +0,0 @@
    -/**
    - * @file table.h MSN helper structure
    - *
    - * 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
    - */
    -#ifndef MSN_TABLE_H
    -#define MSN_TABLE_H
    -
    -typedef struct _MsnTable MsnTable;
    -
    -#include "cmdproc.h"
    -#include "transaction.h"
    -#include "msg.h"
    -
    -typedef void (*MsnMsgTypeCb)(MsnCmdProc *cmdproc, MsnMessage *msg);
    -
    -struct _MsnTable
    -{
    - GHashTable *cmds; /**< Callbacks that manage command response. */
    - GHashTable *msgs; /**< Callbacks that manage incoming messages. */
    - GHashTable *errors; /**< Callbacks that manage command errors. */
    -
    - GHashTable *async; /**< Callbacks that manage incoming asyncronous messages. */
    - /* TODO: Does this one is really needed? */
    - GHashTable *fallback; /**< Fallback callback. */
    -};
    -
    -/**
    - * Create a new instance of a MsnTable which map commands, errors and messages
    - * with callbacks that will handle it.
    - *
    - * @return A new MsnTable.
    - */
    -MsnTable *msn_table_new(void);
    -
    -/**
    - * Destroy a MsnTable.
    - *
    - * @param table The MsnTable to be destroyed.
    - */
    -void msn_table_destroy(MsnTable *table);
    -
    -/**
    - * Relate an incomming command from server with a callback able to handle
    - * the event.
    - *
    - * @param table The MsnTable.
    - * @param command If NULL this add an incoming asyncronous command set in answer.
    - * Else, the command sent.
    - * @param answer The server answer to 'command'. If 'command' is NULL,
    - * the asyncronous command sent by the server.
    - * @param cb Callback to handle this event.
    - */
    -void msn_table_add_cmd(MsnTable *table, char *command, char *answer,
    - MsnTransCb cb);
    -
    -/**
    - * Set a callback to handle incoming command errors.
    - *
    - * @param table The MsnTable.
    - * @param answer Incoming command with error.
    - * @param cb Callback to handle this error.
    - */
    -void msn_table_add_error(MsnTable *table, char *answer, MsnErrorCb cb);
    -
    -/**
    - * Relate a message Content-type with a callback able to handle it.
    - *
    - * @param table The MsnTable.
    - * @param type The Message Content-Type.
    - * @param cb Callback to handle this Content-type.
    - */
    -void msn_table_add_msg_type(MsnTable *table, char *type, MsnMsgTypeCb cb);
    -
    -#endif /* MSN_TABLE_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme-loader.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,93 +0,0 @@
    -/**
    - * @file theme-loader.h Purple Theme Loader Abstact Class API
    - */
    -
    -/* 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
    - */
    -
    -#ifndef PURPLE_THEME_LOADER_H
    -#define PURPLE_THEME_LOADER_H
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -#include "theme.h"
    -
    -/**
    - * A purple theme loader.
    - * This is an abstract class for Purple to use with the Purple theme manager.
    - * The loader is responsible for building each type of theme
    - *
    - * PurpleThemeLoader is a GObject.
    - */
    -typedef struct _PurpleThemeLoader PurpleThemeLoader;
    -typedef struct _PurpleThemeLoaderClass PurpleThemeLoaderClass;
    -
    -#define PURPLE_TYPE_THEME_LOADER (purple_theme_loader_get_type())
    -#define PURPLE_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoader))
    -#define PURPLE_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoaderClass))
    -#define PURPLE_IS_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_THEME_LOADER))
    -#define PURPLE_IS_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_THEME_LOADER))
    -#define PURPLE_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoaderClass))
    -
    -struct _PurpleThemeLoader
    -{
    - GObject parent;
    - gpointer priv;
    -};
    -
    -struct _PurpleThemeLoaderClass
    -{
    - GObjectClass parent_class;
    - PurpleTheme *((*purple_theme_loader_build)(const gchar*));
    -};
    -
    -/**************************************************************************/
    -/** @name Purple Theme-Loader API */
    -/**************************************************************************/
    -G_BEGIN_DECLS
    -
    -/**
    - * GObject foo.
    - * @internal.
    - */
    -GType purple_theme_loader_get_type(void);
    -
    -/**
    - * Returns the string representing the type of the theme loader
    - *
    - * @param self The theme loader
    - *
    - * @returns The string representing this type
    - */
    -const gchar *purple_theme_loader_get_type_string(PurpleThemeLoader *self);
    -
    -/**
    - * Creates a new PurpleTheme
    - *
    - * @param loader The theme loader
    - * @param dir The directory containing the theme
    - *
    - * @returns A PurpleTheme containing the information from the directory
    - */
    -PurpleTheme *purple_theme_loader_build(PurpleThemeLoader *loader, const gchar *dir);
    -
    -G_END_DECLS
    -#endif /* PURPLE_THEME_LOADER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme-manager.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,139 +0,0 @@
    -/**
    - * @file theme-manager.h Theme Manager API
    - */
    -
    -/*
    - * 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
    - */
    -
    -#ifndef PURPLE_THEME_MANAGER_H
    -#define PURPLE_THEME_MANAGER_H
    -
    -#include <glib-object.h>
    -#include <glib.h>
    -#include "theme.h"
    -#include "theme-loader.h"
    -
    -typedef void (*PTFunc) (PurpleTheme *);
    -
    -typedef struct _PurpleThemeManager PurpleThemeManager;
    -typedef struct _PurpleThemeManagerClass PurpleThemeManagerClass;
    -
    -#define PURPLE_TYPE_THEME_MANAGER (purple_theme_manager_get_type())
    -#define PURPLE_THEME_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManager))
    -#define PURPLE_THEME_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManagerClass))
    -#define PURPLE_IS_THEME_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_THEME_MANAGER))
    -#define PURPLE_IS_THEME_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_THEME_MANAGER))
    -#define PURPLE_GET_THEME_MANAGER_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManagerClass))
    -
    -struct _PurpleThemeManager {
    - GObject parent;
    -};
    -
    -struct _PurpleThemeManagerClass {
    - GObjectClass parent_class;
    -};
    -
    -/**************************************************************************/
    -/** @name Purple Theme Manager API */
    -/**************************************************************************/
    -G_BEGIN_DECLS
    -
    -/**
    - * GObject foo.
    - *
    - * @internal.
    - */
    -GType purple_theme_manager_get_type(void);
    -
    -/**
    - * Initalizes the theme manager.
    - */
    -void purple_theme_manager_init(void);
    -
    -/**
    - * Uninitalizes the manager then frees all the themes and loaders it is
    - * responsible for.
    - */
    -void purple_theme_manager_uninit(void);
    -
    -/**
    - * Rebuilds all the themes in the theme manager.
    - * (Removes all current themes but keeps the added loaders.)
    - */
    -void purple_theme_manager_refresh(void);
    -
    -/**
    - * Finds the PurpleTheme object stored by the theme manager.
    - *
    - * @param name The name of the PurpleTheme.
    - * @param type The type of the PurpleTheme.
    - *
    - * @returns The PurpleTheme, or NULL if it wasn't found.
    - */
    -PurpleTheme *purple_theme_manager_find_theme(const gchar *name, const gchar *type);
    -
    -/**
    - * Adds a PurpleTheme to the theme manager. If the theme already exists
    - * then this function does nothing.
    - *
    - * @param theme The PurpleTheme to add to the manager.
    - */
    -void purple_theme_manager_add_theme(PurpleTheme *theme);
    -
    -/**
    - * Removes a PurpleTheme from the theme manager and frees the theme.
    - *
    - * @param theme The PurpleTheme to remove from the manager.
    - */
    -void purple_theme_manager_remove_theme(PurpleTheme *theme);
    -
    -/**
    - * Adds a loader to the theme manager so it knows how to build themes.
    - *
    - * @param loader The PurpleThemeLoader to add.
    - */
    -void purple_theme_manager_register_type(PurpleThemeLoader *loader);
    -
    -/**
    - * Removes the loader and all themes of the same type from the loader.
    - *
    - * @param loader The PurpleThemeLoader to be removed.
    - */
    -void purple_theme_manager_unregister_type(PurpleThemeLoader *loader);
    -
    -/**
    - * Calls the given function on each purple theme.
    - *
    - * @param func The PTFunc to be applied to each theme.
    - */
    -void purple_theme_manager_for_each_theme(PTFunc func);
    -
    -/**
    - * Loads a theme of the given type without adding it to the manager
    - *
    - * @param theme_dir the directory of the theme to load
    - * @param type the type of theme to load
    - */
    -PurpleTheme *purple_theme_manager_load_theme(const gchar *theme_dir, const gchar *type);
    -
    -G_END_DECLS
    -#endif /* PURPLE_THEME_MANAGER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/theme.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,175 +0,0 @@
    -/**
    - * @file theme.h Purple Theme Abstact Class API
    - */
    -
    -/* 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
    - */
    -
    -#ifndef PURPLE_THEME_H
    -#define PURPLE_THEME_H
    -
    -#include <glib.h>
    -#include <glib-object.h>
    -#include "imgstore.h"
    -
    -/**
    - * A purple theme.
    - * This is an abstract class for Purple to use with the Purple theme manager.
    - *
    - * PurpleTheme is a GObject.
    - */
    -typedef struct _PurpleTheme PurpleTheme;
    -typedef struct _PurpleThemeClass PurpleThemeClass;
    -
    -#define PURPLE_TYPE_THEME (purple_theme_get_type ())
    -#define PURPLE_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PURPLE_TYPE_THEME, PurpleTheme))
    -#define PURPLE_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PURPLE_TYPE_THEME, PurpleThemeClass))
    -#define PURPLE_IS_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PURPLE_TYPE_THEME))
    -#define PURPLE_IS_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PURPLE_TYPE_THEME))
    -#define PURPLE_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PURPLE_TYPE_THEME, PurpleThemeClass))
    -
    -struct _PurpleTheme
    -{
    - GObject parent;
    - gpointer priv;
    -};
    -
    -struct _PurpleThemeClass
    -{
    - GObjectClass parent_class;
    -};
    -
    -/**************************************************************************/
    -/** @name Purple Theme API */
    -/**************************************************************************/
    -G_BEGIN_DECLS
    -
    -/**
    - * GObject foo.
    - * @internal.
    - */
    -GType purple_theme_get_type(void);
    -
    -/**
    - * Returns the name of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The string representing the name of the theme.
    - */
    -const gchar *purple_theme_get_name(PurpleTheme *theme);
    -
    -/**
    - * Sets the name of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - * @param name The name of the PurpleTheme object.
    - */
    -void purple_theme_set_name(PurpleTheme *theme, const gchar *name);
    -
    -/**
    - * Returns the description of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return A short description of the theme.
    - */
    -const gchar *purple_theme_get_description(PurpleTheme *theme);
    -
    -/**
    - * Sets the description of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - * @param description The description of the PurpleTheme object.
    - */
    -void purple_theme_set_description(PurpleTheme *theme, const gchar *description);
    -
    -/**
    - * Returns the author of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The author of the theme.
    - */
    -const gchar *purple_theme_get_author(PurpleTheme *theme);
    -
    -/**
    - * Sets the author of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - * @param author The author of the PurpleTheme object.
    - */
    -void purple_theme_set_author(PurpleTheme *theme, const gchar *author);
    -
    -/**
    - * Returns the type (string) of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The string representing the type.
    - */
    -const gchar *purple_theme_get_type_string(PurpleTheme *theme);
    -
    -/**
    - * Returns the directory of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The string representing the theme directory.
    - */
    -const gchar *purple_theme_get_dir(PurpleTheme *theme);
    -
    -/**
    - * Sets the directory of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - * @param dir The directory of the PurpleTheme object.
    - */
    -void purple_theme_set_dir(PurpleTheme *theme, const gchar *dir);
    -
    -/**
    - * Returns the image preview of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The image preview of the PurpleTheme object.
    - */
    -const gchar *purple_theme_get_image(PurpleTheme *theme);
    -
    -/**
    - * Returns the image preview and directory of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - *
    - * @return The image preview of the PurpleTheme object.
    - */
    -gchar *purple_theme_get_image_full(PurpleTheme *theme);
    -
    -/**
    - * Sets the directory of the PurpleTheme object.
    - *
    - * @param theme The purple theme.
    - * @param img The image preview of the PurpleTheme object.
    - */
    -void purple_theme_set_image(PurpleTheme *theme, const gchar *img);
    -
    -G_END_DECLS
    -#endif /* PURPLE_THEME_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/tlv.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,77 +0,0 @@
    -/**
    - * @file tlv.h MSN TLV functions
    - *
    - * 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
    - */
    -
    -#ifndef MSN_TLV_H
    -#define MSN_TLV_H
    -
    -#include "msn.h"
    -
    -/* TLV structure */
    -typedef struct msn_tlv_s
    -{
    - guint8 type;
    - guint8 length;
    - guint8 *value;
    -} msn_tlv_t;
    -
    -/* TLV handling functions */
    -char *msn_tlv_getvalue_as_string(msn_tlv_t *tlv);
    -
    -msn_tlv_t *msn_tlv_gettlv(GSList *list, const guint8 type, const int nth);
    -int msn_tlv_getlength(GSList *list, const guint8 type, const int nth);
    -char *msn_tlv_getstr(GSList *list, const guint8 type, const int nth);
    -guint8 msn_tlv_get8(GSList *list, const guint8 type, const int nth);
    -guint16 msn_tlv_get16(GSList *list, const guint8 type, const int nth);
    -guint32 msn_tlv_get32(GSList *list, const guint8 type, const int nth);
    -
    -/* TLV list handling functions */
    -GSList *msn_tlvlist_read(const char *bs, size_t bs_len);
    -GSList *msn_tlvlist_copy(GSList *orig);
    -
    -int msn_tlvlist_count(GSList *list);
    -size_t msn_tlvlist_size(GSList *list);
    -gboolean msn_tlvlist_equal(GSList *one, GSList *two);
    -char *msn_tlvlist_write(GSList *list, guint8 *out_len);
    -void msn_tlvlist_free(GSList *list);
    -
    -int msn_tlvlist_add_raw(GSList **list, const guint8 type, const guint8 length, const char *value);
    -int msn_tlvlist_add_empty(GSList **list, const guint8 type);
    -int msn_tlvlist_add_8(GSList **list, const guint8 type, const guint8 value);
    -int msn_tlvlist_add_16(GSList **list, const guint8 type, const guint16 value);
    -int msn_tlvlist_add_32(GSList **list, const guint8 type, const guint32 value);
    -int msn_tlvlist_add_str(GSList **list, const guint8 type, const char *value);
    -int msn_tlvlist_add_tlv(GSList **list, const msn_tlv_t *tlv);
    -
    -int msn_tlvlist_replace_raw(GSList **list, const guint8 type, const guint8 lenth, const char *value);
    -int msn_tlvlist_replace_str(GSList **list, const guint8 type, const char *str);
    -int msn_tlvlist_replace_empty(GSList **list, const guint8 type);
    -int msn_tlvlist_replace_8(GSList **list, const guint8 type, const guint8 value);
    -int msn_tlvlist_replace_16(GSList **list, const guint8 type, const guint16 value);
    -int msn_tlvlist_replace_32(GSList **list, const guint8 type, const guint32 value);
    -int msn_tlvlist_replace_tlv(GSList **list, const msn_tlv_t *tlv);
    -
    -void msn_tlvlist_remove(GSList **list, const guint8 type);
    -
    -#endif /* MSN_TLV_H */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/transaction.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,87 +0,0 @@
    -/**
    - * @file transaction.h MSN transaction functions
    - *
    - * 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
    - */
    -#ifndef MSN_TRANSACTION_H
    -#define MSN_TRANSACTION_H
    -
    -#include "internal.h"
    -
    -typedef struct _MsnTransaction MsnTransaction;
    -
    -#include "cmdproc.h"
    -#include "command.h"
    -
    -typedef void (*MsnTransCb)(MsnCmdProc *cmdproc, MsnCommand *cmd);
    -typedef void (*MsnTimeoutCb)(MsnCmdProc *cmdproc, MsnTransaction *trans);
    -typedef void (*MsnErrorCb)(MsnCmdProc *cmdproc, MsnTransaction *trans,
    - int error);
    -
    -/**
    - * A transaction. A sending command that will initiate the transaction.
    - */
    -struct _MsnTransaction
    -{
    - MsnCmdProc *cmdproc;
    -
    - gboolean saveable; /**< Whether to save this transaction in the history */
    - unsigned int trId; /**< The ID of this transaction, if it's being saved */
    -
    - char *command;
    - char *params;
    -
    - guint timer;
    -
    - void *data; /**< The data to be used on the different callbacks. */
    - GDestroyNotify data_free; /**< The function to free 'data', or @c NULL */
    -
    - GHashTable *callbacks;
    - gboolean has_custom_callbacks;
    - MsnErrorCb error_cb;
    - MsnTimeoutCb timeout_cb;
    -
    - char *payload;
    - size_t payload_len;
    -
    - GQueue *queue;
    - MsnCommand *pendent_cmd; /**< The command that is waiting for the result of
    - this transaction. */
    -};
    -
    -MsnTransaction *msn_transaction_new(MsnCmdProc *cmdproc, const char *command,
    - const char *format, ...) G_GNUC_PRINTF(3, 4);
    -void msn_transaction_destroy(MsnTransaction *trans);
    -
    -char *msn_transaction_to_string(MsnTransaction *trans);
    -void msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd);
    -void msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc);
    -void msn_transaction_set_payload(MsnTransaction *trans,
    - const char *payload, gsize payload_len);
    -void msn_transaction_set_data(MsnTransaction *trans, void *data);
    -void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn);
    -void msn_transaction_set_saveable(MsnTransaction *trans, gboolean saveable);
    -void msn_transaction_add_cb(MsnTransaction *trans, char *answer,
    - MsnTransCb cb);
    -void msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb);
    -void msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb);
    -
    -#endif /* MSN_TRANSACTION_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/upnp.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,132 +0,0 @@
    -/**
    - * @file upnp.h Universal Plug N Play 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
    - */
    -
    -#ifndef _PURPLE_UPNP_H_
    -#define _PURPLE_UPNP_H_
    -
    -typedef struct _UPnPMappingAddRemove UPnPMappingAddRemove;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**************************************************************************/
    -/** @name UPnP API */
    -/**************************************************************************/
    -/*@{*/
    -
    -/* typedef struct _PurpleUPnPRequestData PurpleUPnPRequestData; */
    -
    -typedef void (*PurpleUPnPCallback) (gboolean success, gpointer data);
    -
    -
    -/**
    - * Initialize UPnP
    - */
    -void purple_upnp_init(void);
    -
    -
    -/**
    - * Sends a discovery request to search for a UPnP enabled IGD that
    - * contains the WANIPConnection service that will allow us to recieve the
    - * public IP address of the IGD, and control it for forwarding ports.
    - * The result will be cached for further use.
    - *
    - * @param cb an optional callback function to be notified when the UPnP
    - * discovery is complete
    - * @param cb_data Extra data to be passed to the callback
    - */
    -void purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data);
    -
    -#if 0
    -/**
    - * Retrieve the current UPnP control info, if there is any available.
    - * This will only be filled in if purple_upnp_discover() had been called,
    - * and finished discovering.
    - *
    - * @return The control URL for the IGD we'll use to use the IGD services
    - */
    -const PurpleUPnPControlInfo* purple_upnp_get_control_info(void);
    -#endif
    -
    -/**
    - * Gets the IP address from a UPnP enabled IGD that sits on the local
    - * network, so when getting the network IP, instead of returning the
    - * local network IP, the public IP is retrieved. This is a cached value from
    - * the time of the UPnP discovery.
    - *
    - * @return The IP address of the network, or NULL if something went wrong
    - */
    -const gchar* purple_upnp_get_public_ip(void);
    -
    -/**
    - * Cancel a pending port mapping request initiated with either
    - * purple_upnp_set_port_mapping() or purple_upnp_remove_port_mapping().
    - *
    - * @param mapping_data The data returned when you initiated the UPnP mapping request.
    - */
    -void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove *mapping_data);
    -
    -/**
    - * Maps Ports in a UPnP enabled IGD that sits on the local network to
    - * this purple client. Essentially, this function takes care of the port
    - * forwarding so things like file transfers can work behind NAT firewalls
    - *
    - * @param portmap The port to map to this client
    - * @param protocol The protocol to map, either "TCP" or "UDP"
    - * @param cb an optional callback function to be notified when the mapping
    - * addition is complete
    - * @param cb_data Extra data to be passed to the callback
    - *
    - * @return Data which can be passed to purple_upnp_port_mapping_cancel() to cancel
    - */
    -UPnPMappingAddRemove *purple_upnp_set_port_mapping(unsigned short portmap, const gchar* protocol,
    - PurpleUPnPCallback cb, gpointer cb_data);
    -
    -/**
    - * Deletes a port mapping in a UPnP enabled IGD that sits on the local network
    - * to this purple client. Essentially, this function takes care of deleting the
    - * port forwarding after they have completed a connection so another client on
    - * the local network can take advantage of the port forwarding
    - *
    - * @param portmap The port to delete the mapping for
    - * @param protocol The protocol to map to. Either "TCP" or "UDP"
    - * @param cb an optional callback function to be notified when the mapping
    - * removal is complete
    - * @param cb_data Extra data to be passed to the callback
    - *
    - * @return Data which can be passed to purple_upnp_port_mapping_cancel() to cancel
    - */
    -UPnPMappingAddRemove *purple_upnp_remove_port_mapping(unsigned short portmap,
    - const gchar* protocol, PurpleUPnPCallback cb, gpointer cb_data);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_UPNP_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/user.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,533 +0,0 @@
    -/**
    - * @file user.h User functions
    - *
    - * 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
    - */
    -#ifndef MSN_USER_H
    -#define MSN_USER_H
    -
    -typedef struct _MsnUser MsnUser;
    -
    -typedef enum
    -{
    - MSN_NETWORK_UNKNOWN = 0,
    - MSN_NETWORK_PASSPORT = 1,
    - MSN_NETWORK_COMMUNICATOR = 2,
    - MSN_NETWORK_MOBILE = 4,
    - MSN_NETWORK_MNI = 8,
    - MSN_NETWORK_CIRCLE = 9,
    - MSN_NETWORK_TEMP_GROUP = 10,
    - MSN_NETWORK_CID = 11,
    - MSN_NETWORK_CONNECT = 13,
    - MSN_NETWORK_REMOTE = 14,
    - MSN_NETWORK_SMTP = 16,
    - MSN_NETWORK_YAHOO = 32
    -} MsnNetwork;
    -
    -/**
    - * Current media.
    - */
    -typedef enum
    -{
    - CURRENT_MEDIA_UNKNOWN,
    - CURRENT_MEDIA_MUSIC,
    - CURRENT_MEDIA_GAMES,
    - CURRENT_MEDIA_OFFICE
    -} CurrentMediaType;
    -
    -#include "object.h"
    -#include "session.h"
    -#include "userlist.h"
    -
    -/**
    - * Contains optional info about a user that is fairly uncommon. We
    - * put this info in in a separate struct to save memory because we
    - * allocate an MsnUser struct for each buddy, but we generally only
    - * need this information for a small percentage of our buddies
    - * (usually less than 1%). Putting it in a separate struct makes
    - * MsnUser smaller by the size of a few pointers.
    - */
    -typedef struct _MsnUserExtendedInfo
    -{
    - CurrentMediaType media_type; /**< Type of the user's current media. */
    - char *media_title; /**< Title of the user's current media. */
    - char *media_artist; /**< Artist of the user's current media. */
    - char *media_album; /**< Album of the user's current media. */
    -
    - char *phone_home; /**< E.T. uses this. */
    - char *phone_work; /**< Work phone number. */
    - char *phone_mobile; /**< Mobile phone number. */
    -} MsnUserExtendedInfo;
    -
    -/**
    - * A user.
    - */
    -struct _MsnUser
    -{
    - MsnUserList *userlist;
    -
    - guint8 refcount; /**< The reference count of this object */
    -
    - char *passport; /**< The passport account. */
    - char *friendly_name; /**< The friendly name. */
    -
    - char *uid; /*< User ID */
    - GSList *endpoints; /*< Endpoint-specific data */
    -
    - const char *status; /**< The state of the user. */
    - char *statusline; /**< The state of the user. */
    -
    - gboolean idle; /**< The idle state of the user. */
    -
    - MsnUserExtendedInfo *extinfo; /**< Extended info for the user. */
    -
    - gboolean authorized; /**< Authorized to add this user. */
    - gboolean mobile; /**< Signed up with MSN Mobile. */
    -
    - GList *group_ids; /**< The group IDs. */
    - char *pending_group; /**< A pending group to add. */
    -
    - MsnObject *msnobj; /**< The user's MSN Object. */
    -
    - GHashTable *clientcaps; /**< The client's capabilities. */
    -
    - guint clientid; /**< The client's ID */
    - guint extcaps; /**< The client's extended capabilities */
    -
    - MsnNetwork networkid; /**< The user's network */
    -
    - MsnListOp list_op; /**< Which lists the user is in */
    -
    - /**
    - * The membershipId for this buddy on our pending list. Sent by
    - * the contact's server
    - */
    - guint member_id_on_pending_list;
    -
    - char *invite_message; /**< Invite message of user request */
    -};
    -
    -/**
    - * A specific user endpoint.
    - */
    -typedef struct MsnUserEndpoint {
    - char *id; /**< The client's endpoint ID */
    - char *name; /**< The client's endpoint's name */
    - int type; /**< The client's endpoint type */
    - guint clientid; /**< The client's ID */
    - guint extcaps; /**< The client's extended capabilites */
    -
    -} MsnUserEndpoint;
    -
    -/**************************************************************************
    - ** @name User API *
    - **************************************************************************/
    -/*@{*/
    -
    -/**
    - * Creates a new user structure.
    - *
    - * @param session The MSN session.
    - * @param passport The initial passport.
    - * @param stored_name The initial stored name.
    - *
    - * @return A new user structure. It will have a reference count of 1.
    - */
    -MsnUser *msn_user_new(MsnUserList *userlist, const char *passport,
    - const char *friendly_name);
    -
    -/**
    - * Increment the reference count.
    - *
    - * @param user The user.
    - *
    - * @return user.
    - */
    -MsnUser *msn_user_ref(MsnUser *user);
    -
    -/**
    - * Decrement the reference count. When the count reaches 0 the object is
    - * automatically freed.
    - *
    - * @param user The user
    - */
    -void msn_user_unref(MsnUser *user);
    -
    -/**
    - * Updates the user.
    - *
    - * Communicates with the core to update the ui, etc.
    - *
    - * @param user The user to update.
    - */
    -void msn_user_update(MsnUser *user);
    -
    - /**
    - * Sets the new statusline of user.
    - *
    - * @param user The user.
    - * @param state The statusline string.
    - */
    -void msn_user_set_statusline(MsnUser *user, const char *statusline);
    -
    -/**
    - * Sets the new state of user.
    - *
    - * @param user The user.
    - * @param state The state string.
    - */
    -void msn_user_set_state(MsnUser *user, const char *state);
    -
    -/**
    - * Sets the passport account for a user.
    - *
    - * @param user The user.
    - * @param passport The passport account.
    - */
    -void msn_user_set_passport(MsnUser *user, const char *passport);
    -
    -/**
    - * Sets the friendly name for a user.
    - *
    - * @param user The user.
    - * @param name The friendly name.
    - *
    - * @returns TRUE is name actually changed, FALSE otherwise.
    - */
    -gboolean msn_user_set_friendly_name(MsnUser *user, const char *name);
    -
    -/**
    - * Sets the buddy icon for a local user.
    - *
    - * @param user The user.
    - * @param img The buddy icon image
    - */
    -void msn_user_set_buddy_icon(MsnUser *user, PurpleStoredImage *img);
    -
    -/**
    - * Sets the group ID list for a user.
    - *
    - * @param user The user.
    - * @param ids The group ID list.
    - */
    -void msn_user_set_group_ids(MsnUser *user, GList *ids);
    -
    -/**
    - * Adds the group ID for a user.
    - *
    - * @param user The user.
    - * @param id The group ID.
    - */
    -void msn_user_add_group_id(MsnUser *user, const char * id);
    -
    -/**
    - * Removes the group ID from a user.
    - *
    - * @param user The user.
    - * @param id The group ID.
    - */
    -void msn_user_remove_group_id(MsnUser *user, const char * id);
    -
    -/**
    - * Sets the pending group for a user.
    - *
    - * @param user The user.
    - * @param group The group name.
    - */
    -void msn_user_set_pending_group(MsnUser *user, const char *group);
    -
    -/**
    - * Removes the pending group from a user.
    - *
    - * @param user The user.
    - *
    - * @return Returns the pending group name.
    - */
    -char *msn_user_remove_pending_group(MsnUser *user);
    -
    -/**
    - * Sets the home phone number for a user.
    - *
    - * @param user The user.
    - * @param number The home phone number.
    - */
    -void msn_user_set_home_phone(MsnUser *user, const char *number);
    -
    -/**
    - * Sets the work phone number for a user.
    - *
    - * @param user The user.
    - * @param number The work phone number.
    - */
    -void msn_user_set_work_phone(MsnUser *user, const char *number);
    -
    -void msn_user_set_uid(MsnUser *user, const char *uid);
    -
    -/**
    - * Sets endpoint data for a user.
    - *
    - * @param user The user.
    - * @param endpoint The endpoint.
    - * @param data The endpoint data.
    - */
    -void
    -msn_user_set_endpoint_data(MsnUser *user, const char *endpoint, MsnUserEndpoint *data);
    -
    -/**
    - * Clears all endpoint data for a user.
    - *
    - * @param user The user.
    - */
    -void
    -msn_user_clear_endpoints(MsnUser *user);
    -
    -/**
    - * Sets the client id for a user.
    - *
    - * @param user The user.
    - * @param clientid The client id.
    - */
    -void msn_user_set_clientid(MsnUser *user, guint clientid);
    -
    -/**
    - * Sets the client id for a user.
    - *
    - * @param user The user.
    - * @param extcaps The client's extended capabilities.
    - */
    -void msn_user_set_extcaps(MsnUser *user, guint extcaps);
    -
    -/**
    - * Sets the network id for a user.
    - *
    - * @param user The user.
    - * @param network The network id.
    - */
    -void msn_user_set_network(MsnUser *user, MsnNetwork network);
    -
    -/**
    - * Sets the mobile phone number for a user.
    - *
    - * @param user The user.
    - * @param number The mobile phone number.
    - */
    -void msn_user_set_mobile_phone(MsnUser *user, const char *number);
    -
    -/**
    - * Sets the MSNObject for a user.
    - *
    - * @param user The user.
    - * @param obj The MSNObject.
    - */
    -void msn_user_set_object(MsnUser *user, MsnObject *obj);
    -
    -/**
    - * Sets the client information for a user.
    - *
    - * @param user The user.
    - * @param info The client information.
    - */
    -void msn_user_set_client_caps(MsnUser *user, GHashTable *info);
    -
    -/**
    - * Sets the invite message for a user.
    - *
    - * @param user The user.
    - * @param message The invite message for a user.
    - */
    -void msn_user_set_invite_message(MsnUser *user, const char *message);
    -
    -
    -/**
    - * Returns the passport account for a user.
    - *
    - * @param user The user.
    - *
    - * @return The passport account.
    - */
    -const char *msn_user_get_passport(const MsnUser *user);
    -
    -/**
    - * Returns the friendly name for a user.
    - *
    - * @param user The user.
    - *
    - * @return The friendly name.
    - */
    -const char *msn_user_get_friendly_name(const MsnUser *user);
    -
    -/**
    - * Returns the home phone number for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's home phone number.
    - */
    -const char *msn_user_get_home_phone(const MsnUser *user);
    -
    -/**
    - * Returns the work phone number for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's work phone number.
    - */
    -const char *msn_user_get_work_phone(const MsnUser *user);
    -
    -/**
    - * Returns the mobile phone number for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's mobile phone number.
    - */
    -const char *msn_user_get_mobile_phone(const MsnUser *user);
    -
    -/**
    - * Gets endpoint data for a user.
    - *
    - * @param user The user.
    - * @param endpoint The endpoint.
    - *
    - * @return The user's endpoint data.
    - */
    -MsnUserEndpoint *
    -msn_user_get_endpoint_data(MsnUser *user, const char *endpoint);
    -
    -/**
    - * Returns the client id for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's client id.
    - */
    -guint msn_user_get_clientid(const MsnUser *user);
    -
    -/**
    - * Returns the extended capabilities for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's extended capabilities.
    - */
    -guint msn_user_get_extcaps(const MsnUser *user);
    -
    -/**************************************************************************
    - * Utility functions
    - **************************************************************************/
    -
    -
    -/**
    - * Check if the user is part of the group.
    - *
    - * @param user The user we are asking group membership.
    - * @param group_id The group where the user may be in.
    - *
    - * @return TRUE if user is part of the group. Otherwise, FALSE.
    - */
    -gboolean msn_user_is_in_group(MsnUser *user, const char * group_id);
    -
    -/**
    - * Check if user is on list.
    - *
    - * @param user The user we are asking list membership.
    - * @param list_id The list where the user may be in.
    - *
    - * @return TRUE if the user is on the list, else FALSE.
    - */
    -gboolean msn_user_is_in_list(MsnUser *user, MsnListId list_id);
    -/**
    - * Returns the network id for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's network id.
    - */
    -MsnNetwork msn_user_get_network(const MsnUser *user);
    -
    -/**
    - * Returns the MSNObject for a user.
    - *
    - * @param user The user.
    - *
    - * @return The MSNObject.
    - */
    -MsnObject *msn_user_get_object(const MsnUser *user);
    -
    -/**
    - * Returns the client information for a user.
    - *
    - * @param user The user.
    - *
    - * @return The client information.
    - */
    -GHashTable *msn_user_get_client_caps(const MsnUser *user);
    -
    -/**
    - * Returns the invite message for a user.
    - *
    - * @param user The user.
    - *
    - * @return The user's invite message.
    - */
    -const char *msn_user_get_invite_message(const MsnUser *user);
    -
    -/**
    - * check to see if user is online
    - */
    -gboolean msn_user_is_online(PurpleAccount *account, const char *name);
    -
    -/**
    - * check to see if user is Yahoo User
    - */
    -gboolean msn_user_is_yahoo(PurpleAccount *account, const char *name);
    -
    -void msn_user_set_op(MsnUser *user, MsnListOp list_op);
    -void msn_user_unset_op(MsnUser *user, MsnListOp list_op);
    -
    -/**
    - * Compare the given passport with the one of the user
    - *
    - * @param user User to compare.
    - * @oaran passport Passport to compare.
    - *
    - * @return Zero if the passport match with the one of the user, otherwise
    - * a positive integer if the user passport is greather than the one given
    - * and a negative integer if it is less.
    - */
    -int msn_user_passport_cmp(MsnUser *user, const char *passport);
    -
    -/**
    - * Checks whether a user is capable of some task.
    - *
    - * @param user The user.
    - * @param endpoint The endpoint. Can be @NULL to check overall capabilities.
    - * @param capability The capability (including client version).
    - * @param extcap The extended capability.
    - *
    - * @return Whether the user supports the capability.
    - */
    -gboolean
    -msn_user_is_capable(MsnUser *user, char *endpoint, guint capability, guint extcap);
    -
    -/*@}*/
    -
    -#endif /* MSN_USER_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/userlist.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,112 +0,0 @@
    -/**
    - * @file userlist.h MSN user list support
    - *
    - * 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
    - */
    -#ifndef MSN_USERLIST_H
    -#define MSN_USERLIST_H
    -
    -typedef struct _MsnUserList MsnUserList;
    -
    -typedef enum
    -{
    - MSN_LIST_FL, /**< Forward list */
    - MSN_LIST_AL, /**< Allow list */
    - MSN_LIST_BL, /**< Block list */
    - MSN_LIST_RL, /**< Reverse list */
    - MSN_LIST_PL /**< Pending list */
    -} MsnListId;
    -
    -typedef enum
    -{
    - MSN_LIST_FL_OP = 0x01,
    - MSN_LIST_AL_OP = 0x02,
    - MSN_LIST_BL_OP = 0x04,
    - MSN_LIST_RL_OP = 0x08,
    - MSN_LIST_PL_OP = 0x10
    -} MsnListOp;
    -#define MSN_LIST_OP_MASK 0x07
    -
    -#include "group.h"
    -#include "msn.h"
    -#include "user.h"
    -
    -struct _MsnUserList
    -{
    - MsnSession *session;
    -
    - GList *users; /* Contains MsnUsers */
    - GList *groups; /* Contains MsnGroups */
    -
    - GQueue *buddy_icon_requests;
    - int buddy_icon_window;
    - guint buddy_icon_request_timer;
    -
    -};
    -
    -void msn_got_lst_user(MsnSession *session, MsnUser *user,
    - MsnListOp list_op, GSList *group_ids);
    -
    -MsnUserList *msn_userlist_new(MsnSession *session);
    -void msn_userlist_destroy(MsnUserList *userlist);
    -
    -void msn_userlist_add_user(MsnUserList *userlist, MsnUser *user);
    -void msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user);
    -
    -MsnUser * msn_userlist_find_user(MsnUserList *userlist, const char *passport);
    -MsnUser * msn_userlist_find_add_user(MsnUserList *userlist,
    - const char *passport, const char *friendly_name);
    -MsnUser * msn_userlist_find_user_with_id(MsnUserList *userlist, const char *uid);
    -MsnUser * msn_userlist_find_user_with_mobile_phone(MsnUserList *userlist, const char *number);
    -
    -void msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group);
    -void msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group);
    -MsnGroup *msn_userlist_find_group_with_id(MsnUserList *userlist, const char *id);
    -MsnGroup *msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name);
    -const char * msn_userlist_find_group_id(MsnUserList *userlist,
    - const char *group_name);
    -const char *msn_userlist_find_group_name(MsnUserList *userlist, const char *group_id);
    -void msn_userlist_rename_group_id(MsnUserList *userlist, const char *group_id,
    - const char *new_name);
    -void msn_userlist_remove_group_id(MsnUserList *userlist, const char *group_id);
    -
    -void msn_userlist_rem_buddy(MsnUserList *userlist, const char *who);
    -void msn_userlist_add_buddy(MsnUserList *userlist,
    - const char *who, const char *group_name);
    -void msn_userlist_move_buddy(MsnUserList *userlist, const char *who,
    - const char *old_group_name,
    - const char *new_group_name);
    -
    -gboolean msn_userlist_add_buddy_to_group(MsnUserList *userlist, const char *who,
    - const char *group_name);
    -gboolean msn_userlist_rem_buddy_from_group(MsnUserList *userlist,
    - const char *who,
    - const char *group_name);
    -
    -void msn_userlist_add_buddy_to_list(MsnUserList *userlist, const char *who,
    - MsnListId list_id);
    -void msn_userlist_rem_buddy_from_list(MsnUserList *userlist, const char *who,
    - MsnListId list_id);
    -void msn_release_buddy_icon_request(MsnUserList *userlist);
    -
    -void msn_userlist_load(MsnSession *session);
    -
    -#endif /* MSN_USERLIST_H */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/util.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,1490 +0,0 @@
    -/**
    - * @file util.h Utility Functions
    - * @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
    - *
    - * @todo Rename the functions so that they live somewhere in the purple
    - * namespace.
    - */
    -#ifndef _PURPLE_UTIL_H_
    -#define _PURPLE_UTIL_H_
    -
    -#include <stdio.h>
    -
    -/**
    - * An opaque structure representing a URL request. Can be used to cancel
    - * the request.
    - */
    -typedef struct _PurpleUtilFetchUrlData PurpleUtilFetchUrlData;
    -/** @copydoc _PurpleMenuAction */
    -typedef struct _PurpleMenuAction PurpleMenuAction;
    -/** @copydoc _PurpleKeyValuePair */
    -typedef struct _PurpleKeyValuePair PurpleKeyValuePair;
    -
    -#include "account.h"
    -#include "signals.h"
    -#include "xmlnode.h"
    -#include "notify.h"
    -
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -struct _PurpleMenuAction
    -{
    - char *label;
    - PurpleCallback callback;
    - gpointer data;
    - GList *children;
    -};
    -
    -typedef char *(*PurpleInfoFieldFormatCallback)(const char *field, size_t len);
    -
    -/**
    - * A key-value pair.
    - *
    - * This is used by, among other things, purple_gtk_combo* functions to pass in a
    - * list of key-value pairs so it can display a user-friendly value.
    - */
    -struct _PurpleKeyValuePair
    -{
    - gchar *key;
    - void *value;
    -
    -};
    -
    -/**
    - * Creates a new PurpleMenuAction.
    - *
    - * @param label The text label to display for this action.
    - * @param callback The function to be called when the action is used on
    - * the selected item.
    - * @param data Additional data to be passed to the callback.
    - * @param children A GList of PurpleMenuActions to be added as a submenu
    - * of the action.
    - * @return The PurpleMenuAction.
    - */
    -PurpleMenuAction *purple_menu_action_new(const char *label, PurpleCallback callback,
    - gpointer data, GList *children);
    -
    -/**
    - * Frees a PurpleMenuAction
    - *
    - * @param act The PurpleMenuAction to free.
    - */
    -void purple_menu_action_free(PurpleMenuAction *act);
    -
    -/**
    - * Set the appropriate presence values for the currently playing song.
    - *
    - * @param title The title of the song, @c NULL to unset the value.
    - * @param artist The artist of the song, can be @c NULL.
    - * @param album The album of the song, can be @c NULL.
    - * @since 2.4.0
    - */
    -void purple_util_set_current_song(const char *title, const char *artist,
    - const char *album);
    -
    -/**
    - * Format song information.
    - *
    - * @param title The title of the song, @c NULL to unset the value.
    - * @param artist The artist of the song, can be @c NULL.
    - * @param album The album of the song, can be @c NULL.
    - * @param unused Currently unused, must be @c NULL.
    - *
    - * @return The formatted string. The caller must g_free the returned string.
    - * @since 2.4.0
    - */
    -char * purple_util_format_song_info(const char *title, const char *artist,
    - const char *album, gpointer unused);
    -
    -/**************************************************************************/
    -/** @name Utility Subsystem */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Initializes the utility subsystem.
    - *
    - * @since 2.3.0
    - */
    -void purple_util_init(void);
    -
    -/**
    - * Uninitializes the util subsystem.
    - *
    - * @since 2.3.0
    - */
    -void purple_util_uninit(void);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Base16 Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Converts a chunk of binary data to its base-16 equivalent.
    - *
    - * @param data The data to convert.
    - * @param len The length of the data.
    - *
    - * @return The base-16 string in the ASCII encoding. Must be
    - * g_free'd when no longer needed.
    - *
    - * @see purple_base16_decode()
    - */
    -gchar *purple_base16_encode(const guchar *data, gsize len);
    -
    -/**
    - * Converts an ASCII string of base-16 encoded data to
    - * the binary equivalent.
    - *
    - * @param str The base-16 string to convert to raw data.
    - * @param ret_len The length of the returned data. You can
    - * pass in NULL if you're sure that you know
    - * the length of the decoded data, or if you
    - * know you'll be able to use strlen to
    - * determine the length, etc.
    - *
    - * @return The raw data. Must be g_free'd when no longer needed.
    - *
    - * @see purple_base16_encode()
    - */
    -guchar *purple_base16_decode(const char *str, gsize *ret_len);
    -
    -/**
    - * Converts a chunk of binary data to a chunked base-16 representation
    - * (handy for key fingerprints)
    - *
    - * Example output: 01:23:45:67:89:AB:CD:EF
    - *
    - * @param data The data to convert.
    - * @param len The length of the data.
    - *
    - * @return The base-16 string in the ASCII chunked encoding. Must be
    - * g_free'd when no longer needed.
    - */
    -gchar *purple_base16_encode_chunked(const guchar *data, gsize len);
    -
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Base64 Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Converts a chunk of binary data to its base-64 equivalent.
    - *
    - * @param data The data to convert.
    - * @param len The length of the data.
    - *
    - * @return The base-64 string in the ASCII encoding. Must be
    - * g_free'd when no longer needed.
    - *
    - * @see purple_base64_decode()
    - */
    -gchar *purple_base64_encode(const guchar *data, gsize len);
    -
    -/**
    - * Converts an ASCII string of base-64 encoded data to
    - * the binary equivalent.
    - *
    - * @param str The base-64 string to convert to raw data.
    - * @param ret_len The length of the returned data. You can
    - * pass in NULL if you're sure that you know
    - * the length of the decoded data, or if you
    - * know you'll be able to use strlen to
    - * determine the length, etc.
    - *
    - * @return The raw data. Must be g_free'd when no longer needed.
    - *
    - * @see purple_base64_encode()
    - */
    -guchar *purple_base64_decode(const char *str, gsize *ret_len);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name Quoted Printable Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Converts a quoted printable string back to its readable equivalent.
    - * What is a quoted printable string, you ask? It's an encoding used
    - * to transmit binary data as ASCII. It's intended purpose is to send
    - * emails containing non-ASCII characters. Wikipedia has a pretty good
    - * explanation. Also see RFC 2045.
    - *
    - * @param str The quoted printable ASCII string to convert to raw data.
    - * @param ret_len The length of the returned data.
    - *
    - * @return The readable string. Must be g_free'd when no longer needed.
    - */
    -guchar *purple_quotedp_decode(const char *str, gsize *ret_len);
    -
    -/*@}*/
    -
    -/**************************************************************************/
    -/** @name MIME Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Converts a MIME header field string back to its readable equivalent
    - * according to RFC 2047. Basically, a header is plain ASCII and can
    - * contain any number of sections called "encoded-words." The format
    - * of an encoded word is =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?=
    - * =? designates the beginning of the encoded-word
    - * ?= designates the end of the encoded-word
    - *
    - * An encoded word is segmented into three pieces by the use of a
    - * question mark. The first piece is the character set, the second
    - * piece is the encoding, and the third piece is the encoded text.
    - *
    - * @param str The ASCII string, possibly containing any number of
    - * encoded-word sections.
    - *
    - * @return The string, with any encoded-word sections decoded and
    - * converted to UTF-8. Must be g_free'd when no longer
    - * needed.
    - */
    -char *purple_mime_decode_field(const char *str);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Date/Time Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Formats a time into the specified format.
    - *
    - * This is essentially strftime(), but it has a static buffer
    - * and handles the UTF-8 conversion for the caller.
    - *
    - * This function also provides the GNU %z formatter if the underlying C
    - * library doesn't. However, the format string parser is very naive, which
    - * means that conversions specifiers to %z cannot be guaranteed. The GNU
    - * strftime(3) man page describes %z as: 'The time-zone as hour offset from
    - * GMT. Required to emit RFC822-conformant dates
    - * (using "%a, %d %b %Y %H:%M:%S %z"). (GNU)'
    - *
    - * On Windows, this function also converts the results for %Z from a timezone
    - * name (as returned by the system strftime() %Z format string) to a timezone
    - * abbreviation (as is the case on Unix). As with %z, conversion specifiers
    - * should not be used.
    - *
    - * @param format The format string, in UTF-8
    - * @param tm The time to format, or @c NULL to use the current local time
    - *
    - * @return The formatted time, in UTF-8.
    - *
    - * @note @a format is required to be in UTF-8. This differs from strftime(),
    - * where the format is provided in the locale charset.
    - */
    -const char *purple_utf8_strftime(const char *format, const struct tm *tm);
    -
    -/**
    - * Gets a string representation of the local timezone offset
    - *
    - * @param tm The time to get the timezone for
    - * @param iso TRUE to format the offset according to ISO-8601, FALSE to
    - * not substitute 'Z' for 0 offset, and to not separate
    - * hours and minutes with a colon.
    - */
    -const char *purple_get_tzoff_str(const struct tm *tm, gboolean iso);
    -
    -/**
    - * Formats a time into the user's preferred short date format.
    - *
    - * The returned string is stored in a static buffer, so the result
    - * should be g_strdup()'d if it's going to be kept.
    - *
    - * @param tm The time to format, or @c NULL to use the current local time
    - *
    - * @return The date, formatted as per the user's settings.
    - */
    -const char *purple_date_format_short(const struct tm *tm);
    -
    -/**
    - * Formats a time into the user's preferred short date plus time format.
    - *
    - * The returned string is stored in a static buffer, so the result
    - * should be g_strdup()'d if it's going to be kept.
    - *
    - * @param tm The time to format, or @c NULL to use the current local time
    - *
    - * @return The timestamp, formatted as per the user's settings.
    - */
    -const char *purple_date_format_long(const struct tm *tm);
    -
    -/**
    - * Formats a time into the user's preferred full date and time format.
    - *
    - * The returned string is stored in a static buffer, so the result
    - * should be g_strdup()'d if it's going to be kept.
    - *
    - * @param tm The time to format, or @c NULL to use the current local time
    - *
    - * @return The date and time, formatted as per the user's settings.
    - */
    -const char *purple_date_format_full(const struct tm *tm);
    -
    -/**
    - * Formats a time into the user's preferred time format.
    - *
    - * The returned string is stored in a static buffer, so the result
    - * should be g_strdup()'d if it's going to be kept.
    - *
    - * @param tm The time to format, or @c NULL to use the current local time
    - *
    - * @return The time, formatted as per the user's settings.
    - */
    -const char *purple_time_format(const struct tm *tm);
    -
    -/**
    - * Builds a time_t from the supplied information.
    - *
    - * @param year The year.
    - * @param month The month.
    - * @param day The day.
    - * @param hour The hour.
    - * @param min The minute.
    - * @param sec The second.
    - *
    - * @return A time_t.
    - */
    -time_t purple_time_build(int year, int month, int day, int hour,
    - int min, int sec);
    -
    -/** Used by purple_str_to_time to indicate no timezone offset was
    - * specified in the timestamp string. */
    -#define PURPLE_NO_TZ_OFF -500000
    -
    -/**
    - * Parses a timestamp in jabber, ISO8601, or MM/DD/YYYY format and returns
    - * a time_t.
    - *
    - * @param timestamp The timestamp
    - * @param utc Assume UTC if no timezone specified
    - * @param tm If not @c NULL, the caller can get a copy of the
    - * struct tm used to calculate the time_t return value.
    - * @param tz_off If not @c NULL, the caller can get a copy of the
    - * timezone offset (from UTC) used to calculate the time_t
    - * return value. Note: Zero is a valid offset. As such,
    - * the value of the macro @c PURPLE_NO_TZ_OFF indicates no
    - * offset was specified (which means that the local
    - * timezone was used in the calculation).
    - * @param rest If not @c NULL, the caller can get a pointer to the
    - * part of @a timestamp left over after parsing is
    - * completed, if it's not the end of @a timestamp.
    - *
    - * @return A time_t.
    - */
    -time_t purple_str_to_time(const char *timestamp, gboolean utc,
    - struct tm *tm, long *tz_off, const char **rest);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Markup Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Escapes special characters in a plain-text string so they display
    - * correctly as HTML. For example, & is replaced with &amp; and < is
    - * replaced with &lt;
    - *
    - * This is exactly the same as g_markup_escape_text(), except that it
    - * does not change ' to &apos; because &apos; is not a valid HTML 4 entity,
    - * and is displayed literally in IE7.
    - *
    - * @since 2.6.0
    - */
    -gchar *purple_markup_escape_text(const gchar *text, gssize length);
    -
    -/**
    - * Finds an HTML tag matching the given name.
    - *
    - * This locates an HTML tag's start and end, and stores its attributes
    - * in a GData hash table. The names of the attributes are lower-cased
    - * in the hash table, and the name of the tag is case insensitive.
    - *
    - * @param needle The name of the tag
    - * @param haystack The null-delimited string to search in
    - * @param start A pointer to the start of the tag if found
    - * @param end A pointer to the end of the tag if found
    - * @param attributes The attributes, if the tag was found. This should
    - * be freed with g_datalist_clear().
    - * @return TRUE if the tag was found
    - */
    -gboolean purple_markup_find_tag(const char *needle, const char *haystack,
    - const char **start, const char **end,
    - GData **attributes);
    -
    -/**
    - * Extracts a field of data from HTML.
    - *
    - * This is a scary function. See protocols/msn/msn.c and
    - * protocols/yahoo/yahoo_profile.c for example usage.
    - *
    - * @param str The string to parse.
    - * @param len The size of str.
    - * @param user_info The destination PurpleNotifyUserInfo to which the new
    - * field info should be added.
    - * @param start_token The beginning token.
    - * @param skip The number of characters to skip after the
    - * start token.
    - * @param end_token The ending token.
    - * @param check_value The value that the last character must meet.
    - * @param no_value_token The token indicating no value is given.
    - * @param display_name The short descriptive name to display for this token.
    - * @param is_link TRUE if this should be a link, or FALSE otherwise.
    - * @param link_prefix The prefix for the link.
    - * @param format_cb A callback to format the value before adding it.
    - *
    - * @return TRUE if successful, or FALSE otherwise.
    - */
    -gboolean purple_markup_extract_info_field(const char *str, int len, PurpleNotifyUserInfo *user_info,
    - const char *start_token, int skip,
    - const char *end_token, char check_value,
    - const char *no_value_token,
    - const char *display_name, gboolean is_link,
    - const char *link_prefix,
    - PurpleInfoFieldFormatCallback format_cb);
    -
    -/**
    - * Converts HTML markup to XHTML.
    - *
    - * @param html The HTML markup.
    - * @param dest_xhtml The destination XHTML output.
    - * @param dest_plain The destination plain-text output.
    - */
    -void purple_markup_html_to_xhtml(const char *html, char **dest_xhtml,
    - char **dest_plain);
    -
    -/**
    - * Strips HTML tags from a string.
    - *
    - * @param str The string to strip HTML from.
    - *
    - * @return The new string without HTML. You must g_free this string
    - * when finished with it.
    - */
    -char *purple_markup_strip_html(const char *str);
    -
    -/**
    - * Adds the necessary HTML code to turn URIs into HTML links in a string.
    - *
    - * @param str The string to linkify.
    - *
    - * @return The new string with all URIs surrounded in standard
    - * HTML <a href="whatever"></a> tags. You must g_free this
    - * string when finished with it.
    - */
    -char *purple_markup_linkify(const char *str);
    -
    -/**
    - * Unescapes HTML entities to their literal characters in the text.
    - * For example "&amp;" is replaced by '&' and so on. Also converts
    - * numerical entities (e.g. "&#38;" is also '&').
    - *
    - * This function currently supports the following named entities:
    - * "&amp;", "&lt;", "&gt;", "&copy;", "&quot;", "&reg;", "&apos;"
    - *
    - * purple_unescape_html() is similar, but also converts "<br>" into "\n".
    - *
    - * @param text The string in which to unescape any HTML entities
    - *
    - * @return The text with HTML entities literalized. You must g_free
    - * this string when finished with it.
    - *
    - * @see purple_unescape_html()
    - * @since 2.7.0
    - */
    -char *purple_unescape_text(const char *text);
    -
    -/**
    - * Unescapes HTML entities to their literal characters and converts
    - * "<br>" to "\n". See purple_unescape_text() for more details.
    - *
    - * @param html The string in which to unescape any HTML entities
    - *
    - * @return The text with HTML entities literalized. You must g_free
    - * this string when finished with it.
    - *
    - * @see purple_unescape_text()
    - */
    -char *purple_unescape_html(const char *html);
    -
    -/**
    - * Returns a newly allocated substring of the HTML UTF-8 string "str".
    - * The markup is preserved such that the substring will have the same
    - * formatting as original string, even though some tags may have been
    - * opened before "x", or may close after "y". All open tags are closed
    - * at the end of the returned string, in the proper order.
    - *
    - * Note that x and y are in character offsets, not byte offsets, and
    - * are offsets into an unformatted version of str. Because of this,
    - * this function may be sensitive to changes in GtkIMHtml and may break
    - * when used with other UI's. libpurple users are encouraged to report and
    - * work out any problems encountered.
    - *
    - * @param str The input NUL terminated, HTML, UTF-8 (or ASCII) string.
    - * @param x The character offset into an unformatted version of str to
    - * begin at.
    - * @param y The character offset (into an unformatted vesion of str) of
    - * one past the last character to include in the slice.
    - *
    - * @return The HTML slice of string, with all formatting retained.
    - */
    -char *purple_markup_slice(const char *str, guint x, guint y);
    -
    -/**
    - * Returns a newly allocated string containing the name of the tag
    - * located at "tag". Tag is expected to point to a '<', and contain
    - * a '>' sometime after that. If there is no '>' and the string is
    - * not NUL terminated, this function can be expected to segfault.
    - *
    - * @param tag The string starting a HTML tag.
    - * @return A string containing the name of the tag.
    - */
    -char *purple_markup_get_tag_name(const char *tag);
    -
    -/**
    - * Returns a constant string of the character representation of the HTML
    - * entity pointed to by @a text. For example, purple_markup_unescape_entity("&amp;")
    - * will return "&". The @a text variable is expected to point to an '&',
    - * the first character of the entity. If given an unrecognized entity, the function
    - * returns @c NULL.
    - *
    - * Note that this function, unlike purple_unescape_html(), does not search
    - * the string for the entity, does not replace the entity, and does not
    - * return a newly allocated string.
    - *
    - * @param text A string containing an HTML entity.
    - * @param length If not @c NULL, the string length of the entity is stored in this location.
    - *
    - * @return A constant string containing the character representation of the given entity.
    - */
    -const char * purple_markup_unescape_entity(const char *text, int *length);
    -
    -/**
    - * Returns a newly allocated string containing the value of the CSS property specified
    - * in opt. The @a style argument is expected to point to a HTML inline CSS.
    - * The function will seek for the CSS property and return its value.
    - *
    - * For example, purple_markup_get_css_property("direction:rtl;color:#dc4d1b;",
    - * "color") would return "#dc4d1b".
    - *
    - * On error or if the requested property was not found, the function returns
    - * @c NULL.
    - *
    - * @param style A string containing the inline CSS text.
    - * @param opt The requested CSS property.
    - *
    - * @return The value of the requested CSS property.
    - */
    -char * purple_markup_get_css_property(const gchar *style, const gchar *opt);
    -
    -/**
    - * Check if the given HTML contains RTL text.
    - *
    - * @param html The HTML text.
    - *
    - * @return TRUE if the text contains RTL text, FALSE otherwise.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_markup_is_rtl(const char *html);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Path/Filename Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Returns the user's home directory.
    - *
    - * @return The user's home directory.
    - *
    - * @see purple_user_dir()
    - */
    -const gchar *purple_home_dir(void);
    -
    -/**
    - * Returns the purple settings directory in the user's home directory.
    - * This is usually ~/.purple
    - *
    - * @return The purple settings directory.
    - *
    - * @see purple_home_dir()
    - */
    -const char *purple_user_dir(void);
    -
    -/**
    - * Define a custom purple settings directory, overriding the default (user's home directory/.purple)
    - * @param dir The custom settings directory
    - */
    -void purple_util_set_user_dir(const char *dir);
    -
    -/**
    - * Builds a complete path from the root, making any directories along
    - * the path which do not already exist.
    - *
    - * @param path The path you wish to create. Note that it must start
    - * from the root or this function will fail.
    - * @param mode Unix-style permissions for this directory.
    - *
    - * @return 0 for success, nonzero on any error.
    - */
    -int purple_build_dir(const char *path, int mode);
    -
    -/**
    - * Write a string of data to a file of the given name in the Purple
    - * user directory ($HOME/.purple by default). The data is typically
    - * a serialized version of one of Purple's config files, such as
    - * prefs.xml, accounts.xml, etc. And the string is typically
    - * obtained using xmlnode_to_formatted_str. However, this function
    - * should work fine for saving binary files as well.
    - *
    - * @param filename The basename of the file to write in the purple_user_dir.
    - * @param data A null-terminated string of data to write.
    - * @param size The size of the data to save. If data is
    - * null-terminated you can pass in -1.
    - *
    - * @return TRUE if the file was written successfully. FALSE otherwise.
    - */
    -gboolean purple_util_write_data_to_file(const char *filename, const char *data,
    - gssize size);
    -
    -/**
    - * Write data to a file using the absolute path.
    - *
    - * This exists for Glib backwards compatibility reasons.
    - *
    - * @param filename_full Filename to write to
    - * @param data A null-terminated string of data to write.
    - * @param size The size of the data to save. If data is
    - * null-terminated you can pass in -1.
    - *
    - * @return TRUE if the file was written successfully. FALSE otherwise.
    - *
    - * @todo Remove this function (use g_file_set_contents instead) when 3.0.0
    - * rolls around.
    - * @see purple_util_write_data_to_file()
    - *
    - */
    -gboolean
    -purple_util_write_data_to_file_absolute(const char *filename_full, const char *data, gssize size);
    -
    -/**
    - * Read the contents of a given file and parse the results into an
    - * xmlnode tree structure. This is intended to be used to read
    - * Purple's configuration xml files (prefs.xml, pounces.xml, etc.)
    - *
    - * @param filename The basename of the file to open in the purple_user_dir.
    - * @param description A very short description of the contents of this
    - * file. This is used in error messages shown to the
    - * user when the file can not be opened. For example,
    - * "preferences," or "buddy pounces."
    - *
    - * @return An xmlnode tree of the contents of the given file. Or NULL, if
    - * the file does not exist or there was an error reading the file.
    - */
    -xmlnode *purple_util_read_xml_from_file(const char *filename,
    - const char *description);
    -
    -/**
    - * Creates a temporary file and returns a file pointer to it.
    - *
    - * This is like mkstemp(), but returns a file pointer and uses a
    - * pre-set template. It uses the semantics of tempnam() for the
    - * directory to use and allocates the space for the file path.
    - *
    - * The caller is responsible for closing the file and removing it when
    - * done, as well as freeing the space pointed to by @a path with
    - * g_free().
    - *
    - * @param path The returned path to the temp file.
    - * @param binary Text or binary, for platforms where it matters.
    - *
    - * @return A file pointer to the temporary file, or @c NULL on failure.
    - */
    -FILE *purple_mkstemp(char **path, gboolean binary);
    -
    -/**
    - * Returns an extension corresponding to the image data's file type.
    - *
    - * @param data A pointer to the image data
    - * @param len The length of the image data
    - *
    - * @return The appropriate extension, or "icon" if unknown.
    - */
    -const char *
    -purple_util_get_image_extension(gconstpointer data, size_t len);
    -
    -/**
    - * Returns a SHA-1 hash string of the data passed in.
    - */
    -char *purple_util_get_image_checksum(gconstpointer image_data, size_t image_len);
    -
    -/**
    - * @return A hex encoded version of the SHA-1 hash of the data passed
    - * in with the correct file extention appended. The file
    - * extension is determined by calling
    - * purple_util_get_image_extension(). This return value must
    - * be g_freed by the caller.
    - */
    -char *purple_util_get_image_filename(gconstpointer image_data, size_t image_len);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name Environment Detection Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Checks if the given program name is valid and executable.
    - *
    - * @param program The file name of the application.
    - *
    - * @return TRUE if the program is runable.
    - */
    -gboolean purple_program_is_valid(const char *program);
    -
    -/**
    - * Check if running GNOME.
    - *
    - * @return TRUE if running GNOME, FALSE otherwise.
    - */
    -gboolean purple_running_gnome(void);
    -
    -/**
    - * Check if running KDE.
    - *
    - * @return TRUE if running KDE, FALSE otherwise.
    - */
    -gboolean purple_running_kde(void);
    -
    -/**
    - * Check if running OS X.
    - *
    - * @return TRUE if running OS X, FALSE otherwise.
    - */
    -gboolean purple_running_osx(void);
    -
    -/**
    - * Returns the IP address from a socket file descriptor.
    - *
    - * @param fd The socket file descriptor.
    - *
    - * @return The IP address, or @c NULL on error.
    - */
    -char *purple_fd_get_ip(int fd);
    -
    -/**
    - * Returns the address family of a socket.
    - *
    - * @param fd The socket file descriptor.
    - *
    - * @return The address family of the socket (AF_INET, AF_INET6, etc) or -1
    - * on error.
    - * @since 2.7.0
    - */
    -int purple_socket_get_family(int fd);
    -
    -/**
    - * Returns TRUE if a socket is capable of speaking IPv4.
    - *
    - * This is the case for IPv4 sockets and, on some systems, IPv6 sockets
    - * (due to the IPv4-mapped address functionality).
    - *
    - * @param fd The socket file descriptor
    - * @return TRUE if a socket can speak IPv4.
    - * @since 2.7.0
    - */
    -gboolean purple_socket_speaks_ipv4(int fd);
    -
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name String Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -/**
    - * Tests two strings for equality.
    - *
    - * Unlike strcmp(), this function will not crash if one or both of the
    - * strings are @c NULL.
    - *
    - * @param left A string
    - * @param right A string to compare with left
    - *
    - * @return @c TRUE if the strings are the same, else @c FALSE.
    - *
    - * @since 2.6.0
    - */
    -gboolean purple_strequal(const gchar *left, const gchar *right);
    -
    -/**
    - * Normalizes a string, so that it is suitable for comparison.
    - *
    - * The returned string will point to a static buffer, so if the
    - * string is intended to be kept long-term, you <i>must</i>
    - * g_strdup() it. Also, calling normalize() twice in the same line
    - * will lead to problems.
    - *
    - * @param account The account the string belongs to, or NULL if you do
    - * not know the account. If you use NULL, the string
    - * will still be normalized, but if the PRPL uses a
    - * custom normalization function then the string may
    - * not be normalized correctly.
    - * @param str The string to normalize.
    - *
    - * @return A pointer to the normalized version stored in a static buffer.
    - */
    -const char *purple_normalize(const PurpleAccount *account, const char *str);
    -
    -/**
    - * Normalizes a string, so that it is suitable for comparison.
    - *
    - * This is one possible implementation for the PRPL callback
    - * function "normalize." It returns a lowercase and UTF-8
    - * normalized version of the string.
    - *
    - * @param account The account the string belongs to.
    - * @param str The string to normalize.
    - *
    - * @return A pointer to the normalized version stored in a static buffer.
    - */
    -const char *purple_normalize_nocase(const PurpleAccount *account, const char *str);
    -
    -/**
    - * Compares two strings to see if the first contains the second as
    - * a proper prefix.
    - *
    - * @param s The string to check.
    - * @param p The prefix in question.
    - *
    - * @return TRUE if p is a prefix of s, otherwise FALSE.
    - */
    -gboolean purple_str_has_prefix(const char *s, const char *p);
    -
    -/**
    - * Compares two strings to see if the second is a proper suffix
    - * of the first.
    - *
    - * @param s The string to check.
    - * @param x The suffix in question.
    - *
    - * @return TRUE if x is a a suffix of s, otherwise FALSE.
    - */
    -gboolean purple_str_has_suffix(const char *s, const char *x);
    -
    -/**
    - * Duplicates a string and replaces all newline characters from the
    - * source string with HTML linebreaks.
    - *
    - * @param src The source string.
    - *
    - * @return The new string. Must be g_free'd by the caller.
    - */
    -gchar *purple_strdup_withhtml(const gchar *src);
    -
    -/**
    - * Ensures that all linefeeds have a matching carriage return.
    - *
    - * @param str The source string.
    - *
    - * @return The string with carriage returns.
    - */
    -char *purple_str_add_cr(const char *str);
    -
    -/**
    - * Strips all instances of the given character from the
    - * given string. The string is modified in place. This
    - * is useful for stripping new line characters, for example.
    - *
    - * Example usage:
    - * purple_str_strip_char(my_dumb_string, '\n');
    - *
    - * @param str The string to strip characters from.
    - * @param thechar The character to strip from the given string.
    - */
    -void purple_str_strip_char(char *str, char thechar);
    -
    -/**
    - * Given a string, this replaces all instances of one character
    - * with another. This happens inline (the original string IS
    - * modified).
    - *
    - * @param string The string from which to replace stuff.
    - * @param delimiter The character you want replaced.
    - * @param replacement The character you want inserted in place
    - * of the delimiting character.
    - */
    -void purple_util_chrreplace(char *string, char delimiter,
    - char replacement);
    -
    -/**
    - * Given a string, this replaces one substring with another
    - * and returns a newly allocated string.
    - *
    - * @param string The string from which to replace stuff.
    - * @param delimiter The substring you want replaced.
    - * @param replacement The substring you want inserted in place
    - * of the delimiting substring.
    - *
    - * @return A new string, after performing the substitution.
    - * free this with g_free().
    - */
    -gchar *purple_strreplace(const char *string, const char *delimiter,
    - const char *replacement);
    -
    -
    -/**
    - * Given a string, this replaces any utf-8 substrings in that string with
    - * the corresponding numerical character reference, and returns a newly
    - * allocated string.
    - *
    - * @param in The string which might contain utf-8 substrings
    - *
    - * @return A new string, with utf-8 replaced with numerical character
    - * references, free this with g_free()
    -*/
    -char *purple_utf8_ncr_encode(const char *in);
    -
    -
    -/**
    - * Given a string, this replaces any numerical character references
    - * in that string with the corresponding actual utf-8 substrings,
    - * and returns a newly allocated string.
    - *
    - * @param in The string which might contain numerical character references.
    - *
    - * @return A new string, with numerical character references
    - * replaced with actual utf-8, free this with g_free().
    - */
    -char *purple_utf8_ncr_decode(const char *in);
    -
    -
    -/**
    - * Given a string, this replaces one substring with another
    - * ignoring case and returns a newly allocated string.
    - *
    - * @param string The string from which to replace stuff.
    - * @param delimiter The substring you want replaced.
    - * @param replacement The substring you want inserted in place
    - * of the delimiting substring.
    - *
    - * @return A new string, after performing the substitution.
    - * free this with g_free().
    - */
    -gchar *purple_strcasereplace(const char *string, const char *delimiter,
    - const char *replacement);
    -
    -/**
    - * This is like strstr, except that it ignores ASCII case in
    - * searching for the substring.
    - *
    - * @param haystack The string to search in.
    - * @param needle The substring to find.
    - *
    - * @return the location of the substring if found, or NULL if not
    - */
    -const char *purple_strcasestr(const char *haystack, const char *needle);
    -
    -/**
    - * Returns a string representing a filesize in the appropriate
    - * units (MB, KB, GB, etc.)
    - *
    - * @param size The size
    - *
    - * @return The string in units form. This must be freed.
    - */
    -char *purple_str_size_to_units(size_t size);
    -
    -/**
    - * Converts seconds into a human-readable form.
    - *
    - * @param sec The seconds.
    - *
    - * @return A human-readable form, containing days, hours, minutes, and
    - * seconds.
    - */
    -char *purple_str_seconds_to_string(guint sec);
    -
    -/**
    - * Converts a binary string into a NUL terminated ascii string,
    - * replacing nonascii characters and characters below SPACE (including
    - * NUL) into \\xyy, where yy are two hex digits. Also backslashes are
    - * changed into two backslashes (\\\\). The returned, newly allocated
    - * string can be outputted to the console, and must be g_free()d.
    - *
    - * @param binary A string of random data, possibly with embedded NULs
    - * and such.
    - * @param len The length in bytes of the input string. Must not be 0.
    - *
    - * @return A newly allocated ASCIIZ string.
    - */
    -char *purple_str_binary_to_ascii(const unsigned char *binary, guint len);
    -/*@}*/
    -
    -
    -/**************************************************************************/
    -/** @name URI/URL Functions */
    -/**************************************************************************/
    -/*@{*/
    -
    -void purple_got_protocol_handler_uri(const char *uri);
    -
    -/**
    - * Parses a URL, returning its host, port, file path, username and password.
    - *
    - * The returned data must be freed.
    - *
    - * @param url The URL to parse.
    - * @param ret_host The returned host.
    - * @param ret_port The returned port.
    - * @param ret_path The returned path.
    - * @param ret_user The returned username.
    - * @param ret_passwd The returned password.
    - */
    -gboolean purple_url_parse(const char *url, char **ret_host, int *ret_port,
    - char **ret_path, char **ret_user, char **ret_passwd);
    -
    -/**
    - * This is the signature used for functions that act as the callback
    - * to purple_util_fetch_url() or purple_util_fetch_url_request().
    - *
    - * @param url_data The same value that was returned when you called
    - * purple_fetch_url() or purple_fetch_url_request().
    - * @param user_data The user data that your code passed into either
    - * purple_util_fetch_url() or purple_util_fetch_url_request().
    - * @param url_text This will be NULL on error. Otherwise this
    - * will contain the contents of the URL.
    - * @param len 0 on error, otherwise this is the length of buf.
    - * @param error_message If something went wrong then this will contain
    - * a descriptive error message, and buf will be
    - * NULL and len will be 0.
    - */
    -typedef void (*PurpleUtilFetchUrlCallback)(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message);
    -
    -/**
    - * Fetches the data from a URL, and passes it to a callback function.
    - *
    - * @param url The URL.
    - * @param full TRUE if this is the full URL, or FALSE if it's a
    - * partial URL.
    - * @param user_agent The user agent field to use, or NULL.
    - * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    - * @param cb The callback function.
    - * @param data The user data to pass to the callback function.
    - */
    -#define purple_util_fetch_url(url, full, user_agent, http11, cb, data) \
    - purple_util_fetch_url_request(url, full, user_agent, http11, NULL, \
    - FALSE, cb, data);
    -
    -/**
    - * Fetches the data from a URL, and passes it to a callback function.
    - *
    - * @param url The URL.
    - * @param full TRUE if this is the full URL, or FALSE if it's a
    - * partial URL.
    - * @param user_agent The user agent field to use, or NULL.
    - * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    - * @param max_len The maximum number of bytes to retrieve (-1 for unlimited)
    - * @param cb The callback function.
    - * @param data The user data to pass to the callback function.
    - * @deprecated In 3.0.0, we'll rename this to "purple_util_fetch_url" and get rid of the old one
    - */
    -#define purple_util_fetch_url_len(url, full, user_agent, http11, max_len, cb, data) \
    - purple_util_fetch_url_request_len(url, full, user_agent, http11, NULL, \
    - FALSE, max_len, cb, data);
    -
    -/**
    - * Fetches the data from a URL, and passes it to a callback function.
    - *
    - * @param url The URL.
    - * @param full TRUE if this is the full URL, or FALSE if it's a
    - * partial URL.
    - * @param user_agent The user agent field to use, or NULL.
    - * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    - * @param request A HTTP request to send to the server instead of the
    - * standard GET
    - * @param include_headers
    - * If TRUE, include the HTTP headers in the response.
    - * @param callback The callback function.
    - * @param data The user data to pass to the callback function.
    - */
    -PurpleUtilFetchUrlData *purple_util_fetch_url_request(const gchar *url,
    - gboolean full, const gchar *user_agent, gboolean http11,
    - const gchar *request, gboolean include_headers,
    - PurpleUtilFetchUrlCallback callback, gpointer data);
    -
    -/**
    - * Fetches the data from a URL, and passes it to a callback function.
    - *
    - * @param url The URL.
    - * @param full TRUE if this is the full URL, or FALSE if it's a
    - * partial URL.
    - * @param user_agent The user agent field to use, or NULL.
    - * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    - * @param request A HTTP request to send to the server instead of the
    - * standard GET
    - * @param include_headers
    - * If TRUE, include the HTTP headers in the response.
    - * @param max_len The maximum number of bytes to retrieve (-1 for unlimited)
    - * @param callback The callback function.
    - * @param data The user data to pass to the callback function.
    - * @deprecated In 3.0.0, this will go away.
    - */
    -PurpleUtilFetchUrlData *purple_util_fetch_url_request_len(const gchar *url,
    - gboolean full, const gchar *user_agent, gboolean http11,
    - const gchar *request, gboolean include_headers, gssize max_len,
    - PurpleUtilFetchUrlCallback callback, gpointer data);
    -
    -/**
    - * Fetches the data from a URL, and passes it to a callback function.
    - *
    - * @param account The account for which the request is needed, or NULL.
    - * @param url The URL.
    - * @param full TRUE if this is the full URL, or FALSE if it's a
    - * partial URL.
    - * @param user_agent The user agent field to use, or NULL.
    - * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    - * @param request A HTTP request to send to the server instead of the
    - * standard GET
    - * @param include_headers
    - * If TRUE, include the HTTP headers in the response.
    - * @param max_len The maximum number of bytes to retrieve, or a negative
    - * number to use the default max of 512 KiB.
    - * @param callback The callback function.
    - * @param data The user data to pass to the callback function.
    - * @deprecated In 3.0.0, we'll rename this to "purple_util_fetch_url_request" and get rid of the old one
    - */
    -PurpleUtilFetchUrlData *purple_util_fetch_url_request_len_with_account(
    - PurpleAccount *account, const gchar *url,
    - gboolean full, const gchar *user_agent, gboolean http11,
    - const gchar *request, gboolean include_headers, gssize max_len,
    - PurpleUtilFetchUrlCallback callback, gpointer data);
    -
    -/**
    - * Cancel a pending URL request started with either
    - * purple_util_fetch_url_request() or purple_util_fetch_url().
    - *
    - * @param url_data The data returned when you initiated the URL fetch.
    - */
    -void purple_util_fetch_url_cancel(PurpleUtilFetchUrlData *url_data);
    -
    -/**
    - * Decodes a URL into a plain string.
    - *
    - * This will change hex codes and such to their ascii equivalents.
    - *
    - * @param str The string to translate.
    - *
    - * @return The resulting string.
    - */
    -const char *purple_url_decode(const char *str);
    -
    -/**
    - * Encodes a URL into an escaped string.
    - *
    - * This will change non-alphanumeric characters to hex codes.
    - *
    - * @param str The string to translate.
    - *
    - * @return The resulting string.
    - */
    -const char *purple_url_encode(const char *str);
    -
    -/**
    - * Checks if the given email address is syntactically valid.
    - *
    - * @param address The email address to validate.
    - *
    - * @return True if the email address is syntactically correct.
    - */
    -gboolean purple_email_is_valid(const char *address);
    -
    -/**
    - * Checks if the given IP address is a syntactically valid IPv4 address.
    - *
    - * @param ip The IP address to validate.
    - *
    - * @return True if the IP address is syntactically correct.
    - * @deprecated This function will be replaced with one that validates
    - * as either IPv4 or IPv6 in 3.0.0. If you don't want this,
    - * behavior, use one of the more specific functions.
    - */
    -gboolean purple_ip_address_is_valid(const char *ip);
    -
    -/**
    - * Checks if the given IP address is a syntactically valid IPv4 address.
    - *
    - * @param ip The IP address to validate.
    - *
    - * @return True if the IP address is syntactically correct.
    - * @since 2.6.0
    - */
    -gboolean purple_ipv4_address_is_valid(const char *ip);
    -
    -/**
    - * Checks if the given IP address is a syntactically valid IPv6 address.
    - *
    - * @param ip The IP address to validate.
    - *
    - * @return True if the IP address is syntactically correct.
    - * @since 2.6.0
    - */
    -gboolean purple_ipv6_address_is_valid(const char *ip);
    -
    -/**
    - * This function extracts a list of URIs from the a "text/uri-list"
    - * string. It was "borrowed" from gnome_uri_list_extract_uris
    - *
    - * @param uri_list An uri-list in the standard format.
    - *
    - * @return A GList containing strings allocated with g_malloc
    - * that have been splitted from uri-list.
    - */
    -GList *purple_uri_list_extract_uris(const gchar *uri_list);
    -
    -/**
    - * This function extracts a list of filenames from a
    - * "text/uri-list" string. It was "borrowed" from
    - * gnome_uri_list_extract_filenames
    - *
    - * @param uri_list A uri-list in the standard format.
    - *
    - * @return A GList containing strings allocated with g_malloc that
    - * contain the filenames in the uri-list. Note that unlike
    - * purple_uri_list_extract_uris() function, this will discard
    - * any non-file uri from the result value.
    - */
    -GList *purple_uri_list_extract_filenames(const gchar *uri_list);
    -
    -/*@}*/
    -
    -/**************************************************************************
    - * UTF8 String Functions
    - **************************************************************************/
    -/*@{*/
    -
    -/**
    - * Attempts to convert a string to UTF-8 from an unknown encoding.
    - *
    - * This function checks the locale and tries sane defaults.
    - *
    - * @param str The source string.
    - *
    - * @return The UTF-8 string, or @c NULL if it could not be converted.
    - */
    -gchar *purple_utf8_try_convert(const char *str);
    -
    -/**
    - * Salvages the valid UTF-8 characters from a string, replacing any
    - * invalid characters with a filler character (currently hardcoded to
    - * '?').
    - *
    - * @param str The source string.
    - *
    - * @return A valid UTF-8 string.
    - */
    -gchar *purple_utf8_salvage(const char *str);
    -
    -/**
    - * Removes unprintable characters from a UTF-8 string. These characters
    - * (in particular low-ASCII characters) are invalid in XML 1.0 and thus
    - * are not allowed in XMPP and are rejected by libxml2 by default.
    - *
    - * The returned string must be freed by the caller.
    - *
    - * @param str A valid UTF-8 string.
    - *
    - * @return A newly allocated UTF-8 string without the unprintable characters.
    - * @since 2.6.0
    - */
    -gchar *purple_utf8_strip_unprintables(const gchar *str);
    -
    -/**
    - * Return the UTF-8 version of gai_strerror(). It calls gai_strerror()
    - * then converts the result to UTF-8. This function is analogous to
    - * g_strerror().
    - *
    - * @param errnum The error code.
    - *
    - * @return The UTF-8 error message.
    - * @since 2.4.0
    - */
    -G_CONST_RETURN gchar *purple_gai_strerror(gint errnum);
    -
    -/**
    - * Compares two UTF-8 strings case-insensitively. This comparison is
    - * more expensive than a simple g_utf8_collate() comparison because
    - * it calls g_utf8_casefold() on each string, which allocates new
    - * strings.
    - *
    - * @param a The first string.
    - * @param b The second string.
    - *
    - * @return -1 if @a is less than @a b.
    - * 0 if @a is equal to @a b.
    - * 1 if @a is greater than @a b.
    - */
    -int purple_utf8_strcasecmp(const char *a, const char *b);
    -
    -/**
    - * Case insensitive search for a word in a string. The needle string
    - * must be contained in the haystack string and not be immediately
    - * preceded or immediately followed by another alpha-numeric character.
    - *
    - * @param haystack The string to search in.
    - * @param needle The substring to find.
    - *
    - * @return TRUE if haystack has the word, otherwise FALSE
    - */
    -gboolean purple_utf8_has_word(const char *haystack, const char *needle);
    -
    -/**
    - * Prints a UTF-8 message to the given file stream. The function
    - * tries to convert the UTF-8 message to user's locale. If this
    - * is not possible, the original UTF-8 text will be printed.
    - *
    - * @param filestream The file stream (e.g. STDOUT or STDERR)
    - * @param message The message to print.
    - */
    -void purple_print_utf8_to_console(FILE *filestream, char *message);
    -
    -/**
    - * Checks for messages starting (post-HTML) with "/me ", including the space.
    - *
    - * @param message The message to check
    - * @param len The message length, or -1
    - *
    - * @return TRUE if it starts with "/me ", and it has been removed, otherwise
    - * FALSE
    - */
    -gboolean purple_message_meify(char *message, gssize len);
    -
    -/**
    - * Removes the underscore characters from a string used identify the mnemonic
    - * character.
    - *
    - * @param in The string to strip
    - *
    - * @return The stripped string
    - */
    -char *purple_text_strip_mnemonic(const char *in);
    -
    -/*@}*/
    -
    -/**
    - * Adds 8 to something.
    - *
    - * Blame SimGuy.
    - *
    - * @param x The number to add 8 to.
    - *
    - * @return x + 8
    - */
    -#define purple_add_eight(x) ((x)+8)
    -
    -/**
    - * Does the reverse of purple_escape_filename
    - *
    - * This will change hex codes and such to their ascii equivalents.
    - *
    - * @param str The string to translate.
    - *
    - * @return The resulting string.
    - */
    -const char *purple_unescape_filename(const char *str);
    -
    -/**
    - * Escapes filesystem-unfriendly characters from a filename
    - *
    - * @param str The string to translate.
    - *
    - * @return The resulting string.
    - */
    -const char *purple_escape_filename(const char *str);
    -
    -/**
    - * This is added temporarily to assist the split of oscar into aim and icq.
    - * This should not be used by plugins.
    - *
    - * @deprecated This function should not be used in new code and should be
    - * removed in 3.0.0. The aim/icq prpl split happened a long
    - * time ago, and we don't need to keep migrating old data.
    - */
    -const char *_purple_oscar_convert(const char *act, const char *protocol);
    -
    -/**
    - * Restore default signal handlers for signals which might reasonably have
    - * handlers. This should be called by a fork()'d child process, since child processes
    - * inherit the handlers of the parent.
    - */
    -void purple_restore_default_signal_handlers(void);
    -
    -/**
    - * Gets the host name of the machine. If it not possible to determine the
    - * host name, "localhost" is returned
    - *
    - * @constreturn The hostname
    - */
    -const gchar *purple_get_host_name(void);
    -
    -/**
    - * Returns a type 4 (random) UUID
    - *
    - * @return A UUID, caller is responsible for freeing it
    - * @since 2.7.0
    - */
    -gchar *purple_uuid_random(void);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_UTIL_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/value.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,504 +0,0 @@
    -/**
    - * @file value.h Value wrapper 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
    - */
    -#ifndef _PURPLE_VALUE_H_
    -#define _PURPLE_VALUE_H_
    -
    -#include <glib.h>
    -
    -/**
    - * Specific value types.
    - */
    -typedef enum
    -{
    - PURPLE_TYPE_UNKNOWN = 0, /**< Unknown type. */
    - PURPLE_TYPE_SUBTYPE, /**< Subtype. */
    - PURPLE_TYPE_CHAR, /**< Character. */
    - PURPLE_TYPE_UCHAR, /**< Unsigned character. */
    - PURPLE_TYPE_BOOLEAN, /**< Boolean. */
    - PURPLE_TYPE_SHORT, /**< Short integer. */
    - PURPLE_TYPE_USHORT, /**< Unsigned short integer. */
    - PURPLE_TYPE_INT, /**< Integer. */
    - PURPLE_TYPE_UINT, /**< Unsigned integer. */
    - PURPLE_TYPE_LONG, /**< Long integer. */
    - PURPLE_TYPE_ULONG, /**< Unsigned long integer. */
    - PURPLE_TYPE_INT64, /**< 64-bit integer. */
    - PURPLE_TYPE_UINT64, /**< 64-bit unsigned integer. */
    - PURPLE_TYPE_STRING, /**< String. */
    - PURPLE_TYPE_OBJECT, /**< Object pointer. */
    - PURPLE_TYPE_POINTER, /**< Generic pointer. */
    - PURPLE_TYPE_ENUM, /**< Enum. */
    - PURPLE_TYPE_BOXED /**< Boxed pointer with specific type. */
    -
    -} PurpleType;
    -
    -
    -/**
    - * Purple-specific subtype values.
    - */
    -typedef enum
    -{
    - PURPLE_SUBTYPE_UNKNOWN = 0,
    - PURPLE_SUBTYPE_ACCOUNT,
    - PURPLE_SUBTYPE_BLIST,
    - PURPLE_SUBTYPE_BLIST_BUDDY,
    - PURPLE_SUBTYPE_BLIST_GROUP,
    - PURPLE_SUBTYPE_BLIST_CHAT,
    - PURPLE_SUBTYPE_BUDDY_ICON,
    - PURPLE_SUBTYPE_CONNECTION,
    - PURPLE_SUBTYPE_CONVERSATION,
    - PURPLE_SUBTYPE_PLUGIN,
    - PURPLE_SUBTYPE_BLIST_NODE,
    - PURPLE_SUBTYPE_CIPHER,
    - PURPLE_SUBTYPE_STATUS,
    - PURPLE_SUBTYPE_LOG,
    - PURPLE_SUBTYPE_XFER,
    - PURPLE_SUBTYPE_SAVEDSTATUS,
    - PURPLE_SUBTYPE_XMLNODE,
    - PURPLE_SUBTYPE_USERINFO,
    - PURPLE_SUBTYPE_STORED_IMAGE,
    - PURPLE_SUBTYPE_CERTIFICATEPOOL,
    - PURPLE_SUBTYPE_CHATBUDDY
    -} PurpleSubType;
    -
    -/**
    - * A wrapper for a type, subtype, and specific type of value.
    - */
    -typedef struct
    -{
    - PurpleType type;
    - unsigned short flags;
    -
    - union
    - {
    - char char_data;
    - unsigned char uchar_data;
    - gboolean boolean_data;
    - short short_data;
    - unsigned short ushort_data;
    - int int_data;
    - unsigned int uint_data;
    - long long_data;
    - unsigned long ulong_data;
    - gint64 int64_data;
    - guint64 uint64_data;
    - char *string_data;
    - void *object_data;
    - void *pointer_data;
    - int enum_data;
    - void *boxed_data;
    -
    - } data;
    -
    - union
    - {
    - unsigned int subtype;
    - char *specific_type;
    -
    - } u;
    -
    -} PurpleValue;
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Creates a new PurpleValue.
    - *
    - * This function takes a type and, depending on that type, a sub-type
    - * or specific type.
    - *
    - * If @a type is PURPLE_TYPE_BOXED, the next parameter must be a
    - * string representing the specific type.
    - *
    - * If @a type is PURPLE_TYPE_SUBTYPE, the next parameter must be a
    - * integer or enum representing the sub-type.
    - *
    - * If the subtype or specific type is not set when required, random
    - * errors may occur. You have been warned.
    - *
    - * @param type The type.
    - *
    - * @return The new value.
    - */
    -PurpleValue *purple_value_new(PurpleType type, ...);
    -
    -/**
    - * Creates a new outgoing PurpleValue. If a value is an "outgoing" value
    - * it means the value can be modified by plugins and scripts.
    - *
    - * This function takes a type and, depending on that type, a sub-type
    - * or specific type.
    - *
    - * If @a type is PURPLE_TYPE_BOXED, the next parameter must be a
    - * string representing the specific type.
    - *
    - * If @a type is PURPLE_TYPE_SUBTYPE, the next parameter must be a
    - * integer or enum representing the sub-type.
    - *
    - * If the sub-type or specific type is not set when required, random
    - * errors may occur. You have been warned.
    - *
    - * @param type The type.
    - *
    - * @return The new value.
    - */
    -PurpleValue *purple_value_new_outgoing(PurpleType type, ...);
    -
    -/**
    - * Destroys a PurpleValue.
    - *
    - * @param value The value to destroy.
    - */
    -void purple_value_destroy(PurpleValue *value);
    -
    -/**
    - * Duplicated a PurpleValue.
    - *
    - * @param value The value to duplicate.
    - *
    - * @return The duplicate value.
    - */
    -PurpleValue *purple_value_dup(const PurpleValue *value);
    -
    -/**
    - * Returns a value's type.
    - *
    - * @param value The value whose type you want.
    - *
    - * @return The value's type.
    - */
    -PurpleType purple_value_get_type(const PurpleValue *value);
    -
    -/**
    - * Returns a value's subtype.
    - *
    - * If the value's type is not PURPLE_TYPE_SUBTYPE, this will return 0.
    - * Subtypes should never have a subtype of 0.
    - *
    - * @param value The value whose subtype you want.
    - *
    - * @return The value's subtype, or 0 if @a type is not PURPLE_TYPE_SUBTYPE.
    - */
    -unsigned int purple_value_get_subtype(const PurpleValue *value);
    -
    -/**
    - * Returns a value's specific type.
    - *
    - * If the value's type is not PURPLE_TYPE_BOXED, this will return @c NULL.
    - *
    - * @param value The value whose specific type you want.
    - *
    - * @return The value's specific type, or @a NULL if not PURPLE_TYPE_BOXED.
    - */
    -const char *purple_value_get_specific_type(const PurpleValue *value);
    -
    -/**
    - * Returns whether or not the value is an outgoing value.
    - *
    - * @param value The value.
    - *
    - * @return TRUE if the value is outgoing, or FALSE otherwise.
    - */
    -gboolean purple_value_is_outgoing(const PurpleValue *value);
    -
    -/**
    - * Sets the value's character data.
    - *
    - * @param value The value.
    - * @param data The character data.
    - */
    -void purple_value_set_char(PurpleValue *value, char data);
    -
    -/**
    - * Sets the value's unsigned character data.
    - *
    - * @param value The value.
    - * @param data The unsigned character data.
    - */
    -void purple_value_set_uchar(PurpleValue *value, unsigned char data);
    -
    -/**
    - * Sets the value's boolean data.
    - *
    - * @param value The value.
    - * @param data The boolean data.
    - */
    -void purple_value_set_boolean(PurpleValue *value, gboolean data);
    -
    -/**
    - * Sets the value's short integer data.
    - *
    - * @param value The value.
    - * @param data The short integer data.
    - */
    -void purple_value_set_short(PurpleValue *value, short data);
    -
    -/**
    - * Sets the value's unsigned short integer data.
    - *
    - * @param value The value.
    - * @param data The unsigned short integer data.
    - */
    -void purple_value_set_ushort(PurpleValue *value, unsigned short data);
    -
    -/**
    - * Sets the value's integer data.
    - *
    - * @param value The value.
    - * @param data The integer data.
    - */
    -void purple_value_set_int(PurpleValue *value, int data);
    -
    -/**
    - * Sets the value's unsigned integer data.
    - *
    - * @param value The value.
    - * @param data The unsigned integer data.
    - */
    -void purple_value_set_uint(PurpleValue *value, unsigned int data);
    -
    -/**
    - * Sets the value's long integer data.
    - *
    - * @param value The value.
    - * @param data The long integer data.
    - */
    -void purple_value_set_long(PurpleValue *value, long data);
    -
    -/**
    - * Sets the value's unsigned long integer data.
    - *
    - * @param value The value.
    - * @param data The unsigned long integer data.
    - */
    -void purple_value_set_ulong(PurpleValue *value, unsigned long data);
    -
    -/**
    - * Sets the value's 64-bit integer data.
    - *
    - * @param value The value.
    - * @param data The 64-bit integer data.
    - */
    -void purple_value_set_int64(PurpleValue *value, gint64 data);
    -
    -/**
    - * Sets the value's unsigned 64-bit integer data.
    - *
    - * @param value The value.
    - * @param data The unsigned 64-bit integer data.
    - */
    -void purple_value_set_uint64(PurpleValue *value, guint64 data);
    -
    -/**
    - * Sets the value's string data.
    - *
    - * @param value The value.
    - * @param data The string data.
    - */
    -void purple_value_set_string(PurpleValue *value, const char *data);
    -
    -/**
    - * Sets the value's object data.
    - *
    - * @param value The value.
    - * @param data The object data.
    - */
    -void purple_value_set_object(PurpleValue *value, void *data);
    -
    -/**
    - * Sets the value's pointer data.
    - *
    - * @param value The value.
    - * @param data The pointer data.
    - */
    -void purple_value_set_pointer(PurpleValue *value, void *data);
    -
    -/**
    - * Sets the value's enum data.
    - *
    - * @param value The value.
    - * @param data The enum data.
    - */
    -void purple_value_set_enum(PurpleValue *value, int data);
    -
    -/**
    - * Sets the value's boxed data.
    - *
    - * @param value The value.
    - * @param data The boxed data.
    - */
    -void purple_value_set_boxed(PurpleValue *value, void *data);
    -
    -/**
    - * Returns the value's character data.
    - *
    - * @param value The value.
    - *
    - * @return The character data.
    - */
    -char purple_value_get_char(const PurpleValue *value);
    -
    -/**
    - * Returns the value's unsigned character data.
    - *
    - * @param value The value.
    - *
    - * @return The unsigned character data.
    - */
    -unsigned char purple_value_get_uchar(const PurpleValue *value);
    -
    -/**
    - * Returns the value's boolean data.
    - *
    - * @param value The value.
    - *
    - * @return The boolean data.
    - */
    -gboolean purple_value_get_boolean(const PurpleValue *value);
    -
    -/**
    - * Returns the value's short integer data.
    - *
    - * @param value The value.
    - *
    - * @return The short integer data.
    - */
    -short purple_value_get_short(const PurpleValue *value);
    -
    -/**
    - * Returns the value's unsigned short integer data.
    - *
    - * @param value The value.
    - *
    - * @return The unsigned short integer data.
    - */
    -unsigned short purple_value_get_ushort(const PurpleValue *value);
    -
    -/**
    - * Returns the value's integer data.
    - *
    - * @param value The value.
    - *
    - * @return The integer data.
    - */
    -int purple_value_get_int(const PurpleValue *value);
    -
    -/**
    - * Returns the value's unsigned integer data.
    - *
    - * @param value The value.
    - *
    - * @return The unsigned integer data.
    - */
    -unsigned int purple_value_get_uint(const PurpleValue *value);
    -
    -/**
    - * Returns the value's long integer data.
    - *
    - * @param value The value.
    - *
    - * @return The long integer data.
    - */
    -long purple_value_get_long(const PurpleValue *value);
    -
    -/**
    - * Returns the value's unsigned long integer data.
    - *
    - * @param value The value.
    - *
    - * @return The unsigned long integer data.
    - */
    -unsigned long purple_value_get_ulong(const PurpleValue *value);
    -
    -/**
    - * Returns the value's 64-bit integer data.
    - *
    - * @param value The value.
    - *
    - * @return The 64-bit integer data.
    - */
    -gint64 purple_value_get_int64(const PurpleValue *value);
    -
    -/**
    - * Returns the value's unsigned 64-bit integer data.
    - *
    - * @param value The value.
    - *
    - * @return The unsigned 64-bit integer data.
    - */
    -guint64 purple_value_get_uint64(const PurpleValue *value);
    -
    -/**
    - * Returns the value's string data.
    - *
    - * @param value The value.
    - *
    - * @return The string data.
    - */
    -const char *purple_value_get_string(const PurpleValue *value);
    -
    -/**
    - * Returns the value's object data.
    - *
    - * @param value The value.
    - *
    - * @return The object data.
    - */
    -void *purple_value_get_object(const PurpleValue *value);
    -
    -/**
    - * Returns the value's pointer data.
    - *
    - * @param value The value.
    - *
    - * @return The pointer data.
    - */
    -void *purple_value_get_pointer(const PurpleValue *value);
    -
    -/**
    - * Returns the value's enum data.
    - *
    - * @param value The value.
    - *
    - * @return The enum data.
    - */
    -int purple_value_get_enum(const PurpleValue *value);
    -
    -/**
    - * Returns the value's boxed data.
    - *
    - * @param value The value.
    - *
    - * @return The boxed data.
    - */
    -void *purple_value_get_boxed(const PurpleValue *value);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_VALUE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/version.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,88 +0,0 @@
    -/**
    - * @file version.h Purple Versioning
    - *
    - * 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
    - */
    -#ifndef _PURPLE_VERSION_H_
    -#define _PURPLE_VERSION_H_
    -
    -/** The major version of the running libpurple. */
    -#define PURPLE_MAJOR_VERSION (2)
    -/** The minor version of the running libpurple. */
    -#define PURPLE_MINOR_VERSION (10)
    -/** The micro version of the running libpurple. */
    -#define PURPLE_MICRO_VERSION (12)
    -
    -#define PURPLE_VERSION_CHECK(x,y,z) ((x) == PURPLE_MAJOR_VERSION && \
    - ((y) < PURPLE_MINOR_VERSION || \
    - ((y) == PURPLE_MINOR_VERSION && (z) <= PURPLE_MICRO_VERSION)))
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * Checks that the libpurple version is compatible with the requested
    - * version
    - *
    - * @param required_major: the required major version.
    - * @param required_minor: the required minor version.
    - * @param required_micro: the required micro version.
    - *
    - * @return NULL if the versions are compatible, or a string describing
    - * the version mismatch if not compatible.
    - */
    -const char *purple_version_check(guint required_major, guint required_minor, guint required_micro);
    -
    -/**
    - * The major version of the running libpurple. Contrast with
    - * #PURPLE_MAJOR_VERSION, which expands at compile time to the major version of
    - * libpurple being compiled against.
    - *
    - * @since 2.4.0
    - */
    -extern const guint purple_major_version;
    -
    -/**
    - * The minor version of the running libpurple. Contrast with
    - * #PURPLE_MINOR_VERSION, which expands at compile time to the minor version of
    - * libpurple being compiled against.
    - *
    - * @since 2.4.0
    - */
    -extern const guint purple_minor_version;
    -
    -/**
    - *
    - * The micro version of the running libpurple. Contrast with
    - * #PURPLE_MICRO_VERSION, which expands at compile time to the micro version of
    - * libpurple being compiled against.
    - *
    - * @since 2.4.0
    - */
    -extern const guint purple_micro_version;
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_VERSION_H_ */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/whiteboard.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,262 +0,0 @@
    -/**
    - * @file whiteboard.h The PurpleWhiteboard core object
    - */
    -
    -/* 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
    - */
    -
    -#ifndef _PURPLE_WHITEBOARD_H_
    -#define _PURPLE_WHITEBOARD_H_
    -
    -/**
    - * Whiteboard PRPL Operations
    - */
    -typedef struct _PurpleWhiteboardPrplOps PurpleWhiteboardPrplOps;
    -
    -#include "account.h"
    -
    -/**
    - * A PurpleWhiteboard
    - */
    -typedef struct _PurpleWhiteboard
    -{
    - int state; /**< State of whiteboard session */
    -
    - PurpleAccount *account; /**< Account associated with this session */
    - char *who; /**< Name of the remote user */
    -
    - void *ui_data; /**< Graphical user-interface data */
    - void *proto_data; /**< Protocol specific data */
    - PurpleWhiteboardPrplOps *prpl_ops; /**< Protocol-plugin operations */
    -
    - GList *draw_list; /**< List of drawing elements/deltas to send */
    -} PurpleWhiteboard;
    -
    -/**
    - * The PurpleWhiteboard UI Operations
    - */
    -typedef struct _PurpleWhiteboardUiOps
    -{
    - void (*create)(PurpleWhiteboard *wb); /**< create function */
    - void (*destroy)(PurpleWhiteboard *wb); /**< destory function */
    - void (*set_dimensions)(PurpleWhiteboard *wb, int width, int height); /**< set_dimensions function */
    - void (*set_brush) (PurpleWhiteboard *wb, int size, int color); /**< set the size and color of the brush */
    - void (*draw_point)(PurpleWhiteboard *wb, int x, int y,
    - int color, int size); /**< draw_point function */
    - void (*draw_line)(PurpleWhiteboard *wb, int x1, int y1,
    - int x2, int y2,
    - int color, int size); /**< draw_line function */
    - void (*clear)(PurpleWhiteboard *wb); /**< clear function */
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -} PurpleWhiteboardUiOps;
    -
    -/**
    - * PurpleWhiteboard PRPL Operations
    - */
    -struct _PurpleWhiteboardPrplOps
    -{
    - void (*start)(PurpleWhiteboard *wb); /**< start function */
    - void (*end)(PurpleWhiteboard *wb); /**< end function */
    - void (*get_dimensions)(const PurpleWhiteboard *wb, int *width, int *height); /**< get_dimensions function */
    - void (*set_dimensions)(PurpleWhiteboard *wb, int width, int height); /**< set_dimensions function */
    - void (*get_brush) (const PurpleWhiteboard *wb, int *size, int *color); /**< get the brush size and color */
    - void (*set_brush) (PurpleWhiteboard *wb, int size, int color); /**< set the brush size and color */
    - void (*send_draw_list)(PurpleWhiteboard *wb, GList *draw_list); /**< send_draw_list function */
    - void (*clear)(PurpleWhiteboard *wb); /**< clear function */
    -
    - void (*_purple_reserved1)(void);
    - void (*_purple_reserved2)(void);
    - void (*_purple_reserved3)(void);
    - void (*_purple_reserved4)(void);
    -};
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif /* __cplusplus */
    -
    -/******************************************************************************/
    -/** @name PurpleWhiteboard API */
    -/******************************************************************************/
    -/*@{*/
    -
    -/**
    - * Sets the UI operations
    - *
    - * @param ops The UI operations to set
    - */
    -void purple_whiteboard_set_ui_ops(PurpleWhiteboardUiOps *ops);
    -
    -/**
    - * Sets the prpl operations for a whiteboard
    - *
    - * @param wb The whiteboard for which to set the prpl operations
    - * @param ops The prpl operations to set
    - */
    -void purple_whiteboard_set_prpl_ops(PurpleWhiteboard *wb, PurpleWhiteboardPrplOps *ops);
    -
    -/**
    - * Creates a whiteboard
    - *
    - * @param account The account.
    - * @param who Who you're drawing with.
    - * @param state The state.
    - *
    - * @return The new whiteboard
    - */
    -PurpleWhiteboard *purple_whiteboard_create(PurpleAccount *account, const char *who, int state);
    -
    -/**
    - * Destroys a whiteboard
    - *
    - * @param wb The whiteboard.
    - */
    -void purple_whiteboard_destroy(PurpleWhiteboard *wb);
    -
    -/**
    - * Starts a whiteboard
    - *
    - * @param wb The whiteboard.
    - */
    -void purple_whiteboard_start(PurpleWhiteboard *wb);
    -
    -/**
    - * Finds a whiteboard from an account and user.
    - *
    - * @param account The account.
    - * @param who The user.
    - *
    - * @return The whiteboard if found, otherwise @c NULL.
    - */
    -PurpleWhiteboard *purple_whiteboard_get_session(const PurpleAccount *account, const char *who);
    -
    -/**
    - * Destorys a drawing list for a whiteboard
    - *
    - * @param draw_list The drawing list.
    - */
    -void purple_whiteboard_draw_list_destroy(GList *draw_list);
    -
    -/**
    - * Gets the dimension of a whiteboard.
    - *
    - * @param wb The whiteboard.
    - * @param width The width to be set.
    - * @param height The height to be set.
    - *
    - * @return TRUE if the values of width and height were set.
    - */
    -gboolean purple_whiteboard_get_dimensions(const PurpleWhiteboard *wb, int *width, int *height);
    -
    -/**
    - * Sets the dimensions for a whiteboard.
    - *
    - * @param wb The whiteboard.
    - * @param width The width.
    - * @param height The height.
    - */
    -void purple_whiteboard_set_dimensions(PurpleWhiteboard *wb, int width, int height);
    -
    -/**
    - * Draws a point on a whiteboard.
    - *
    - * @param wb The whiteboard.
    - * @param x The x coordinate.
    - * @param y The y coordinate.
    - * @param color The color to use.
    - * @param size The brush size.
    - */
    -void purple_whiteboard_draw_point(PurpleWhiteboard *wb, int x, int y, int color, int size);
    -
    -/**
    - * Send a list of points to draw to the buddy.
    - *
    - * @param wb The whiteboard
    - * @param list A GList of points
    - */
    -void purple_whiteboard_send_draw_list(PurpleWhiteboard *wb, GList *list);
    -
    -/**
    - * Draws a line on a whiteboard
    - *
    - * @param wb The whiteboard.
    - * @param x1 The top-left x coordinate.
    - * @param y1 The top-left y coordinate.
    - * @param x2 The bottom-right x coordinate.
    - * @param y2 The bottom-right y coordinate.
    - * @param color The color to use.
    - * @param size The brush size.
    - */
    -void purple_whiteboard_draw_line(PurpleWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size);
    -
    -/**
    - * Clears a whiteboard
    - *
    - * @param wb The whiteboard.
    - */
    -void purple_whiteboard_clear(PurpleWhiteboard *wb);
    -
    -/**
    - * Sends a request to the buddy to clear the whiteboard.
    - *
    - * @param wb The whiteboard
    - */
    -void purple_whiteboard_send_clear(PurpleWhiteboard *wb);
    -
    -/**
    - * Sends a request to change the size and color of the brush.
    - *
    - * @param wb The whiteboard
    - * @param size The size of the brush
    - * @param color The color of the brush
    - */
    -void purple_whiteboard_send_brush(PurpleWhiteboard *wb, int size, int color);
    -
    -/**
    - * Gets the size and color of the brush.
    - *
    - * @param wb The whiteboard
    - * @param size The size of the brush
    - * @param color The color of the brush
    - *
    - * @return TRUE if the size and color were set.
    - */
    -gboolean purple_whiteboard_get_brush(const PurpleWhiteboard *wb, int *size, int *color);
    -
    -/**
    - * Sets the size and color of the brush.
    - *
    - * @param wb The whiteboard
    - * @param size The size of the brush
    - * @param color The color of the brush
    - */
    -void purple_whiteboard_set_brush(PurpleWhiteboard *wb, int size, int color);
    -
    -/*@}*/
    -
    -#ifdef __cplusplus
    -}
    -#endif /* __cplusplus */
    -
    -#endif /* _PURPLE_WHITEBOARD_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/xfer.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,67 +0,0 @@
    -/**
    - * @file xfer.h MSN File Transfer functions
    - *
    - * 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
    - */
    -
    -#ifndef MSN_XFER_H
    -#define MSN_XFER_H
    -
    -#include "slpcall.h"
    -
    -#define MAX_FILE_NAME_LEN 260 /* MAX_PATH in Windows */
    -
    -/**
    - * The context data for a file transfer request
    - */
    -typedef struct
    -{
    - guint32 length; /*< Length of header */
    - guint32 version; /*< MSN version */
    - guint64 file_size; /*< Size of file */
    - guint32 type; /*< Transfer type */
    - gunichar2 file_name[MAX_FILE_NAME_LEN]; /*< Self-explanatory */
    - gchar unknown1[30]; /*< Used somehow for background sharing */
    - guint32 unknown2; /*< Possibly for background sharing as well */
    - gchar *preview; /*< File preview data, 96x96 PNG */
    - gsize preview_len;
    -} MsnFileContext;
    -
    -#define MSN_FILE_CONTEXT_SIZE (4*4 + 1*8 + 2*MAX_FILE_NAME_LEN + 30)
    -
    -void msn_xfer_init(PurpleXfer *xfer);
    -void msn_xfer_cancel(PurpleXfer *xfer);
    -
    -gssize msn_xfer_write(const guchar *data, gsize len, PurpleXfer *xfer);
    -gssize msn_xfer_read(guchar **data, PurpleXfer *xfer);
    -
    -void msn_xfer_completed_cb(MsnSlpCall *slpcall,
    - const guchar *body, gsize size);
    -void msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session);
    -
    -gchar *
    -msn_file_context_to_wire(MsnFileContext *context);
    -
    -MsnFileContext *
    -msn_file_context_from_wire(const char *buf, gsize len);
    -
    -#endif /* MSN_XFER_H */
    -
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/xmlnode.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,397 +0,0 @@
    -/**
    - * @file xmlnode.h XML DOM functions
    - * @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
    - */
    -#ifndef _PURPLE_XMLNODE_H_
    -#define _PURPLE_XMLNODE_H_
    -
    -#include <glib.h>
    -
    -#ifdef __cplusplus
    -extern "C" {
    -#endif
    -
    -/**
    - * The valid types for an xmlnode
    - */
    -typedef enum _XMLNodeType
    -{
    - XMLNODE_TYPE_TAG, /**< Just a tag */
    - XMLNODE_TYPE_ATTRIB, /**< Has attributes */
    - XMLNODE_TYPE_DATA /**< Has data */
    -} XMLNodeType;
    -
    -/**
    - * An xmlnode.
    - */
    -typedef struct _xmlnode xmlnode;
    -struct _xmlnode
    -{
    - char *name; /**< The name of the node. */
    - char *xmlns; /**< The namespace of the node */
    - XMLNodeType type; /**< The type of the node. */
    - char *data; /**< The data for the node. */
    - size_t data_sz; /**< The size of the data. */
    - xmlnode *parent; /**< The parent node or @c NULL.*/
    - xmlnode *child; /**< The child node or @c NULL.*/
    - xmlnode *lastchild; /**< The last child node or @c NULL.*/
    - xmlnode *next; /**< The next node or @c NULL. */
    - char *prefix; /**< The namespace prefix if any. */
    - GHashTable *namespace_map; /**< The namespace map. */
    -};
    -
    -/**
    - * Creates a new xmlnode.
    - *
    - * @param name The name of the node.
    - *
    - * @return The new node.
    - */
    -xmlnode *xmlnode_new(const char *name);
    -
    -/**
    - * Creates a new xmlnode child.
    - *
    - * @param parent The parent node.
    - * @param name The name of the child node.
    - *
    - * @return The new child node.
    - */
    -xmlnode *xmlnode_new_child(xmlnode *parent, const char *name);
    -
    -/**
    - * Inserts a node into a node as a child.
    - *
    - * @param parent The parent node to insert child into.
    - * @param child The child node to insert into parent.
    - */
    -void xmlnode_insert_child(xmlnode *parent, xmlnode *child);
    -
    -/**
    - * Gets a child node named name.
    - *
    - * @param parent The parent node.
    - * @param name The child's name.
    - *
    - * @return The child or NULL.
    - */
    -xmlnode *xmlnode_get_child(const xmlnode *parent, const char *name);
    -
    -/**
    - * Gets a child node named name in a namespace.
    - *
    - * @param parent The parent node.
    - * @param name The child's name.
    - * @param xmlns The namespace.
    - *
    - * @return The child or NULL.
    - */
    -xmlnode *xmlnode_get_child_with_namespace(const xmlnode *parent, const char *name, const char *xmlns);
    -
    -/**
    - * Gets the next node with the same name as node.
    - *
    - * @param node The node of a twin to find.
    - *
    - * @return The twin of node or NULL.
    - */
    -xmlnode *xmlnode_get_next_twin(xmlnode *node);
    -
    -/**
    - * Inserts data into a node.
    - *
    - * @param node The node to insert data into.
    - * @param data The data to insert.
    - * @param size The size of the data to insert. If data is
    - * null-terminated you can pass in -1.
    - */
    -void xmlnode_insert_data(xmlnode *node, const char *data, gssize size);
    -
    -/**
    - * Gets (escaped) data from a node.
    - *
    - * @param node The node to get data from.
    - *
    - * @return The data from the node or NULL. This data is in raw escaped format.
    - * You must g_free this string when finished using it.
    - */
    -char *xmlnode_get_data(const xmlnode *node);
    -
    -/**
    - * Gets unescaped data from a node.
    - *
    - * @param node The node to get data from.
    - *
    - * @return The data from the node, in unescaped form. You must g_free
    - * this string when finished using it.
    - */
    -char *xmlnode_get_data_unescaped(const xmlnode *node);
    -
    -/**
    - * Sets an attribute for a node.
    - *
    - * @param node The node to set an attribute for.
    - * @param attr The name of the attribute.
    - * @param value The value of the attribute.
    - */
    -void xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value);
    -
    -#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_XMLNODE_C_)
    -/**
    - * Sets a prefixed attribute for a node
    - *
    - * @param node The node to set an attribute for.
    - * @param attr The name of the attribute to set
    - * @param prefix The prefix of the attribute to ste
    - * @param value The value of the attribute
    - *
    - * @deprecated Use xmlnode_set_attrib_full instead.
    - */
    -void xmlnode_set_attrib_with_prefix(xmlnode *node, const char *attr, const char *prefix, const char *value);
    -
    -/**
    - * Sets a namespaced attribute for a node
    - *
    - * @param node The node to set an attribute for.
    - * @param attr The name of the attribute to set
    - * @param xmlns The namespace of the attribute to ste
    - * @param value The value of the attribute
    - *
    - * @deprecated Use xmlnode_set_attrib_full instead.
    - */
    -void xmlnode_set_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns, const char *value);
    -#endif /* PURPLE_DISABLE_DEPRECATED */
    -
    -/**
    - * Sets a namespaced attribute for a node
    - *
    - * @param node The node to set an attribute for.
    - * @param attr The name of the attribute to set
    - * @param xmlns The namespace of the attribute to ste
    - * @param prefix The prefix of the attribute to ste
    - * @param value The value of the attribute
    - *
    - * @since 2.6.0
    - */
    -void xmlnode_set_attrib_full(xmlnode *node, const char *attr, const char *xmlns,
    - const char *prefix, const char *value);
    -
    -/**
    - * Gets an attribute from a node.
    - *
    - * @param node The node to get an attribute from.
    - * @param attr The attribute to get.
    - *
    - * @return The value of the attribute.
    - */
    -const char *xmlnode_get_attrib(const xmlnode *node, const char *attr);
    -
    -/**
    - * Gets a namespaced attribute from a node
    - *
    - * @param node The node to get an attribute from.
    - * @param attr The attribute to get
    - * @param xmlns The namespace of the attribute to get
    - *
    - * @return The value of the attribute/
    - */
    -const char *xmlnode_get_attrib_with_namespace(const xmlnode *node, const char *attr, const char *xmlns);
    -
    -/**
    - * Removes an attribute from a node.
    - *
    - * @param node The node to remove an attribute from.
    - * @param attr The attribute to remove.
    - */
    -void xmlnode_remove_attrib(xmlnode *node, const char *attr);
    -
    -/**
    - * Removes a namespaced attribute from a node
    - *
    - * @param node The node to remove an attribute from
    - * @param attr The attribute to remove
    - * @param xmlns The namespace of the attribute to remove
    - */
    -void xmlnode_remove_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns);
    -
    -/**
    - * Sets the namespace of a node
    - *
    - * @param node The node to qualify
    - * @param xmlns The namespace of the node
    - */
    -void xmlnode_set_namespace(xmlnode *node, const char *xmlns);
    -
    -/**
    - * Returns the namespace of a node
    - *
    - * @param node The node to get the namepsace from
    - * @return The namespace of this node
    - */
    -const char *xmlnode_get_namespace(const xmlnode *node);
    -
    -/**
    - * Returns the current default namespace. The default
    - * namespace is the current namespace which applies to child
    - * elements which are unprefixed and which do not contain their
    - * own namespace.
    - *
    - * For example, given:
    - * <iq type='get' xmlns='jabber:client' xmlns:ns1='http://example.org/ns1'>
    - * <ns1:element><child1/></ns1:element>
    - * </iq>
    - *
    - * The default namespace of all nodes (including 'child1') is "jabber:client",
    - * though the namespace for 'element' is "http://example.org/ns1".
    - *
    - * @param node The node for which to return the default namespace
    - * @return The default namespace of this node
    - */
    -const char *xmlnode_get_default_namespace(const xmlnode *node);
    -
    -/**
    - * Returns the defined namespace for a prefix.
    - *
    - * @param node The node from which to start the search.
    - * @param prefix The prefix for which to return the associated namespace.
    - * @return The namespace for this prefix.
    - */
    -const char *xmlnode_get_prefix_namespace(const xmlnode *node, const char *prefix);
    -
    -/**
    - * Sets the prefix of a node
    - *
    - * @param node The node to qualify
    - * @param prefix The prefix of the node
    - */
    -void xmlnode_set_prefix(xmlnode *node, const char *prefix);
    -
    -/**
    - * Returns the prefix of a node
    - *
    - * @param node The node to get the prefix from
    - * @return The prefix of this node
    - */
    -const char *xmlnode_get_prefix(const xmlnode *node);
    -
    -/**
    - * Remove all element prefixes from an xmlnode tree. The prefix's
    - * namespace is transformed into the default namespace for an element.
    - *
    - * Note that this will not necessarily remove all prefixes in use
    - * (prefixed attributes may still exist), and that this usage may
    - * break some applications (SOAP / XPath apparently often rely on
    - * the prefixes having the same name.
    - *
    - * @param node The node from which to strip prefixes
    - */
    -void xmlnode_strip_prefixes(xmlnode *node);
    -
    -/**
    - * Gets the parent node.
    - *
    - * @param child The child node.
    - *
    - * @return The parent or NULL.
    - *
    - * @since 2.6.0
    - */
    -xmlnode *xmlnode_get_parent(const xmlnode *child);
    -
    -/**
    - * Returns the node in a string of xml.
    - *
    - * @param node The starting node to output.
    - * @param len Address for the size of the string.
    - *
    - * @return The node represented as a string. You must
    - * g_free this string when finished using it.
    - */
    -char *xmlnode_to_str(const xmlnode *node, int *len);
    -
    -/**
    - * Returns the node in a string of human readable xml.
    - *
    - * @param node The starting node to output.
    - * @param len Address for the size of the string.
    - *
    - * @return The node as human readable string including
    - * tab and new line characters. You must
    - * g_free this string when finished using it.
    - */
    -char *xmlnode_to_formatted_str(const xmlnode *node, int *len);
    -
    -/**
    - * Creates a node from a string of XML. Calling this on the
    - * root node of an XML document will parse the entire document
    - * into a tree of nodes, and return the xmlnode of the root.
    - *
    - * @param str The string of xml.
    - * @param size The size of the string, or -1 if @a str is
    - * NUL-terminated.
    - *
    - * @return The new node.
    - */
    -xmlnode *xmlnode_from_str(const char *str, gssize size);
    -
    -/**
    - * Creates a new node from the source node.
    - *
    - * @param src The node to copy.
    - *
    - * @return A new copy of the src node.
    - */
    -xmlnode *xmlnode_copy(const xmlnode *src);
    -
    -/**
    - * Frees a node and all of its children.
    - *
    - * @param node The node to free.
    - */
    -void xmlnode_free(xmlnode *node);
    -
    -/**
    - * Creates a node from a XML File. Calling this on the
    - * root node of an XML document will parse the entire document
    - * into a tree of nodes, and return the xmlnode of the root.
    - *
    - * @param dir The directory where the file is located
    - * @param filename The filename
    - * @param description A description of the file being parsed. Displayed to
    - * the user if the file cannot be read.
    - * @param process The subsystem that is calling xmlnode_from_file. Used as
    - * the category for debugging.
    - *
    - * @return The new node or NULL if an error occurred.
    - *
    - * @since 2.6.0
    - */
    -xmlnode *xmlnode_from_file(const char *dir, const char *filename,
    - const char *description, const char *process);
    -
    -#ifdef __cplusplus
    -}
    -#endif
    -
    -#endif /* _PURPLE_XMLNODE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_aliases.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,41 +0,0 @@
    -/*
    - * 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 "accountopt.h"
    -#include "blist.h"
    -#include "debug.h"
    -#include "util.h"
    -#include "version.h"
    -#include "libymsg.h"
    -#include "yahoo_packet.h"
    -
    -void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias);
    -void yahoo_fetch_aliases(PurpleConnection *gc);
    -void yahoo_set_userinfo(PurpleConnection *gc);
    -void yahoo_set_userinfo_for_buddy(PurpleConnection *gc, PurpleBuddy *buddy);
    -void yahoo_personal_details_reset(YahooPersonalDetails *ypd, gboolean all);
    -void yahoo_process_contact_details(PurpleConnection *gc, struct yahoo_packet *pkt);
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_doodle.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,131 +0,0 @@
    -/**
    - * @file yahoo_doodle.h The Yahoo! protocol plugin Doodle IMVironment object
    - *
    - * 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
    - */
    -
    -#ifndef _YAHOO_DOODLE_H_
    -#define _YAHOO_DOODLE_H_
    -
    -/******************************************************************************
    - * Includes
    - *****************************************************************************/
    -#include "whiteboard.h"
    -#include "cmds.h"
    -
    -#define DOODLE_IMV_KEY "doodle;106"
    -
    -/******************************************************************************
    - * Defines
    - *****************************************************************************/
    -/* Doodle communication commands */
    -/* TODO: Should be an enum. */
    -#define DOODLE_CMD_REQUEST 0
    -#define DOODLE_CMD_CLEAR 1
    -#define DOODLE_CMD_DRAW 2
    -#define DOODLE_CMD_EXTRA 3
    -#define DOODLE_CMD_READY 4
    -#define DOODLE_CMD_CONFIRM 5
    -/* Doodle communication command for shutting down (also 0) */
    -#define DOODLE_CMD_SHUTDOWN 0
    -
    -#define DOODLE_EXTRA_NONE "\"1\""
    -#define DOODLE_EXTRA_TICTACTOE "\"3\""
    -#define DOODLE_EXTRA_DOTS "\"2\""
    -
    -/* Doodle session states */
    -/* TODO: Should be an enum. */
    -#define DOODLE_STATE_REQUESTING 0
    -#define DOODLE_STATE_REQUESTED 1
    -#define DOODLE_STATE_ESTABLISHED 2
    -#define DOODLE_STATE_CANCELLED 3
    -
    -/* Doodle canvas dimensions */
    -#define DOODLE_CANVAS_WIDTH 368
    -#define DOODLE_CANVAS_HEIGHT 256
    -
    -/* Doodle color codes (most likely RGB) */
    -/* TODO: Should be an enum and sorted by color name. */
    -#define DOODLE_COLOR_RED 13369344
    -#define DOODLE_COLOR_ORANGE 16737792
    -#define DOODLE_COLOR_YELLOW 15658496
    -#define DOODLE_COLOR_GREEN 52224
    -#define DOODLE_COLOR_CYAN 52428
    -#define DOODLE_COLOR_BLUE 204
    -#define DOODLE_COLOR_VIOLET 5381277
    -#define DOODLE_COLOR_PURPLE 13369548
    -#define DOODLE_COLOR_TAN 12093547
    -#define DOODLE_COLOR_BROWN 5256485
    -#define DOODLE_COLOR_BLACK 0
    -#define DOODLE_COLOR_GREY 11184810
    -#define DOODLE_COLOR_WHITE 16777215
    -
    -#define PALETTE_NUM_OF_COLORS 12
    -
    -/* Doodle brush sizes (most likely variable) */
    -#define DOODLE_BRUSH_SMALL 2
    -#define DOODLE_BRUSH_MEDIUM 5
    -#define DOODLE_BRUSH_LARGE 10
    -
    -#define DOODLE_MAX_BRUSH_MOTIONS 100
    -
    -/******************************************************************************
    - * Datatypes
    - *****************************************************************************/
    -typedef struct _doodle_session
    -{
    - int brush_size; /* Size of drawing brush */
    - int brush_color; /* Color of drawing brush */
    - gchar *imv_key;
    -} doodle_session;
    -
    -/******************************************************************************
    - * API
    - *****************************************************************************/
    -
    -PurpleCmdRet yahoo_doodle_purple_cmd_start(PurpleConversation *conv, const char *cmd, char **args,
    - char **error, void *data);
    -
    -void yahoo_doodle_process(PurpleConnection *gc, const char *me, const char *from,
    - const char *command, const char *message, const char *imv_key);
    -void yahoo_doodle_initiate(PurpleConnection *gc, const char *to);
    -
    -void yahoo_doodle_command_got_shutdown(PurpleConnection *gc, const char *from);
    -
    -void yahoo_doodle_command_send_request(PurpleConnection *gc, const char *to, const char *imv_key);
    -void yahoo_doodle_command_send_ready(PurpleConnection *gc, const char *to, const char *imv_key);
    -void yahoo_doodle_command_send_draw(PurpleConnection *gc, const char *to, const char *message, const char *imv_key);
    -void yahoo_doodle_command_send_clear(PurpleConnection *gc, const char *to, const char *imv_key);
    -void yahoo_doodle_command_send_extra(PurpleConnection *gc, const char *to, const char *message, const char *imv_key);
    -void yahoo_doodle_command_send_confirm(PurpleConnection *gc, const char *to, const char *imv_key);
    -void yahoo_doodle_command_send_shutdown(PurpleConnection *gc, const char *to);
    -
    -void yahoo_doodle_start(PurpleWhiteboard *wb);
    -void yahoo_doodle_end(PurpleWhiteboard *wb);
    -void yahoo_doodle_get_dimensions(const PurpleWhiteboard *wb, int *width, int *height);
    -void yahoo_doodle_send_draw_list(PurpleWhiteboard *wb, GList *draw_list);
    -void yahoo_doodle_clear(PurpleWhiteboard *wb);
    -
    -void yahoo_doodle_draw_stroke(PurpleWhiteboard *wb, GList *draw_list);
    -void yahoo_doodle_get_brush(const PurpleWhiteboard *wb, int *size, int *color);
    -void yahoo_doodle_set_brush(PurpleWhiteboard *wb, int size, int color);
    -
    -#endif /* _YAHOO_DOODLE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_filexfer.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,70 +0,0 @@
    -/*
    - * 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
    - */
    -#ifndef _YAHOO_FILEXFER_H_
    -#define _YAHOO_FILEXFER_H_
    -
    -#include "ft.h"
    -
    -/**
    - * Process ymsg events, particular IMViroments like Doodle
    - */
    -void yahoo_process_p2pfilexfer( PurpleConnection *gc, struct yahoo_packet *pkt );
    -
    -/**
    - * Process ymsg file receive invites.
    - */
    -void yahoo_process_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -/**
    - * Create a new PurpleXfer
    - *
    - * @param gc The PurpleConnection handle.
    - * @param who Who will we be sending it to?
    - */
    -PurpleXfer *yahoo_new_xfer(PurpleConnection *gc, const char *who);
    -
    -/**
    - * Returns TRUE if the buddy can receive file, FALSE otherwise.
    - * Federated users cannot receive files. So this will return FALSE only
    - * for them.
    - *
    - * @param gc The connection
    - * @param who The name of the remote user
    - *
    - * @return TRUE or FALSE
    - */
    -gboolean yahoo_can_receive_file(PurpleConnection *gc, const char *who);
    -
    -/**
    - * Send a file.
    - *
    - * @param gc The PurpleConnection handle.
    - * @param who Who are we sending it to?
    - * @param file What file? If NULL, user will choose after this call.
    - */
    -void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file);
    -
    -void yahoo_process_filetrans_15(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_filetrans_acc_15(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -#endif
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_friend.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,93 +0,0 @@
    -/**
    - * @file yahoo_friend.h The Yahoo! protocol plugin YahooFriend object
    - *
    - * 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
    - */
    -
    -#ifndef _YAHOO_FRIEND_H_
    -#define _YAHOO_FRIEND_H_
    -
    -#include "libymsg.h"
    -#include "yahoo_packet.h"
    -
    -typedef enum {
    - YAHOO_PRESENCE_DEFAULT = 0,
    - YAHOO_PRESENCE_ONLINE,
    - YAHOO_PRESENCE_PERM_OFFLINE
    -} YahooPresenceVisibility;
    -
    -typedef enum {
    - YAHOO_P2PSTATUS_NOT_CONNECTED = 0,
    - YAHOO_P2PSTATUS_DO_NOT_CONNECT,
    - YAHOO_P2PSTATUS_WE_ARE_SERVER,
    - YAHOO_P2PSTATUS_WE_ARE_CLIENT
    -} YahooP2PStatus;
    -
    -
    -/* these are called friends instead of buddies mainly so I can use variables
    - * named f and not confuse them with variables named b
    - */
    -typedef struct _YahooFriend {
    - enum yahoo_status status;
    - gchar *msg;
    - gchar *game;
    - int idle;
    - int away;
    - gboolean sms;
    - gchar *ip;
    - gboolean bicon_sent_request;
    - YahooPresenceVisibility presence;
    - YahooFederation fed;
    - long int version_id;
    - YahooPersonalDetails ypd;
    - YahooP2PStatus p2p_status;
    - gboolean p2p_packet_sent; /* 0:not sent, 1=sent */
    - gint session_id; /* session id of friend */
    -} YahooFriend;
    -
    -YahooFriend *yahoo_friend_find(PurpleConnection *gc, const char *name);
    -YahooFriend *yahoo_friend_find_or_new(PurpleConnection *gc, const char *name);
    -
    -void yahoo_friend_set_ip(YahooFriend *f, const char *ip);
    -const char *yahoo_friend_get_ip(YahooFriend *f);
    -
    -void yahoo_friend_set_game(YahooFriend *f, const char *game);
    -const char *yahoo_friend_get_game(YahooFriend *f);
    -
    -void yahoo_friend_set_status_message(YahooFriend *f, char *msg);
    -const char *yahoo_friend_get_status_message(YahooFriend *f);
    -
    -void yahoo_friend_set_alias_id(YahooFriend *f, const char *alias_id);
    -const char *yahoo_friend_get_alias_id(YahooFriend *f);
    -
    -void yahoo_friend_set_buddy_icon_need_request(YahooFriend *f, gboolean needs);
    -gboolean yahoo_friend_get_buddy_icon_need_request(YahooFriend *f);
    -
    -void yahoo_friend_free(gpointer p);
    -
    -void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_friend_update_presence(PurpleConnection *gc, const char *name,
    - YahooPresenceVisibility presence);
    -
    -void yahoo_friend_set_p2p_status(YahooFriend *f, YahooP2PStatus p2p_status);
    -YahooP2PStatus yahoo_friend_get_p2p_status(YahooFriend *f);
    -
    -#endif /* _YAHOO_FRIEND_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_packet.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,150 +0,0 @@
    -/**
    - * @file yahoo_packet.h The Yahoo! protocol plugin
    - *
    - * 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
    - */
    -
    -#ifndef _YAHOO_PACKET_H_
    -#define _YAHOO_PACKET_H_
    -
    -enum yahoo_service { /* these are easier to see in hex */
    - YAHOO_SERVICE_LOGON = 1,
    - YAHOO_SERVICE_LOGOFF,
    - YAHOO_SERVICE_ISAWAY,
    - YAHOO_SERVICE_ISBACK,
    - YAHOO_SERVICE_IDLE, /* 5 (placemarker) */
    - YAHOO_SERVICE_MESSAGE,
    - YAHOO_SERVICE_IDACT,
    - YAHOO_SERVICE_IDDEACT,
    - YAHOO_SERVICE_MAILSTAT,
    - YAHOO_SERVICE_USERSTAT, /* 0xa */
    - YAHOO_SERVICE_NEWMAIL,
    - YAHOO_SERVICE_CHATINVITE,
    - YAHOO_SERVICE_CALENDAR,
    - YAHOO_SERVICE_NEWPERSONALMAIL,
    - YAHOO_SERVICE_NEWCONTACT,
    - YAHOO_SERVICE_ADDIDENT, /* 0x10 */
    - YAHOO_SERVICE_ADDIGNORE,
    - YAHOO_SERVICE_PING,
    - YAHOO_SERVICE_GOTGROUPRENAME,
    - YAHOO_SERVICE_SYSMESSAGE = 0x14,
    - YAHOO_SERVICE_SKINNAME = 0x15,
    - YAHOO_SERVICE_PASSTHROUGH2 = 0x16,
    - YAHOO_SERVICE_CONFINVITE = 0x18,
    - YAHOO_SERVICE_CONFLOGON,
    - YAHOO_SERVICE_CONFDECLINE,
    - YAHOO_SERVICE_CONFLOGOFF,
    - YAHOO_SERVICE_CONFADDINVITE,
    - YAHOO_SERVICE_CONFMSG,
    - YAHOO_SERVICE_CHATLOGON,
    - YAHOO_SERVICE_CHATLOGOFF,
    - YAHOO_SERVICE_CHATMSG = 0x20,
    - YAHOO_SERVICE_GAMELOGON = 0x28,
    - YAHOO_SERVICE_GAMELOGOFF,
    - YAHOO_SERVICE_GAMEMSG = 0x2a,
    - YAHOO_SERVICE_FILETRANSFER = 0x46,
    - YAHOO_SERVICE_VOICECHAT = 0x4A,
    - YAHOO_SERVICE_NOTIFY = 0x4B,
    - YAHOO_SERVICE_VERIFY,
    - YAHOO_SERVICE_P2PFILEXFER,
    - YAHOO_SERVICE_PEERTOPEER = 0x4F,
    - YAHOO_SERVICE_WEBCAM,
    - YAHOO_SERVICE_AUTHRESP = 0x54,
    - YAHOO_SERVICE_LIST = 0x55,
    - YAHOO_SERVICE_AUTH = 0x57,
    - YAHOO_SERVICE_AUTHBUDDY = 0x6d,
    - YAHOO_SERVICE_ADDBUDDY = 0x83,
    - YAHOO_SERVICE_REMBUDDY = 0x84,
    - YAHOO_SERVICE_IGNORECONTACT, /* > 1, 7, 13 < 1, 66, 13, 0*/
    - YAHOO_SERVICE_REJECTCONTACT,
    - YAHOO_SERVICE_GROUPRENAME = 0x89, /* > 1, 65(new), 66(0), 67(old) */
    - YAHOO_SERVICE_KEEPALIVE = 0x8A,
    - YAHOO_SERVICE_CHATONLINE = 0x96, /* > 109(id), 1, 6(abcde) < 0,1*/
    - YAHOO_SERVICE_CHATGOTO,
    - YAHOO_SERVICE_CHATJOIN, /* > 1 104-room 129-1600326591 62-2 */
    - YAHOO_SERVICE_CHATLEAVE,
    - YAHOO_SERVICE_CHATEXIT = 0x9b,
    - YAHOO_SERVICE_CHATADDINVITE = 0x9d,
    - YAHOO_SERVICE_CHATLOGOUT = 0xa0,
    - YAHOO_SERVICE_CHATPING,
    - YAHOO_SERVICE_COMMENT = 0xa8,
    - YAHOO_SERVICE_PRESENCE_PERM = 0xb9,
    - YAHOO_SERVICE_PRESENCE_SESSION = 0xba,
    - YAHOO_SERVICE_AVATAR = 0xbc,
    - YAHOO_SERVICE_PICTURE_CHECKSUM = 0xbd,
    - YAHOO_SERVICE_PICTURE = 0xbe,
    - YAHOO_SERVICE_PICTURE_UPDATE = 0xc1,
    - YAHOO_SERVICE_PICTURE_UPLOAD = 0xc2,
    - YAHOO_SERVICE_Y6_VISIBLE_TOGGLE = 0xc5,
    - YAHOO_SERVICE_Y6_STATUS_UPDATE = 0xc6,
    - YAHOO_SERVICE_AVATAR_UPDATE = 0xc7,
    - YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8,
    - YAHOO_SERVICE_AUDIBLE = 0xd0,
    - YAHOO_SERVICE_CONTACT_DETAILS = 0xd3,
    - /* YAHOO_SERVICE_CHAT_SESSION = 0xd4,?? Reports start of chat session, gets an id from server */
    - YAHOO_SERVICE_AUTH_REQ_15 = 0xd6,
    - YAHOO_SERVICE_FILETRANS_15 = 0xdc,
    - YAHOO_SERVICE_FILETRANS_INFO_15 = 0xdd,
    - YAHOO_SERVICE_FILETRANS_ACC_15 = 0xde,
    - /* photo sharing services ?? - 0xd2, 0xd7, 0xd8, 0xda */
    - YAHOO_SERVICE_CHGRP_15 = 0xe7,
    - YAHOO_SERVICE_STATUS_15 = 0xf0,
    - YAHOO_SERVICE_LIST_15 = 0xf1,
    - YAHOO_SERVICE_MESSAGE_ACK = 0xfb,
    - YAHOO_SERVICE_WEBLOGIN = 0x0226,
    - YAHOO_SERVICE_SMS_MSG = 0x02ea
    - /* YAHOO_SERVICE_DISCONNECT = 0x07d1 Server forces us to disconnect. Is sent with TCP FIN flag set */
    -};
    -
    -struct yahoo_pair {
    - int key;
    - char *value;
    -};
    -
    -struct yahoo_packet {
    - guint16 service;
    - gint32 status;
    - guint32 id;
    - GSList *hash;
    -};
    -
    -#define YAHOO_WEBMESSENGER_PROTO_VER 0x0065
    -#define YAHOO_PROTO_VER 0x0010
    -#define YAHOO_PROTO_VER_JAPAN 0x0010
    -
    -#define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4)
    -
    -struct yahoo_packet *yahoo_packet_new(enum yahoo_service service,
    - enum yahoo_status status, int id);
    -void yahoo_packet_hash(struct yahoo_packet *pkt, const char *fmt, ...);
    -void yahoo_packet_hash_str(struct yahoo_packet *pkt, int key, const char *value);
    -void yahoo_packet_hash_int(struct yahoo_packet *pkt, int key, int value);
    -int yahoo_packet_send(struct yahoo_packet *pkt, YahooData *yd);
    -int yahoo_packet_send_and_free(struct yahoo_packet *pkt, YahooData *yd);
    -size_t yahoo_packet_build(struct yahoo_packet *pkt, int pad, gboolean wm, gboolean jp,
    -guchar **buf);
    -void yahoo_packet_read(struct yahoo_packet *pkt, const guchar *data, int len);
    -void yahoo_packet_write(struct yahoo_packet *pkt, guchar *data);
    -void yahoo_packet_dump(guchar *data, int len);
    -size_t yahoo_packet_length(struct yahoo_packet *pkt);
    -void yahoo_packet_free(struct yahoo_packet *pkt);
    -
    -#endif /* _YAHOO_PACKET_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoo_picture.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,43 +0,0 @@
    -/*
    - * 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
    - *
    - */
    -
    -#ifndef _YAHOO_PICTURE_H_
    -#define _YAHOO_PICTURE_H_
    -
    -void yahoo_send_picture_request(PurpleConnection *gc, const char *who);
    -void yahoo_send_picture_info(PurpleConnection *gc, const char *who);
    -void yahoo_send_picture_checksum(PurpleConnection *gc);
    -void yahoo_send_picture_update(PurpleConnection *gc, int type);
    -void yahoo_send_picture_update_to_user(PurpleConnection *gc, const char *who, int type);
    -
    -void yahoo_process_picture(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_picture_checksum(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_picture_upload(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -void yahoo_process_avatar_update(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -void yahoo_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img);
    -void yahoo_buddy_icon_upload(PurpleConnection *gc, struct yahoo_buddy_icon_upload_data *d);
    -void yahoo_buddy_icon_upload_data_free(struct yahoo_buddy_icon_upload_data *d);
    -
    -#endif /* _YAHOO_PICTURE_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/yahoochat.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,66 +0,0 @@
    -/**
    - * @file yahoochat.h The Yahoo! protocol plugin, chat and conference stuff
    - *
    - * 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
    - */
    -
    -#ifndef _YAHOOCHAT_H_
    -#define _YAHOOCHAT_H_
    -
    -#include "roomlist.h"
    -#include "yahoo_packet.h"
    -
    -void yahoo_process_conference_invite(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_conference_decline(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_conference_logon(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_conference_logoff(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_conference_message(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -void yahoo_process_chat_online(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_logout(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_join(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_exit(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_message(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_addinvite(PurpleConnection *gc, struct yahoo_packet *pkt);
    -void yahoo_process_chat_goto(PurpleConnection *gc, struct yahoo_packet *pkt);
    -
    -void yahoo_c_leave(PurpleConnection *gc, int id);
    -int yahoo_c_send(PurpleConnection *gc, int id, const char *what, PurpleMessageFlags flags);
    -GList *yahoo_c_info(PurpleConnection *gc);
    -GHashTable *yahoo_c_info_defaults(PurpleConnection *gc, const char *chat_name);
    -void yahoo_c_join(PurpleConnection *gc, GHashTable *data);
    -char *yahoo_get_chat_name(GHashTable *data);
    -void yahoo_c_invite(PurpleConnection *gc, int id, const char *msg, const char *name);
    -
    -void yahoo_conf_leave(YahooData *yd, const char *room, const char *dn, GList *who);
    -
    -void yahoo_chat_goto(PurpleConnection *gc, const char *name);
    -
    -/* room listing functions */
    -PurpleRoomlist *yahoo_roomlist_get_list(PurpleConnection *gc);
    -void yahoo_roomlist_cancel(PurpleRoomlist *list);
    -void yahoo_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category);
    -
    -/* util */
    -void yahoo_chat_add_users(PurpleConvChat *chat, GList *newusers);
    -void yahoo_chat_add_user(PurpleConvChat *chat, const char *user, const char *reason);
    -
    -#endif /* _YAHOO_CHAT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Headers/ycht.h Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,97 +0,0 @@
    -/**
    - * @file ycht.h The Yahoo! protocol plugin, YCHT protocol stuff.
    - *
    - * purple
    - *
    - * Copyright (C) 2004 Timothy Ringenbach <omarvo@hotmail.com>
    - *
    - * 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
    - */
    -
    -#ifndef _PURPLE_YCHT_H_
    -#define _PURPLE_YCHT_H_
    -
    -/* #define YAHOO_YCHT_DEBUG */
    -
    -#define YAHOO_YCHT_HOST "jcs3.chat.dcn.yahoo.com"
    -#define YAHOO_YCHT_PORT 8002
    -
    -#define YCHT_VERSION (0xae)
    -#define YCHT_HEADER_LEN (0x10)
    -
    -typedef enum {
    - YCHT_SERVICE_LOGIN = 0x01,
    - YCHT_SERVICE_LOGOUT = 0x02,
    - YCHT_SERVICE_CHATJOIN = 0x11,
    - YCHT_SERVICE_CHATPART = 0x12,
    - YCHT_SERVICE_CHATMSG = 0x41,
    - YCHT_SERVICE_CHATMSG_EMOTE = 0x43,
    - YCHT_SERVICE_PING = 0x62,
    - YCHT_SERVICE_ONLINE_FRIENDS = 0x68
    -} ycht_service;
    -/*
    -yahoo: YCHT Service: 0x11 Version: 0x100
    -yahoo: Data[0]: Linux, FreeBSD, Solaris:1
    -yahoo: Data[1]: Questions, problems and discussions about all flavors of Unix.
    -yahoo: Data[2]:
    -yahoo: Data[3]: 0
    -yahoo: Data[4]: sgooki888\0020\002 \0022769036\00258936\002
    -yahoo: --==End of incoming YCHT packet==--
    -
    -yahoo: --==Incoming YCHT packet==--
    -yahoo: YCHT Service: 0x12 Version: 0x100
    -yahoo: Data[0]: Linux, FreeBSD, Solaris:1
    -yahoo: Data[1]: cccc4cccc
    -yahoo: --==End of incoming YCHT packet==--
    -
    -*/
    -#define YCHT_SEP "\xc0\x80"
    -
    -typedef struct _YchtConn {
    - PurpleConnection *gc;
    - gchar *room;
    - int room_id;
    - gint fd;
    - gint inpa;
    - gboolean logged_in;
    - gboolean changing_rooms;
    - guchar *rxqueue;
    - guint rxlen;
    - PurpleCircBuffer *txbuf;
    - guint tx_handler;
    -} YchtConn;
    -
    -typedef struct {
    - guint version;
    - guint service;
    - gint status;
    - GList *data;
    -} YchtPkt;
    -
    -void ycht_connection_open(PurpleConnection *gc);
    -void ycht_connection_close(YchtConn *ycht);
    -
    -void ycht_chat_join(YchtConn *ycht, const char *room);
    -int ycht_chat_send(YchtConn *ycht, const char *room, const char *what);
    -void ycht_chat_leave(YchtConn *ycht, const char *room, gboolean logout);
    -void ycht_chat_send_invite(YchtConn *ycht, const char *room, const char *buddy, const char *msg);
    -void ycht_chat_goto_user(YchtConn *ycht, const char *name);
    -void ycht_chat_send_keepalive(YchtConn *ycht);
    -
    -#endif /* _PURPLE_YCHT_H_ */
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/English.lproj/InfoPlist.strings Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,3 +0,0 @@
    -/* Localized versions of Info.plist keys */
    -
    -CFBundleName = "libpurple";
    --- a/Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/Info.plist Tue Mar 21 20:36:54 2017 +0100
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,18 +0,0 @@
    -<?xml version="1.0" encoding="UTF-8"?>
    -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    -<plist version="1.0">
    -<dict>
    - <key>CFBundleDevelopmentRegion</key>
    - <string>English</string>
    - <key>CFBundleInfoDictionaryVersion</key>
    - <string>6.0</string>
    - <key>CFBundlePackageType</key>
    - <string>FMWK</string>
    - <key>CFBundleSignature</key>
    - <string>????</string>
    - <key>CFBundleVersion</key>
    - <string>0.0.1d1</string>
    - <key>CFBundleIdentifier</key>
    - <string>im.pidgin.libpurple</string>
    -</dict>
    -</plist>
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/as/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ast/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/bn_IN/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/br/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/brx/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ca/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/cs/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/da/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/de/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/el/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_AU/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_CA/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/en_GB/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/es/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/es_AR/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/fi/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/fr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/hr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/hu/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/it/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ja/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/kk/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ks/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ku_IQ/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/lv/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mai/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mhr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ml/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/mr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/nb/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/nl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pt/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/pt_BR/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/ru/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sd/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/sv/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/tr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/tt/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/uk/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/uz/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/zh_CN/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/Resources/zh_TW/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.10.12r8d2874a79747/libpurple has changed
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/account.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1253 @@
    +/**
    + * @file account.h Account API
    + * @ingroup core
    + * @see @ref account-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_ACCOUNT_H_
    +#define _PURPLE_ACCOUNT_H_
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +/** @copydoc _PurpleAccountUiOps */
    +typedef struct _PurpleAccountUiOps PurpleAccountUiOps;
    +/** @copydoc _PurpleAccountPrefsUiOps */
    +typedef struct _PurpleAccountPrefsUiOps PurpleAccountPrefsUiOps;
    +/** @copydoc _PurpleAccount */
    +typedef struct _PurpleAccount PurpleAccount;
    +
    +typedef gboolean (*PurpleFilterAccountFunc)(PurpleAccount *account);
    +typedef void (*PurpleAccountRequestAuthorizationCb)(void *);
    +typedef void (*PurpleAccountRegistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
    +typedef void (*PurpleAccountUnregistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
    +typedef void (*PurpleSetPublicAliasSuccessCallback)(PurpleAccount *account, const char *new_alias);
    +typedef void (*PurpleSetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
    +typedef void (*PurpleGetPublicAliasSuccessCallback)(PurpleAccount *account, const char *alias);
    +typedef void (*PurpleGetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
    +
    +#include "connection.h"
    +#include "log.h"
    +#include "privacy.h"
    +#include "proxy.h"
    +#include "prpl.h"
    +#include "status.h"
    +
    +/**
    + * Account request types.
    + */
    +typedef enum
    +{
    + PURPLE_ACCOUNT_REQUEST_AUTHORIZATION = 0 /* Account authorization request */
    +} PurpleAccountRequestType;
    +
    +/**
    + * Account request response types
    + */
    +typedef enum
    +{
    + PURPLE_ACCOUNT_RESPONSE_IGNORE = -2,
    + PURPLE_ACCOUNT_RESPONSE_DENY = -1,
    + PURPLE_ACCOUNT_RESPONSE_PASS = 0,
    + PURPLE_ACCOUNT_RESPONSE_ACCEPT = 1
    +} PurpleAccountRequestResponse;
    +
    +/** Account UI operations, used to notify the user of status changes and when
    + * buddies add this account to their buddy lists.
    + */
    +struct _PurpleAccountUiOps
    +{
    + /** A buddy who is already on this account's buddy list added this account
    + * to their buddy list.
    + */
    + void (*notify_added)(PurpleAccount *account,
    + const char *remote_user,
    + const char *id,
    + const char *alias,
    + const char *message);
    +
    + /** This account's status changed. */
    + void (*status_changed)(PurpleAccount *account,
    + PurpleStatus *status);
    +
    + /** Someone we don't have on our list added us; prompt to add them. */
    + void (*request_add)(PurpleAccount *account,
    + const char *remote_user,
    + const char *id,
    + const char *alias,
    + const char *message);
    +
    + /** Prompt for authorization when someone adds this account to their buddy
    + * list. To authorize them to see this account's presence, call \a
    + * authorize_cb (\a user_data); otherwise call \a deny_cb (\a user_data);
    + * @return a UI-specific handle, as passed to #close_account_request.
    + */
    + void *(*request_authorize)(PurpleAccount *account,
    + const char *remote_user,
    + const char *id,
    + const char *alias,
    + const char *message,
    + gboolean on_list,
    + PurpleAccountRequestAuthorizationCb authorize_cb,
    + PurpleAccountRequestAuthorizationCb deny_cb,
    + void *user_data);
    +
    + /** Close a pending request for authorization. \a ui_handle is a handle
    + * as returned by #request_authorize.
    + */
    + void (*close_account_request)(void *ui_handle);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/** Account prefs UI operations, to allow the UI to catch account preference
    + * changes. Unlike the #PurplePrefsUiOps API, these are always stored
    + * internally in a hash table. If the UI wants to handle accounts settings,
    + * it must set them to the account on load and handle changes with set_
    + * methods. Implementing load/save/schedule_save disables the built-in
    + * accounts.xml code.
    + *
    + * @since 2.11.0
    + */
    +struct _PurpleAccountPrefsUiOps
    +{
    + /** Notifies the UI that an integer account setting was set. */
    + void (*set_int)(PurpleAccount *account, const char *name, int value);
    +
    + /** Notifies the UI that a string account setting was set. */
    + void (*set_string)(PurpleAccount *account, const char *name, const char *value);
    +
    + /** Notifies the UI that a boolean account setting was set. */
    + void (*set_bool)(PurpleAccount *account, const char *name, gboolean value);
    +
    + /** If this is set, accounts.xml loading will be disabled and this
    + * function will be called instead.
    + */
    + void (*load)(void);
    +
    + /** If this is set, accounts.xml saving will be disabled and this
    + * function will be called instead.
    + */
    + void (*save)(void);
    +
    + /** If this is set, the UI will handle scheduling the timer to call the
    + * save function, overriding the default timeout of 5 seconds.
    + */
    + void (*schedule_save)(void);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/** Structure representing an account.
    + */
    +struct _PurpleAccount
    +{
    + char *username; /**< The username. */
    + char *alias; /**< How you appear to yourself. */
    + char *password; /**< The account password. */
    + char *user_info; /**< User information. */
    +
    + char *buddy_icon_path; /**< The buddy icon's non-cached path. */
    +
    + gboolean remember_pass; /**< Remember the password. */
    +
    + char *protocol_id; /**< The ID of the protocol. */
    +
    + PurpleConnection *gc; /**< The connection handle. */
    + gboolean disconnecting; /**< The account is currently disconnecting */
    +
    + GHashTable *settings; /**< Protocol-specific settings. */
    + GHashTable *ui_settings; /**< UI-specific settings. */
    +
    + PurpleProxyInfo *proxy_info; /**< Proxy information. This will be set */
    + /* to NULL when the account inherits */
    + /* proxy settings from global prefs. */
    +
    + /*
    + * TODO: Supplementing the next two linked lists with hash tables
    + * should help performance a lot when these lists are long. This
    + * matters quite a bit for protocols, where all your
    + * buddies are added to your permit list. Currently we have to
    + * iterate through the entire list if we want to check if someone
    + * is permitted or denied. We should do this for 3.0.0.
    + * Or maybe use a GTree.
    + */
    + GSList *permit; /**< Permit list. */
    + GSList *deny; /**< Deny list. */
    + PurplePrivacyType perm_deny; /**< The permit/deny setting. */
    +
    + GList *status_types; /**< Status types. */
    +
    + PurplePresence *presence; /**< Presence. */
    + PurpleLog *system_log; /**< The system log */
    +
    + void *ui_data; /**< The UI can put data here. */
    + PurpleAccountRegistrationCb registration_cb;
    + void *registration_cb_user_data;
    +
    + gpointer priv; /**< Pointer to opaque private data. */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Account API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new account.
    + *
    + * @param username The username.
    + * @param protocol_id The protocol ID.
    + *
    + * @return The new account.
    + */
    +PurpleAccount *purple_account_new(const char *username, const char *protocol_id);
    +
    +/**
    + * Destroys an account.
    + *
    + * @param account The account to destroy.
    + */
    +void purple_account_destroy(PurpleAccount *account);
    +
    +/**
    + * Connects to an account.
    + *
    + * @param account The account to connect to.
    + */
    +void purple_account_connect(PurpleAccount *account);
    +
    +/**
    + * Sets the callback for successful registration.
    + *
    + * @param account The account for which this callback should be used
    + * @param cb The callback
    + * @param user_data The user data passed to the callback
    + */
    +void purple_account_set_register_callback(PurpleAccount *account, PurpleAccountRegistrationCb cb, void *user_data);
    +
    +/**
    + * Registers an account.
    + *
    + * @param account The account to register.
    + */
    +void purple_account_register(PurpleAccount *account);
    +
    +/**
    + * Unregisters an account (deleting it from the server).
    + *
    + * @param account The account to unregister.
    + * @param cb Optional callback to be called when unregistration is complete
    + * @param user_data user data to pass to the callback
    + */
    +void purple_account_unregister(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
    +
    +/**
    + * Disconnects from an account.
    + *
    + * @param account The account to disconnect from.
    + */
    +void purple_account_disconnect(PurpleAccount *account);
    +
    +/**
    + * Notifies the user that the account was added to a remote user's
    + * buddy list.
    + *
    + * This will present a dialog informing the user that he was added to the
    + * remote user's buddy list.
    + *
    + * @param account The account that was added.
    + * @param remote_user The name of the user that added this account.
    + * @param id The optional ID of the local account. Rarely used.
    + * @param alias The optional alias of the user.
    + * @param message The optional message sent from the user adding you.
    + */
    +void purple_account_notify_added(PurpleAccount *account, const char *remote_user,
    + const char *id, const char *alias,
    + const char *message);
    +
    +/**
    + * Notifies the user that the account was addded to a remote user's buddy
    + * list and asks ther user if they want to add the remote user to their buddy
    + * list.
    + *
    + * This will present a dialog informing the local user that the remote user
    + * added them to the remote user's buddy list and will ask if they want to add
    + * the remote user to the buddy list.
    + *
    + * @param account The account that was added.
    + * @param remote_user The name of the user that added this account.
    + * @param id The optional ID of the local account. Rarely used.
    + * @param alias The optional alias of the user.
    + * @param message The optional message sent from the user adding you.
    + */
    +void purple_account_request_add(PurpleAccount *account, const char *remote_user,
    + const char *id, const char *alias,
    + const char *message);
    +
    +/**
    + * Notifies the user that a remote user has wants to add the local user
    + * to his or her buddy list and requires authorization to do so.
    + *
    + * This will present a dialog informing the user of this and ask if the
    + * user authorizes or denies the remote user from adding him.
    + *
    + * @param account The account that was added
    + * @param remote_user The name of the user that added this account.
    + * @param id The optional ID of the local account. Rarely used.
    + * @param alias The optional alias of the remote user.
    + * @param message The optional message sent by the user wanting to add you.
    + * @param on_list Is the remote user already on the buddy list?
    + * @param auth_cb The callback called when the local user accepts
    + * @param deny_cb The callback called when the local user rejects
    + * @param user_data Data to be passed back to the above callbacks
    + *
    + * @return A UI-specific handle.
    + */
    +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);
    +
    +/**
    + * Close account requests registered for the given PurpleAccount
    + *
    + * @param account The account for which requests should be closed
    + */
    +void purple_account_request_close_with_account(PurpleAccount *account);
    +
    +/**
    + * Close the account request for the given ui handle
    + *
    + * @param ui_handle The ui specific handle for which requests should be closed
    + */
    +void purple_account_request_close(void *ui_handle);
    +
    +/**
    + * Requests a password from the user for the account. Does not set the
    + * account password on success; do that in ok_cb if desired.
    + *
    + * @param account The account to request the password for.
    + * @param ok_cb The callback for the OK button.
    + * @param cancel_cb The callback for the cancel button.
    + * @param user_data User data to be passed into callbacks.
    + */
    +void purple_account_request_password(PurpleAccount *account, GCallback ok_cb,
    + GCallback cancel_cb, void *user_data);
    +
    +/**
    + * Requests information from the user to change the account's password.
    + *
    + * @param account The account to change the password on.
    + */
    +void purple_account_request_change_password(PurpleAccount *account);
    +
    +/**
    + * Requests information from the user to change the account's
    + * user information.
    + *
    + * @param account The account to change the user information on.
    + */
    +void purple_account_request_change_user_info(PurpleAccount *account);
    +
    +/**
    + * Sets the account's username.
    + *
    + * @param account The account.
    + * @param username The username.
    + */
    +void purple_account_set_username(PurpleAccount *account, const char *username);
    +
    +/**
    + * Sets the account's password.
    + *
    + * @param account The account.
    + * @param password The password.
    + */
    +void purple_account_set_password(PurpleAccount *account, const char *password);
    +
    +/**
    + * Sets the account's alias.
    + *
    + * @param account The account.
    + * @param alias The alias.
    + */
    +void purple_account_set_alias(PurpleAccount *account, const char *alias);
    +
    +/**
    + * Sets the account's user information
    + *
    + * @param account The account.
    + * @param user_info The user information.
    + */
    +void purple_account_set_user_info(PurpleAccount *account, const char *user_info);
    +
    +/**
    + * Sets the account's buddy icon path.
    + *
    + * @param account The account.
    + * @param path The buddy icon non-cached path.
    + */
    +void purple_account_set_buddy_icon_path(PurpleAccount *account, const char *path);
    +
    +/**
    + * Sets the account's protocol ID.
    + *
    + * @param account The account.
    + * @param protocol_id The protocol ID.
    + */
    +void purple_account_set_protocol_id(PurpleAccount *account,
    + const char *protocol_id);
    +
    +/**
    + * Sets the account's connection.
    + *
    + * @param account The account.
    + * @param gc The connection.
    + */
    +void purple_account_set_connection(PurpleAccount *account, PurpleConnection *gc);
    +
    +/**
    + * Sets whether or not this account should save its password.
    + *
    + * @param account The account.
    + * @param value @c TRUE if it should remember the password.
    + */
    +void purple_account_set_remember_password(PurpleAccount *account, gboolean value);
    +
    +/**
    + * Sets whether or not this account should check for mail.
    + *
    + * @param account The account.
    + * @param value @c TRUE if it should check for mail.
    + */
    +void purple_account_set_check_mail(PurpleAccount *account, gboolean value);
    +
    +/**
    + * Sets whether or not this account is enabled for the specified
    + * UI.
    + *
    + * @param account The account.
    + * @param ui The UI.
    + * @param value @c TRUE if it is enabled.
    + */
    +void purple_account_set_enabled(PurpleAccount *account, const char *ui,
    + gboolean value);
    +
    +/**
    + * Sets the account's proxy information.
    + *
    + * @param account The account.
    + * @param info The proxy information.
    + */
    +void purple_account_set_proxy_info(PurpleAccount *account, PurpleProxyInfo *info);
    +
    +/**
    + * Sets the account's privacy type.
    + *
    + * @param account The account.
    + * @param privacy_type The privacy type.
    + *
    + * @since 2.7.0
    + */
    +void purple_account_set_privacy_type(PurpleAccount *account, PurplePrivacyType privacy_type);
    +
    +/**
    + * Sets the account's status types.
    + *
    + * @param account The account.
    + * @param status_types The list of status types.
    + */
    +void purple_account_set_status_types(PurpleAccount *account, GList *status_types);
    +
    +/**
    + * Variadic version of purple_account_set_status_list(); the variadic list
    + * replaces @a attrs, and should be <tt>NULL</tt>-terminated.
    + *
    + * @copydoc purple_account_set_status_list()
    + */
    +void purple_account_set_status(PurpleAccount *account, const char *status_id,
    + gboolean active, ...) G_GNUC_NULL_TERMINATED;
    +
    +
    +/**
    + * Activates or deactivates a status. All changes to the statuses of
    + * an account go through this function or purple_account_set_status().
    + *
    + * You can only deactivate an exclusive status by activating another exclusive
    + * status. So, if @a status_id is an exclusive status and @a active is @c
    + * FALSE, this function does nothing.
    + *
    + * @param account The account.
    + * @param status_id The ID of the status.
    + * @param active Whether @a status_id is to be activated (<tt>TRUE</tt>) or
    + * deactivated (<tt>FALSE</tt>).
    + * @param attrs A list of <tt>const char *</tt> attribute names followed by
    + * <tt>const char *</tt> attribute values for the status.
    + * (For example, one pair might be <tt>"message"</tt> followed
    + * by <tt>"hello, talk to me!"</tt>.)
    + */
    +void purple_account_set_status_list(PurpleAccount *account,
    + const char *status_id, gboolean active, GList *attrs);
    +
    +/**
    + * Set a server-side (public) alias for this account. The account
    + * must already be connected.
    + *
    + * Currently, the public alias is not stored locally, although this
    + * may change in a later version.
    + *
    + * @param account The account
    + * @param alias The new public alias for this account or NULL
    + * to unset the alias/nickname (or return it to
    + * a protocol-specific "default", like the username)
    + * @param success_cb A callback which will be called if the alias
    + * is successfully set on the server (or NULL).
    + * @param failure_cb A callback which will be called if the alias
    + * is not successfully set on the server (or NULL).
    + *
    + * @since 2.7.0
    + */
    +void purple_account_set_public_alias(PurpleAccount *account,
    + const char *alias, PurpleSetPublicAliasSuccessCallback success_cb,
    + PurpleSetPublicAliasFailureCallback failure_cb);
    +
    +/**
    + * Fetch the server-side (public) alias for this account. The account
    + * must already be connected.
    + *
    + * @param account The account
    + * @param success_cb A callback which will be called with the alias
    + * @param failure_cb A callback which will be called if the prpl is
    + * unable to retrieve the server-side alias.
    + * @since 2.7.0
    + */
    +void purple_account_get_public_alias(PurpleAccount *account,
    + PurpleGetPublicAliasSuccessCallback success_cb,
    + PurpleGetPublicAliasFailureCallback failure_cb);
    +
    +/**
    + * Return whether silence suppression is used during voice call.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if suppression is used, or @c FALSE if not.
    + */
    +gboolean purple_account_get_silence_suppression(const PurpleAccount *account);
    +
    +/**
    + * Sets whether silence suppression is used during voice call.
    + *
    + * @param account The account.
    + * @param value @c TRUE if suppression should be used.
    + */
    +void purple_account_set_silence_suppression(PurpleAccount *account,
    + gboolean value);
    +
    +/**
    + * Clears all protocol-specific settings on an account.
    + *
    + * @param account The account.
    + */
    +void purple_account_clear_settings(PurpleAccount *account);
    +
    +/**
    + * Removes an account-specific setting by name.
    + *
    + * @param account The account.
    + * @param setting The setting to remove.
    + *
    + * @since 2.6.0
    + */
    +void purple_account_remove_setting(PurpleAccount *account, const char *setting);
    +
    +/**
    + * Sets a protocol-specific integer setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_int(PurpleAccount *account, const char *name, int value);
    +
    +/**
    + * Sets a protocol-specific string setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_string(PurpleAccount *account, const char *name,
    + const char *value);
    +
    +/**
    + * Sets a protocol-specific boolean setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_bool(PurpleAccount *account, const char *name,
    + gboolean value);
    +
    +/**
    + * Sets a UI-specific integer setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_ui_int(PurpleAccount *account, const char *ui,
    + const char *name, int value);
    +
    +/**
    + * Sets a UI-specific string setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_ui_string(PurpleAccount *account, const char *ui,
    + const char *name, const char *value);
    +
    +/**
    + * Sets a UI-specific boolean setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param value The setting's value.
    + */
    +void purple_account_set_ui_bool(PurpleAccount *account, const char *ui,
    + const char *name, gboolean value);
    +
    +/**
    + * Returns whether or not the account is connected.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if connected, or @c FALSE otherwise.
    + */
    +gboolean purple_account_is_connected(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not the account is connecting.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if connecting, or @c FALSE otherwise.
    + */
    +gboolean purple_account_is_connecting(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not the account is disconnected.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if disconnected, or @c FALSE otherwise.
    + */
    +gboolean purple_account_is_disconnected(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's username.
    + *
    + * @param account The account.
    + *
    + * @return The username.
    + */
    +const char *purple_account_get_username(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's password.
    + *
    + * @param account The account.
    + *
    + * @return The password.
    + */
    +const char *purple_account_get_password(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's alias.
    + *
    + * @param account The account.
    + *
    + * @return The alias.
    + */
    +const char *purple_account_get_alias(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's user information.
    + *
    + * @param account The account.
    + *
    + * @return The user information.
    + */
    +const char *purple_account_get_user_info(const PurpleAccount *account);
    +
    +/**
    + * Gets the account's buddy icon path.
    + *
    + * @param account The account.
    + *
    + * @return The buddy icon's non-cached path.
    + */
    +const char *purple_account_get_buddy_icon_path(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's protocol ID.
    + *
    + * @param account The account.
    + *
    + * @return The protocol ID.
    + */
    +const char *purple_account_get_protocol_id(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's protocol name.
    + *
    + * @param account The account.
    + *
    + * @return The protocol name.
    + */
    +const char *purple_account_get_protocol_name(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's connection.
    + *
    + * @param account The account.
    + *
    + * @return The connection.
    + */
    +PurpleConnection *purple_account_get_connection(const PurpleAccount *account);
    +
    +/**
    + * Returns a name for this account appropriate for display to the user. In
    + * order of preference: the account's alias; the contact or buddy alias (if
    + * the account exists on its own buddy list); the connection's display name;
    + * the account's username.
    + *
    + * @param account The account.
    + *
    + * @return The name to display.
    + *
    + * @since 2.7.0
    + */
    +const gchar *purple_account_get_name_for_display(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not this account should save its password.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if it should remember the password.
    + */
    +gboolean purple_account_get_remember_password(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not this account should check for mail.
    + *
    + * @param account The account.
    + *
    + * @return @c TRUE if it should check for mail.
    + */
    +gboolean purple_account_get_check_mail(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not this account is enabled for the
    + * specified UI.
    + *
    + * @param account The account.
    + * @param ui The UI.
    + *
    + * @return @c TRUE if it enabled on this UI.
    + */
    +gboolean purple_account_get_enabled(const PurpleAccount *account,
    + const char *ui);
    +
    +/**
    + * Returns the account's proxy information.
    + *
    + * @param account The account.
    + *
    + * @return The proxy information.
    + */
    +PurpleProxyInfo *purple_account_get_proxy_info(const PurpleAccount *account);
    +
    +/**
    + * Returns the account's privacy type.
    + *
    + * @param account The account.
    + *
    + * @return The privacy type.
    + *
    + * @since 2.7.0
    + */
    +PurplePrivacyType purple_account_get_privacy_type(const PurpleAccount *account);
    +
    +/**
    + * Returns the active status for this account. This looks through
    + * the PurplePresence associated with this account and returns the
    + * PurpleStatus that has its active flag set to "TRUE." There can be
    + * only one active PurpleStatus in a PurplePresence.
    + *
    + * @param account The account.
    + *
    + * @return The active status.
    + */
    +PurpleStatus *purple_account_get_active_status(const PurpleAccount *account);
    +
    +/**
    + * Returns the account status with the specified ID.
    + *
    + * Note that this works differently than purple_buddy_get_status() in that
    + * it will only return NULL if the status was not registered.
    + *
    + * @param account The account.
    + * @param status_id The status ID.
    + *
    + * @return The status, or NULL if it was never registered.
    + */
    +PurpleStatus *purple_account_get_status(const PurpleAccount *account,
    + const char *status_id);
    +
    +/**
    + * Returns the account status type with the specified ID.
    + *
    + * @param account The account.
    + * @param id The ID of the status type to find.
    + *
    + * @return The status type if found, or NULL.
    + */
    +PurpleStatusType *purple_account_get_status_type(const PurpleAccount *account,
    + const char *id);
    +
    +/**
    + * Returns the account status type with the specified primitive.
    + * Note: It is possible for an account to have more than one
    + * PurpleStatusType with the same primitive. In this case, the
    + * first PurpleStatusType is returned.
    + *
    + * @param account The account.
    + * @param primitive The type of the status type to find.
    + *
    + * @return The status if found, or NULL.
    + */
    +PurpleStatusType *purple_account_get_status_type_with_primitive(
    + const PurpleAccount *account,
    + PurpleStatusPrimitive primitive);
    +
    +/**
    + * Returns the account's presence.
    + *
    + * @param account The account.
    + *
    + * @return The account's presence.
    + */
    +PurplePresence *purple_account_get_presence(const PurpleAccount *account);
    +
    +/**
    + * Returns whether or not an account status is active.
    + *
    + * @param account The account.
    + * @param status_id The status ID.
    + *
    + * @return TRUE if active, or FALSE if not.
    + */
    +gboolean purple_account_is_status_active(const PurpleAccount *account,
    + const char *status_id);
    +
    +/**
    + * Returns the account's status types.
    + *
    + * @param account The account.
    + *
    + * @constreturn The account's status types.
    + */
    +GList *purple_account_get_status_types(const PurpleAccount *account);
    +
    +/**
    + * Returns a protocol-specific integer setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +int purple_account_get_int(const PurpleAccount *account, const char *name,
    + int default_value);
    +
    +/**
    + * Returns a protocol-specific string setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +const char *purple_account_get_string(const PurpleAccount *account,
    + const char *name,
    + const char *default_value);
    +
    +/**
    + * Returns a protocol-specific boolean setting for an account.
    + *
    + * @param account The account.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +gboolean purple_account_get_bool(const PurpleAccount *account, const char *name,
    + gboolean default_value);
    +
    +/**
    + * Returns a UI-specific integer setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +int purple_account_get_ui_int(const PurpleAccount *account, const char *ui,
    + const char *name, int default_value);
    +
    +/**
    + * Returns a UI-specific string setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +const char *purple_account_get_ui_string(const PurpleAccount *account,
    + const char *ui, const char *name,
    + const char *default_value);
    +
    +/**
    + * Returns a UI-specific boolean setting for an account.
    + *
    + * @param account The account.
    + * @param ui The UI name.
    + * @param name The name of the setting.
    + * @param default_value The default value.
    + *
    + * @return The value.
    + */
    +gboolean purple_account_get_ui_bool(const PurpleAccount *account, const char *ui,
    + const char *name, gboolean default_value);
    +
    +
    +/**
    + * Returns the system log for an account.
    + *
    + * @param account The account.
    + * @param create Should it be created if it doesn't exist?
    + *
    + * @return The log.
    + *
    + * @note Callers should almost always pass @c FALSE for @a create.
    + * Passing @c TRUE could result in an existing log being reopened,
    + * if the log has already been closed, which not all loggers deal
    + * with appropriately.
    + */
    +PurpleLog *purple_account_get_log(PurpleAccount *account, gboolean create);
    +
    +/**
    + * Frees the system log of an account
    + *
    + * @param account The account.
    + */
    +void purple_account_destroy_log(PurpleAccount *account);
    +
    +/**
    + * Adds a buddy to the server-side buddy list for the specified account.
    + *
    + * @param account The account.
    + * @param buddy The buddy to add.
    + *
    + * @deprecated Use purple_account_add_buddy_with_invite and \c NULL message.
    + */
    +void purple_account_add_buddy(PurpleAccount *account, PurpleBuddy *buddy);
    +/**
    + * Adds a buddy to the server-side buddy list for the specified account.
    + *
    + * @param account The account.
    + * @param buddy The buddy to add.
    + * @param message The invite message. This may be ignored by a prpl.
    + *
    + * @since 2.8.0
    + */
    +void purple_account_add_buddy_with_invite(PurpleAccount *account, PurpleBuddy *buddy, const char *message);
    +
    +/**
    + * Adds a list of buddies to the server-side buddy list.
    + *
    + * @param account The account.
    + * @param buddies The list of PurpleBlistNodes representing the buddies to add.
    + *
    + * @deprecated Use purple_account_add_buddies_with_invite and \c NULL message.
    + */
    +void purple_account_add_buddies(PurpleAccount *account, GList *buddies);
    +/**
    + * Adds a list of buddies to the server-side buddy list.
    + *
    + * @param account The account.
    + * @param buddies The list of PurpleBlistNodes representing the buddies to add.
    + * @param message The invite message. This may be ignored by a prpl.
    + *
    + * @since 2.8.0
    + */
    +void purple_account_add_buddies_with_invite(PurpleAccount *account, GList *buddies, const char *message);
    +
    +/**
    + * Removes a buddy from the server-side buddy list.
    + *
    + * @param account The account.
    + * @param buddy The buddy to remove.
    + * @param group The group to remove the buddy from.
    + */
    +void purple_account_remove_buddy(PurpleAccount *account, PurpleBuddy *buddy,
    + PurpleGroup *group);
    +
    +/**
    + * Removes a list of buddies from the server-side buddy list.
    + *
    + * @note The lists buddies and groups are parallel lists. Be sure that node n of
    + * groups matches node n of buddies.
    + *
    + * @param account The account.
    + * @param buddies The list of buddies to remove.
    + * @param groups The list of groups to remove buddies from. Each node of this
    + * list should match the corresponding node of buddies.
    + */
    +void purple_account_remove_buddies(PurpleAccount *account, GList *buddies,
    + GList *groups);
    +
    +/**
    + * Removes a group from the server-side buddy list.
    + *
    + * @param account The account.
    + * @param group The group to remove.
    + */
    +void purple_account_remove_group(PurpleAccount *account, PurpleGroup *group);
    +
    +/**
    + * Changes the password on the specified account.
    + *
    + * @param account The account.
    + * @param orig_pw The old password.
    + * @param new_pw The new password.
    + */
    +void purple_account_change_password(PurpleAccount *account, const char *orig_pw,
    + const char *new_pw);
    +
    +/**
    + * Whether the account supports sending offline messages to buddy.
    + *
    + * @param account The account
    + * @param buddy The buddy
    + */
    +gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy);
    +
    +/**
    + * Get the error that caused the account to be disconnected, or @c NULL if the
    + * account is happily connected or disconnected without an error.
    + *
    + * @param account The account whose error should be retrieved.
    + * @constreturn The type of error and a human-readable description of the
    + * current error, or @c NULL if there is no current error. This
    + * pointer is guaranteed to remain valid until the @ref
    + * account-error-changed signal is emitted for @a account.
    + */
    +const PurpleConnectionErrorInfo *purple_account_get_current_error(PurpleAccount *account);
    +
    +/**
    + * Clear an account's current error state, resetting it to @c NULL.
    + *
    + * @param account The account whose error state should be cleared.
    + */
    +void purple_account_clear_current_error(PurpleAccount *account);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Accounts API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Adds an account to the list of accounts.
    + *
    + * @param account The account.
    + */
    +void purple_accounts_add(PurpleAccount *account);
    +
    +/**
    + * Removes an account from the list of accounts.
    + *
    + * @param account The account.
    + */
    +void purple_accounts_remove(PurpleAccount *account);
    +
    +/**
    + * Deletes an account.
    + *
    + * This will remove any buddies from the buddy list that belong to this
    + * account, buddy pounces that belong to this account, and will also
    + * destroy @a account.
    + *
    + * @param account The account.
    + */
    +void purple_accounts_delete(PurpleAccount *account);
    +
    +/**
    + * Reorders an account.
    + *
    + * @param account The account to reorder.
    + * @param new_index The new index for the account.
    + */
    +void purple_accounts_reorder(PurpleAccount *account, gint new_index);
    +
    +/**
    + * Returns a list of all accounts.
    + *
    + * @constreturn A list of all accounts.
    + */
    +GList *purple_accounts_get_all(void);
    +
    +/**
    + * Returns a list of all enabled accounts
    + *
    + * @return A list of all enabled accounts. The list is owned
    + * by the caller, and must be g_list_free()d to avoid
    + * leaking the nodes.
    + */
    +GList *purple_accounts_get_all_active(void);
    +
    +/**
    + * Finds an account with the specified name and protocol id.
    + *
    + * @param name The account username.
    + * @param protocol The account protocol ID.
    + *
    + * @return The account, if found, or @c FALSE otherwise.
    + */
    +PurpleAccount *purple_accounts_find(const char *name, const char *protocol);
    +
    +/**
    + * This is called by the core after all subsystems and what
    + * not have been initialized. It sets all enabled accounts
    + * to their startup status by signing them on, setting them
    + * away, etc.
    + *
    + * You probably shouldn't call this unless you really know
    + * what you're doing.
    + */
    +void purple_accounts_restore_current_statuses(void);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +/**
    + * Sets the UI operations structure to be used for accounts.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_accounts_set_ui_ops(PurpleAccountUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for accounts.
    + *
    + * @return The UI operations structure in use.
    + */
    +PurpleAccountUiOps *purple_accounts_get_ui_ops(void);
    +
    +/**
    + * Sets the UI operations structure to be used for account preferences.
    + *
    + * @param ops The UI operations structure.
    + * @since 2.11.0
    + */
    +void purple_account_prefs_set_ui_ops(PurpleAccountPrefsUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for account preferences.
    + *
    + * @return The UI operations structure in use.
    + * @since 2.11.0
    + */
    +PurpleAccountPrefsUiOps *purple_account_prefs_get_ui_ops(void);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Accounts Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the accounts subsystem handle.
    + *
    + * @return The accounts subsystem handle.
    + */
    +void *purple_accounts_get_handle(void);
    +
    +/**
    + * Initializes the accounts subsystem.
    + */
    +void purple_accounts_init(void);
    +
    +/**
    + * Uninitializes the accounts subsystem.
    + */
    +void purple_accounts_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_ACCOUNT_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/accountopt.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,395 @@
    +/**
    + * @file accountopt.h Account Options 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
    + */
    +#ifndef _PURPLE_ACCOUNTOPT_H_
    +#define _PURPLE_ACCOUNTOPT_H_
    +
    +#include "prefs.h"
    +
    +/**
    + * An option for an account.
    + *
    + * This is set by protocol plugins, and appears in the account settings
    + * dialogs.
    + */
    +typedef struct
    +{
    + PurplePrefType type; /**< The type of value. */
    +
    + char *text; /**< The text that will appear to the user. */
    + char *pref_name; /**< The name of the associated preference. */
    +
    + union
    + {
    + gboolean boolean; /**< The default boolean value. */
    + int integer; /**< The default integer value. */
    + char *string; /**< The default string value. */
    + GList *list; /**< The default list value. */
    +
    + } default_value;
    +
    + gboolean masked; /**< Whether the value entered should be
    + * obscured from view (for passwords and
    + * similar options)
    + */
    +} PurpleAccountOption;
    +
    +/**
    + * A username split.
    + *
    + * This is used by some protocols to separate the fields of the username
    + * into more human-readable components.
    + */
    +typedef struct
    +{
    + char *text; /**< The text that will appear to the user. */
    + char *default_value; /**< The default value. */
    + char field_sep; /**< The field separator. */
    + gboolean reverse; /**< TRUE if the separator should be found
    + starting a the end of the string, FALSE
    + otherwise */
    +
    +} PurpleAccountUserSplit;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Account Option API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new account option. If you know what @a type will be in advance,
    + * consider using purple_account_option_bool_new(),
    + * purple_account_option_int_new(), purple_account_option_string_new() or
    + * purple_account_option_list_new() (as appropriate) instead.
    + *
    + * @param type The type of option.
    + * @param text The text of the option.
    + * @param pref_name The account preference name for the option.
    + *
    + * @return The account option.
    + */
    +PurpleAccountOption *purple_account_option_new(PurplePrefType type,
    + const char *text, const char *pref_name);
    +
    +/**
    + * Creates a new boolean account option.
    + *
    + * @param text The text of the option.
    + * @param pref_name The account preference name for the option.
    + * @param default_value The default value.
    + *
    + * @return The account option.
    + */
    +PurpleAccountOption *purple_account_option_bool_new(const char *text,
    + const char *pref_name, gboolean default_value);
    +
    +/**
    + * Creates a new integer account option.
    + *
    + * @param text The text of the option.
    + * @param pref_name The account preference name for the option.
    + * @param default_value The default value.
    + *
    + * @return The account option.
    + */
    +PurpleAccountOption *purple_account_option_int_new(const char *text,
    + const char *pref_name, int default_value);
    +
    +/**
    + * Creates a new string account option.
    + *
    + * @param text The text of the option.
    + * @param pref_name The account preference name for the option.
    + * @param default_value The default value.
    + *
    + * @return The account option.
    + */
    +PurpleAccountOption *purple_account_option_string_new(const char *text,
    + const char *pref_name, const char *default_value);
    +
    +/**
    + * Creates a new list account option.
    + *
    + * The list passed will be owned by the account option, and the
    + * strings inside will be freed automatically.
    + *
    + * The list is a list of #PurpleKeyValuePair items. The key is the label that
    + * should be displayed to the user, and the <tt>(const char *)</tt> value is
    + * the internal ID that should be passed to purple_account_set_string() to
    + * choose that value.
    + *
    + * @param text The text of the option.
    + * @param pref_name The account preference name for the option.
    + * @param list The key, value list.
    + *
    + * @return The account option.
    + */
    +PurpleAccountOption *purple_account_option_list_new(const char *text,
    + const char *pref_name, GList *list);
    +
    +/**
    + * Destroys an account option.
    + *
    + * @param option The option to destroy.
    + */
    +void purple_account_option_destroy(PurpleAccountOption *option);
    +
    +/**
    + * Sets the default boolean value for an account option.
    + *
    + * @param option The account option.
    + * @param value The default boolean value.
    + */
    +void purple_account_option_set_default_bool(PurpleAccountOption *option,
    + gboolean value);
    +
    +/**
    + * Sets the default integer value for an account option.
    + *
    + * @param option The account option.
    + * @param value The default integer value.
    + */
    +void purple_account_option_set_default_int(PurpleAccountOption *option,
    + int value);
    +
    +/**
    + * Sets the default string value for an account option.
    + *
    + * @param option The account option.
    + * @param value The default string value.
    + */
    +void purple_account_option_set_default_string(PurpleAccountOption *option,
    + const char *value);
    +
    +/**
    + * Sets the masking for an account option. Setting this to %TRUE acts
    + * as a hint to the UI that the option's value should be obscured from
    + * view, like a password.
    + *
    + * @param option The account option.
    + * @param masked The masking.
    + */
    +void
    +purple_account_option_set_masked(PurpleAccountOption *option, gboolean masked);
    +
    +/**
    + * Sets the list values for an account option.
    + *
    + * The list passed will be owned by the account option, and the
    + * strings inside will be freed automatically.
    + *
    + * The list is in key, value pairs. The key is the ID stored and used
    + * internally, and the value is the label displayed.
    + *
    + * @param option The account option.
    + * @param values The default list value.
    + */
    +void purple_account_option_set_list(PurpleAccountOption *option, GList *values);
    +
    +/**
    + * Adds an item to a list account option.
    + *
    + * @param option The account option.
    + * @param key The key.
    + * @param value The value.
    + */
    +void purple_account_option_add_list_item(PurpleAccountOption *option,
    + const char *key, const char *value);
    +
    +/**
    + * Returns the specified account option's type.
    + *
    + * @param option The account option.
    + *
    + * @return The account option's type.
    + */
    +PurplePrefType purple_account_option_get_type(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the text for an account option.
    + *
    + * @param option The account option.
    + *
    + * @return The account option's text.
    + */
    +const char *purple_account_option_get_text(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the name of an account option. This corresponds to the @c pref_name
    + * parameter supplied to purple_account_option_new() or one of the
    + * type-specific constructors.
    + *
    + * @param option The account option.
    + *
    + * @return The option's name.
    + */
    +const char *purple_account_option_get_setting(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the default boolean value for an account option.
    + *
    + * @param option The account option.
    + *
    + * @return The default boolean value.
    + */
    +gboolean purple_account_option_get_default_bool(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the default integer value for an account option.
    + *
    + * @param option The account option.
    + *
    + * @return The default integer value.
    + */
    +int purple_account_option_get_default_int(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the default string value for an account option.
    + *
    + * @param option The account option.
    + *
    + * @return The default string value.
    + */
    +const char *purple_account_option_get_default_string(
    + const PurpleAccountOption *option);
    +
    +/**
    + * Returns the default string value for a list account option.
    + *
    + * @param option The account option.
    + *
    + * @return The default list string value.
    + */
    +const char *purple_account_option_get_default_list_value(
    + const PurpleAccountOption *option);
    +
    +/**
    + * Returns whether an option's value should be masked from view, like a
    + * password. If so, the UI might display each character of the option
    + * as a '*' (for example).
    + *
    + * @param option The account option.
    + *
    + * @return %TRUE if the option's value should be obscured.
    + */
    +gboolean
    +purple_account_option_get_masked(const PurpleAccountOption *option);
    +
    +/**
    + * Returns the list values for an account option.
    + *
    + * @param option The account option.
    + *
    + * @constreturn A list of #PurpleKeyValuePair, mapping the human-readable
    + * description of the value to the <tt>(const char *)</tt> that
    + * should be passed to purple_account_set_string() to set the
    + * option.
    + */
    +GList *purple_account_option_get_list(const PurpleAccountOption *option);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Account User Split API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new account username split.
    + *
    + * @param text The text of the option.
    + * @param default_value The default value.
    + * @param sep The field separator.
    + *
    + * @return The new user split.
    + */
    +PurpleAccountUserSplit *purple_account_user_split_new(const char *text,
    + const char *default_value,
    + char sep);
    +
    +/**
    + * Destroys an account username split.
    + *
    + * @param split The split to destroy.
    + */
    +void purple_account_user_split_destroy(PurpleAccountUserSplit *split);
    +
    +/**
    + * Returns the text for an account username split.
    + *
    + * @param split The account username split.
    + *
    + * @return The account username split's text.
    + */
    +const char *purple_account_user_split_get_text(const PurpleAccountUserSplit *split);
    +
    +/**
    + * Returns the default string value for an account split.
    + *
    + * @param split The account username split.
    + *
    + * @return The default string.
    + */
    +const char *purple_account_user_split_get_default_value(
    + const PurpleAccountUserSplit *split);
    +
    +/**
    + * Returns the field separator for an account split.
    + *
    + * @param split The account username split.
    + *
    + * @return The field separator.
    + */
    +char purple_account_user_split_get_separator(const PurpleAccountUserSplit *split);
    +
    +/**
    + * Returns the 'reverse' value for an account split.
    + *
    + * @param split The account username split.
    + *
    + * @return The 'reverse' value.
    + */
    +gboolean purple_account_user_split_get_reverse(const PurpleAccountUserSplit *split);
    +
    +/**
    + * Sets the 'reverse' value for an account split.
    + *
    + * @param split The account username split.
    + * @param reverse The 'reverse' value
    + */
    +void purple_account_user_split_set_reverse(PurpleAccountUserSplit *split, gboolean reverse);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_ACCOUNTOPT_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/auth.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,67 @@
    +/**
    + * @file auth.h Authentication routines
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_AUTH_H_
    +#define PURPLE_JABBER_AUTH_H_
    +
    +typedef struct _JabberSaslMech JabberSaslMech;
    +
    +#include "jabber.h"
    +#include "xmlnode.h"
    +
    +typedef enum {
    + JABBER_SASL_STATE_FAIL = -1, /* Abort, Retry, Fail? */
    + JABBER_SASL_STATE_OK = 0, /* Hooray! */
    + JABBER_SASL_STATE_CONTINUE = 1 /* More authentication required */
    +} JabberSaslState;
    +
    +struct _JabberSaslMech {
    + gint8 priority; /* Higher priority will be tried before lower priority */
    + const gchar *name;
    + JabberSaslState (*start)(JabberStream *js, xmlnode *mechanisms, xmlnode **reply, char **msg);
    + JabberSaslState (*handle_challenge)(JabberStream *js, xmlnode *packet, xmlnode **reply, char **msg);
    + JabberSaslState (*handle_success)(JabberStream *js, xmlnode *packet, char **msg);
    + JabberSaslState (*handle_failure)(JabberStream *js, xmlnode *packet, xmlnode **reply, char **msg);
    + void (*dispose)(JabberStream *js);
    +};
    +
    +void jabber_auth_start(JabberStream *js, xmlnode *packet);
    +void jabber_auth_start_old(JabberStream *js);
    +void jabber_auth_handle_challenge(JabberStream *js, xmlnode *packet);
    +void jabber_auth_handle_success(JabberStream *js, xmlnode *packet);
    +void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet);
    +
    +JabberSaslMech *jabber_auth_get_plain_mech(void);
    +JabberSaslMech *jabber_auth_get_digest_md5_mech(void);
    +JabberSaslMech **jabber_auth_get_scram_mechs(gint *count);
    +#ifdef HAVE_CYRUS_SASL
    +JabberSaslMech *jabber_auth_get_cyrus_mech(void);
    +#endif
    +
    +void jabber_auth_add_mech(JabberSaslMech *);
    +void jabber_auth_remove_mech(JabberSaslMech *);
    +
    +void jabber_auth_init(void);
    +void jabber_auth_uninit(void);
    +
    +#endif /* PURPLE_JABBER_AUTH_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/blist.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1278 @@
    +/**
    + * @file blist.h Buddy List API
    + * @ingroup core
    + * @see @ref blist-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_BLIST_H_
    +#define _PURPLE_BLIST_H_
    +
    +/* I can't believe I let ChipX86 inspire me to write good code. -Sean */
    +
    +#include <glib.h>
    +
    +/** @copydoc _PurpleBuddyList */
    +typedef struct _PurpleBuddyList PurpleBuddyList;
    +/** @copydoc _PurpleBlistUiOps */
    +typedef struct _PurpleBlistUiOps PurpleBlistUiOps;
    +/** @copydoc _PurpleBlistNode */
    +typedef struct _PurpleBlistNode PurpleBlistNode;
    +
    +/** @copydoc _PurpleChat */
    +typedef struct _PurpleChat PurpleChat;
    +/** @copydoc _PurpleGroup */
    +typedef struct _PurpleGroup PurpleGroup;
    +/** @copydoc _PurpleContact */
    +typedef struct _PurpleContact PurpleContact;
    +/** @copydoc _PurpleBuddy */
    +typedef struct _PurpleBuddy PurpleBuddy;
    +
    +/**************************************************************************/
    +/* Enumerations */
    +/**************************************************************************/
    +typedef enum
    +{
    + PURPLE_BLIST_GROUP_NODE,
    + PURPLE_BLIST_CONTACT_NODE,
    + PURPLE_BLIST_BUDDY_NODE,
    + PURPLE_BLIST_CHAT_NODE,
    + PURPLE_BLIST_OTHER_NODE
    +
    +} PurpleBlistNodeType;
    +
    +#define PURPLE_BLIST_NODE_IS_CHAT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE)
    +#define PURPLE_BLIST_NODE_IS_BUDDY(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE)
    +#define PURPLE_BLIST_NODE_IS_CONTACT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CONTACT_NODE)
    +#define PURPLE_BLIST_NODE_IS_GROUP(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_GROUP_NODE)
    +
    +#define PURPLE_BUDDY_IS_ONLINE(b) \
    + ((b) != NULL && purple_account_is_connected(purple_buddy_get_account(b)) && \
    + purple_presence_is_online(purple_buddy_get_presence(b)))
    +
    +typedef enum
    +{
    + PURPLE_BLIST_NODE_FLAG_NO_SAVE = 1 << 0 /**< node should not be saved with the buddy list */
    +
    +} PurpleBlistNodeFlags;
    +
    +/**
    + * @since 2.6.0
    + */
    +#define PURPLE_BLIST_NODE(obj) ((PurpleBlistNode *)(obj))
    +
    +#define PURPLE_BLIST_NODE_HAS_FLAG(b, f) (purple_blist_node_get_flags((PurpleBlistNode*)(b)) & (f))
    +#define PURPLE_BLIST_NODE_SHOULD_SAVE(b) (! PURPLE_BLIST_NODE_HAS_FLAG(b, PURPLE_BLIST_NODE_FLAG_NO_SAVE))
    +
    +#define PURPLE_BLIST_NODE_NAME(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE ? purple_chat_get_name((PurpleChat*)n) : \
    + purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE ? purple_buddy_get_name((PurpleBuddy*)n) : NULL)
    +
    +/**
    + * @since 2.6.0
    + */
    +#define PURPLE_GROUP(obj) ((PurpleGroup *)(obj))
    +
    +/**
    + * @since 2.6.0
    + */
    +#define PURPLE_CONTACT(obj) ((PurpleContact *)(obj))
    +
    +/**
    + * @since 2.6.0
    + */
    +#define PURPLE_BUDDY(obj) ((PurpleBuddy *)(obj))
    +
    +/**
    + * @since 2.6.0
    + */
    +#define PURPLE_CHAT(obj) ((PurpleChat *)(obj))
    +
    +#include "account.h"
    +#include "buddyicon.h"
    +#include "media.h"
    +#include "status.h"
    +
    +/**************************************************************************/
    +/* Data Structures */
    +/**************************************************************************/
    +
    +#if !(defined PURPLE_HIDE_STRUCTS) || (defined _PURPLE_BLIST_C_)
    +
    +/**
    + * A Buddy list node. This can represent a group, a buddy, or anything else.
    + * This is a base class for PurpleBuddy, PurpleContact, PurpleGroup, and for
    + * anything else that wants to put itself in the buddy list. */
    +struct _PurpleBlistNode {
    + PurpleBlistNodeType type; /**< The type of node this is */
    + PurpleBlistNode *prev; /**< The sibling before this buddy. */
    + PurpleBlistNode *next; /**< The sibling after this buddy. */
    + PurpleBlistNode *parent; /**< The parent of this node */
    + PurpleBlistNode *child; /**< The child of this node */
    + GHashTable *settings; /**< per-node settings */
    + void *ui_data; /**< The UI can put data here. */
    + PurpleBlistNodeFlags flags; /**< The buddy flags */
    +};
    +
    +/**
    + * A buddy. This contains everything Purple will ever need to know about someone on the buddy list. Everything.
    + */
    +struct _PurpleBuddy {
    + PurpleBlistNode node; /**< The node that this buddy inherits from */
    + char *name; /**< The name of the buddy. */
    + char *alias; /**< The user-set alias of the buddy */
    + char *server_alias; /**< The server-specified alias of the buddy */
    + void *proto_data; /**< This allows the prpl to associate whatever data it wants with a buddy */
    + PurpleBuddyIcon *icon; /**< The buddy icon. */
    + PurpleAccount *account; /**< the account this buddy belongs to */
    + PurplePresence *presence;
    + PurpleMediaCaps media_caps; /**< The media capabilities of the buddy. */
    +};
    +
    +/**
    + * A contact. This contains everything Purple will ever need to know about a contact.
    + */
    +struct _PurpleContact {
    + PurpleBlistNode node; /**< The node that this contact inherits from. */
    + char *alias; /**< The user-set alias of the contact */
    + int totalsize; /**< The number of buddies in this contact */
    + int currentsize; /**< The number of buddies in this contact corresponding to online accounts */
    + int online; /**< The number of buddies in this contact who are currently online */
    + PurpleBuddy *priority; /**< The "top" buddy for this contact */
    + gboolean priority_valid; /**< Is priority valid? */
    +};
    +
    +
    +/**
    + * A group. This contains everything Purple will ever need to know about a group.
    + */
    +struct _PurpleGroup {
    + PurpleBlistNode node; /**< The node that this group inherits from */
    + char *name; /**< The name of this group. */
    + int totalsize; /**< The number of chats and contacts in this group */
    + int currentsize; /**< The number of chats and contacts in this group corresponding to online accounts */
    + int online; /**< The number of chats and contacts in this group who are currently online */
    +};
    +
    +/**
    + * A chat. This contains everything Purple needs to put a chat room in the
    + * buddy list.
    + */
    +struct _PurpleChat {
    + PurpleBlistNode node; /**< The node that this chat inherits from */
    + char *alias; /**< The display name of this chat. */
    + GHashTable *components; /**< the stuff the protocol needs to know to join the chat */
    + PurpleAccount *account; /**< The account this chat is attached to */
    +};
    +
    +/**
    + * The Buddy List
    + */
    +struct _PurpleBuddyList {
    + PurpleBlistNode *root; /**< The first node in the buddy list */
    + GHashTable *buddies; /**< Every buddy in this list */
    + void *ui_data; /**< UI-specific data. */
    +};
    +
    +#endif /* PURPLE_HIDE_STRUCTS && PURPLE_BLIST_STRUCTS */
    +
    +/**
    + * Buddy list UI operations.
    + *
    + * Any UI representing a buddy list must assign a filled-out PurpleBlistUiOps
    + * structure to the buddy list core.
    + */
    +struct _PurpleBlistUiOps
    +{
    + void (*new_list)(PurpleBuddyList *list); /**< Sets UI-specific data on a buddy list. */
    + void (*new_node)(PurpleBlistNode *node); /**< Sets UI-specific data on a node. */
    + void (*show)(PurpleBuddyList *list); /**< The core will call this when it's finished doing its core stuff */
    + void (*update)(PurpleBuddyList *list,
    + PurpleBlistNode *node); /**< This will update a node in the buddy list. */
    + void (*remove)(PurpleBuddyList *list,
    + PurpleBlistNode *node); /**< This removes a node from the list */
    + void (*destroy)(PurpleBuddyList *list); /**< When the list is destroyed, this is called to destroy the UI. */
    + void (*set_visible)(PurpleBuddyList *list,
    + gboolean show); /**< Hides or unhides the buddy list */
    + void (*request_add_buddy)(PurpleAccount *account, const char *username,
    + const char *group, const char *alias);
    + void (*request_add_chat)(PurpleAccount *account, PurpleGroup *group,
    + const char *alias, const char *name);
    + void (*request_add_group)(void);
    +
    + /**
    + * This is called when a node has been modified and should be saved.
    + *
    + * Implementation of this UI op is OPTIONAL. If not implemented, it will
    + * be set to a fallback function that saves data to blist.xml like in
    + * previous libpurple versions.
    + *
    + * @param node The node which has been modified.
    + *
    + * @since 2.6.0.
    + */
    + void (*save_node)(PurpleBlistNode *node);
    +
    + /**
    + * Called when a node is about to be removed from the buddy list.
    + * The UI op should update the relevant data structures to remove this
    + * node (for example, removing a buddy from the group this node is in).
    + *
    + * Implementation of this UI op is OPTIONAL. If not implemented, it will
    + * be set to a fallback function that saves data to blist.xml like in
    + * previous libpurple versions.
    + *
    + * @param node The node which has been modified.
    + * @since 2.6.0.
    + */
    + void (*remove_node)(PurpleBlistNode *node);
    +
    + /**
    + * Called to save all the data for an account. If the UI sets this,
    + * the callback must save the privacy and buddy list data for an account.
    + * If the account is NULL, save the data for all accounts.
    + *
    + * Implementation of this UI op is OPTIONAL. If not implemented, it will
    + * be set to a fallback function that saves data to blist.xml like in
    + * previous libpurple versions.
    + *
    + * @param account The account whose data to save. If NULL, save all data
    + * for all accounts.
    + * @since 2.6.0.
    + */
    + void (*save_account)(PurpleAccount *account);
    +
    + void (*_purple_reserved1)(void);
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Buddy List API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new buddy list
    + *
    + * @return The new buddy list.
    + * @deprecated In 3.0.0, this will be handled by purple_blist_init()
    + */
    +PurpleBuddyList *purple_blist_new(void);
    +
    +/**
    + * Sets the main buddy list.
    + *
    + * @param blist The buddy list you want to use.
    + * @deprecated In 3.0.0, this will be handled by purple_blist_init()
    + */
    +void purple_set_blist(PurpleBuddyList *blist);
    +
    +/**
    + * Returns the main buddy list.
    + *
    + * @return The main buddy list.
    + */
    +PurpleBuddyList *purple_get_blist(void);
    +
    +/**
    + * Returns the root node of the main buddy list.
    + *
    + * @return The root node.
    + */
    +PurpleBlistNode *purple_blist_get_root(void);
    +
    +/**
    + * Returns a list of every buddy in the list. Use of this function is
    + * discouraged if you do not actually need every buddy in the list. Use
    + * purple_find_buddies instead.
    + *
    + * @return A list of every buddy in the list. Caller is responsible for
    + * freeing the list.
    + *
    + * @see purple_find_buddies
    + * @since 2.6.0
    + */
    +GSList *purple_blist_get_buddies(void);
    +
    +/**
    + * Returns the UI data for the list.
    + *
    + * @return The UI data for the list.
    + *
    + * @since 2.6.0
    + */
    +gpointer purple_blist_get_ui_data(void);
    +
    +/**
    + * Sets the UI data for the list.
    + *
    + * @param ui_data The UI data for the list.
    + *
    + * @since 2.6.0
    + */
    +void purple_blist_set_ui_data(gpointer ui_data);
    +
    +/**
    + * Returns the next node of a given node. This function is to be used to iterate
    + * over the tree returned by purple_get_blist.
    + *
    + * @param node A node.
    + * @param offline Whether to include nodes for offline accounts
    + * @return The next node
    + * @see purple_blist_node_get_parent
    + * @see purple_blist_node_get_first_child
    + * @see purple_blist_node_get_sibling_next
    + * @see purple_blist_node_get_sibling_prev
    + */
    +PurpleBlistNode *purple_blist_node_next(PurpleBlistNode *node, gboolean offline);
    +
    +/**
    + * Returns the parent node of a given node.
    + *
    + * @param node A node.
    + * @return The parent node.
    + * @since 2.4.0
    + * @see purple_blist_node_get_first_child
    + * @see purple_blist_node_get_sibling_next
    + * @see purple_blist_node_get_sibling_prev
    + * @see purple_blist_node_next
    + */
    +PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node);
    +
    +/**
    + * Returns the the first child node of a given node.
    + *
    + * @param node A node.
    + * @return The child node.
    + * @since 2.4.0
    + * @see purple_blist_node_get_parent
    + * @see purple_blist_node_get_sibling_next
    + * @see purple_blist_node_get_sibling_prev
    + * @see purple_blist_node_next
    + */
    +PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node);
    +
    +/**
    + * Returns the sibling node of a given node.
    + *
    + * @param node A node.
    + * @return The sibling node.
    + * @since 2.4.0
    + * @see purple_blist_node_get_parent
    + * @see purple_blist_node_get_first_child
    + * @see purple_blist_node_get_sibling_prev
    + * @see purple_blist_node_next
    + */
    +PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node);
    +
    +/**
    + * Returns the previous sibling node of a given node.
    + *
    + * @param node A node.
    + * @return The sibling node.
    + * @since 2.4.0
    + * @see purple_blist_node_get_parent
    + * @see purple_blist_node_get_first_child
    + * @see purple_blist_node_get_sibling_next
    + * @see purple_blist_node_next
    + */
    +PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node);
    +
    +/**
    + * Returns the UI data of a given node.
    + *
    + * @param node The node.
    + * @return The UI data.
    + * @since 2.6.0
    + */
    +gpointer purple_blist_node_get_ui_data(const PurpleBlistNode *node);
    +
    +/**
    + * Sets the UI data of a given node.
    + *
    + * @param node The node.
    + * @param ui_data The UI data.
    + *
    + * @since 2.6.0
    + */
    +void purple_blist_node_set_ui_data(PurpleBlistNode *node, gpointer ui_data);
    +
    +/**
    + * Shows the buddy list, creating a new one if necessary.
    + */
    +void purple_blist_show(void);
    +
    +
    +/**
    + * Destroys the buddy list window.
    + *
    + * @deprecated The UI is responsible for cleaning up the
    + * PurpleBuddyList->ui_data. purple_blist_uninit() will free the
    + * PurpleBuddyList* itself.
    + */
    +void purple_blist_destroy(void);
    +
    +/**
    + * Hides or unhides the buddy list.
    + *
    + * @param show Whether or not to show the buddy list
    + */
    +void purple_blist_set_visible(gboolean show);
    +
    +/**
    + * Updates a buddy's status.
    + *
    + * This should only be called from within Purple.
    + *
    + * @param buddy The buddy whose status has changed.
    + * @param old_status The status from which we are changing.
    + */
    +void purple_blist_update_buddy_status(PurpleBuddy *buddy, PurpleStatus *old_status);
    +
    +/**
    + * Updates a node's custom icon.
    + *
    + * @param node The PurpleBlistNode whose custom icon has changed.
    + *
    + * @since 2.5.0
    + */
    +void purple_blist_update_node_icon(PurpleBlistNode *node);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    +/**
    + * Updates a buddy's icon.
    + *
    + * @param buddy The buddy whose buddy icon has changed
    + * @deprecated Use purple_blist_update_node_icon() instead.
    + */
    +void purple_blist_update_buddy_icon(PurpleBuddy *buddy);
    +#endif
    +
    +/**
    + * Renames a buddy in the buddy list.
    + *
    + * @param buddy The buddy whose name will be changed.
    + * @param name The new name of the buddy.
    + */
    +void purple_blist_rename_buddy(PurpleBuddy *buddy, const char *name);
    +
    +/**
    + * Aliases a contact in the buddy list.
    + *
    + * @param contact The contact whose alias will be changed.
    + * @param alias The contact's alias.
    + */
    +void purple_blist_alias_contact(PurpleContact *contact, const char *alias);
    +
    +/**
    + * Aliases a buddy in the buddy list.
    + *
    + * @param buddy The buddy whose alias will be changed.
    + * @param alias The buddy's alias.
    + */
    +void purple_blist_alias_buddy(PurpleBuddy *buddy, const char *alias);
    +
    +/**
    + * Sets the server-sent alias of a buddy in the buddy list.
    + * PRPLs should call serv_got_alias() instead of this.
    + *
    + * @param buddy The buddy whose alias will be changed.
    + * @param alias The buddy's "official" alias.
    + */
    +void purple_blist_server_alias_buddy(PurpleBuddy *buddy, const char *alias);
    +
    +/**
    + * Aliases a chat in the buddy list.
    + *
    + * @param chat The chat whose alias will be changed.
    + * @param alias The chat's new alias.
    + */
    +void purple_blist_alias_chat(PurpleChat *chat, const char *alias);
    +
    +/**
    + * Renames a group
    + *
    + * @param group The group to rename
    + * @param name The new name
    + */
    +void purple_blist_rename_group(PurpleGroup *group, const char *name);
    +
    +/**
    + * Creates a new chat for the buddy list
    + *
    + * @param account The account this chat will get added to
    + * @param alias The alias of the new chat
    + * @param components The info the prpl needs to join the chat. The
    + * hash function should be g_str_hash() and the
    + * equal function should be g_str_equal().
    + * @return A newly allocated chat
    + */
    +PurpleChat *purple_chat_new(PurpleAccount *account, const char *alias, GHashTable *components);
    +
    +/**
    + * Destroys a chat
    + *
    + * @param chat The chat to destroy
    + */
    +void purple_chat_destroy(PurpleChat *chat);
    +
    +/**
    + * Adds a new chat to the buddy list.
    + *
    + * The chat will be inserted right after node or appended to the end
    + * of group if node is NULL. If both are NULL, the buddy will be added to
    + * the "Chats" group.
    + *
    + * @param chat The new chat who gets added
    + * @param group The group to add the new chat to.
    + * @param node The insertion point
    + */
    +void purple_blist_add_chat(PurpleChat *chat, PurpleGroup *group, PurpleBlistNode *node);
    +
    +/**
    + * Creates a new buddy.
    + *
    + * This function only creates the PurpleBuddy. Use purple_blist_add_buddy
    + * to add the buddy to the list and purple_account_add_buddy to sync up
    + * with the server.
    + *
    + * @param account The account this buddy will get added to
    + * @param name The name of the new buddy
    + * @param alias The alias of the new buddy (or NULL if unaliased)
    + * @return A newly allocated buddy
    + *
    + * @see purple_account_add_buddy
    + * @see purple_blist_add_buddy
    + */
    +PurpleBuddy *purple_buddy_new(PurpleAccount *account, const char *name, const char *alias);
    +
    +/**
    + * Destroys a buddy
    + *
    + * @param buddy The buddy to destroy
    + */
    +void purple_buddy_destroy(PurpleBuddy *buddy);
    +
    +/**
    + * Sets a buddy's icon.
    + *
    + * This should only be called from within Purple. You probably want to
    + * call purple_buddy_icon_set_data().
    + *
    + * @param buddy The buddy.
    + * @param icon The buddy icon.
    + *
    + * @see purple_buddy_icon_set_data()
    + */
    +void purple_buddy_set_icon(PurpleBuddy *buddy, PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns a buddy's account.
    + *
    + * @param buddy The buddy.
    + *
    + * @return The account
    + */
    +PurpleAccount *purple_buddy_get_account(const PurpleBuddy *buddy);
    +
    +/**
    + * Returns a buddy's name
    + *
    + * @param buddy The buddy.
    + *
    + * @return The name.
    + */
    +const char *purple_buddy_get_name(const PurpleBuddy *buddy);
    +
    +/**
    + * Returns a buddy's icon.
    + *
    + * @param buddy The buddy.
    + *
    + * @return The buddy icon.
    + */
    +PurpleBuddyIcon *purple_buddy_get_icon(const PurpleBuddy *buddy);
    +
    +/**
    + * Returns a buddy's protocol-specific data.
    + *
    + * This should only be called from the associated prpl.
    + *
    + * @param buddy The buddy.
    + * @return The protocol data.
    + *
    + * @see purple_buddy_set_protocol_data()
    + * @since 2.6.0
    + */
    +gpointer purple_buddy_get_protocol_data(const PurpleBuddy *buddy);
    +
    +/**
    + * Sets a buddy's protocol-specific data.
    + *
    + * This should only be called from the associated prpl.
    + *
    + * @param buddy The buddy.
    + * @param data The data.
    + *
    + * @see purple_buddy_get_protocol_data()
    + * @since 2.6.0
    + */
    +void purple_buddy_set_protocol_data(PurpleBuddy *buddy, gpointer data);
    +
    +/**
    + * Returns a buddy's contact.
    + *
    + * @param buddy The buddy.
    + *
    + * @return The buddy's contact.
    + */
    +PurpleContact *purple_buddy_get_contact(PurpleBuddy *buddy);
    +
    +/**
    + * Returns a buddy's presence.
    + *
    + * @param buddy The buddy.
    + *
    + * @return The buddy's presence.
    + */
    +PurplePresence *purple_buddy_get_presence(const PurpleBuddy *buddy);
    +
    +/**
    + * Gets the media caps from a buddy.
    + *
    + * @param buddy The buddy.
    + * @return The media caps.
    + *
    + * @since 2.7.0
    + */
    +PurpleMediaCaps purple_buddy_get_media_caps(const PurpleBuddy *buddy);
    +
    +/**
    + * Sets the media caps for a buddy.
    + *
    + * @param buddy The PurpleBuddy.
    + * @param media_caps The PurpleMediaCaps.
    + */
    +void purple_buddy_set_media_caps(PurpleBuddy *buddy, PurpleMediaCaps media_caps);
    +
    +/**
    + * Adds a new buddy to the buddy list.
    + *
    + * The buddy will be inserted right after node or prepended to the
    + * group if node is NULL. If both are NULL, the buddy will be added to
    + * the "Buddies" group.
    + *
    + * @param buddy The new buddy who gets added
    + * @param contact The optional contact to place the buddy in.
    + * @param group The group to add the new buddy to.
    + * @param node The insertion point. Pass in NULL to add the node as
    + * the first child in the given group.
    + */
    +void purple_blist_add_buddy(PurpleBuddy *buddy, PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
    +
    +/**
    + * Creates a new group
    + *
    + * You can't have more than one group with the same name. Sorry. If you pass
    + * this the name of a group that already exists, it will return that group.
    + *
    + * @param name The name of the new group
    + * @return A new group struct
    +*/
    +PurpleGroup *purple_group_new(const char *name);
    +
    +/**
    + * Destroys a group
    + *
    + * @param group The group to destroy
    +*/
    +void purple_group_destroy(PurpleGroup *group);
    +
    +/**
    + * Adds a new group to the buddy list.
    + *
    + * The new group will be inserted after insert or prepended to the list if
    + * node is NULL.
    + *
    + * @param group The group
    + * @param node The insertion point
    + */
    +void purple_blist_add_group(PurpleGroup *group, PurpleBlistNode *node);
    +
    +/**
    + * Creates a new contact
    + *
    + * @return A new contact struct
    + */
    +PurpleContact *purple_contact_new(void);
    +
    +/**
    + * Destroys a contact
    + *
    + * @param contact The contact to destroy
    + */
    +void purple_contact_destroy(PurpleContact *contact);
    +
    +/**
    + * Gets the PurpleGroup from a PurpleContact
    + *
    + * @param contact The contact
    + * @return The group
    + *
    + * @since 2.7.0
    + */
    +PurpleGroup *purple_contact_get_group(const PurpleContact *contact);
    +
    +/**
    + * Adds a new contact to the buddy list.
    + *
    + * The new contact will be inserted after insert or prepended to the list if
    + * node is NULL.
    + *
    + * @param contact The contact
    + * @param group The group to add the contact to
    + * @param node The insertion point
    + */
    +void purple_blist_add_contact(PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
    +
    +/**
    + * Merges two contacts
    + *
    + * All of the buddies from source will be moved to target
    + *
    + * @param source The contact to merge
    + * @param node The place to merge to (a buddy or contact)
    + */
    +void purple_blist_merge_contact(PurpleContact *source, PurpleBlistNode *node);
    +
    +/**
    + * Returns the highest priority buddy for a given contact.
    + *
    + * @param contact The contact
    + * @return The highest priority buddy
    + */
    +PurpleBuddy *purple_contact_get_priority_buddy(PurpleContact *contact);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    +/**
    + * Sets the alias for a contact.
    + *
    + * @param contact The contact
    + * @param alias The alias to set, or NULL to unset
    + *
    + * @deprecated Use purple_blist_alias_contact() instead.
    + */
    +void purple_contact_set_alias(PurpleContact *contact, const char *alias);
    +#endif
    +
    +/**
    + * Gets the alias for a contact.
    + *
    + * @param contact The contact
    + * @return The alias, or NULL if it is not set.
    + */
    +const char *purple_contact_get_alias(PurpleContact *contact);
    +
    +/**
    + * Determines whether an account owns any buddies in a given contact
    + *
    + * @param contact The contact to search through.
    + * @param account The account.
    + *
    + * @return TRUE if there are any buddies from account in the contact, or FALSE otherwise.
    + */
    +gboolean purple_contact_on_account(PurpleContact *contact, PurpleAccount *account);
    +
    +/**
    + * Invalidates the priority buddy so that the next call to
    + * purple_contact_get_priority_buddy recomputes it.
    + *
    + * @param contact The contact
    + */
    +void purple_contact_invalidate_priority_buddy(PurpleContact *contact);
    +
    +/**
    + * Removes a buddy from the buddy list and frees the memory allocated to it.
    + * This doesn't actually try to remove the buddy from the server list.
    + *
    + * @param buddy The buddy to be removed
    + *
    + * @see purple_account_remove_buddy
    + */
    +void purple_blist_remove_buddy(PurpleBuddy *buddy);
    +
    +/**
    + * Removes a contact, and any buddies it contains, and frees the memory
    + * allocated to it. This calls purple_blist_remove_buddy and therefore
    + * doesn't remove the buddies from the server list.
    + *
    + * @param contact The contact to be removed
    + *
    + * @see purple_blist_remove_buddy
    + */
    +void purple_blist_remove_contact(PurpleContact *contact);
    +
    +/**
    + * Removes a chat from the buddy list and frees the memory allocated to it.
    + *
    + * @param chat The chat to be removed
    + */
    +void purple_blist_remove_chat(PurpleChat *chat);
    +
    +/**
    + * Removes a group from the buddy list and frees the memory allocated to it and to
    + * its children
    + *
    + * @param group The group to be removed
    + */
    +void purple_blist_remove_group(PurpleGroup *group);
    +
    +/**
    + * Returns the alias of a buddy.
    + *
    + * @param buddy The buddy whose name will be returned.
    + * @return The alias (if set), server alias (if set),
    + * or NULL.
    + */
    +const char *purple_buddy_get_alias_only(PurpleBuddy *buddy);
    +
    +/**
    + * Gets the server alias for a buddy.
    + *
    + * @param buddy The buddy whose name will be returned
    + * @return The server alias, or NULL if it is not set.
    + */
    +const char *purple_buddy_get_server_alias(PurpleBuddy *buddy);
    +
    +/**
    + * Returns the correct name to display for a buddy, taking the contact alias
    + * into account. In order of precedence: the buddy's alias; the buddy's
    + * contact alias; the buddy's server alias; the buddy's user name.
    + *
    + * @param buddy The buddy whose name will be returned
    + * @return The appropriate name or alias, or NULL.
    + *
    + */
    +const char *purple_buddy_get_contact_alias(PurpleBuddy *buddy);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BLIST_C_)
    +/**
    + * Returns the correct alias for this user, ignoring server aliases. Used
    + * when a user-recognizable name is required. In order: buddy's alias; buddy's
    + * contact alias; buddy's user name.
    + *
    + * @param buddy The buddy whose alias will be returned.
    + * @return The appropriate name or alias.
    + * @deprecated Try purple_buddy_get_alias(), if server aliases are okay.
    + */
    +const char *purple_buddy_get_local_alias(PurpleBuddy *buddy);
    +#endif
    +
    +/**
    + * Returns the correct name to display for a buddy. In order of precedence:
    + * the buddy's alias; the buddy's server alias; the buddy's contact alias;
    + * the buddy's user name.
    + *
    + * @param buddy The buddy whose name will be returned.
    + * @return The appropriate name or alias, or NULL
    + */
    +const char *purple_buddy_get_alias(PurpleBuddy *buddy);
    +
    +/**
    + * Returns the local alias for the buddy, or @c NULL if none exists.
    + *
    + * @param buddy The buddy
    + * @return The local alias for the buddy
    + *
    + * @since 2.6.0
    + */
    +const char *purple_buddy_get_local_buddy_alias(PurpleBuddy *buddy);
    +
    +/**
    + * Returns the correct name to display for a blist chat.
    + *
    + * @param chat The chat whose name will be returned.
    + * @return The alias (if set), or first component value.
    + */
    +const char *purple_chat_get_name(PurpleChat *chat);
    +
    +/**
    + * Finds the buddy struct given a name and an account
    + *
    + * @param account The account this buddy belongs to
    + * @param name The buddy's name
    + * @return The buddy or NULL if the buddy does not exist
    + */
    +PurpleBuddy *purple_find_buddy(PurpleAccount *account, const char *name);
    +
    +/**
    + * Finds the buddy struct given a name, an account, and a group
    + *
    + * @param account The account this buddy belongs to
    + * @param name The buddy's name
    + * @param group The group to look in
    + * @return The buddy or NULL if the buddy does not exist in the group
    + */
    +PurpleBuddy *purple_find_buddy_in_group(PurpleAccount *account, const char *name,
    + PurpleGroup *group);
    +
    +/**
    + * Finds all PurpleBuddy structs given a name and an account
    + *
    + * @param account The account this buddy belongs to
    + * @param name The buddy's name (or NULL to return all buddies for the account)
    + *
    + * @return A GSList of buddies (which must be freed), or NULL if the buddy doesn't exist
    + */
    +GSList *purple_find_buddies(PurpleAccount *account, const char *name);
    +
    +
    +/**
    + * Finds a group by name
    + *
    + * @param name The group's name
    + * @return The group or NULL if the group does not exist
    + */
    +PurpleGroup *purple_find_group(const char *name);
    +
    +/**
    + * Finds a chat by name.
    + *
    + * @param account The chat's account.
    + * @param name The chat's name.
    + *
    + * @return The chat, or @c NULL if the chat does not exist.
    + */
    +PurpleChat *purple_blist_find_chat(PurpleAccount *account, const char *name);
    +
    +/**
    + * Returns the group of which the chat is a member.
    + *
    + * @param chat The chat.
    + *
    + * @return The parent group, or @c NULL if the chat is not in a group.
    + */
    +PurpleGroup *purple_chat_get_group(PurpleChat *chat);
    +
    +/**
    + * Returns the account the chat belongs to.
    + *
    + * @param chat The chat.
    + *
    + * @return The account the chat belongs to.
    + *
    + * @since 2.4.0
    + */
    +PurpleAccount *purple_chat_get_account(PurpleChat *chat);
    +
    +/**
    + * Get a hashtable containing information about a chat.
    + *
    + * @param chat The chat.
    + *
    + * @constreturn The hashtable.
    + *
    + * @since 2.4.0
    + */
    +GHashTable *purple_chat_get_components(PurpleChat *chat);
    +
    +/**
    + * Returns the group of which the buddy is a member.
    + *
    + * @param buddy The buddy
    + * @return The group or NULL if the buddy is not in a group
    + */
    +PurpleGroup *purple_buddy_get_group(PurpleBuddy *buddy);
    +
    +
    +/**
    + * Returns a list of accounts that have buddies in this group
    + *
    + * @param g The group
    + *
    + * @return A GSList of accounts (which must be freed), or NULL if the group
    + * has no accounts.
    + */
    +GSList *purple_group_get_accounts(PurpleGroup *g);
    +
    +/**
    + * Determines whether an account owns any buddies in a given group
    + *
    + * @param g The group to search through.
    + * @param account The account.
    + *
    + * @return TRUE if there are any buddies in the group, or FALSE otherwise.
    + */
    +gboolean purple_group_on_account(PurpleGroup *g, PurpleAccount *account);
    +
    +/**
    + * Returns the name of a group.
    + *
    + * @param group The group.
    + *
    + * @return The name of the group.
    + */
    +const char *purple_group_get_name(PurpleGroup *group);
    +
    +/**
    + * Called when an account connects. Tells the UI to update all the
    + * buddies.
    + *
    + * @param account The account
    + */
    +void purple_blist_add_account(PurpleAccount *account);
    +
    +
    +/**
    + * Called when an account disconnects. Sets the presence of all the buddies to 0
    + * and tells the UI to update them.
    + *
    + * @param account The account
    + */
    +void purple_blist_remove_account(PurpleAccount *account);
    +
    +
    +/**
    + * Determines the total size of a group
    + *
    + * @param group The group
    + * @param offline Count buddies in offline accounts
    + * @return The number of buddies in the group
    + */
    +int purple_blist_get_group_size(PurpleGroup *group, gboolean offline);
    +
    +/**
    + * Determines the number of online buddies in a group
    + *
    + * @param group The group
    + * @return The number of online buddies in the group, or 0 if the group is NULL
    + */
    +int purple_blist_get_group_online_count(PurpleGroup *group);
    +
    +/*@}*/
    +
    +/****************************************************************************************/
    +/** @name Buddy list file management API */
    +/****************************************************************************************/
    +
    +/**
    + * Loads the buddy list from ~/.purple/blist.xml.
    + */
    +void purple_blist_load(void);
    +
    +/**
    + * Schedule a save of the blist.xml file. This is used by the privacy
    + * API whenever the privacy settings are changed. If you make a change
    + * to blist.xml using one of the functions in the buddy list API, then
    + * the buddy list is saved automatically, so you should not need to
    + * call this.
    + */
    +void purple_blist_schedule_save(void);
    +
    +/**
    + * Requests from the user information needed to add a buddy to the
    + * buddy list.
    + *
    + * @param account The account the buddy is added to.
    + * @param username The username of the buddy.
    + * @param group The name of the group to place the buddy in.
    + * @param alias The optional alias for the buddy.
    + */
    +void purple_blist_request_add_buddy(PurpleAccount *account, const char *username,
    + const char *group, const char *alias);
    +
    +/**
    + * Requests from the user information needed to add a chat to the
    + * buddy list.
    + *
    + * @param account The account the buddy is added to.
    + * @param group The optional group to add the chat to.
    + * @param alias The optional alias for the chat.
    + * @param name The required chat name.
    + */
    +void purple_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group,
    + const char *alias, const char *name);
    +
    +/**
    + * Requests from the user information needed to add a group to the
    + * buddy list.
    + */
    +void purple_blist_request_add_group(void);
    +
    +/**
    + * Associates a boolean with a node in the buddy list
    + *
    + * @param node The node to associate the data with
    + * @param key The identifier for the data
    + * @param value The value to set
    + */
    +void purple_blist_node_set_bool(PurpleBlistNode *node, const char *key, gboolean value);
    +
    +/**
    + * Retrieves a named boolean setting from a node in the buddy list
    + *
    + * @param node The node to retrieve the data from
    + * @param key The identifier of the data
    + *
    + * @return The value, or FALSE if there is no setting
    + */
    +gboolean purple_blist_node_get_bool(PurpleBlistNode *node, const char *key);
    +
    +/**
    + * Associates an integer with a node in the buddy list
    + *
    + * @param node The node to associate the data with
    + * @param key The identifier for the data
    + * @param value The value to set
    + */
    +void purple_blist_node_set_int(PurpleBlistNode *node, const char *key, int value);
    +
    +/**
    + * Retrieves a named integer setting from a node in the buddy list
    + *
    + * @param node The node to retrieve the data from
    + * @param key The identifier of the data
    + *
    + * @return The value, or 0 if there is no setting
    + */
    +int purple_blist_node_get_int(PurpleBlistNode *node, const char *key);
    +
    +/**
    + * Associates a string with a node in the buddy list
    + *
    + * @param node The node to associate the data with
    + * @param key The identifier for the data
    + * @param value The value to set
    + */
    +void purple_blist_node_set_string(PurpleBlistNode *node, const char *key,
    + const char *value);
    +
    +/**
    + * Retrieves a named string setting from a node in the buddy list
    + *
    + * @param node The node to retrieve the data from
    + * @param key The identifier of the data
    + *
    + * @return The value, or NULL if there is no setting
    + */
    +const char *purple_blist_node_get_string(PurpleBlistNode *node, const char *key);
    +
    +/**
    + * Removes a named setting from a blist node
    + *
    + * @param node The node from which to remove the setting
    + * @param key The name of the setting
    + */
    +void purple_blist_node_remove_setting(PurpleBlistNode *node, const char *key);
    +
    +/**
    + * Set the flags for the given node. Setting a node's flags will overwrite
    + * the old flags, so if you want to save them, you must first call
    + * purple_blist_node_get_flags and modify that appropriately.
    + *
    + * @param node The node on which to set the flags.
    + * @param flags The flags to set. This is a bitmask.
    + */
    +void purple_blist_node_set_flags(PurpleBlistNode *node, PurpleBlistNodeFlags flags);
    +
    +/**
    + * Get the current flags on a given node.
    + *
    + * @param node The node from which to get the flags.
    + *
    + * @return The flags on the node. This is a bitmask.
    + */
    +PurpleBlistNodeFlags purple_blist_node_get_flags(PurpleBlistNode *node);
    +
    +/**
    + * Get the type of a given node.
    + *
    + * @param node The node.
    + *
    + * @return The type of the node.
    + *
    + * @since 2.1.0
    + */
    +PurpleBlistNodeType purple_blist_node_get_type(PurpleBlistNode *node);
    +
    +/*@}*/
    +
    +/**
    + * Retrieves the extended menu items for a buddy list node.
    + * @param n The blist node for which to obtain the extended menu items.
    + * @return A list of PurpleMenuAction items, as harvested by the
    + * blist-node-extended-menu signal.
    + */
    +GList *purple_blist_node_get_extended_menu(PurpleBlistNode *n);
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used for the buddy list.
    + *
    + * @param ops The ops struct.
    + */
    +void purple_blist_set_ui_ops(PurpleBlistUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used for the buddy list.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleBlistUiOps *purple_blist_get_ui_ops(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Buddy List Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the handle for the buddy list subsystem.
    + *
    + * @return The buddy list subsystem handle.
    + */
    +void *purple_blist_get_handle(void);
    +
    +/**
    + * Initializes the buddy list subsystem.
    + */
    +void purple_blist_init(void);
    +
    +/**
    + * Uninitializes the buddy list subsystem.
    + */
    +void purple_blist_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_BLIST_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/bosh.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,43 @@
    +/**
    + * @file bosh.h Bidirectional-streams over Synchronous HTTP (BOSH) (XEP-0124 and XEP-0206)
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_BOSH_H_
    +#define PURPLE_JABBER_BOSH_H_
    +
    +typedef struct _PurpleBOSHConnection PurpleBOSHConnection;
    +
    +#include "jabber.h"
    +
    +void jabber_bosh_init(void);
    +void jabber_bosh_uninit(void);
    +
    +PurpleBOSHConnection* jabber_bosh_connection_init(JabberStream *js, const char *url);
    +void jabber_bosh_connection_destroy(PurpleBOSHConnection *conn);
    +
    +gboolean jabber_bosh_connection_is_ssl(PurpleBOSHConnection *conn);
    +void jabber_bosh_connection_send_keepalive(PurpleBOSHConnection *conn);
    +
    +void jabber_bosh_connection_connect(PurpleBOSHConnection *conn);
    +void jabber_bosh_connection_close(PurpleBOSHConnection *conn);
    +void jabber_bosh_connection_send_raw(PurpleBOSHConnection *conn, const char *data);
    +#endif /* PURPLE_JABBER_BOSH_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddy.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,125 @@
    +/**
    + * @file buddy.h Buddy handlers
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_BUDDY_H_
    +#define PURPLE_JABBER_BUDDY_H_
    +
    +typedef struct _JabberBuddy JabberBuddy;
    +
    +#include "jabber.h"
    +#include "caps.h"
    +#include "jutil.h"
    +
    +struct _JabberBuddy {
    + /**
    + * A sorted list of resources in priority descending order.
    + * This means that the first resource in the list is the
    + * "most available" (see resource_compare_cb in buddy.c for
    + * details). Don't play with this yourself, let
    + * jabber_buddy_track_resource and jabber_buddy_remove_resource do it.
    + */
    + GList *resources;
    + char *error_msg;
    + enum {
    + JABBER_INVISIBLE_NONE = 0,
    + JABBER_INVISIBLE_SERVER = 1 << 1,
    + JABBER_INVIS_BUDDY = 1 << 2
    + } invisible;
    + enum {
    + JABBER_SUB_NONE = 0,
    + JABBER_SUB_PENDING = 1 << 1,
    + JABBER_SUB_TO = 1 << 2,
    + JABBER_SUB_FROM = 1 << 3,
    + JABBER_SUB_BOTH = (JABBER_SUB_TO | JABBER_SUB_FROM),
    + JABBER_SUB_REMOVE = 1 << 4
    + } subscription;
    +};
    +
    +typedef struct _JabberAdHocCommands {
    + char *jid;
    + char *node;
    + char *name;
    +} JabberAdHocCommands;
    +
    +typedef struct _JabberBuddyResource {
    + JabberBuddy *jb;
    + char *name;
    + int priority;
    + JabberBuddyState state;
    + char *status;
    + time_t idle;
    + JabberCapabilities capabilities;
    + char *thread_id;
    + enum {
    + JABBER_CHAT_STATES_UNKNOWN,
    + JABBER_CHAT_STATES_UNSUPPORTED,
    + JABBER_CHAT_STATES_SUPPORTED
    + } chat_states;
    + struct {
    + char *version;
    + char *name;
    + char *os;
    + } client;
    + /* tz_off == PURPLE_NO_TZ_OFF when unset */
    + long tz_off;
    + struct {
    + JabberCapsClientInfo *info;
    + GList *exts;
    + } caps;
    + GList *commands;
    + gboolean commands_fetched;
    +} JabberBuddyResource;
    +
    +void jabber_buddy_free(JabberBuddy *jb);
    +JabberBuddy *jabber_buddy_find(JabberStream *js, const char *name,
    + gboolean create);
    +JabberBuddyResource *jabber_buddy_find_resource(JabberBuddy *jb,
    + const char *resource);
    +JabberBuddyResource *jabber_buddy_track_resource(JabberBuddy *jb, const char *resource,
    + int priority, JabberBuddyState state, const char *status);
    +void jabber_buddy_remove_resource(JabberBuddy *jb, const char *resource);
    +void jabber_buddy_get_info(PurpleConnection *gc, const char *who);
    +
    +GList *jabber_blist_node_menu(PurpleBlistNode *node);
    +
    +void jabber_set_info(PurpleConnection *gc, const char *info);
    +void jabber_setup_set_info(PurplePluginAction *action);
    +void jabber_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img);
    +
    +void jabber_user_search(JabberStream *js, const char *directory);
    +void jabber_user_search_begin(PurplePluginAction *);
    +
    +void jabber_buddy_remove_all_pending_buddy_info_requests(JabberStream *js);
    +
    +void jabber_vcard_fetch_mine(JabberStream *js);
    +
    +gboolean jabber_resource_know_capabilities(const JabberBuddyResource *jbr);
    +gboolean jabber_resource_has_capability(const JabberBuddyResource *jbr,
    + const gchar *cap);
    +gboolean jabber_buddy_has_capability(const JabberBuddy *jb, const gchar *cap);
    +
    +const gchar *
    +jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr,
    + const gchar *category);
    +
    +#endif /* PURPLE_JABBER_BUDDY_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddyicon.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,441 @@
    +/**
    + * @file buddyicon.h Buddy Icon 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
    + */
    +#ifndef _PURPLE_BUDDYICON_H_
    +#define _PURPLE_BUDDYICON_H_
    +
    +/** An opaque structure representing a buddy icon for a particular user on a
    + * particular #PurpleAccount. Instances are reference-counted; use
    + * purple_buddy_icon_ref() and purple_buddy_icon_unref() to take and release
    + * references.
    + */
    +typedef struct _PurpleBuddyIcon PurpleBuddyIcon;
    +
    +#include "account.h"
    +#include "blist.h"
    +#include "imgstore.h"
    +#include "prpl.h"
    +#include "util.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +
    +/**************************************************************************/
    +/** @name Buddy Icon API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new buddy icon structure and populates it.
    + *
    + * If the buddy icon already exists, you'll get a reference to that structure,
    + * which will have been updated with the data supplied.
    + *
    + * @param account The account the user is on.
    + * @param username The username the icon belongs to.
    + * @param icon_data The buddy icon data.
    + * @param icon_len The buddy icon length.
    + * @param checksum A protocol checksum from the prpl or @c NULL.
    + *
    + * @return The buddy icon structure, with a reference for the caller.
    + */
    +PurpleBuddyIcon *purple_buddy_icon_new(PurpleAccount *account, const char *username,
    + void *icon_data, size_t icon_len,
    + const char *checksum);
    +
    +/**
    + * Increments the reference count on a buddy icon.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return @a icon.
    + */
    +PurpleBuddyIcon *purple_buddy_icon_ref(PurpleBuddyIcon *icon);
    +
    +/**
    + * Decrements the reference count on a buddy icon.
    + *
    + * If the reference count reaches 0, the icon will be destroyed.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return @a icon, or @c NULL if the reference count reached 0.
    + */
    +PurpleBuddyIcon *purple_buddy_icon_unref(PurpleBuddyIcon *icon);
    +
    +/**
    + * Updates every instance of this icon.
    + *
    + * @param icon The buddy icon.
    + */
    +void purple_buddy_icon_update(PurpleBuddyIcon *icon);
    +
    +/**
    + * Sets the buddy icon's data.
    + *
    + * @param icon The buddy icon.
    + * @param data The buddy icon data, which the buddy icon code
    + * takes ownership of and will free.
    + * @param len The length of the data in @a data.
    + * @param checksum A protocol checksum from the prpl or @c NULL.
    + */
    +void
    +purple_buddy_icon_set_data(PurpleBuddyIcon *icon, guchar *data,
    + size_t len, const char *checksum);
    +
    +/**
    + * Returns the buddy icon's account.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return The account.
    + */
    +PurpleAccount *purple_buddy_icon_get_account(const PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns the buddy icon's username.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return The username.
    + */
    +const char *purple_buddy_icon_get_username(const PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns the buddy icon's checksum.
    + *
    + * This function is really only for prpl use.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return The checksum.
    + */
    +const char *purple_buddy_icon_get_checksum(const PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns the buddy icon's data.
    + *
    + * @param icon The buddy icon.
    + * @param len If not @c NULL, the length of the icon data returned will be
    + * set in the location pointed to by this.
    + *
    + * @return A pointer to the icon data.
    + */
    +gconstpointer purple_buddy_icon_get_data(const PurpleBuddyIcon *icon, size_t *len);
    +
    +/**
    + * Returns an extension corresponding to the buddy icon's file type.
    + *
    + * @param icon The buddy icon.
    + *
    + * @return The icon's extension, "icon" if unknown, or @c NULL if
    + * the image data has disappeared.
    + */
    +const char *purple_buddy_icon_get_extension(const PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns a full path to an icon.
    + *
    + * If the icon has data and the file exists in the cache, this will return
    + * a full path to the cache file.
    + *
    + * In general, it is not appropriate to be poking in the icon cache
    + * directly. If you find yourself wanting to use this function, think
    + * very long and hard about it, and then don't.
    + *
    + * @param icon The buddy icon
    + *
    + * @return A full path to the file, or @c NULL under various conditions.
    + */
    +char *purple_buddy_icon_get_full_path(PurpleBuddyIcon *icon);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Buddy Icon Subsystem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets a buddy icon for a user.
    + *
    + * @param account The account the user is on.
    + * @param username The username of the user.
    + * @param icon_data The buddy icon data, which the buddy icon code
    + * takes ownership of and will free.
    + * @param icon_len The length of the icon data.
    + * @param checksum A protocol checksum from the prpl or @c NULL.
    + */
    +void
    +purple_buddy_icons_set_for_user(PurpleAccount *account, const char *username,
    + void *icon_data, size_t icon_len,
    + const char *checksum);
    +
    +/**
    + * Returns the checksum for the buddy icon of a specified buddy.
    + *
    + * This avoids loading the icon image data from the cache if it's
    + * not already loaded for some other reason.
    + *
    + * @param buddy The buddy
    + *
    + * @return The checksum.
    + */
    +const char *
    +purple_buddy_icons_get_checksum_for_user(PurpleBuddy *buddy);
    +
    +/**
    + * Returns the buddy icon information for a user.
    + *
    + * @param account The account the user is on.
    + * @param username The username of the user.
    + *
    + * @return The icon (with a reference for the caller) if found, or @c NULL if
    + * not found.
    + */
    +PurpleBuddyIcon *
    +purple_buddy_icons_find(PurpleAccount *account, const char *username);
    +
    +/**
    + * Returns the buddy icon image for an account.
    + *
    + * The caller owns a reference to the image in the store, and must dereference
    + * the image with purple_imgstore_unref() for it to be freed.
    + *
    + * This function deals with loading the icon from the cache, if
    + * needed, so it should be called in any case where you want the
    + * appropriate icon.
    + *
    + * @param account The account
    + *
    + * @return The account's buddy icon image.
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_find_account_icon(PurpleAccount *account);
    +
    +/**
    + * Sets a buddy icon for an account.
    + *
    + * This function will deal with saving a record of the icon,
    + * caching the data, etc.
    + *
    + * @param account The account for which to set a custom icon.
    + * @param icon_data The image data of the icon, which the
    + * buddy icon code will free.
    + * @param icon_len The length of the data in @a icon_data.
    + *
    + * @return The icon that was set. The caller does NOT own
    + * a reference to this, and must call purple_imgstore_ref()
    + * if it wants one.
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_set_account_icon(PurpleAccount *account,
    + guchar *icon_data, size_t icon_len);
    +
    +/**
    + * Returns the timestamp of when the icon was set.
    + *
    + * This is intended for use in protocols that require a timestamp for
    + * buddy icon update reasons.
    + *
    + * @param account The account
    + *
    + * @return The time the icon was set, or 0 if an error occurred.
    + */
    +time_t
    +purple_buddy_icons_get_account_icon_timestamp(PurpleAccount *account);
    +
    +/**
    + * Returns a boolean indicating if a given blist node has a custom buddy icon.
    + *
    + * @param node The blist node.
    + *
    + * @return A boolean indicating if @a node has a custom buddy icon.
    + * @since 2.5.0
    + */
    +gboolean
    +purple_buddy_icons_node_has_custom_icon(PurpleBlistNode *node);
    +
    +/**
    + * Returns the custom buddy icon image for a blist node.
    + *
    + * The caller owns a reference to the image in the store, and must dereference
    + * the image with purple_imgstore_unref() for it to be freed.
    + *
    + * This function deals with loading the icon from the cache, if
    + * needed, so it should be called in any case where you want the
    + * appropriate icon.
    + *
    + * @param node The node.
    + *
    + * @return The custom buddy icon.
    + * @since 2.5.0
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_node_find_custom_icon(PurpleBlistNode *node);
    +
    +/**
    + * Sets a custom buddy icon for a blist node.
    + *
    + * This function will deal with saving a record of the icon, caching the data,
    + * etc.
    + *
    + * @param node The blist node for which to set a custom icon.
    + * @param icon_data The image data of the icon, which the buddy icon code will
    + * free. Use NULL to unset the icon.
    + * @param icon_len The length of the data in @a icon_data.
    + *
    + * @return The icon that was set. The caller does NOT own a reference to this,
    + * and must call purple_imgstore_ref() if it wants one.
    + * @since 2.5.0
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_node_set_custom_icon(PurpleBlistNode *node,
    + guchar *icon_data, size_t icon_len);
    +
    +/**
    + * Sets a custom buddy icon for a blist node.
    + *
    + * Convenience wrapper around purple_buddy_icons_node_set_custom_icon.
    + * @see purple_buddy_icons_node_set_custom_icon()
    + *
    + * @param node The blist node for which to set a custom icon.
    + * @param filename The path to the icon to set for the blist node. Use NULL
    + * to unset the custom icon.
    + *
    + * @return The icon that was set. The caller does NOT own a reference to this,
    + * and must call purple_imgstore_ref() if it wants one.
    + * @since 2.5.0
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_node_set_custom_icon_from_file(PurpleBlistNode *node,
    + const gchar *filename);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_BUDDYICON_C_)
    +/**
    + * PurpleContact version of purple_buddy_icons_node_has_custom_icon.
    + *
    + * @copydoc purple_buddy_icons_node_has_custom_icon()
    + *
    + * @deprecated Use purple_buddy_icons_node_has_custom_icon instead.
    + */
    +gboolean
    +purple_buddy_icons_has_custom_icon(PurpleContact *contact);
    +
    +/**
    + * PurpleContact version of purple_buddy_icons_node_find_custom_icon.
    + *
    + * @copydoc purple_buddy_icons_node_find_custom_icon()
    + *
    + * @deprecated Use purple_buddy_icons_node_find_custom_icon instead.
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_find_custom_icon(PurpleContact *contact);
    +
    +/**
    + * PurpleContact version of purple_buddy_icons_node_set_custom_icon.
    + *
    + * @copydoc purple_buddy_icons_node_set_custom_icon()
    + *
    + * @deprecated Use purple_buddy_icons_node_set_custom_icon instead.
    + */
    +PurpleStoredImage *
    +purple_buddy_icons_set_custom_icon(PurpleContact *contact,
    + guchar *icon_data, size_t icon_len);
    +#endif
    +
    +/**
    + * Sets whether or not buddy icon caching is enabled.
    + *
    + * @param caching TRUE of buddy icon caching should be enabled, or
    + * FALSE otherwise.
    + */
    +void purple_buddy_icons_set_caching(gboolean caching);
    +
    +/**
    + * Returns whether or not buddy icon caching should be enabled.
    + *
    + * The default is TRUE, unless otherwise specified by
    + * purple_buddy_icons_set_caching().
    + *
    + * @return TRUE if buddy icon caching is enabled, or FALSE otherwise.
    + */
    +gboolean purple_buddy_icons_is_caching(void);
    +
    +/**
    + * Sets the directory used to store buddy icon cache files.
    + *
    + * @param cache_dir The directory to store buddy icon cache files to.
    + */
    +void purple_buddy_icons_set_cache_dir(const char *cache_dir);
    +
    +/**
    + * Returns the directory used to store buddy icon cache files.
    + *
    + * The default directory is PURPLEDIR/icons, unless otherwise specified
    + * by purple_buddy_icons_set_cache_dir().
    + *
    + * @return The directory to store buddy icon cache files to.
    + */
    +const char *purple_buddy_icons_get_cache_dir(void);
    +
    +/**
    + * Returns the buddy icon subsystem handle.
    + *
    + * @return The subsystem handle.
    + */
    +void *purple_buddy_icons_get_handle(void);
    +
    +/**
    + * Initializes the buddy icon subsystem.
    + */
    +void purple_buddy_icons_init(void);
    +
    +/**
    + * Uninitializes the buddy icon subsystem.
    + */
    +void purple_buddy_icons_uninit(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Buddy Icon Helper API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets display size for a buddy icon
    + */
    +void purple_buddy_icon_get_scale_size(PurpleBuddyIconSpec *spec, int *width, int *height);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_BUDDYICON_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/buddylist.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,57 @@
    +/**
    + * @file buddylist.h
    + *
    + * purple
    + *
    + * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    + *
    + * 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
    + */
    +
    +
    +#ifndef _PURPLE_GG_BUDDYLIST_H
    +#define _PURPLE_GG_BUDDYLIST_H
    +
    +#include "connection.h"
    +#include "account.h"
    +
    +void
    +ggp_buddylist_send(PurpleConnection *gc);
    +
    +/**
    + * Load buddylist from server into the roster.
    + *
    + * @param gc PurpleConnection
    + * @param buddylist Pointer to the buddylist that will be loaded.
    + */
    +/* void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) {{{ */
    +void
    +ggp_buddylist_load(PurpleConnection *gc, char *buddylist);
    +
    +/**
    + * Get all the buddies in the current account.
    + *
    + * @param account Current account.
    + *
    + * @return List of buddies.
    + */
    +char *
    +ggp_buddylist_dump(PurpleAccount *account);
    +
    +
    +#endif /* _PURPLE_GG_BUDDYLIST_H */
    +
    +
    +/* vim: set ts=8 sts=0 sw=8 noet: */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/caps.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,129 @@
    +/*
    + * purple - Jabber Protocol Plugin
    + *
    + * 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
    + *
    + */
    +
    +#ifndef PURPLE_JABBER_CAPS_H_
    +#define PURPLE_JABBER_CAPS_H_
    +
    +typedef struct _JabberCapsClientInfo JabberCapsClientInfo;
    +
    +#include "jabber.h"
    +
    +/* Implementation of XEP-0115 - Entity Capabilities */
    +
    +typedef struct _JabberCapsNodeExts JabberCapsNodeExts;
    +
    +typedef struct _JabberCapsTuple {
    + const char *node;
    + const char *ver;
    + const char *hash;
    +} JabberCapsTuple;
    +
    +struct _JabberCapsClientInfo {
    + GList *identities; /* JabberIdentity */
    + GList *features; /* char * */
    + GList *forms; /* xmlnode * */
    + JabberCapsNodeExts *exts;
    +
    + const JabberCapsTuple tuple;
    +};
    +
    +/*
    + * This stores a set of exts "known" for a specific node (which indicates
    + * a specific client -- for reference, Pidgin, Finch, Meebo, et al share one
    + * node.) In XEP-0115 v1.3, exts are used for features that may or may not be
    + * present at a given time (PEP things, buzz might be disabled, etc).
    + *
    + * This structure is shared among all JabberCapsClientInfo instances matching
    + * a specific node (if the capstable key->hash == NULL, which indicates that
    + * the ClientInfo is using v1.3 caps as opposed to v1.5 caps).
    + *
    + * It's only exposed so that jabber_resource_has_capability can use it.
    + * Everyone else, STAY AWAY!
    + */
    +struct _JabberCapsNodeExts {
    + guint ref;
    + GHashTable *exts; /* char *ext_name -> GList *features */
    +};
    +
    +typedef void (*jabber_caps_get_info_cb)(JabberCapsClientInfo *info, GList *exts, gpointer user_data);
    +
    +void jabber_caps_init(void);
    +void jabber_caps_uninit(void);
    +
    +/**
    + * Check whether all of the exts in a char* array are known to the given info.
    + */
    +gboolean jabber_caps_exts_known(const JabberCapsClientInfo *info, char **exts);
    +
    +/**
    + * Main entity capabilites function to get the capabilities of a contact.
    + *
    + * The callback will be called synchronously if we already have the
    + * capabilities for the specified (node,ver,hash) (and, if exts are specified,
    + * if we know what each means)
    + *
    + * @param exts A g_strsplit'd (NULL-terminated) array of strings. This
    + * function is responsible for freeing it.
    + */
    +void jabber_caps_get_info(JabberStream *js, const char *who, const char *node,
    + const char *ver, const char *hash,
    + char **exts, jabber_caps_get_info_cb cb,
    + gpointer user_data);
    +
    +/**
    + * Takes a JabberCapsClientInfo pointer and returns the caps hash according to
    + * XEP-0115 Version 1.5.
    + *
    + * @param info A JabberCapsClientInfo pointer.
    + * @param hash Hash cipher to be used. Either sha-1 or md5.
    + * @return The base64 encoded SHA-1 hash; must be freed by caller
    + */
    +gchar *jabber_caps_calculate_hash(JabberCapsClientInfo *info, const char *hash);
    +
    +/**
    + * Calculate SHA1 hash for own featureset.
    + */
    +void jabber_caps_calculate_own_hash(JabberStream *js);
    +
    +/** Get the current caps hash.
    + * @ret hash
    +**/
    +const gchar* jabber_caps_get_own_hash(JabberStream *js);
    +
    +/**
    + * Broadcast a new calculated hash using a <presence> stanza.
    + */
    +void jabber_caps_broadcast_change(void);
    +
    +/**
    + * Parse the <query/> element from an IQ stanza into a JabberCapsClientInfo
    + * struct.
    + *
    + * Exposed for tests
    + *
    + * @param query The 'query' element from an IQ reply stanza.
    + * @returns A JabberCapsClientInfo struct, or NULL on error
    + */
    +JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query);
    +
    +#endif /* PURPLE_JABBER_CAPS_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/certificate.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,959 @@
    +/**
    + * @file certificate.h Public-Key Certificate API
    + * @ingroup core
    + * @see @ref certificate-signals
    + * @since 2.2.0
    + */
    +
    +/*
    + *
    + * 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
    + */
    +
    +#ifndef _PURPLE_CERTIFICATE_H
    +#define _PURPLE_CERTIFICATE_H
    +
    +#include <time.h>
    +
    +#include <glib.h>
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif /* __cplusplus */
    +
    +
    +typedef enum
    +{
    + PURPLE_CERTIFICATE_INVALID = 0,
    + PURPLE_CERTIFICATE_VALID = 1
    +} PurpleCertificateVerificationStatus;
    +
    +/*
    + * TODO: Merge this with PurpleCertificateVerificationStatus for 3.0.0 */
    +typedef enum {
    + PURPLE_CERTIFICATE_UNKNOWN_ERROR = -1,
    +
    + /* Not an error */
    + PURPLE_CERTIFICATE_NO_PROBLEMS = 0,
    +
    + /* Non-fatal */
    + PURPLE_CERTIFICATE_NON_FATALS_MASK = 0x0000FFFF,
    +
    + /* The certificate is self-signed. */
    + PURPLE_CERTIFICATE_SELF_SIGNED = 0x01,
    +
    + /* The CA is not in libpurple's pool of certificates. */
    + PURPLE_CERTIFICATE_CA_UNKNOWN = 0x02,
    +
    + /* The current time is before the certificate's specified
    + * activation time.
    + */
    + PURPLE_CERTIFICATE_NOT_ACTIVATED = 0x04,
    +
    + /* The current time is after the certificate's specified expiration time */
    + PURPLE_CERTIFICATE_EXPIRED = 0x08,
    +
    + /* The certificate's subject name doesn't match the expected */
    + PURPLE_CERTIFICATE_NAME_MISMATCH = 0x10,
    +
    + /* No CA pool was found. This shouldn't happen... */
    + PURPLE_CERTIFICATE_NO_CA_POOL = 0x20,
    +
    + /* Fatal */
    + PURPLE_CERTIFICATE_FATALS_MASK = 0xFFFF0000,
    +
    + /* The signature chain could not be validated. Due to limitations in the
    + * the current API, this also indicates one of the CA certificates in the
    + * chain is expired (or not yet activated). FIXME 3.0.0 */
    + PURPLE_CERTIFICATE_INVALID_CHAIN = 0x10000,
    +
    + /* The signature has been revoked. */
    + PURPLE_CERTIFICATE_REVOKED = 0x20000,
    +
    + PURPLE_CERTIFICATE_LAST = 0x40000,
    +} PurpleCertificateInvalidityFlags;
    +
    +typedef struct _PurpleCertificate PurpleCertificate;
    +typedef struct _PurpleCertificatePool PurpleCertificatePool;
    +typedef struct _PurpleCertificateScheme PurpleCertificateScheme;
    +typedef struct _PurpleCertificateVerifier PurpleCertificateVerifier;
    +typedef struct _PurpleCertificateVerificationRequest PurpleCertificateVerificationRequest;
    +
    +/**
    + * Callback function for the results of a verification check
    + * @param st Status code
    + * @param userdata User-defined data
    + */
    +typedef void (*PurpleCertificateVerifiedCallback)
    + (PurpleCertificateVerificationStatus st,
    + gpointer userdata);
    +
    +/** A certificate instance
    + *
    + * An opaque data structure representing a single certificate under some
    + * CertificateScheme
    + */
    +struct _PurpleCertificate
    +{
    + /** Scheme this certificate is under */
    + PurpleCertificateScheme * scheme;
    + /** Opaque pointer to internal data */
    + gpointer data;
    +};
    +
    +/**
    + * Database for retrieval or storage of Certificates
    + *
    + * More or less a hash table; all lookups and writes are controlled by a string
    + * key.
    + */
    +struct _PurpleCertificatePool
    +{
    + /** Scheme this Pool operates for */
    + gchar *scheme_name;
    + /** Internal name to refer to the pool by */
    + gchar *name;
    +
    + /** User-friendly name for this type
    + * ex: N_("SSL Servers")
    + * When this is displayed anywhere, it should be i18ned
    + * ex: _(pool->fullname)
    + */
    + gchar *fullname;
    +
    + /** Internal pool data */
    + gpointer data;
    +
    + /**
    + * Set up the Pool's internal state
    + *
    + * Upon calling purple_certificate_register_pool() , this function will
    + * be called. May be NULL.
    + * @return TRUE if the initialization succeeded, otherwise FALSE
    + */
    + gboolean (* init)(void);
    +
    + /**
    + * Uninit the Pool's internal state
    + *
    + * Will be called by purple_certificate_unregister_pool() . May be NULL
    + */
    + void (* uninit)(void);
    +
    + /** Check for presence of a certificate in the pool using unique ID */
    + gboolean (* cert_in_pool)(const gchar *id);
    + /** Retrieve a PurpleCertificate from the pool */
    + PurpleCertificate * (* get_cert)(const gchar *id);
    + /** Add a certificate to the pool. Must overwrite any other
    + * certificates sharing the same ID in the pool.
    + * @return TRUE if the operation succeeded, otherwise FALSE
    + */
    + gboolean (* put_cert)(const gchar *id, PurpleCertificate *crt);
    + /** Delete a certificate from the pool */
    + gboolean (* delete_cert)(const gchar *id);
    +
    + /** Returns a list of IDs stored in the pool */
    + GList * (* get_idlist)(void);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/** A certificate type
    + *
    + * A CertificateScheme must implement all of the fields in the structure,
    + * and register it using purple_certificate_register_scheme()
    + *
    + * There may be only ONE CertificateScheme provided for each certificate
    + * type, as specified by the "name" field.
    + */
    +struct _PurpleCertificateScheme
    +{
    + /** Name of the certificate type
    + * ex: "x509", "pgp", etc.
    + * This must be globally unique - you may not register more than one
    + * CertificateScheme of the same name at a time.
    + */
    + gchar * name;
    +
    + /** User-friendly name for this type
    + * ex: N_("X.509 Certificates")
    + * When this is displayed anywhere, it should be i18ned
    + * ex: _(scheme->fullname)
    + */
    + gchar * fullname;
    +
    + /** Imports a certificate from a file
    + *
    + * @param filename File to import the certificate from
    + * @return Pointer to the newly allocated Certificate struct
    + * or NULL on failure.
    + */
    + PurpleCertificate * (* import_certificate)(const gchar * filename);
    +
    + /**
    + * Exports a certificate to a file
    + *
    + * @param filename File to export the certificate to
    + * @param crt Certificate to export
    + * @return TRUE if the export succeeded, otherwise FALSE
    + * @see purple_certificate_export()
    + */
    + gboolean (* export_certificate)(const gchar *filename, PurpleCertificate *crt);
    +
    + /**
    + * Duplicates a certificate
    + *
    + * Certificates are generally assumed to be read-only, so feel free to
    + * do any sort of reference-counting magic you want here. If this ever
    + * changes, please remember to change the magic accordingly.
    + * @return Reference to the new copy
    + */
    + PurpleCertificate * (* copy_certificate)(PurpleCertificate *crt);
    +
    + /** Destroys and frees a Certificate structure
    + *
    + * Destroys a Certificate's internal data structures and calls
    + * free(crt)
    + *
    + * @param crt Certificate instance to be destroyed. It WILL NOT be
    + * destroyed if it is not of the correct
    + * CertificateScheme. Can be NULL
    + */
    + void (* destroy_certificate)(PurpleCertificate * crt);
    +
    + /** Find whether "crt" has a valid signature from "issuer," including
    + * appropriate values for the CA flag in the basic constraints extension.
    + * @see purple_certificate_signed_by() */
    + gboolean (*signed_by)(PurpleCertificate *crt, PurpleCertificate *issuer);
    + /**
    + * Retrieves the certificate public key fingerprint using SHA1
    + *
    + * @param crt Certificate instance
    + * @return Binary representation of SHA1 hash - must be freed using
    + * g_byte_array_free()
    + */
    + GByteArray * (* get_fingerprint_sha1)(PurpleCertificate *crt);
    +
    + /**
    + * Retrieves a unique certificate identifier
    + *
    + * @param crt Certificate instance
    + * @return Newly allocated string that can be used to uniquely
    + * identify the certificate.
    + */
    + gchar * (* get_unique_id)(PurpleCertificate *crt);
    +
    + /**
    + * Retrieves a unique identifier for the certificate's issuer
    + *
    + * @param crt Certificate instance
    + * @return Newly allocated string that can be used to uniquely
    + * identify the issuer's certificate.
    + */
    + gchar * (* get_issuer_unique_id)(PurpleCertificate *crt);
    +
    + /**
    + * Gets the certificate subject's name
    + *
    + * For X.509, this is the "Common Name" field, as we're only using it
    + * for hostname verification at the moment
    + *
    + * @see purple_certificate_get_subject_name()
    + *
    + * @param crt Certificate instance
    + * @return Newly allocated string with the certificate subject.
    + */
    + gchar * (* get_subject_name)(PurpleCertificate *crt);
    +
    + /**
    + * Check the subject name against that on the certificate
    + * @see purple_certificate_check_subject_name()
    + * @return TRUE if it is a match, else FALSE
    + */
    + gboolean (* check_subject_name)(PurpleCertificate *crt, const gchar *name);
    +
    + /** Retrieve the certificate activation/expiration times */
    + gboolean (* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration);
    +
    + /** Imports certificates from a file
    + *
    + * @param filename File to import the certificates from
    + * @return GSList of pointers to the newly allocated Certificate structs
    + * or NULL on failure.
    + */
    + GSList * (* import_certificates)(const gchar * filename);
    +
    + /**
    + * Register a certificate as "trusted."
    + */
    + gboolean (* register_trusted_tls_cert)(PurpleCertificate *crt, gboolean ca);
    +
    + /**
    + * Verify that a certificate is valid, performing all necessary checks
    + * including date range, valid cert chain, recognized and valid CAs, etc.
    + */
    + void (* verify_cert)(PurpleCertificateVerificationRequest *vrq, PurpleCertificateInvalidityFlags *flags);
    +
    + /**
    + * The size of the PurpleCertificateScheme. This should always be sizeof(PurpleCertificateScheme).
    + * This allows adding more functions to this struct without requiring a major version bump.
    + *
    + * PURPLE_CERTIFICATE_SCHEME_HAS_FUNC() should be used for functions after this point.
    + */
    + unsigned long struct_size;
    +
    + /**
    + * Retrieves the certificate public key fingerprint using SHA256
    + *
    + * @param crt Certificate instance
    + * @return Binary representation of SHA256 hash - must be freed using
    + * g_byte_array_free()
    + * @since 2.12.0
    + */
    + GByteArray * (* get_fingerprint_sha256)(PurpleCertificate *crt);
    +
    + /**
    + * Compares the public keys of two certificates
    + *
    + * @param crt1 A certificate instance
    + * @param crt2 Another certificate instance
    + * @return TRUE if both certificates have the same key, otherwise FALSE
    + * @since 2.12.0
    + */
    + gboolean (* compare_pubkeys)(PurpleCertificate *crt1, PurpleCertificate *crt2);
    +};
    +
    +#define PURPLE_CERTIFICATE_SCHEME_HAS_FUNC(obj, member) \
    + (((G_STRUCT_OFFSET(PurpleCertificateScheme, member) < G_STRUCT_OFFSET(PurpleCertificateScheme, struct_size)) \
    + || (G_STRUCT_OFFSET(PurpleCertificateScheme, member) < obj->struct_size)) && \
    + obj->member != NULL)
    +
    +
    +/** A set of operations used to provide logic for verifying a Certificate's
    + * authenticity.
    + *
    + * A Verifier provider must fill out these fields, then register it using
    + * purple_certificate_register_verifier()
    + *
    + * The (scheme_name, name) value must be unique for each Verifier - you may not
    + * register more than one Verifier of the same name for each Scheme
    + */
    +struct _PurpleCertificateVerifier
    +{
    + /** Name of the scheme this Verifier operates on
    + *
    + * The scheme will be looked up by name when a Request is generated
    + * using this Verifier
    + */
    + gchar *scheme_name;
    +
    + /** Name of the Verifier - case insensitive */
    + gchar *name;
    +
    + /**
    + * Start the verification process
    + *
    + * To be called from purple_certificate_verify once it has
    + * constructed the request. This will use the information in the
    + * given VerificationRequest to check the certificate and callback
    + * the requester with the verification results.
    + *
    + * @param vrq Request to process
    + */
    + void (* start_verification)(PurpleCertificateVerificationRequest *vrq);
    +
    + /**
    + * Destroy a completed Request under this Verifier
    + * The function pointed to here is only responsible for cleaning up
    + * whatever PurpleCertificateVerificationRequest::data points to.
    + * It should not call free(vrq)
    + *
    + * @param vrq Request to destroy
    + */
    + void (* destroy_request)(PurpleCertificateVerificationRequest *vrq);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/** Structure for a single certificate request
    + *
    + * Useful for keeping track of the state of a verification that involves
    + * several steps
    + */
    +struct _PurpleCertificateVerificationRequest
    +{
    + /** Reference to the verification logic used */
    + PurpleCertificateVerifier *verifier;
    + /** Reference to the scheme used.
    + *
    + * This is looked up from the Verifier when the Request is generated
    + */
    + PurpleCertificateScheme *scheme;
    +
    + /**
    + * Name to check that the certificate is issued to
    + *
    + * For X.509 certificates, this is the Common Name
    + */
    + gchar *subject_name;
    +
    + /** List of certificates in the chain to be verified (such as that returned by purple_ssl_get_peer_certificates )
    + *
    + * This is most relevant for X.509 certificates used in SSL sessions.
    + * The list order should be: certificate, issuer, issuer's issuer, etc.
    + */
    + GList *cert_chain;
    +
    + /** Internal data used by the Verifier code */
    + gpointer data;
    +
    + /** Function to call with the verification result */
    + PurpleCertificateVerifiedCallback cb;
    + /** Data to pass to the post-verification callback */
    + gpointer cb_data;
    +};
    +
    +/*****************************************************************************/
    +/** @name Certificate Verification Functions */
    +/*****************************************************************************/
    +/*@{*/
    +
    +/**
    + * Constructs a verification request and passed control to the specified Verifier
    + *
    + * It is possible that the callback will be called immediately upon calling
    + * this function. Plan accordingly.
    + *
    + * @param verifier Verification logic to use.
    + * @see purple_certificate_find_verifier()
    + *
    + * @param subject_name Name that should match the first certificate in the
    + * chain for the certificate to be valid. Will be strdup'd
    + * into the Request struct
    + *
    + * @param cert_chain Certificate chain to check. If there is more than one
    + * certificate in the chain (X.509), the peer's
    + * certificate comes first, then the issuer/signer's
    + * certificate, etc. The whole list is duplicated into the
    + * Request struct.
    + *
    + * @param cb Callback function to be called with whether the
    + * certificate was approved or not.
    + * @param cb_data User-defined data for the above.
    + */
    +void
    +purple_certificate_verify (PurpleCertificateVerifier *verifier,
    + const gchar *subject_name, GList *cert_chain,
    + PurpleCertificateVerifiedCallback cb,
    + gpointer cb_data);
    +
    +/**
    + * Completes and destroys a VerificationRequest
    + *
    + * @param vrq Request to conclude
    + * @param st Success/failure code to pass to the request's
    + * completion callback.
    + */
    +void
    +purple_certificate_verify_complete(PurpleCertificateVerificationRequest *vrq,
    + PurpleCertificateVerificationStatus st);
    +
    +/*@}*/
    +
    +/*****************************************************************************/
    +/** @name Certificate Functions */
    +/*****************************************************************************/
    +/*@{*/
    +
    +/**
    + * Makes a duplicate of a certificate
    + *
    + * @param crt Instance to duplicate
    + * @return Pointer to new instance
    + */
    +PurpleCertificate *
    +purple_certificate_copy(PurpleCertificate *crt);
    +
    +/**
    + * Duplicates an entire list of certificates
    + *
    + * @param crt_list List to duplicate
    + * @return New list copy
    + */
    +GList *
    +purple_certificate_copy_list(GList *crt_list);
    +
    +/**
    + * Destroys and free()'s a Certificate
    + *
    + * @param crt Instance to destroy. May be NULL.
    + */
    +void
    +purple_certificate_destroy (PurpleCertificate *crt);
    +
    +/**
    + * Destroy an entire list of Certificate instances and the containing list
    + *
    + * @param crt_list List of certificates to destroy. May be NULL.
    + */
    +void
    +purple_certificate_destroy_list (GList * crt_list);
    +
    +/**
    + * Check whether 'crt' has a valid signature made by 'issuer'
    + *
    + * @param crt Certificate instance to check signature of
    + * @param issuer Certificate thought to have signed 'crt'
    + *
    + * @return TRUE if 'crt' has a valid signature made by 'issuer',
    + * otherwise FALSE
    + * @todo Find a way to give the reason (bad signature, not the issuer, etc.)
    + */
    +gboolean
    +purple_certificate_signed_by(PurpleCertificate *crt, PurpleCertificate *issuer);
    +
    +/**
    + * Check that a certificate chain is valid and, if not, the failing certificate.
    + *
    + * Uses purple_certificate_signed_by() to verify that each PurpleCertificate
    + * in the chain carries a valid signature from the next. A single-certificate
    + * chain is considered to be valid.
    + *
    + * @param chain List of PurpleCertificate instances comprising the chain,
    + * in the order certificate, issuer, issuer's issuer, etc.
    + * @param failing A pointer to a PurpleCertificate*. If not NULL, if the
    + * chain fails to validate, this will be set to the
    + * certificate whose signature could not be validated.
    + * @return TRUE if the chain is valid. See description.
    + *
    + * @since 2.6.0
    + * @deprecated This function will become
    + * purple_certificate_check_signature_chain in 3.0.0
    + */
    +gboolean
    +purple_certificate_check_signature_chain_with_failing(GList *chain,
    + PurpleCertificate **failing);
    +
    +/**
    + * Check that a certificate chain is valid
    + *
    + * Uses purple_certificate_signed_by() to verify that each PurpleCertificate
    + * in the chain carries a valid signature from the next. A single-certificate
    + * chain is considered to be valid.
    + *
    + * @param chain List of PurpleCertificate instances comprising the chain,
    + * in the order certificate, issuer, issuer's issuer, etc.
    + * @return TRUE if the chain is valid. See description.
    + * @todo Specify which certificate in the chain caused a failure
    + * @deprecated This function will be removed in 3.0.0 and replaced with
    + * purple_certificate_check_signature_chain_with_failing
    + */
    +gboolean
    +purple_certificate_check_signature_chain(GList *chain);
    +
    +/**
    + * Imports a PurpleCertificate from a file
    + *
    + * @param scheme Scheme to import under
    + * @param filename File path to import from
    + * @return Pointer to a new PurpleCertificate, or NULL on failure
    + */
    +PurpleCertificate *
    +purple_certificate_import(PurpleCertificateScheme *scheme, const gchar *filename);
    +
    +/**
    + * Imports a list of PurpleCertificates from a file
    + *
    + * @param scheme Scheme to import under
    + * @param filename File path to import from
    + * @return Pointer to a GSList of new PurpleCertificates, or NULL on failure
    + */
    +GSList *
    +purple_certificates_import(PurpleCertificateScheme *scheme, const gchar *filename);
    +
    +/**
    + * Exports a PurpleCertificate to a file
    + *
    + * @param filename File to export the certificate to
    + * @param crt Certificate to export
    + * @return TRUE if the export succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_export(const gchar *filename, PurpleCertificate *crt);
    +
    +
    +/**
    + * Retrieves the certificate public key fingerprint using SHA1.
    + *
    + * @param crt Certificate instance
    + * @return Binary representation of the hash. You are responsible for freeing
    + * this with g_byte_array_free().
    + * @see purple_base16_encode_chunked()
    + * @see purple_certificate_get_fingerprint_sha256()
    + */
    +GByteArray *
    +purple_certificate_get_fingerprint_sha1(PurpleCertificate *crt);
    +
    +/**
    + * Retrieves the certificate public key fingerprint using SHA256.
    + *
    + * @param crt Certificate instance
    + * @param sha1_fallback If true, return SHA1 if the SSL module doesn't
    + * implement SHA256. Otherwise, return NULL.
    + * @return Binary representation of the hash. You are responsible for freeing
    + * this with g_byte_array_free().
    + * @see purple_base16_encode_chunked()
    + */
    +GByteArray *
    +purple_certificate_get_fingerprint_sha256(PurpleCertificate *crt, gboolean sha1_fallback);
    +
    +/**
    + * Get a unique identifier for the certificate
    + *
    + * @param crt Certificate instance
    + * @return String representing the certificate uniquely. Must be g_free()'ed
    + */
    +gchar *
    +purple_certificate_get_unique_id(PurpleCertificate *crt);
    +
    +/**
    + * Get a unique identifier for the certificate's issuer
    + *
    + * @param crt Certificate instance
    + * @return String representing the certificate's issuer uniquely. Must be
    + * g_free()'ed
    + */
    +gchar *
    +purple_certificate_get_issuer_unique_id(PurpleCertificate *crt);
    +
    +/**
    + * Gets the certificate subject's name
    + *
    + * For X.509, this is the "Common Name" field, as we're only using it
    + * for hostname verification at the moment
    + *
    + * @param crt Certificate instance
    + * @return Newly allocated string with the certificate subject.
    + */
    +gchar *
    +purple_certificate_get_subject_name(PurpleCertificate *crt);
    +
    +/**
    + * Check the subject name against that on the certificate
    + * @param crt Certificate instance
    + * @param name Name to check.
    + * @return TRUE if it is a match, else FALSE
    + */
    +gboolean
    +purple_certificate_check_subject_name(PurpleCertificate *crt, const gchar *name);
    +
    +/**
    + * Get the expiration/activation times.
    + *
    + * @param crt Certificate instance
    + * @param activation Reference to store the activation time at. May be NULL
    + * if you don't actually want it.
    + * @param expiration Reference to store the expiration time at. May be NULL
    + * if you don't actually want it.
    + * @return TRUE if the requested values were obtained, otherwise FALSE.
    + */
    +gboolean
    +purple_certificate_get_times(PurpleCertificate *crt, time_t *activation, time_t *expiration);
    +
    +/**
    + * Compares the public keys of two certificates.
    + *
    + * If the SSL backend does not implement this function, it may return FALSE
    + * every time. This is the case with the NSS plugin, which doesn't need it.
    + *
    + * @param crt1 A certificate instance
    + * @param crt2 Another certificate instance
    + * @return TRUE if both certificates have the same key, otherwise FALSE
    + * @since 2.12.0
    + */
    +gboolean
    +purple_certificate_compare_pubkeys(PurpleCertificate *crt1, PurpleCertificate *crt2);
    +
    +/*@}*/
    +
    +/*****************************************************************************/
    +/** @name Certificate Pool Functions */
    +/*****************************************************************************/
    +/*@{*/
    +/**
    + * Helper function for generating file paths in ~/.purple/certificates for
    + * CertificatePools that use them.
    + *
    + * All components will be escaped for filesystem friendliness.
    + *
    + * @param pool CertificatePool to build a path for
    + * @param id Key to look up a Certificate by. May be NULL.
    + * @return A newly allocated path of the form
    + * ~/.purple/certificates/scheme_name/pool_name/unique_id
    + */
    +gchar *
    +purple_certificate_pool_mkpath(PurpleCertificatePool *pool, const gchar *id);
    +
    +/**
    + * Determines whether a pool can be used.
    + *
    + * Checks whether the associated CertificateScheme is loaded.
    + *
    + * @param pool Pool to check
    + *
    + * @return TRUE if the pool can be used, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_pool_usable(PurpleCertificatePool *pool);
    +
    +/**
    + * Looks up the scheme the pool operates under
    + *
    + * @param pool Pool to get the scheme of
    + *
    + * @return Pointer to the pool's scheme, or NULL if it isn't loaded.
    + * @see purple_certificate_pool_usable()
    + */
    +PurpleCertificateScheme *
    +purple_certificate_pool_get_scheme(PurpleCertificatePool *pool);
    +
    +/**
    + * Check for presence of an ID in a pool.
    + * @param pool Pool to look in
    + * @param id ID to look for
    + * @return TRUE if the ID is in the pool, else FALSE
    + */
    +gboolean
    +purple_certificate_pool_contains(PurpleCertificatePool *pool, const gchar *id);
    +
    +/**
    + * Retrieve a certificate from a pool.
    + * @param pool Pool to fish in
    + * @param id ID to look up
    + * @return Retrieved certificate (to be freed with purple_certificate_destroy),
    + * or NULL if it wasn't there
    + */
    +PurpleCertificate *
    +purple_certificate_pool_retrieve(PurpleCertificatePool *pool, const gchar *id);
    +
    +/**
    + * Add a certificate to a pool
    + *
    + * Any pre-existing certificate of the same ID will be overwritten.
    + *
    + * @param pool Pool to add to
    + * @param id ID to store the certificate with
    + * @param crt Certificate to store
    + * @return TRUE if the operation succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_pool_store(PurpleCertificatePool *pool, const gchar *id, PurpleCertificate *crt);
    +
    +/**
    + * Remove a certificate from a pool
    + *
    + * @param pool Pool to remove from
    + * @param id ID to remove
    + * @return TRUE if the operation succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_pool_delete(PurpleCertificatePool *pool, const gchar *id);
    +
    +/**
    + * Get the list of IDs currently in the pool.
    + *
    + * @param pool Pool to enumerate
    + * @return GList pointing to newly-allocated id strings. Free using
    + * purple_certificate_pool_destroy_idlist()
    + */
    +GList *
    +purple_certificate_pool_get_idlist(PurpleCertificatePool *pool);
    +
    +/**
    + * Destroys the result given by purple_certificate_pool_get_idlist()
    + *
    + * @param idlist ID List to destroy
    + */
    +void
    +purple_certificate_pool_destroy_idlist(GList *idlist);
    +
    +/*@}*/
    +
    +/*****************************************************************************/
    +/** @name Certificate Subsystem API */
    +/*****************************************************************************/
    +/*@{*/
    +
    +/**
    + * Initialize the certificate system
    + */
    +void
    +purple_certificate_init(void);
    +
    +/**
    + * Un-initialize the certificate system
    + */
    +void
    +purple_certificate_uninit(void);
    +
    +/**
    + * Get the Certificate subsystem handle for signalling purposes
    + */
    +gpointer
    +purple_certificate_get_handle(void);
    +
    +/** Look up a registered CertificateScheme by name
    + * @param name The scheme name. Case insensitive.
    + * @return Pointer to the located Scheme, or NULL if it isn't found.
    + */
    +PurpleCertificateScheme *
    +purple_certificate_find_scheme(const gchar *name);
    +
    +/**
    + * Get all registered CertificateSchemes
    + *
    + * @return GList pointing to all registered CertificateSchemes . This value
    + * is owned by libpurple
    + */
    +GList *
    +purple_certificate_get_schemes(void);
    +
    +/** Register a CertificateScheme with libpurple
    + *
    + * No two schemes can be registered with the same name; this function enforces
    + * that.
    + *
    + * @param scheme Pointer to the scheme to register.
    + * @return TRUE if the scheme was successfully added, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_register_scheme(PurpleCertificateScheme *scheme);
    +
    +/** Unregister a CertificateScheme from libpurple
    + *
    + * @param scheme Scheme to unregister.
    + * If the scheme is not registered, this is a no-op.
    + *
    + * @return TRUE if the unregister completed successfully
    + */
    +gboolean
    +purple_certificate_unregister_scheme(PurpleCertificateScheme *scheme);
    +
    +/** Look up a registered PurpleCertificateVerifier by scheme and name
    + * @param scheme_name Scheme name. Case insensitive.
    + * @param ver_name The verifier name. Case insensitive.
    + * @return Pointer to the located Verifier, or NULL if it isn't found.
    + */
    +PurpleCertificateVerifier *
    +purple_certificate_find_verifier(const gchar *scheme_name, const gchar *ver_name);
    +
    +/**
    + * Get the list of registered CertificateVerifiers
    + *
    + * @return GList of all registered PurpleCertificateVerifier. This value
    + * is owned by libpurple
    + */
    +GList *
    +purple_certificate_get_verifiers(void);
    +
    +/**
    + * Register a CertificateVerifier with libpurple
    + *
    + * @param vr Verifier to register.
    + * @return TRUE if register succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_register_verifier(PurpleCertificateVerifier *vr);
    +
    +/**
    + * Unregister a CertificateVerifier with libpurple
    + *
    + * @param vr Verifier to unregister.
    + * @return TRUE if unregister succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_unregister_verifier(PurpleCertificateVerifier *vr);
    +
    +/** Look up a registered PurpleCertificatePool by scheme and name
    + * @param scheme_name Scheme name. Case insensitive.
    + * @param pool_name Pool name. Case insensitive.
    + * @return Pointer to the located Pool, or NULL if it isn't found.
    + */
    +PurpleCertificatePool *
    +purple_certificate_find_pool(const gchar *scheme_name, const gchar *pool_name);
    +
    +/**
    + * Get the list of registered Pools
    + *
    + * @return GList of all registered PurpleCertificatePool s. This value
    + * is owned by libpurple
    + */
    +GList *
    +purple_certificate_get_pools(void);
    +
    +/**
    + * Register a CertificatePool with libpurple and call its init function
    + *
    + * @param pool Pool to register.
    + * @return TRUE if the register succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_register_pool(PurpleCertificatePool *pool);
    +
    +/**
    + * Unregister a CertificatePool with libpurple and call its uninit function
    + *
    + * @param pool Pool to unregister.
    + * @return TRUE if the unregister succeeded, otherwise FALSE
    + */
    +gboolean
    +purple_certificate_unregister_pool(PurpleCertificatePool *pool);
    +
    +/*@}*/
    +
    +
    +/**
    + * Displays a window showing X.509 certificate information
    + *
    + * @param crt Certificate under an "x509" Scheme
    + * @todo Will break on CA certs, as they have no Common Name
    + */
    +void
    +purple_certificate_display_x509(PurpleCertificate *crt);
    +
    +/**
    + * Add a search path for certificates.
    + *
    + * @param path Path to search for certificates.
    + */
    +void purple_certificate_add_ca_search_path(const char *path);
    +
    +#ifdef __cplusplus
    +}
    +#endif /* __cplusplus */
    +
    +#endif /* _PURPLE_CERTIFICATE_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/chat.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,118 @@
    +/**
    + * @file chat.h Chat stuff
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_CHAT_H_
    +#define PURPLE_JABBER_CHAT_H_
    +
    +#include "internal.h"
    +#include "connection.h"
    +#include "conversation.h"
    +#include "request.h"
    +#include "roomlist.h"
    +
    +#include "jabber.h"
    +
    +typedef struct _JabberChatMember {
    + char *handle;
    + char *jid;
    +} JabberChatMember;
    +
    +
    +typedef struct _JabberChat {
    + JabberStream *js;
    + char *room;
    + char *server;
    + char *handle;
    + GHashTable *components;
    + int id;
    + PurpleConversation *conv;
    + gboolean muc;
    + gboolean xhtml;
    + PurpleRequestType config_dialog_type;
    + void *config_dialog_handle;
    + GHashTable *members;
    + gboolean left;
    + time_t joined;
    +} JabberChat;
    +
    +GList *jabber_chat_info(PurpleConnection *gc);
    +GHashTable *jabber_chat_info_defaults(PurpleConnection *gc, const char *chat_name);
    +char *jabber_get_chat_name(GHashTable *data);
    +
    +/**
    + * in-prpl function for joining a chat room. Doesn't require sticking goop
    + * into a hash table.
    + *
    + * @param room The room to join. This MUST be normalized already.
    + * @param server The server the room is on. This MUST be normalized already.
    + * @param password The password (if required) to join the room. May be NULL.
    + * @param data The chat hash table. May be NULL (it will be generated
    + * for current core<>prpl API interface.)
    + */
    +JabberChat *jabber_join_chat(JabberStream *js, const char *room,
    + const char *server, const char *handle,
    + const char *password, GHashTable *data);
    +
    +void jabber_chat_join(PurpleConnection *gc, GHashTable *data);
    +JabberChat *jabber_chat_find(JabberStream *js, const char *room,
    + const char *server);
    +JabberChat *jabber_chat_find_by_id(JabberStream *js, int id);
    +JabberChat *jabber_chat_find_by_conv(PurpleConversation *conv);
    +void jabber_chat_destroy(JabberChat *chat);
    +void jabber_chat_free(JabberChat *chat);
    +gboolean jabber_chat_find_buddy(PurpleConversation *conv, const char *name);
    +void jabber_chat_invite(PurpleConnection *gc, int id, const char *message,
    + const char *name);
    +void jabber_chat_leave(PurpleConnection *gc, int id);
    +char *jabber_chat_buddy_real_name(PurpleConnection *gc, int id, const char *who);
    +void jabber_chat_request_room_configure(JabberChat *chat);
    +void jabber_chat_create_instant_room(JabberChat *chat);
    +void jabber_chat_register(JabberChat *chat);
    +void jabber_chat_change_topic(JabberChat *chat, const char *topic);
    +void jabber_chat_set_topic(PurpleConnection *gc, int id, const char *topic);
    +gboolean jabber_chat_change_nick(JabberChat *chat, const char *nick);
    +void jabber_chat_part(JabberChat *chat, const char *msg);
    +void jabber_chat_track_handle(JabberChat *chat, const char *handle,
    + const char *jid, const char *affiliation, const char *role);
    +void jabber_chat_remove_handle(JabberChat *chat, const char *handle);
    +gboolean jabber_chat_ban_user(JabberChat *chat, const char *who,
    + const char *why);
    +gboolean jabber_chat_affiliate_user(JabberChat *chat, const char *who,
    + const char *affiliation);
    +gboolean jabber_chat_affiliation_list(JabberChat *chat, const char *affiliation);
    +gboolean jabber_chat_role_user(JabberChat *chat, const char *who,
    + const char *role, const char *why);
    +gboolean jabber_chat_role_list(JabberChat *chat, const char *role);
    +
    +PurpleRoomlist *jabber_roomlist_get_list(PurpleConnection *gc);
    +void jabber_roomlist_cancel(PurpleRoomlist *list);
    +
    +void jabber_chat_disco_traffic(JabberChat *chat);
    +
    +char *jabber_roomlist_room_serialize(PurpleRoomlistRoom *room);
    +
    +gboolean jabber_chat_all_participants_have_capability(const JabberChat *chat,
    + const gchar *cap);
    +guint jabber_chat_get_num_participants(const JabberChat *chat);
    +
    +#endif /* PURPLE_JABBER_CHAT_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/cipher.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,502 @@
    +/**
    + * @file cipher.h Purple Cipher API
    + * @ingroup core
    + * @see @ref cipher-signals
    + */
    +
    +/* 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
    + */
    +#ifndef PURPLE_CIPHER_H
    +#define PURPLE_CIPHER_H
    +
    +#include <glib.h>
    +#include <string.h>
    +
    +#define PURPLE_CIPHER(obj) ((PurpleCipher *)(obj)) /**< PurpleCipher typecast helper */
    +#define PURPLE_CIPHER_OPS(obj) ((PurpleCipherOps *)(obj)) /**< PurpleCipherInfo typecase helper */
    +#define PURPLE_CIPHER_CONTEXT(obj) ((PurpleCipherContext *)(obj)) /**< PurpleCipherContext typecast helper */
    +
    +typedef struct _PurpleCipher PurpleCipher; /**< A handle to a PurpleCipher */
    +typedef struct _PurpleCipherOps PurpleCipherOps; /**< Ops for a PurpleCipher */
    +typedef struct _PurpleCipherContext PurpleCipherContext; /**< A context for a PurpleCipher */
    +
    +/**
    + * Modes for batch encrypters
    + */
    +typedef enum _PurpleCipherBatchMode {
    + PURPLE_CIPHER_BATCH_MODE_ECB,
    + PURPLE_CIPHER_BATCH_MODE_CBC
    +} PurpleCipherBatchMode;
    +
    +/**
    + * The operation flags for a cipher
    + */
    +typedef enum _PurpleCipherCaps {
    + PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1, /**< Set option flag */
    + PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2, /**< Get option flag */
    + PURPLE_CIPHER_CAPS_INIT = 1 << 3, /**< Init flag */
    + PURPLE_CIPHER_CAPS_RESET = 1 << 4, /**< Reset flag */
    + PURPLE_CIPHER_CAPS_UNINIT = 1 << 5, /**< Uninit flag */
    + PURPLE_CIPHER_CAPS_SET_IV = 1 << 6, /**< Set IV flag */
    + PURPLE_CIPHER_CAPS_APPEND = 1 << 7, /**< Append flag */
    + PURPLE_CIPHER_CAPS_DIGEST = 1 << 8, /**< Digest flag */
    + PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 9, /**< Encrypt flag */
    + PURPLE_CIPHER_CAPS_DECRYPT = 1 << 10, /**< Decrypt flag */
    + PURPLE_CIPHER_CAPS_SET_SALT = 1 << 11, /**< Set salt flag */
    + PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 12, /**< Get salt size flag */
    + PURPLE_CIPHER_CAPS_SET_KEY = 1 << 13, /**< Set key flag */
    + PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 14, /**< Get key size flag */
    + PURPLE_CIPHER_CAPS_SET_BATCH_MODE = 1 << 15, /**< Set batch mode flag */
    + PURPLE_CIPHER_CAPS_GET_BATCH_MODE = 1 << 16, /**< Get batch mode flag */
    + PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE = 1 << 17, /**< The get block size flag */
    + PURPLE_CIPHER_CAPS_SET_KEY_WITH_LEN = 1 << 18, /**< The set key with length flag */
    + PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 19 /**< Unknown */
    +} PurpleCipherCaps;
    +
    +/**
    + * The operations of a cipher. Every cipher must implement one of these.
    + */
    +struct _PurpleCipherOps {
    + /** The set option function */
    + void (*set_option)(PurpleCipherContext *context, const gchar *name, void *value);
    +
    + /** The get option function */
    + void *(*get_option)(PurpleCipherContext *context, const gchar *name);
    +
    + /** The init function */
    + void (*init)(PurpleCipherContext *context, void *extra);
    +
    + /** The reset function */
    + void (*reset)(PurpleCipherContext *context, void *extra);
    +
    + /** The uninit function */
    + void (*uninit)(PurpleCipherContext *context);
    +
    + /** The set initialization vector function */
    + void (*set_iv)(PurpleCipherContext *context, guchar *iv, size_t len);
    +
    + /** The append data function */
    + void (*append)(PurpleCipherContext *context, const guchar *data, size_t len);
    +
    + /** The digest function */
    + gboolean (*digest)(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
    +
    + /** The encrypt function */
    + int (*encrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    +
    + /** The decrypt function */
    + int (*decrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    +
    + /** The set salt function */
    + void (*set_salt)(PurpleCipherContext *context, guchar *salt);
    +
    + /** The get salt size function */
    + size_t (*get_salt_size)(PurpleCipherContext *context);
    +
    + /** The set key function */
    + void (*set_key)(PurpleCipherContext *context, const guchar *key);
    +
    + /** The get key size function */
    + size_t (*get_key_size)(PurpleCipherContext *context);
    +
    + /** The set batch mode function */
    + void (*set_batch_mode)(PurpleCipherContext *context, PurpleCipherBatchMode mode);
    +
    + /** The get batch mode function */
    + PurpleCipherBatchMode (*get_batch_mode)(PurpleCipherContext *context);
    +
    + /** The get block size function */
    + size_t (*get_block_size)(PurpleCipherContext *context);
    +
    + /** The set key with length function */
    + void (*set_key_with_len)(PurpleCipherContext *context, const guchar *key, size_t len);
    +};
    +
    +G_BEGIN_DECLS
    +
    +/*****************************************************************************/
    +/** @name PurpleCipher API */
    +/*****************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets a cipher's name
    + *
    + * @param cipher The cipher handle
    + *
    + * @return The cipher's name
    + */
    +const gchar *purple_cipher_get_name(PurpleCipher *cipher);
    +
    +/**
    + * Gets a cipher's capabilities
    + *
    + * @param cipher The cipher handle
    + *
    + * @return The cipher's info
    + */
    +guint purple_cipher_get_capabilities(PurpleCipher *cipher);
    +
    +/**
    + * Gets a digest from a cipher
    + *
    + * @param name The cipher's name
    + * @param data The data to hash
    + * @param data_len The length of the data
    + * @param in_len The length of the buffer
    + * @param digest The returned digest
    + * @param out_len The length written
    + *
    + * @return @c TRUE if successful, @c FALSE otherwise
    + */
    +gboolean purple_cipher_digest_region(const gchar *name, const guchar *data, size_t data_len, size_t in_len, guchar digest[], size_t *out_len);
    +
    +/*@}*/
    +/******************************************************************************/
    +/** @name PurpleCiphers API */
    +/******************************************************************************/
    +/*@{*/
    +
    +/**
    + * Finds a cipher by it's name
    + *
    + * @param name The name of the cipher to find
    + *
    + * @return The cipher handle or @c NULL
    + */
    +PurpleCipher *purple_ciphers_find_cipher(const gchar *name);
    +
    +/**
    + * Registers a cipher as a usable cipher
    + *
    + * @param name The name of the new cipher
    + * @param ops The cipher ops to register
    + *
    + * @return The handle to the new cipher or @c NULL if it failed
    + */
    +PurpleCipher *purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops);
    +
    +/**
    + * Unregisters a cipher
    + *
    + * @param cipher The cipher handle to unregister
    + *
    + * @return Whether or not the cipher was successfully unloaded
    + */
    +gboolean purple_ciphers_unregister_cipher(PurpleCipher *cipher);
    +
    +/**
    + * Gets the list of ciphers
    + *
    + * @return The list of available ciphers
    + * @note This list should not be modified, it is owned by the cipher core
    + */
    +GList *purple_ciphers_get_ciphers(void);
    +
    +/*@}*/
    +/******************************************************************************/
    +/** @name PurpleCipher Subsystem API */
    +/******************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets the handle to the cipher subsystem
    + *
    + * @return The handle to the cipher subsystem
    + */
    +gpointer purple_ciphers_get_handle(void);
    +
    +/**
    + * Initializes the cipher core
    + */
    +void purple_ciphers_init(void);
    +
    +/**
    + * Uninitializes the cipher core
    + */
    +void purple_ciphers_uninit(void);
    +
    +/*@}*/
    +/******************************************************************************/
    +/** @name PurpleCipherContext API */
    +/******************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the value an option on a cipher context
    + *
    + * @param context The cipher context
    + * @param name The name of the option
    + * @param value The value to set
    + */
    +void purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name, gpointer value);
    +
    +/**
    + * Gets the vale of an option on a cipher context
    + *
    + * @param context The cipher context
    + * @param name The name of the option
    + * @return The value of the option
    + */
    +gpointer purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name);
    +
    +/**
    + * Creates a new cipher context and initializes it
    + *
    + * @param cipher The cipher to use
    + * @param extra Extra data for the specific cipher
    + *
    + * @return The new cipher context
    + */
    +PurpleCipherContext *purple_cipher_context_new(PurpleCipher *cipher, void *extra);
    +
    +/**
    + * Creates a new cipher context by the cipher name and initializes it
    + *
    + * @param name The cipher's name
    + * @param extra Extra data for the specific cipher
    + *
    + * @return The new cipher context
    + */
    +PurpleCipherContext *purple_cipher_context_new_by_name(const gchar *name, void *extra);
    +
    +/**
    + * Resets a cipher context to it's default value
    + * @note If you have set an IV you will have to set it after resetting
    + *
    + * @param context The context to reset
    + * @param extra Extra data for the specific cipher
    + */
    +void purple_cipher_context_reset(PurpleCipherContext *context, gpointer extra);
    +
    +/**
    + * Destorys a cipher context and deinitializes it
    + *
    + * @param context The cipher context to destory
    + */
    +void purple_cipher_context_destroy(PurpleCipherContext *context);
    +
    +/**
    + * Sets the initialization vector for a context
    + * @note This should only be called right after a cipher context is created or reset
    + *
    + * @param context The context to set the IV to
    + * @param iv The initialization vector to set
    + * @param len The len of the IV
    + */
    +void purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len);
    +
    +/**
    + * Appends data to the context
    + *
    + * @param context The context to append data to
    + * @param data The data to append
    + * @param len The length of the data
    + */
    +void purple_cipher_context_append(PurpleCipherContext *context, const guchar *data, size_t len);
    +
    +/**
    + * Digests a context
    + *
    + * @param context The context to digest
    + * @param in_len The length of the buffer
    + * @param digest The return buffer for the digest
    + * @param out_len The length of the returned value
    + */
    +gboolean purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
    +
    +/**
    + * Converts a guchar digest into a hex string
    + *
    + * @param context The context to get a digest from
    + * @param in_len The length of the buffer
    + * @param digest_s The return buffer for the string digest
    + * @param out_len The length of the returned value
    + */
    +gboolean purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len, gchar digest_s[], size_t *out_len);
    +
    +/**
    + * Encrypts data using the context
    + *
    + * @param context The context
    + * @param data The data to encrypt
    + * @param len The length of the data
    + * @param output The output buffer
    + * @param outlen The len of data that was outputed
    + *
    + * @return A cipher specific status code
    + */
    +gint purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    +
    +/**
    + * Decrypts data using the context
    + *
    + * @param context The context
    + * @param data The data to encrypt
    + * @param len The length of the returned value
    + * @param output The output buffer
    + * @param outlen The len of data that was outputed
    + *
    + * @return A cipher specific status code
    + */
    +gint purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
    +
    +/**
    + * Sets the salt on a context
    + *
    + * @param context The context whose salt to set
    + * @param salt The salt
    + */
    +void purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt);
    +
    +/**
    + * Gets the size of the salt if the cipher supports it
    + *
    + * @param context The context whose salt size to get
    + *
    + * @return The size of the salt
    + */
    +size_t purple_cipher_context_get_salt_size(PurpleCipherContext *context);
    +
    +/**
    + * Sets the key on a context
    + *
    + * @param context The context whose key to set
    + * @param key The key
    + */
    +void purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key);
    +
    +/**
    + * Gets the key size for a context
    + *
    + * @param context The context whose key size to get
    + *
    + * @return The size of the key
    + */
    +size_t purple_cipher_context_get_key_size(PurpleCipherContext *context);
    +
    +/**
    + * Sets the batch mode of a context
    + *
    + * @param context The context whose batch mode to set
    + * @param mode The batch mode under which the cipher should operate
    + *
    + */
    +void purple_cipher_context_set_batch_mode(PurpleCipherContext *context, PurpleCipherBatchMode mode);
    +
    +/**
    + * Gets the batch mode of a context
    + *
    + * @param context The context whose batch mode to get
    + *
    + * @return The batch mode under which the cipher is operating
    + */
    +PurpleCipherBatchMode purple_cipher_context_get_batch_mode(PurpleCipherContext *context);
    +
    +/**
    + * Gets the block size of a context
    + *
    + * @param context The context whose block size to get
    + *
    + * @return The block size of the context
    + */
    +size_t purple_cipher_context_get_block_size(PurpleCipherContext *context);
    +
    +/**
    + * Sets the key with a given length on a context
    + *
    + * @param context The context whose key to set
    + * @param key The key
    + * @param len The length of the key
    + *
    + */
    +void purple_cipher_context_set_key_with_len(PurpleCipherContext *context, const guchar *key, size_t len);
    +
    +/**
    + * Sets the cipher data for a context
    + *
    + * @param context The context whose cipher data to set
    + * @param data The cipher data to set
    + */
    +void purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data);
    +
    +/**
    + * Gets the cipher data for a context
    + *
    + * @param context The context whose cipher data to get
    + *
    + * @return The cipher data
    + */
    +gpointer purple_cipher_context_get_data(PurpleCipherContext *context);
    +
    +/*@}*/
    +/*****************************************************************************/
    +/** @name Purple Cipher HTTP Digest Helper Functions */
    +/*****************************************************************************/
    +/*@{*/
    +
    +/**
    + * Calculates a session key for HTTP Digest authentation
    + *
    + * See RFC 2617 for more information.
    + *
    + * @param algorithm The hash algorithm to use
    + * @param username The username provided by the user
    + * @param realm The authentication realm provided by the server
    + * @param password The password provided by the user
    + * @param nonce The nonce provided by the server
    + * @param client_nonce The nonce provided by the client
    + *
    + * @return The session key, or @c NULL if an error occurred.
    + */
    +gchar *purple_cipher_http_digest_calculate_session_key(
    + const gchar *algorithm, const gchar *username,
    + const gchar *realm, const gchar *password,
    + const gchar *nonce, const gchar *client_nonce);
    +
    +/** Calculate a response for HTTP Digest authentication
    + *
    + * See RFC 2617 for more information.
    + *
    + * @param algorithm The hash algorithm to use
    + * @param method The HTTP method in use
    + * @param digest_uri The URI from the initial request
    + * @param qop The "quality of protection"
    + * @param entity The entity body
    + * @param nonce The nonce provided by the server
    + * @param nonce_count The nonce count
    + * @param client_nonce The nonce provided by the client
    + * @param session_key The session key from purple_cipher_http_digest_calculate_session_key()
    + *
    + * @return The hashed response, or @c NULL if an error occurred.
    + */
    +gchar *purple_cipher_http_digest_calculate_response(
    + const gchar *algorithm, const gchar *method,
    + const gchar *digest_uri, const gchar *qop,
    + const gchar *entity, const gchar *nonce,
    + const gchar *nonce_count, const gchar *client_nonce,
    + const gchar *session_key);
    +
    +/*@}*/
    +
    +G_END_DECLS
    +
    +#endif /* PURPLE_CIPHER_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/circbuffer.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,118 @@
    +/**
    + * @file circbuffer.h Buffer Utility Functions
    + * @ingroup core
    + */
    +
    +/* 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
    + */
    +#ifndef _CIRCBUFFER_H
    +#define _CIRCBUFFER_H
    +
    +#include <glib.h>
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +typedef struct _PurpleCircBuffer {
    +
    + /** A pointer to the starting address of our chunk of memory. */
    + gchar *buffer;
    +
    + /** The incremental amount to increase this buffer by when
    + * the buffer is not big enough to hold incoming data, in bytes. */
    + gsize growsize;
    +
    + /** The length of this buffer, in bytes. */
    + gsize buflen;
    +
    + /** The number of bytes of this buffer that contain unread data. */
    + gsize bufused;
    +
    + /** A pointer to the next byte where new incoming data is
    + * buffered to. */
    + gchar *inptr;
    +
    + /** A pointer to the next byte of buffered data that should be
    + * read by the consumer. */
    + gchar *outptr;
    +
    +} PurpleCircBuffer;
    +
    +/**
    + * Creates a new circular buffer. This will not allocate any memory for the
    + * actual buffer until data is appended to it.
    + *
    + * @param growsize The amount that the buffer should grow the first time data
    + * is appended and every time more space is needed. Pass in
    + * "0" to use the default of 256 bytes.
    + *
    + * @return The new PurpleCircBuffer. This should be freed with
    + * purple_circ_buffer_destroy when you are done with it
    + */
    +PurpleCircBuffer *purple_circ_buffer_new(gsize growsize);
    +
    +/**
    + * Dispose of the PurpleCircBuffer and free any memory used by it (including any
    + * memory used by the internal buffer).
    + *
    + * @param buf The PurpleCircBuffer to free
    + */
    +void purple_circ_buffer_destroy(PurpleCircBuffer *buf);
    +
    +/**
    + * Append data to the PurpleCircBuffer. This will grow the internal
    + * buffer to fit the added data, if needed.
    + *
    + * @param buf The PurpleCircBuffer to which to append the data
    + * @param src pointer to the data to copy into the buffer
    + * @param len number of bytes to copy into the buffer
    + */
    +void purple_circ_buffer_append(PurpleCircBuffer *buf, gconstpointer src, gsize len);
    +
    +/**
    + * Determine the maximum number of contiguous bytes that can be read from the
    + * PurpleCircBuffer.
    + * Note: This may not be the total number of bytes that are buffered - a
    + * subsequent call after calling purple_circ_buffer_mark_read() may indicate more
    + * data is available to read.
    + *
    + * @param buf the PurpleCircBuffer for which to determine the maximum contiguous
    + * bytes that can be read.
    + *
    + * @return the number of bytes that can be read from the PurpleCircBuffer
    + */
    +gsize purple_circ_buffer_get_max_read(const PurpleCircBuffer *buf);
    +
    +/**
    + * Mark the number of bytes that have been read from the buffer.
    + *
    + * @param buf The PurpleCircBuffer to mark bytes read from
    + * @param len The number of bytes to mark as read
    + *
    + * @return TRUE if we successfully marked the bytes as having been read, FALSE
    + * otherwise.
    + */
    +gboolean purple_circ_buffer_mark_read(PurpleCircBuffer *buf, gsize len);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _CIRCBUFFER_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/cmds.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,311 @@
    +/**
    + * @file cmds.h Commands API
    + * @ingroup core
    + * @see @ref cmd-signals
    + */
    +
    +/* Copyright (C) 2003 Timothy Ringenbach <omarvo@hotmail.com>
    + *
    + * 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
    + *
    + */
    +#ifndef _PURPLE_CMDS_H_
    +#define _PURPLE_CMDS_H_
    +
    +#include "conversation.h"
    +
    +/**************************************************************************/
    +/** @name Structures */
    +/**************************************************************************/
    +/*@{*/
    +
    +typedef struct _PurpleCmd PurpleCmd;
    +
    +/** The possible results of running a command with purple_cmd_do_command(). */
    +typedef enum _PurpleCmdStatus {
    + PURPLE_CMD_STATUS_OK,
    + PURPLE_CMD_STATUS_FAILED,
    + PURPLE_CMD_STATUS_NOT_FOUND,
    + PURPLE_CMD_STATUS_WRONG_ARGS,
    + PURPLE_CMD_STATUS_WRONG_PRPL,
    + PURPLE_CMD_STATUS_WRONG_TYPE
    +} PurpleCmdStatus;
    +
    +/** Commands registered with the core return one of these values when run.
    + * Normally, a command will want to return one of the first two; in some
    + * unusual cases, you might want to have several functions called for a
    + * particular command; in this case, they should return
    + * #PURPLE_CMD_RET_CONTINUE to cause the core to fall through to other
    + * commands with the same name.
    + */
    +typedef enum _PurpleCmdRet {
    + PURPLE_CMD_RET_OK, /**< Everything's okay; Don't look for another command to call. */
    + PURPLE_CMD_RET_FAILED, /**< The command failed, but stop looking.*/
    + PURPLE_CMD_RET_CONTINUE /**< Continue, looking for other commands with the same name to call. */
    +} PurpleCmdRet;
    +
    +#define PURPLE_CMD_FUNC(func) ((PurpleCmdFunc)func)
    +
    +/** A function implementing a command, as passed to purple_cmd_register().
    + *
    + * @todo document the arguments to these functions.
    + * */
    +typedef PurpleCmdRet (*PurpleCmdFunc)(PurpleConversation *, const gchar *cmd,
    + gchar **args, gchar **error, void *data);
    +/** A unique integer representing a command registered with
    + * purple_cmd_register(), which can subsequently be passed to
    + * purple_cmd_unregister() to unregister that command.
    + */
    +typedef guint PurpleCmdId;
    +
    +typedef enum _PurpleCmdPriority {
    + PURPLE_CMD_P_VERY_LOW = -1000,
    + PURPLE_CMD_P_LOW = 0,
    + PURPLE_CMD_P_DEFAULT = 1000,
    + PURPLE_CMD_P_PRPL = 2000,
    + PURPLE_CMD_P_PLUGIN = 3000,
    + PURPLE_CMD_P_ALIAS = 4000,
    + PURPLE_CMD_P_HIGH = 5000,
    + PURPLE_CMD_P_VERY_HIGH = 6000
    +} PurpleCmdPriority;
    +
    +/** Flags used to set various properties of commands. Every command should
    + * have at least one of #PURPLE_CMD_FLAG_IM and #PURPLE_CMD_FLAG_CHAT set in
    + * order to be even slighly useful.
    + *
    + * @see purple_cmd_register
    + */
    +typedef enum _PurpleCmdFlag {
    + /** Command is usable in IMs. */
    + PURPLE_CMD_FLAG_IM = 0x01,
    + /** Command is usable in multi-user chats. */
    + PURPLE_CMD_FLAG_CHAT = 0x02,
    + /** Command is usable only for a particular prpl. */
    + PURPLE_CMD_FLAG_PRPL_ONLY = 0x04,
    + /** Incorrect arguments to this command should be accepted anyway. */
    + PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS = 0x08
    +} PurpleCmdFlag;
    +
    +/**
    + * Command UI operations; UIs should implement this if they want to handle
    + * commands themselves, rather than relying on the core.
    + *
    + * @see @ref ui-ops
    + */
    +typedef struct
    +{
    + /** If implemented, the UI is responsible for handling commands. */
    + /* @see purple_cmd_register for the argument values. */
    + void (*register_command)(const gchar *name, PurpleCmdPriority priority,
    + PurpleCmdFlag flags, const gchar *prpl_id,
    + const gchar *help, PurpleCmd *cmd);
    +
    + /** Should be implemented if register_command is implemented.
    + * name and prpl_id will have the same value that were used
    + * for the register_command call.
    + */
    + void (*unregister_command)(const gchar *name, const gchar *prpl_id);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleCommandsUiOps;
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Commands API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Register a new command with the core.
    + *
    + * The command will only happen if commands are enabled,
    + * which is a UI pref. UIs don't have to support commands at all.
    + *
    + * @param cmd The command. This should be a UTF-8 (or ASCII) string, with no spaces
    + * or other white space.
    + * @param args A string of characters describing to libpurple how to parse this
    + * command's arguments. If what the user types doesn't match this
    + * pattern, libpurple will keep looking for another command, unless
    + * the flag #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed in @a f.
    + * This string should contain no whitespace, and use a single
    + * character for each argument. The recognized characters are:
    + * <ul>
    + * <li><tt>'w'</tt>: Matches a single word.</li>
    + * <li><tt>'W'</tt>: Matches a single word, with formatting.</li>
    + * <li><tt>'s'</tt>: Matches the rest of the arguments after this
    + * point, as a single string.</li>
    + * <li><tt>'S'</tt>: Same as <tt>'s'</tt> but with formatting.</li>
    + * </ul>
    + * If args is the empty string, then the command accepts no arguments.
    + * The args passed to the callback @a func will be a @c NULL
    + * terminated array of @c NULL terminated strings, and will always
    + * match the number of arguments asked for, unless
    + * #PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS is passed.
    + * @param p This is the priority. Higher priority commands will be run first,
    + * and usually the first command will stop any others from being
    + * called.
    + * @param f Flags specifying various options about this command, combined with
    + * <tt>|</tt> (bitwise OR). You need to at least pass one of
    + * #PURPLE_CMD_FLAG_IM or #PURPLE_CMD_FLAG_CHAT (you may pass both) in
    + * order for the command to ever actually be called.
    + * @param prpl_id If the #PURPLE_CMD_FLAG_PRPL_ONLY flag is set, this is the id
    + * of the prpl to which the command applies (such as
    + * <tt>"prpl-aim"</tt>). If the flag is not set, this parameter
    + * is ignored; pass @c NULL (or a humourous string of your
    + * choice!).
    + * @param func This is the function to call when someone enters this command.
    + * @param helpstr a whitespace sensitive, UTF-8, HTML string describing how to
    + * use the command. The preferred format of this string is the
    + * command's name, followed by a space and any arguments it
    + * accepts (if it takes any arguments, otherwise no space),
    + * followed by a colon, two spaces, and a description of the
    + * command in sentence form. Do not include a slash before the
    + * command name.
    + * @param data User defined data to pass to the #PurpleCmdFunc @a f.
    + * @return A #PurpleCmdId, which is only used for calling
    + * #purple_cmd_unregister, or @a 0 on failure.
    + */
    +PurpleCmdId purple_cmd_register(const gchar *cmd, const gchar *args, PurpleCmdPriority p, PurpleCmdFlag f,
    + const gchar *prpl_id, PurpleCmdFunc func, const gchar *helpstr, void *data);
    +
    +/**
    + * Unregister a command with the core.
    + *
    + * All registered commands must be unregistered, if they're registered by a plugin
    + * or something else that might go away. Normally this is called when the plugin
    + * unloads itself.
    + *
    + * @param id The #PurpleCmdId to unregister, as returned by #purple_cmd_register.
    + */
    +void purple_cmd_unregister(PurpleCmdId id);
    +
    +/**
    + * Do a command.
    + *
    + * Normally the UI calls this to perform a command. This might also be useful
    + * if aliases are ever implemented.
    + *
    + * @param conv The conversation the command was typed in.
    + * @param cmdline The command the user typed (including all arguments) as a single string.
    + * The caller doesn't have to do any parsing, except removing the command
    + * prefix, which the core has no knowledge of. cmd should not contain any
    + * formatting, and should be in plain text (no HTML entities).
    + * @param markup This is the same as cmd, but is the formatted version. It should be in
    + * HTML, with < > and &, at least, escaped to HTML entities, and should
    + * include both the default formatting and any extra manual formatting.
    + * @param errormsg If the command failed errormsg is filled in with the appropriate error
    + * message. It must be freed by the caller with g_free().
    + * @return A #PurpleCmdStatus indicating if the command succeeded or failed.
    + */
    +PurpleCmdStatus purple_cmd_do_command(PurpleConversation *conv, const gchar *cmdline,
    + const gchar *markup, gchar **errormsg);
    +
    +/**
    + * Execute a specific command.
    + *
    + * The UI calls this to execute a command, after parsing the
    + * command name.
    + *
    + * @param c The command to execute.
    + * @param conv The conversation the command was typed in.
    + * @param cmdline The command the user typed (only the arguments).
    + * The caller should remove the prefix and the command name.
    + * It should not contain any formatting, and should be
    + * in plain text (no HTML entities).
    + * @return TRUE if the command handled the @a cmdline, FALSE otherwise.
    + */
    +gboolean purple_cmd_execute(PurpleCmd *c, PurpleConversation *conv,
    + const gchar *cmdline);
    +
    +/**
    + * List registered commands.
    + *
    + * Returns a <tt>GList</tt> (which must be freed by the caller) of all commands
    + * that are valid in the context of @a conv, or all commands, if @a conv is @c
    + * NULL. Don't keep this list around past the main loop, or anything else that
    + * might unregister a command, as the <tt>const char *</tt>'s used get freed
    + * then.
    + *
    + * @param conv The conversation, or @c NULL.
    + * @return A @c GList of <tt>const char *</tt>, which must be freed with
    + * <tt>g_list_free()</tt>.
    + */
    +GList *purple_cmd_list(PurpleConversation *conv);
    +
    +/**
    + * Get the help string for a command.
    + *
    + * Returns the help strings for a given command in the form of a GList,
    + * one node for each matching command.
    + *
    + * @param conv The conversation, or @c NULL for no context.
    + * @param cmd The command. No wildcards accepted, but returns help for all
    + * commands if @c NULL.
    + * @return A <tt>GList</tt> of <tt>const char *</tt>s, which is the help string
    + * for that command.
    + */
    +GList *purple_cmd_help(PurpleConversation *conv, const gchar *cmd);
    +
    +/**
    + * Get the handle for the commands API
    + * @return The handle
    + * @since 2.5.0
    + */
    +gpointer purple_cmds_get_handle(void);
    +
    +/**
    + * Sets the UI operations structure to be used when registering and
    + * unregistering commands. The UI operations need only be set if the
    + * UI wants to handle the commands itself; otherwise, leave it as NULL.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_cmds_set_ui_ops(PurpleCommandsUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used when registering and
    + * unregistering commands.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleCommandsUiOps *purple_cmds_get_ui_ops(void);
    +
    +/**
    + * Initialize the commands subsystem.
    + * @since 2.5.0
    + */
    +void purple_cmds_init(void);
    +
    +/**
    + * Uninitialize the commands subsystem.
    + * @since 2.5.0
    + */
    +void purple_cmds_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_CMDS_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/connection.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,626 @@
    +/**
    + * @file connection.h Connection API
    + * @ingroup core
    + * @see @ref connection-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_CONNECTION_H_
    +#define _PURPLE_CONNECTION_H_
    +
    +/** @copydoc _PurpleConnection */
    +typedef struct _PurpleConnection PurpleConnection;
    +
    +/**
    + * Flags to change behavior of the client for a given connection.
    + */
    +typedef enum
    +{
    + PURPLE_CONNECTION_HTML = 0x0001, /**< Connection sends/receives in 'HTML'. */
    + PURPLE_CONNECTION_NO_BGCOLOR = 0x0002, /**< Connection does not send/receive
    + background colors. */
    + PURPLE_CONNECTION_AUTO_RESP = 0x0004, /**< Send auto responses when away. */
    + PURPLE_CONNECTION_FORMATTING_WBFO = 0x0008, /**< The text buffer must be formatted as a whole */
    + PURPLE_CONNECTION_NO_NEWLINES = 0x0010, /**< No new lines are allowed in outgoing messages */
    + PURPLE_CONNECTION_NO_FONTSIZE = 0x0020, /**< Connection does not send/receive font sizes */
    + PURPLE_CONNECTION_NO_URLDESC = 0x0040, /**< Connection does not support descriptions with links */
    + PURPLE_CONNECTION_NO_IMAGES = 0x0080, /**< Connection does not support sending of images */
    + PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY = 0x0100, /**< Connection supports sending and receiving custom smileys */
    + PURPLE_CONNECTION_SUPPORT_MOODS = 0x0200, /**< Connection supports setting moods */
    + PURPLE_CONNECTION_SUPPORT_MOOD_MESSAGES = 0x0400 /**< Connection supports setting a message on moods */
    +} PurpleConnectionFlags;
    +
    +typedef enum
    +{
    + PURPLE_DISCONNECTED = 0, /**< Disconnected. */
    + PURPLE_CONNECTED, /**< Connected. */
    + PURPLE_CONNECTING /**< Connecting. */
    +
    +} PurpleConnectionState;
    +
    +/**
    + * Possible errors that can cause a connection to be closed.
    + *
    + * @since 2.3.0
    + */
    +typedef enum
    +{
    + /** There was an error sending or receiving on the network socket, or
    + * there was some protocol error (such as the server sending malformed
    + * data).
    + */
    + PURPLE_CONNECTION_ERROR_NETWORK_ERROR = 0,
    + /** The username supplied was not valid. */
    + PURPLE_CONNECTION_ERROR_INVALID_USERNAME = 1,
    + /** The username, password or some other credential was incorrect. Use
    + * #PURPLE_CONNECTION_ERROR_INVALID_USERNAME instead if the username
    + * is known to be invalid.
    + */
    + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED = 2,
    + /** libpurple doesn't speak any of the authentication methods the
    + * server offered.
    + */
    + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3,
    + /** libpurple was built without SSL support, and the connection needs
    + * SSL.
    + */
    + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT = 4,
    + /** There was an error negotiating SSL on this connection, or the
    + * server does not support encryption but an account option was set to
    + * require it.
    + */
    + PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR = 5,
    + /** Someone is already connected to the server using the name you are
    + * trying to connect with.
    + */
    + PURPLE_CONNECTION_ERROR_NAME_IN_USE = 6,
    +
    + /** The username/server/other preference for the account isn't valid.
    + * For instance, on IRC the username cannot contain white space.
    + * This reason should not be used for incorrect passwords etc: use
    + * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED for that.
    + *
    + * @todo This reason really shouldn't be necessary. Usernames and
    + * other account preferences should be validated when the
    + * account is created.
    + */
    + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS = 7,
    +
    + /** The server did not provide a SSL certificate. */
    + PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED = 8,
    + /** The server's SSL certificate could not be trusted. */
    + PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED = 9,
    + /** The server's SSL certificate has expired. */
    + PURPLE_CONNECTION_ERROR_CERT_EXPIRED = 10,
    + /** The server's SSL certificate is not yet valid. */
    + PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11,
    + /** The server's SSL certificate did not match its hostname. */
    + PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12,
    + /** The server's SSL certificate does not have the expected
    + * fingerprint.
    + */
    + PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13,
    + /** The server's SSL certificate is self-signed. */
    + PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED = 14,
    + /** There was some other error validating the server's SSL certificate.
    + */
    + PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR = 15,
    +
    + /** Some other error occurred which fits into none of the other
    + * categories.
    + */
    + /* purple_connection_error_reason() in connection.c uses the fact that
    + * this is the last member of the enum when sanity-checking; if other
    + * reasons are added after it, the check must be updated.
    + */
    + PURPLE_CONNECTION_ERROR_OTHER_ERROR = 16
    +} PurpleConnectionError;
    +
    +/** Holds the type of an error along with its description. */
    +typedef struct
    +{
    + /** The type of error. */
    + PurpleConnectionError type;
    + /** A localised, human-readable description of the error. */
    + char *description;
    +} PurpleConnectionErrorInfo;
    +
    +#include <time.h>
    +
    +#include "account.h"
    +#include "plugin.h"
    +#include "status.h"
    +#include "sslconn.h"
    +
    +/**
    + * Connection UI operations. Used to notify the user of changes to
    + * connections, such as being disconnected, and to respond to the
    + * underlying network connection appearing and disappearing. UIs should
    + * call #purple_connections_set_ui_ops() with an instance of this struct.
    + *
    + * @see @ref ui-ops
    + */
    +typedef struct
    +{
    + /**
    + * When an account is connecting, this operation is called to notify
    + * the UI of what is happening, as well as which @a step out of @a
    + * step_count has been reached (which might be displayed as a progress
    + * bar).
    + * @see #purple_connection_update_progress
    + */
    + void (*connect_progress)(PurpleConnection *gc,
    + const char *text,
    + size_t step,
    + size_t step_count);
    +
    + /**
    + * Called when a connection is established (just before the
    + * @ref signed-on signal).
    + */
    + void (*connected)(PurpleConnection *gc);
    +
    + /**
    + * Called when a connection is ended (between the @ref signing-off
    + * and @ref signed-off signals).
    + */
    + void (*disconnected)(PurpleConnection *gc);
    +
    + /**
    + * Used to display connection-specific notices. (Pidgin's Gtk user
    + * interface implements this as a no-op; #purple_connection_notice(),
    + * which uses this operation, is not used by any of the protocols
    + * shipped with libpurple.)
    + */
    + void (*notice)(PurpleConnection *gc, const char *text);
    +
    + /**
    + * Called when an error causes a connection to be disconnected.
    + * Called before #disconnected.
    + * @param text a localized error message.
    + * @see #purple_connection_error
    + * @deprecated in favour of
    + * #PurpleConnectionUiOps.report_disconnect_reason.
    + */
    + void (*report_disconnect)(PurpleConnection *gc, const char *text);
    +
    + /**
    + * Called when libpurple discovers that the computer's network
    + * connection is active. On Linux, this uses Network Manager if
    + * available; on Windows, it uses Win32's network change notification
    + * infrastructure.
    + */
    + void (*network_connected)(void);
    +
    + /**
    + * Called when libpurple discovers that the computer's network
    + * connection has gone away.
    + */
    + void (*network_disconnected)(void);
    +
    + /**
    + * Called when an error causes a connection to be disconnected.
    + * Called before #disconnected. This op is intended to replace
    + * #report_disconnect. If both are implemented, this will be called
    + * first; however, there's no real reason to implement both.
    + *
    + * @param reason why the connection ended, if known, or
    + * #PURPLE_CONNECTION_ERROR_OTHER_ERROR, if not.
    + * @param text a localized message describing the disconnection
    + * in more detail to the user.
    + * @see #purple_connection_error_reason
    + *
    + * @since 2.3.0
    + */
    + void (*report_disconnect_reason)(PurpleConnection *gc,
    + PurpleConnectionError reason,
    + const char *text);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    +} PurpleConnectionUiOps;
    +
    +
    +/* Represents an active connection on an account. */
    +struct _PurpleConnection
    +{
    + PurplePlugin *prpl; /**< The protocol plugin. */
    + PurpleConnectionFlags flags; /**< Connection flags. */
    +
    + PurpleConnectionState state; /**< The connection state. */
    +
    + PurpleAccount *account; /**< The account being connected to. */
    + char *password; /**< The password used. */
    + int inpa; /**< The input watcher. */
    +
    + GSList *buddy_chats; /**< A list of active chats
    + (#PurpleConversation structs of type
    + #PURPLE_CONV_TYPE_CHAT). */
    + void *proto_data; /**< Protocol-specific data. */
    +
    + char *display_name; /**< How you appear to other people. */
    + guint keepalive; /**< Keep-alive. */
    +
    + /** Wants to Die state. This is set when the user chooses to log out, or
    + * when the protocol is disconnected and should not be automatically
    + * reconnected (incorrect password, etc.). prpls should rely on
    + * purple_connection_error_reason() to set this for them rather than
    + * setting it themselves.
    + * @see purple_connection_error_is_fatal
    + */
    + gboolean wants_to_die;
    +
    + guint disconnect_timeout; /**< Timer used for nasty stack tricks */
    + time_t last_received; /**< When we last received a packet. Set by the
    + prpl to avoid sending unneeded keepalives */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Connection API */
    +/**************************************************************************/
    +/*@{*/
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    +/**
    + * This function should only be called by purple_account_connect()
    + * in account.c. If you're trying to sign on an account, use that
    + * function instead.
    + *
    + * Creates a connection to the specified account and either connects
    + * or attempts to register a new account. If you are logging in,
    + * the connection uses the current active status for this account.
    + * So if you want to sign on as "away," for example, you need to
    + * have called purple_account_set_status(account, "away").
    + * (And this will call purple_account_connect() automatically).
    + *
    + * @param account The account the connection should be connecting to.
    + * @param regist Whether we are registering a new account or just
    + * trying to do a normal signon.
    + * @param password The password to use.
    + *
    + * @deprecated As this is internal, we should make it private in 3.0.0.
    + */
    +void purple_connection_new(PurpleAccount *account, gboolean regist,
    + const char *password);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    +/**
    + * This function should only be called by purple_account_unregister()
    + * in account.c.
    + *
    + * Tries to unregister the account on the server. If the account is not
    + * connected, also creates a new connection.
    + *
    + * @param account The account to unregister
    + * @param password The password to use.
    + * @param cb Optional callback to be called when unregistration is complete
    + * @param user_data user data to pass to the callback
    + *
    + * @deprecated As this is internal, we should make it private in 3.0.0.
    + */
    +void purple_connection_new_unregister(PurpleAccount *account, const char *password, PurpleAccountUnregistrationCb cb, void *user_data);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_CONNECTION_C_)
    +/**
    + * Disconnects and destroys a PurpleConnection.
    + *
    + * This function should only be called by purple_account_disconnect()
    + * in account.c. If you're trying to sign off an account, use that
    + * function instead.
    + *
    + * @param gc The purple connection to destroy.
    + *
    + * @deprecated As this is internal, we should make it private in 3.0.0.
    + */
    +void purple_connection_destroy(PurpleConnection *gc);
    +#endif
    +
    +/**
    + * Sets the connection state. PRPLs should call this and pass in
    + * the state #PURPLE_CONNECTED when the account is completely
    + * signed on. What does it mean to be completely signed on? If
    + * the core can call prpl->set_status, and it successfully changes
    + * your status, then the account is online.
    + *
    + * @param gc The connection.
    + * @param state The connection state.
    + */
    +void purple_connection_set_state(PurpleConnection *gc, PurpleConnectionState state);
    +
    +/**
    + * Sets the connection's account.
    + *
    + * @param gc The connection.
    + * @param account The account.
    + */
    +void purple_connection_set_account(PurpleConnection *gc, PurpleAccount *account);
    +
    +/**
    + * Sets the connection's displayed name.
    + *
    + * @param gc The connection.
    + * @param name The displayed name.
    + */
    +void purple_connection_set_display_name(PurpleConnection *gc, const char *name);
    +
    +/**
    + * Sets the protocol data for a connection.
    + *
    + * @param connection The PurpleConnection.
    + * @param proto_data The protocol data to set for the connection.
    + *
    + * @since 2.6.0
    + */
    +void purple_connection_set_protocol_data(PurpleConnection *connection, void *proto_data);
    +
    +/**
    + * Returns the connection state.
    + *
    + * @param gc The connection.
    + *
    + * @return The connection state.
    + */
    +PurpleConnectionState purple_connection_get_state(const PurpleConnection *gc);
    +
    +/**
    + * Returns TRUE if the account is connected, otherwise returns FALSE.
    + *
    + * @return TRUE if the account is connected, otherwise returns FALSE.
    + */
    +#define PURPLE_CONNECTION_IS_CONNECTED(gc) \
    + (purple_connection_get_state(gc) == PURPLE_CONNECTED)
    +
    +/**
    + * Returns the connection's account.
    + *
    + * @param gc The connection.
    + *
    + * @return The connection's account.
    + */
    +PurpleAccount *purple_connection_get_account(const PurpleConnection *gc);
    +
    +/**
    + * Returns the protocol plugin managing a connection.
    + *
    + * @param gc The connection.
    + *
    + * @return The protocol plugin.
    + *
    + * @since 2.4.0
    + */
    +PurplePlugin * purple_connection_get_prpl(const PurpleConnection *gc);
    +
    +/**
    + * Returns the connection's password.
    + *
    + * @param gc The connection.
    + *
    + * @return The connection's password.
    + */
    +const char *purple_connection_get_password(const PurpleConnection *gc);
    +
    +/**
    + * Returns the connection's displayed name.
    + *
    + * @param gc The connection.
    + *
    + * @return The connection's displayed name.
    + */
    +const char *purple_connection_get_display_name(const PurpleConnection *gc);
    +
    +/**
    + * Gets the protocol data from a connection.
    + *
    + * @param connection The PurpleConnection.
    + *
    + * @return The protocol data for the connection.
    + *
    + * @since 2.6.0
    + */
    +void *purple_connection_get_protocol_data(const PurpleConnection *connection);
    +
    +/**
    + * Updates the connection progress.
    + *
    + * @param gc The connection.
    + * @param text Information on the current step.
    + * @param step The current step.
    + * @param count The total number of steps.
    + */
    +void purple_connection_update_progress(PurpleConnection *gc, const char *text,
    + size_t step, size_t count);
    +
    +/**
    + * Displays a connection-specific notice.
    + *
    + * @param gc The connection.
    + * @param text The notice text.
    + */
    +void purple_connection_notice(PurpleConnection *gc, const char *text);
    +
    +/**
    + * Closes a connection with an error.
    + *
    + * @param gc The connection.
    + * @param reason The error text, which may not be @c NULL.
    + * @deprecated in favour of #purple_connection_error_reason. Calling
    + * @c purple_connection_error(gc, text) is equivalent to calling
    + * @c purple_connection_error_reason(gc, reason, text) where @c reason is
    + * #PURPLE_CONNECTION_ERROR_OTHER_ERROR if @c gc->wants_to_die is @c TRUE, and
    + * #PURPLE_CONNECTION_ERROR_NETWORK_ERROR if not. (This is to keep
    + * auto-reconnection behaviour the same when using old prpls which don't use
    + * reasons yet.)
    + */
    +void purple_connection_error(PurpleConnection *gc, const char *reason);
    +
    +/**
    + * Closes a connection with an error and a human-readable description of the
    + * error. It also sets @c gc->wants_to_die to the value of
    + * #purple_connection_error_is_fatal(@a reason), mainly for
    + * backwards-compatibility.
    + *
    + * @param gc the connection which is closing.
    + * @param reason why the connection is closing.
    + * @param description a non-@c NULL localized description of the error.
    + *
    + * @since 2.3.0
    + */
    +void
    +purple_connection_error_reason (PurpleConnection *gc,
    + PurpleConnectionError reason,
    + const char *description);
    +
    +/**
    + * Closes a connection due to an SSL error; this is basically a shortcut to
    + * turning the #PurpleSslErrorType into a #PurpleConnectionError and a
    + * human-readable string and then calling purple_connection_error_reason().
    + *
    + * @since 2.3.0
    + */
    +void
    +purple_connection_ssl_error (PurpleConnection *gc,
    + PurpleSslErrorType ssl_error);
    +
    +/**
    + * Reports whether a disconnection reason is fatal (in which case the account
    + * should probably not be automatically reconnected) or transient (so
    + * auto-reconnection is a good idea).
    + * For instance, #PURPLE_CONNECTION_ERROR_NETWORK_ERROR is a temporary error,
    + * which might be caused by losing the network connection, so <tt>
    + * purple_connection_error_is_fatal (PURPLE_CONNECTION_ERROR_NETWORK_ERROR)</tt>
    + * is @c FALSE. On the other hand,
    + * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED probably indicates a
    + * misconfiguration of the account which needs the user to go fix it up, so
    + * <tt> purple_connection_error_is_fatal
    + * (PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED)</tt> is @c TRUE.
    + *
    + * (This function is meant to replace checking PurpleConnection.wants_to_die.)
    + *
    + * @return @c TRUE if the account should not be automatically reconnected, and
    + * @c FALSE otherwise.
    + *
    + * @since 2.3.0
    + */
    +gboolean
    +purple_connection_error_is_fatal (PurpleConnectionError reason);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Connections API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Disconnects from all connections.
    + */
    +void purple_connections_disconnect_all(void);
    +
    +/**
    + * Returns a list of all active connections. This does not
    + * include connections that are in the process of connecting.
    + *
    + * @constreturn A list of all active connections.
    + */
    +GList *purple_connections_get_all(void);
    +
    +/**
    + * Returns a list of all connections in the process of connecting.
    + *
    + * @constreturn A list of connecting connections.
    + */
    +GList *purple_connections_get_connecting(void);
    +
    +/**
    + * Checks if gc is still a valid pointer to a gc.
    + *
    + * @return @c TRUE if gc is valid.
    + *
    + * @deprecated Do not use this. Instead, cancel your asynchronous request
    + * when the PurpleConnection is destroyed.
    + */
    +/*
    + * TODO: Eventually this bad boy will be removed, because it is
    + * a gross fix for a crashy problem.
    + */
    +#define PURPLE_CONNECTION_IS_VALID(gc) (g_list_find(purple_connections_get_all(), (gc)) != NULL)
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used for connections.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_connections_set_ui_ops(PurpleConnectionUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for connections.
    + *
    + * @return The UI operations structure in use.
    + */
    +PurpleConnectionUiOps *purple_connections_get_ui_ops(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Connections Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Initializes the connections subsystem.
    + */
    +void purple_connections_init(void);
    +
    +/**
    + * Uninitializes the connections subsystem.
    + */
    +void purple_connections_uninit(void);
    +
    +/**
    + * Returns the handle to the connections subsystem.
    + *
    + * @return The connections subsystem handle.
    + */
    +void *purple_connections_get_handle(void);
    +
    +/*@}*/
    +
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_CONNECTION_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/conversation.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1478 @@
    +/**
    + * @file conversation.h Conversation API
    + * @ingroup core
    + * @see @ref conversation-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_CONVERSATION_H_
    +#define _PURPLE_CONVERSATION_H_
    +
    +/**************************************************************************/
    +/** Data Structures */
    +/**************************************************************************/
    +
    +
    +/** @copydoc _PurpleConversationUiOps */
    +typedef struct _PurpleConversationUiOps PurpleConversationUiOps;
    +/** @copydoc _PurpleConversation */
    +typedef struct _PurpleConversation PurpleConversation;
    +/** @copydoc _PurpleConvIm */
    +typedef struct _PurpleConvIm PurpleConvIm;
    +/** @copydoc _PurpleConvChat */
    +typedef struct _PurpleConvChat PurpleConvChat;
    +/** @copydoc _PurpleConvChatBuddy */
    +typedef struct _PurpleConvChatBuddy PurpleConvChatBuddy;
    +/** @copydoc _PurpleConvMessage */
    +typedef struct _PurpleConvMessage PurpleConvMessage;
    +
    +/**
    + * A type of conversation.
    + */
    +typedef enum
    +{
    + PURPLE_CONV_TYPE_UNKNOWN = 0, /**< Unknown conversation type. */
    + PURPLE_CONV_TYPE_IM, /**< Instant Message. */
    + PURPLE_CONV_TYPE_CHAT, /**< Chat room. */
    + PURPLE_CONV_TYPE_MISC, /**< A misc. conversation. */
    + PURPLE_CONV_TYPE_ANY /**< Any type of conversation. */
    +
    +} PurpleConversationType;
    +
    +/**
    + * Conversation update type.
    + */
    +typedef enum
    +{
    + PURPLE_CONV_UPDATE_ADD = 0, /**< The buddy associated with the conversation
    + was added. */
    + PURPLE_CONV_UPDATE_REMOVE, /**< The buddy associated with the conversation
    + was removed. */
    + PURPLE_CONV_UPDATE_ACCOUNT, /**< The purple_account was changed. */
    + PURPLE_CONV_UPDATE_TYPING, /**< The typing state was updated. */
    + PURPLE_CONV_UPDATE_UNSEEN, /**< The unseen state was updated. */
    + PURPLE_CONV_UPDATE_LOGGING, /**< Logging for this conversation was
    + enabled or disabled. */
    + PURPLE_CONV_UPDATE_TOPIC, /**< The topic for a chat was updated. */
    + /*
    + * XXX These need to go when we implement a more generic core/UI event
    + * system.
    + */
    + PURPLE_CONV_ACCOUNT_ONLINE, /**< One of the user's accounts went online. */
    + PURPLE_CONV_ACCOUNT_OFFLINE, /**< One of the user's accounts went offline. */
    + PURPLE_CONV_UPDATE_AWAY, /**< The other user went away. */
    + PURPLE_CONV_UPDATE_ICON, /**< The other user's buddy icon changed. */
    + PURPLE_CONV_UPDATE_TITLE,
    + PURPLE_CONV_UPDATE_CHATLEFT,
    +
    + PURPLE_CONV_UPDATE_FEATURES /**< The features for a chat have changed */
    +
    +} PurpleConvUpdateType;
    +
    +/**
    + * The typing state of a user.
    + */
    +typedef enum
    +{
    + PURPLE_NOT_TYPING = 0, /**< Not typing. */
    + PURPLE_TYPING, /**< Currently typing. */
    + PURPLE_TYPED /**< Stopped typing momentarily. */
    +
    +} PurpleTypingState;
    +
    +/**
    + * Flags applicable to a message. Most will have send, recv or system.
    + */
    +typedef enum
    +{
    + PURPLE_MESSAGE_SEND = 0x0001, /**< Outgoing message. */
    + PURPLE_MESSAGE_RECV = 0x0002, /**< Incoming message. */
    + PURPLE_MESSAGE_SYSTEM = 0x0004, /**< System message. */
    + PURPLE_MESSAGE_AUTO_RESP = 0x0008, /**< Auto response. */
    + PURPLE_MESSAGE_ACTIVE_ONLY = 0x0010, /**< Hint to the UI that this
    + message should not be
    + shown in conversations
    + which are only open for
    + internal UI purposes
    + (e.g. for contact-aware
    + conversations). */
    + PURPLE_MESSAGE_NICK = 0x0020, /**< Contains your nick. */
    + PURPLE_MESSAGE_NO_LOG = 0x0040, /**< Do not log. */
    + PURPLE_MESSAGE_WHISPER = 0x0080, /**< Whispered message. */
    + PURPLE_MESSAGE_ERROR = 0x0200, /**< Error message. */
    + PURPLE_MESSAGE_DELAYED = 0x0400, /**< Delayed message. */
    + PURPLE_MESSAGE_RAW = 0x0800, /**< "Raw" message - don't
    + apply formatting */
    + PURPLE_MESSAGE_IMAGES = 0x1000, /**< Message contains images */
    + PURPLE_MESSAGE_NOTIFY = 0x2000, /**< Message is a notification */
    + PURPLE_MESSAGE_NO_LINKIFY = 0x4000, /**< Message should not be auto-
    + linkified @since 2.1.0 */
    + PURPLE_MESSAGE_INVISIBLE = 0x8000, /**< Message should not be displayed */
    + PURPLE_MESSAGE_REMOTE_SEND = 0x10000 /**< Message sent from another location,
    + not an echo of a local one
    + @since 2.12.0 */
    +} PurpleMessageFlags;
    +
    +/**
    + * Flags applicable to users in Chats.
    + */
    +typedef enum
    +{
    + PURPLE_CBFLAGS_NONE = 0x0000, /**< No flags */
    + PURPLE_CBFLAGS_VOICE = 0x0001, /**< Voiced user or "Participant" */
    + PURPLE_CBFLAGS_HALFOP = 0x0002, /**< Half-op */
    + PURPLE_CBFLAGS_OP = 0x0004, /**< Channel Op or Moderator */
    + PURPLE_CBFLAGS_FOUNDER = 0x0008, /**< Channel Founder */
    + PURPLE_CBFLAGS_TYPING = 0x0010, /**< Currently typing */
    + PURPLE_CBFLAGS_AWAY = 0x0020 /**< Currently away. @since 2.8.0 */
    +
    +} PurpleConvChatBuddyFlags;
    +
    +#include "account.h"
    +#include "buddyicon.h"
    +#include "log.h"
    +#include "server.h"
    +
    +/**
    + * Conversation operations and events.
    + *
    + * Any UI representing a conversation must assign a filled-out
    + * PurpleConversationUiOps structure to the PurpleConversation.
    + */
    +struct _PurpleConversationUiOps
    +{
    + /** Called when @a conv is created (but before the @ref
    + * conversation-created signal is emitted).
    + */
    + void (*create_conversation)(PurpleConversation *conv);
    +
    + /** Called just before @a conv is freed. */
    + void (*destroy_conversation)(PurpleConversation *conv);
    + /** Write a message to a chat. If this field is @c NULL, libpurple will
    + * fall back to using #write_conv.
    + * @see purple_conv_chat_write()
    + */
    + void (*write_chat)(PurpleConversation *conv, const char *who,
    + const char *message, PurpleMessageFlags flags,
    + time_t mtime);
    + /** Write a message to an IM conversation. If this field is @c NULL,
    + * libpurple will fall back to using #write_conv.
    + * @see purple_conv_im_write()
    + */
    + void (*write_im)(PurpleConversation *conv, const char *who,
    + const char *message, PurpleMessageFlags flags,
    + time_t mtime);
    + /** Write a message to a conversation. This is used rather than the
    + * chat- or im-specific ops for errors, system messages (such as "x is
    + * now know as y"), and as the fallback if #write_im and #write_chat
    + * are not implemented. It should be implemented, or the UI will miss
    + * conversation error messages and your users will hate you.
    + *
    + * @see purple_conversation_write()
    + */
    + void (*write_conv)(PurpleConversation *conv,
    + const char *name,
    + const char *alias,
    + const char *message,
    + PurpleMessageFlags flags,
    + time_t mtime);
    +
    + /** Add @a cbuddies to a chat.
    + * @param cbuddies A @c GList of #PurpleConvChatBuddy structs.
    + * @param new_arrivals Whether join notices should be shown.
    + * (Join notices are actually written to the
    + * conversation by #purple_conv_chat_add_users().)
    + */
    + void (*chat_add_users)(PurpleConversation *conv,
    + GList *cbuddies,
    + gboolean new_arrivals);
    + /** Rename the user in this chat named @a old_name to @a new_name. (The
    + * rename message is written to the conversation by libpurple.)
    + * @param new_alias @a new_name's new alias, if they have one.
    + * @see purple_conv_chat_add_users()
    + */
    + void (*chat_rename_user)(PurpleConversation *conv, const char *old_name,
    + const char *new_name, const char *new_alias);
    + /** Remove @a users from a chat.
    + * @param users A @c GList of <tt>const char *</tt>s.
    + * @see purple_conv_chat_rename_user()
    + */
    + void (*chat_remove_users)(PurpleConversation *conv, GList *users);
    + /** Called when a user's flags are changed.
    + * @see purple_conv_chat_user_set_flags()
    + */
    + void (*chat_update_user)(PurpleConversation *conv, const char *user);
    +
    + /** Present this conversation to the user; for example, by displaying
    + * the IM dialog.
    + */
    + void (*present)(PurpleConversation *conv);
    +
    + /** If this UI has a concept of focus (as in a windowing system) and
    + * this conversation has the focus, return @c TRUE; otherwise, return
    + * @c FALSE.
    + */
    + gboolean (*has_focus)(PurpleConversation *conv);
    +
    + /* Custom Smileys */
    + gboolean (*custom_smiley_add)(PurpleConversation *conv, const char *smile, gboolean remote);
    + void (*custom_smiley_write)(PurpleConversation *conv, const char *smile,
    + const guchar *data, gsize size);
    + void (*custom_smiley_close)(PurpleConversation *conv, const char *smile);
    +
    + /** Prompt the user for confirmation to send @a message. This function
    + * should arrange for the message to be sent if the user accepts. If
    + * this field is @c NULL, libpurple will fall back to using
    + * #purple_request_action().
    + */
    + void (*send_confirm)(PurpleConversation *conv, const char *message);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/**
    + * Data specific to Instant Messages.
    + */
    +struct _PurpleConvIm
    +{
    + PurpleConversation *conv; /**< The parent conversation. */
    +
    + PurpleTypingState typing_state; /**< The current typing state. */
    + guint typing_timeout; /**< The typing timer handle. */
    + time_t type_again; /**< The type again time. */
    + guint send_typed_timeout; /**< The type again timer handle. */
    +
    + PurpleBuddyIcon *icon; /**< The buddy icon. */
    +};
    +
    +/**
    + * Data specific to Chats.
    + */
    +struct _PurpleConvChat
    +{
    + PurpleConversation *conv; /**< The parent conversation. */
    +
    + GList *in_room; /**< The users in the room.
    + * @deprecated Will be removed in 3.0.0
    + */
    + GList *ignored; /**< Ignored users. */
    + char *who; /**< The person who set the topic. */
    + char *topic; /**< The topic. */
    + int id; /**< The chat ID. */
    + char *nick; /**< Your nick in this chat. */
    +
    + gboolean left; /**< We left the chat and kept the window open */
    + GHashTable *users; /**< Hash table of the users in the room.
    + * @since 2.9.0
    + */
    +};
    +
    +/**
    + * Data for "Chat Buddies"
    + */
    +struct _PurpleConvChatBuddy
    +{
    + char *name; /**< The chat participant's name in the chat. */
    + char *alias; /**< The chat participant's alias, if known;
    + * @a NULL otherwise.
    + */
    + char *alias_key; /**< A string by which this buddy will be sorted,
    + * or @c NULL if the buddy should be sorted by
    + * its @c name. (This is currently always @c
    + * NULL.)
    + */
    + gboolean buddy; /**< @a TRUE if this chat participant is on the
    + * buddy list; @a FALSE otherwise.
    + */
    + PurpleConvChatBuddyFlags flags; /**< A bitwise OR of flags for this participant,
    + * such as whether they are a channel operator.
    + */
    + GHashTable *attributes; /**< A hash table of attributes about the user, such as
    + * real name, user@host, etc.
    + */
    + gpointer ui_data; /** < The UI can put whatever it wants here. */
    +};
    +
    +/**
    + * Description of a conversation message
    + *
    + * @since 2.2.0
    + */
    +struct _PurpleConvMessage
    +{
    + char *who;
    + char *what;
    + PurpleMessageFlags flags;
    + time_t when;
    + PurpleConversation *conv; /**< @since 2.3.0 */
    + char *alias; /**< @since 2.3.0 */
    +};
    +
    +/**
    + * A core representation of a conversation between two or more people.
    + *
    + * The conversation can be an IM or a chat.
    + */
    +struct _PurpleConversation
    +{
    + PurpleConversationType type; /**< The type of conversation. */
    +
    + PurpleAccount *account; /**< The user using this conversation. */
    +
    +
    + char *name; /**< The name of the conversation. */
    + char *title; /**< The window title. */
    +
    + gboolean logging; /**< The status of logging. */
    +
    + GList *logs; /**< This conversation's logs */
    +
    + union
    + {
    + PurpleConvIm *im; /**< IM-specific data. */
    + PurpleConvChat *chat; /**< Chat-specific data. */
    + void *misc; /**< Misc. data. */
    +
    + } u;
    +
    + PurpleConversationUiOps *ui_ops; /**< UI-specific operations. */
    + void *ui_data; /**< UI-specific data. */
    +
    + GHashTable *data; /**< Plugin-specific data. */
    +
    + PurpleConnectionFlags features; /**< The supported features */
    + GList *message_history; /**< Message history, as a GList of PurpleConvMessage's */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Conversation API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new conversation of the specified type.
    + *
    + * @param type The type of conversation.
    + * @param account The account opening the conversation window on the purple
    + * user's end.
    + * @param name The name of the conversation. For PURPLE_CONV_TYPE_IM,
    + * this is the name of the buddy.
    + *
    + * @return The new conversation.
    + */
    +PurpleConversation *purple_conversation_new(PurpleConversationType type,
    + PurpleAccount *account,
    + const char *name);
    +
    +/**
    + * Destroys the specified conversation and removes it from the parent
    + * window.
    + *
    + * If this conversation is the only one contained in the parent window,
    + * that window is also destroyed.
    + *
    + * @param conv The conversation to destroy.
    + */
    +void purple_conversation_destroy(PurpleConversation *conv);
    +
    +
    +/**
    + * Present a conversation to the user. This allows core code to initiate a
    + * conversation by displaying the IM dialog.
    + * @param conv The conversation to present
    + */
    +void purple_conversation_present(PurpleConversation *conv);
    +
    +
    +/**
    + * Returns the specified conversation's type.
    + *
    + * @param conv The conversation.
    + *
    + * @return The conversation's type.
    + */
    +PurpleConversationType purple_conversation_get_type(const PurpleConversation *conv);
    +
    +/**
    + * Sets the specified conversation's UI operations structure.
    + *
    + * @param conv The conversation.
    + * @param ops The UI conversation operations structure.
    + */
    +void purple_conversation_set_ui_ops(PurpleConversation *conv,
    + PurpleConversationUiOps *ops);
    +
    +/**
    + * Sets the default conversation UI operations structure.
    + *
    + * @param ops The UI conversation operations structure.
    + */
    +void purple_conversations_set_ui_ops(PurpleConversationUiOps *ops);
    +
    +/**
    + * Returns the specified conversation's UI operations structure.
    + *
    + * @param conv The conversation.
    + *
    + * @return The operations structure.
    + */
    +PurpleConversationUiOps *purple_conversation_get_ui_ops(
    + const PurpleConversation *conv);
    +
    +/**
    + * Sets the specified conversation's purple_account.
    + *
    + * This purple_account represents the user using purple, not the person the user
    + * is having a conversation/chat/flame with.
    + *
    + * @param conv The conversation.
    + * @param account The purple_account.
    + */
    +void purple_conversation_set_account(PurpleConversation *conv,
    + PurpleAccount *account);
    +
    +/**
    + * Returns the specified conversation's purple_account.
    + *
    + * This purple_account represents the user using purple, not the person the user
    + * is having a conversation/chat/flame with.
    + *
    + * @param conv The conversation.
    + *
    + * @return The conversation's purple_account.
    + */
    +PurpleAccount *purple_conversation_get_account(const PurpleConversation *conv);
    +
    +/**
    + * Returns the specified conversation's purple_connection.
    + *
    + * This is the same as purple_conversation_get_user(conv)->gc.
    + *
    + * @param conv The conversation.
    + *
    + * @return The conversation's purple_connection.
    + */
    +PurpleConnection *purple_conversation_get_gc(const PurpleConversation *conv);
    +
    +/**
    + * Sets the specified conversation's title.
    + *
    + * @param conv The conversation.
    + * @param title The title.
    + */
    +void purple_conversation_set_title(PurpleConversation *conv, const char *title);
    +
    +/**
    + * Returns the specified conversation's title.
    + *
    + * @param conv The conversation.
    + *
    + * @return The title.
    + */
    +const char *purple_conversation_get_title(const PurpleConversation *conv);
    +
    +/**
    + * Automatically sets the specified conversation's title.
    + *
    + * This function takes OPT_IM_ALIAS_TAB into account, as well as the
    + * user's alias.
    + *
    + * @param conv The conversation.
    + */
    +void purple_conversation_autoset_title(PurpleConversation *conv);
    +
    +/**
    + * Sets the specified conversation's name.
    + *
    + * @param conv The conversation.
    + * @param name The conversation's name.
    + */
    +void purple_conversation_set_name(PurpleConversation *conv, const char *name);
    +
    +/**
    + * Returns the specified conversation's name.
    + *
    + * @param conv The conversation.
    + *
    + * @return The conversation's name. If the conversation is an IM with a PurpleBuddy,
    + * then it's the name of the PurpleBuddy.
    + */
    +const char *purple_conversation_get_name(const PurpleConversation *conv);
    +
    +/**
    + * Get an attribute of a chat buddy
    + *
    + * @param cb The chat buddy.
    + * @param key The key of the attribute.
    + *
    + * @return The value of the attribute key.
    + */
    +const char *purple_conv_chat_cb_get_attribute(PurpleConvChatBuddy *cb, const char *key);
    +
    +/**
    + * Get the keys of all atributes of a chat buddy
    + *
    + * @param cb The chat buddy.
    + *
    + * @return A list of the attributes of a chat buddy.
    + */
    +GList *purple_conv_chat_cb_get_attribute_keys(PurpleConvChatBuddy *cb);
    +
    +/**
    + * Set an attribute of a chat buddy
    + *
    + * @param chat The chat.
    + * @param cb The chat buddy.
    + * @param key The key of the attribute.
    + * @param value The value of the attribute.
    + */
    +void purple_conv_chat_cb_set_attribute(PurpleConvChat *chat, PurpleConvChatBuddy *cb, const char *key, const char *value);
    +
    +/**
    + * Set attributes of a chat buddy
    + *
    + * @param chat The chat.
    + * @param cb The chat buddy.
    + * @param keys A GList of the keys.
    + * @param values A GList of the values.
    + */
    +void
    +purple_conv_chat_cb_set_attributes(PurpleConvChat *chat, PurpleConvChatBuddy *cb, GList *keys, GList *values);
    +
    +/**
    + * Enables or disables logging for this conversation.
    + *
    + * @param conv The conversation.
    + * @param log @c TRUE if logging should be enabled, or @c FALSE otherwise.
    + */
    +void purple_conversation_set_logging(PurpleConversation *conv, gboolean log);
    +
    +/**
    + * Returns whether or not logging is enabled for this conversation.
    + *
    + * @param conv The conversation.
    + *
    + * @return @c TRUE if logging is enabled, or @c FALSE otherwise.
    + */
    +gboolean purple_conversation_is_logging(const PurpleConversation *conv);
    +
    +/**
    + * Closes any open logs for this conversation.
    + *
    + * Note that new logs will be opened as necessary (e.g. upon receipt of a
    + * message, if the conversation has logging enabled. To disable logging for
    + * the remainder of the conversation, use purple_conversation_set_logging().
    + *
    + * @param conv The conversation.
    + */
    +void purple_conversation_close_logs(PurpleConversation *conv);
    +
    +/**
    + * Returns the specified conversation's IM-specific data.
    + *
    + * If the conversation type is not PURPLE_CONV_TYPE_IM, this will return @c NULL.
    + *
    + * @param conv The conversation.
    + *
    + * @return The IM-specific data.
    + */
    +PurpleConvIm *purple_conversation_get_im_data(const PurpleConversation *conv);
    +
    +#define PURPLE_CONV_IM(c) (purple_conversation_get_im_data(c))
    +
    +/**
    + * Returns the specified conversation's chat-specific data.
    + *
    + * If the conversation type is not PURPLE_CONV_TYPE_CHAT, this will return @c NULL.
    + *
    + * @param conv The conversation.
    + *
    + * @return The chat-specific data.
    + */
    +PurpleConvChat *purple_conversation_get_chat_data(const PurpleConversation *conv);
    +
    +#define PURPLE_CONV_CHAT(c) (purple_conversation_get_chat_data(c))
    +
    +/**
    + * Sets extra data for a conversation.
    + *
    + * @param conv The conversation.
    + * @param key The unique key.
    + * @param data The data to assign.
    + */
    +void purple_conversation_set_data(PurpleConversation *conv, const char *key,
    + gpointer data);
    +
    +/**
    + * Returns extra data in a conversation.
    + *
    + * @param conv The conversation.
    + * @param key The unqiue key.
    + *
    + * @return The data associated with the key.
    + */
    +gpointer purple_conversation_get_data(PurpleConversation *conv, const char *key);
    +
    +/**
    + * Returns a list of all conversations.
    + *
    + * This list includes both IMs and chats.
    + *
    + * @constreturn A GList of all conversations.
    + */
    +GList *purple_get_conversations(void);
    +
    +/**
    + * Returns a list of all IMs.
    + *
    + * @constreturn A GList of all IMs.
    + */
    +GList *purple_get_ims(void);
    +
    +/**
    + * Returns a list of all chats.
    + *
    + * @constreturn A GList of all chats.
    + */
    +GList *purple_get_chats(void);
    +
    +/**
    + * Finds a conversation with the specified type, name, and Purple account.
    + *
    + * @param type The type of the conversation.
    + * @param name The name of the conversation.
    + * @param account The purple_account associated with the conversation.
    + *
    + * @return The conversation if found, or @c NULL otherwise.
    + */
    +PurpleConversation *purple_find_conversation_with_account(
    + PurpleConversationType type, const char *name,
    + const PurpleAccount *account);
    +
    +/**
    + * Writes to a conversation window.
    + *
    + * This function should not be used to write IM or chat messages. Use
    + * purple_conv_im_write() and purple_conv_chat_write() instead. Those functions will
    + * most likely call this anyway, but they may do their own formatting,
    + * sound playback, etc.
    + *
    + * This can be used to write generic messages, such as "so and so closed
    + * the conversation window."
    + *
    + * @param conv The conversation.
    + * @param who The user who sent the message.
    + * @param message The message.
    + * @param flags The message flags.
    + * @param mtime The time the message was sent.
    + *
    + * @see purple_conv_im_write()
    + * @see purple_conv_chat_write()
    + */
    +void purple_conversation_write(PurpleConversation *conv, const char *who,
    + const char *message, PurpleMessageFlags flags,
    + time_t mtime);
    +
    +/**
    + Set the features as supported for the given conversation.
    + @param conv The conversation
    + @param features Bitset defining supported features
    +*/
    +void purple_conversation_set_features(PurpleConversation *conv,
    + PurpleConnectionFlags features);
    +
    +
    +/**
    + Get the features supported by the given conversation.
    + @param conv The conversation
    +*/
    +PurpleConnectionFlags purple_conversation_get_features(PurpleConversation *conv);
    +
    +/**
    + * Determines if a conversation has focus
    + *
    + * @param conv The conversation.
    + *
    + * @return @c TRUE if the conversation has focus, @c FALSE if
    + * it does not or the UI does not have a concept of conversation focus
    + */
    +gboolean purple_conversation_has_focus(PurpleConversation *conv);
    +
    +/**
    + * Updates the visual status and UI of a conversation.
    + *
    + * @param conv The conversation.
    + * @param type The update type.
    + */
    +void purple_conversation_update(PurpleConversation *conv, PurpleConvUpdateType type);
    +
    +/**
    + * Calls a function on each conversation.
    + *
    + * @param func The function.
    + */
    +void purple_conversation_foreach(void (*func)(PurpleConversation *conv));
    +
    +/**
    + * Retrieve the message history of a conversation.
    + *
    + * @param conv The conversation
    + *
    + * @return A GList of PurpleConvMessage's. The must not modify the list or the data within.
    + * The list contains the newest message at the beginning, and the oldest message at
    + * the end.
    + *
    + * @since 2.2.0
    + */
    +GList *purple_conversation_get_message_history(PurpleConversation *conv);
    +
    +/**
    + * Clear the message history of a conversation.
    + *
    + * @param conv The conversation
    + *
    + * @since 2.2.0
    + */
    +void purple_conversation_clear_message_history(PurpleConversation *conv);
    +
    +/**
    + * Get the sender from a PurpleConvMessage
    + *
    + * @param msg A PurpleConvMessage
    + *
    + * @return The name of the sender of the message
    + *
    + * @since 2.2.0
    + */
    +const char *purple_conversation_message_get_sender(PurpleConvMessage *msg);
    +
    +/**
    + * Get the message from a PurpleConvMessage
    + *
    + * @param msg A PurpleConvMessage
    + *
    + * @return The name of the sender of the message
    + *
    + * @since 2.2.0
    + */
    +const char *purple_conversation_message_get_message(PurpleConvMessage *msg);
    +
    +/**
    + * Get the message-flags of a PurpleConvMessage
    + *
    + * @param msg A PurpleConvMessage
    + *
    + * @return The message flags
    + *
    + * @since 2.2.0
    + */
    +PurpleMessageFlags purple_conversation_message_get_flags(PurpleConvMessage *msg);
    +
    +/**
    + * Get the timestamp of a PurpleConvMessage
    + *
    + * @param msg A PurpleConvMessage
    + *
    + * @return The timestamp of the message
    + *
    + * @since 2.2.0
    + */
    +time_t purple_conversation_message_get_timestamp(PurpleConvMessage *msg);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name IM Conversation API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets an IM's parent conversation.
    + *
    + * @param im The IM.
    + *
    + * @return The parent conversation.
    + */
    +PurpleConversation *purple_conv_im_get_conversation(const PurpleConvIm *im);
    +
    +/**
    + * Sets the IM's buddy icon.
    + *
    + * This should only be called from within Purple. You probably want to
    + * call purple_buddy_icon_set_data().
    + *
    + * @param im The IM.
    + * @param icon The buddy icon.
    + *
    + * @see purple_buddy_icon_set_data()
    + */
    +void purple_conv_im_set_icon(PurpleConvIm *im, PurpleBuddyIcon *icon);
    +
    +/**
    + * Returns the IM's buddy icon.
    + *
    + * @param im The IM.
    + *
    + * @return The buddy icon.
    + */
    +PurpleBuddyIcon *purple_conv_im_get_icon(const PurpleConvIm *im);
    +
    +/**
    + * Sets the IM's typing state.
    + *
    + * @param im The IM.
    + * @param state The typing state.
    + */
    +void purple_conv_im_set_typing_state(PurpleConvIm *im, PurpleTypingState state);
    +
    +/**
    + * Returns the IM's typing state.
    + *
    + * @param im The IM.
    + *
    + * @return The IM's typing state.
    + */
    +PurpleTypingState purple_conv_im_get_typing_state(const PurpleConvIm *im);
    +
    +/**
    + * Starts the IM's typing timeout.
    + *
    + * @param im The IM.
    + * @param timeout The timeout.
    + */
    +void purple_conv_im_start_typing_timeout(PurpleConvIm *im, int timeout);
    +
    +/**
    + * Stops the IM's typing timeout.
    + *
    + * @param im The IM.
    + */
    +void purple_conv_im_stop_typing_timeout(PurpleConvIm *im);
    +
    +/**
    + * Returns the IM's typing timeout.
    + *
    + * @param im The IM.
    + *
    + * @return The timeout.
    + */
    +guint purple_conv_im_get_typing_timeout(const PurpleConvIm *im);
    +
    +/**
    + * Sets the quiet-time when no PURPLE_TYPING messages will be sent.
    + * Few protocols need this. If the user is still typing after this
    + * quiet-period, then another PURPLE_TYPING message will be sent.
    + *
    + * @param im The IM.
    + * @param val The number of seconds to wait before allowing another
    + * PURPLE_TYPING message to be sent to the user. Or 0 to
    + * not send another PURPLE_TYPING message.
    + */
    +void purple_conv_im_set_type_again(PurpleConvIm *im, unsigned int val);
    +
    +/**
    + * Returns the time after which another PURPLE_TYPING message should be sent.
    + *
    + * @param im The IM.
    + *
    + * @return The time in seconds since the epoch. Or 0 if no additional
    + * PURPLE_TYPING message should be sent.
    + */
    +time_t purple_conv_im_get_type_again(const PurpleConvIm *im);
    +
    +/**
    + * Starts the IM's type again timeout.
    + *
    + * @param im The IM.
    + */
    +void purple_conv_im_start_send_typed_timeout(PurpleConvIm *im);
    +
    +/**
    + * Stops the IM's type again timeout.
    + *
    + * @param im The IM.
    + */
    +void purple_conv_im_stop_send_typed_timeout(PurpleConvIm *im);
    +
    +/**
    + * Returns the IM's type again timeout interval.
    + *
    + * @param im The IM.
    + *
    + * @return The type again timeout interval.
    + */
    +guint purple_conv_im_get_send_typed_timeout(const PurpleConvIm *im);
    +
    +/**
    + * Updates the visual typing notification for an IM conversation.
    + *
    + * @param im The IM.
    + */
    +void purple_conv_im_update_typing(PurpleConvIm *im);
    +
    +/**
    + * Writes to an IM.
    + *
    + * @param im The IM.
    + * @param who The user who sent the message.
    + * @param message The message to write.
    + * @param flags The message flags.
    + * @param mtime The time the message was sent.
    + */
    +void purple_conv_im_write(PurpleConvIm *im, const char *who,
    + const char *message, PurpleMessageFlags flags,
    + time_t mtime);
    +
    +/**
    + * Presents an IM-error to the user
    + *
    + * This is a helper function to find a conversation, write an error to it, and
    + * raise the window. If a conversation with this user doesn't already exist,
    + * the function will return FALSE and the calling function can attempt to present
    + * the error another way (purple_notify_error, most likely)
    + *
    + * @param who The user this error is about
    + * @param account The account this error is on
    + * @param what The error
    + * @return TRUE if the error was presented, else FALSE
    + */
    +gboolean purple_conv_present_error(const char *who, PurpleAccount *account, const char *what);
    +
    +/**
    + * Sends a message to this IM conversation.
    + *
    + * @param im The IM.
    + * @param message The message to send.
    + */
    +void purple_conv_im_send(PurpleConvIm *im, const char *message);
    +
    +/**
    + * Sends a message to a conversation after confirming with
    + * the user.
    + *
    + * This function is intended for use in cases where the user
    + * hasn't explicitly and knowingly caused a message to be sent.
    + * The confirmation ensures that the user isn't sending a
    + * message by mistake.
    + *
    + * @param conv The conversation.
    + * @param message The message to send.
    + */
    +void purple_conv_send_confirm(PurpleConversation *conv, const char *message);
    +
    +/**
    + * Sends a message to this IM conversation with specified flags.
    + *
    + * @param im The IM.
    + * @param message The message to send.
    + * @param flags The PurpleMessageFlags flags to use in addition to PURPLE_MESSAGE_SEND.
    + */
    +void purple_conv_im_send_with_flags(PurpleConvIm *im, const char *message, PurpleMessageFlags flags);
    +
    +/**
    + * Adds a smiley to the conversation's smiley tree. If this returns
    + * @c TRUE you should call purple_conv_custom_smiley_write() one or more
    + * times, and then purple_conv_custom_smiley_close(). If this returns
    + * @c FALSE, either the conv or smile were invalid, or the icon was
    + * found in the cache. In either case, calling write or close would
    + * be an error.
    + *
    + * @param conv The conversation to associate the smiley with.
    + * @param smile The text associated with the smiley
    + * @param cksum_type The type of checksum.
    + * @param chksum The checksum, as a NUL terminated base64 string.
    + * @param remote @c TRUE if the custom smiley is set by the remote user (buddy).
    + * @return @c TRUE if an icon is expected, else FALSE. Note that
    + * it is an error to never call purple_conv_custom_smiley_close if
    + * this function returns @c TRUE, but an error to call it if
    + * @c FALSE is returned.
    + */
    +
    +gboolean purple_conv_custom_smiley_add(PurpleConversation *conv, const char *smile,
    + const char *cksum_type, const char *chksum,
    + gboolean remote);
    +
    +
    +/**
    + * Updates the image associated with the current smiley.
    + *
    + * @param conv The conversation associated with the smiley.
    + * @param smile The text associated with the smiley.
    + * @param data The actual image data.
    + * @param size The length of the data.
    + */
    +
    +void purple_conv_custom_smiley_write(PurpleConversation *conv,
    + const char *smile,
    + const guchar *data,
    + gsize size);
    +
    +/**
    + * Close the custom smiley, all data has been written with
    + * purple_conv_custom_smiley_write, and it is no longer valid
    + * to call that function on that smiley.
    + *
    + * @param conv The purple conversation associated with the smiley.
    + * @param smile The text associated with the smiley
    + */
    +
    +void purple_conv_custom_smiley_close(PurpleConversation *conv, const char *smile);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Chat Conversation API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets a chat's parent conversation.
    + *
    + * @param chat The chat.
    + *
    + * @return The parent conversation.
    + */
    +PurpleConversation *purple_conv_chat_get_conversation(const PurpleConvChat *chat);
    +
    +/**
    + * Sets the list of users in the chat room.
    + *
    + * @note Calling this function will not update the display of the users.
    + * Please use purple_conv_chat_add_user(), purple_conv_chat_add_users(),
    + * purple_conv_chat_remove_user(), and purple_conv_chat_remove_users() instead.
    + *
    + * @param chat The chat.
    + * @param users The list of users.
    + *
    + * @return The list passed.
    + *
    + * @deprecated This function will be removed in 3.0.0. You shouldn't be using it anyway.
    + */
    +GList *purple_conv_chat_set_users(PurpleConvChat *chat, GList *users);
    +
    +/**
    + * Returns a list of users in the chat room. The members of the list
    + * are PurpleConvChatBuddy objects.
    + *
    + * @param chat The chat.
    + *
    + * @constreturn The list of users.
    + */
    +GList *purple_conv_chat_get_users(const PurpleConvChat *chat);
    +
    +/**
    + * Ignores a user in a chat room.
    + *
    + * @param chat The chat.
    + * @param name The name of the user.
    + */
    +void purple_conv_chat_ignore(PurpleConvChat *chat, const char *name);
    +
    +/**
    + * Unignores a user in a chat room.
    + *
    + * @param chat The chat.
    + * @param name The name of the user.
    + */
    +void purple_conv_chat_unignore(PurpleConvChat *chat, const char *name);
    +
    +/**
    + * Sets the list of ignored users in the chat room.
    + *
    + * @param chat The chat.
    + * @param ignored The list of ignored users.
    + *
    + * @return The list passed.
    + */
    +GList *purple_conv_chat_set_ignored(PurpleConvChat *chat, GList *ignored);
    +
    +/**
    + * Returns the list of ignored users in the chat room.
    + *
    + * @param chat The chat.
    + *
    + * @constreturn The list of ignored users.
    + */
    +GList *purple_conv_chat_get_ignored(const PurpleConvChat *chat);
    +
    +/**
    + * Returns the actual name of the specified ignored user, if it exists in
    + * the ignore list.
    + *
    + * If the user found contains a prefix, such as '+' or '\@', this is also
    + * returned. The username passed to the function does not have to have this
    + * formatting.
    + *
    + * @param chat The chat.
    + * @param user The user to check in the ignore list.
    + *
    + * @return The ignored user if found, complete with prefixes, or @c NULL
    + * if not found.
    + */
    +const char *purple_conv_chat_get_ignored_user(const PurpleConvChat *chat,
    + const char *user);
    +
    +/**
    + * Returns @c TRUE if the specified user is ignored.
    + *
    + * @param chat The chat.
    + * @param user The user.
    + *
    + * @return @c TRUE if the user is in the ignore list; @c FALSE otherwise.
    + */
    +gboolean purple_conv_chat_is_user_ignored(const PurpleConvChat *chat,
    + const char *user);
    +
    +/**
    + * Sets the chat room's topic.
    + *
    + * @param chat The chat.
    + * @param who The user that set the topic.
    + * @param topic The topic.
    + */
    +void purple_conv_chat_set_topic(PurpleConvChat *chat, const char *who,
    + const char *topic);
    +
    +/**
    + * Returns the chat room's topic.
    + *
    + * @param chat The chat.
    + *
    + * @return The chat's topic.
    + */
    +const char *purple_conv_chat_get_topic(const PurpleConvChat *chat);
    +
    +/**
    + * Sets the chat room's ID.
    + *
    + * @param chat The chat.
    + * @param id The ID.
    + */
    +void purple_conv_chat_set_id(PurpleConvChat *chat, int id);
    +
    +/**
    + * Returns the chat room's ID.
    + *
    + * @param chat The chat.
    + *
    + * @return The ID.
    + */
    +int purple_conv_chat_get_id(const PurpleConvChat *chat);
    +
    +/**
    + * Writes to a chat.
    + *
    + * @param chat The chat.
    + * @param who The user who sent the message.
    + * @param message The message to write.
    + * @param flags The flags.
    + * @param mtime The time the message was sent.
    + */
    +void purple_conv_chat_write(PurpleConvChat *chat, const char *who,
    + const char *message, PurpleMessageFlags flags,
    + time_t mtime);
    +
    +/**
    + * Sends a message to this chat conversation.
    + *
    + * @param chat The chat.
    + * @param message The message to send.
    + */
    +void purple_conv_chat_send(PurpleConvChat *chat, const char *message);
    +
    +/**
    + * Sends a message to this chat conversation with specified flags.
    + *
    + * @param chat The chat.
    + * @param message The message to send.
    + * @param flags The PurpleMessageFlags flags to use.
    + */
    +void purple_conv_chat_send_with_flags(PurpleConvChat *chat, const char *message, PurpleMessageFlags flags);
    +
    +/**
    + * Adds a user to a chat.
    + *
    + * @param chat The chat.
    + * @param user The user to add.
    + * @param extra_msg An extra message to display with the join message.
    + * @param flags The users flags
    + * @param new_arrival Decides whether or not to show a join notice.
    + */
    +void purple_conv_chat_add_user(PurpleConvChat *chat, const char *user,
    + const char *extra_msg, PurpleConvChatBuddyFlags flags,
    + gboolean new_arrival);
    +
    +/**
    + * Adds a list of users to a chat.
    + *
    + * The data is copied from @a users, @a extra_msgs, and @a flags, so it is up to
    + * the caller to free this list after calling this function.
    + *
    + * @param chat The chat.
    + * @param users The list of users to add.
    + * @param extra_msgs An extra message to display with the join message for each
    + * user. This list may be shorter than @a users, in which
    + * case, the users after the end of extra_msgs will not have
    + * an extra message. By extension, this means that extra_msgs
    + * can simply be @c NULL and none of the users will have an
    + * extra message.
    + * @param flags The list of flags for each user.
    + * @param new_arrivals Decides whether or not to show join notices.
    + */
    +void purple_conv_chat_add_users(PurpleConvChat *chat, GList *users, GList *extra_msgs,
    + GList *flags, gboolean new_arrivals);
    +
    +/**
    + * Renames a user in a chat.
    + *
    + * @param chat The chat.
    + * @param old_user The old username.
    + * @param new_user The new username.
    + */
    +void purple_conv_chat_rename_user(PurpleConvChat *chat, const char *old_user,
    + const char *new_user);
    +
    +/**
    + * Removes a user from a chat, optionally with a reason.
    + *
    + * It is up to the developer to free this list after calling this function.
    + *
    + * @param chat The chat.
    + * @param user The user that is being removed.
    + * @param reason The optional reason given for the removal. Can be @c NULL.
    + */
    +void purple_conv_chat_remove_user(PurpleConvChat *chat, const char *user,
    + const char *reason);
    +
    +/**
    + * Removes a list of users from a chat, optionally with a single reason.
    + *
    + * @param chat The chat.
    + * @param users The users that are being removed.
    + * @param reason The optional reason given for the removal. Can be @c NULL.
    + */
    +void purple_conv_chat_remove_users(PurpleConvChat *chat, GList *users,
    + const char *reason);
    +
    +/**
    + * Finds a user in a chat
    + *
    + * @param chat The chat.
    + * @param user The user to look for.
    + *
    + * @return TRUE if the user is in the chat, FALSE if not
    + */
    +gboolean purple_conv_chat_find_user(PurpleConvChat *chat, const char *user);
    +
    +/**
    + * Set a users flags in a chat
    + *
    + * @param chat The chat.
    + * @param user The user to update.
    + * @param flags The new flags.
    + */
    +void purple_conv_chat_user_set_flags(PurpleConvChat *chat, const char *user,
    + PurpleConvChatBuddyFlags flags);
    +
    +/**
    + * Get the flags for a user in a chat
    + *
    + * @param chat The chat.
    + * @param user The user to find the flags for
    + *
    + * @return The flags for the user
    + */
    +PurpleConvChatBuddyFlags purple_conv_chat_user_get_flags(PurpleConvChat *chat,
    + const char *user);
    +
    +/**
    + * Clears all users from a chat.
    + *
    + * @param chat The chat.
    + */
    +void purple_conv_chat_clear_users(PurpleConvChat *chat);
    +
    +/**
    + * Sets your nickname (used for hilighting) for a chat.
    + *
    + * @param chat The chat.
    + * @param nick The nick.
    + */
    +void purple_conv_chat_set_nick(PurpleConvChat *chat, const char *nick);
    +
    +/**
    + * Gets your nickname (used for hilighting) for a chat.
    + *
    + * @param chat The chat.
    + * @return The nick.
    + */
    +const char *purple_conv_chat_get_nick(PurpleConvChat *chat);
    +
    +/**
    + * Finds a chat with the specified chat ID.
    + *
    + * @param gc The purple_connection.
    + * @param id The chat ID.
    + *
    + * @return The chat conversation.
    + */
    +PurpleConversation *purple_find_chat(const PurpleConnection *gc, int id);
    +
    +/**
    + * Lets the core know we left a chat, without destroying it.
    + * Called from serv_got_chat_left().
    + *
    + * @param chat The chat.
    + */
    +void purple_conv_chat_left(PurpleConvChat *chat);
    +
    +/**
    + * Invite a user to a chat.
    + * The user will be prompted to enter the user's name or a message if one is
    + * not given.
    + *
    + * @param chat The chat.
    + * @param user The user to invite to the chat.
    + * @param message The message to send with the invitation.
    + * @param confirm Prompt before sending the invitation. The user is always
    + * prompted if either \a user or \a message is @c NULL.
    + *
    + * @since 2.6.0
    + */
    +void purple_conv_chat_invite_user(PurpleConvChat *chat, const char *user,
    + const char *message, gboolean confirm);
    +
    +/**
    + * Returns true if we're no longer in this chat,
    + * and just left the window open.
    + *
    + * @param chat The chat.
    + *
    + * @return @c TRUE if we left the chat already, @c FALSE if
    + * we're still there.
    + */
    +gboolean purple_conv_chat_has_left(PurpleConvChat *chat);
    +
    +/**
    + * Creates a new chat buddy
    + *
    + * @param name The name.
    + * @param alias The alias.
    + * @param flags The flags.
    + *
    + * @return The new chat buddy
    + */
    +PurpleConvChatBuddy *purple_conv_chat_cb_new(const char *name, const char *alias,
    + PurpleConvChatBuddyFlags flags);
    +
    +/**
    + * Find a chat buddy in a chat
    + *
    + * @param chat The chat.
    + * @param name The name of the chat buddy to find.
    + */
    +PurpleConvChatBuddy *purple_conv_chat_cb_find(PurpleConvChat *chat, const char *name);
    +
    +/**
    + * Get the name of a chat buddy
    + *
    + * @param cb The chat buddy.
    + *
    + * @return The name of the chat buddy.
    + */
    +const char *purple_conv_chat_cb_get_name(PurpleConvChatBuddy *cb);
    +
    +/**
    + * Destroys a chat buddy
    + *
    + * @param cb The chat buddy to destroy
    + */
    +void purple_conv_chat_cb_destroy(PurpleConvChatBuddy *cb);
    +
    +/**
    + * Retrieves the extended menu items for the conversation.
    + *
    + * @param conv The conversation.
    + *
    + * @return A list of PurpleMenuAction items, harvested by the
    + * chat-extended-menu signal. The list and the menuaction
    + * items should be freed by the caller.
    + *
    + * @since 2.1.0
    + */
    +GList * purple_conversation_get_extended_menu(PurpleConversation *conv);
    +
    +/**
    + * Perform a command in a conversation. Similar to @see purple_cmd_do_command
    + *
    + * @param conv The conversation.
    + * @param cmdline The entire command including the arguments.
    + * @param markup @c NULL, or the formatted command line.
    + * @param error If the command failed errormsg is filled in with the appropriate error
    + * message, if not @c NULL. It must be freed by the caller with g_free().
    + *
    + * @return @c TRUE if the command was executed successfully, @c FALSE otherwise.
    + *
    + * @since 2.1.0
    + */
    +gboolean purple_conversation_do_command(PurpleConversation *conv, const gchar *cmdline, const gchar *markup, gchar **error);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Conversations Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the conversation subsystem handle.
    + *
    + * @return The conversation subsystem handle.
    + */
    +void *purple_conversations_get_handle(void);
    +
    +/**
    + * Initializes the conversation subsystem.
    + */
    +void purple_conversations_init(void);
    +
    +/**
    + * Uninitializes the conversation subsystem.
    + */
    +void purple_conversations_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_CONVERSATION_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/core.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,251 @@
    +/**
    + * @file core.h Startup and shutdown of libpurple
    + * @defgroup core libpurple
    + * @see @ref core-signals
    + */
    +
    +/* 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
    + */
    +
    +/*! @mainpage Pidgin/Finch/libpurple API Documentation
    + *
    + * <a href="group__core.html">libpurple</a> is intended to be the core of an IM
    + * program. <a href="group__pidgin.html">Pidgin</a> is a GTK+ frontend
    + * to libpurple, and <a href="group__finch.html">Finch</a> is an ncurses
    + * frontend built using <a href="group__gnt.html">libgnt</a>
    + * (GLib Ncurses Toolkit).
    + */
    +
    +#ifndef _PURPLE_CORE_H_
    +#define _PURPLE_CORE_H_
    +
    +typedef struct PurpleCore PurpleCore;
    +
    +/** Callbacks that fire at different points of the initialization and teardown
    + * of libpurple, along with a hook to return descriptive information about the
    + * UI.
    + */
    +typedef struct
    +{
    + /** Called just after the preferences subsystem is initialized; the UI
    + * could use this callback to add some preferences it needs to be in
    + * place when other subsystems are initialized.
    + */
    + void (*ui_prefs_init)(void);
    + /** Called just after the debug subsystem is initialized, but before
    + * just about every other component's initialization. The UI should
    + * use this hook to call purple_debug_set_ui_ops() so that debugging
    + * information for other components can be logged during their
    + * initialization.
    + */
    + void (*debug_ui_init)(void);
    + /** Called after all of libpurple has been initialized. The UI should
    + * use this hook to set all other necessary UiOps structures.
    + *
    + * @see @ref ui-ops
    + */
    + void (*ui_init)(void);
    + /** Called after most of libpurple has been uninitialized. */
    + void (*quit)(void);
    +
    + /** Called by purple_core_get_ui_info(); should return the information
    + * documented there.
    + */
    + GHashTable* (*get_ui_info)(void);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    +} PurpleCoreUiOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Initializes the core of purple.
    + *
    + * This will setup preferences for all the core subsystems.
    + *
    + * @param ui The ID of the UI using the core. This should be a
    + * unique ID, registered with the purple team.
    + *
    + * @return @c TRUE if successful, or @c FALSE otherwise.
    + */
    +gboolean purple_core_init(const char *ui);
    +
    +/**
    + * Quits the core of purple, which, depending on the UI, may quit the
    + * application using the purple core.
    + */
    +void purple_core_quit(void);
    +
    +/**
    + * <p>
    + * Calls purple_core_quit(). This can be used as the function
    + * passed to purple_timeout_add() when you want to shutdown Purple
    + * in a specified amount of time. When shutting down Purple
    + * from a plugin, you must use this instead of purple_core_quit();
    + * for an immediate exit, use a timeout value of 0:
    + * </p>
    + *
    + * <code>purple_timeout_add(0, purple_core_quitcb, NULL);</code>
    + *
    + * <p>
    + * This is ensures that code from your plugin is not being
    + * executed when purple_core_quit() is called. If the plugin
    + * called purple_core_quit() directly, you would get a core dump
    + * after purple_core_quit() executes and control returns to your
    + * plugin because purple_core_quit() frees all plugins.
    + * </p>
    + */
    +gboolean purple_core_quit_cb(gpointer unused);
    +
    +/**
    + * Returns the version of the core library.
    + *
    + * @return The version of the core library.
    + */
    +const char *purple_core_get_version(void);
    +
    +/**
    + * Returns the ID of the UI that is using the core, as passed to
    + * purple_core_init().
    + *
    + * @return The ID of the UI that is currently using the core.
    + */
    +const char *purple_core_get_ui(void);
    +
    +/**
    + * Returns a handle to the purple core.
    + *
    + * This is used to connect to @ref core-signals "core signals".
    + */
    +PurpleCore *purple_get_core(void);
    +
    +/**
    + * Sets the UI ops for the core.
    + *
    + * @param ops A UI ops structure for the core.
    + */
    +void purple_core_set_ui_ops(PurpleCoreUiOps *ops);
    +
    +/**
    + * Returns the UI ops for the core.
    + *
    + * @return The core's UI ops structure.
    + */
    +PurpleCoreUiOps *purple_core_get_ui_ops(void);
    +
    +/**
    + * Migrates from <tt>.gaim</tt> to <tt>.purple</tt>.
    + *
    + * UIs <strong>must not</strong> call this if they have been told to use a
    + * custom user directory.
    + *
    + * @return A boolean indicating success or migration failure. On failure,
    + * the application must display an error to the user and then exit.
    + */
    +gboolean purple_core_migrate(void);
    +
    +/**
    + * Ensures that only one instance is running. If libpurple is built with D-Bus
    + * support, this checks if another process owns the libpurple bus name and if
    + * so whether that process is using the same configuration directory as this
    + * process.
    + *
    + * @return @c TRUE if this is the first instance of libpurple running;
    + * @c FALSE if there is another instance running.
    + *
    + * @since 2.1.0
    + */
    +gboolean purple_core_ensure_single_instance(void);
    +
    +/**
    + * Returns a hash table containing various information about the UI. The
    + * following well-known entries may be in the table (along with any others the
    + * UI might choose to include):
    + *
    + * <dl>
    + * <dt><tt>name</tt></dt>
    + * <dd>the user-readable name for the UI.</dd>
    + *
    + * <dt><tt>version</tt></dt>
    + * <dd>a user-readable description of the current version of the UI.</dd>
    + *
    + * <dt><tt>website</tt></dt>
    + * <dd>the UI's website, such as http://pidgin.im.</dd>
    + *
    + * <dt><tt>dev_website</tt></dt>
    + * <dd>the UI's development/support website, such as http://developer.pidgin.im.</dd>
    + *
    + * <dt><tt>client_type</tt></dt>
    + * <dd>the type of UI. Possible values include 'pc', 'console', 'phone',
    + * 'handheld', 'web', and 'bot'. These values are compared
    + * programmatically and should not be localized.</dd>
    + *
    + * </dl>
    + *
    + * @return A GHashTable with strings for keys and values. This
    + * hash table must not be freed and should not be modified.
    + *
    + * @since 2.1.0
    + *
    + */
    +GHashTable* purple_core_get_ui_info(void);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_CORE_H_ */
    +
    +/*
    +
    + /===-
    + `//"\\ """"`---.___.-""
    + ______-==| | | \\ _-"`
    + __--""" ,-/-==\\ | | `\ ,'
    + _-" /' | \\ ___ / / \ /
    + .' / | \\ /" "\ /' / \ /'
    + / ____ / | \`\.__/-"" D O \_/' / \/'
    +/-'" """""---__ | "-/" O G R /' _--"`
    + \_| / R __--_ t ), __--""
    + '""--_/ T _-"_>--<_\ h '-" \
    + {\__--_/} / \\__>--<__\ e B \
    + /' (_/ _-" | |__>--<__| U |
    + | _/) )-" | |__>--<__| R |
    + / /" ,_/ / /__>---<__/ N |
    + o-o _// /-"_>---<__-" I /
    + (^(" /"_>---<__- N _-"
    + ,/| /__>--<__/ A _-"
    + ,//('( |__>--<__| T / .----_
    + ( ( ')) |__>--<__| | /' _---_"\
    + `-)) )) ( |__>--<__| O | /' / "\`\
    + ,/,'//( ( \__>--<__\ R \ /' // ||
    + ,( ( ((, )) "-__>--<_"-_ "--____---"' _/'/ /'
    + `"/ )` ) ,/| "-_">--<_/-__ __-" _/
    + ._-"//( )/ )) ` ""-'_/_/ /"""""""__--"
    + ;'( ')/ ,)( """"""""""
    + ' ') '( (/
    + ' ' `
    +
    +*/
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dbus-maybe.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,35 @@
    +/* This file contains macros that wrap calls to the purple dbus module.
    + These macros call the appropriate functions if the build includes
    + dbus support and do nothing otherwise. See "dbus-server.h" for
    + documentation. */
    +
    +#ifndef _PURPLE_DBUS_MAYBE_H_
    +#define _PURPLE_DBUS_MAYBE_H_
    +
    +#ifdef HAVE_DBUS
    +
    +#ifndef DBUS_API_SUBJECT_TO_CHANGE
    +#define DBUS_API_SUBJECT_TO_CHANGE
    +#endif
    +
    +#include "dbus-server.h"
    +
    +/* this provides a type check */
    +#define PURPLE_DBUS_REGISTER_POINTER(ptr, type) { \
    + type *typed_ptr = ptr; \
    + purple_dbus_register_pointer(typed_ptr, PURPLE_DBUS_TYPE(type)); \
    +}
    +#define PURPLE_DBUS_UNREGISTER_POINTER(ptr) purple_dbus_unregister_pointer(ptr)
    +
    +#else /* !HAVE_DBUS */
    +
    +#define PURPLE_DBUS_REGISTER_POINTER(ptr, type) { \
    + if (ptr) {} \
    +}
    +
    +#define PURPLE_DBUS_UNREGISTER_POINTER(ptr)
    +#define DBUS_EXPORT
    +
    +#endif /* HAVE_DBUS */
    +
    +#endif
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/debug.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,243 @@
    +/**
    + * @file debug.h Debug 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
    + */
    +#ifndef _PURPLE_DEBUG_H_
    +#define _PURPLE_DEBUG_H_
    +
    +#include <glib.h>
    +#include <stdarg.h>
    +
    +/**
    + * Debug levels.
    + */
    +typedef enum
    +{
    + PURPLE_DEBUG_ALL = 0, /**< All debug levels. */
    + PURPLE_DEBUG_MISC, /**< General chatter. */
    + PURPLE_DEBUG_INFO, /**< General operation Information. */
    + PURPLE_DEBUG_WARNING, /**< Warnings. */
    + PURPLE_DEBUG_ERROR, /**< Errors. */
    + PURPLE_DEBUG_FATAL /**< Fatal errors. */
    +
    +} PurpleDebugLevel;
    +
    +/**
    + * Debug UI operations.
    + */
    +typedef struct
    +{
    + void (*print)(PurpleDebugLevel level, const char *category,
    + const char *arg_s);
    + gboolean (*is_enabled)(PurpleDebugLevel level,
    + const char *category);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleDebugUiOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Debug API */
    +/**************************************************************************/
    +/**
    + * Outputs debug information.
    + *
    + * @param level The debug level.
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + */
    +void purple_debug(PurpleDebugLevel level, const char *category,
    + const char *format, ...) G_GNUC_PRINTF(3, 4);
    +
    +/**
    + * Outputs misc. level debug information.
    + *
    + * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_MISC as
    + * the level.
    + *
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + *
    + * @see purple_debug()
    + */
    +void purple_debug_misc(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    +
    +/**
    + * Outputs info level debug information.
    + *
    + * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_INFO as
    + * the level.
    + *
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + *
    + * @see purple_debug()
    + */
    +void purple_debug_info(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    +
    +/**
    + * Outputs warning level debug information.
    + *
    + * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_WARNING as
    + * the level.
    + *
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + *
    + * @see purple_debug()
    + */
    +void purple_debug_warning(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    +
    +/**
    + * Outputs error level debug information.
    + *
    + * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_ERROR as
    + * the level.
    + *
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + *
    + * @see purple_debug()
    + */
    +void purple_debug_error(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    +
    +/**
    + * Outputs fatal error level debug information.
    + *
    + * This is a wrapper for purple_debug(), and uses PURPLE_DEBUG_ERROR as
    + * the level.
    + *
    + * @param category The category (or @c NULL).
    + * @param format The format string.
    + *
    + * @see purple_debug()
    + */
    +void purple_debug_fatal(const char *category, const char *format, ...) G_GNUC_PRINTF(2, 3);
    +
    +/**
    + * Enable or disable printing debug output to the console.
    + *
    + * @param enabled TRUE to enable debug output or FALSE to disable it.
    + */
    +void purple_debug_set_enabled(gboolean enabled);
    +
    +/**
    + * Check if console debug output is enabled.
    + *
    + * @return TRUE if debugging is enabled, FALSE if it is not.
    + */
    +gboolean purple_debug_is_enabled(void);
    +
    +/**
    + * Enable or disable verbose debugging. This ordinarily should only be called
    + * by #purple_debug_init, but there are cases where this can be useful for
    + * plugins.
    + *
    + * @param verbose TRUE to enable verbose debugging or FALSE to disable it.
    + *
    + * @since 2.6.0
    + */
    +void purple_debug_set_verbose(gboolean verbose);
    +
    +/**
    + * Check if verbose logging is enabled.
    + *
    + * @return TRUE if verbose debugging is enabled, FALSE if it is not.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_debug_is_verbose(void);
    +
    +/**
    + * Enable or disable unsafe debugging. This ordinarily should only be called
    + * by #purple_debug_init, but there are cases where this can be useful for
    + * plugins.
    + *
    + * @param unsafe TRUE to enable debug logging of messages that could
    + * potentially contain passwords and other sensitive information.
    + * FALSE to disable it.
    + *
    + * @since 2.6.0
    + */
    +void purple_debug_set_unsafe(gboolean unsafe);
    +
    +/**
    + * Check if unsafe debugging is enabled. Defaults to FALSE.
    + *
    + * @return TRUE if the debug logging of all messages is enabled, FALSE
    + * if messages that could potentially contain passwords and other
    + * sensitive information are not logged.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_debug_is_unsafe(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used when outputting debug
    + * information.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_debug_set_ui_ops(PurpleDebugUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used when outputting debug
    + * information.
    + *
    + * @return The UI operations structure in use.
    + */
    +PurpleDebugUiOps *purple_debug_get_ui_ops(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Debug Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Initializes the debug subsystem.
    + */
    +void purple_debug_init(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_DEBUG_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/desktopitem.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,172 @@
    +/**
    + * @file desktopitem.h Functions for managing .desktop files
    + * @ingroup core
    + */
    +
    +/* 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
    + *
    + */
    +
    +/*
    + * The following code has been adapted from gnome-desktop-item.[ch],
    + * as found on gnome-desktop-2.8.1.
    + *
    + * Copyright (C) 2004 by Alceste Scalas <alceste.scalas@gmx.net>.
    + *
    + * Original copyright notice:
    + *
    + * Copyright (C) 1999, 2000 Red Hat Inc.
    + * Copyright (C) 2001 Sid Vicious
    + * All rights reserved.
    + *
    + * This file is part of the Gnome Library.
    + *
    + * The Gnome Library is free software; you can redistribute it and/or
    + * modify it under the terms of the GNU Library General Public License as
    + * published by the Free Software Foundation; either version 2 of the
    + * License, or (at your option) any later version.
    + *
    + * The Gnome Library 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
    + * Library General Public License for more details.
    + *
    + * You should have received a copy of the GNU Library General Public
    + * License along with the Gnome Library; see the file COPYING.LIB. If not,
    + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    + * Boston, MA 02111-1301, USA.
    + */
    +
    +#ifndef _PURPLE_DESKTOP_ITEM_H_
    +#define _PURPLE_DESKTOP_ITEM_H_
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +typedef enum {
    + PURPLE_DESKTOP_ITEM_TYPE_NULL = 0 /* This means its NULL, that is, not
    + * set */,
    + PURPLE_DESKTOP_ITEM_TYPE_OTHER /* This means it's not one of the below
    + strings types, and you must get the
    + Type attribute. */,
    +
    + /* These are the standard compliant types: */
    + PURPLE_DESKTOP_ITEM_TYPE_APPLICATION,
    + PURPLE_DESKTOP_ITEM_TYPE_LINK,
    + PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE,
    + PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE,
    + PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY,
    + PURPLE_DESKTOP_ITEM_TYPE_SERVICE,
    + PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
    +} PurpleDesktopItemType;
    +
    +typedef struct _PurpleDesktopItem PurpleDesktopItem;
    +
    +#define PURPLE_TYPE_DESKTOP_ITEM (purple_desktop_item_get_type ())
    +GType purple_desktop_item_get_type (void);
    +
    +/* standard */
    +#define PURPLE_DESKTOP_ITEM_ENCODING "Encoding" /* string */
    +#define PURPLE_DESKTOP_ITEM_VERSION "Version" /* numeric */
    +#define PURPLE_DESKTOP_ITEM_NAME "Name" /* localestring */
    +#define PURPLE_DESKTOP_ITEM_GENERIC_NAME "GenericName" /* localestring */
    +#define PURPLE_DESKTOP_ITEM_TYPE "Type" /* string */
    +#define PURPLE_DESKTOP_ITEM_FILE_PATTERN "FilePattern" /* regexp(s) */
    +#define PURPLE_DESKTOP_ITEM_TRY_EXEC "TryExec" /* string */
    +#define PURPLE_DESKTOP_ITEM_NO_DISPLAY "NoDisplay" /* boolean */
    +#define PURPLE_DESKTOP_ITEM_COMMENT "Comment" /* localestring */
    +#define PURPLE_DESKTOP_ITEM_EXEC "Exec" /* string */
    +#define PURPLE_DESKTOP_ITEM_ACTIONS "Actions" /* strings */
    +#define PURPLE_DESKTOP_ITEM_ICON "Icon" /* string */
    +#define PURPLE_DESKTOP_ITEM_MINI_ICON "MiniIcon" /* string */
    +#define PURPLE_DESKTOP_ITEM_HIDDEN "Hidden" /* boolean */
    +#define PURPLE_DESKTOP_ITEM_PATH "Path" /* string */
    +#define PURPLE_DESKTOP_ITEM_TERMINAL "Terminal" /* boolean */
    +#define PURPLE_DESKTOP_ITEM_TERMINAL_OPTIONS "TerminalOptions" /* string */
    +#define PURPLE_DESKTOP_ITEM_SWALLOW_TITLE "SwallowTitle" /* string */
    +#define PURPLE_DESKTOP_ITEM_SWALLOW_EXEC "SwallowExec" /* string */
    +#define PURPLE_DESKTOP_ITEM_MIME_TYPE "MimeType" /* regexp(s) */
    +#define PURPLE_DESKTOP_ITEM_PATTERNS "Patterns" /* regexp(s) */
    +#define PURPLE_DESKTOP_ITEM_DEFAULT_APP "DefaultApp" /* string */
    +#define PURPLE_DESKTOP_ITEM_DEV "Dev" /* string */
    +#define PURPLE_DESKTOP_ITEM_FS_TYPE "FSType" /* string */
    +#define PURPLE_DESKTOP_ITEM_MOUNT_POINT "MountPoint" /* string */
    +#define PURPLE_DESKTOP_ITEM_READ_ONLY "ReadOnly" /* boolean */
    +#define PURPLE_DESKTOP_ITEM_UNMOUNT_ICON "UnmountIcon" /* string */
    +#define PURPLE_DESKTOP_ITEM_SORT_ORDER "SortOrder" /* strings */
    +#define PURPLE_DESKTOP_ITEM_URL "URL" /* string */
    +#define PURPLE_DESKTOP_ITEM_DOC_PATH "X-GNOME-DocPath" /* string */
    +
    +/**
    + * This function loads 'filename' and turns it into a PurpleDesktopItem.
    + *
    + * @param filename The filename or directory path to load the PurpleDesktopItem from
    + *
    + * @return The newly loaded item, or NULL on error.
    + */
    +PurpleDesktopItem *purple_desktop_item_new_from_file (const char *filename);
    +
    +/**
    + * Gets the type attribute (the 'Type' field) of the item. This should
    + * usually be 'Application' for an application, but it can be 'Directory'
    + * for a directory description. There are other types available as well.
    + * The type usually indicates how the desktop item should be handeled and
    + * how the 'Exec' field should be handeled.
    + *
    + * @param item A desktop item
    + *
    + * @return The type of the specified 'item'. The returned memory
    + * remains owned by the PurpleDesktopItem and should not be freed.
    + */
    +PurpleDesktopItemType purple_desktop_item_get_entry_type (const PurpleDesktopItem *item);
    +
    +/**
    + * Gets the value of an attribute of the item, as a string.
    + *
    + * @param item A desktop item
    + * @param attr The attribute to look for
    + *
    + * @return The value of the specified item attribute.
    + */
    +const char *purple_desktop_item_get_string (const PurpleDesktopItem *item,
    + const char *attr);
    +
    +/**
    + * Creates a copy of a PurpleDesktopItem. The new copy has a refcount of 1.
    + * Note: Section stack is NOT copied.
    + *
    + * @param item The item to be copied
    + *
    + * @return The new copy
    + */
    +PurpleDesktopItem *purple_desktop_item_copy (const PurpleDesktopItem *item);
    +
    +/**
    + * Decreases the reference count of the specified item, and destroys
    + * the item if there are no more references left.
    + *
    + * @param item A desktop item
    + */
    +void purple_desktop_item_unref (PurpleDesktopItem *item);
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_DESKTOP_ITEM_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dnsquery.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,180 @@
    +/**
    + * @file dnsquery.h DNS query 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
    + */
    +#ifndef _PURPLE_DNSQUERY_H_
    +#define _PURPLE_DNSQUERY_H_
    +
    +#include <glib.h>
    +#include "eventloop.h"
    +#include "account.h"
    +
    +/**
    + * An opaque structure representing a DNS query. The hostname and port
    + * associated with the query can be retrieved using
    + * purple_dnsquery_get_host() and purple_dnsquery_get_port().
    + */
    +typedef struct _PurpleDnsQueryData PurpleDnsQueryData;
    +
    +/**
    + * The "hosts" parameter is a linked list containing pairs of
    + * one size_t addrlen and one struct sockaddr *addr. It should
    + * be free'd by the callback function.
    + */
    +typedef void (*PurpleDnsQueryConnectFunction)(GSList *hosts, gpointer data, const char *error_message);
    +
    +/**
    + * Callbacks used by the UI if it handles resolving DNS
    + */
    +typedef void (*PurpleDnsQueryResolvedCallback) (PurpleDnsQueryData *query_data, GSList *hosts);
    +typedef void (*PurpleDnsQueryFailedCallback) (PurpleDnsQueryData *query_data, const gchar *error_message);
    +
    +/**
    + * DNS Request UI operations; UIs should implement this if they want to do DNS
    + * lookups themselves, rather than relying on the core.
    + *
    + * @see @ref ui-ops
    + */
    +typedef struct
    +{
    + /** If implemented, return TRUE if the UI takes responsibility for DNS
    + * queries. When returning FALSE, the standard implementation is used. */
    + gboolean (*resolve_host)(PurpleDnsQueryData *query_data,
    + PurpleDnsQueryResolvedCallback resolved_cb,
    + PurpleDnsQueryFailedCallback failed_cb);
    +
    + /** Called just before @a query_data is freed; this should cancel any
    + * further use of @a query_data the UI would make. Unneeded if
    + * #resolve_host is not implemented.
    + */
    + void (*destroy)(PurpleDnsQueryData *query_data);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleDnsQueryUiOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name DNS query API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Perform an asynchronous DNS query.
    + *
    + * @param account the account that the query is being done for (or NULL)
    + * @param hostname The hostname to resolve.
    + * @param port A port number which is stored in the struct sockaddr.
    + * @param callback The callback function to call after resolving.
    + * @param data Extra data to pass to the callback function.
    + *
    + * @return NULL if there was an error, otherwise return a reference to
    + * a data structure that can be used to cancel the pending
    + * DNS query, if needed.
    + *
    + * @since 2.8.0
    + */
    +PurpleDnsQueryData *purple_dnsquery_a_account(PurpleAccount *account, const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSQUERY_C_)
    +/**
    + * Perform an asynchronous DNS query.
    + *
    + * @param hostname The hostname to resolve.
    + * @param port A port number which is stored in the struct sockaddr.
    + * @param callback The callback function to call after resolving.
    + * @param data Extra data to pass to the callback function.
    + *
    + * @return NULL if there was an error, otherwise return a reference to
    + * a data structure that can be used to cancel the pending
    + * DNS query, if needed.
    + *
    + * @deprecated Use purple_dnsquery_a_account instead
    + */
    +PurpleDnsQueryData *purple_dnsquery_a(const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data);
    +#endif
    +
    +/**
    + * Cancel a DNS query and destroy the associated data structure.
    + *
    + * @param query_data The DNS query to cancel. This data structure
    + * is freed by this function.
    + */
    +void purple_dnsquery_destroy(PurpleDnsQueryData *query_data);
    +
    +/**
    + * Sets the UI operations structure to be used when doing a DNS
    + * resolve. The UI operations need only be set if the UI wants to
    + * handle the resolve itself; otherwise, leave it as NULL.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_dnsquery_set_ui_ops(PurpleDnsQueryUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used when doing a DNS
    + * resolve.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleDnsQueryUiOps *purple_dnsquery_get_ui_ops(void);
    +
    +/**
    + * Get the host associated with a PurpleDnsQueryData
    + *
    + * @param query_data The DNS query
    + * @return The host.
    + */
    +char *purple_dnsquery_get_host(PurpleDnsQueryData *query_data);
    +
    +/**
    + * Get the port associated with a PurpleDnsQueryData
    + *
    + * @param query_data The DNS query
    + * @return The port.
    + */
    +unsigned short purple_dnsquery_get_port(PurpleDnsQueryData *query_data);
    +
    +/**
    + * Initializes the DNS query subsystem.
    + */
    +void purple_dnsquery_init(void);
    +
    +/**
    + * Uninitializes the DNS query subsystem.
    + */
    +void purple_dnsquery_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_DNSQUERY_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/dnssrv.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,242 @@
    +/**
    + * @file dnssrv.h
    + */
    +
    +/* purple
    + *
    + * Copyright (C) 2005, Thomas Butter <butter@uni-mannheim.de>
    + *
    + * 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
    + */
    +
    +#ifndef _PURPLE_DNSSRV_H
    +#define _PURPLE_DNSSRV_H
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +typedef struct _PurpleSrvTxtQueryData PurpleSrvTxtQueryData;
    +typedef struct _PurpleSrvResponse PurpleSrvResponse;
    +typedef struct _PurpleTxtResponse PurpleTxtResponse;
    +
    +/* For compatibility, should be removed for 3.0.0
    + */
    +typedef struct _PurpleSrvTxtQueryData PurpleSrvQueryData;
    +
    +#include <glib.h>
    +
    +enum PurpleDnsType {
    + PurpleDnsTypeTxt = 16,
    + PurpleDnsTypeSrv = 33
    +};
    +
    +struct _PurpleSrvResponse {
    + char hostname[256];
    + int port;
    + int weight;
    + int pref;
    +};
    +
    +struct _PurpleTxtResponse {
    + char *content;
    +};
    +
    +typedef void (*PurpleSrvTxtQueryResolvedCallback) (PurpleSrvTxtQueryData *query_data, GList *records);
    +typedef void (*PurpleSrvTxtQueryFailedCallback) (PurpleSrvTxtQueryData *query_data, const gchar *error_message);
    +
    +/**
    + * SRV Request UI operations; UIs should implement this if they want to do SRV
    + * lookups themselves, rather than relying on the core.
    + *
    + * @see @ref ui-ops
    + */
    +typedef struct
    +{
    + /** If implemented, return TRUE if the UI takes responsibility for SRV
    + * queries. When returning FALSE, the standard implementation is used.
    + * These callbacks MUST be called asynchronously. */
    + gboolean (*resolve)(PurpleSrvTxtQueryData *query_data,
    + PurpleSrvTxtQueryResolvedCallback resolved_cb,
    + PurpleSrvTxtQueryFailedCallback failed_cb);
    +
    + /** Called just before @a query_data is freed; this should cancel any
    + * further use of @a query_data the UI would make. Unneeded if
    + * #resolve_host is not implemented.
    + */
    + void (*destroy)(PurpleSrvTxtQueryData *query_data);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleSrvTxtQueryUiOps;
    +
    +/**
    + * @param resp An array of PurpleSrvResponse of size results. The array
    + * is sorted based on the order described in the DNS SRV RFC.
    + * Users of this API should try each record in resp in order,
    + * starting at the beginning.
    + */
    +typedef void (*PurpleSrvCallback)(PurpleSrvResponse *resp, int results, gpointer data);
    +
    +/**
    + * Callback that returns the data retrieved from a DNS TXT lookup.
    + *
    + * @param responses A GList of PurpleTxtResponse objects.
    + * @param data The extra data passed to purple_txt_resolve.
    + */
    +typedef void (*PurpleTxtCallback)(GList *responses, gpointer data);
    +
    +/**
    + * Queries an SRV record.
    + *
    + * @param account the account that the query is being done for (or NULL)
    + * @param protocol Name of the protocol (e.g. "sip")
    + * @param transport Name of the transport ("tcp" or "udp")
    + * @param domain Domain name to query (e.g. "blubb.com")
    + * @param cb A callback which will be called with the results
    + * @param extradata Extra data to be passed to the callback
    + *
    + * @since 2.8.0
    + */
    +PurpleSrvTxtQueryData *purple_srv_resolve_account(PurpleAccount *account, const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
    +/**
    + * Queries an SRV record.
    + *
    + * @param protocol Name of the protocol (e.g. "sip")
    + * @param transport Name of the transport ("tcp" or "udp")
    + * @param domain Domain name to query (e.g. "blubb.com")
    + * @param cb A callback which will be called with the results
    + * @param extradata Extra data to be passed to the callback
    + *
    + * @deprecated Use purple_srv_resolve_account instead
    + */
    +PurpleSrvTxtQueryData *purple_srv_resolve(const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata);
    +#endif
    +
    +/**
    + * Cancel an SRV or DNS query.
    + *
    + * @param query_data The request to cancel.
    + *
    + * @deprecated Use purple_srv_txt_query_destroy instead
    + */
    +void purple_srv_cancel(PurpleSrvTxtQueryData *query_data);
    +
    +/**
    + * Queries an TXT record.
    + *
    + * @param account the account that the query is being done for (or NULL)
    + * @param owner Name of the protocol (e.g. "_xmppconnect")
    + * @param domain Domain name to query (e.g. "blubb.com")
    + * @param cb A callback which will be called with the results
    + * @param extradata Extra data to be passed to the callback
    + *
    + * @since 2.8.0
    + */
    +PurpleSrvTxtQueryData *purple_txt_resolve_account(PurpleAccount *account, const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_)
    +/**
    + * Queries an TXT record.
    + *
    + * @param owner Name of the protocol (e.g. "_xmppconnect")
    + * @param domain Domain name to query (e.g. "blubb.com")
    + * @param cb A callback which will be called with the results
    + * @param extradata Extra data to be passed to the callback
    + *
    + * @deprecated Use purple_txt_resolve_account instead
    + *
    + * @since 2.6.0
    + */
    +PurpleSrvTxtQueryData *purple_txt_resolve(const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata);
    +#endif
    +
    +/**
    + * Cancel an TXT DNS query.
    + *
    + * @param query_data The request to cancel.
    + * @since 2.6.0
    + *
    + * @deprecated Use purple_srv_txt_query_destroy instead
    + */
    +void purple_txt_cancel(PurpleSrvTxtQueryData *query_data);
    +
    +/**
    + * Get the value of the current TXT record.
    + *
    + * @param response The TXT response record
    + * @returns The value of the current TXT record.
    + * @since 2.6.0
    + */
    +const gchar *purple_txt_response_get_content(PurpleTxtResponse *response);
    +
    +/**
    + * Destroy a TXT DNS response object.
    + *
    + * @param response The PurpleTxtResponse to destroy.
    + * @since 2.6.0
    + */
    +void purple_txt_response_destroy(PurpleTxtResponse *response);
    +
    +/**
    + * Cancel a SRV/TXT query and destroy the associated data structure.
    + *
    + * @param query_data The SRV/TXT query to cancel. This data structure
    + * is freed by this function.
    + */
    +void purple_srv_txt_query_destroy(PurpleSrvTxtQueryData *query_data);
    +
    +/**
    + * Sets the UI operations structure to be used when doing a SRV/TXT
    + * resolve. The UI operations need only be set if the UI wants to
    + * handle the resolve itself; otherwise, leave it as NULL.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_srv_txt_query_set_ui_ops(PurpleSrvTxtQueryUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used when doing a SRV/TXT
    + * resolve.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleSrvTxtQueryUiOps *purple_srv_txt_query_get_ui_ops(void);
    +
    +/**
    + * Get the query from a PurpleDnsQueryData
    + *
    + * @param query_data The SRV/TXT query
    + * @return The query.
    + */
    +char *purple_srv_txt_query_get_query(PurpleSrvTxtQueryData *query_data);
    +
    +/**
    + * Get the type from a PurpleDnsQueryData (TXT or SRV)
    + *
    + * @param query_data The query
    + * @return The query.
    + */
    +int purple_srv_txt_query_get_type(PurpleSrvTxtQueryData *query_data);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_DNSSRV_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/eventloop.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,276 @@
    +/**
    + * @file eventloop.h Purple Event Loop 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
    + */
    +#ifndef _PURPLE_EVENTLOOP_H_
    +#define _PURPLE_EVENTLOOP_H_
    +
    +#include <glib.h>
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * An input condition.
    + */
    +typedef enum
    +{
    + PURPLE_INPUT_READ = 1 << 0, /**< A read condition. */
    + PURPLE_INPUT_WRITE = 1 << 1 /**< A write condition. */
    +
    +} PurpleInputCondition;
    +
    +/** The type of callbacks to handle events on file descriptors, as passed to
    + * purple_input_add(). The callback will receive the @c user_data passed to
    + * purple_input_add(), the file descriptor on which the event occurred, and the
    + * condition that was satisfied to cause the callback to be invoked.
    + */
    +typedef void (*PurpleInputFunction)(gpointer, gint, PurpleInputCondition);
    +
    +/** @copydoc _PurpleEventLoopUiOps */
    +typedef struct _PurpleEventLoopUiOps PurpleEventLoopUiOps;
    +
    +/** An abstraction of an application's mainloop; libpurple will use this to
    + * watch file descriptors and schedule timed callbacks. If your application
    + * uses the glib mainloop, there is an implementation of this struct in
    + * <tt>libpurple/example/nullclient.c</tt> which you can use verbatim.
    + */
    +struct _PurpleEventLoopUiOps
    +{
    + /**
    + * Should create a callback timer with an interval measured in
    + * milliseconds. The supplied @a function should be called every @a
    + * interval seconds until it returns @c FALSE, after which it should not
    + * be called again.
    + *
    + * Analogous to g_timeout_add in glib.
    + *
    + * Note: On Win32, this function may be called from a thread other than
    + * the libpurple thread. You should make sure to detect this situation
    + * and to only call "function" from the libpurple thread.
    + *
    + * @param interval the interval in <em>milliseconds</em> between calls
    + * to @a function.
    + * @param data arbitrary data to be passed to @a function at each
    + * call.
    + * @todo Who is responsible for freeing @a data?
    + *
    + * @return a handle for the timeout, which can be passed to
    + * #timeout_remove.
    + *
    + * @see purple_timeout_add
    + **/
    + guint (*timeout_add)(guint interval, GSourceFunc function, gpointer data);
    +
    + /**
    + * Should remove a callback timer. Analogous to g_source_remove in glib.
    + * @param handle an identifier for a timeout, as returned by
    + * #timeout_add.
    + * @return @c TRUE if the timeout identified by @a handle was
    + * found and removed.
    + * @see purple_timeout_remove
    + */
    + gboolean (*timeout_remove)(guint handle);
    +
    + /**
    + * Should add an input handler. Analogous to g_io_add_watch_full in
    + * glib.
    + *
    + * @param fd a file descriptor to watch for events
    + * @param cond a bitwise OR of events on @a fd for which @a func
    + * should be called.
    + * @param func a callback to fire whenever a relevant event on @a
    + * fd occurs.
    + * @param user_data arbitrary data to pass to @a fd.
    + * @return an identifier for this input handler, which can be
    + * passed to #input_remove.
    + *
    + * @see purple_input_add
    + */
    + guint (*input_add)(int fd, PurpleInputCondition cond,
    + PurpleInputFunction func, gpointer user_data);
    +
    + /**
    + * Should remove an input handler. Analogous to g_source_remove in glib.
    + * @param handle an identifier, as returned by #input_add.
    + * @return @c TRUE if the input handler was found and removed.
    + * @see purple_input_remove
    + */
    + gboolean (*input_remove)(guint handle);
    +
    +
    + /**
    + * If implemented, should get the current error status for an input.
    + *
    + * Implementation of this UI op is optional. Implement it if the UI's
    + * sockets or event loop needs to customize determination of socket
    + * error status. If unimplemented, <tt>getsockopt(2)</tt> will be used
    + * instead.
    + *
    + * @see purple_input_get_error
    + */
    + int (*input_get_error)(int fd, int *error);
    +
    + /**
    + * If implemented, should create a callback timer with an interval
    + * measured in seconds. Analogous to g_timeout_add_seconds in glib.
    + *
    + * This allows UIs to group timers for better power efficiency. For
    + * this reason, @a interval may be rounded by up to a second.
    + *
    + * Implementation of this UI op is optional. If it's not implemented,
    + * calls to purple_timeout_add_seconds() will be serviced by
    + * #timeout_add.
    + *
    + * @see purple_timeout_add_seconds()
    + * @since 2.1.0
    + **/
    + guint (*timeout_add_seconds)(guint interval, GSourceFunc function,
    + gpointer data);
    +
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/**************************************************************************/
    +/** @name Event Loop API */
    +/**************************************************************************/
    +/*@{*/
    +/**
    + * Creates a callback timer.
    + *
    + * The timer will repeat until the function returns @c FALSE. The
    + * first call will be at the end of the first interval.
    + *
    + * If the timer is in a multiple of seconds, use purple_timeout_add_seconds()
    + * instead as it allows UIs to group timers for power efficiency.
    + *
    + * @param interval The time between calls of the function, in
    + * milliseconds.
    + * @param function The function to call.
    + * @param data data to pass to @a function.
    + * @return A handle to the timer which can be passed to
    + * purple_timeout_remove() to remove the timer.
    + */
    +guint purple_timeout_add(guint interval, GSourceFunc function, gpointer data);
    +
    +/**
    + * Creates a callback timer.
    + *
    + * The timer will repeat until the function returns @c FALSE. The
    + * first call will be at the end of the first interval.
    + *
    + * This function allows UIs to group timers for better power efficiency. For
    + * this reason, @a interval may be rounded by up to a second.
    + *
    + * @param interval The time between calls of the function, in
    + * seconds.
    + * @param function The function to call.
    + * @param data data to pass to @a function.
    + * @return A handle to the timer which can be passed to
    + * purple_timeout_remove() to remove the timer.
    + *
    + * @since 2.1.0
    + */
    +guint purple_timeout_add_seconds(guint interval, GSourceFunc function, gpointer data);
    +
    +/**
    + * Removes a timeout handler.
    + *
    + * @param handle The handle, as returned by purple_timeout_add().
    + *
    + * @return @c TRUE if the handler was successfully removed.
    + */
    +gboolean purple_timeout_remove(guint handle);
    +
    +/**
    + * Adds an input handler.
    + *
    + * @param fd The input file descriptor.
    + * @param cond The condition type.
    + * @param func The callback function for data.
    + * @param user_data User-specified data.
    + *
    + * @return The resulting handle (will be greater than 0).
    + * @see g_io_add_watch_full
    + */
    +guint purple_input_add(int fd, PurpleInputCondition cond,
    + PurpleInputFunction func, gpointer user_data);
    +
    +/**
    + * Removes an input handler.
    + *
    + * @param handle The handle of the input handler. Note that this is the return
    + * value from purple_input_add(), <i>not</i> the file descriptor.
    + */
    +gboolean purple_input_remove(guint handle);
    +
    +/**
    + * Get the current error status for an input.
    + *
    + * The return value and error follow getsockopt() with a level of SOL_SOCKET and an
    + * option name of SO_ERROR, and this is how the error is determined if the UI does not
    + * implement the input_get_error UI op.
    + *
    + * @param fd The input file descriptor.
    + * @param error A pointer to an @c int which on return will have the error, or
    + * @c 0 if no error.
    + *
    + * @return @c 0 if there is no error; @c -1 if there is an error, in which case
    + * @a errno will be set.
    + */
    +int
    +purple_input_get_error(int fd, int *error);
    +
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +/**
    + * Sets the UI operations structure to be used for accounts.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_eventloop_set_ui_ops(PurpleEventLoopUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for accounts.
    + *
    + * @return The UI operations structure in use.
    + */
    +PurpleEventLoopUiOps *purple_eventloop_get_ui_ops(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_EVENTLOOP_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/ft.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,814 @@
    +/**
    + * @file ft.h File Transfer API
    + * @ingroup core
    + * @see @ref xfer-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_FT_H_
    +#define _PURPLE_FT_H_
    +
    +/**************************************************************************/
    +/** Data Structures */
    +/**************************************************************************/
    +typedef struct _PurpleXfer PurpleXfer;
    +
    +#include <glib.h>
    +#include <stdio.h>
    +
    +#include "account.h"
    +
    +/**
    + * Types of file transfers.
    + */
    +typedef enum
    +{
    + PURPLE_XFER_UNKNOWN = 0, /**< Unknown file transfer type. */
    + PURPLE_XFER_SEND, /**< File sending. */
    + PURPLE_XFER_RECEIVE /**< File receiving. */
    +
    +} PurpleXferType;
    +
    +/**
    + * The different states of the xfer.
    + */
    +typedef enum
    +{
    + PURPLE_XFER_STATUS_UNKNOWN = 0, /**< Unknown, the xfer may be null. */
    + PURPLE_XFER_STATUS_NOT_STARTED, /**< It hasn't started yet. */
    + PURPLE_XFER_STATUS_ACCEPTED, /**< Receive accepted, but destination file not selected yet */
    + PURPLE_XFER_STATUS_STARTED, /**< purple_xfer_start has been called. */
    + PURPLE_XFER_STATUS_DONE, /**< The xfer completed successfully. */
    + PURPLE_XFER_STATUS_CANCEL_LOCAL, /**< The xfer was cancelled by us. */
    + PURPLE_XFER_STATUS_CANCEL_REMOTE /**< The xfer was cancelled by the other end, or we couldn't connect. */
    +} PurpleXferStatusType;
    +
    +/**
    + * File transfer UI operations.
    + *
    + * Any UI representing a file transfer must assign a filled-out
    + * PurpleXferUiOps structure to the purple_xfer.
    + */
    +typedef struct
    +{
    + void (*new_xfer)(PurpleXfer *xfer);
    + void (*destroy)(PurpleXfer *xfer);
    + void (*add_xfer)(PurpleXfer *xfer);
    + void (*update_progress)(PurpleXfer *xfer, double percent);
    + void (*cancel_local)(PurpleXfer *xfer);
    + void (*cancel_remote)(PurpleXfer *xfer);
    +
    + /**
    + * UI op to write data received from the prpl. The UI must deal with the
    + * entire buffer and return size, or it is treated as an error.
    + *
    + * @param xfer The file transfer structure
    + * @param buffer The buffer to write
    + * @param size The size of the buffer
    + *
    + * @return size if the write was successful, or a value between 0 and
    + * size on error.
    + * @since 2.6.0
    + */
    + gssize (*ui_write)(PurpleXfer *xfer, const guchar *buffer, gssize size);
    +
    + /**
    + * UI op to read data to send to the prpl for a file transfer.
    + *
    + * @param xfer The file transfer structure
    + * @param buffer A pointer to a buffer. The UI must allocate this buffer.
    + * libpurple will free the data.
    + * @param size The maximum amount of data to put in the buffer.
    + *
    + * @returns The amount of data in the buffer, 0 if nothing is available,
    + * and a negative value if an error occurred and the transfer
    + * should be cancelled (libpurple will cancel).
    + * @since 2.6.0
    + */
    + gssize (*ui_read)(PurpleXfer *xfer, guchar **buffer, gssize size);
    +
    + /**
    + * Op to notify the UI that not all the data read in was written. The UI
    + * should re-enqueue this data and return it the next time read is called.
    + *
    + * This MUST be implemented if read and write are implemented.
    + *
    + * @param xfer The file transfer structure
    + * @param buffer A pointer to the beginning of the unwritten data.
    + * @param size The amount of unwritten data.
    + *
    + * @since 2.6.0
    + */
    + void (*data_not_sent)(PurpleXfer *xfer, const guchar *buffer, gsize size);
    +
    + /**
    + * Op to create a thumbnail image for a file transfer
    + *
    + * @param xfer The file transfer structure
    + */
    + void (*add_thumbnail)(PurpleXfer *xfer, const gchar *formats);
    +} PurpleXferUiOps;
    +
    +/**
    + * A core representation of a file transfer.
    + */
    +struct _PurpleXfer
    +{
    + guint ref; /**< The reference count. */
    + PurpleXferType type; /**< The type of transfer. */
    +
    + PurpleAccount *account; /**< The account. */
    +
    + char *who; /**< The person on the other end of the
    + transfer. */
    +
    + char *message; /**< A message sent with the request */
    + char *filename; /**< The name sent over the network. */
    + char *local_filename; /**< The name on the local hard drive. */
    + size_t size; /**< The size of the file. */
    +
    + FILE *dest_fp; /**< The destination file pointer. */
    +
    + char *remote_ip; /**< The remote IP address. */
    + int local_port; /**< The local port. */
    + int remote_port; /**< The remote port. */
    +
    + int fd; /**< The socket file descriptor. */
    + int watcher; /**< Watcher. */
    +
    + size_t bytes_sent; /**< The number of bytes sent. */
    + size_t bytes_remaining; /**< The number of bytes remaining. */
    + time_t start_time; /**< When the transfer of data began. */
    + time_t end_time; /**< When the transfer of data ended. */
    +
    + size_t current_buffer_size; /**< This gradually increases for fast
    + network connections. */
    +
    + PurpleXferStatusType status; /**< File Transfer's status. */
    +
    + /** I/O operations, which should be set by the prpl using
    + * purple_xfer_set_init_fnc() and friends. Setting #init is
    + * mandatory; all others are optional.
    + */
    + struct
    + {
    + void (*init)(PurpleXfer *xfer);
    + void (*request_denied)(PurpleXfer *xfer);
    + void (*start)(PurpleXfer *xfer);
    + void (*end)(PurpleXfer *xfer);
    + void (*cancel_send)(PurpleXfer *xfer);
    + void (*cancel_recv)(PurpleXfer *xfer);
    + gssize (*read)(guchar **buffer, PurpleXfer *xfer);
    + gssize (*write)(const guchar *buffer, size_t size, PurpleXfer *xfer);
    + void (*ack)(PurpleXfer *xfer, const guchar *buffer, size_t size);
    + } ops;
    +
    + PurpleXferUiOps *ui_ops; /**< UI-specific operations. */
    + void *ui_data; /**< UI-specific data. */
    +
    + void *data; /**< prpl-specific data. */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name File Transfer API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new file transfer handle.
    + * This is called by prpls.
    + * The handle starts with a ref count of 1, and this reference
    + * is owned by the core. The prpl normally does not need to
    + * purple_xfer_ref or unref.
    + *
    + * @param account The account sending or receiving the file.
    + * @param type The type of file transfer.
    + * @param who The name of the remote user.
    + *
    + * @return A file transfer handle.
    + */
    +PurpleXfer *purple_xfer_new(PurpleAccount *account,
    + PurpleXferType type, const char *who);
    +
    +/**
    + * Returns all xfers
    + *
    + * @return all current xfers with refs
    + */
    +GList *purple_xfers_get_all(void);
    +
    +/**
    + * Increases the reference count on a PurpleXfer.
    + * Please call purple_xfer_unref later.
    + *
    + * @param xfer A file transfer handle.
    + */
    +void purple_xfer_ref(PurpleXfer *xfer);
    +
    +/**
    + * Decreases the reference count on a PurpleXfer.
    + * If the reference reaches 0, purple_xfer_destroy (an internal function)
    + * will destroy the xfer. It calls the ui destroy cb first.
    + * Since the core keeps a ref on the xfer, only an erroneous call to
    + * this function will destroy the xfer while still in use.
    + *
    + * @param xfer A file transfer handle.
    + */
    +void purple_xfer_unref(PurpleXfer *xfer);
    +
    +/**
    + * Requests confirmation for a file transfer from the user. If receiving
    + * a file which is known at this point, this requests user to accept and
    + * save the file. If the filename is unknown (not set) this only requests user
    + * to accept the file transfer. In this case protocol must call this function
    + * again once the filename is available.
    + *
    + * @param xfer The file transfer to request confirmation on.
    + */
    +void purple_xfer_request(PurpleXfer *xfer);
    +
    +/**
    + * Called if the user accepts the file transfer request.
    + *
    + * @param xfer The file transfer.
    + * @param filename The filename.
    + */
    +void purple_xfer_request_accepted(PurpleXfer *xfer, const char *filename);
    +
    +/**
    + * Called if the user rejects the file transfer request.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_request_denied(PurpleXfer *xfer);
    +
    +/**
    + * Returns the type of file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The type of the file transfer.
    + */
    +PurpleXferType purple_xfer_get_type(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the account the file transfer is using.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The account.
    + */
    +PurpleAccount *purple_xfer_get_account(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the name of the remote user.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The name of the remote user.
    + *
    + * @since 2.1.0
    + */
    +const char *purple_xfer_get_remote_user(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the status of the xfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The status.
    + */
    +PurpleXferStatusType purple_xfer_get_status(const PurpleXfer *xfer);
    +
    +/**
    + * Returns true if the file transfer was cancelled.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return Whether or not the transfer was cancelled.
    + * FIXME: This should be renamed using cancelled for 3.0.0.
    + */
    +gboolean purple_xfer_is_canceled(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the completed state for a file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The completed state.
    + */
    +gboolean purple_xfer_is_completed(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the name of the file being sent or received.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The filename.
    + */
    +const char *purple_xfer_get_filename(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the file's destination filename,
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The destination filename.
    + */
    +const char *purple_xfer_get_local_filename(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the number of bytes sent (or received) so far.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The number of bytes sent.
    + */
    +size_t purple_xfer_get_bytes_sent(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the number of bytes remaining to send or receive.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The number of bytes remaining.
    + */
    +size_t purple_xfer_get_bytes_remaining(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the size of the file being sent or received.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The total size of the file.
    + */
    +size_t purple_xfer_get_size(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the current percentage of progress of the transfer.
    + *
    + * This is a number between 0 (0%) and 1 (100%).
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The percentage complete.
    + */
    +double purple_xfer_get_progress(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the local port number in the file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The port number on this end.
    + */
    +unsigned int purple_xfer_get_local_port(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the remote IP address in the file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The IP address on the other end.
    + */
    +const char *purple_xfer_get_remote_ip(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the remote port number in the file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The port number on the other end.
    + */
    +unsigned int purple_xfer_get_remote_port(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the time the transfer of a file started.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The time when the transfer started.
    + * @since 2.4.0
    + */
    +time_t purple_xfer_get_start_time(const PurpleXfer *xfer);
    +
    +/**
    + * Returns the time the transfer of a file ended.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The time when the transfer ended.
    + * @since 2.4.0
    + */
    +time_t purple_xfer_get_end_time(const PurpleXfer *xfer);
    +
    +/**
    + * Sets the completed state for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param completed The completed state.
    + */
    +void purple_xfer_set_completed(PurpleXfer *xfer, gboolean completed);
    +
    +/**
    + * Sets the filename for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param message The message.
    + */
    +void purple_xfer_set_message(PurpleXfer *xfer, const char *message);
    +
    +/**
    + * Sets the filename for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param filename The filename.
    + */
    +void purple_xfer_set_filename(PurpleXfer *xfer, const char *filename);
    +
    +/**
    + * Sets the local filename for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param filename The filename
    + */
    +void purple_xfer_set_local_filename(PurpleXfer *xfer, const char *filename);
    +
    +/**
    + * Sets the size of the file in a file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param size The size of the file.
    + */
    +void purple_xfer_set_size(PurpleXfer *xfer, size_t size);
    +
    +/**
    + * Sets the current working position in the active file transfer. This
    + * can be used to jump backward in the file if the protocol detects
    + * that some bit of data needs to be resent or has been sent twice.
    + *
    + * It's used for pausing and resuming an oscar file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param bytes_sent The new current position in the file. If we're
    + * sending a file then this is the byte that we will
    + * send. If we're receiving a file, this is the
    + * next byte that we expect to receive.
    + */
    +void purple_xfer_set_bytes_sent(PurpleXfer *xfer, size_t bytes_sent);
    +
    +/**
    + * Returns the UI operations structure for a file transfer.
    + *
    + * @param xfer The file transfer.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleXferUiOps *purple_xfer_get_ui_ops(const PurpleXfer *xfer);
    +
    +/**
    + * Sets the read function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The read function.
    + */
    +void purple_xfer_set_read_fnc(PurpleXfer *xfer,
    + gssize (*fnc)(guchar **, PurpleXfer *));
    +
    +/**
    + * Sets the write function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The write function.
    + */
    +void purple_xfer_set_write_fnc(PurpleXfer *xfer,
    + gssize (*fnc)(const guchar *, size_t, PurpleXfer *));
    +
    +/**
    + * Sets the acknowledge function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The acknowledge function.
    + */
    +void purple_xfer_set_ack_fnc(PurpleXfer *xfer,
    + void (*fnc)(PurpleXfer *, const guchar *, size_t));
    +
    +/**
    + * Sets the function to be called if the request is denied.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The request denied prpl callback.
    + */
    +void purple_xfer_set_request_denied_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Sets the transfer initialization function for the file transfer.
    + *
    + * This function is required, and must call purple_xfer_start() with
    + * the necessary parameters. This will be called if the file transfer
    + * is accepted by the user.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The transfer initialization function.
    + */
    +void purple_xfer_set_init_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Sets the start transfer function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The start transfer function.
    + */
    +void purple_xfer_set_start_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Sets the end transfer function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The end transfer function.
    + */
    +void purple_xfer_set_end_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Sets the cancel send function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The cancel send function.
    + */
    +void purple_xfer_set_cancel_send_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Sets the cancel receive function for the file transfer.
    + *
    + * @param xfer The file transfer.
    + * @param fnc The cancel receive function.
    + */
    +void purple_xfer_set_cancel_recv_fnc(PurpleXfer *xfer, void (*fnc)(PurpleXfer *));
    +
    +/**
    + * Reads in data from a file transfer stream.
    + *
    + * @param xfer The file transfer.
    + * @param buffer The buffer that will be created to contain the data.
    + *
    + * @return The number of bytes read, or -1.
    + */
    +gssize purple_xfer_read(PurpleXfer *xfer, guchar **buffer);
    +
    +/**
    + * Writes data to a file transfer stream.
    + *
    + * @param xfer The file transfer.
    + * @param buffer The buffer to read the data from.
    + * @param size The number of bytes to write.
    + *
    + * @return The number of bytes written, or -1.
    + */
    +gssize purple_xfer_write(PurpleXfer *xfer, const guchar *buffer, gsize size);
    +
    +/**
    + * Writes chunk of received file.
    + *
    + * @param xfer The file transfer.
    + * @param buffer The buffer to read the data from.
    + * @param size The number of bytes to write.
    + *
    + * @return TRUE on success, FALSE otherwise.
    + *
    + * @since 2.11.0
    + */
    +gboolean
    +purple_xfer_write_file(PurpleXfer *xfer, const guchar *buffer, gsize size);
    +
    +/**
    + * Writes chunk of file being sent.
    + *
    + * @param xfer The file transfer.
    + * @param buffer The buffer to write the data to.
    + * @param size The size of buffer.
    + *
    + * @return Number of bytes written (0 means, the device is busy), or -1 on
    + * failure.
    + *
    + * @since 2.11.0
    + */
    +gssize
    +purple_xfer_read_file(PurpleXfer *xfer, guchar *buffer, gsize size);
    +
    +/**
    + * Starts a file transfer.
    + *
    + * Either @a fd must be specified <i>or</i> @a ip and @a port on a
    + * file receive transfer. On send, @a fd must be specified, and
    + * @a ip and @a port are ignored.
    + *
    + * Prior to libpurple 2.6.0, passing '0' to @a fd was special-cased to
    + * allow the protocol plugin to facilitate the file transfer itself. As of
    + * 2.6.0, this is supported (for backward compatibility), but will be
    + * removed in libpurple 3.0.0. If a prpl detects that the running libpurple
    + * is running 2.6.0 or higher, it should use the invalid fd '-1'.
    + *
    + * @param xfer The file transfer.
    + * @param fd The file descriptor for the socket.
    + * @param ip The IP address to connect to.
    + * @param port The port to connect to.
    + */
    +void purple_xfer_start(PurpleXfer *xfer, int fd, const char *ip,
    + unsigned int port);
    +
    +/**
    + * Ends a file transfer.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_end(PurpleXfer *xfer);
    +
    +/**
    + * Adds a new file transfer to the list of file transfers. Call this only
    + * if you are not using purple_xfer_start.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_add(PurpleXfer *xfer);
    +
    +/**
    + * Cancels a file transfer on the local end.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_cancel_local(PurpleXfer *xfer);
    +
    +/**
    + * Cancels a file transfer from the remote end.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_cancel_remote(PurpleXfer *xfer);
    +
    +/**
    + * Displays a file transfer-related error message.
    + *
    + * This is a wrapper around purple_notify_error(), which automatically
    + * specifies a title ("File transfer to <i>user</i> failed" or
    + * "File Transfer from <i>user</i> failed").
    + *
    + * @param type The type of file transfer.
    + * @param account The account sending or receiving the file.
    + * @param who The user on the other end of the transfer.
    + * @param msg The message to display.
    + */
    +void purple_xfer_error(PurpleXferType type, PurpleAccount *account, const char *who, const char *msg);
    +
    +/**
    + * Updates file transfer progress.
    + *
    + * @param xfer The file transfer.
    + */
    +void purple_xfer_update_progress(PurpleXfer *xfer);
    +
    +/**
    + * Displays a file transfer-related message in the conversation window
    + *
    + * This is a wrapper around purple_conversation_write
    + *
    + * @param xfer The file transfer to which this message relates.
    + * @param message The message to display.
    + * @param is_error Is this an error message?.
    + */
    +void purple_xfer_conversation_write(PurpleXfer *xfer, char *message, gboolean is_error);
    +
    +/**
    + * Allows the UI to signal it's ready to send/receive data (depending on
    + * the direction of the file transfer. Used when the UI is providing
    + * read/write/data_not_sent UI ops.
    + *
    + * @param xfer The file transfer which is ready.
    + *
    + * @since 2.6.0
    + */
    +void purple_xfer_ui_ready(PurpleXfer *xfer);
    +
    +/**
    + * Allows the prpl to signal it's ready to send/receive data (depending on
    + * the direction of the file transfer. Used when the prpl provides read/write
    + * ops and cannot/does not provide a raw fd to the core.
    + *
    + * @param xfer The file transfer which is ready.
    + *
    + * @since 2.6.0
    + */
    +void purple_xfer_prpl_ready(PurpleXfer *xfer);
    +
    +/**
    + * Gets the thumbnail data for a transfer
    + *
    + * @param xfer The file transfer to get the thumbnail for
    + * @param len If not @c NULL, the length of the thumbnail data returned
    + * will be set in the location pointed to by this.
    + * @return The thumbnail data, or NULL if there is no thumbnail
    + * @since 2.7.0
    + */
    +gconstpointer purple_xfer_get_thumbnail(const PurpleXfer *xfer, gsize *len);
    +
    +/**
    + * Gets the mimetype of the thumbnail preview for a transfer
    + *
    + * @param xfer The file transfer to get the mimetype for
    + * @return The mimetype of the thumbnail, or @c NULL if not thumbnail is set
    + * @since 2.7.0
    + */
    +const gchar *purple_xfer_get_thumbnail_mimetype(const PurpleXfer *xfer);
    +
    +
    +/**
    + * Sets the thumbnail data for a transfer
    + *
    + * @param xfer The file transfer to set the data for
    + * @param thumbnail A pointer to the thumbnail data, this will be copied
    + * @param size The size in bytes of the passed in thumbnail data
    + * @param mimetype The mimetype of the generated thumbnail
    + * @since 2.7.0
    + */
    +void purple_xfer_set_thumbnail(PurpleXfer *xfer, gconstpointer thumbnail,
    + gsize size, const gchar *mimetype);
    +
    +/**
    + * Prepare a thumbnail for a transfer (if the UI supports it)
    + * will be no-op in case the UI doesn't implement thumbnail creation
    + *
    + * @param xfer The file transfer to create a thumbnail for
    + * @param formats A comma-separated list of mimetypes for image formats
    + * the protocols can use for thumbnails.
    + * @since 2.7.0
    + */
    +void purple_xfer_prepare_thumbnail(PurpleXfer *xfer, const gchar *formats);
    +
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the handle to the file transfer subsystem
    + *
    + * @return The handle
    + */
    +void *purple_xfers_get_handle(void);
    +
    +/**
    + * Initializes the file transfer subsystem
    + */
    +void purple_xfers_init(void);
    +
    +/**
    + * Uninitializes the file transfer subsystem
    + */
    +void purple_xfers_uninit(void);
    +
    +/**
    + * Sets the UI operations structure to be used in all purple file transfers.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_xfers_set_ui_ops(PurpleXferUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used in all purple file transfers.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleXferUiOps *purple_xfers_get_ui_ops(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_FT_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/gaim-compat.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,2317 @@
    +/**
    + * @file gaim-compat.h Gaim Compat macros
    + * @ingroup core
    + */
    +
    +/* pidgin
    + *
    + * Pidgin 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
    + */
    +#ifndef _GAIM_COMPAT_H_
    +#define _GAIM_COMPAT_H_
    +
    +#include <glib.h>
    +
    +/* from account.h */
    +#define GaimAccountUiOps PurpleAccountUiOps
    +#define GaimAccount PurpleAccount
    +
    +#define GaimFilterAccountFunc PurpleFilterAccountFunc
    +#define GaimAccountRequestAuthorizationCb PurpleAccountRequestAuthorizationCb
    +
    +#define gaim_account_new purple_account_new
    +#define gaim_account_destroy purple_account_destroy
    +#define gaim_account_connect purple_account_connect
    +#define gaim_account_register purple_account_register
    +#define gaim_account_disconnect purple_account_disconnect
    +#define gaim_account_notify_added purple_account_notify_added
    +#define gaim_account_request_add purple_account_request_add
    +#define gaim_account_request_close purple_account_request_close
    +
    +#define gaim_account_request_authorization purple_account_request_authorization
    +#define gaim_account_request_change_password purple_account_request_change_password
    +#define gaim_account_request_change_user_info purple_account_request_change_user_info
    +
    +#define gaim_account_set_username purple_account_set_username
    +#define gaim_account_set_password purple_account_set_password
    +#define gaim_account_set_alias purple_account_set_alias
    +#define gaim_account_set_user_info purple_account_set_user_info
    +#define gaim_account_set_buddy_icon_path purple_account_set_buddy_icon_path
    +#define gaim_account_set_protocol_id purple_account_set_protocol_id
    +#define gaim_account_set_connection purple_account_set_connection
    +#define gaim_account_set_remember_password purple_account_set_remember_password
    +#define gaim_account_set_check_mail purple_account_set_check_mail
    +#define gaim_account_set_enabled purple_account_set_enabled
    +#define gaim_account_set_proxy_info purple_account_set_proxy_info
    +#define gaim_account_set_status_types purple_account_set_status_types
    +#define gaim_account_set_status purple_account_set_status
    +#define gaim_account_set_status_list purple_account_set_status_list
    +
    +#define gaim_account_clear_settings purple_account_clear_settings
    +
    +#define gaim_account_set_int purple_account_set_int
    +#define gaim_account_set_string purple_account_set_string
    +#define gaim_account_set_bool purple_account_set_bool
    +
    +#define gaim_account_set_ui_int purple_account_set_ui_int
    +#define gaim_account_set_ui_string purple_account_set_ui_string
    +#define gaim_account_set_ui_bool purple_account_set_ui_bool
    +
    +#define gaim_account_is_connected purple_account_is_connected
    +#define gaim_account_is_connecting purple_account_is_connecting
    +#define gaim_account_is_disconnected purple_account_is_disconnected
    +
    +#define gaim_account_get_username purple_account_get_username
    +#define gaim_account_get_password purple_account_get_password
    +#define gaim_account_get_alias purple_account_get_alias
    +#define gaim_account_get_user_info purple_account_get_user_info
    +#define gaim_account_get_buddy_icon_path purple_account_get_buddy_icon_path
    +#define gaim_account_get_protocol_id purple_account_get_protocol_id
    +#define gaim_account_get_protocol_name purple_account_get_protocol_name
    +#define gaim_account_get_connection purple_account_get_connection
    +#define gaim_account_get_remember_password purple_account_get_remember_password
    +#define gaim_account_get_check_mail purple_account_get_check_mail
    +#define gaim_account_get_enabled purple_account_get_enabled
    +#define gaim_account_get_proxy_info purple_account_get_proxy_info
    +#define gaim_account_get_active_status purple_account_get_active_status
    +#define gaim_account_get_status purple_account_get_status
    +#define gaim_account_get_status_type purple_account_get_status_type
    +#define gaim_account_get_status_type_with_primitive \
    + purple_account_get_status_type_with_primitive
    +
    +#define gaim_account_get_presence purple_account_get_presence
    +#define gaim_account_is_status_active purple_account_is_status_active
    +#define gaim_account_get_status_types purple_account_get_status_types
    +
    +#define gaim_account_get_int purple_account_get_int
    +#define gaim_account_get_string purple_account_get_string
    +#define gaim_account_get_bool purple_account_get_bool
    +
    +#define gaim_account_get_ui_int purple_account_get_ui_int
    +#define gaim_account_get_ui_string purple_account_get_ui_string
    +#define gaim_account_get_ui_bool purple_account_get_ui_bool
    +
    +
    +#define gaim_account_get_log purple_account_get_log
    +#define gaim_account_destroy_log purple_account_destroy_log
    +
    +#define gaim_account_add_buddy purple_account_add_buddy
    +#define gaim_account_add_buddies purple_account_add_buddies
    +#define gaim_account_remove_buddy purple_account_remove_buddy
    +#define gaim_account_remove_buddies purple_account_remove_buddies
    +
    +#define gaim_account_remove_group purple_account_remove_group
    +
    +#define gaim_account_change_password purple_account_change_password
    +
    +#define gaim_account_supports_offline_message purple_account_supports_offline_message
    +
    +#define gaim_accounts_add purple_accounts_add
    +#define gaim_accounts_remove purple_accounts_remove
    +#define gaim_accounts_delete purple_accounts_delete
    +#define gaim_accounts_reorder purple_accounts_reorder
    +
    +#define gaim_accounts_get_all purple_accounts_get_all
    +#define gaim_accounts_get_all_active purple_accounts_get_all_active
    +
    +#define gaim_accounts_find purple_accounts_find
    +
    +#define gaim_accounts_restore_current_statuses purple_accounts_restore_current_statuses
    +
    +#define gaim_accounts_set_ui_ops purple_accounts_set_ui_ops
    +#define gaim_accounts_get_ui_ops purple_accounts_get_ui_ops
    +
    +#define gaim_accounts_get_handle purple_accounts_get_handle
    +
    +#define gaim_accounts_init purple_accounts_init
    +#define gaim_accounts_uninit purple_accounts_uninit
    +
    +/* from accountopt.h */
    +
    +#define GaimAccountOption PurpleAccountOption
    +#define GaimAccountUserSplit PurpleAccountUserSplit
    +
    +#define gaim_account_option_new purple_account_option_new
    +#define gaim_account_option_bool_new purple_account_option_bool_new
    +#define gaim_account_option_int_new purple_account_option_int_new
    +#define gaim_account_option_string_new purple_account_option_string_new
    +#define gaim_account_option_list_new purple_account_option_list_new
    +
    +#define gaim_account_option_destroy purple_account_option_destroy
    +
    +#define gaim_account_option_set_default_bool purple_account_option_set_default_bool
    +#define gaim_account_option_set_default_int purple_account_option_set_default_int
    +#define gaim_account_option_set_default_string purple_account_option_set_default_string
    +
    +#define gaim_account_option_set_masked purple_account_option_set_masked
    +
    +#define gaim_account_option_set_list purple_account_option_set_list
    +
    +#define gaim_account_option_add_list_item purple_account_option_add_list_item
    +
    +#define gaim_account_option_get_type purple_account_option_get_type
    +#define gaim_account_option_get_text purple_account_option_get_text
    +#define gaim_account_option_get_setting purple_account_option_get_setting
    +
    +#define gaim_account_option_get_default_bool purple_account_option_get_default_bool
    +#define gaim_account_option_get_default_int purple_account_option_get_default_int
    +#define gaim_account_option_get_default_string purple_account_option_get_default_string
    +#define gaim_account_option_get_default_list_value purple_account_option_get_default_list_value
    +
    +#define gaim_account_option_get_masked purple_account_option_get_masked
    +#define gaim_account_option_get_list purple_account_option_get_list
    +
    +#define gaim_account_user_split_new purple_account_user_split_new
    +#define gaim_account_user_split_destroy purple_account_user_split_destroy
    +
    +#define gaim_account_user_split_get_text purple_account_user_split_get_text
    +#define gaim_account_user_split_get_default_value purple_account_user_split_get_default_value
    +#define gaim_account_user_split_get_separator purple_account_user_split_get_separator
    +
    +/* from blist.h */
    +
    +#define GaimBuddyList PurpleBuddyList
    +#define GaimBlistUiOps PurpleBlistUiOps
    +#define GaimBlistNode PurpleBlistNode
    +
    +#define GaimChat PurpleChat
    +#define GaimGroup PurpleGroup
    +#define GaimContact PurpleContact
    +#define GaimBuddy PurpleBuddy
    +
    +#define GAIM_BLIST_GROUP_NODE PURPLE_BLIST_GROUP_NODE
    +#define GAIM_BLIST_CONTACT_NODE PURPLE_BLIST_CONTACT_NODE
    +#define GAIM_BLIST_BUDDY_NODE PURPLE_BLIST_BUDDY_NODE
    +#define GAIM_BLIST_CHAT_NODE PURPLE_BLIST_CHAT_NODE
    +#define GAIM_BLIST_OTHER_NODE PURPLE_BLIST_OTHER_NODE
    +#define GaimBlistNodeType PurpleBlistNodeType
    +
    +#define GAIM_BLIST_NODE_IS_CHAT PURPLE_BLIST_NODE_IS_CHAT
    +#define GAIM_BLIST_NODE_IS_BUDDY PURPLE_BLIST_NODE_IS_BUDDY
    +#define GAIM_BLIST_NODE_IS_CONTACT PURPLE_BLIST_NODE_IS_CONTACT
    +#define GAIM_BLIST_NODE_IS_GROUP PURPLE_BLIST_NODE_IS_GROUP
    +
    +#define GAIM_BUDDY_IS_ONLINE PURPLE_BUDDY_IS_ONLINE
    +
    +#define GAIM_BLIST_NODE_FLAG_NO_SAVE PURPLE_BLIST_NODE_FLAG_NO_SAVE
    +#define GaimBlistNodeFlags PurpleBlistNodeFlags
    +
    +#define GAIM_BLIST_NODE_HAS_FLAG PURPLE_BLIST_NODE_HAS_FLAG
    +#define GAIM_BLIST_NODE_SHOULD_SAVE PURPLE_BLIST_NODE_SHOULD_SAVE
    +
    +#define GAIM_BLIST_NODE_NAME PURPLE_BLIST_NODE_NAME
    +
    +
    +#define gaim_blist_new purple_blist_new
    +#define gaim_set_blist purple_set_blist
    +#define gaim_get_blist purple_get_blist
    +
    +#define gaim_blist_get_root purple_blist_get_root
    +#define gaim_blist_node_next purple_blist_node_next
    +
    +#define gaim_blist_show purple_blist_show
    +
    +#define gaim_blist_destroy purple_blist_destroy
    +
    +#define gaim_blist_set_visible purple_blist_set_visible
    +
    +#define gaim_blist_update_buddy_status purple_blist_update_buddy_status
    +#define gaim_blist_update_buddy_icon purple_blist_update_buddy_icon
    +
    +
    +#define gaim_blist_alias_contact purple_blist_alias_contact
    +#define gaim_blist_alias_buddy purple_blist_alias_buddy
    +#define gaim_blist_server_alias_buddy purple_blist_server_alias_buddy
    +#define gaim_blist_alias_chat purple_blist_alias_chat
    +
    +#define gaim_blist_rename_buddy purple_blist_rename_buddy
    +#define gaim_blist_rename_group purple_blist_rename_group
    +
    +#define gaim_chat_new purple_chat_new
    +#define gaim_blist_add_chat purple_blist_add_chat
    +
    +#define gaim_buddy_new purple_buddy_new
    +#define gaim_buddy_set_icon purple_buddy_set_icon
    +#define gaim_buddy_get_account purple_buddy_get_account
    +#define gaim_buddy_get_name purple_buddy_get_name
    +#define gaim_buddy_get_icon purple_buddy_get_icon
    +#define gaim_buddy_get_contact purple_buddy_get_contact
    +#define gaim_buddy_get_presence purple_buddy_get_presence
    +
    +#define gaim_blist_add_buddy purple_blist_add_buddy
    +
    +#define gaim_group_new purple_group_new
    +
    +#define gaim_blist_add_group purple_blist_add_group
    +
    +#define gaim_contact_new purple_contact_new
    +
    +#define gaim_blist_add_contact purple_blist_add_contact
    +#define gaim_blist_merge_contact purple_blist_merge_contact
    +
    +#define gaim_contact_get_priority_buddy purple_contact_get_priority_buddy
    +#define gaim_contact_set_alias purple_contact_set_alias
    +#define gaim_contact_get_alias purple_contact_get_alias
    +#define gaim_contact_on_account purple_contact_on_account
    +
    +#define gaim_contact_invalidate_priority_buddy purple_contact_invalidate_priority_buddy
    +
    +#define gaim_blist_remove_buddy purple_blist_remove_buddy
    +#define gaim_blist_remove_contact purple_blist_remove_contact
    +#define gaim_blist_remove_chat purple_blist_remove_chat
    +#define gaim_blist_remove_group purple_blist_remove_group
    +
    +#define gaim_buddy_get_alias_only purple_buddy_get_alias_only
    +#define gaim_buddy_get_server_alias purple_buddy_get_server_alias
    +#define gaim_buddy_get_contact_alias purple_buddy_get_contact_alias
    +#define gaim_buddy_get_local_alias purple_buddy_get_local_alias
    +#define gaim_buddy_get_alias purple_buddy_get_alias
    +
    +#define gaim_chat_get_name purple_chat_get_name
    +
    +#define gaim_find_buddy purple_find_buddy
    +#define gaim_find_buddy_in_group purple_find_buddy_in_group
    +#define gaim_find_buddies purple_find_buddies
    +
    +#define gaim_find_group purple_find_group
    +
    +#define gaim_blist_find_chat purple_blist_find_chat
    +
    +#define gaim_chat_get_group purple_chat_get_group
    +#define gaim_buddy_get_group purple_buddy_get_group
    +
    +#define gaim_group_get_accounts purple_group_get_accounts
    +#define gaim_group_on_account purple_group_on_account
    +
    +#define gaim_blist_add_account purple_blist_add_account
    +#define gaim_blist_remove_account purple_blist_remove_account
    +
    +#define gaim_blist_get_group_size purple_blist_get_group_size
    +#define gaim_blist_get_group_online_count purple_blist_get_group_online_count
    +
    +#define gaim_blist_load purple_blist_load
    +#define gaim_blist_schedule_save purple_blist_schedule_save
    +
    +#define gaim_blist_request_add_buddy purple_blist_request_add_buddy
    +#define gaim_blist_request_add_chat purple_blist_request_add_chat
    +#define gaim_blist_request_add_group purple_blist_request_add_group
    +
    +#define gaim_blist_node_set_bool purple_blist_node_set_bool
    +#define gaim_blist_node_get_bool purple_blist_node_get_bool
    +#define gaim_blist_node_set_int purple_blist_node_set_int
    +#define gaim_blist_node_get_int purple_blist_node_get_int
    +#define gaim_blist_node_set_string purple_blist_node_set_string
    +#define gaim_blist_node_get_string purple_blist_node_get_string
    +
    +#define gaim_blist_node_remove_setting purple_blist_node_remove_setting
    +
    +#define gaim_blist_node_set_flags purple_blist_node_set_flags
    +#define gaim_blist_node_get_flags purple_blist_node_get_flags
    +
    +#define gaim_blist_node_get_extended_menu purple_blist_node_get_extended_menu
    +
    +#define gaim_blist_set_ui_ops purple_blist_set_ui_ops
    +#define gaim_blist_get_ui_ops purple_blist_get_ui_ops
    +
    +#define gaim_blist_get_handle purple_blist_get_handle
    +
    +#define gaim_blist_init purple_blist_init
    +#define gaim_blist_uninit purple_blist_uninit
    +
    +
    +#define GaimBuddyIcon PurpleBuddyIcon
    +
    +#define gaim_buddy_icon_new(account, username, icon_data, icon_len)\
    + purple_buddy_icon_new(account, username, g_memdup(icon_data, icon_len), icon_len)
    +#define gaim_buddy_icon_ref purple_buddy_icon_ref
    +#define gaim_buddy_icon_unref purple_buddy_icon_unref
    +#define gaim_buddy_icon_update purple_buddy_icon_update
    +
    +#define gaim_buddy_icon_set_data(icon, data, len) \
    + purple_buddy_icon_set_data(icon, g_memdup(data, len), len, NULL);
    +
    +#define gaim_buddy_icon_get_account purple_buddy_icon_get_account
    +#define gaim_buddy_icon_get_username purple_buddy_icon_get_username
    +#define gaim_buddy_icon_get_data purple_buddy_icon_get_data
    +#define gaim_buddy_icon_get_type purple_buddy_icon_get_extension
    +
    +#define gaim_buddy_icons_set_for_user(icon, data, len) \
    + purple_buddy_icons_set_for_user(icon, g_memdup(data, len), len, NULL)
    +#define gaim_buddy_icons_set_caching purple_buddy_icons_set_caching
    +#define gaim_buddy_icons_is_caching purple_buddy_icons_is_caching
    +#define gaim_buddy_icons_set_cache_dir purple_buddy_icons_set_cache_dir
    +#define gaim_buddy_icons_get_cache_dir purple_buddy_icons_get_cache_dir
    +#define gaim_buddy_icons_get_handle purple_buddy_icons_get_handle
    +
    +#define gaim_buddy_icons_init purple_buddy_icons_init
    +#define gaim_buddy_icons_uninit purple_buddy_icons_uninit
    +
    +#define gaim_buddy_icon_get_scale_size purple_buddy_icon_get_scale_size
    +
    +/* from cipher.h */
    +
    +#define GAIM_CIPHER PURPLE_CIPHER
    +#define GAIM_CIPHER_OPS PURPLE_CIPHER_OPS
    +#define GAIM_CIPHER_CONTEXT PURPLE_CIPHER_CONTEXT
    +
    +#define GaimCipher PurpleCipher
    +#define GaimCipherOps PurpleCipherOps
    +#define GaimCipherContext PurpleCipherContext
    +
    +#define GAIM_CIPHER_CAPS_SET_OPT PURPLE_CIPHER_CAPS_SET_OPT
    +#define GAIM_CIPHER_CAPS_GET_OPT PURPLE_CIPHER_CAPS_GET_OPT
    +#define GAIM_CIPHER_CAPS_INIT PURPLE_CIPHER_CAPS_INIT
    +#define GAIM_CIPHER_CAPS_RESET PURPLE_CIPHER_CAPS_RESET
    +#define GAIM_CIPHER_CAPS_UNINIT PURPLE_CIPHER_CAPS_UNINIT
    +#define GAIM_CIPHER_CAPS_SET_IV PURPLE_CIPHER_CAPS_SET_IV
    +#define GAIM_CIPHER_CAPS_APPEND PURPLE_CIPHER_CAPS_APPEND
    +#define GAIM_CIPHER_CAPS_DIGEST PURPLE_CIPHER_CAPS_DIGEST
    +#define GAIM_CIPHER_CAPS_ENCRYPT PURPLE_CIPHER_CAPS_ENCRYPT
    +#define GAIM_CIPHER_CAPS_DECRYPT PURPLE_CIPHER_CAPS_DECRYPT
    +#define GAIM_CIPHER_CAPS_SET_SALT PURPLE_CIPHER_CAPS_SET_SALT
    +#define GAIM_CIPHER_CAPS_GET_SALT_SIZE PURPLE_CIPHER_CAPS_GET_SALT_SIZE
    +#define GAIM_CIPHER_CAPS_SET_KEY PURPLE_CIPHER_CAPS_SET_KEY
    +#define GAIM_CIPHER_CAPS_GET_KEY_SIZE PURPLE_CIPHER_CAPS_GET_KEY_SIZE
    +#define GAIM_CIPHER_CAPS_UNKNOWN PURPLE_CIPHER_CAPS_UNKNOWN
    +
    +#define gaim_cipher_get_name purple_cipher_get_name
    +#define gaim_cipher_get_capabilities purple_cipher_get_capabilities
    +#define gaim_cipher_digest_region purple_cipher_digest_region
    +
    +#define gaim_ciphers_find_cipher purple_ciphers_find_cipher
    +#define gaim_ciphers_register_cipher purple_ciphers_register_cipher
    +#define gaim_ciphers_unregister_cipher purple_ciphers_unregister_cipher
    +#define gaim_ciphers_get_ciphers purple_ciphers_get_ciphers
    +
    +#define gaim_ciphers_get_handle purple_ciphers_get_handle
    +#define gaim_ciphers_init purple_ciphers_init
    +#define gaim_ciphers_uninit purple_ciphers_uninit
    +
    +#define gaim_cipher_context_set_option purple_cipher_context_set_option
    +#define gaim_cipher_context_get_option purple_cipher_context_get_option
    +
    +#define gaim_cipher_context_new purple_cipher_context_new
    +#define gaim_cipher_context_new_by_name purple_cipher_context_new_by_name
    +#define gaim_cipher_context_reset purple_cipher_context_reset
    +#define gaim_cipher_context_destroy purple_cipher_context_destroy
    +#define gaim_cipher_context_set_iv purple_cipher_context_set_iv
    +#define gaim_cipher_context_append purple_cipher_context_append
    +#define gaim_cipher_context_digest purple_cipher_context_digest
    +#define gaim_cipher_context_digest_to_str purple_cipher_context_digest_to_str
    +#define gaim_cipher_context_encrypt purple_cipher_context_encrypt
    +#define gaim_cipher_context_decrypt purple_cipher_context_decrypt
    +#define gaim_cipher_context_set_salt purple_cipher_context_set_salt
    +#define gaim_cipher_context_get_salt_size purple_cipher_context_get_salt_size
    +#define gaim_cipher_context_set_key purple_cipher_context_set_key
    +#define gaim_cipher_context_get_key_size purple_cipher_context_get_key_size
    +#define gaim_cipher_context_set_data purple_cipher_context_set_data
    +#define gaim_cipher_context_get_data purple_cipher_context_get_data
    +
    +#define gaim_cipher_http_digest_calculate_session_key \
    + purple_cipher_http_digest_calculate_session_key
    +
    +#define gaim_cipher_http_digest_calculate_response \
    + purple_cipher_http_digest_calculate_response
    +
    +/* from circbuffer.h */
    +
    +#define GaimCircBuffer PurpleCircBuffer
    +
    +#define gaim_circ_buffer_new purple_circ_buffer_new
    +#define gaim_circ_buffer_destroy purple_circ_buffer_destroy
    +#define gaim_circ_buffer_append purple_circ_buffer_append
    +#define gaim_circ_buffer_get_max_read purple_circ_buffer_get_max_read
    +#define gaim_circ_buffer_mark_read purple_circ_buffer_mark_read
    +
    +/* from cmds.h */
    +
    +#define GaimCmdPriority PurpleCmdPriority
    +#define GaimCmdFlag PurpleCmdFlag
    +#define GaimCmdStatus PurpleCmdStatus
    +#define GaimCmdRet PurpleCmdRet
    +
    +#define GAIM_CMD_STATUS_OK PURPLE_CMD_STATUS_OK
    +#define GAIM_CMD_STATUS_FAILED PURPLE_CMD_STATUS_FAILED
    +#define GAIM_CMD_STATUS_NOT_FOUND PURPLE_CMD_STATUS_NOT_FOUND
    +#define GAIM_CMD_STATUS_WRONG_ARGS PURPLE_CMD_STATUS_WRONG_ARGS
    +#define GAIM_CMD_STATUS_WRONG_PRPL PURPLE_CMD_STATUS_WRONG_PRPL
    +#define GAIM_CMD_STATUS_WRONG_TYPE PURPLE_CMD_STATUS_WRONG_TYPE
    +
    +#define GAIM_CMD_FUNC PURPLE_CMD_FUNC
    +
    +#define GAIM_CMD_RET_OK PURPLE_CMD_RET_OK
    +#define GAIM_CMD_RET_FAILED PURPLE_CMD_RET_FAILED
    +#define GAIM_CMD_RET_CONTINUE PURPLE_CMD_RET_CONTINUE
    +
    +#define GAIM_CMD_P_VERY_LOW PURPLE_CMD_P_VERY_LOW
    +#define GAIM_CMD_P_LOW PURPLE_CMD_P_LOW
    +#define GAIM_CMD_P_DEFAULT PURPLE_CMD_P_DEFAULT
    +#define GAIM_CMD_P_PRPL PURPLE_CMD_P_PRPL
    +#define GAIM_CMD_P_PLUGIN PURPLE_CMD_P_PLUGIN
    +#define GAIM_CMD_P_ALIAS PURPLE_CMD_P_ALIAS
    +#define GAIM_CMD_P_HIGH PURPLE_CMD_P_HIGH
    +#define GAIM_CMD_P_VERY_HIGH PURPLE_CMD_P_VERY_HIGH
    +
    +#define GAIM_CMD_FLAG_IM PURPLE_CMD_FLAG_IM
    +#define GAIM_CMD_FLAG_CHAT PURPLE_CMD_FLAG_CHAT
    +#define GAIM_CMD_FLAG_PRPL_ONLY PURPLE_CMD_FLAG_PRPL_ONLY
    +#define GAIM_CMD_FLAG_ALLOW_WRONG_ARGS PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS
    +
    +
    +#define GaimCmdFunc PurpleCmdFunc
    +
    +#define GaimCmdId PurpleCmdId
    +
    +#define gaim_cmd_register purple_cmd_register
    +#define gaim_cmd_unregister purple_cmd_unregister
    +#define gaim_cmd_do_command purple_cmd_do_command
    +#define gaim_cmd_list purple_cmd_list
    +#define gaim_cmd_help purple_cmd_help
    +
    +/* from connection.h */
    +
    +#define GaimConnection PurpleConnection
    +
    +#define GAIM_CONNECTION_HTML PURPLE_CONNECTION_HTML
    +#define GAIM_CONNECTION_NO_BGCOLOR PURPLE_CONNECTION_NO_BGCOLOR
    +#define GAIM_CONNECTION_AUTO_RESP PURPLE_CONNECTION_AUTO_RESP
    +#define GAIM_CONNECTION_FORMATTING_WBFO PURPLE_CONNECTION_FORMATTING_WBFO
    +#define GAIM_CONNECTION_NO_NEWLINES PURPLE_CONNECTION_NO_NEWLINES
    +#define GAIM_CONNECTION_NO_FONTSIZE PURPLE_CONNECTION_NO_FONTSIZE
    +#define GAIM_CONNECTION_NO_URLDESC PURPLE_CONNECTION_NO_URLDESC
    +#define GAIM_CONNECTION_NO_IMAGES PURPLE_CONNECTION_NO_IMAGES
    +
    +#define GaimConnectionFlags PurpleConnectionFlags
    +
    +#define GAIM_DISCONNECTED PURPLE_DISCONNECTED
    +#define GAIM_CONNECTED PURPLE_CONNECTED
    +#define GAIM_CONNECTING PURPLE_CONNECTING
    +
    +#define GaimConnectionState PurpleConnectionState
    +
    +#define GaimConnectionUiOps PurpleConnectionUiOps
    +
    +#define gaim_connection_new purple_connection_new
    +#define gaim_connection_destroy purple_connection_destroy
    +
    +#define gaim_connection_set_state purple_connection_set_state
    +#define gaim_connection_set_account purple_connection_set_account
    +#define gaim_connection_set_display_name purple_connection_set_display_name
    +#define gaim_connection_get_state purple_connection_get_state
    +
    +#define GAIM_CONNECTION_IS_CONNECTED PURPLE_CONNECTION_IS_CONNECTED
    +
    +#define gaim_connection_get_account purple_connection_get_account
    +#define gaim_connection_get_password purple_connection_get_password
    +#define gaim_connection_get_display_name purple_connection_get_display_name
    +
    +#define gaim_connection_update_progress purple_connection_update_progress
    +
    +#define gaim_connection_notice purple_connection_notice
    +#define gaim_connection_error purple_connection_error
    +
    +#define gaim_connections_disconnect_all purple_connections_disconnect_all
    +
    +#define gaim_connections_get_all purple_connections_get_all
    +#define gaim_connections_get_connecting purple_connections_get_connecting
    +
    +#define GAIM_CONNECTION_IS_VALID PURPLE_CONNECTION_IS_VALID
    +
    +#define gaim_connections_set_ui_ops purple_connections_set_ui_ops
    +#define gaim_connections_get_ui_ops purple_connections_get_ui_ops
    +
    +#define gaim_connections_init purple_connections_init
    +#define gaim_connections_uninit purple_connections_uninit
    +#define gaim_connections_get_handle purple_connections_get_handle
    +
    +
    +/* from conversation.h */
    +
    +#define GaimConversationUiOps PurpleConversationUiOps
    +#define GaimConversation PurpleConversation
    +#define GaimConvIm PurpleConvIm
    +#define GaimConvChat PurpleConvChat
    +#define GaimConvChatBuddy PurpleConvChatBuddy
    +
    +#define GAIM_CONV_TYPE_UNKNOWN PURPLE_CONV_TYPE_UNKNOWN
    +#define GAIM_CONV_TYPE_IM PURPLE_CONV_TYPE_IM
    +#define GAIM_CONV_TYPE_CHAT PURPLE_CONV_TYPE_CHAT
    +#define GAIM_CONV_TYPE_MISC PURPLE_CONV_TYPE_MISC
    +#define GAIM_CONV_TYPE_ANY PURPLE_CONV_TYPE_ANY
    +
    +#define GaimConversationType PurpleConversationType
    +
    +#define GAIM_CONV_UPDATE_ADD PURPLE_CONV_UPDATE_ADD
    +#define GAIM_CONV_UPDATE_REMOVE PURPLE_CONV_UPDATE_REMOVE
    +#define GAIM_CONV_UPDATE_ACCOUNT PURPLE_CONV_UPDATE_ACCOUNT
    +#define GAIM_CONV_UPDATE_TYPING PURPLE_CONV_UPDATE_TYPING
    +#define GAIM_CONV_UPDATE_UNSEEN PURPLE_CONV_UPDATE_UNSEEN
    +#define GAIM_CONV_UPDATE_LOGGING PURPLE_CONV_UPDATE_LOGGING
    +#define GAIM_CONV_UPDATE_TOPIC PURPLE_CONV_UPDATE_TOPIC
    +#define GAIM_CONV_ACCOUNT_ONLINE PURPLE_CONV_ACCOUNT_ONLINE
    +#define GAIM_CONV_ACCOUNT_OFFLINE PURPLE_CONV_ACCOUNT_OFFLINE
    +#define GAIM_CONV_UPDATE_AWAY PURPLE_CONV_UPDATE_AWAY
    +#define GAIM_CONV_UPDATE_ICON PURPLE_CONV_UPDATE_ICON
    +#define GAIM_CONV_UPDATE_TITLE PURPLE_CONV_UPDATE_TITLE
    +#define GAIM_CONV_UPDATE_CHATLEFT PURPLE_CONV_UPDATE_CHATLEFT
    +#define GAIM_CONV_UPDATE_FEATURES PURPLE_CONV_UPDATE_FEATURES
    +
    +#define GaimConvUpdateType PurpleConvUpdateType
    +
    +#define GAIM_NOT_TYPING PURPLE_NOT_TYPING
    +#define GAIM_TYPING PURPLE_TYPING
    +#define GAIM_TYPED PURPLE_TYPED
    +
    +#define GaimTypingState PurpleTypingState
    +
    +#define GAIM_MESSAGE_SEND PURPLE_MESSAGE_SEND
    +#define GAIM_MESSAGE_RECV PURPLE_MESSAGE_RECV
    +#define GAIM_MESSAGE_SYSTEM PURPLE_MESSAGE_SYSTEM
    +#define GAIM_MESSAGE_AUTO_RESP PURPLE_MESSAGE_AUTO_RESP
    +#define GAIM_MESSAGE_ACTIVE_ONLY PURPLE_MESSAGE_ACTIVE_ONLY
    +#define GAIM_MESSAGE_NICK PURPLE_MESSAGE_NICK
    +#define GAIM_MESSAGE_NO_LOG PURPLE_MESSAGE_NO_LOG
    +#define GAIM_MESSAGE_WHISPER PURPLE_MESSAGE_WHISPER
    +#define GAIM_MESSAGE_ERROR PURPLE_MESSAGE_ERROR
    +#define GAIM_MESSAGE_DELAYED PURPLE_MESSAGE_DELAYED
    +#define GAIM_MESSAGE_RAW PURPLE_MESSAGE_RAW
    +#define GAIM_MESSAGE_IMAGES PURPLE_MESSAGE_IMAGES
    +
    +#define GaimMessageFlags PurpleMessageFlags
    +
    +#define GAIM_CBFLAGS_NONE PURPLE_CBFLAGS_NONE
    +#define GAIM_CBFLAGS_VOICE PURPLE_CBFLAGS_VOICE
    +#define GAIM_CBFLAGS_HALFOP PURPLE_CBFLAGS_HALFOP
    +#define GAIM_CBFLAGS_OP PURPLE_CBFLAGS_OP
    +#define GAIM_CBFLAGS_FOUNDER PURPLE_CBFLAGS_FOUNDER
    +#define GAIM_CBFLAGS_TYPING PURPLE_CBFLAGS_TYPING
    +
    +#define GaimConvChatBuddyFlags PurpleConvChatBuddyFlags
    +
    +#define gaim_conversations_set_ui_ops purple_conversations_set_ui_ops
    +
    +#define gaim_conversation_new purple_conversation_new
    +#define gaim_conversation_destroy purple_conversation_destroy
    +#define gaim_conversation_present purple_conversation_present
    +#define gaim_conversation_get_type purple_conversation_get_type
    +#define gaim_conversation_set_ui_ops purple_conversation_set_ui_ops
    +#define gaim_conversation_get_ui_ops purple_conversation_get_ui_ops
    +#define gaim_conversation_set_account purple_conversation_set_account
    +#define gaim_conversation_get_account purple_conversation_get_account
    +#define gaim_conversation_get_gc purple_conversation_get_gc
    +#define gaim_conversation_set_title purple_conversation_set_title
    +#define gaim_conversation_get_title purple_conversation_get_title
    +#define gaim_conversation_autoset_title purple_conversation_autoset_title
    +#define gaim_conversation_set_name purple_conversation_set_name
    +#define gaim_conversation_get_name purple_conversation_get_name
    +#define gaim_conversation_set_logging purple_conversation_set_logging
    +#define gaim_conversation_is_logging purple_conversation_is_logging
    +#define gaim_conversation_close_logs purple_conversation_close_logs
    +#define gaim_conversation_get_im_data purple_conversation_get_im_data
    +
    +#define GAIM_CONV_IM PURPLE_CONV_IM
    +
    +#define gaim_conversation_get_chat_data purple_conversation_get_chat_data
    +
    +#define GAIM_CONV_CHAT PURPLE_CONV_CHAT
    +
    +#define gaim_conversation_set_data purple_conversation_set_data
    +#define gaim_conversation_get_data purple_conversation_get_data
    +
    +#define gaim_get_conversations purple_get_conversations
    +#define gaim_get_ims purple_get_ims
    +#define gaim_get_chats purple_get_chats
    +
    +#define gaim_find_conversation_with_account \
    + purple_find_conversation_with_account
    +
    +#define gaim_conversation_write purple_conversation_write
    +#define gaim_conversation_set_features purple_conversation_set_features
    +#define gaim_conversation_get_features purple_conversation_get_features
    +#define gaim_conversation_has_focus purple_conversation_has_focus
    +#define gaim_conversation_update purple_conversation_update
    +#define gaim_conversation_foreach purple_conversation_foreach
    +
    +#define gaim_conv_im_get_conversation purple_conv_im_get_conversation
    +#define gaim_conv_im_set_icon purple_conv_im_set_icon
    +#define gaim_conv_im_get_icon purple_conv_im_get_icon
    +#define gaim_conv_im_set_typing_state purple_conv_im_set_typing_state
    +#define gaim_conv_im_get_typing_state purple_conv_im_get_typing_state
    +
    +#define gaim_conv_im_start_typing_timeout purple_conv_im_start_typing_timeout
    +#define gaim_conv_im_stop_typing_timeout purple_conv_im_stop_typing_timeout
    +#define gaim_conv_im_get_typing_timeout purple_conv_im_get_typing_timeout
    +#define gaim_conv_im_set_type_again purple_conv_im_set_type_again
    +#define gaim_conv_im_get_type_again purple_conv_im_get_type_again
    +
    +#define gaim_conv_im_start_send_typed_timeout \
    + purple_conv_im_start_send_typed_timeout
    +
    +#define gaim_conv_im_stop_send_typed_timeout \
    + purple_conv_im_stop_send_typed_timeout
    +
    +#define gaim_conv_im_get_send_typed_timeout \
    + purple_conv_im_get_send_typed_timeout
    +
    +#define gaim_conv_present_error purple_conv_present_error
    +#define gaim_conv_send_confirm purple_conv_send_confirm
    +
    +#define gaim_conv_im_update_typing purple_conv_im_update_typing
    +#define gaim_conv_im_write purple_conv_im_write
    +#define gaim_conv_im_send purple_conv_im_send
    +#define gaim_conv_im_send_with_flags purple_conv_im_send_with_flags
    +
    +#define gaim_conv_custom_smiley_add purple_conv_custom_smiley_add
    +#define gaim_conv_custom_smiley_write purple_conv_custom_smiley_write
    +#define gaim_conv_custom_smiley_close purple_conv_custom_smiley_close
    +
    +#define gaim_conv_chat_get_conversation purple_conv_chat_get_conversation
    +#define gaim_conv_chat_set_users purple_conv_chat_set_users
    +#define gaim_conv_chat_get_users purple_conv_chat_get_users
    +#define gaim_conv_chat_ignore purple_conv_chat_ignore
    +#define gaim_conv_chat_unignore purple_conv_chat_unignore
    +#define gaim_conv_chat_set_ignored purple_conv_chat_set_ignored
    +#define gaim_conv_chat_get_ignored purple_conv_chat_get_ignored
    +#define gaim_conv_chat_get_ignored_user purple_conv_chat_get_ignored_user
    +#define gaim_conv_chat_is_user_ignored purple_conv_chat_is_user_ignored
    +#define gaim_conv_chat_set_topic purple_conv_chat_set_topic
    +#define gaim_conv_chat_get_topic purple_conv_chat_get_topic
    +#define gaim_conv_chat_set_id purple_conv_chat_set_id
    +#define gaim_conv_chat_get_id purple_conv_chat_get_id
    +#define gaim_conv_chat_write purple_conv_chat_write
    +#define gaim_conv_chat_send purple_conv_chat_send
    +#define gaim_conv_chat_send_with_flags purple_conv_chat_send_with_flags
    +#define gaim_conv_chat_add_user purple_conv_chat_add_user
    +#define gaim_conv_chat_add_users purple_conv_chat_add_users
    +#define gaim_conv_chat_rename_user purple_conv_chat_rename_user
    +#define gaim_conv_chat_remove_user purple_conv_chat_remove_user
    +#define gaim_conv_chat_remove_users purple_conv_chat_remove_users
    +#define gaim_conv_chat_find_user purple_conv_chat_find_user
    +#define gaim_conv_chat_user_set_flags purple_conv_chat_user_set_flags
    +#define gaim_conv_chat_user_get_flags purple_conv_chat_user_get_flags
    +#define gaim_conv_chat_clear_users purple_conv_chat_clear_users
    +#define gaim_conv_chat_set_nick purple_conv_chat_set_nick
    +#define gaim_conv_chat_get_nick purple_conv_chat_get_nick
    +#define gaim_conv_chat_left purple_conv_chat_left
    +#define gaim_conv_chat_has_left purple_conv_chat_has_left
    +
    +#define gaim_find_chat purple_find_chat
    +
    +#define gaim_conv_chat_cb_new purple_conv_chat_cb_new
    +#define gaim_conv_chat_cb_find purple_conv_chat_cb_find
    +#define gaim_conv_chat_cb_get_name purple_conv_chat_cb_get_name
    +#define gaim_conv_chat_cb_destroy purple_conv_chat_cb_destroy
    +
    +#define gaim_conversations_get_handle purple_conversations_get_handle
    +#define gaim_conversations_init purple_conversations_init
    +#define gaim_conversations_uninit purple_conversations_uninit
    +
    +/* from core.h */
    +
    +#define GaimCore PurpleCore
    +
    +#define GaimCoreUiOps PurpleCoreUiOps
    +
    +#define gaim_core_init purple_core_init
    +#define gaim_core_quit purple_core_quit
    +
    +#define gaim_core_quit_cb purple_core_quit_cb
    +#define gaim_core_get_version purple_core_get_version
    +#define gaim_core_get_ui purple_core_get_ui
    +#define gaim_get_core purple_get_core
    +#define gaim_core_set_ui_ops purple_core_set_ui_ops
    +#define gaim_core_get_ui_ops purple_core_get_ui_ops
    +
    +/* from debug.h */
    +
    +#define GAIM_DEBUG_ALL PURPLE_DEBUG_ALL
    +#define GAIM_DEBUG_MISC PURPLE_DEBUG_MISC
    +#define GAIM_DEBUG_INFO PURPLE_DEBUG_INFO
    +#define GAIM_DEBUG_WARNING PURPLE_DEBUG_WARNING
    +#define GAIM_DEBUG_ERROR PURPLE_DEBUG_ERROR
    +#define GAIM_DEBUG_FATAL PURPLE_DEBUG_FATAL
    +
    +#define GaimDebugLevel PurpleDebugLevel
    +
    +#define GaimDebugUiOps PurpleDebugUiOps
    +
    +
    +#define gaim_debug purple_debug
    +#define gaim_debug_misc purple_debug_misc
    +#define gaim_debug_info purple_debug_info
    +#define gaim_debug_warning purple_debug_warning
    +#define gaim_debug_error purple_debug_error
    +#define gaim_debug_fatal purple_debug_fatal
    +
    +#define gaim_debug_set_enabled purple_debug_set_enabled
    +#define gaim_debug_is_enabled purple_debug_is_enabled
    +
    +#define gaim_debug_set_ui_ops purple_debug_set_ui_ops
    +#define gaim_debug_get_ui_ops purple_debug_get_ui_ops
    +
    +#define gaim_debug_init purple_debug_init
    +
    +/* from desktopitem.h */
    +
    +#define GAIM_DESKTOP_ITEM_TYPE_NULL PURPLE_DESKTOP_ITEM_TYPE_NULL
    +#define GAIM_DESKTOP_ITEM_TYPE_OTHER PURPLE_DESKTOP_ITEM_TYPE_OTHER
    +#define GAIM_DESKTOP_ITEM_TYPE_APPLICATION PURPLE_DESKTOP_ITEM_TYPE_APPLICATION
    +#define GAIM_DESKTOP_ITEM_TYPE_LINK PURPLE_DESKTOP_ITEM_TYPE_LINK
    +#define GAIM_DESKTOP_ITEM_TYPE_FSDEVICE PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE
    +#define GAIM_DESKTOP_ITEM_TYPE_MIME_TYPE PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE
    +#define GAIM_DESKTOP_ITEM_TYPE_DIRECTORY PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY
    +#define GAIM_DESKTOP_ITEM_TYPE_SERVICE PURPLE_DESKTOP_ITEM_TYPE_SERVICE
    +#define GAIM_DESKTOP_ITEM_TYPE_SERVICE_TYPE PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
    +
    +#define GaimDesktopItemType PurpleDesktopItemType
    +
    +#define GaimDesktopItem PurpleDesktopItem
    +
    +#define GAIM_TYPE_DESKTOP_ITEM PURPLE_TYPE_DESKTOP_ITEM
    +#define gaim_desktop_item_get_type purple_desktop_item_get_type
    +
    +/* standard */
    +/* ugh, i'm just copying these as strings, rather than pidginifying them */
    +#define GAIM_DESKTOP_ITEM_ENCODING "Encoding" /* string */
    +#define GAIM_DESKTOP_ITEM_VERSION "Version" /* numeric */
    +#define GAIM_DESKTOP_ITEM_NAME "Name" /* localestring */
    +#define GAIM_DESKTOP_ITEM_GENERIC_NAME "GenericName" /* localestring */
    +#define GAIM_DESKTOP_ITEM_TYPE "Type" /* string */
    +#define GAIM_DESKTOP_ITEM_FILE_PATTERN "FilePattern" /* regexp(s) */
    +#define GAIM_DESKTOP_ITEM_TRY_EXEC "TryExec" /* string */
    +#define GAIM_DESKTOP_ITEM_NO_DISPLAY "NoDisplay" /* boolean */
    +#define GAIM_DESKTOP_ITEM_COMMENT "Comment" /* localestring */
    +#define GAIM_DESKTOP_ITEM_EXEC "Exec" /* string */
    +#define GAIM_DESKTOP_ITEM_ACTIONS "Actions" /* strings */
    +#define GAIM_DESKTOP_ITEM_ICON "Icon" /* string */
    +#define GAIM_DESKTOP_ITEM_MINI_ICON "MiniIcon" /* string */
    +#define GAIM_DESKTOP_ITEM_HIDDEN "Hidden" /* boolean */
    +#define GAIM_DESKTOP_ITEM_PATH "Path" /* string */
    +#define GAIM_DESKTOP_ITEM_TERMINAL "Terminal" /* boolean */
    +#define GAIM_DESKTOP_ITEM_TERMINAL_OPTIONS "TerminalOptions" /* string */
    +#define GAIM_DESKTOP_ITEM_SWALLOW_TITLE "SwallowTitle" /* string */
    +#define GAIM_DESKTOP_ITEM_SWALLOW_EXEC "SwallowExec" /* string */
    +#define GAIM_DESKTOP_ITEM_MIME_TYPE "MimeType" /* regexp(s) */
    +#define GAIM_DESKTOP_ITEM_PATTERNS "Patterns" /* regexp(s) */
    +#define GAIM_DESKTOP_ITEM_DEFAULT_APP "DefaultApp" /* string */
    +#define GAIM_DESKTOP_ITEM_DEV "Dev" /* string */
    +#define GAIM_DESKTOP_ITEM_FS_TYPE "FSType" /* string */
    +#define GAIM_DESKTOP_ITEM_MOUNT_POINT "MountPoint" /* string */
    +#define GAIM_DESKTOP_ITEM_READ_ONLY "ReadOnly" /* boolean */
    +#define GAIM_DESKTOP_ITEM_UNMOUNT_ICON "UnmountIcon" /* string */
    +#define GAIM_DESKTOP_ITEM_SORT_ORDER "SortOrder" /* strings */
    +#define GAIM_DESKTOP_ITEM_URL "URL" /* string */
    +#define GAIM_DESKTOP_ITEM_DOC_PATH "X-GNOME-DocPath" /* string */
    +
    +#define gaim_desktop_item_new_from_file purple_desktop_item_new_from_file
    +#define gaim_desktop_item_get_entry_type purple_desktop_item_get_entry_type
    +#define gaim_desktop_item_get_string purple_desktop_item_get_string
    +#define gaim_desktop_item_copy purple_desktop_item_copy
    +#define gaim_desktop_item_unref purple_desktop_item_unref
    +
    +/* from dnsquery.h */
    +
    +#define GaimDnsQueryData PurpleDnsQueryData
    +#define GaimDnsQueryConnectFunction PurpleDnsQueryConnectFunction
    +
    +#define gaim_dnsquery_a purple_dnsquery_a
    +#define gaim_dnsquery_destroy purple_dnsquery_destroy
    +#define gaim_dnsquery_init purple_dnsquery_init
    +#define gaim_dnsquery_uninit purple_dnsquery_uninit
    +#define gaim_dnsquery_set_ui_ops purple_dnsquery_set_ui_ops
    +#define gaim_dnsquery_get_host purple_dnsquery_get_host
    +#define gaim_dnsquery_get_port purple_dnsquery_get_port
    +
    +/* from dnssrv.h */
    +
    +#define GaimSrvResponse PurpleSrvResponse
    +#define GaimSrvQueryData PurpleSrvTxtQueryData
    +#define GaimSrvCallback PurpleSrvCallback
    +
    +#define gaim_srv_resolve purple_srv_resolve
    +#define gaim_srv_cancel purple_srv_cancel
    +
    +/* from eventloop.h */
    +
    +#define GAIM_INPUT_READ PURPLE_INPUT_READ
    +#define GAIM_INPUT_WRITE PURPLE_INPUT_WRITE
    +
    +#define GaimInputCondition PurpleInputCondition
    +#define GaimInputFunction PurpleInputFunction
    +#define GaimEventLoopUiOps PurpleEventLoopUiOps
    +
    +#define gaim_timeout_add purple_timeout_add
    +#define gaim_timeout_remove purple_timeout_remove
    +#define gaim_input_add purple_input_add
    +#define gaim_input_remove purple_input_remove
    +
    +#define gaim_eventloop_set_ui_ops purple_eventloop_set_ui_ops
    +#define gaim_eventloop_get_ui_ops purple_eventloop_get_ui_ops
    +
    +/* from ft.h */
    +
    +#define GaimXfer PurpleXfer
    +
    +#define GAIM_XFER_UNKNOWN PURPLE_XFER_UNKNOWN
    +#define GAIM_XFER_SEND PURPLE_XFER_SEND
    +#define GAIM_XFER_RECEIVE PURPLE_XFER_RECEIVE
    +
    +#define GaimXferType PurpleXferType
    +
    +#define GAIM_XFER_STATUS_UNKNOWN PURPLE_XFER_STATUS_UNKNOWN
    +#define GAIM_XFER_STATUS_NOT_STARTED PURPLE_XFER_STATUS_NOT_STARTED
    +#define GAIM_XFER_STATUS_ACCEPTED PURPLE_XFER_STATUS_ACCEPTED
    +#define GAIM_XFER_STATUS_STARTED PURPLE_XFER_STATUS_STARTED
    +#define GAIM_XFER_STATUS_DONE PURPLE_XFER_STATUS_DONE
    +#define GAIM_XFER_STATUS_CANCEL_LOCAL PURPLE_XFER_STATUS_CANCEL_LOCAL
    +#define GAIM_XFER_STATUS_CANCEL_REMOTE PURPLE_XFER_STATUS_CANCEL_REMOTE
    +
    +#define GaimXferStatusType PurpleXferStatusType
    +
    +#define GaimXferUiOps PurpleXferUiOps
    +
    +#define gaim_xfer_new purple_xfer_new
    +#define gaim_xfer_ref purple_xfer_ref
    +#define gaim_xfer_unref purple_xfer_unref
    +#define gaim_xfer_request purple_xfer_request
    +#define gaim_xfer_request_accepted purple_xfer_request_accepted
    +#define gaim_xfer_request_denied purple_xfer_request_denied
    +#define gaim_xfer_get_type purple_xfer_get_type
    +#define gaim_xfer_get_account purple_xfer_get_account
    +#define gaim_xfer_get_status purple_xfer_get_status
    +#define gaim_xfer_is_canceled purple_xfer_is_canceled
    +#define gaim_xfer_is_completed purple_xfer_is_completed
    +#define gaim_xfer_get_filename purple_xfer_get_filename
    +#define gaim_xfer_get_local_filename purple_xfer_get_local_filename
    +#define gaim_xfer_get_bytes_sent purple_xfer_get_bytes_sent
    +#define gaim_xfer_get_bytes_remaining purple_xfer_get_bytes_remaining
    +#define gaim_xfer_get_size purple_xfer_get_size
    +#define gaim_xfer_get_progress purple_xfer_get_progress
    +#define gaim_xfer_get_local_port purple_xfer_get_local_port
    +#define gaim_xfer_get_remote_ip purple_xfer_get_remote_ip
    +#define gaim_xfer_get_remote_port purple_xfer_get_remote_port
    +#define gaim_xfer_set_completed purple_xfer_set_completed
    +#define gaim_xfer_set_message purple_xfer_set_message
    +#define gaim_xfer_set_filename purple_xfer_set_filename
    +#define gaim_xfer_set_local_filename purple_xfer_set_local_filename
    +#define gaim_xfer_set_size purple_xfer_set_size
    +#define gaim_xfer_set_bytes_sent purple_xfer_set_bytes_sent
    +#define gaim_xfer_get_ui_ops purple_xfer_get_ui_ops
    +#define gaim_xfer_set_read_fnc purple_xfer_set_read_fnc
    +#define gaim_xfer_set_write_fnc purple_xfer_set_write_fnc
    +#define gaim_xfer_set_ack_fnc purple_xfer_set_ack_fnc
    +#define gaim_xfer_set_request_denied_fnc purple_xfer_set_request_denied_fnc
    +#define gaim_xfer_set_init_fnc purple_xfer_set_init_fnc
    +#define gaim_xfer_set_start_fnc purple_xfer_set_start_fnc
    +#define gaim_xfer_set_end_fnc purple_xfer_set_end_fnc
    +#define gaim_xfer_set_cancel_send_fnc purple_xfer_set_cancel_send_fnc
    +#define gaim_xfer_set_cancel_recv_fnc purple_xfer_set_cancel_recv_fnc
    +
    +#define gaim_xfer_read purple_xfer_read
    +#define gaim_xfer_write purple_xfer_write
    +#define gaim_xfer_start purple_xfer_start
    +#define gaim_xfer_end purple_xfer_end
    +#define gaim_xfer_add purple_xfer_add
    +#define gaim_xfer_cancel_local purple_xfer_cancel_local
    +#define gaim_xfer_cancel_remote purple_xfer_cancel_remote
    +#define gaim_xfer_error purple_xfer_error
    +#define gaim_xfer_update_progress purple_xfer_update_progress
    +#define gaim_xfer_conversation_write purple_xfer_conversation_write
    +
    +#define gaim_xfers_get_handle purple_xfers_get_handle
    +#define gaim_xfers_init purple_xfers_init
    +#define gaim_xfers_uninit purple_xfers_uninit
    +#define gaim_xfers_set_ui_ops purple_xfers_set_ui_ops
    +#define gaim_xfers_get_ui_ops purple_xfers_get_ui_ops
    +
    +/* from gaim-client.h */
    +
    +#define gaim_init purple_init
    +
    +/* from idle.h */
    +
    +#define GaimIdleUiOps PurpleIdleUiOps
    +
    +#define gaim_idle_touch purple_idle_touch
    +#define gaim_idle_set purple_idle_set
    +#define gaim_idle_set_ui_ops purple_idle_set_ui_ops
    +#define gaim_idle_get_ui_ops purple_idle_get_ui_ops
    +#define gaim_idle_init purple_idle_init
    +#define gaim_idle_uninit purple_idle_uninit
    +
    +/* from imgstore.h */
    +
    +#define GaimStoredImage PurpleStoredImage
    +
    +#define gaim_imgstore_add(data, size, filename) \
    + purple_imgstore_add_with_id(g_memdup(data, size), size, filename)
    +#define gaim_imgstore_get purple_imgstore_find_by_id
    +#define gaim_imgstore_get_data purple_imgstore_get_data
    +#define gaim_imgstore_get_size purple_imgstore_get_size
    +#define gaim_imgstore_get_filename purple_imgstore_get_filename
    +#define gaim_imgstore_ref purple_imgstore_ref_by_id
    +#define gaim_imgstore_unref purple_imgstore_unref_by_id
    +
    +
    +/* from log.h */
    +
    +#define GaimLog PurpleLog
    +#define GaimLogLogger PurpleLogLogger
    +#define GaimLogCommonLoggerData PurpleLogCommonLoggerData
    +#define GaimLogSet PurpleLogSet
    +
    +#define GAIM_LOG_IM PURPLE_LOG_IM
    +#define GAIM_LOG_CHAT PURPLE_LOG_CHAT
    +#define GAIM_LOG_SYSTEM PURPLE_LOG_SYSTEM
    +
    +#define GaimLogType PurpleLogType
    +
    +#define GAIM_LOG_READ_NO_NEWLINE PURPLE_LOG_READ_NO_NEWLINE
    +
    +#define GaimLogReadFlags PurpleLogReadFlags
    +
    +#define GaimLogSetCallback PurpleLogSetCallback
    +
    +#define gaim_log_new purple_log_new
    +#define gaim_log_free purple_log_free
    +#define gaim_log_write purple_log_write
    +#define gaim_log_read purple_log_read
    +
    +#define gaim_log_get_logs purple_log_get_logs
    +#define gaim_log_get_log_sets purple_log_get_log_sets
    +#define gaim_log_get_system_logs purple_log_get_system_logs
    +#define gaim_log_get_size purple_log_get_size
    +#define gaim_log_get_total_size purple_log_get_total_size
    +#define gaim_log_get_log_dir purple_log_get_log_dir
    +#define gaim_log_compare purple_log_compare
    +#define gaim_log_set_compare purple_log_set_compare
    +#define gaim_log_set_free purple_log_set_free
    +
    +#define gaim_log_common_writer purple_log_common_writer
    +#define gaim_log_common_lister purple_log_common_lister
    +#define gaim_log_common_total_sizer purple_log_common_total_sizer
    +#define gaim_log_common_sizer purple_log_common_sizer
    +
    +#define gaim_log_logger_new purple_log_logger_new
    +#define gaim_log_logger_free purple_log_logger_free
    +#define gaim_log_logger_add purple_log_logger_add
    +#define gaim_log_logger_remove purple_log_logger_remove
    +#define gaim_log_logger_set purple_log_logger_set
    +#define gaim_log_logger_get purple_log_logger_get
    +
    +#define gaim_log_logger_get_options purple_log_logger_get_options
    +
    +#define gaim_log_init purple_log_init
    +#define gaim_log_get_handle purple_log_get_handle
    +#define gaim_log_uninit purple_log_uninit
    +
    +/* from mime.h */
    +
    +#define GaimMimeDocument PurpleMimeDocument
    +#define GaimMimePart PurpleMimePart
    +
    +#define gaim_mime_document_new purple_mime_document_new
    +#define gaim_mime_document_free purple_mime_document_free
    +#define gaim_mime_document_parse purple_mime_document_parse
    +#define gaim_mime_document_parsen purple_mime_document_parsen
    +#define gaim_mime_document_write purple_mime_document_write
    +#define gaim_mime_document_get_fields purple_mime_document_get_fields
    +#define gaim_mime_document_get_field purple_mime_document_get_field
    +#define gaim_mime_document_set_field purple_mime_document_set_field
    +#define gaim_mime_document_get_parts purple_mime_document_get_parts
    +
    +#define gaim_mime_part_new purple_mime_part_new
    +#define gaim_mime_part_get_fields purple_mime_part_get_fields
    +#define gaim_mime_part_get_field purple_mime_part_get_field
    +#define gaim_mime_part_get_field_decoded purple_mime_part_get_field_decoded
    +#define gaim_mime_part_set_field purple_mime_part_set_field
    +#define gaim_mime_part_get_data purple_mime_part_get_data
    +#define gaim_mime_part_get_data_decoded purple_mime_part_get_data_decoded
    +#define gaim_mime_part_get_length purple_mime_part_get_length
    +#define gaim_mime_part_set_data purple_mime_part_set_data
    +
    +
    +/* from network.h */
    +
    +#define GaimNetworkListenData PurpleNetworkListenData
    +
    +#define GaimNetworkListenCallback PurpleNetworkListenCallback
    +
    +#define gaim_network_ip_atoi purple_network_ip_atoi
    +#define gaim_network_set_public_ip purple_network_set_public_ip
    +#define gaim_network_get_public_ip purple_network_get_public_ip
    +#define gaim_network_get_local_system_ip purple_network_get_local_system_ip
    +#define gaim_network_get_my_ip purple_network_get_my_ip
    +
    +#define gaim_network_listen purple_network_listen
    +#define gaim_network_listen_range purple_network_listen_range
    +#define gaim_network_listen_cancel purple_network_listen_cancel
    +#define gaim_network_get_port_from_fd purple_network_get_port_from_fd
    +
    +#define gaim_network_is_available purple_network_is_available
    +
    +#define gaim_network_init purple_network_init
    +#define gaim_network_uninit purple_network_uninit
    +
    +/* from notify.h */
    +
    +
    +#define GaimNotifyUserInfoEntry PurpleNotifyUserInfoEntry
    +#define GaimNotifyUserInfo PurpleNotifyUserInfo
    +
    +#define GaimNotifyCloseCallback PurpleNotifyCloseCallback
    +
    +#define GAIM_NOTIFY_MESSAGE PURPLE_NOTIFY_MESSAGE
    +#define GAIM_NOTIFY_EMAIL PURPLE_NOTIFY_EMAIL
    +#define GAIM_NOTIFY_EMAILS PURPLE_NOTIFY_EMAILS
    +#define GAIM_NOTIFY_FORMATTED PURPLE_NOTIFY_FORMATTED
    +#define GAIM_NOTIFY_SEARCHRESULTS PURPLE_NOTIFY_SEARCHRESULTS
    +#define GAIM_NOTIFY_USERINFO PURPLE_NOTIFY_USERINFO
    +#define GAIM_NOTIFY_URI PURPLE_NOTIFY_URI
    +
    +#define GaimNotifyType PurpleNotifyType
    +
    +#define GAIM_NOTIFY_MSG_ERROR PURPLE_NOTIFY_MSG_ERROR
    +#define GAIM_NOTIFY_MSG_WARNING PURPLE_NOTIFY_MSG_WARNING
    +#define GAIM_NOTIFY_MSG_INFO PURPLE_NOTIFY_MSG_INFO
    +
    +#define GaimNotifyMsgType PurpleNotifyMsgType
    +
    +#define GAIM_NOTIFY_BUTTON_LABELED PURPLE_NOTIFY_BUTTON_LABELED
    +#define GAIM_NOTIFY_BUTTON_CONTINUE PURPLE_NOTIFY_BUTTON_CONTINUE
    +#define GAIM_NOTIFY_BUTTON_ADD PURPLE_NOTIFY_BUTTON_ADD
    +#define GAIM_NOTIFY_BUTTON_INFO PURPLE_NOTIFY_BUTTON_INFO
    +#define GAIM_NOTIFY_BUTTON_IM PURPLE_NOTIFY_BUTTON_IM
    +#define GAIM_NOTIFY_BUTTON_JOIN PURPLE_NOTIFY_BUTTON_JOIN
    +#define GAIM_NOTIFY_BUTTON_INVITE PURPLE_NOTIFY_BUTTON_INVITE
    +
    +#define GaimNotifySearchButtonType PurpleNotifySearchButtonType
    +
    +#define GaimNotifySearchResults PurpleNotifySearchResults
    +
    +#define GAIM_NOTIFY_USER_INFO_ENTRY_PAIR PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR
    +#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK
    +#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
    +
    +#define GaimNotifyUserInfoEntryType PurpleNotifyUserInfoEntryType
    +
    +#define GaimNotifySearchColumn PurpleNotifySearchColumn
    +#define GaimNotifySearchResultsCallback PurpleNotifySearchResultsCallback
    +#define GaimNotifySearchButton PurpleNotifySearchButton
    +
    +#define GaimNotifyUiOps PurpleNotifyUiOps
    +
    +#define gaim_notify_searchresults purple_notify_searchresults
    +#define gaim_notify_searchresults_free purple_notify_searchresults_free
    +#define gaim_notify_searchresults_new_rows purple_notify_searchresults_new_rows
    +#define gaim_notify_searchresults_button_add purple_notify_searchresults_button_add
    +#define gaim_notify_searchresults_button_add_labeled purple_notify_searchresults_button_add_labeled
    +#define gaim_notify_searchresults_new purple_notify_searchresults_new
    +#define gaim_notify_searchresults_column_new purple_notify_searchresults_column_new
    +#define gaim_notify_searchresults_column_add purple_notify_searchresults_column_add
    +#define gaim_notify_searchresults_row_add purple_notify_searchresults_row_add
    +#define gaim_notify_searchresults_get_rows_count purple_notify_searchresults_get_rows_count
    +#define gaim_notify_searchresults_get_columns_count purple_notify_searchresults_get_columns_count
    +#define gaim_notify_searchresults_row_get purple_notify_searchresults_row_get
    +#define gaim_notify_searchresults_column_get_title purple_notify_searchresults_column_get_title
    +
    +#define gaim_notify_message purple_notify_message
    +#define gaim_notify_email purple_notify_email
    +#define gaim_notify_emails purple_notify_emails
    +#define gaim_notify_formatted purple_notify_formatted
    +#define gaim_notify_userinfo purple_notify_userinfo
    +
    +#define gaim_notify_user_info_new purple_notify_user_info_new
    +#define gaim_notify_user_info_destroy purple_notify_user_info_destroy
    +#define gaim_notify_user_info_get_entries purple_notify_user_info_get_entries
    +#define gaim_notify_user_info_get_text_with_newline purple_notify_user_info_get_text_with_newline
    +#define gaim_notify_user_info_add_pair purple_notify_user_info_add_pair
    +#define gaim_notify_user_info_prepend_pair purple_notify_user_info_prepend_pair
    +#define gaim_notify_user_info_remove_entry purple_notify_user_info_remove_entry
    +#define gaim_notify_user_info_entry_new purple_notify_user_info_entry_new
    +#define gaim_notify_user_info_add_section_break purple_notify_user_info_add_section_break
    +#define gaim_notify_user_info_add_section_header purple_notify_user_info_add_section_header
    +#define gaim_notify_user_info_remove_last_item purple_notify_user_info_remove_last_item
    +#define gaim_notify_user_info_entry_get_label purple_notify_user_info_entry_get_label
    +#define gaim_notify_user_info_entry_set_label purple_notify_user_info_entry_set_label
    +#define gaim_notify_user_info_entry_get_value purple_notify_user_info_entry_get_value
    +#define gaim_notify_user_info_entry_set_value purple_notify_user_info_entry_set_value
    +#define gaim_notify_user_info_entry_get_type purple_notify_user_info_entry_get_type
    +#define gaim_notify_user_info_entry_set_type purple_notify_user_info_entry_set_type
    +
    +#define gaim_notify_uri purple_notify_uri
    +#define gaim_notify_close purple_notify_close
    +#define gaim_notify_close_with_handle purple_notify_close_with_handle
    +
    +#define gaim_notify_info purple_notify_info
    +#define gaim_notify_warning purple_notify_warning
    +#define gaim_notify_error purple_notify_error
    +
    +#define gaim_notify_set_ui_ops purple_notify_set_ui_ops
    +#define gaim_notify_get_ui_ops purple_notify_get_ui_ops
    +
    +#define gaim_notify_get_handle purple_notify_get_handle
    +
    +#define gaim_notify_init purple_notify_init
    +#define gaim_notify_uninit purple_notify_uninit
    +
    +/* from ntlm.h */
    +
    +#define gaim_ntlm_gen_type1 purple_ntlm_gen_type1
    +#define gaim_ntlm_parse_type2 purple_ntlm_parse_type2
    +#define gaim_ntlm_gen_type3 purple_ntlm_gen_type3
    +
    +/* from plugin.h */
    +
    +#ifdef GAIM_PLUGINS
    +#ifndef PURPLE_PLUGINS
    +#define PURPLE_PLUGINS
    +#endif
    +#endif
    +
    +#define GaimPlugin PurplePlugin
    +#define GaimPluginInfo PurplePluginInfo
    +#define GaimPluginUiInfo PurplePluginUiInfo
    +#define GaimPluginLoaderInfo PurplePluginLoaderInfo
    +#define GaimPluginAction PurplePluginAction
    +#define GaimPluginPriority PurplePluginPriority
    +
    +#define GAIM_PLUGIN_UNKNOWN PURPLE_PLUGIN_UNKNOWN
    +#define GAIM_PLUGIN_STANDARD PURPLE_PLUGIN_STANDARD
    +#define GAIM_PLUGIN_LOADER PURPLE_PLUGIN_LOADER
    +#define GAIM_PLUGIN_PROTOCOL PURPLE_PLUGIN_PROTOCOL
    +
    +#define GaimPluginType PurplePluginType
    +
    +#define GAIM_PRIORITY_DEFAULT PURPLE_PRIORITY_DEFAULT
    +#define GAIM_PRIORITY_HIGHEST PURPLE_PRIORITY_HIGHEST
    +#define GAIM_PRIORITY_LOWEST PURPLE_PRIORITY_LOWEST
    +
    +#define GAIM_PLUGIN_FLAG_INVISIBLE PURPLE_PLUGIN_FLAG_INVISIBLE
    +
    +#define GAIM_PLUGIN_MAGIC PURPLE_PLUGIN_MAGIC
    +
    +#define GAIM_PLUGIN_LOADER_INFO PURPLE_PLUGIN_LOADER_INFO
    +#define GAIM_PLUGIN_HAS_PREF_FRAME PURPLE_PLUGIN_HAS_PREF_FRAME
    +#define GAIM_PLUGIN_UI_INFO PURPLE_PLUGIN_UI_INFO
    +
    +#define GAIM_PLUGIN_HAS_ACTIONS PURPLE_PLUGIN_HAS_ACTIONS
    +#define GAIM_PLUGIN_ACTIONS PURPLE_PLUGIN_ACTIONS
    +
    +#define GAIM_INIT_PLUGIN PURPLE_INIT_PLUGIN
    +
    +#define gaim_plugin_new purple_plugin_new
    +#define gaim_plugin_probe purple_plugin_probe
    +#define gaim_plugin_register purple_plugin_register
    +#define gaim_plugin_load purple_plugin_load
    +#define gaim_plugin_unload purple_plugin_unload
    +#define gaim_plugin_reload purple_plugin_reload
    +#define gaim_plugin_destroy purple_plugin_destroy
    +#define gaim_plugin_is_loaded purple_plugin_is_loaded
    +#define gaim_plugin_is_unloadable purple_plugin_is_unloadable
    +#define gaim_plugin_get_id purple_plugin_get_id
    +#define gaim_plugin_get_name purple_plugin_get_name
    +#define gaim_plugin_get_version purple_plugin_get_version
    +#define gaim_plugin_get_summary purple_plugin_get_summary
    +#define gaim_plugin_get_description purple_plugin_get_description
    +#define gaim_plugin_get_author purple_plugin_get_author
    +#define gaim_plugin_get_homepage purple_plugin_get_homepage
    +
    +#define gaim_plugin_ipc_register purple_plugin_ipc_register
    +#define gaim_plugin_ipc_unregister purple_plugin_ipc_unregister
    +#define gaim_plugin_ipc_unregister_all purple_plugin_ipc_unregister_all
    +#define gaim_plugin_ipc_get_params purple_plugin_ipc_get_params
    +#define gaim_plugin_ipc_call purple_plugin_ipc_call
    +
    +#define gaim_plugins_add_search_path purple_plugins_add_search_path
    +#define gaim_plugins_unload_all purple_plugins_unload_all
    +#define gaim_plugins_destroy_all purple_plugins_destroy_all
    +#define gaim_plugins_save_loaded purple_plugins_save_loaded
    +#define gaim_plugins_load_saved purple_plugins_load_saved
    +#define gaim_plugins_probe purple_plugins_probe
    +#define gaim_plugins_enabled purple_plugins_enabled
    +
    +#define gaim_plugins_register_probe_notify_cb purple_plugins_register_probe_notify_cb
    +#define gaim_plugins_unregister_probe_notify_cb purple_plugins_unregister_probe_notify_cb
    +#define gaim_plugins_register_load_notify_cb purple_plugins_register_load_notify_cb
    +#define gaim_plugins_unregister_load_notify_cb purple_plugins_unregister_load_notify_cb
    +#define gaim_plugins_register_unload_notify_cb purple_plugins_register_unload_notify_cb
    +#define gaim_plugins_unregister_unload_notify_cb purple_plugins_unregister_unload_notify_cb
    +
    +#define gaim_plugins_find_with_name purple_plugins_find_with_name
    +#define gaim_plugins_find_with_filename purple_plugins_find_with_filename
    +#define gaim_plugins_find_with_basename purple_plugins_find_with_basename
    +#define gaim_plugins_find_with_id purple_plugins_find_with_id
    +
    +#define gaim_plugins_get_loaded purple_plugins_get_loaded
    +#define gaim_plugins_get_protocols purple_plugins_get_protocols
    +#define gaim_plugins_get_all purple_plugins_get_all
    +
    +#define gaim_plugins_get_handle purple_plugins_get_handle
    +#define gaim_plugins_init purple_plugins_init
    +#define gaim_plugins_uninit purple_plugins_uninit
    +
    +#define gaim_plugin_action_new purple_plugin_action_new
    +#define gaim_plugin_action_free purple_plugin_action_free
    +
    +/* pluginpref.h */
    +
    +#define GaimPluginPrefFrame PurplePluginPrefFrame
    +#define GaimPluginPref PurplePluginPref
    +
    +#define GAIM_STRING_FORMAT_TYPE_NONE PURPLE_STRING_FORMAT_TYPE_NONE
    +#define GAIM_STRING_FORMAT_TYPE_MULTILINE PURPLE_STRING_FORMAT_TYPE_MULTILINE
    +#define GAIM_STRING_FORMAT_TYPE_HTML PURPLE_STRING_FORMAT_TYPE_HTML
    +
    +#define GaimStringFormatType PurpleStringFormatType
    +
    +#define GAIM_PLUGIN_PREF_NONE PURPLE_PLUGIN_PREF_NONE
    +#define GAIM_PLUGIN_PREF_CHOICE PURPLE_PLUGIN_PREF_CHOICE
    +#define GAIM_PLUGIN_PREF_INFO PURPLE_PLUGIN_PREF_INFO
    +#define GAIM_PLUGIN_PREF_STRING_FORMAT PURPLE_PLUGIN_PREF_STRING_FORMAT
    +
    +#define GaimPluginPrefType PurplePluginPrefType
    +
    +#define gaim_plugin_pref_frame_new purple_plugin_pref_frame_new
    +#define gaim_plugin_pref_frame_destroy purple_plugin_pref_frame_destroy
    +#define gaim_plugin_pref_frame_add purple_plugin_pref_frame_add
    +#define gaim_plugin_pref_frame_get_prefs purple_plugin_pref_frame_get_prefs
    +
    +#define gaim_plugin_pref_new purple_plugin_pref_new
    +#define gaim_plugin_pref_new_with_name purple_plugin_pref_new_with_name
    +#define gaim_plugin_pref_new_with_label purple_plugin_pref_new_with_label
    +#define gaim_plugin_pref_new_with_name_and_label purple_plugin_pref_new_with_name_and_label
    +#define gaim_plugin_pref_destroy purple_plugin_pref_destroy
    +#define gaim_plugin_pref_set_name purple_plugin_pref_set_name
    +#define gaim_plugin_pref_get_name purple_plugin_pref_get_name
    +#define gaim_plugin_pref_set_label purple_plugin_pref_set_label
    +#define gaim_plugin_pref_get_label purple_plugin_pref_get_label
    +#define gaim_plugin_pref_set_bounds purple_plugin_pref_set_bounds
    +#define gaim_plugin_pref_get_bounds purple_plugin_pref_get_bounds
    +#define gaim_plugin_pref_set_type purple_plugin_pref_set_type
    +#define gaim_plugin_pref_get_type purple_plugin_pref_get_type
    +#define gaim_plugin_pref_add_choice purple_plugin_pref_add_choice
    +#define gaim_plugin_pref_get_choices purple_plugin_pref_get_choices
    +#define gaim_plugin_pref_set_max_length purple_plugin_pref_set_max_length
    +#define gaim_plugin_pref_get_max_length purple_plugin_pref_get_max_length
    +#define gaim_plugin_pref_set_masked purple_plugin_pref_set_masked
    +#define gaim_plugin_pref_get_masked purple_plugin_pref_get_masked
    +#define gaim_plugin_pref_set_format_type purple_plugin_pref_set_format_type
    +#define gaim_plugin_pref_get_format_type purple_plugin_pref_get_format_type
    +
    +/* from pounce.h */
    +
    +#define GaimPounce PurplePounce
    +
    +#define GAIM_POUNCE_NONE PURPLE_POUNCE_NONE
    +#define GAIM_POUNCE_SIGNON PURPLE_POUNCE_SIGNON
    +#define GAIM_POUNCE_SIGNOFF PURPLE_POUNCE_SIGNOFF
    +#define GAIM_POUNCE_AWAY PURPLE_POUNCE_AWAY
    +#define GAIM_POUNCE_AWAY_RETURN PURPLE_POUNCE_AWAY_RETURN
    +#define GAIM_POUNCE_IDLE PURPLE_POUNCE_IDLE
    +#define GAIM_POUNCE_IDLE_RETURN PURPLE_POUNCE_IDLE_RETURN
    +#define GAIM_POUNCE_TYPING PURPLE_POUNCE_TYPING
    +#define GAIM_POUNCE_TYPED PURPLE_POUNCE_TYPED
    +#define GAIM_POUNCE_TYPING_STOPPED PURPLE_POUNCE_TYPING_STOPPED
    +#define GAIM_POUNCE_MESSAGE_RECEIVED PURPLE_POUNCE_MESSAGE_RECEIVED
    +#define GaimPounceEvent PurplePounceEvent
    +
    +#define GAIM_POUNCE_OPTION_NONE PURPLE_POUNCE_OPTION_NONE
    +#define GAIM_POUNCE_OPTION_AWAY PURPLE_POUNCE_OPTION_AWAY
    +#define GaimPounceOption PurplePounceOption
    +
    +#define GaimPounceCb PurplePounceCb
    +
    +#define gaim_pounce_new purple_pounce_new
    +#define gaim_pounce_destroy purple_pounce_destroy
    +#define gaim_pounce_destroy_all_by_account purple_pounce_destroy_all_by_account
    +#define gaim_pounce_set_events purple_pounce_set_events
    +#define gaim_pounce_set_options purple_pounce_set_options
    +#define gaim_pounce_set_pouncer purple_pounce_set_pouncer
    +#define gaim_pounce_set_pouncee purple_pounce_set_pouncee
    +#define gaim_pounce_set_save purple_pounce_set_save
    +#define gaim_pounce_action_register purple_pounce_action_register
    +#define gaim_pounce_action_set_enabled purple_pounce_action_set_enabled
    +#define gaim_pounce_action_set_attribute purple_pounce_action_set_attribute
    +#define gaim_pounce_set_data purple_pounce_set_data
    +#define gaim_pounce_get_events purple_pounce_get_events
    +#define gaim_pounce_get_options purple_pounce_get_options
    +#define gaim_pounce_get_pouncer purple_pounce_get_pouncer
    +#define gaim_pounce_get_pouncee purple_pounce_get_pouncee
    +#define gaim_pounce_get_save purple_pounce_get_save
    +#define gaim_pounce_action_is_enabled purple_pounce_action_is_enabled
    +#define gaim_pounce_action_get_attribute purple_pounce_action_get_attribute
    +#define gaim_pounce_get_data purple_pounce_get_data
    +#define gaim_pounce_execute purple_pounce_execute
    +
    +#define gaim_find_pounce purple_find_pounce
    +#define gaim_pounces_load purple_pounces_load
    +#define gaim_pounces_register_handler purple_pounces_register_handler
    +#define gaim_pounces_unregister_handler purple_pounces_unregister_handler
    +#define gaim_pounces_get_all purple_pounces_get_all
    +#define gaim_pounces_get_handle purple_pounces_get_handle
    +#define gaim_pounces_init purple_pounces_init
    +#define gaim_pounces_uninit purple_pounces_uninit
    +
    +/* from prefs.h */
    +
    +
    +#define GAIM_PREF_NONE PURPLE_PREF_NONE
    +#define GAIM_PREF_BOOLEAN PURPLE_PREF_BOOLEAN
    +#define GAIM_PREF_INT PURPLE_PREF_INT
    +#define GAIM_PREF_STRING PURPLE_PREF_STRING
    +#define GAIM_PREF_STRING_LIST PURPLE_PREF_STRING_LIST
    +#define GAIM_PREF_PATH PURPLE_PREF_PATH
    +#define GAIM_PREF_PATH_LIST PURPLE_PREF_PATH_LIST
    +#define GaimPrefType PurplePrefType
    +
    +#define GaimPrefCallback PurplePrefCallback
    +
    +#define gaim_prefs_get_handle purple_prefs_get_handle
    +#define gaim_prefs_init purple_prefs_init
    +#define gaim_prefs_uninit purple_prefs_uninit
    +#define gaim_prefs_add_none purple_prefs_add_none
    +#define gaim_prefs_add_bool purple_prefs_add_bool
    +#define gaim_prefs_add_int purple_prefs_add_int
    +#define gaim_prefs_add_string purple_prefs_add_string
    +#define gaim_prefs_add_string_list purple_prefs_add_string_list
    +#define gaim_prefs_add_path purple_prefs_add_path
    +#define gaim_prefs_add_path_list purple_prefs_add_path_list
    +#define gaim_prefs_remove purple_prefs_remove
    +#define gaim_prefs_rename purple_prefs_rename
    +#define gaim_prefs_rename_boolean_toggle purple_prefs_rename_boolean_toggle
    +#define gaim_prefs_destroy purple_prefs_destroy
    +#define gaim_prefs_set_generic purple_prefs_set_generic
    +#define gaim_prefs_set_bool purple_prefs_set_bool
    +#define gaim_prefs_set_int purple_prefs_set_int
    +#define gaim_prefs_set_string purple_prefs_set_string
    +#define gaim_prefs_set_string_list purple_prefs_set_string_list
    +#define gaim_prefs_set_path purple_prefs_set_path
    +#define gaim_prefs_set_path_list purple_prefs_set_path_list
    +#define gaim_prefs_exists purple_prefs_exists
    +#define gaim_prefs_get_type purple_prefs_get_type
    +#define gaim_prefs_get_bool purple_prefs_get_bool
    +#define gaim_prefs_get_int purple_prefs_get_int
    +#define gaim_prefs_get_string purple_prefs_get_string
    +#define gaim_prefs_get_string_list purple_prefs_get_string_list
    +#define gaim_prefs_get_path purple_prefs_get_path
    +#define gaim_prefs_get_path_list purple_prefs_get_path_list
    +#define gaim_prefs_connect_callback purple_prefs_connect_callback
    +#define gaim_prefs_disconnect_callback purple_prefs_disconnect_callback
    +#define gaim_prefs_disconnect_by_handle purple_prefs_disconnect_by_handle
    +#define gaim_prefs_trigger_callback purple_prefs_trigger_callback
    +#define gaim_prefs_load purple_prefs_load
    +#define gaim_prefs_update_old purple_prefs_update_old
    +
    +/* from privacy.h */
    +
    +#define GAIM_PRIVACY_ALLOW_ALL PURPLE_PRIVACY_ALLOW_ALL
    +#define GAIM_PRIVACY_DENY_ALL PURPLE_PRIVACY_DENY_ALL
    +#define GAIM_PRIVACY_ALLOW_USERS PURPLE_PRIVACY_ALLOW_USERS
    +#define GAIM_PRIVACY_DENY_USERS PURPLE_PRIVACY_DENY_USERS
    +#define GAIM_PRIVACY_ALLOW_BUDDYLIST PURPLE_PRIVACY_ALLOW_BUDDYLIST
    +#define GaimPrivacyType PurplePrivacyType
    +
    +#define GaimPrivacyUiOps PurplePrivacyUiOps
    +
    +#define gaim_privacy_permit_add purple_privacy_permit_add
    +#define gaim_privacy_permit_remove purple_privacy_permit_remove
    +#define gaim_privacy_deny_add purple_privacy_deny_add
    +#define gaim_privacy_deny_remove purple_privacy_deny_remove
    +#define gaim_privacy_allow purple_privacy_allow
    +#define gaim_privacy_deny purple_privacy_deny
    +#define gaim_privacy_check purple_privacy_check
    +#define gaim_privacy_set_ui_ops purple_privacy_set_ui_ops
    +#define gaim_privacy_get_ui_ops purple_privacy_get_ui_ops
    +#define gaim_privacy_init purple_privacy_init
    +
    +/* from proxy.h */
    +
    +#define GAIM_PROXY_USE_GLOBAL PURPLE_PROXY_USE_GLOBAL
    +#define GAIM_PROXY_NONE PURPLE_PROXY_NONE
    +#define GAIM_PROXY_HTTP PURPLE_PROXY_HTTP
    +#define GAIM_PROXY_SOCKS4 PURPLE_PROXY_SOCKS4
    +#define GAIM_PROXY_SOCKS5 PURPLE_PROXY_SOCKS5
    +#define GAIM_PROXY_USE_ENVVAR PURPLE_PROXY_USE_ENVVAR
    +#define GaimProxyType PurpleProxyType
    +
    +#define GaimProxyInfo PurpleProxyInfo
    +
    +#define GaimProxyConnectData PurpleProxyConnectData
    +#define GaimProxyConnectFunction PurpleProxyConnectFunction
    +
    +#define gaim_proxy_info_new purple_proxy_info_new
    +#define gaim_proxy_info_destroy purple_proxy_info_destroy
    +#define gaim_proxy_info_set_type purple_proxy_info_set_type
    +#define gaim_proxy_info_set_host purple_proxy_info_set_host
    +#define gaim_proxy_info_set_port purple_proxy_info_set_port
    +#define gaim_proxy_info_set_username purple_proxy_info_set_username
    +#define gaim_proxy_info_set_password purple_proxy_info_set_password
    +#define gaim_proxy_info_get_type purple_proxy_info_get_type
    +#define gaim_proxy_info_get_host purple_proxy_info_get_host
    +#define gaim_proxy_info_get_port purple_proxy_info_get_port
    +#define gaim_proxy_info_get_username purple_proxy_info_get_username
    +#define gaim_proxy_info_get_password purple_proxy_info_get_password
    +
    +#define gaim_global_proxy_get_info purple_global_proxy_get_info
    +#define gaim_proxy_get_handle purple_proxy_get_handle
    +#define gaim_proxy_init purple_proxy_init
    +#define gaim_proxy_uninit purple_proxy_uninit
    +#define gaim_proxy_get_setup purple_proxy_get_setup
    +
    +#define gaim_proxy_connect purple_proxy_connect
    +#define gaim_proxy_connect_socks5 purple_proxy_connect_socks5
    +#define gaim_proxy_connect_cancel purple_proxy_connect_cancel
    +#define gaim_proxy_connect_cancel_with_handle purple_proxy_connect_cancel_with_handle
    +
    +/* from prpl.h */
    +
    +#define GaimPluginProtocolInfo PurplePluginProtocolInfo
    +
    +#define GAIM_ICON_SCALE_DISPLAY PURPLE_ICON_SCALE_DISPLAY
    +#define GAIM_ICON_SCALE_SEND PURPLE_ICON_SCALE_SEND
    +#define GaimIconScaleRules PurpleIconScaleRules
    +
    +#define GaimBuddyIconSpec PurpleBuddyIconSpec
    +
    +#define GaimProtocolOptions PurpleProtocolOptions
    +
    +#define GAIM_IS_PROTOCOL_PLUGIN PURPLE_IS_PROTOCOL_PLUGIN
    +
    +#define GAIM_PLUGIN_PROTOCOL_INFO PURPLE_PLUGIN_PROTOCOL_INFO
    +
    +#define gaim_prpl_got_account_idle purple_prpl_got_account_idle
    +#define gaim_prpl_got_account_login_time purple_prpl_got_account_login_time
    +#define gaim_prpl_got_account_status purple_prpl_got_account_status
    +#define gaim_prpl_got_user_idle purple_prpl_got_user_idle
    +#define gaim_prpl_got_user_login_time purple_prpl_got_user_login_time
    +#define gaim_prpl_got_user_status purple_prpl_got_user_status
    +#define gaim_prpl_change_account_status purple_prpl_change_account_status
    +#define gaim_prpl_get_statuses purple_prpl_get_statuses
    +
    +#define gaim_find_prpl purple_find_prpl
    +
    +/* from request.h */
    +
    +#define GAIM_DEFAULT_ACTION_NONE PURPLE_DEFAULT_ACTION_NONE
    +
    +#define GAIM_REQUEST_INPUT PURPLE_REQUEST_INPUT
    +#define GAIM_REQUEST_CHOICE PURPLE_REQUEST_CHOICE
    +#define GAIM_REQUEST_ACTION PURPLE_REQUEST_ACTION
    +#define GAIM_REQUEST_FIELDS PURPLE_REQUEST_FIELDS
    +#define GAIM_REQUEST_FILE PURPLE_REQUEST_FILE
    +#define GAIM_REQUEST_FOLDER PURPLE_REQUEST_FOLDER
    +#define GaimRequestType PurpleRequestType
    +
    +#define GAIM_REQUEST_FIELD_NONE PURPLE_REQUEST_FIELD_NONE
    +#define GAIM_REQUEST_FIELD_STRING PURPLE_REQUEST_FIELD_STRING
    +#define GAIM_REQUEST_FIELD_INTEGER PURPLE_REQUEST_FIELD_INTEGER
    +#define GAIM_REQUEST_FIELD_BOOLEAN PURPLE_REQUEST_FIELD_BOOLEAN
    +#define GAIM_REQUEST_FIELD_CHOICE PURPLE_REQUEST_FIELD_CHOICE
    +#define GAIM_REQUEST_FIELD_LIST PURPLE_REQUEST_FIELD_LIST
    +#define GAIM_REQUEST_FIELD_LABEL PURPLE_REQUEST_FIELD_LABEL
    +#define GAIM_REQUEST_FIELD_IMAGE PURPLE_REQUEST_FIELD_IMAGE
    +#define GAIM_REQUEST_FIELD_ACCOUNT PURPLE_REQUEST_FIELD_ACCOUNT
    +#define GaimRequestFieldType PurpleRequestFieldType
    +
    +#define GaimRequestFields PurpleRequestFields
    +
    +#define GaimRequestFieldGroup PurpleRequestFieldGroup
    +
    +#define GaimRequestField PurpleRequestField
    +
    +#define GaimRequestUiOps PurpleRequestUiOps
    +
    +#define GaimRequestInputCb PurpleRequestInputCb
    +#define GaimRequestActionCb PurpleRequestActionCb
    +#define GaimRequestChoiceCb PurpleRequestChoiceCb
    +#define GaimRequestFieldsCb PurpleRequestFieldsCb
    +#define GaimRequestFileCb PurpleRequestFileCb
    +
    +#define gaim_request_fields_new purple_request_fields_new
    +#define gaim_request_fields_destroy purple_request_fields_destroy
    +#define gaim_request_fields_add_group purple_request_fields_add_group
    +#define gaim_request_fields_get_groups purple_request_fields_get_groups
    +#define gaim_request_fields_exists purple_request_fields_exists
    +#define gaim_request_fields_get_required purple_request_fields_get_required
    +#define gaim_request_fields_is_field_required purple_request_fields_is_field_required
    +#define gaim_request_fields_all_required_filled purple_request_fields_all_required_filled
    +#define gaim_request_fields_get_field purple_request_fields_get_field
    +#define gaim_request_fields_get_string purple_request_fields_get_string
    +#define gaim_request_fields_get_integer purple_request_fields_get_integer
    +#define gaim_request_fields_get_bool purple_request_fields_get_bool
    +#define gaim_request_fields_get_choice purple_request_fields_get_choice
    +#define gaim_request_fields_get_account purple_request_fields_get_account
    +
    +#define gaim_request_field_group_new purple_request_field_group_new
    +#define gaim_request_field_group_destroy purple_request_field_group_destroy
    +#define gaim_request_field_group_add_field purple_request_field_group_add_field
    +#define gaim_request_field_group_get_title purple_request_field_group_get_title
    +#define gaim_request_field_group_get_fields purple_request_field_group_get_fields
    +
    +#define gaim_request_field_new purple_request_field_new
    +#define gaim_request_field_destroy purple_request_field_destroy
    +#define gaim_request_field_set_label purple_request_field_set_label
    +#define gaim_request_field_set_visible purple_request_field_set_visible
    +#define gaim_request_field_set_type_hint purple_request_field_set_type_hint
    +#define gaim_request_field_set_required purple_request_field_set_required
    +#define gaim_request_field_get_type purple_request_field_get_type
    +#define gaim_request_field_get_id purple_request_field_get_id
    +#define gaim_request_field_get_label purple_request_field_get_label
    +#define gaim_request_field_is_visible purple_request_field_is_visible
    +#define gaim_request_field_get_type_hint purple_request_field_get_type_hint
    +#define gaim_request_field_is_required purple_request_field_is_required
    +
    +#define gaim_request_field_string_new purple_request_field_string_new
    +#define gaim_request_field_string_set_default_value \
    + purple_request_field_string_set_default_value
    +#define gaim_request_field_string_set_value purple_request_field_string_set_value
    +#define gaim_request_field_string_set_masked purple_request_field_string_set_masked
    +#define gaim_request_field_string_set_editable purple_request_field_string_set_editable
    +#define gaim_request_field_string_get_default_value \
    + purple_request_field_string_get_default_value
    +#define gaim_request_field_string_get_value purple_request_field_string_get_value
    +#define gaim_request_field_string_is_multiline purple_request_field_string_is_multiline
    +#define gaim_request_field_string_is_masked purple_request_field_string_is_masked
    +#define gaim_request_field_string_is_editable purple_request_field_string_is_editable
    +
    +#define gaim_request_field_int_new purple_request_field_int_new
    +#define gaim_request_field_int_set_default_value \
    + purple_request_field_int_set_default_value
    +#define gaim_request_field_int_set_value purple_request_field_int_set_value
    +#define gaim_request_field_int_get_default_value \
    + purple_request_field_int_get_default_value
    +#define gaim_request_field_int_get_value purple_request_field_int_get_value
    +
    +#define gaim_request_field_bool_new purple_request_field_bool_new
    +#define gaim_request_field_bool_set_default_value \
    + purple_request_field_book_set_default_value
    +#define gaim_request_field_bool_set_value purple_request_field_bool_set_value
    +#define gaim_request_field_bool_get_default_value \
    + purple_request_field_bool_get_default_value
    +#define gaim_request_field_bool_get_value purple_request_field_bool_get_value
    +
    +#define gaim_request_field_choice_new purple_request_field_choice_new
    +#define gaim_request_field_choice_add purple_request_field_choice_add
    +#define gaim_request_field_choice_set_default_value \
    + purple_request_field_choice_set_default_value
    +#define gaim_request_field_choice_set_value purple_request_field_choice_set_value
    +#define gaim_request_field_choice_get_default_value \
    + purple_request_field_choice_get_default_value
    +#define gaim_request_field_choice_get_value purple_request_field_choice_get_value
    +#define gaim_request_field_choice_get_labels purple_request_field_choice_get_labels
    +
    +#define gaim_request_field_list_new purple_request_field_list_new
    +#define gaim_request_field_list_set_multi_select purple_request_field_list_set_multi_select
    +#define gaim_request_field_list_get_multi_select purple_request_field_list_get_multi_select
    +#define gaim_request_field_list_get_data purple_request_field_list_get_data
    +#define gaim_request_field_list_add purple_request_field_list_add
    +#define gaim_request_field_list_add_selected purple_request_field_list_add_selected
    +#define gaim_request_field_list_clear_selected purple_request_field_list_clear_selected
    +#define gaim_request_field_list_set_selected purple_request_field_list_set_selected
    +#define gaim_request_field_list_is_selected purple_request_field_list_is_selected
    +#define gaim_request_field_list_get_selected purple_request_field_list_get_selected
    +#define gaim_request_field_list_get_items purple_request_field_list_get_items
    +
    +#define gaim_request_field_label_new purple_request_field_label_new
    +
    +#define gaim_request_field_image_new purple_request_field_image_new
    +#define gaim_request_field_image_set_scale purple_request_field_image_set_scale
    +#define gaim_request_field_image_get_buffer purple_request_field_image_get_buffer
    +#define gaim_request_field_image_get_size purple_request_field_image_get_size
    +#define gaim_request_field_image_get_scale_x purple_request_field_image_get_scale_x
    +#define gaim_request_field_image_get_scale_y purple_request_field_image_get_scale_y
    +
    +#define gaim_request_field_account_new purple_request_field_account_new
    +#define gaim_request_field_account_set_default_value purple_request_field_account_set_default_value
    +#define gaim_request_field_account_set_value purple_request_field_account_set_value
    +#define gaim_request_field_account_set_show_all purple_request_field_account_set_show_all
    +#define gaim_request_field_account_set_filter purple_request_field_account_set_filter
    +#define gaim_request_field_account_get_default_value purple_request_field_account_get_default_value
    +#define gaim_request_field_account_get_value purple_request_field_account_get_value
    +#define gaim_request_field_account_get_show_all purple_request_field_account_get_show_all
    +#define gaim_request_field_account_get_filter purple_request_field_account_get_filter
    +
    +#define gaim_request_input purple_request_input
    +#define gaim_request_choice purple_request_choice
    +#define gaim_request_choice_varg purple_request_choice_varg
    +#define gaim_request_action purple_request_action
    +#define gaim_request_action_varg purple_request_action_varg
    +#define gaim_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, user_data) purple_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, NULL, NULL, NULL, user_data)
    +#define gaim_request_close purple_request_close
    +#define gaim_request_close_with_handle purple_request_close_with_handle
    +
    +#define gaim_request_yes_no purple_request_yes_no
    +#define gaim_request_ok_cancel purple_request_ok_cancel
    +#define gaim_request_accept_cancel purple_request_accept_cancel
    +
    +#define gaim_request_file purple_request_file
    +#define gaim_request_folder purple_request_folder
    +
    +#define gaim_request_set_ui_ops purple_request_set_ui_ops
    +#define gaim_request_get_ui_ops purple_request_get_ui_ops
    +
    +/* from roomlist.h */
    +
    +#define GaimRoomlist PurpleRoomlist
    +#define GaimRoomlistRoom PurpleRoomlistRoom
    +#define GaimRoomlistField PurpleRoomlistField
    +#define GaimRoomlistUiOps PurpleRoomlistUiOps
    +
    +#define GAIM_ROOMLIST_ROOMTYPE_CATEGORY PURPLE_ROOMLIST_ROOMTYPE_CATEGORY
    +#define GAIM_ROOMLIST_ROOMTYPE_ROOM PURPLE_ROOMLIST_ROOMTYPE_ROOM
    +#define GaimRoomlistRoomType PurpleRoomlistRoomType
    +
    +#define GAIM_ROOMLIST_FIELD_BOOL PURPLE_ROOMLIST_BOOL
    +#define GAIM_ROOMLIST_FIELD_INT PURPLE_ROOMLIST_INT
    +#define GAIM_ROOMLIST_FIELD_STRING PURPLE_ROOMLIST_STRING
    +#define GaimRoomlistFieldType PurpleRoomlistFieldType
    +
    +#define gaim_roomlist_show_with_account purple_roomlist_show_with_account
    +#define gaim_roomlist_new purple_roomlist_new
    +#define gaim_roomlist_ref purple_roomlist_ref
    +#define gaim_roomlist_unref purple_roomlist_unref
    +#define gaim_roomlist_set_fields purple_roomlist_set_fields
    +#define gaim_roomlist_set_in_progress purple_roomlist_set_in_progress
    +#define gaim_roomlist_get_in_progress purple_roomlist_get_in_progress
    +#define gaim_roomlist_room_add purple_roomlist_room_add
    +
    +#define gaim_roomlist_get_list purple_roomlist_get_list
    +#define gaim_roomlist_cancel_get_list purple_roomlist_cancel_get_list
    +#define gaim_roomlist_expand_category purple_roomlist_expand_category
    +
    +#define gaim_roomlist_room_new purple_roomlist_room_new
    +#define gaim_roomlist_room_add_field purple_roomlist_room_add_field
    +#define gaim_roomlist_room_join purple_roomlist_room_join
    +#define gaim_roomlist_field_new purple_roomlist_field_new
    +
    +#define gaim_roomlist_set_ui_ops purple_roomlist_set_ui_ops
    +#define gaim_roomlist_get_ui_ops purple_roomlist_get_ui_ops
    +
    +/* from savedstatuses.h */
    +
    +#define GaimSavedStatus PurpleSavedStatus
    +#define GaimSavedStatusSub PurpleSavedStatusSub
    +
    +#define gaim_savedstatus_new purple_savedstatus_new
    +#define gaim_savedstatus_set_title purple_savedstatus_set_title
    +#define gaim_savedstatus_set_type purple_savedstatus_set_type
    +#define gaim_savedstatus_set_message purple_savedstatus_set_message
    +#define gaim_savedstatus_set_substatus purple_savedstatus_set_substatus
    +#define gaim_savedstatus_unset_substatus purple_savedstatus_unset_substatus
    +#define gaim_savedstatus_delete purple_savedstatus_delete
    +
    +#define gaim_savedstatuses_get_all purple_savedstatuses_get_all
    +#define gaim_savedstatuses_get_popular purple_savedstatuses_get_popular
    +#define gaim_savedstatus_get_current purple_savedstatus_get_current
    +#define gaim_savedstatus_get_default purple_savedstatus_get_default
    +#define gaim_savedstatus_get_idleaway purple_savedstatus_get_idleaway
    +#define gaim_savedstatus_is_idleaway purple_savedstatus_is_idleaway
    +#define gaim_savedstatus_set_idleaway purple_savedstatus_set_idleaway
    +#define gaim_savedstatus_get_startup purple_savedstatus_get_startup
    +#define gaim_savedstatus_find purple_savedstatus_find
    +#define gaim_savedstatus_find_by_creation_time purple_savedstatus_find_by_creation_time
    +#define gaim_savedstatus_find_transient_by_type_and_message \
    + purple_savedstatus_find_transient_by_type_and_message
    +
    +#define gaim_savedstatus_is_transient purple_savedstatus_is_transient
    +#define gaim_savedstatus_get_title purple_savedstatus_get_title
    +#define gaim_savedstatus_get_type purple_savedstatus_get_type
    +#define gaim_savedstatus_get_message purple_savedstatus_get_message
    +#define gaim_savedstatus_get_creation_time purple_savedstatus_get_creation_time
    +#define gaim_savedstatus_has_substatuses purple_savedstatus_has_substatuses
    +#define gaim_savedstatus_get_substatus purple_savedstatus_get_substatus
    +#define gaim_savedstatus_substatus_get_type purple_savedstatus_substatus_get_type
    +#define gaim_savedstatus_substatus_get_message purple_savedstatus_substatus_get_message
    +#define gaim_savedstatus_activate purple_savedstatus_activate
    +#define gaim_savedstatus_activate_for_account purple_savedstatus_activate_for_account
    +
    +#define gaim_savedstatuses_get_handle purple_savedstatuses_get_handle
    +#define gaim_savedstatuses_init purple_savedstatuses_init
    +#define gaim_savedstatuses_uninit purple_savedstatuses_uninit
    +
    +/* from signals.h */
    +
    +#define GAIM_CALLBACK PURPLE_CALLBACK
    +
    +#define GaimCallback PurpleCallback
    +#define GaimSignalMarshalFunc PurpleSignalMarshalFunc
    +
    +#define GAIM_SIGNAL_PRIORITY_DEFAULT PURPLE_SIGNAL_PRIORITY_DEFAULT
    +#define GAIM_SIGNAL_PRIORITY_HIGHEST PURPLE_SIGNAL_PRIORITY_HIGHEST
    +#define GAIM_SIGNAL_PRIORITY_LOWEST PURPLE_SIGNAL_PRIORITY_LOWEST
    +
    +#define gaim_signal_register purple_signal_register
    +#define gaim_signal_unregister purple_signal_unregister
    +
    +#define gaim_signals_unregister_by_instance purple_signals_unregister_by_instance
    +
    +#define gaim_signal_get_values purple_signal_get_values
    +#define gaim_signal_connect_priority purple_signal_connect_priority
    +#define gaim_signal_connect purple_signal_connect
    +#define gaim_signal_connect_priority_vargs purple_signal_connect_priority_vargs
    +#define gaim_signal_connect_vargs purple_signal_connect_vargs
    +#define gaim_signal_disconnect purple_signal_disconnect
    +
    +#define gaim_signals_disconnect_by_handle purple_signals_disconnect_by_handle
    +
    +#define gaim_signal_emit purple_signal_emit
    +#define gaim_signal_emit_vargs purple_signal_emit_vargs
    +#define gaim_signal_emit_return_1 purple_signal_emit_vargs
    +#define gaim_signal_emit_vargs_return_1 purple_signal_emit_vargs_return_1
    +
    +#define gaim_signals_init purple_signals_init
    +#define gaim_signals_uninit purple_signals_uninit
    +
    +#define gaim_marshal_VOID \
    + purple_marshal_VOID
    +#define gaim_marshal_VOID__INT \
    + purple_marshal_VOID__INT
    +#define gaim_marshal_VOID__INT_INT \
    + purple_marshal_VOID_INT_INT
    +#define gaim_marshal_VOID__POINTER \
    + purple_marshal_VOID__POINTER
    +#define gaim_marshal_VOID__POINTER_UINT \
    + purple_marshal_VOID__POINTER_UINT
    +#define gaim_marshal_VOID__POINTER_INT_INT \
    + purple_marshal_VOID__POINTER_INT_INT
    +#define gaim_marshal_VOID__POINTER_POINTER \
    + purple_marshal_VOID__POINTER_POINTER
    +#define gaim_marshal_VOID__POINTER_POINTER_UINT \
    + purple_marshal_VOID__POINTER_POINTER_UINT
    +#define gaim_marshal_VOID__POINTER_POINTER_UINT_UINT \
    + purple_marshal_VOID__POINTER_POINTER_UINT_UINT
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER \
    + purple_marshal_VOID__POINTER_POINTER_POINTER
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER \
    + purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER \
    + purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT \
    + purple_marshal_VOID__POINTER_POINTER_POINTER_UINT
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT \
    + purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT
    +#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT \
    + purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT
    +
    +#define gaim_marshal_INT__INT \
    + purple_marshal_INT__INT
    +#define gaim_marshal_INT__INT_INT \
    + purple_marshal_INT__INT_INT
    +#define gaim_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER \
    + purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER
    +
    +#define gaim_marshal_BOOLEAN__POINTER \
    + purple_marshal_BOOLEAN__POINTER
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER \
    + purple_marshal_BOOLEAN__POINTER_POINTER
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER \
    + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER_UINT \
    + purple_marshal_BOOLEAN__POINTER_POINTER_UINT
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT \
    + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER \
    + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER
    +#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER \
    + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER
    +
    +#define gaim_marshal_BOOLEAN__INT_POINTER \
    + purple_marshal_BOOLEAN__INT_POINTER
    +
    +#define gaim_marshal_POINTER__POINTER_INT \
    + purple_marshal_POINTER__POINTER_INT
    +#define gaim_marshal_POINTER__POINTER_INT64 \
    + purple_marshal_POINTER__POINTER_INT64
    +#define gaim_marshal_POINTER__POINTER_INT_BOOLEAN \
    + purple_marshal_POINTER__POINTER_INT_BOOLEAN
    +#define gaim_marshal_POINTER__POINTER_INT64_BOOLEAN \
    + purple_marshal_POINTER__POINTER_INT64_BOOLEAN
    +#define gaim_marshal_POINTER__POINTER_POINTER \
    + purple_marshal_POINTER__POINTER_POINTER
    +
    +/* from sound.h */
    +
    +#define GAIM_SOUND_BUDDY_ARRIVE PURPLE_SOUND_BUDDY_ARRIVE
    +#define GAIM_SOUND_BUDDY_LEAVE PURPLE_SOUND_BUDDY_LEAVE
    +#define GAIM_SOUND_RECEIVE PURPLE_SOUND_RECEIVE
    +#define GAIM_SOUND_FIRST_RECEIVE PURPLE_SOUND_FIRST_RECEIVE
    +#define GAIM_SOUND_SEND PURPLE_SOUND_SEND
    +#define GAIM_SOUND_CHAT_JOIN PURPLE_SOUND_CHAT_JOIN
    +#define GAIM_SOUND_CHAT_LEAVE PURPLE_SOUND_CHAT_LEAVE
    +#define GAIM_SOUND_CHAT_YOU_SAY PURPLE_SOUND_CHAT_YOU_SAY
    +#define GAIM_SOUND_CHAT_SAY PURPLE_SOUND_CHAT_SAY
    +#define GAIM_SOUND_POUNCE_DEFAULT PURPLE_SOUND_POUNCE_DEFAULT
    +#define GAIM_SOUND_CHAT_NICK PURPLE_SOUND_CHAT_NICK
    +#define GAIM_NUM_SOUNDS PURPLE_NUM_SOUNDS
    +#define GaimSoundEventID PurpleSoundEventID
    +
    +#define GaimSoundUiOps PurpleSoundUiOps
    +
    +#define gaim_sound_play_file purple_sound_play_file
    +#define gaim_sound_play_event purple_sound_play_event
    +#define gaim_sound_set_ui_ops purple_sound_set_ui_ops
    +#define gaim_sound_get_ui_ops purple_sound_get_ui_ops
    +#define gaim_sound_init purple_sound_init
    +#define gaim_sound_uninit purple_sound_uninit
    +
    +#define gaim_sounds_get_handle purple_sounds_get_handle
    +
    +/* from sslconn.h */
    +
    +#define GAIM_SSL_DEFAULT_PORT PURPLE_SSL_DEFAULT_PORT
    +
    +#define GAIM_SSL_HANDSHAKE_FAILED PURPLE_SSL_HANDSHAKE_FAILED
    +#define GAIM_SSL_CONNECT_FAILED PURPLE_SSL_CONNECT_FAILED
    +#define GaimSslErrorType PurpleSslErrorType
    +
    +#define GaimSslConnection PurpleSslConnection
    +
    +#define GaimSslInputFunction PurpleSslInputFunction
    +#define GaimSslErrorFunction PurpleSslErrorFunction
    +
    +#define GaimSslOps PurpleSslOps
    +
    +#define gaim_ssl_is_supported purple_ssl_is_supported
    +#define gaim_ssl_connect purple_ssl_connect
    +#define gaim_ssl_connect_fd purple_ssl_connect_fd
    +#define gaim_ssl_input_add purple_ssl_input_add
    +#define gaim_ssl_close purple_ssl_close
    +#define gaim_ssl_read purple_ssl_read
    +#define gaim_ssl_write purple_ssl_write
    +
    +#define gaim_ssl_set_ops purple_ssl_set_ops
    +#define gaim_ssl_get_ops purple_ssl_get_ops
    +#define gaim_ssl_init purple_ssl_init
    +#define gaim_ssl_uninit purple_ssl_uninit
    +
    +/* from status.h */
    +
    +#define GaimStatusType PurpleStatusType
    +#define GaimStatusAttr PurpleStatusAttr
    +#define GaimPresence PurplePresence
    +#define GaimStatus PurpleStatus
    +
    +#define GAIM_PRESENCE_CONTEXT_UNSET PURPLE_PRESENCE_CONTEXT_UNSET
    +#define GAIM_PRESENCE_CONTEXT_ACCOUNT PURPLE_PRESENCE_CONTEXT_ACCOUNT
    +#define GAIM_PRESENCE_CONTEXT_CONV PURPLE_PRESENCE_CONTEXT_CONV
    +#define GAIM_PRESENCE_CONTEXT_BUDDY PURPLE_PRESENCE_CONTEXT_BUDDY
    +#define GaimPresenceContext PurplePresenceContext
    +
    +#define GAIM_STATUS_UNSET PURPLE_STATUS_UNSET
    +#define GAIM_STATUS_OFFLINE PURPLE_STATUS_OFFLINE
    +#define GAIM_STATUS_AVAILABLE PURPLE_STATUS_AVAILABLE
    +#define GAIM_STATUS_UNAVAILABLE PURPLE_STATUS_UNAVAILABLE
    +#define GAIM_STATUS_INVISIBLE PURPLE_STATUS_INVISIBLE
    +#define GAIM_STATUS_AWAY PURPLE_STATUS_AWAY
    +#define GAIM_STATUS_EXTENDED_AWAY PURPLE_STATUS_EXTENDED_AWAY
    +#define GAIM_STATUS_MOBILE PURPLE_STATUS_MOBILE
    +#define GAIM_STATUS_NUM_PRIMITIVES PURPLE_STATUS_NUM_PRIMITIVES
    +#define GaimStatusPrimitive PurpleStatusPrimitive
    +
    +#define gaim_primitive_get_id_from_type purple_primitive_get_id_from_type
    +#define gaim_primitive_get_name_from_type purple_primitive_get_name_from_type
    +#define gaim_primitive_get_type_from_id purple_primitive_get_type_from_id
    +
    +#define gaim_status_type_new_full purple_status_type_new_full
    +#define gaim_status_type_new purple_status_type_new
    +#define gaim_status_type_new_with_attrs purple_status_type_new_with_attrs
    +#define gaim_status_type_destroy purple_status_type_destroy
    +#define gaim_status_type_set_primary_attr purple_status_type_set_primary_attr
    +#define gaim_status_type_add_attr purple_status_type_add_attr
    +#define gaim_status_type_add_attrs purple_status_type_add_attrs
    +#define gaim_status_type_add_attrs_vargs purple_status_type_add_attrs_vargs
    +#define gaim_status_type_get_primitive purple_status_type_get_primitive
    +#define gaim_status_type_get_id purple_status_type_get_id
    +#define gaim_status_type_get_name purple_status_type_get_name
    +#define gaim_status_type_is_saveable purple_status_type_is_saveable
    +#define gaim_status_type_is_user_settable purple_status_type_is_user_settable
    +#define gaim_status_type_is_independent purple_status_type_is_independent
    +#define gaim_status_type_is_exclusive purple_status_type_is_exclusive
    +#define gaim_status_type_is_available purple_status_type_is_available
    +#define gaim_status_type_get_primary_attr purple_status_type_get_primary_attr
    +#define gaim_status_type_get_attr purple_status_type_get_attr
    +#define gaim_status_type_get_attrs purple_status_type_get_attrs
    +#define gaim_status_type_find_with_id purple_status_type_find_with_id
    +
    +#define gaim_status_attr_new purple_status_attr_new
    +#define gaim_status_attr_destroy purple_status_attr_destroy
    +#define gaim_status_attr_get_id purple_status_attr_get_id
    +#define gaim_status_attr_get_name purple_status_attr_get_name
    +#define gaim_status_attr_get_value purple_status_attr_get_value
    +
    +#define gaim_status_new purple_status_new
    +#define gaim_status_destroy purple_status_destroy
    +#define gaim_status_set_active purple_status_set_active
    +#define gaim_status_set_active_with_attrs purple_status_set_active_with_attrs
    +#define gaim_status_set_active_with_attrs_list purple_status_set_active_with_attrs_list
    +#define gaim_status_set_attr_boolean purple_status_set_attr_boolean
    +#define gaim_status_set_attr_int purple_status_set_attr_int
    +#define gaim_status_set_attr_string purple_status_set_attr_string
    +#define gaim_status_get_type purple_status_get_type
    +#define gaim_status_get_presence purple_status_get_presence
    +#define gaim_status_get_id purple_status_get_id
    +#define gaim_status_get_name purple_status_get_name
    +#define gaim_status_is_independent purple_status_is_independent
    +#define gaim_status_is_exclusive purple_status_is_exclusive
    +#define gaim_status_is_available purple_status_is_available
    +#define gaim_status_is_active purple_status_is_active
    +#define gaim_status_is_online purple_status_is_online
    +#define gaim_status_get_attr_value purple_status_get_attr_value
    +#define gaim_status_get_attr_boolean purple_status_get_attr_boolean
    +#define gaim_status_get_attr_int purple_status_get_attr_int
    +#define gaim_status_get_attr_string purple_status_get_attr_string
    +#define gaim_status_compare purple_status_compare
    +
    +#define gaim_presence_new purple_presence_new
    +#define gaim_presence_new_for_account purple_presence_new_for_account
    +#define gaim_presence_new_for_conv purple_presence_new_for_conv
    +#define gaim_presence_new_for_buddy purple_presence_new_for_buddy
    +#define gaim_presence_destroy purple_presence_destroy
    +#define gaim_presence_add_status purple_presence_add_status
    +#define gaim_presence_add_list purple_presence_add_list
    +#define gaim_presence_set_status_active purple_presence_set_status_active
    +#define gaim_presence_switch_status purple_presence_switch_status
    +#define gaim_presence_set_idle purple_presence_set_idle
    +#define gaim_presence_set_login_time purple_presence_set_login_time
    +#define gaim_presence_get_context purple_presence_get_context
    +#define gaim_presence_get_account purple_presence_get_account
    +#define gaim_presence_get_conversation purple_presence_get_conversation
    +#define gaim_presence_get_chat_user purple_presence_get_chat_user
    +#define gaim_presence_get_statuses purple_presence_get_statuses
    +#define gaim_presence_get_status purple_presence_get_status
    +#define gaim_presence_get_active_status purple_presence_get_active_status
    +#define gaim_presence_is_available purple_presence_is_available
    +#define gaim_presence_is_online purple_presence_is_online
    +#define gaim_presence_is_status_active purple_presence_is_status_active
    +#define gaim_presence_is_status_primitive_active \
    + purple_presence_is_status_primitive_active
    +#define gaim_presence_is_idle purple_presence_is_idle
    +#define gaim_presence_get_idle_time purple_presence_get_idle_time
    +#define gaim_presence_get_login_time purple_presence_get_login_time
    +#define gaim_presence_compare purple_presence_compare
    +
    +#define gaim_status_get_handle purple_status_get_handle
    +#define gaim_status_init purple_status_init
    +#define gaim_status_uninit purple_status_uninit
    +
    +/* from stringref.h */
    +
    +#define GaimStringref PurpleStringref
    +
    +#define gaim_stringref_new purple_stringref_new
    +#define gaim_stringref_new_noref purple_stringref_new_noref
    +#define gaim_stringref_printf purple_stringref_printf
    +#define gaim_stringref_ref purple_stringref_ref
    +#define gaim_stringref_unref purple_stringref_unref
    +#define gaim_stringref_value purple_stringref_value
    +#define gaim_stringref_cmp purple_stringref_cmp
    +#define gaim_stringref_len purple_stringref_len
    +
    +/* from stun.h */
    +
    +#define GaimStunNatDiscovery PurpleStunNatDiscovery
    +
    +#define GAIM_STUN_STATUS_UNDISCOVERED PURPLE_STUN_STATUS_UNDISCOVERED
    +#define GAIM_STUN_STATUS_UNKNOWN PURPLE_STUN_STATUS_UNKNOWN
    +#define GAIM_STUN_STATUS_DISCOVERING PURPLE_STUN_STATUS_DISCOVERING
    +#define GAIM_STUN_STATUS_DISCOVERED PURPLE_STUN_STATUS_DISCOVERED
    +#define GaimStunStatus PurpleStunStatus
    +
    +#define GAIM_STUN_NAT_TYPE_PUBLIC_IP PURPLE_STUN_NAT_TYPE_PUBLIC_IP
    +#define GAIM_STUN_NAT_TYPE_UNKNOWN_NAT PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT
    +#define GAIM_STUN_NAT_TYPE_FULL_CONE PURPLE_STUN_NAT_TYPE_FULL_CONE
    +#define GAIM_STUN_NAT_TYPE_RESTRICTED_CONE PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE
    +#define GAIM_STUN_NAT_TYPE_PORT_RESTRICTED_CONE PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE
    +#define GAIM_STUN_NAT_TYPE_SYMMETRIC PURPLE_STUN_NAT_TYPE_SYMMETRIC
    +#define GaimStunNatType PurpleStunNatType
    +
    +/* why didn't this have a Gaim prefix before? */
    +#define StunCallback PurpleStunCallback
    +
    +#define gaim_stun_discover purple_stun_discover
    +#define gaim_stun_init purple_stun_init
    +
    +/* from upnp.h */
    +
    +/* suggested rename: PurpleUPnpMappingHandle */
    +#define UPnPMappingAddRemove PurpleUPnPMappingAddRemove
    +
    +#define GaimUPnPCallback PurpleUPnPCallback
    +
    +#define gaim_upnp_discover purple_upnp_discover
    +#define gaim_upnp_get_public_ip purple_upnp_get_public_ip
    +#define gaim_upnp_cancel_port_mapping purple_upnp_cancel_port_mapping
    +#define gaim_upnp_set_port_mapping purple_upnp_set_port_mapping
    +
    +#define gaim_upnp_remove_port_mapping purple_upnp_remove_port_mapping
    +
    +/* from util.h */
    +
    +#define GaimUtilFetchUrlData PurpleUtilFetchUrlData
    +#define GaimMenuAction PurpleMenuAction
    +
    +#define GaimInfoFieldFormatCallback PurpleIntoFieldFormatCallback
    +
    +#define GaimKeyValuePair PurpleKeyValuePair
    +
    +#define gaim_menu_action_new purple_menu_action_new
    +#define gaim_menu_action_free purple_menu_action_free
    +
    +#define gaim_base16_encode purple_base16_encode
    +#define gaim_base16_decode purple_base16_decode
    +#define gaim_base64_encode purple_base64_encode
    +#define gaim_base64_decode purple_base64_decode
    +#define gaim_quotedp_decode purple_quotedp_decode
    +
    +#define gaim_mime_decode_field purple_mime_deco_field
    +
    +#define gaim_utf8_strftime purple_utf8_strftime
    +#define gaim_date_format_short purple_date_format_short
    +#define gaim_date_format_long purple_date_format_long
    +#define gaim_date_format_full purple_date_format_full
    +#define gaim_time_format purple_time_format
    +#define gaim_time_build purple_time_build
    +
    +#define GAIM_NO_TZ_OFF PURPLE_NO_TZ_OFF
    +
    +#define gaim_str_to_time purple_str_to_time
    +
    +#define gaim_markup_find_tag purple_markup_find_tag
    +#define gaim_markup_extract_info_field purple_markup_extract_info_field
    +#define gaim_markup_html_to_xhtml purple_markup_html_to_xhtml
    +#define gaim_markup_strip_html purple_markup_strip_html
    +#define gaim_markup_linkify purple_markup_linkify
    +#define gaim_markup_slice purple_markup_slice
    +#define gaim_markup_get_tag_name purple_markup_get_tag_name
    +#define gaim_unescape_html purple_unescape_html
    +
    +#define gaim_home_dir purple_home_dir
    +#define gaim_user_dir purple_user_dir
    +
    +#define gaim_util_set_user_dir purple_util_set_user_dir
    +
    +#define gaim_build_dir purple_build_dir
    +
    +#define gaim_util_write_data_to_file purple_util_write_data_to_file
    +
    +#define gaim_util_read_xml_from_file purple_util_read_xml_from_file
    +
    +#define gaim_mkstemp purple_mkstemp
    +
    +#define gaim_program_is_valid purple_program_is_valid
    +
    +#define gaim_running_gnome purple_running_gnome
    +#define gaim_running_kde purple_running_kde
    +#define gaim_running_osx purple_running_osx
    +
    +#define gaim_fd_get_ip purple_fd_get_ip
    +
    +#define gaim_normalize purple_normalize
    +#define gaim_normalize_nocase purple_normalize_nocase
    +
    +#define gaim_strdup_withhtml purple_strdup_withhtml
    +
    +#define gaim_str_has_prefix purple_str_has_prefix
    +#define gaim_str_has_suffix purple_str_has_suffix
    +#define gaim_str_add_cr purple_str_add_cr
    +#define gaim_str_strip_char purple_str_strip_char
    +
    +#define gaim_util_chrreplace purple_util_chrreplace
    +
    +#define gaim_strreplace purple_strreplace
    +
    +#define gaim_utf8_ncr_encode purple_utf8_ncr_encode
    +#define gaim_utf8_ncr_decode purple_utf8_ncr_decode
    +
    +#define gaim_strcasereplace purple_strcasereplace
    +#define gaim_strcasestr purple_strcasestr
    +
    +#define gaim_str_size_to_units purple_str_size_to_units
    +#define gaim_str_seconds_to_string purple_str_seconds_to_string
    +#define gaim_str_binary_to_ascii purple_str_binary_to_ascii
    +
    +
    +#define gaim_got_protocol_handler_uri purple_got_protocol_handler_uri
    +
    +#define gaim_url_parse purple_url_parse
    +
    +#define GaimUtilFetchUrlCallback PurpleUtilFetchUrlCallback
    +#define gaim_util_fetch_url purple_util_fetch_url
    +#define gaim_util_fetch_url_request purple_util_fetch_url_request
    +#define gaim_util_fetch_url_cancel purple_util_fetch_url_cancel
    +
    +#define gaim_url_decode purple_url_decode
    +#define gaim_url_encode purple_url_encode
    +
    +#define gaim_email_is_valid purple_email_is_valid
    +
    +#define gaim_uri_list_extract_uris purple_uri_list_extract_uris
    +#define gaim_uri_list_extract_filenames purple_uri_list_extract_filenames
    +
    +#define gaim_utf8_try_convert purple_utf8_try_convert
    +#define gaim_utf8_salvage purple_utf8_salvage
    +#define gaim_utf8_strcasecmp purple_utf8_strcasecmp
    +#define gaim_utf8_has_word purple_utf8_has_word
    +
    +#define gaim_print_utf8_to_console purple_print_utf8_to_console
    +
    +#define gaim_message_meify purple_message_meify
    +
    +#define gaim_text_strip_mnemonic purple_text_strip_mnemonic
    +
    +#define gaim_unescape_filename purple_unescape_filename
    +#define gaim_escape_filename purple_escape_filename
    +
    +/* from value.h */
    +
    +#define GAIM_TYPE_UNKNOWN PURPLE_TYPE_UNKNOWN
    +#define GAIM_TYPE_SUBTYPE PURPLE_TYPE_SUBTYPE
    +#define GAIM_TYPE_CHAR PURPLE_TYPE_CHAR
    +#define GAIM_TYPE_UCHAR PURPLE_TYPE_UCHAR
    +#define GAIM_TYPE_BOOLEAN PURPLE_TYPE_BOOLEAN
    +#define GAIM_TYPE_SHORT PURPLE_TYPE_SHORT
    +#define GAIM_TYPE_USHORT PURPLE_TYPE_USHORT
    +#define GAIM_TYPE_INT PURPLE_TYPE_INT
    +#define GAIM_TYPE_UINT PURPLE_TYPE_UINT
    +#define GAIM_TYPE_LONG PURPLE_TYPE_LONG
    +#define GAIM_TYPE_ULONG PURPLE_TYPE_ULONG
    +#define GAIM_TYPE_INT64 PURPLE_TYPE_INT64
    +#define GAIM_TYPE_UINT64 PURPLE_TYPE_UINT64
    +#define GAIM_TYPE_STRING PURPLE_TYPE_STRING
    +#define GAIM_TYPE_OBJECT PURPLE_TYPE_OBJECT
    +#define GAIM_TYPE_POINTER PURPLE_TYPE_POINTER
    +#define GAIM_TYPE_ENUM PURPLE_TYPE_ENUM
    +#define GAIM_TYPE_BOXED PURPLE_TYPE_BOXED
    +#define GaimType PurpleType
    +
    +
    +#define GAIM_SUBTYPE_UNKNOWN PURPLE_SUBTYPE_UNKNOWN
    +#define GAIM_SUBTYPE_ACCOUNT PURPLE_SUBTYPE_ACCOUNT
    +#define GAIM_SUBTYPE_BLIST PURPLE_SUBTYPE_BLIST
    +#define GAIM_SUBTYPE_BLIST_BUDDY PURPLE_SUBTYPE_BLIST_BUDDY
    +#define GAIM_SUBTYPE_BLIST_GROUP PURPLE_SUBTYPE_BLIST_GROUP
    +#define GAIM_SUBTYPE_BLIST_CHAT PURPLE_SUBTYPE_BLIST_CHAT
    +#define GAIM_SUBTYPE_BUDDY_ICON PURPLE_SUBTYPE_BUDDY_ICON
    +#define GAIM_SUBTYPE_CONNECTION PURPLE_SUBTYPE_CONNECTION
    +#define GAIM_SUBTYPE_CONVERSATION PURPLE_SUBTYPE_CONVERSATION
    +#define GAIM_SUBTYPE_PLUGIN PURPLE_SUBTYPE_PLUGIN
    +#define GAIM_SUBTYPE_BLIST_NODE PURPLE_SUBTYPE_BLIST_NODE
    +#define GAIM_SUBTYPE_CIPHER PURPLE_SUBTYPE_CIPHER
    +#define GAIM_SUBTYPE_STATUS PURPLE_SUBTYPE_STATUS
    +#define GAIM_SUBTYPE_LOG PURPLE_SUBTYPE_LOG
    +#define GAIM_SUBTYPE_XFER PURPLE_SUBTYPE_XFER
    +#define GAIM_SUBTYPE_SAVEDSTATUS PURPLE_SUBTYPE_SAVEDSTATUS
    +#define GAIM_SUBTYPE_XMLNODE PURPLE_SUBTYPE_XMLNODE
    +#define GAIM_SUBTYPE_USERINFO PURPLE_SUBTYPE_USERINFO
    +#define GaimSubType PurpleSubType
    +
    +#define GaimValue PurpleValue
    +
    +#define gaim_value_new purple_value_new
    +#define gaim_value_new_outgoing purple_value_new_outgoing
    +#define gaim_value_destroy purple_value_destroy
    +#define gaim_value_dup purple_value_dup
    +#define gaim_value_purple_buddy_icon_get_extensionget_type purple_value_get_type
    +#define gaim_value_get_subtype purple_value_get_subtype
    +#define gaim_value_get_specific_type purple_value_get_specific_type
    +#define gaim_value_is_outgoing purple_value_is_outgoing
    +#define gaim_value_set_char purple_value_set_char
    +#define gaim_value_set_uchar purple_value_set_uchar
    +#define gaim_value_set_boolean purple_value_set_boolean
    +#define gaim_value_set_short purple_value_set_short
    +#define gaim_value_set_ushort purple_value_set_ushort
    +#define gaim_value_set_int purple_value_set_int
    +#define gaim_value_set_uint purple_value_set_uint
    +#define gaim_value_set_long purple_value_set_long
    +#define gaim_value_set_ulong purple_value_set_ulong
    +#define gaim_value_set_int64 purple_value_set_int64
    +#define gaim_value_set_uint64 purple_value_set_uint64
    +#define gaim_value_set_string purple_value_set_string
    +#define gaim_value_set_object purple_value_set_object
    +#define gaim_value_set_pointer purple_value_set_pointer
    +#define gaim_value_set_enum purple_value_set_enum
    +#define gaim_value_set_boxed purple_value_set_boxed
    +#define gaim_value_get_char purple_value_get_char
    +#define gaim_value_get_uchar purple_value_get_uchar
    +#define gaim_value_get_boolean purple_value_get_boolean
    +#define gaim_value_get_short purple_value_get_short
    +#define gaim_value_get_ushort purple_value_get_ushort
    +#define gaim_value_get_int purple_value_get_int
    +#define gaim_value_get_uint purple_value_get_uint
    +#define gaim_value_get_long purple_value_get_long
    +#define gaim_value_get_ulong purple_value_get_ulong
    +#define gaim_value_get_int64 purple_value_get_int64
    +#define gaim_value_get_uint64 purple_value_get_uint64
    +#define gaim_value_get_string purple_value_get_string
    +#define gaim_value_get_object purple_value_get_object
    +#define gaim_value_get_pointer purple_value_get_pointer
    +#define gaim_value_get_enum purple_value_get_enum
    +#define gaim_value_get_boxed purple_value_get_boxed
    +
    +/* from version.h */
    +
    +#define GAIM_MAJOR_VERSION PURPLE_MAJOR_VERSION
    +#define GAIM_MINOR_VERSION PURPLE_MINOR_VERSION
    +#define GAIM_MICRO_VERSION PURPLE_MICRO_VERSION
    +
    +#define GAIM_VERSION_CHECK PURPLE_VERSION_CHECK
    +
    +/* from whiteboard.h */
    +
    +#define GaimWhiteboardPrplOps PurpleWhiteboardPrplOps
    +#define GaimWhiteboard PurpleWhiteboard
    +#define GaimWhiteboardUiOps PurpleWhiteboardUiOps
    +
    +#define gaim_whiteboard_set_ui_ops purple_whiteboard_set_ui_ops
    +#define gaim_whiteboard_set_prpl_ops purple_whiteboard_set_prpl_ops
    +
    +#define gaim_whiteboard_create purple_whiteboard_create
    +#define gaim_whiteboard_destroy purple_whiteboard_destroy
    +#define gaim_whiteboard_start purple_whiteboard_start
    +#define gaim_whiteboard_get_session purple_whiteboard_get_session
    +#define gaim_whiteboard_draw_list_destroy purple_whiteboard_draw_list_destroy
    +#define gaim_whiteboard_get_dimensions purple_whiteboard_get_dimensions
    +#define gaim_whiteboard_set_dimensions purple_whiteboard_set_dimensions
    +#define gaim_whiteboard_draw_point purple_whiteboard_draw_point
    +#define gaim_whiteboard_send_draw_list purple_whiteboard_send_draw_list
    +#define gaim_whiteboard_draw_line purple_whiteboard_draw_line
    +#define gaim_whiteboard_clear purple_whiteboard_clear
    +#define gaim_whiteboard_send_clear purple_whiteboard_send_clear
    +#define gaim_whiteboard_send_brush purple_whiteboard_send_brush
    +#define gaim_whiteboard_get_brush purple_whiteboard_get_brush
    +#define gaim_whiteboard_set_brush purple_whiteboard_set_brush
    +
    +/* for static plugins */
    +#define gaim_init_ssl_plugin purple_init_ssl_plugin
    +#define gaim_init_ssl_openssl_plugin purple_init_ssl_openssl_plugin
    +#define gaim_init_ssl_gnutls_plugin purple_init_ssl_gnutls_plugin
    +#define gaim_init_gg_plugin purple_init_gg_plugin
    +#define gaim_init_jabber_plugin purple_init_jabber_plugin
    +#define gaim_init_sametime_plugin purple_init_sametime_plugin
    +#define gaim_init_msn_plugin purple_init_msn_plugin
    +#define gaim_init_novell_plugin purple_init_novell_plugin
    +#define gaim_init_qq_plugin purple_init_qq_plugin
    +#define gaim_init_simple_plugin purple_init_simple_plugin
    +#define gaim_init_yahoo_plugin purple_init_yahoo_plugin
    +#define gaim_init_zephyr_plugin purple_init_zephyr_plugin
    +#define gaim_init_aim_plugin purple_init_aim_plugin
    +#define gaim_init_icq_plugin purple_init_icq_plugin
    +
    +#endif /* _GAIM_COMPAT_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/gg.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,74 @@
    +/**
    + * @file gg.h
    + *
    + * purple
    + *
    + * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    + *
    + * 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
    + */
    +
    +
    +#ifndef _PURPLE_GG_H
    +#define _PURPLE_GG_H
    +
    +#include <libgadu.h>
    +#include "internal.h"
    +#include "dnsquery.h"
    +#include "search.h"
    +#include "connection.h"
    +
    +
    +#define PUBDIR_RESULTS_MAX 20
    +
    +
    +typedef struct
    +{
    + char *name;
    + GList *participants;
    +
    +} GGPChat;
    +
    +typedef void (*GGPTokenCallback)(PurpleConnection *);
    +
    +typedef struct
    +{
    + char *id;
    + char *data;
    + unsigned int size;
    +
    + struct gg_http *req;
    + guint inpa;
    +
    + GGPTokenCallback cb;
    +
    +} GGPToken;
    +
    +typedef struct {
    +
    + struct gg_session *session;
    + GGPToken *token;
    + GList *chats;
    + GGPSearches *searches;
    + int chats_count;
    + GList *pending_richtext_messages;
    + GHashTable *pending_images;
    + gboolean status_broadcasting; //When TRUE status is visible to all, when FALSE status is visible only to friends.
    + PurpleDnsQueryData *dns_query;
    +} GGPInfo;
    +
    +#endif /* _PURPLE_GG_H */
    +
    +/* vim: set ts=8 sts=0 sw=8 noet: */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/idle.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,104 @@
    +/**
    + * @file idle.h Idle 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
    + */
    +#ifndef _PURPLE_IDLE_H_
    +#define _PURPLE_IDLE_H_
    +
    +#include <time.h>
    +
    +/**
    + * Idle UI operations.
    + */
    +typedef struct
    +{
    + time_t (*get_time_idle)(void);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleIdleUiOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Idle API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Touch our idle tracker. This signifies that the user is
    + * 'active'. The conversation code calls this when the
    + * user sends an IM, for example.
    + */
    +void purple_idle_touch(void);
    +
    +/**
    + * Fake our idle time by setting the time at which our
    + * accounts purportedly became idle. This is used by
    + * the I'dle Mak'er plugin.
    + */
    +void purple_idle_set(time_t time);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Idle Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used for idle reporting.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_idle_set_ui_ops(PurpleIdleUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for idle reporting.
    + *
    + * @return The UI operations structure in use.
    + */
    +PurpleIdleUiOps *purple_idle_get_ui_ops(void);
    +
    +/**
    + * Initializes the idle system.
    + */
    +void purple_idle_init(void);
    +
    +/**
    + * Uninitializes the idle system.
    + */
    +void purple_idle_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_IDLE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/imgstore.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,230 @@
    +/**
    + * @file imgstore.h IM Image Store API
    + * @ingroup core
    + * @see @ref imgstore-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_IMGSTORE_H_
    +#define _PURPLE_IMGSTORE_H_
    +
    +#include <glib.h>
    +
    +/**
    + * A set of utility functions that provide a reference-counted immutable
    + * wrapper around an image's data and filename. These functions do not
    + * cache any data to disk.
    + */
    +typedef struct _PurpleStoredImage PurpleStoredImage;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Create a new PurpleStoredImage.
    + *
    + * Despite the name of this function, the image is NOT added to the image
    + * store and no ID is assigned. If you need to reference the image by an
    + * ID, use purple_imgstore_add_with_id() instead.
    + *
    + * The caller owns a reference to this image and must dereference it with
    + * purple_imgstore_unref() for it to be freed.
    + *
    + * @param data Pointer to the image data, which the imgstore will take
    + * ownership of and free as appropriate. If you want a
    + * copy of the data, make it before calling this function.
    + * @param size Image data's size.
    + * @param filename Filename associated with image. This is for your
    + * convenience. It could be the full path to the
    + * image or, more commonly, the filename of the image
    + * without any directory information. It can also be
    + * NULL, if you don't need to keep track of a filename.
    + *
    + * @return The stored image, or NULL if the image was not added (because of
    + * empty data or size).
    + */
    +PurpleStoredImage *
    +purple_imgstore_add(gpointer data, size_t size, const char *filename);
    +
    +/**
    + * Create a PurpleStoredImage using purple_imgstore_add() by reading the
    + * given filename from disk.
    + *
    + * The image is not added to the image store and no ID is assigned. If you
    + * need to reference the image by an ID, use purple_imgstore_add_with_id()
    + * instead.
    + *
    + * The caller owns a reference to this image and must dereference it with
    + * purple_imgstore_unref() for it to be freed.
    + *
    + * @param path The path to the image.
    + *
    + * @return The stored image, or NULL if the image was not added (because of
    + * empty data or size).
    + *
    + * @since 2.5.0
    + */
    +PurpleStoredImage *
    +purple_imgstore_new_from_file(const char *path);
    +
    +/**
    + * Create a PurpleStoredImage using purple_imgstore_add() and add the
    + * image to the image store. A unique ID will be assigned to the image.
    + *
    + * The caller owns a reference to the image and must dereference it with
    + * purple_imgstore_unref() or purple_imgstore_unref_by_id() for it to be
    + * freed.
    + *
    + * @param data Pointer to the image data, which the imgstore will take
    + * ownership of and free as appropriate. If you want a
    + * copy of the data, make it before calling this function.
    + * @param size Image data's size.
    + * @param filename Filename associated with image. This is for your
    + * convenience. It could be the full path to the
    + * image or, more commonly, the filename of the image
    + * without any directory information. It can also be
    + * NULL, if you don't need to keep track of a filename.
    + *
    + * @return ID for the image. This is a unique number that can be used
    + * within libpurple to reference the image. 0 is returned if the
    + * image was not added (because of empty data or size).
    + */
    +int purple_imgstore_add_with_id(gpointer data, size_t size, const char *filename);
    +
    +/**
    + * Retrieve an image from the store. The caller does not own a
    + * reference to the image.
    + *
    + * @param id The ID for the image.
    + *
    + * @return A pointer to the requested image, or NULL if it was not found.
    + */
    +PurpleStoredImage *purple_imgstore_find_by_id(int id);
    +
    +/**
    + * Retrieves a pointer to the image's data.
    + *
    + * @param img The Image.
    + *
    + * @return A pointer to the data, which must not
    + * be freed or modified.
    + */
    +gconstpointer purple_imgstore_get_data(PurpleStoredImage *img);
    +
    +/**
    + * Retrieves the length of the image's data.
    + *
    + * @param img The Image.
    + *
    + * @return The size of the data that the pointer returned by
    + * purple_imgstore_get_data points to.
    + */
    +size_t purple_imgstore_get_size(PurpleStoredImage *img);
    +
    +/**
    + * Retrieves a pointer to the image's filename.
    + *
    + * @param img The image.
    + *
    + * @return A pointer to the filename, which must not
    + * be freed or modified.
    + */
    +const char *purple_imgstore_get_filename(const PurpleStoredImage *img);
    +
    +/**
    + * Looks at the magic numbers of the image data (the first few bytes)
    + * and returns an extension corresponding to the image's file type.
    + *
    + * @param img The image.
    + *
    + * @return The image's extension (for example "png") or "icon"
    + * if unknown.
    + */
    +const char *purple_imgstore_get_extension(PurpleStoredImage *img);
    +
    +/**
    + * Increment the reference count.
    + *
    + * @param img The image.
    + *
    + * @return @a img
    + */
    +PurpleStoredImage *
    +purple_imgstore_ref(PurpleStoredImage *img);
    +
    +/**
    + * Decrement the reference count.
    + *
    + * If the reference count reaches zero, the image will be freed.
    + *
    + * @param img The image.
    + *
    + * @return @a img or @c NULL if the reference count reached zero.
    + */
    +PurpleStoredImage *
    +purple_imgstore_unref(PurpleStoredImage *img);
    +
    +/**
    + * Increment the reference count using an ID.
    + *
    + * This is a convience wrapper for purple_imgstore_find_by_id() and
    + * purple_imgstore_ref(), so if you have a PurpleStoredImage, it'll
    + * be more efficient to call purple_imgstore_ref() directly.
    + *
    + * @param id The ID for the image.
    + */
    +void purple_imgstore_ref_by_id(int id);
    +
    +/**
    + * Decrement the reference count using an ID.
    + *
    + * This is a convience wrapper for purple_imgstore_find_by_id() and
    + * purple_imgstore_unref(), so if you have a PurpleStoredImage, it'll
    + * be more efficient to call purple_imgstore_unref() directly.
    + *
    + * @param id The ID for the image.
    + */
    +void purple_imgstore_unref_by_id(int id);
    +
    +/**
    + * Returns the image store subsystem handle.
    + *
    + * @return The subsystem handle.
    + */
    +void *purple_imgstore_get_handle(void);
    +
    +/**
    + * Initializes the image store subsystem.
    + */
    +void purple_imgstore_init(void);
    +
    +/**
    + * Uninitializes the image store subsystem.
    + */
    +void purple_imgstore_uninit(void);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_IMGSTORE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/internal.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,275 @@
    +/**
    + * @file internal.h Internal definitions and includes
    + * @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
    + */
    +#ifndef _PURPLE_INTERNAL_H_
    +#define _PURPLE_INTERNAL_H_
    +
    +#ifdef HAVE_CONFIG_H
    +# include <config.h>
    +#endif
    +
    +/* for SIOCGIFCONF in SKYOS */
    +#ifdef SKYOS
    +#include <net/sockios.h>
    +#endif
    +/*
    + * If we're using NLS, make sure gettext works. If not, then define
    + * dummy macros in place of the normal gettext macros.
    + *
    + * Also, the perl XS config.h file sometimes defines _ So we need to
    + * make sure _ isn't already defined before trying to define it.
    + *
    + * The Singular/Plural/Number ngettext dummy definition below was
    + * taken from an email to the texinfo mailing list by Manuel Guerrero.
    + * Thank you Manuel, and thank you Alex's good friend Google.
    + */
    +#ifdef ENABLE_NLS
    +# include <locale.h>
    +# include <libintl.h>
    +# define _(String) ((const char *)dgettext(PACKAGE, String))
    +# ifdef gettext_noop
    +# define N_(String) gettext_noop (String)
    +# else
    +# define N_(String) (String)
    +# endif
    +#else
    +# include <locale.h>
    +# define N_(String) (String)
    +# ifndef _
    +# define _(String) ((const char *)String)
    +# endif
    +# define ngettext(Singular, Plural, Number) ((Number == 1) ? ((const char *)Singular) : ((const char *)Plural))
    +# define dngettext(Domain, Singular, Plural, Number) ((Number == 1) ? ((const char *)Singular) : ((const char *)Plural))
    +#endif
    +
    +#ifdef HAVE_ENDIAN_H
    +# include <endian.h>
    +#endif
    +
    +#define MSG_LEN 2048
    +/* The above should normally be the same as BUF_LEN,
    + * but just so we're explicitly asking for the max message
    + * length. */
    +#define BUF_LEN MSG_LEN
    +#define BUF_LONG BUF_LEN * 2
    +
    +#include <sys/stat.h>
    +#include <sys/types.h>
    +#ifndef _WIN32
    +#include <sys/time.h>
    +#include <sys/wait.h>
    +#include <sys/time.h>
    +#endif
    +#include <ctype.h>
    +#include <errno.h>
    +#include <fcntl.h>
    +#include <math.h>
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <time.h>
    +
    +#ifdef HAVE_ICONV
    +#include <iconv.h>
    +#endif
    +
    +#ifdef HAVE_LANGINFO_CODESET
    +#include <langinfo.h>
    +#endif
    +
    +#include <gmodule.h>
    +
    +#ifdef PURPLE_PLUGINS
    +# ifdef HAVE_DLFCN_H
    +# include <dlfcn.h>
    +# endif
    +#endif
    +
    +#ifndef _WIN32
    +# include <netinet/in.h>
    +# include <sys/socket.h>
    +# include <arpa/inet.h>
    +# include <sys/un.h>
    +# include <sys/utsname.h>
    +# include <netdb.h>
    +# include <signal.h>
    +# include <unistd.h>
    +#endif
    +
    +#ifndef HOST_NAME_MAX
    +# define HOST_NAME_MAX 255
    +#endif
    +
    +#include <glib.h>
    +
    +/* This wasn't introduced until Glib 2.14 :( */
    +#ifndef G_MAXSSIZE
    +# if GLIB_SIZEOF_LONG == 8
    +# define G_MAXSSIZE ((gssize) 0x7fffffffffffffff)
    +# else
    +# define G_MAXSSIZE ((gssize) 0x7fffffff)
    +# endif
    +#endif
    +
    +#include <glib/gstdio.h>
    +
    +#ifdef _WIN32
    +#include "win32dep.h"
    +#endif
    +
    +#ifdef HAVE_CONFIG_H
    +#if SIZEOF_TIME_T == 4
    +# define PURPLE_TIME_T_MODIFIER "lu"
    +#elif SIZEOF_TIME_T == 8
    +# define PURPLE_TIME_T_MODIFIER "zu"
    +#else
    +#error Unknown size of time_t
    +#endif
    +#endif
    +
    +#include <glib-object.h>
    +
    +#if !GLIB_CHECK_VERSION(2, 32, 0)
    +
    +#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS
    +#define G_GNUC_END_IGNORE_DEPRECATIONS
    +
    +#endif /* 2.32.0 */
    +
    +#ifdef __clang__
    +
    +#undef G_GNUC_BEGIN_IGNORE_DEPRECATIONS
    +#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
    + _Pragma ("clang diagnostic push") \
    + _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"")
    +
    +#undef G_GNUC_END_IGNORE_DEPRECATIONS
    +#define G_GNUC_END_IGNORE_DEPRECATIONS \
    + _Pragma ("clang diagnostic pop")
    +
    +#endif /* __clang__ */
    +
    +#ifdef __COVERITY__
    +
    +/* avoid TAINTED_SCALAR warning */
    +#undef g_utf8_next_char
    +#define g_utf8_next_char(p) (char *)((p) + 1)
    +
    +#endif
    +
    +/* Safer ways to work with static buffers. When using non-static
    + * buffers, either use g_strdup_* functions (preferred) or use
    + * g_strlcpy/g_strlcpy directly. */
    +#define purple_strlcpy(dest, src) g_strlcpy(dest, src, sizeof(dest))
    +#define purple_strlcat(dest, src) g_strlcat(dest, src, sizeof(dest))
    +
    +typedef union
    +{
    + struct sockaddr sa;
    + struct sockaddr_in in;
    + struct sockaddr_in6 in6;
    + struct sockaddr_storage storage;
    +} common_sockaddr_t;
    +
    +#define PURPLE_WEBSITE "http://pidgin.im/"
    +#define PURPLE_DEVEL_WEBSITE "http://developer.pidgin.im/"
    +
    +
    +/* INTERNAL FUNCTIONS */
    +
    +#include "account.h"
    +#include "connection.h"
    +
    +/* This is for the accounts code to notify the buddy icon code that
    + * it's done loading. We may want to replace this with a signal. */
    +void
    +_purple_buddy_icons_account_loaded_cb(void);
    +
    +/* This is for the buddy list to notify the buddy icon code that
    + * it's done loading. We may want to replace this with a signal. */
    +void
    +_purple_buddy_icons_blist_loaded_cb(void);
    +
    +/* This is for the purple_core_migrate() code to tell the buddy
    + * icon subsystem about the old icons directory so it can
    + * migrate any icons in use. */
    +void
    +_purple_buddy_icon_set_old_icons_dir(const char *dirname);
    +
    +/**
    + * Creates a connection to the specified account and either connects
    + * or attempts to register a new account. If you are logging in,
    + * the connection uses the current active status for this account.
    + * So if you want to sign on as "away," for example, you need to
    + * have called purple_account_set_status(account, "away").
    + * (And this will call purple_account_connect() automatically).
    + *
    + * @note This function should only be called by purple_account_connect()
    + * in account.c. If you're trying to sign on an account, use that
    + * function instead.
    + *
    + * @param account The account the connection should be connecting to.
    + * @param regist Whether we are registering a new account or just
    + * trying to do a normal signon.
    + * @param password The password to use.
    + */
    +void _purple_connection_new(PurpleAccount *account, gboolean regist,
    + const char *password);
    +/**
    + * Tries to unregister the account on the server. If the account is not
    + * connected, also creates a new connection.
    + *
    + * @note This function should only be called by purple_account_unregister()
    + * in account.c.
    + *
    + * @param account The account to unregister
    + * @param password The password to use.
    + * @param cb Optional callback to be called when unregistration is complete
    + * @param user_data user data to pass to the callback
    + */
    +void _purple_connection_new_unregister(PurpleAccount *account, const char *password,
    + PurpleAccountUnregistrationCb cb, void *user_data);
    +/**
    + * Disconnects and destroys a PurpleConnection.
    + *
    + * @note This function should only be called by purple_account_disconnect()
    + * in account.c. If you're trying to sign off an account, use that
    + * function instead.
    + *
    + * @param gc The purple connection to destroy.
    + */
    +void _purple_connection_destroy(PurpleConnection *gc);
    +
    +/**
    + * Sets most commonly used socket flags: O_NONBLOCK and FD_CLOEXEC.
    + *
    + * @param fd The file descriptor for the socket.
    + *
    + * @return TRUE if succeeded, FALSE otherwise.
    + */
    +gboolean
    +_purple_network_set_common_socket_flags(int fd);
    +
    +#endif /* _PURPLE_INTERNAL_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/iq.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,118 @@
    +/**
    + * @file iq.h JabberID handlers
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_IQ_H_
    +#define PURPLE_JABBER_IQ_H_
    +
    +typedef enum {
    + JABBER_IQ_SET,
    + JABBER_IQ_GET,
    + JABBER_IQ_RESULT,
    + JABBER_IQ_ERROR,
    + JABBER_IQ_NONE
    +} JabberIqType;
    +
    +#include "jabber.h"
    +#include "connection.h"
    +
    +typedef struct _JabberIq JabberIq;
    +typedef struct _JabberIqCallbackData JabberIqCallbackData;
    +
    +/**
    + * A JabberIqHandler is called to process an incoming IQ stanza.
    + * Handlers typically process unsolicited incoming GETs or SETs for their
    + * registered namespace, but may be called to handle the results of a
    + * GET or SET that we generated if no JabberIqCallback was generated
    + * The handler may be called for the results of a GET or SET (RESULT or ERROR)
    + * that we generated
    + * if the generating function did not register a JabberIqCallback.
    + *
    + * @param js The JabberStream object.
    + * @param from The remote entity (the from attribute on the <iq/> stanza)
    + * @param type The IQ type.
    + * @param id The IQ id (the id attribute on the <iq/> stanza)
    + * @param child The child element of the <iq/> stanza that matches the name
    + * and namespace registered with jabber_iq_register_handler.
    + *
    + * @see jabber_iq_register_handler()
    + * @see JabberIqCallback
    + */
    +typedef void (JabberIqHandler)(JabberStream *js, const char *from,
    + JabberIqType type, const char *id,
    + xmlnode *child);
    +
    +/**
    + * A JabberIqCallback is called to process the results of a GET or SET that
    + * we send to a remote entity. The callback is matched based on the id
    + * of the incoming stanza (which matches the one on the initial stanza).
    + *
    + * @param js The JabberStream object.
    + * @param from The remote entity (the from attribute on the <iq/> stanza)
    + * @param type The IQ type. The only possible values are JABBER_IQ_RESULT
    + * and JABBER_IQ_ERROR.
    + * @param id The IQ id (the id attribute on the <iq/> stanza)
    + * @param packet The <iq/> stanza
    + * @param data The callback data passed to jabber_iq_set_callback()
    + *
    + * @see jabber_iq_set_callback()
    + */
    +typedef void (JabberIqCallback)(JabberStream *js, const char *from,
    + JabberIqType type, const char *id,
    + xmlnode *packet, gpointer data);
    +
    +struct _JabberIq {
    + JabberIqType type;
    + char *id;
    + xmlnode *node;
    +
    + JabberIqCallback *callback;
    + gpointer callback_data;
    +
    + JabberStream *js;
    +};
    +
    +JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type);
    +JabberIq *jabber_iq_new_query(JabberStream *js, JabberIqType type,
    + const char *xmlns);
    +
    +void jabber_iq_parse(JabberStream *js, xmlnode *packet);
    +
    +void jabber_iq_callbackdata_free(JabberIqCallbackData *jcd);
    +void jabber_iq_remove_callback_by_id(JabberStream *js, const char *id);
    +void jabber_iq_set_callback(JabberIq *iq, JabberIqCallback *cb, gpointer data);
    +void jabber_iq_set_id(JabberIq *iq, const char *id);
    +
    +void jabber_iq_send(JabberIq *iq);
    +void jabber_iq_free(JabberIq *iq);
    +
    +void jabber_iq_init(void);
    +void jabber_iq_uninit(void);
    +
    +void jabber_iq_register_handler(const char *node, const char *xmlns,
    + JabberIqHandler *func);
    +
    +/* Connected to namespace-handler registration signals */
    +void jabber_iq_signal_register(const gchar *node, const gchar *xmlns);
    +void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns);
    +
    +#endif /* PURPLE_JABBER_IQ_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/irc.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,228 @@
    +/**
    + * @file irc.h
    + *
    + * purple
    + *
    + * Copyright (C) 2003, 2012 Ethan Blanton <elb@pidgin.im>
    + *
    + * 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
    + */
    +
    +#ifndef _PURPLE_IRC_H
    +#define _PURPLE_IRC_H
    +
    +#include <glib.h>
    +
    +#ifdef HAVE_CYRUS_SASL
    +#include <sasl/sasl.h>
    +#endif
    +
    +#include "circbuffer.h"
    +#include "ft.h"
    +#include "roomlist.h"
    +#include "sslconn.h"
    +
    +#define IRC_DEFAULT_SERVER "irc.freenode.net"
    +#define IRC_DEFAULT_PORT 6667
    +#define IRC_DEFAULT_SSL_PORT 994
    +
    +#define IRC_DEFAULT_CHARSET "UTF-8"
    +#define IRC_DEFAULT_AUTODETECT FALSE
    +#define IRC_DEFAULT_ALIAS "purple"
    +
    +#define IRC_DEFAULT_QUIT "Leaving."
    +
    +#define IRC_INITIAL_BUFSIZE 1024
    +
    +#define IRC_MAX_MSG_SIZE 512
    +
    +#define IRC_NAMES_FLAG "irc-namelist"
    +
    +
    +enum { IRC_USEROPT_SERVER, IRC_USEROPT_PORT, IRC_USEROPT_CHARSET };
    +enum irc_state { IRC_STATE_NEW, IRC_STATE_ESTABLISHED };
    +
    +struct irc_conn {
    + PurpleAccount *account;
    + GHashTable *msgs;
    + GHashTable *cmds;
    + char *server;
    + int fd;
    + guint timer;
    + GHashTable *buddies;
    +
    + gboolean ison_outstanding;
    + GList *buddies_outstanding;
    +
    + char *inbuf;
    + int inbuflen;
    + int inbufused;
    +
    + GString *motd;
    + GString *names;
    + struct _whois {
    + char *nick;
    + char *real;
    + char *login;
    + char *ident;
    + char *host;
    + char *away;
    + char *server;
    + char *serverinfo;
    + GString *channels;
    + int ircop;
    + int identified;
    + int idle;
    + time_t signon;
    + } whois;
    + PurpleRoomlist *roomlist;
    + PurpleSslConnection *gsc;
    +
    + gboolean quitting;
    +
    + PurpleCircBuffer *outbuf;
    + guint writeh;
    +
    + time_t recv_time;
    +
    + char *mode_chars;
    + char *reqnick;
    + gboolean nickused;
    +#ifdef HAVE_CYRUS_SASL
    + sasl_conn_t *sasl_conn;
    + const char *current_mech;
    + GString *sasl_mechs;
    + gboolean mech_works;
    + sasl_callback_t *sasl_cb;
    +#endif
    +};
    +
    +struct irc_buddy {
    + char *name;
    + gboolean online;
    + gboolean flag;
    + gboolean new_online_status;
    + int ref;
    +};
    +
    +typedef int (*IRCCmdCallback) (struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +
    +int irc_send(struct irc_conn *irc, const char *buf);
    +int irc_send_len(struct irc_conn *irc, const char *buf, int len);
    +gboolean irc_blist_timeout(struct irc_conn *irc);
    +gboolean irc_who_channel_timeout(struct irc_conn *irc);
    +void irc_buddy_query(struct irc_conn *irc);
    +
    +char *irc_escape_privmsg(const char *text, gssize length);
    +
    +char *irc_mirc2html(const char *string);
    +char *irc_mirc2txt(const char *string);
    +
    +const char *irc_nick_skip_mode(struct irc_conn *irc, const char *string);
    +
    +gboolean irc_ischannel(const char *string);
    +
    +void irc_register_commands(void);
    +void irc_msg_table_build(struct irc_conn *irc);
    +void irc_parse_msg(struct irc_conn *irc, char *input);
    +char *irc_parse_ctcp(struct irc_conn *irc, const char *from, const char *to, const char *msg, int notice);
    +char *irc_format(struct irc_conn *irc, const char *format, ...);
    +
    +void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_badmode(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_badnick(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_ban(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_banfull(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_banned(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_features(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_join(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_luser(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_motd(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_names(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nick(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nickused(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nochan(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nonick(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nochangenick(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_nosend(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_notice(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_part(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_ping(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_privmsg(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_quit(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_time(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_topicinfo(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_unavailable(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_unknown(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_wallops(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_whois(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_who(struct irc_conn *irc, const char *name, const char *from, char **args);
    +#ifdef HAVE_CYRUS_SASL
    +void irc_msg_cap(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_auth(struct irc_conn *irc, char *arg);
    +void irc_msg_authok(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_authtryagain(struct irc_conn *irc, const char *name, const char *from, char **args);
    +void irc_msg_authfail(struct irc_conn *irc, const char *name, const char *from, char **args);
    +#endif
    +
    +void irc_msg_ignore(struct irc_conn *irc, const char *name, const char *from, char **args);
    +
    +void irc_cmd_table_build(struct irc_conn *irc);
    +
    +int irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_away(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_ctcp(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_ctcp_action(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_ctcp_version(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_invite(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_join(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_kick(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_list(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_mode(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_names(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_nick(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_op(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_part(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_ping(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_quote(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_query(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_remove(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_service(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_time(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_topic(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_wallops(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_whois(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +int irc_cmd_whowas(struct irc_conn *irc, const char *cmd, const char *target, const char **args);
    +
    +PurpleXfer *irc_dccsend_new_xfer(PurpleConnection *gc, const char *who);
    +void irc_dccsend_send_file(PurpleConnection *gc, const char *who, const char *file);
    +void irc_dccsend_recv(struct irc_conn *irc, const char *from, const char *msg);
    +#endif /* _PURPLE_IRC_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/jabber.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,423 @@
    +/**
    + * @file jabber.h
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_H_
    +#define PURPLE_JABBER_H_
    +
    +typedef enum {
    + JABBER_CAP_NONE = 0,
    +/* JABBER_CAP_XHTML = 1 << 0, */
    +/* JABBER_CAP_COMPOSING = 1 << 1, */
    + JABBER_CAP_SI = 1 << 2,
    + JABBER_CAP_SI_FILE_XFER = 1 << 3,
    + JABBER_CAP_BYTESTREAMS = 1 << 4,
    + JABBER_CAP_IBB = 1 << 5,
    + JABBER_CAP_CHAT_STATES = 1 << 6,
    + JABBER_CAP_IQ_SEARCH = 1 << 7,
    + JABBER_CAP_IQ_REGISTER = 1 << 8,
    +
    + /* Google Talk extensions:
    + * http://code.google.com/apis/talk/jep_extensions/extensions.html
    + */
    + JABBER_CAP_GMAIL_NOTIFY = 1 << 9,
    + JABBER_CAP_GOOGLE_ROSTER = 1 << 10,
    +
    + JABBER_CAP_PING = 1 << 11,
    + JABBER_CAP_ADHOC = 1 << 12,
    + JABBER_CAP_BLOCKING = 1 << 13,
    +
    + JABBER_CAP_ITEMS = 1 << 14,
    + JABBER_CAP_ROSTER_VERSIONING = 1 << 15,
    +
    + JABBER_CAP_RETRIEVED = 1 << 31
    +} JabberCapabilities;
    +
    +typedef struct _JabberStream JabberStream;
    +
    +#include <libxml/parser.h>
    +#include <glib.h>
    +#include "circbuffer.h"
    +#include "connection.h"
    +#include "dnsquery.h"
    +#include "dnssrv.h"
    +#include "media.h"
    +#include "mediamanager.h"
    +#include "roomlist.h"
    +#include "sslconn.h"
    +
    +#include "namespaces.h"
    +
    +#include "auth.h"
    +#include "iq.h"
    +#include "jutil.h"
    +#include "xmlnode.h"
    +#include "buddy.h"
    +#include "bosh.h"
    +
    +#ifdef HAVE_CYRUS_SASL
    +#include <sasl/sasl.h>
    +#endif
    +
    +#define CAPS0115_NODE "http://pidgin.im/"
    +
    +#define JABBER_DEFAULT_REQUIRE_TLS "require_starttls"
    +#define JABBER_DEFAULT_FT_PROXIES "proxy.eu.jabber.org"
    +
    +/* Index into attention_types list */
    +#define JABBER_BUZZ 0
    +
    +typedef enum {
    + JABBER_STREAM_OFFLINE,
    + JABBER_STREAM_CONNECTING,
    + JABBER_STREAM_INITIALIZING,
    + JABBER_STREAM_INITIALIZING_ENCRYPTION,
    + JABBER_STREAM_AUTHENTICATING,
    + JABBER_STREAM_POST_AUTH,
    + JABBER_STREAM_CONNECTED
    +} JabberStreamState;
    +
    +struct _JabberStream
    +{
    + int fd;
    +
    + PurpleSrvTxtQueryData *srv_query_data;
    +
    + xmlParserCtxt *context;
    + xmlnode *current;
    +
    + struct {
    + guint8 major;
    + guint8 minor;
    + } protocol_version;
    +
    + JabberSaslMech *auth_mech;
    + gpointer auth_mech_data;
    +
    + /**
    + * The header from the opening <stream/> tag. This being NULL is treated
    + * as a special condition in the parsing code (signifying the next
    + * stanza started is an opening stream tag), and its being missing on
    + * the stream header is treated as a fatal error.
    + */
    + char *stream_id;
    + JabberStreamState state;
    +
    + GHashTable *buddies;
    +
    + /*
    + * This boolean was added to eliminate a heinous bug where we would
    + * get into a loop with the server and move a buddy back and forth
    + * from one group to another.
    + *
    + * The sequence goes something like this:
    + * 1. Our resource and another resource both approve an authorization
    + * request at the exact same time. We put the buddy in group A and
    + * the other resource put the buddy in group B.
    + * 2. The server receives the roster add for group B and sends us a
    + * roster push.
    + * 3. We receive this roster push and modify our local blist. This
    + * triggers us to send a roster add for group B.
    + * 4. The server recieves our earlier roster add for group A and sends
    + * us a roster push.
    + * 5. We receive this roster push and modify our local blist. This
    + * triggers us to send a roster add for group A.
    + * 6. The server receives our earlier roster add for group B and sends
    + * us a roster push.
    + * (repeat steps 3 through 6 ad infinitum)
    + *
    + * This boolean is used to short-circuit the sending of a roster add
    + * when we receive a roster push.
    + *
    + * See these bug reports:
    + * http://trac.adiumx.com/ticket/8834
    + * http://developer.pidgin.im/ticket/5484
    + * http://developer.pidgin.im/ticket/6188
    + */
    + gboolean currently_parsing_roster_push;
    +
    + GHashTable *chats;
    + GList *chat_servers;
    + PurpleRoomlist *roomlist;
    + GList *user_directories;
    +
    + GHashTable *iq_callbacks;
    + int next_id;
    +
    + GList *bs_proxies;
    + GList *oob_file_transfers;
    + GList *file_transfers;
    +
    + time_t idle;
    + time_t old_idle;
    +
    + /** When we last pinged the server, so we don't ping more
    + * often than once every minute.
    + */
    + time_t last_ping;
    +
    + JabberID *user;
    + JabberBuddy *user_jb;
    +
    + PurpleConnection *gc;
    + PurpleSslConnection *gsc;
    +
    + gboolean registration;
    +
    + char *initial_avatar_hash;
    + char *avatar_hash;
    + GSList *pending_avatar_requests;
    +
    + GSList *pending_buddy_info_requests;
    +
    + PurpleCircBuffer *write_buffer;
    + guint writeh;
    +
    + gboolean reinit;
    +
    + JabberCapabilities server_caps;
    + gboolean googletalk;
    + char *server_name;
    +
    + char *gmail_last_time;
    + char *gmail_last_tid;
    +
    + char *serverFQDN;
    +
    +#ifdef HAVE_CYRUS_SASL
    + sasl_conn_t *sasl;
    + sasl_callback_t *sasl_cb;
    + sasl_secret_t *sasl_secret;
    + const char *current_mech;
    + int auth_fail_count;
    +
    + int sasl_state;
    + int sasl_maxbuf;
    + GString *sasl_mechs;
    +#endif
    +
    + gboolean unregistration;
    + PurpleAccountUnregistrationCb unregistration_cb;
    + void *unregistration_user_data;
    +
    + gboolean vcard_fetched;
    + /* Timer at login to push updated avatar */
    + guint vcard_timer;
    +
    + /* Entity Capabilities hash */
    + char *caps_hash;
    +
    + /* does the local server support PEP? */
    + gboolean pep;
    +
    + /* Is Buzz enabled? */
    + gboolean allowBuzz;
    +
    + /* A list of JabberAdHocCommands supported by the server */
    + GList *commands;
    +
    + /* last presence update to check for differences */
    + JabberBuddyState old_state;
    + char *old_msg;
    + int old_priority;
    + char *old_avatarhash;
    +
    + /* same for user tune */
    + char *old_artist;
    + char *old_title;
    + char *old_source;
    + char *old_uri;
    + int old_length;
    + char *old_track;
    +
    + char *certificate_CN;
    +
    + /* A purple timeout tag for the keepalive */
    + guint keepalive_timeout;
    + guint max_inactivity;
    + guint inactivity_timer;
    +
    + PurpleSrvResponse *srv_rec;
    + guint srv_rec_idx;
    + guint max_srv_rec_idx;
    +
    + /* BOSH stuff */
    + PurpleBOSHConnection *bosh;
    +
    + /**
    + * This linked list contains PurpleUtilFetchUrlData structs
    + * for when we lookup buddy icons from a url
    + */
    + GSList *url_datas;
    +
    + /* keep a hash table of JingleSessions */
    + GHashTable *sessions;
    +
    + /* maybe this should only be present when USE_VV? */
    + gchar *stun_ip;
    + int stun_port;
    + PurpleDnsQueryData *stun_query;
    +
    + /* stuff for Google's relay handling */
    + gchar *google_relay_token;
    + gchar *google_relay_host;
    + GList *google_relay_requests; /* the HTTP requests to get */
    + /* relay info */
    +};
    +
    +typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *namespace);
    +
    +typedef struct _JabberFeature
    +{
    + gchar *namespace;
    + JabberFeatureEnabled *is_enabled;
    +} JabberFeature;
    +
    +typedef struct _JabberIdentity
    +{
    + gchar *category;
    + gchar *type;
    + gchar *name;
    + gchar *lang;
    +} JabberIdentity;
    +
    +typedef struct _JabberBytestreamsStreamhost {
    + char *jid;
    + char *host;
    + int port;
    + char *zeroconf;
    +} JabberBytestreamsStreamhost;
    +
    +/* what kind of additional features as returned from disco#info are supported? */
    +extern GList *jabber_features;
    +/* A sorted list of identities advertised. Use jabber_add_identity to add
    + * so it remains sorted.
    + */
    +extern GList *jabber_identities;
    +
    +void jabber_stream_features_parse(JabberStream *js, xmlnode *packet);
    +void jabber_process_packet(JabberStream *js, xmlnode **packet);
    +void jabber_send(JabberStream *js, xmlnode *data);
    +void jabber_send_raw(JabberStream *js, const char *data, int len);
    +void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet,
    + gpointer unused);
    +
    +void jabber_stream_set_state(JabberStream *js, JabberStreamState state);
    +
    +void jabber_register_parse(JabberStream *js, const char *from,
    + JabberIqType type, const char *id, xmlnode *query);
    +void jabber_register_start(JabberStream *js);
    +
    +char *jabber_get_next_id(JabberStream *js);
    +
    +/** Parse an error into a human-readable string and optionally a disconnect
    + * reason.
    + * @param js the stream on which the error occurred.
    + * @param packet the error packet
    + * @param reason where to store the disconnection reason, or @c NULL if you
    + * don't care or you don't intend to close the connection.
    + */
    +char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleConnectionError *reason);
    +
    +/**
    + * Add a feature to the list of features advertised via disco#info. If you
    + * call this while accounts are connected, Bad Things(TM) will happen because
    + * the Entity Caps hash will be out-of-date (which should be fixed :/)
    + *
    + * @param namespace The namespace of the feature
    + * @param cb A callback determining whether or not this feature
    + * will advertised; may be NULL.
    + */
    +void jabber_add_feature(const gchar *namespace, JabberFeatureEnabled cb);
    +void jabber_remove_feature(const gchar *namespace);
    +
    +/** Adds an identity to this jabber library instance. For list of valid values
    + * visit the website of the XMPP Registrar
    + * (http://www.xmpp.org/registrar/disco-categories.html#client).
    + *
    + * Like with jabber_add_feature, if you call this while accounts are connected,
    + * Bad Things will happen.
    + *
    + * @param category the category of the identity.
    + * @param type the type of the identity.
    + * @param language the language localization of the name. Can be NULL.
    + * @param name the name of the identity.
    + */
    +void jabber_add_identity(const gchar *category, const gchar *type, const gchar *lang, const gchar *name);
    +
    +/**
    + * GCompareFunc for JabberIdentity structs.
    + */
    +gint jabber_identity_compare(gconstpointer a, gconstpointer b);
    +
    +/**
    + * Returns true if this connection is over a secure (SSL) stream. Use this
    + * instead of checking js->gsc because BOSH stores its PurpleSslConnection
    + * members in its own data structure.
    + */
    +gboolean jabber_stream_is_ssl(JabberStream *js);
    +
    +/**
    + * Restart the "we haven't sent anything in a while and should send
    + * something or the server will kick us off" timer (obviously
    + * called when sending something. It's exposed for BOSH.)
    + */
    +void jabber_stream_restart_inactivity_timer(JabberStream *js);
    +
    +/** PRPL functions */
    +const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b);
    +const char* jabber_list_emblem(PurpleBuddy *b);
    +char *jabber_status_text(PurpleBuddy *b);
    +void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full);
    +GList *jabber_status_types(PurpleAccount *account);
    +void jabber_login(PurpleAccount *account);
    +void jabber_close(PurpleConnection *gc);
    +void jabber_idle_set(PurpleConnection *gc, int idle);
    +void jabber_blocklist_parse_push(JabberStream *js, const char *from,
    + JabberIqType type, const char *id,
    + xmlnode *child);
    +void jabber_request_block_list(JabberStream *js);
    +void jabber_add_deny(PurpleConnection *gc, const char *who);
    +void jabber_rem_deny(PurpleConnection *gc, const char *who);
    +void jabber_keepalive(PurpleConnection *gc);
    +void jabber_register_gateway(JabberStream *js, const char *gateway);
    +void jabber_register_account(PurpleAccount *account);
    +void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
    +gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code);
    +GList *jabber_attention_types(PurpleAccount *account);
    +void jabber_convo_closed(PurpleConnection *gc, const char *who);
    +PurpleChat *jabber_find_blist_chat(PurpleAccount *account, const char *name);
    +gboolean jabber_offline_message(const PurpleBuddy *buddy);
    +int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len);
    +GList *jabber_actions(PurplePlugin *plugin, gpointer context);
    +
    +gboolean jabber_audio_enabled(JabberStream *js, const char *unused);
    +gboolean jabber_video_enabled(JabberStream *js, const char *unused);
    +gboolean jabber_initiate_media(PurpleAccount *account, const char *who,
    + PurpleMediaSessionType type);
    +PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who);
    +gboolean jabber_can_receive_file(PurpleConnection *gc, const gchar *who);
    +
    +void jabber_plugin_init(PurplePlugin *plugin);
    +void jabber_plugin_uninit(PurplePlugin *plugin);
    +
    +#endif /* PURPLE_JABBER_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/jutil.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,99 @@
    +/**
    + * @file jutil.h utility functions
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_JUTIL_H_
    +#define PURPLE_JABBER_JUTIL_H_
    +
    +typedef struct _JabberID {
    + char *node;
    + char *domain;
    + char *resource;
    +} JabberID;
    +
    +typedef enum {
    + JABBER_BUDDY_STATE_UNKNOWN = -2,
    + JABBER_BUDDY_STATE_ERROR = -1,
    + JABBER_BUDDY_STATE_UNAVAILABLE = 0,
    + JABBER_BUDDY_STATE_ONLINE,
    + JABBER_BUDDY_STATE_CHAT,
    + JABBER_BUDDY_STATE_AWAY,
    + JABBER_BUDDY_STATE_XA,
    + JABBER_BUDDY_STATE_DND
    +} JabberBuddyState;
    +
    +#include "jabber.h"
    +
    +JabberID* jabber_id_new(const char *str);
    +
    +/**
    + * Compare two JIDs for equality. In addition to the node and domain,
    + * the resources of the two JIDs must also be equal (or both absent).
    + */
    +gboolean jabber_id_equal(const JabberID *jid1, const JabberID *jid2);
    +
    +void jabber_id_free(JabberID *jid);
    +
    +char *jabber_get_domain(const char *jid);
    +char *jabber_get_resource(const char *jid);
    +char *jabber_get_bare_jid(const char *jid);
    +char *jabber_id_get_bare_jid(const JabberID *jid);
    +char *jabber_id_get_full_jid(const JabberID *jid);
    +JabberID *jabber_id_to_bare_jid(const JabberID *jid);
    +
    +gboolean jabber_jid_is_domain(const char *jid);
    +
    +const char *jabber_normalize(const PurpleAccount *account, const char *in);
    +
    +/* Returns true if JID is the bare JID of our server. */
    +gboolean jabber_is_own_server(JabberStream *js, const char *jid);
    +
    +/* Returns true if JID is the bare JID of our account. */
    +gboolean jabber_is_own_account(JabberStream *js, const char *jid);
    +
    +gboolean jabber_nodeprep_validate(const char *);
    +gboolean jabber_domain_validate(const char *);
    +gboolean jabber_resourceprep_validate(const char *);
    +
    +/**
    + * Apply the SASLprep profile of stringprep to the string passed in.
    + *
    + * @returns A newly allocated string containing the normalized version
    + * of the input, or NULL if an error occurred (the string could
    + * not be normalized)
    + */
    +char *jabber_saslprep(const char *);
    +
    +/* state -> readable name */
    +const char *jabber_buddy_state_get_name(JabberBuddyState state);
    +/* state -> core id */
    +const char *jabber_buddy_state_get_status_id(JabberBuddyState state);
    +/* state -> show attr (for presence stanza) */
    +const char *jabber_buddy_state_get_show(JabberBuddyState state);
    +/* core id -> state */
    +JabberBuddyState jabber_buddy_status_id_get_state(const char *id);
    +/* show attr (presence stanza) -> state */
    +JabberBuddyState jabber_buddy_show_get_state(const char *id);
    +
    +char *jabber_calculate_data_hash(gconstpointer data, size_t len,
    + const gchar *hash_algo);
    +#endif /* PURPLE_JABBER_JUTIL_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/libgadu.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,2639 @@
    +/* $Id$ */
    +
    +/*
    + * (C) Copyright 2001-2009 Wojtek Kaniewski <wojtekka@irc.pl>
    + * Robert J. Woźny <speedy@ziew.org>
    + * Arkadiusz Miśkiewicz <arekm@pld-linux.org>
    + * Tomasz Chiliński <chilek@chilan.com>
    + * Piotr Wysocki <wysek@linux.bydg.org>
    + * Dawid Jarosz <dawjar@poczta.onet.pl>
    + * Jakub Zawadzki <darkjames@darkjames.ath.cx>
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU Lesser General Public License Version
    + * 2.1 as published by the Free Software Foundation.
    + *
    + * 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 Lesser General Public License for more details.
    + *
    + * You should have received a copy of the GNU Lesser General Public
    + * License along with this program; if not, write to the Free Software
    + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
    + * USA.
    + */
    +
    +/**
    + * \file libgadu.h
    + *
    + * \brief Główny plik nagłówkowy biblioteki
    + */
    +
    +#ifndef LIBGADU_LIBGADU_H
    +#define LIBGADU_LIBGADU_H
    +
    +#ifdef _WIN32
    +#pragma pack(push, 1)
    +#endif
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +#include <sys/types.h>
    +#include <stdio.h>
    +#include <stdarg.h>
    +
    +/** \cond ignore */
    +
    +/* Defined if libgadu was compiled for bigendian machine. */
    +#undef GG_CONFIG_BIGENDIAN
    +
    +/* Defined if this machine has gethostbyname_r(). */
    +#undef GG_CONFIG_HAVE_GETHOSTBYNAME_R
    +
    +/* Defined if libgadu was compiled and linked with fork support. */
    +#undef GG_CONFIG_HAVE_FORK
    +
    +/* Defined if libgadu was compiled and linked with pthread support. */
    +#undef GG_CONFIG_HAVE_PTHREAD
    +
    +/* Defined if pthread resolver is the default one. */
    +#undef GG_CONFIG_PTHREAD_DEFAULT
    +
    +/* Defined if this machine has C99-compiliant vsnprintf(). */
    +#undef GG_CONFIG_HAVE_C99_VSNPRINTF
    +
    +/* Defined if this machine has va_copy(). */
    +#undef GG_CONFIG_HAVE_VA_COPY
    +
    +/* Defined if this machine has __va_copy(). */
    +#undef GG_CONFIG_HAVE___VA_COPY
    +
    +/* Defined if this machine supports long long. */
    +#undef GG_CONFIG_HAVE_LONG_LONG
    +
    +/* Defined if libgadu was compiled and linked with GnuTLS support. */
    +#undef GG_CONFIG_HAVE_GNUTLS
    +
    +/* Defined if libgadu was compiled and linked with OpenSSL support. */
    +#undef GG_CONFIG_HAVE_OPENSSL
    +
    +/* Defined if libgadu was compiled and linked with zlib support. */
    +#undef GG_CONFIG_HAVE_ZLIB
    +
    +/* Defined if uintX_t types are defined in <stdint.h>. */
    +#undef GG_CONFIG_HAVE_STDINT_H
    +
    +/* Defined if uintX_t types are defined in <inttypes.h>. */
    +#undef GG_CONFIG_HAVE_INTTYPES_H
    +
    +/* Defined if uintX_t types are defined in <sys/inttypes.h>. */
    +#undef GG_CONFIG_HAVE_SYS_INTTYPES_H
    +
    +/* Defined if uintX_t types are defined in <sys/int_types.h>. */
    +#undef GG_CONFIG_HAVE_SYS_INT_TYPES_H
    +
    +/* Defined if uintX_t types are defined in <sys/types.h>. */
    +#undef GG_CONFIG_HAVE_SYS_TYPES_H
    +
    +/* Defined if this machine has uint64_t. */
    +#undef GG_CONFIG_HAVE_UINT64_T
    +
    +/* Defined if libgadu is GPL compliant (was not linked with OpenSSL or any
    + other non-GPL compliant library support). */
    +#undef GG_CONFIG_IS_GPL_COMPLIANT
    +
    +#include "config.h"
    +
    +#ifdef GG_CONFIG_HAVE_OPENSSL
    +#include <openssl/ssl.h>
    +#endif
    +
    +#ifdef GG_CONFIG_HAVE_STDINT_H
    +#include <stdint.h>
    +#else
    +# ifdef GG_CONFIG_HAVE_INTTYPES_H
    +# include <inttypes.h>
    +# else
    +# ifdef GG_CONFIG_HAVE_SYS_INTTYPES_H
    +# include <sys/inttypes.h>
    +# else
    +# ifdef GG_CONFIG_HAVE_SYS_INT_TYPES_H
    +# include <sys/int_types.h>
    +# else
    +# ifdef GG_CONFIG_HAVE_SYS_TYPES_H
    +# include <sys/types.h>
    +# else
    +
    +/* ISO C 9X: 7.18 Integer types <stdint.h> */
    +
    +typedef unsigned char uint8_t;
    +typedef unsigned short uint16_t;
    +typedef unsigned int uint32_t;
    +
    +# endif
    +# endif
    +# endif
    +# endif
    +#endif
    +
    +#ifndef GG_CONFIG_HAVE_UINT64_T
    +typedef unsigned long long uint64_t;
    +#endif
    +
    +#ifdef _MSC_VER
    +#include <BaseTsd.h>
    +typedef SSIZE_T ssize_t;
    +#endif
    +
    +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4))
    +# define GG_GNUC_PRINTF(format_idx, arg_idx) \
    + __attribute__((format (printf, (format_idx), (arg_idx))))
    +#else
    +# define GG_GNUC_PRINTF(format_idx, arg_idx)
    +#endif
    +
    +/** \endcond */
    +
    +/**
    + * Numer Gadu-Gadu.
    + */
    +typedef uint32_t uin_t;
    +
    +/**
    + * Identyfikator połączenia bezpośredniego Gadu-Gadu 7.x.
    + */
    +typedef struct {
    + uint8_t id[8];
    +} gg_dcc7_id_t;
    +
    +/**
    + * Identyfikator sesji multilogowania.
    + */
    +typedef struct {
    + uint8_t id[8];
    +} gg_multilogon_id_t;
    +
    +/**
    + * Makro deklarujące pola wspólne dla struktur sesji.
    + */
    +#define gg_common_head(x) \
    + int fd; /**< Obserwowany deskryptor */ \
    + int check; /**< Informacja o żądaniu odczytu/zapisu (patrz \ref gg_check_t) */ \
    + int state; /**< Aktualny stan połączenia (patrz \ref gg_state_t) */ \
    + int error; /**< Kod błędu dla \c GG_STATE_ERROR (patrz \ref gg_error_t) */ \
    + int type; /**< Rodzaj sesji (patrz \ref gg_session_t) */ \
    + int id; /**< Identyfikator sesji */ \
    + int timeout; /**< Czas pozostały do zakończenia stanu */ \
    + int (*callback)(x*); /**< Funkcja zwrotna */ \
    + void (*destroy)(x*); /**< Funkcja zwalniania zasobów */
    +
    +/**
    + * Struktura wspólna dla wszystkich sesji i połączeń. Pozwala na proste
    + * rzutowanie niezależne od rodzaju połączenia.
    + */
    +struct gg_common {
    + gg_common_head(struct gg_common)
    +};
    +
    +struct gg_image_queue;
    +
    +struct gg_dcc7;
    +
    +struct gg_dcc7_relay;
    +
    +struct gg_session_private;
    +
    +/**
    + * Sposób rozwiązywania nazw serwerów.
    + */
    +typedef enum {
    + GG_RESOLVER_DEFAULT = 0, /**< Domyślny sposób rozwiązywania nazw (jeden z poniższych) */
    + GG_RESOLVER_FORK, /**< RozwiÄ…zywanie nazw bazujÄ…ce na procesach */
    + GG_RESOLVER_PTHREAD, /**< RozwiÄ…zywanie nazw bazujÄ…ce na wÄ…tkach */
    + GG_RESOLVER_CUSTOM, /**< Funkcje rozwiÄ…zywania nazw dostarczone przed aplikacjÄ™ */
    + GG_RESOLVER_WIN32, /**< RozwiÄ…zywanie nazw bazujÄ…ce na wÄ…tkach Win32 */
    + GG_RESOLVER_INVALID = -1 /**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */
    +} gg_resolver_t;
    +
    +/**
    + * Rodzaj kodowania znaków.
    + */
    +typedef enum {
    + GG_ENCODING_CP1250 = 0, /**< Kodowanie CP1250 */
    + GG_ENCODING_UTF8, /**< Kodowanie UTF-8 */
    + GG_ENCODING_INVALID = -1 /**< Nieprawidłowe kodowanie */
    +} gg_encoding_t;
    +
    +/**
    + * Stopień kompatybilności ze starymi wersjami API.
    + */
    +typedef enum {
    + GG_COMPAT_LEGACY = 0, /**< Całkowita kompatybilność (nie wyłącza żadnych funkcji) */
    + GG_COMPAT_1_12_0 = 1 /**< Wyłącza: dostarczanie eventów GG_EVENT_ACK, stary format konferencji */
    +} gg_compat_t;
    +
    +/**
    + * Flaga połączenia szyfrowanego.
    + *
    + * \ingroup login
    + */
    +typedef enum {
    + GG_SSL_DISABLED = 0, /**< Połączenie SSL wyłączone */
    + GG_SSL_ENABLED, /**< Połączenie SSL włączone gdy dostępne. Błędny certyfikat serwera nie powoduje odrzucenia połączenia. */
    + GG_SSL_REQUIRED /**< Połączenie SSL wymagane. Błędny certyfikat serwera powoduje odrzucenie połączenia. */
    +} gg_ssl_t;
    +
    +/**
    + * Sesja Gadu-Gadu.
    + *
    + * Tworzona przez funkcjÄ™ \c gg_login(), zwalniana przez \c gg_free_session().
    + *
    + * \ingroup login
    + */
    +struct gg_session {
    + gg_common_head(struct gg_session)
    +
    + int async; /**< Flaga połączenia asynchronicznego */
    + int pid; /**< Numer procesu rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    + int port; /**< Port serwera */
    + int seq; /**< Numer sekwencyjny ostatniej wiadomości */
    + int last_pong; /**< Czas otrzymania ostatniej ramki utrzymaniowej */
    + int last_event; /**< Czas otrzymania ostatniego pakietu */
    +
    + struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
    +
    + uint32_t proxy_addr; /**< Adres serwera pośredniczącego */
    + uint16_t proxy_port; /**< Port serwera pośredniczącego */
    +
    + uint32_t hub_addr; /**< Adres huba po rozwiÄ…zaniu nazwy */
    + uint32_t server_addr; /**< Adres serwera otrzymany od huba */
    +
    + uint32_t client_addr; /**< Adres gniazda dla połączeń bezpośrednich */
    + uint16_t client_port; /**< Port gniazda dla połączeń bezpośrednich */
    +
    + uint32_t external_addr; /**< Publiczny adres dla połączeń bezpośrednich */
    + uint16_t external_port; /**< Publiczny port dla połączeń bezpośrednich */
    +
    + uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    + char *password; /**< Hasło (zwalniane po użyciu) */
    +
    + int initial_status; /**< PoczÄ…tkowy status */
    + int status; /**< Aktualny status */
    +
    + char *recv_buf; /**< Bufor na odbierane pakiety. Wskaźnik zawsze maksymalnie wyrównany, tak jak w wyniku działania \c malloc(). */
    + int recv_done; /**< Liczba wczytanych bajtów pakietu */
    + int recv_left; /**< Liczba pozostałych do wczytania bajtów pakietu */
    +
    + int protocol_version; /**< Wersja protokołu (bez flag) */
    + char *client_version; /**< Wersja klienta */
    + int last_sysmsg; /**< Numer ostatniej wiadomości systemowej */
    +
    + char *initial_descr; /**< PoczÄ…tkowy opis statusu */
    +
    + void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    +
    +#ifndef DOXYGEN
    + char *header_buf; /**< Bufor na początek nagłówka pakietu (nieaktualne) */
    + unsigned int header_done; /**< Liczba wczytanych bajtów nagłówka pakietu (nieaktualne) */
    +#endif
    +
    +#ifdef GG_CONFIG_HAVE_OPENSSL
    + SSL *ssl; /**< Struktura TLS */
    + SSL_CTX *ssl_ctx; /**< Kontekst sesji TLS */
    +#else
    + void *ssl; /**< Struktura TLS */
    + void *ssl_ctx; /**< Kontekst sesji TLS */
    +#endif
    +
    + int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    +
    + char *userlist_reply; /**< Bufor z odbieraną listą kontaktów */
    +
    + int userlist_blocks; /**< Liczba części listy kontaktów */
    +
    + struct gg_image_queue *images; /**< Lista wczytywanych obrazków */
    +
    + int hash_type; /**< Rodzaj funkcji skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1) */
    +
    + char *send_buf; /**< Bufor z danymi do wysłania */
    + int send_left; /**< Liczba bajtów do wysłania */
    +
    + struct gg_dcc7 *dcc7_list; /**< Lista połączeń bezpośrednich skojarzonych z sesją */
    +
    + int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_watch_fd() */
    +
    + int protocol_flags; /**< Flagi protokołu */
    +
    + gg_encoding_t encoding; /**< Rodzaj kodowania znaków */
    +
    + gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
    + int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynajÄ…ca rozwiÄ…zywanie nazwy */
    + void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniajÄ…ca zasoby po rozwiÄ…zaniu nazwy */
    +
    + int protocol_features; /**< Opcje protokołu */
    + int status_flags; /**< Flagi statusu */
    + int recv_msg_count; /**< Liczba odebranych wiadomości */
    +
    + const char *resolver_host; /**< Nazwa do rozwiÄ…zania */
    + struct in_addr *resolver_result; /**< Wynik rozwiÄ…zywania nazwy */
    + unsigned int resolver_index; /**< Indeks aktualnie obsługiwanego wyniku rozwiązywania nazwy */
    + unsigned int resolver_count; /**< Liczba wyników rozwiązywania nazwy */
    +
    + uint16_t connect_port[2]; /**< Lista portów do połączenia */
    + unsigned int connect_index; /**< Indeks aktualnie obsługiwanego portu */
    +
    + char *connect_host; /**< Adres serwera Gadu-Gadu, z którym się łączymy */
    + gg_ssl_t ssl_flag; /**< Flaga połączenia szyfrowanego */
    +
    + struct gg_session_private *private_data; /**< Prywatne dane sesji, nie udostępnione w API */
    +};
    +
    +/**
    + * Połączenie HTTP.
    + *
    + * Tworzone przez \c gg_http_connect(), zwalniane przez \c gg_http_free().
    + *
    + * \ingroup http
    + */
    +struct gg_http {
    + gg_common_head(struct gg_http)
    +
    + int async; /**< Flaga połączenia asynchronicznego */
    + int pid; /**< Identyfikator procesu rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    + int port; /**< Port */
    +
    + char *query; /**< Zapytanie HTTP */
    + char *header; /**< Odebrany nagłówek */
    + int header_size; /**< Rozmiar wczytanego nagłówka */
    + char *body; /**< Odebrana strona */
    + unsigned int body_size; /**< Rozmiar strony */
    +
    + void *data; /**< Dane prywatne usługi HTTP */
    +
    + char *user_data; /**< Dane prywatne użytkownika (nie są zwalniane) */
    +
    + void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ */
    +
    + unsigned int body_done; /**< Liczba odebranych bajtów strony */
    +
    + gg_resolver_t resolver_type; /**< Sposób rozwiązywania nazw serwerów */
    + int (*resolver_start)(int *fd, void **private_data, const char *hostname); /**< Funkcja rozpoczynajÄ…ca rozwiÄ…zywanie nazwy */
    + void (*resolver_cleanup)(void **private_data, int force); /**< Funkcja zwalniajÄ…ca zasoby po rozwiÄ…zaniu nazwy */
    +};
    +
    +/** \cond ignore */
    +
    +#ifdef __GNUC__
    +#define GG_PACKED __attribute__ ((packed))
    +#ifndef GG_IGNORE_DEPRECATED
    +#define GG_DEPRECATED __attribute__ ((deprecated))
    +#else
    +#define GG_DEPRECATED
    +#endif
    +#else
    +#define GG_PACKED
    +#define GG_DEPRECATED
    +#endif
    +
    +/** \endcond */
    +
    +#define GG_MAX_PATH 276 /**< Maksymalny rozmiar nazwy pliku w strukturze \c gg_file_info */
    +
    +/**
    + * Odpowiednik struktury WIN32_FIND_DATA z API WIN32.
    + *
    + * Wykorzystywana przy połączeniach bezpośrednich do wersji Gadu-Gadu 6.x.
    + */
    +struct gg_file_info {
    + uint32_t mode; /**< dwFileAttributes */
    + uint32_t ctime[2]; /**< ftCreationTime */
    + uint32_t atime[2]; /**< ftLastAccessTime */
    + uint32_t mtime[2]; /**< ftLastWriteTime */
    + uint32_t size_hi; /**< nFileSizeHigh */
    + uint32_t size; /**< nFileSizeLow */
    + uint32_t reserved0; /**< dwReserved0 */
    + uint32_t reserved1; /**< dwReserved1 */
    + unsigned char filename[GG_MAX_PATH - 14]; /**< cFileName */
    + unsigned char short_filename[14]; /**< cAlternateFileName */
    +} /** \cond ignore */ GG_PACKED /** \endcond */;
    +
    +/**
    + * Połączenie bezpośrednie do wersji Gadu-Gadu 6.x.
    + *
    + * Tworzone przez \c gg_dcc_socket_create(), \c gg_dcc_get_file(),
    + * \c gg_dcc_send_file() lub \c gg_dcc_voice_chat(), zwalniane przez
    + * \c gg_dcc_free().
    + *
    + * \ingroup dcc6
    + */
    +struct gg_dcc {
    + gg_common_head(struct gg_dcc)
    +
    + struct gg_event *event; /**< Zdarzenie po wywołaniu \c callback */
    +
    + int active; /**< Flaga połączenia aktywnego (nieużywana) */
    + int port; /**< Port gniazda nasłuchującego */
    + uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    + uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
    + int file_fd; /**< deskryptor pliku */
    + unsigned int offset; /**< Położenie w pliku */
    + unsigned int chunk_size;
    + /**< Rozmiar kawałka pliku */
    + unsigned int chunk_offset;
    + /**< Położenie w aktualnym kawałku pliku */
    + struct gg_file_info file_info;
    + /**< Informacje o pliku */
    + int established; /**< Flaga ustanowienia połączenia */
    + char *voice_buf; /**< Bufor na pakiet połączenia głosowego */
    + int incoming; /**< Flaga połączenia przychodzącego */
    + char *chunk_buf; /**< Bufor na fragment danych */
    + uint32_t remote_addr; /**< Adres drugiej strony */
    + uint16_t remote_port; /**< Port drugiej strony */
    +};
    +
    +#define GG_DCC7_HASH_LEN 20 /**< Maksymalny rozmiar skrótu pliku w połączeniach bezpośrenich */
    +#define GG_DCC7_FILENAME_LEN 255 /**< Maksymalny rozmiar nazwy pliku w połączeniach bezpośrednich */
    +#define GG_DCC7_INFO_LEN 32 /**< Maksymalny rozmiar informacji o połączeniach bezpośrednich */
    +#define GG_DCC7_INFO_HASH_LEN 32 /**< Maksymalny rozmiar skrótu ip informacji o połączeniach bezpośrednich */
    +
    +/**
    + * Połączenie bezpośrednie od wersji Gadu-Gadu 7.x.
    + *
    + * \ingroup dcc7
    + */
    +struct gg_dcc7 {
    + gg_common_head(struct gg_dcc7)
    +
    + gg_dcc7_id_t cid; /**< Identyfikator połączenia */
    +
    + struct gg_event *event; /**< Struktura zdarzenia */
    +
    + uin_t uin; /**< WÅ‚asny numer Gadu-Gadu */
    + uin_t peer_uin; /**< Numer Gadu-Gadu drugiej strony połączenia */
    +
    + int file_fd; /**< Deskryptor przesyłanego pliku */
    + unsigned int offset; /**< Aktualne położenie w przesyłanym pliku */
    + unsigned int size; /**< Rozmiar przesyłanego pliku */
    + unsigned char filename[GG_DCC7_FILENAME_LEN + 1];
    + /**< Nazwa przesyłanego pliku */
    + unsigned char hash[GG_DCC7_HASH_LEN];
    + /**< Skrót SHA1 przesyłanego pliku */
    +
    + int dcc_type; /**< Rodzaj połączenia bezpośredniego */
    + int established; /**< Flaga ustanowienia połączenia */
    + int incoming; /**< Flaga połączenia przychodzącego */
    + int reverse; /**< Flaga połączenia zwrotnego */
    +
    + uint32_t local_addr; /**< Adres lokalny */
    + uint16_t local_port; /**< Port lokalny */
    +
    + uint32_t remote_addr; /**< Adres drugiej strony */
    + uint16_t remote_port; /**< Port drugiej strony */
    +
    + struct gg_session *sess;
    + /**< Sesja do której przypisano połączenie */
    + struct gg_dcc7 *next; /**< Następne połączenie w liście */
    +
    + int soft_timeout; /**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_dcc7_watch_fd() */
    + int seek; /**< Flaga mówiąca, że można zmieniać położenie w wysyłanym pliku */
    +
    + void *resolver; /**< Dane prywatne procesu lub wÄ…tku rozwiÄ…zujÄ…cego nazwÄ™ serwera */
    +
    + int relay; /**< Flaga mówiąca, że laczymy sie przez serwer */
    + int relay_index; /**< Numer serwera pośredniczącego, do którego się łączymy */
    + int relay_count; /**< Rozmiar listy serwerów pośredniczących */
    + struct gg_dcc7_relay *relay_list; /**< Lista serwerów pośredniczących */
    +};
    +
    +/**
    + * Rodzaj sesji.
    + */
    +enum gg_session_t {
    + GG_SESSION_GG = 1, /**< Połączenie z serwerem Gadu-Gadu */
    + GG_SESSION_HTTP, /**< Połączenie HTTP */
    + GG_SESSION_SEARCH, /**< Wyszukiwanie w katalogu publicznym (nieaktualne) */
    + GG_SESSION_REGISTER, /**< Rejestracja nowego konta */
    + GG_SESSION_REMIND, /**< Przypominanie hasła */
    + GG_SESSION_PASSWD, /**< Zmiana hasła */
    + GG_SESSION_CHANGE, /**< Zmiana informacji w katalogu publicznym (nieaktualne) */
    + GG_SESSION_DCC, /**< Połączenie bezpośrednie (do wersji 6.x) */
    + GG_SESSION_DCC_SOCKET, /**< Gniazdo nasłuchujące (do wersji 6.x) */
    + GG_SESSION_DCC_SEND, /**< Wysyłanie pliku (do wersji 6.x) */
    + GG_SESSION_DCC_GET, /**< Odbieranie pliku (do wersji 6.x) */
    + GG_SESSION_DCC_VOICE, /**< Rozmowa głosowa (do wersji 6.x) */
    + GG_SESSION_USERLIST_GET, /**< Import listy kontaktów z serwera (nieaktualne) */
    + GG_SESSION_USERLIST_PUT, /**< Eksport listy kontaktów do serwera (nieaktualne) */
    + GG_SESSION_UNREGISTER, /**< Usuwanie konta */
    + GG_SESSION_USERLIST_REMOVE, /**< Usuwanie listy kontaktów z serwera (nieaktualne) */
    + GG_SESSION_TOKEN, /**< Pobieranie tokenu */
    + GG_SESSION_DCC7_SOCKET, /**< Gniazdo nasłuchujące (od wersji 7.x) */
    + GG_SESSION_DCC7_SEND, /**< Wysyłanie pliku (od wersji 7.x) */
    + GG_SESSION_DCC7_GET, /**< Odbieranie pliku (od wersji 7.x) */
    + GG_SESSION_DCC7_VOICE, /**< Rozmowa głosowa (od wersji 7.x) */
    +
    + GG_SESSION_USER0 = 256, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER1, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER2, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER3, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER4, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER5, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER6, /**< Rodzaj zadeklarowany dla użytkownika */
    + GG_SESSION_USER7 /**< Rodzaj zadeklarowany dla użytkownika */
    +};
    +
    +/**
    + * Aktualny stan sesji.
    + */
    +enum gg_state_t {
    + /* wspólne */
    + GG_STATE_IDLE = 0, /**< Nie dzieje siÄ™ nic */
    + GG_STATE_RESOLVING, /**< Oczekiwanie na rozwiÄ…zanie nazwy serwera */
    + GG_STATE_CONNECTING, /**< Oczekiwanie na połączenie */
    + GG_STATE_READING_DATA, /**< Oczekiwanie na dane */
    + GG_STATE_ERROR, /**< Kod błędu w polu \c error */
    +
    + /* gg_session */
    + GG_STATE_CONNECTING_HUB, /**< Oczekiwanie na połączenie z hubem */
    + GG_STATE_CONNECTING_GG, /**< Oczekiwanie na połączenie z serwerem */
    + GG_STATE_READING_KEY, /**< Oczekiwanie na klucz */
    + GG_STATE_READING_REPLY, /**< Oczekiwanie na odpowiedź serwera */
    + GG_STATE_CONNECTED, /**< Połączono z serwerem */
    +
    + /* gg_http */
    + GG_STATE_SENDING_QUERY, /**< Wysłano zapytanie HTTP */
    + GG_STATE_READING_HEADER, /**< Oczekiwanie na nagłówek HTTP */
    + GG_STATE_PARSING, /**< Przetwarzanie danych */
    + GG_STATE_DONE, /**< Połączenie zakończone */
    +
    + /* gg_dcc */
    + GG_STATE_LISTENING, /* czeka na połączenia */
    + GG_STATE_READING_UIN_1, /* czeka na uin peera */
    + GG_STATE_READING_UIN_2, /* czeka na swój uin */
    + GG_STATE_SENDING_ACK, /* wysyła potwierdzenie dcc */
    + GG_STATE_READING_ACK, /* czeka na potwierdzenie dcc */
    + GG_STATE_READING_REQUEST, /* czeka na komendÄ™ */
    + GG_STATE_SENDING_REQUEST, /* wysyła komendę */
    + GG_STATE_SENDING_FILE_INFO, /* wysyła informacje o pliku */
    + GG_STATE_READING_PRE_FILE_INFO, /* czeka na pakiet przed file_info */
    + GG_STATE_READING_FILE_INFO, /* czeka na informacje o pliku */
    + GG_STATE_SENDING_FILE_ACK, /* wysyła potwierdzenie pliku */
    + GG_STATE_READING_FILE_ACK, /* czeka na potwierdzenie pliku */
    + GG_STATE_SENDING_FILE_HEADER, /* wysyła nagłówek pliku */
    + GG_STATE_READING_FILE_HEADER, /* czeka na nagłówek */
    + GG_STATE_GETTING_FILE, /* odbiera plik */
    + GG_STATE_SENDING_FILE, /* wysyła plik */
    + GG_STATE_READING_VOICE_ACK, /* czeka na potwierdzenie voip */
    + GG_STATE_READING_VOICE_HEADER, /* czeka na rodzaj bloku voip */
    + GG_STATE_READING_VOICE_SIZE, /* czeka na rozmiar bloku voip */
    + GG_STATE_READING_VOICE_DATA, /* czeka na dane voip */
    + GG_STATE_SENDING_VOICE_ACK, /* wysyła potwierdzenie voip */
    + GG_STATE_SENDING_VOICE_REQUEST, /* wysyła żądanie voip */
    + GG_STATE_READING_TYPE, /* czeka na typ połączenia */
    +
    + /* nowe. bez sensu jest to API. */
    + GG_STATE_TLS_NEGOTIATION, /**< Negocjacja połączenia szyfrowanego */
    +
    + GG_STATE_REQUESTING_ID, /**< Oczekiwanie na nadanie identyfikatora połączenia bezpośredniego */
    + GG_STATE_WAITING_FOR_ACCEPT, /**< Oczekiwanie na potwierdzenie lub odrzucenie połączenia bezpośredniego */
    + GG_STATE_WAITING_FOR_INFO, /**< Oczekiwanie na informacje o połączeniu bezpośrednim */
    +
    + GG_STATE_READING_ID, /**< Odebranie identyfikatora połączenia bezpośredniego */
    + GG_STATE_SENDING_ID, /**< Wysłano identyfikator połączenia bezpośredniego */
    + GG_STATE_RESOLVING_GG, /**< Oczekiwanie na rozwiÄ…zanie nazwy serwera Gadu-Gadu */
    +
    + GG_STATE_RESOLVING_RELAY, /**< Oczekiwanie na rozwiązanie nazwy serwera pośredniczącego */
    + GG_STATE_CONNECTING_RELAY, /**< Oczekiwanie na połączenie z serwerem pośredniczącym */
    + GG_STATE_READING_RELAY, /**< Odbieranie danych */
    +
    + GG_STATE_DISCONNECTING, /**< Oczekiwanie na potwierdzenie rozłączenia */
    +
    + GG_STATE_CONNECT_HUB, /**< Nawiązanie połączenia z hubem */
    + GG_STATE_CONNECT_PROXY_HUB,
    + GG_STATE_CONNECT_GG, /**< Nawiązanie połączenia z serwerem */
    + GG_STATE_CONNECT_PROXY_GG,
    + GG_STATE_CONNECTING_PROXY_HUB,
    + GG_STATE_CONNECTING_PROXY_GG,
    + GG_STATE_RESOLVE_HUB_SYNC,
    + GG_STATE_RESOLVE_HUB_ASYNC,
    + GG_STATE_RESOLVE_PROXY_HUB_SYNC,
    + GG_STATE_RESOLVE_PROXY_HUB_ASYNC,
    + GG_STATE_RESOLVE_PROXY_GG_SYNC,
    + GG_STATE_RESOLVE_PROXY_GG_ASYNC,
    + GG_STATE_RESOLVE_GG_SYNC,
    + GG_STATE_RESOLVE_GG_ASYNC,
    + GG_STATE_RESOLVING_HUB,
    + GG_STATE_RESOLVING_PROXY_HUB,
    + GG_STATE_RESOLVING_PROXY_GG,
    + GG_STATE_SEND_HUB,
    + GG_STATE_SEND_PROXY_HUB,
    + GG_STATE_SEND_PROXY_GG,
    + GG_STATE_SENDING_HUB,
    + GG_STATE_SENDING_PROXY_HUB,
    + GG_STATE_SENDING_PROXY_GG,
    + GG_STATE_READING_HUB,
    + GG_STATE_READING_PROXY_HUB,
    + GG_STATE_READING_PROXY_GG,
    +};
    +
    +/**
    + * Informacja o tym, czy biblioteka chce zapisywać i/lub czytać
    + * z deskryptora. Maska bitowa.
    + *
    + * \ingroup events
    + */
    +enum gg_check_t {
    + GG_CHECK_NONE = 0, /**< Nie sprawdzaj niczego */
    + GG_CHECK_WRITE = 1, /**< Sprawdź możliwość zapisu */
    + GG_CHECK_READ = 2 /**< Sprawdź możliwość odczytu */
    +};
    +
    +/**
    + * Metody nawiązywania połączeń TCP/TLS.
    + *
    + * \ingroup socketmanager
    + */
    +typedef enum {
    + GG_SOCKET_MANAGER_TYPE_INTERNAL = 0, /**< Wewnętrzna obsługa gniazd (domyślne). */
    + GG_SOCKET_MANAGER_TYPE_TCP, /**< Dostarczona przez aplikację - tylko obsługa TCP. */
    + GG_SOCKET_MANAGER_TYPE_TLS /**< Dostarczona przez aplikację - obsługa zarówno TCP, jak i TLS. */
    +} gg_socket_manager_type_t;
    +
    +/**
    + * Funkcja dostarczona przez aplikacjÄ™, tworzÄ…ca nowe gniazdo TCP/TLS.
    + *
    + * Po nawiązaniu połączenia aplikacja musi wywołać gg_socket_manager_connected.
    + * Jeżeli połączenie jest asynchroniczne, wywołanie musi nastąpić po wyjściu z
    + * kontekstu tej funkcji. Dla połączeń synchronicznych z kolei, musi nastąpić
    + * jeszcze przed wyjściem z kontekstu.
    + *
    + * \param cb_data Dane prywatne aplikacji
    + * \param host Nazwa hosta
    + * \param port Numer portu
    + * \param is_tls Flaga określająca, czy ma zostać nawiązane połączenie TLS
    + * \param is_async Flaga określająca połączenie asynchroniczne (patrz szczegóły powyżej)
    + * \param priv Dane prywatne biblioteki libgadu (do przekazania do gg_socket_manager_connected)
    + *
    + * \return Uchwyt gniazda
    + *
    + * \ingroup socketmanager
    + */
    +typedef void* (*gg_socket_manager_connect_cb_t)(void *cb_data, const char *host, int port, int is_tls, int is_async, void *priv);
    +
    +/**
    + * Niszczy gniazdo i zwalnia wszystkie powiÄ…zane z nim zasoby.
    + *
    + * \param cb_data Dane prywatne aplikacji
    + * \param handle Uchwyt gniazda
    + *
    + * \ingroup socketmanager
    + */
    +typedef void (*gg_socket_manager_close_cb_t)(void *cb_data, void *handle);
    +
    +/**
    + * Odbiera z gniazda dane binarne.
    + *
    + * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
    + *
    + * \param cb_data Dane prywatne aplikacji
    + * \param handle Uchwyt gniazda
    + * \param buffer Bufor do zapisu danych
    + * \param bufsize Rozmiar bufora
    + *
    + * \return Ilość zapisanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
    + *
    + * \ingroup socketmanager
    + */
    +typedef ssize_t (*gg_socket_manager_read_cb_t)(void *cb_data, void *handle, unsigned char *buffer, size_t bufsize);
    +
    +/**
    + * Wysyła przez gniazdo dane binarne.
    + *
    + * Funkcja powinna zajmować się obsługą TLS, jeżeli gniazdo jest w takim trybie.
    + *
    + * \param cb_data Dane prywatne aplikacji
    + * \param handle Uchwyt gniazda
    + * \param data Dane do wysłania
    + * \param length Rozmiar danych
    + *
    + * \return Ilość wysłanych danych, lub -1 (oraz ustawiony errno) w przypadku niepowodzenia
    + *
    + * \ingroup socketmanager
    + */
    +typedef ssize_t (*gg_socket_manager_write_cb_t)(void *cb_data, void *handle, const unsigned char *data, size_t length);
    +
    +/**
    + * Struktura opisująca funkcje zarządzające gniazdami, jeżeli aplikacja sama je
    + * obsługuje.
    + *
    + * \ingroup socketmanager
    + */
    +typedef struct {
    + void *cb_data; /**< Dane prywatne aplikacji */
    + gg_socket_manager_connect_cb_t connect_cb; /**< Funkcja tworzÄ…ca nowe gniazdo */
    + gg_socket_manager_close_cb_t close_cb; /**< Funkcja niszczÄ…ca gniazdo */
    + gg_socket_manager_read_cb_t read_cb; /**< Funkcja odczytujÄ…ca dane z gniazda */
    + gg_socket_manager_write_cb_t write_cb; /**< Funkcja wysyłająca dane przez gniazdo */
    +#ifndef DOXYGEN
    + void *reserved1;
    + void *reserved2;
    + void *reserved3;
    + void *reserved4;
    +#endif
    +} gg_socket_manager_t;
    +
    +int gg_socket_manager_connected(void *handle, void *priv, int fd);
    +
    +/**
    + * Parametry połączenia z serwerem Gadu-Gadu. Parametry zostały przeniesione
    + * do struktury, by uniknąć zmian API po rozszerzeniu protokołu i dodaniu
    + * kolejnych opcji połączenia. Część parametrów, które nie są już aktualne
    + * lub nie mają znaczenia, została usunięta z dokumentacji.
    + *
    + * \ingroup login
    + */
    +struct gg_login_params {
    + uin_t uin; /**< Numer Gadu-Gadu */
    + char *password; /**< Hasło */
    + int async; /**< Flaga asynchronicznego połączenia (domyślnie nie) */
    + int status; /**< Początkowy status użytkownika (domyślnie \c GG_STATUS_AVAIL) */
    + char *status_descr; /**< Początkowy opis użytkownika (domyślnie brak) */
    + uint32_t server_addr; /**< Adres serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
    + uint16_t server_port; /**< Port serwera Gadu-Gadu (domyślnie pobierany automatycznie) */
    + uint32_t client_addr; /**< Adres połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    + uint16_t client_port; /**< Port połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    + int protocol_version; /**< Wersja protokołu wysyłana do serwera (domyślnie najnowsza obsługiwana) */
    + char *client_version; /**< Wersja klienta wysyłana do serwera (domyślnie najnowsza znana) */
    + int has_audio; /**< Flaga obsługi połączeń głosowych */
    + int last_sysmsg; /**< Numer ostatnio odebranej wiadomości systemowej */
    + uint32_t external_addr; /**< Adres publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    + uint16_t external_port; /**< Port publiczny dla połączeń bezpośrednich (domyślnie dobierany automatycznie) */
    + int tls; /**< Flaga połączenia szyfrowanego (patrz \ref gg_ssl_t) */
    + int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w kilobajtach */
    +#ifndef DOXYGEN
    + int era_omnix; /**< Flaga udawania klienta Era Omnix (nieaktualna) */
    +#endif
    + int hash_type; /**< Rodzaj skrótu hasła (\c GG_LOGIN_HASH_GG32 lub \c GG_LOGIN_HASH_SHA1, domyślnie SHA1) */
    + gg_encoding_t encoding; /**< Rodzaj kodowania używanego w sesji (domyślnie CP1250) */
    + gg_resolver_t resolver; /**< Sposób rozwiązywania nazw (patrz \ref build-resolver) */
    + int protocol_features; /**< Opcje protokołu (flagi GG_FEATURE_*). */
    + int status_flags; /**< Flagi statusu (flagi GG_STATUS_FLAG_*, patrz \ref status). */
    +
    + unsigned int struct_size; /**< Rozmiar struktury. To pole powinno być inicjowane wartością sizeof(struct gg_login_params) - w przeciwnym przypadku pola za nim nie będą obsługiwane. Pozwala na rozszerzanie struktury bez łamania ABI. */
    +
    + gg_compat_t compatibility; /**< Stopień kompatybilności ze starym API. */
    +
    + char *connect_host; /**< Nazwa hosta (oraz opcjonalnie port, podany po dwukropku) serwera Gadu-Gadu (domyślnie pobierany automatycznie) (patrz pole struct_size). */
    +
    + gg_socket_manager_type_t socket_manager_type; /**< Wybrana metoda nawiązywania połączeń TCP/TLS (domyślnie wewnętrzna) */
    + gg_socket_manager_t socket_manager; /**< Jeżeli wybrano metodę zewnętrzną - konfiguracja jej */
    +
    + char **host_white_list; /**< Lista zakończona wskaźnikiem NULL, domen akceptowanych w odpowiedziach od huba (domyślnie wszystkie do tej pory znane). Używane tylko przy GG_SSL_REQUIRED. Pusta lista wyłącza sprawdzanie. */
    +};
    +
    +#ifdef GG_CONFIG_IS_GPL_COMPLIANT
    +int gg_is_gpl_compliant(void);
    +#endif
    +struct gg_session *gg_login(const struct gg_login_params *p);
    +void gg_free_session(struct gg_session *sess);
    +void gg_logoff(struct gg_session *sess);
    +int gg_change_status(struct gg_session *sess, int status);
    +int gg_change_status_descr(struct gg_session *sess, int status, const char *descr);
    +int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time);
    +int gg_change_status_flags(struct gg_session *sess, int flags);
    +int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message);
    +int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen);
    +int gg_send_message_html(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *html_message);
    +int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message);
    +int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen);
    +int gg_send_message_confer_html(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *html_message);
    +int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len);
    +int gg_ping(struct gg_session *sess);
    +int gg_userlist_request(struct gg_session *sess, char type, const char *request);
    +int gg_userlist100_request(struct gg_session *sess, char type, unsigned int version, char format_type, const char *request);
    +int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32);
    +int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size);
    +int gg_typing_notification(struct gg_session *sess, uin_t recipient, int length);
    +
    +uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len);
    +
    +int gg_session_set_resolver(struct gg_session *gs, gg_resolver_t type);
    +gg_resolver_t gg_session_get_resolver(struct gg_session *gs);
    +int gg_session_set_custom_resolver(struct gg_session *gs, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    +
    +int gg_http_set_resolver(struct gg_http *gh, gg_resolver_t type);
    +gg_resolver_t gg_http_get_resolver(struct gg_http *gh);
    +int gg_http_set_custom_resolver(struct gg_http *gh, int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    +
    +int gg_global_set_resolver(gg_resolver_t type);
    +gg_resolver_t gg_global_get_resolver(void);
    +int gg_global_set_custom_resolver(int (*resolver_start)(int*, void**, const char*), void (*resolver_cleanup)(void**, int));
    +
    +int gg_multilogon_disconnect(struct gg_session *gs, gg_multilogon_id_t conn_id);
    +
    +int gg_chat_create(struct gg_session *gs);
    +int gg_chat_invite(struct gg_session *gs, uint64_t id, uin_t *participants, unsigned int participants_count);
    +int gg_chat_leave(struct gg_session *gs, uint64_t id);
    +int gg_chat_send_message(struct gg_session *gs, uint64_t id, const char *message, int is_html);
    +
    +/**
    + * Rodzaj zdarzenia.
    + *
    + * \ingroup events
    + */
    +enum gg_event_t {
    + GG_EVENT_NONE = 0, /**< Nie wydarzyło się nic wartego uwagi */
    + GG_EVENT_MSG, /**< \brief Otrzymano wiadomość. Przekazuje również wiadomości systemowe od numeru 0. */
    + GG_EVENT_NOTIFY, /**< \brief Informacja o statusach osób z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane. */
    + GG_EVENT_NOTIFY_DESCR, /**< \brief Informacja o statusie opisowym osoby z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. */
    + GG_EVENT_STATUS, /**< \brief Zmiana statusu osoby z listy kontaktów (przed 6.0). Zdarzenie należy obsługiwać, jeśli planuje się używać protokołu w wersji starszej niż domyślna. */
    + GG_EVENT_ACK, /**< Potwierdzenie doręczenia wiadomości */
    + GG_EVENT_PONG, /**< \brief Utrzymanie połączenia. Obecnie serwer nie wysyła już do klienta ramek utrzymania połączenia, polega wyłącznie na wysyłaniu ramek przez klienta. */
    + GG_EVENT_CONN_FAILED, /**< \brief Nie udało się połączyć */
    + GG_EVENT_CONN_SUCCESS, /**< \brief Połączono z serwerem. Pierwszą rzeczą, jaką należy zrobić jest wysłanie listy kontaktów. */
    + GG_EVENT_DISCONNECT, /**< \brief Serwer zrywa połączenie. Zdarza się, gdy równolegle do serwera podłączy się druga sesja i trzeba zerwać połączenie z pierwszą. */
    +
    + GG_EVENT_DCC_NEW, /**< Nowe połączenie bezpośrednie (6.x) */
    + GG_EVENT_DCC_ERROR, /**< Błąd połączenia bezpośredniego (6.x) */
    + GG_EVENT_DCC_DONE, /**< Zakończono połączenie bezpośrednie (6.x) */
    + GG_EVENT_DCC_CLIENT_ACCEPT, /**< Moment akceptacji klienta w połączeniu bezpośrednim (6.x) */
    + GG_EVENT_DCC_CALLBACK, /**< Zwrotne połączenie bezpośrednie (6.x) */
    + GG_EVENT_DCC_NEED_FILE_INFO, /**< Należy wypełnić \c file_info dla połączenia bezpośredniego (6.x) */
    + GG_EVENT_DCC_NEED_FILE_ACK, /**< Czeka na potwierdzenie pliku w połączeniu bezpośrednim (6.x) */
    + GG_EVENT_DCC_NEED_VOICE_ACK, /**< Czeka na potwierdzenie rozmowy w połączeniu bezpośrednim (6.x) */
    + GG_EVENT_DCC_VOICE_DATA, /**< Dane bezpośredniego połączenia głosowego (6.x) */
    +
    + GG_EVENT_PUBDIR50_SEARCH_REPLY, /**< Odpowiedź katalogu publicznego */
    + GG_EVENT_PUBDIR50_READ, /**< Odczytano własne dane z katalogu publicznego */
    + GG_EVENT_PUBDIR50_WRITE, /**< Zmieniono własne dane w katalogu publicznym */
    +
    + GG_EVENT_STATUS60, /**< Zmiana statusu osoby z listy kontaktów */
    + GG_EVENT_NOTIFY60, /**< Informacja o statusach osób z listy kontaktów. Ostatni element tablicy zawiera uin równy 0, a pozostałe pola są niezainicjowane. */
    + GG_EVENT_USERLIST, /**< Wynik importu lub eksportu listy kontaktów */
    + GG_EVENT_IMAGE_REQUEST, /**< Żądanie przesłania obrazka z wiadomości */
    + GG_EVENT_IMAGE_REPLY, /**< Przysłano obrazek z wiadomości */
    + GG_EVENT_DCC_ACK, /**< Potwierdzenie transmisji w połączeniu bezpośrednim (6.x) */
    +
    + GG_EVENT_DCC7_NEW, /**< Nowe połączenie bezpośrednie (7.x) */
    + GG_EVENT_DCC7_ACCEPT, /**< Zaakceptowano połączenie bezpośrednie (7.x), nowy deskryptor */
    + GG_EVENT_DCC7_REJECT, /**< Odrzucono połączenie bezpośrednie (7.x) */
    + GG_EVENT_DCC7_CONNECTED, /**< Zestawiono połączenie bezpośrednie (7.x), nowy deskryptor */
    + GG_EVENT_DCC7_ERROR, /**< Błąd połączenia bezpośredniego (7.x) */
    + GG_EVENT_DCC7_DONE, /**< Zakończono połączenie bezpośrednie (7.x) */
    + GG_EVENT_DCC7_PENDING, /**< Trwa próba połączenia bezpośredniego (7.x), nowy deskryptor */
    +
    + GG_EVENT_XML_EVENT, /**< Otrzymano komunikat systemowy (7.7) */
    + GG_EVENT_DISCONNECT_ACK, /**< \brief Potwierdzenie zakończenia sesji. Informuje o tym, że zmiana stanu na niedostępny z opisem dotarła do serwera i można zakończyć połączenie TCP. */
    + GG_EVENT_TYPING_NOTIFICATION, /**< Powiadomienie o pisaniu */
    + GG_EVENT_USER_DATA, /**< Informacja o kontaktach */
    + GG_EVENT_MULTILOGON_MSG, /**< Wiadomość wysłana z innej sesji multilogowania */
    + GG_EVENT_MULTILOGON_INFO, /**< Informacja o innych sesjach multilogowania */
    +
    + GG_EVENT_USERLIST100_VERSION, /**< Otrzymano numer wersji listy kontaktów na serwerze (10.0) */
    + GG_EVENT_USERLIST100_REPLY, /**< Wynik importu lub eksportu listy kontaktów (10.0) */
    +
    + GG_EVENT_IMTOKEN, /**< Otrzymano ciÄ…g IMTOKEN (11.0) */
    + GG_EVENT_PONG110, /**< \brief Utrzymanie połączenia (11.0). Może służyć do synchronizacji czasu z serwerem. */
    + GG_EVENT_JSON_EVENT, /**< Otrzymano komunikat systemowy (11.0) */
    + GG_EVENT_ACK110, /**< Potwierdzenie wysłania wiadomości (11.0) */
    +
    + GG_EVENT_CHAT_INFO, /**< Otrzymano informacjÄ™ o konferencji (11.0). */
    + GG_EVENT_CHAT_INFO_GOT_ALL, /**< \brief Informacje o wszystkich konferencjach zostały już wysłane (11.0). Otrzymywany po ostatnim pakiecie \c GG_EVENT_CHAT_INFO */
    + GG_EVENT_CHAT_INFO_UPDATE, /**< \brief Aktualizacja informacji o konferencji (11.0). Dodanie, usunięcie jednego z uczestników. */
    + GG_EVENT_CHAT_CREATED, /**< Potwierdzenie utworzenia konferencji (11.0) */
    + GG_EVENT_CHAT_INVITE_ACK, /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) */
    +};
    +
    +#define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY
    +
    +/**
    + * Powód nieudanego połączenia.
    + */
    +enum gg_failure_t {
    + GG_FAILURE_RESOLVING = 1, /**< Nie znaleziono serwera */
    + GG_FAILURE_CONNECTING, /**< Błąd połączenia */
    + GG_FAILURE_INVALID, /**< Serwer zwrócił nieprawidłowe dane */
    + GG_FAILURE_READING, /**< Zerwano połączenie podczas odczytu */
    + GG_FAILURE_WRITING, /**< Zerwano połączenie podczas zapisu */
    + GG_FAILURE_PASSWORD, /**< Nieprawidłowe hasło */
    + GG_FAILURE_404, /**< Nieużywane */
    + GG_FAILURE_TLS, /**< Błąd negocjacji szyfrowanego połączenia */
    + GG_FAILURE_NEED_EMAIL, /**< Serwer rozłączył nas z prośbą o zmianę adresu e-mail */
    + GG_FAILURE_INTRUDER, /**< Zbyt wiele prób połączenia z nieprawidłowym hasłem */
    + GG_FAILURE_UNAVAILABLE, /**< Serwery są wyłączone */
    + GG_FAILURE_PROXY, /**< Błąd serwera pośredniczącego */
    + GG_FAILURE_HUB, /**< Błąd połączenia z hubem */
    + GG_FAILURE_INTERNAL, /**< Błąd wewnętrzny */
    +};
    +
    +/**
    + * Kod błędu danej operacji.
    + *
    + * Nie zawiera przesadnie szczegółowych informacji o powodach błędów, by nie
    + * komplikować ich obsługi. Jeśli wymagana jest większa dokładność, należy
    + * sprawdzić zawartość zmiennej systemowej \c errno.
    + */
    +enum gg_error_t {
    + GG_ERROR_RESOLVING = 1, /**< Nie znaleziono hosta */
    + GG_ERROR_CONNECTING, /**< Błąd połączenia */
    + GG_ERROR_READING, /**< BÅ‚Ä…d odczytu/odbierania */
    + GG_ERROR_WRITING, /**< Błąd zapisu/wysyłania */
    +
    + GG_ERROR_DCC_HANDSHAKE, /**< BÅ‚Ä…d negocjacji */
    + GG_ERROR_DCC_FILE, /**< BÅ‚Ä…d odczytu/zapisu pliku */
    + GG_ERROR_DCC_EOF, /**< Przedwczesny koniec pliku */
    + GG_ERROR_DCC_NET, /**< Błąd wysyłania/odbierania */
    + GG_ERROR_DCC_REFUSED, /**< Połączenie odrzucone */
    +
    + GG_ERROR_DCC7_HANDSHAKE, /**< BÅ‚Ä…d negocjacji */
    + GG_ERROR_DCC7_FILE, /**< BÅ‚Ä…d odczytu/zapisu pliku */
    + GG_ERROR_DCC7_EOF, /**< Przedwczesny koniec pliku */
    + GG_ERROR_DCC7_NET, /**< Błąd wysyłania/odbierania */
    + GG_ERROR_DCC7_REFUSED, /**< Połączenie odrzucone */
    + GG_ERROR_DCC7_RELAY, /**< Problem z serwerem pośredniczącym */
    +};
    +
    +/**
    + * Pole zapytania lub odpowiedzi katalogu publicznego.
    + */
    +struct gg_pubdir50_entry {
    + int num; /**< Numer wyniku */
    + char *field; /**< Nazwa pola */
    + char *value; /**< Wartość pola */
    +} /* GG_DEPRECATED */;
    +
    +/**
    + * Zapytanie lub odpowiedź katalogu publicznego.
    + *
    + * Patrz \c gg_pubdir50_t.
    + */
    +struct gg_pubdir50_s {
    + int count; /**< Liczba wyników odpowiedzi */
    + uin_t next; /**< Numer początkowy następnego zapytania */
    + int type; /**< Rodzaj zapytania */
    + uint32_t seq; /**< Numer sekwencyjny */
    + struct gg_pubdir50_entry *entries; /**< Pola zapytania lub odpowiedzi */
    + int entries_count; /**< Liczba pól */
    +} /* GG_DEPRECATED */;
    +
    +/**
    + * Zapytanie lub odpowiedź katalogu publicznego.
    + *
    + * Do pól nie należy się odwoływać bezpośrednio -- wszystkie niezbędne
    + * informacje są dostępne za pomocą funkcji \c gg_pubdir50_*
    + */
    +typedef struct gg_pubdir50_s *gg_pubdir50_t;
    +
    +/**
    + * Opis zdarzeń \c GG_EVENT_MSG i \c GG_EVENT_MULTILOGON_MSG.
    + */
    +struct gg_event_msg {
    + uin_t sender; /**< Numer nadawcy/odbiorcy */
    + int msgclass; /**< Klasa wiadomości */
    +#ifndef _WIN32
    + time_t time; /**< Czas nadania */
    +#else
    + uint32_t time; /**< Czas nadania */
    +#endif
    + unsigned char *message; /**< Treść wiadomości */
    +
    + int recipients_count; /**< Liczba odbiorców konferencji */
    + uin_t *recipients; /**< Odbiorcy konferencji */
    +
    + int formats_length; /**< Długość informacji o formatowaniu tekstu */
    + void *formats; /**< Informacje o formatowaniu tekstu */
    + uint32_t seq; /**< Numer sekwencyjny wiadomości */
    +
    + char *xhtml_message; /**< Treść wiadomości w formacie XHTML */
    +
    + uint64_t chat_id; /**< Identyfikator konferencji lub 0, jeżeli jest to zwykła wiadomość (11.0) */
    + uint64_t flags; /**< Flagi wiadomości (11.0) */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_NOTIFY_DESCR.
    + */
    +struct gg_event_notify_descr {
    + struct gg_notify_reply *notify; /**< Informacje o liście kontaktów */
    + char *descr; /**< Opis status */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_STATUS.
    + */
    +struct gg_event_status {
    + uin_t uin; /**< Numer Gadu-Gadu */
    + uint32_t status; /**< Nowy status */
    + char *descr; /**< Opis */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_STATUS60.
    + */
    +struct gg_event_status60 {
    + uin_t uin; /**< Numer Gadu-Gadu */
    + int status; /**< Nowy status */
    + uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
    + uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
    + int version; /**< Wersja protokołu */
    + int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    + char *descr; /**< Opis statusu */
    +#ifndef _WIN32
    + time_t time; /**< Czas powrotu */
    +#else
    + uint32_t time; /**< Czas powrotu */
    +#endif
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_NOTIFY_REPLY60.
    + */
    +struct gg_event_notify60 {
    + uin_t uin; /**< Numer Gadu-Gadu. W ostatnim elemencie jest równy 0, a pozostałe pola są niezainicjowane. */
    + int status; /**< Nowy status */
    + uint32_t remote_ip; /**< Adres IP dla połączeń bezpośrednich */
    + uint16_t remote_port; /**< Port dla połączeń bezpośrednich */
    + int version; /**< Wersja protokołu */
    + int image_size; /**< Maksymalny rozmiar obsługiwanych obrazków w KiB */
    + char *descr; /**< Opis statusu */
    +#ifndef _WIN32
    + time_t time; /**< Czas powrotu */
    +#else
    + uint32_t time; /**< Czas powrotu */
    +#endif
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_ACK.
    + */
    +struct gg_event_ack {
    + uin_t recipient; /**< Numer odbiorcy */
    + int status; /**< Status doręczenia */
    + int seq; /**< Numer sekwencyjny wiadomości */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_ACK110.
    + */
    +struct gg_event_ack110 {
    + uint8_t msg_type; /**< Rodzaj wiadomości (0x01 - zwykła, 0x02 - konferencja) */
    + uint32_t seq; /**< Numer sekwencyjny */
    + uint32_t time; /**< Czas zdarzenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_USERLIST.
    + */
    +struct gg_event_userlist {
    + char type; /**< Rodzaj odpowiedzi */
    + char *reply; /**< Treść odpowiedzi */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC_VOICE_DATA.
    + */
    +struct gg_event_dcc_voice_data {
    + uint8_t *data; /**< Dane dźwiękowe */
    + int length; /**< Rozmiar danych dźwiękowych */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_IMAGE_REQUEST.
    + */
    +struct gg_event_image_request {
    + uin_t sender; /**< Nadawca żądania */
    + uint32_t size; /**< Rozmiar obrazka */
    + uint32_t crc32; /**< Suma kontrolna CRC32 */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_IMAGE_REPLY.
    + */
    +struct gg_event_image_reply {
    + uin_t sender; /**< Nadawca obrazka */
    + uint32_t size; /**< Rozmiar obrazka */
    + uint32_t crc32; /**< Suma kontrolna CRC32 */
    + char *filename; /**< Nazwa pliku */
    + char *image; /**< Bufor z obrazkiem */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_XML_EVENT.
    + */
    +struct gg_event_xml_event {
    + char *data; /**< Bufor z komunikatem */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_JSON_EVENT.
    + */
    +struct gg_event_json_event {
    + char *data; /**< Bufor z komunikatem */
    + char *type; /**< Bufor z typem komunikatu */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC7_CONNECTED.
    + */
    +struct gg_event_dcc7_connected {
    + struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC7_PENDING.
    + */
    +struct gg_event_dcc7_pending {
    + struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC7_REJECT.
    + */
    +struct gg_event_dcc7_reject {
    + struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    + int reason; /**< powód odrzucenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC7_ACCEPT.
    + */
    +struct gg_event_dcc7_accept {
    + struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    + int type; /**< Sposób połączenia (P2P, przez serwer) */
    + uint32_t remote_ip; /**< Adres zdalnego klienta */
    + uint16_t remote_port; /**< Port zdalnego klienta */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_DCC7_DONE.
    + */
    +struct gg_event_dcc7_done {
    + struct gg_dcc7 *dcc7; /**< Struktura połączenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_TYPING_NOTIFICATION.
    + */
    +struct gg_event_typing_notification {
    + uin_t uin; /**< Numer rozmówcy */
    + int length; /**< Długość tekstu */
    +};
    +
    +/**
    + * Atrybut użytkownika.
    + */
    +struct gg_event_user_data_attr {
    + int type; /**< Typ atrybutu */
    + char *key; /**< Klucz */
    + char *value; /**< Wartość */
    +};
    +
    +/**
    + * Struktura opisujÄ…ca kontakt w zdarzeniu GG_EVENT_USER_DATA.
    + */
    +struct gg_event_user_data_user {
    + uin_t uin; /**< Numer kontaktu */
    + size_t attr_count; /**< Liczba atrybutów */
    + struct gg_event_user_data_attr *attrs; /**< Lista atrybutów */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_USER_DATA.
    + */
    +struct gg_event_user_data {
    + int type; /**< Rodzaj informacji o kontaktach */
    + size_t user_count; /**< Liczba kontaktów */
    + struct gg_event_user_data_user *users; /**< Lista kontaktów */
    +};
    +
    +/**
    + * Struktura opisujÄ…ca sesjÄ™ multilogowania.
    + */
    +struct gg_multilogon_session {
    + gg_multilogon_id_t id; /**< Identyfikator sesji */
    + char *name; /**< Nazwa sesji (podana w \c gg_login_params.client_version) */
    + uint32_t remote_addr; /**< Adres sesji */
    + int status_flags; /**< Flagi statusu sesji */
    + int protocol_features; /**< Opcje protokolu sesji */
    +#ifndef _WIN32
    + time_t logon_time; /**< Czas zalogowania */
    +#else
    + uint32_t logon_time; /**< Czas zalogowania */
    +#endif
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_MULTILOGON_INFO.
    + */
    +struct gg_event_multilogon_info {
    + int count; /**< Liczba sesji */
    + struct gg_multilogon_session *sessions; /** Lista sesji */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_USERLIST100_VERSION.
    + */
    +struct gg_event_userlist100_version {
    + uint32_t version; /**< Numer wersji listy kontaktów na serwerze */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_USERLIST100_REPLY.
    + */
    +struct gg_event_userlist100_reply {
    + char type; /**< Rodzaj odpowiedzi */
    + uint32_t version; /**< Aktualna wersja listy kontaktów na serwerze */
    + char format_type; /**< Typ formatu listy kontaktów (żądany w \c gg_userlist100_request.format_type) */
    + char *reply; /**< Treść listy kontaktów w przesyłanej wersji i formacie */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_IMTOKEN.
    + */
    +struct gg_event_imtoken {
    + char *imtoken; /**< Wartość IMTOKEN */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_PONG110.
    + */
    +struct gg_event_pong110 {
    +#ifndef _WIN32
    + time_t time; /**< Aktualny czas na serwerze */
    +#else
    + uint32_t time; /**< Aktualny czas na serwerze */
    +#endif
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_CHAT_INFO.
    + */
    +struct gg_event_chat_info {
    + uint64_t id; /**< Identyfikator konferencji */
    + uint32_t version; /**< Wersja informacji o konferencji */
    + uint32_t participants_count; /**< Ilość uczestników */
    + uin_t *participants; /**< Lista uczestników */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_CHAT_INFO_UPDATE.
    + */
    +struct gg_event_chat_info_update {
    + uint64_t id; /**< Identyfikator konferencji */
    + uint32_t type; /**< Typ aktualizacji (\c GG_CHAT_INFO_UPDATE_*) */
    + uin_t participant; /**< Uczestnik, którego dotyczy aktualizacja */
    + uin_t inviter; /**< Uczestnik inicjujÄ…cy aktualizacjÄ™ (zapraszajÄ…cy) */
    + uint32_t version; /**< Wersja informacji o konferencji */
    + uint32_t time; /**< Czas zdarzenia */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_CHAT_CREATED.
    + */
    +struct gg_event_chat_created {
    + uint64_t id; /**< Identyfikator konferencji */
    + uint32_t seq; /**< Numer sekwencyjny */
    +};
    +
    +/**
    + * Opis zdarzenia \c GG_EVENT_CHAT_INVITE_ACK.
    + */
    +struct gg_event_chat_invite_ack {
    + uint64_t id; /**< Identyfikator konferencji */
    + uint32_t seq; /**< Numer sekwencyjny */
    +};
    +
    +/**
    + * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(),
    + * \c gg_dcc_watch_fd() i \c gg_dcc7_watch_fd().
    + *
    + * \ingroup events
    + */
    +union gg_event_union {
    + enum gg_failure_t failure; /**< Błąd połączenia (\c GG_EVENT_CONN_FAILED) */
    + struct gg_notify_reply *notify; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY) */
    + struct gg_event_notify_descr notify_descr; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY_DESCR) */
    + struct gg_event_status status; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS) */
    + struct gg_event_status60 status60; /**< Zmiana statusu kontaktów (\c GG_EVENT_STATUS60) */
    + struct gg_event_notify60 *notify60; /**< Zmiana statusu kontaktów (\c GG_EVENT_NOTIFY60) */
    + struct gg_event_msg msg; /**< Otrzymano wiadomość (\c GG_EVENT_MSG) */
    + struct gg_event_ack ack; /**< Potwierdzenie wiadomości (\c GG_EVENT_ACK) */
    + struct gg_event_ack110 ack110; /**< Potwierdzenie wysłania wiadomości (11.0) (\c GG_EVENT_ACK110) */
    + struct gg_event_image_request image_request; /**< Żądanie wysłania obrazka (\c GG_EVENT_IMAGE_REQUEST) */
    + struct gg_event_image_reply image_reply; /**< Odpowiedź z obrazkiem (\c GG_EVENT_IMAGE_REPLY) */
    + struct gg_event_userlist userlist; /**< Odpowiedź listy kontaktów (\c GG_EVENT_USERLIST) */
    + gg_pubdir50_t pubdir50; /**< Odpowiedź katalogu publicznego (\c GG_EVENT_PUBDIR50_*) */
    + struct gg_event_xml_event xml_event; /**< Zdarzenie systemowe (\c GG_EVENT_XML_EVENT) */
    + struct gg_event_json_event json_event; /**< Zdarzenie systemowe (\c GG_EVENT_JSON_EVENT) */
    + struct gg_dcc *dcc_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC_NEW) */
    + enum gg_error_t dcc_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC_ERROR) */
    + struct gg_event_dcc_voice_data dcc_voice_data; /**< Dane połączenia głosowego (\c GG_EVENT_DCC_VOICE_DATA) */
    + struct gg_dcc7 *dcc7_new; /**< Nowe połączenie bezpośrednie (\c GG_EVENT_DCC7_NEW) */
    + enum gg_error_t dcc7_error; /**< Błąd połączenia bezpośredniego (\c GG_EVENT_DCC7_ERROR) */
    + struct gg_event_dcc7_connected dcc7_connected; /**< Informacja o zestawieniu połączenia bezpośredniego (\c GG_EVENT_DCC7_CONNECTED) */
    + struct gg_event_dcc7_pending dcc7_pending; /**< Trwa próba połączenia bezpośredniego (\c GG_EVENT_DCC7_PENDING) */
    + struct gg_event_dcc7_reject dcc7_reject; /**< Odrzucono połączenia bezpośredniego (\c GG_EVENT_DCC7_REJECT) */
    + struct gg_event_dcc7_accept dcc7_accept; /**< Zaakceptowano połączenie bezpośrednie (\c GG_EVENT_DCC7_ACCEPT) */
    + struct gg_event_dcc7_done dcc7_done; /**< Zakończono połączenie bezpośrednie (\c GG_EVENT_DCC7_DONE) */
    + struct gg_event_typing_notification typing_notification; /**< Powiadomienie o pisaniu */
    + struct gg_event_user_data user_data; /**< Informacje o kontaktach */
    + struct gg_event_msg multilogon_msg; /**< Inna sesja wysłała wiadomość (\c GG_EVENT_MULTILOGON_MSG) */
    + struct gg_event_multilogon_info multilogon_info; /**< Informacja o innych sesjach multilogowania (\c GG_EVENT_MULTILOGON_INFO) */
    + struct gg_event_userlist100_version userlist100_version; /**< Informacja o numerze wersji listy kontaktów na serwerze (\c GG_EVENT_USERLIST100_VERSION) */
    + struct gg_event_userlist100_reply userlist100_reply; /**< Odpowiedź listy kontaktów (10.0) (\c GG_EVENT_USERLIST100_REPLY) */
    + struct gg_event_imtoken imtoken; /**< CiÄ…g IMTOKEN (11.0) (\c GG_EVENT_IMTOKEN) */
    + struct gg_event_pong110 pong110; /**< Utrzymanie połączenia (11.0) (\c GG_EVENT_PONG110) */
    + struct gg_event_chat_info chat_info; /**< Informacje o konferencji (11.0) (\c GG_EVENT_CHAT_INFO) */
    + struct gg_event_chat_info_update chat_info_update; /**< Aktualizacja informacji o konferencji (11.0) (\c GG_EVENT_CHAT_INFO_UPDATE) */
    + struct gg_event_chat_created chat_created; /**< Potwierdzenie utworzenia konferencji (11.0) (\c GG_EVENT_CHAT_CREATED) */
    + struct gg_event_chat_invite_ack chat_invite_ack; /**< Potwierdzenie wysłania zaproszenia do konferencji (11.0) (\c GG_EVENT_CHAT_INVITE_ACK) */
    +};
    +
    +/**
    + * Opis zdarzenia.
    + *
    + * Zwracany przez funkcje \c gg_watch_fd(), \c gg_dcc_watch_fd()
    + * i \c gg_dcc7_watch_fd(). Po przeanalizowaniu należy zwolnić
    + * za pomocÄ… \c gg_event_free().
    + *
    + * \ingroup events
    + */
    +struct gg_event {
    + int type; /**< Rodzaj zdarzenia */
    + union gg_event_union event; /**< Informacja o zdarzeniu */
    +};
    +
    +struct gg_event *gg_watch_fd(struct gg_session *sess);
    +void gg_event_free(struct gg_event *e);
    +
    +int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count);
    +int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
    +int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type);
    +int gg_add_notify(struct gg_session *sess, uin_t uin);
    +int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type);
    +int gg_remove_notify(struct gg_session *sess, uin_t uin);
    +
    +struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header);
    +int gg_http_watch_fd(struct gg_http *h);
    +void gg_http_stop(struct gg_http *h);
    +void gg_http_free(struct gg_http *h);
    +
    +uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req);
    +gg_pubdir50_t gg_pubdir50_new(int type);
    +int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value);
    +int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq);
    +const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field);
    +int gg_pubdir50_type(gg_pubdir50_t res);
    +int gg_pubdir50_count(gg_pubdir50_t res);
    +uin_t gg_pubdir50_next(gg_pubdir50_t res);
    +uint32_t gg_pubdir50_seq(gg_pubdir50_t res);
    +void gg_pubdir50_free(gg_pubdir50_t res);
    +
    +#ifndef DOXYGEN
    +
    +#define GG_PUBDIR50_UIN "FmNumber"
    +#define GG_PUBDIR50_STATUS "FmStatus"
    +#define GG_PUBDIR50_FIRSTNAME "firstname"
    +#define GG_PUBDIR50_LASTNAME "lastname"
    +#define GG_PUBDIR50_NICKNAME "nickname"
    +#define GG_PUBDIR50_BIRTHYEAR "birthyear"
    +#define GG_PUBDIR50_CITY "city"
    +#define GG_PUBDIR50_GENDER "gender"
    +#define GG_PUBDIR50_GENDER_FEMALE "1"
    +#define GG_PUBDIR50_GENDER_MALE "2"
    +#define GG_PUBDIR50_GENDER_SET_FEMALE "2"
    +#define GG_PUBDIR50_GENDER_SET_MALE "1"
    +#define GG_PUBDIR50_ACTIVE "ActiveOnly"
    +#define GG_PUBDIR50_ACTIVE_TRUE "1"
    +#define GG_PUBDIR50_START "fmstart"
    +#define GG_PUBDIR50_FAMILYNAME "familyname"
    +#define GG_PUBDIR50_FAMILYCITY "familycity"
    +
    +#else
    +
    +/**
    + * \ingroup pubdir50
    + *
    + * Rodzaj pola zapytania.
    + */
    +enum {
    + GG_PUBDIR50_UIN, /**< Numer Gadu-Gadu */
    + GG_PUBDIR50_STATUS, /**< Status (tylko wynik wyszukiwania) */
    + GG_PUBDIR50_FIRSTNAME, /**< ImiÄ™ */
    + GG_PUBDIR50_LASTNAME, /**< Nazwisko */
    + GG_PUBDIR50_NICKNAME, /**< Pseudonim */
    + GG_PUBDIR50_BIRTHYEAR, /**< Rok urodzenia lub przedział lat oddzielony spacją */
    + GG_PUBDIR50_CITY, /**< Miejscowość */
    + GG_PUBDIR50_GENDER, /**< Płeć */
    + GG_PUBDIR50_ACTIVE, /**< Osoba dostępna (tylko wyszukiwanie) */
    + GG_PUBDIR50_START, /**< Numer poczÄ…tkowy wyszukiwania (tylko wyszukiwanie) */
    + GG_PUBDIR50_FAMILYNAME, /**< Nazwisko rodowe (tylko wysyłanie informacji o sobie) */
    + GG_PUBDIR50_FAMILYCITY, /**< Miejscowość pochodzenia (tylko wysyłanie informacji o sobie) */
    +};
    +
    +/**
    + * \ingroup pubdir50
    + *
    + * Wartość pola GG_PUBDIR50_GENDER przy wyszukiwaniu. Brak pola oznacza dowolną płeć.
    + */
    +enum {
    + GG_PUBDIR50_GENDER_FEMALE, /**< Kobieta */
    + GG_PUBDIR50_GENDER_MALE, /**< Mężczyzna */
    +};
    +
    +/**
    + * \ingroup pubdir50
    + *
    + * Wartość pola GG_PUBDIR50_GENDER przy wysyłaniu informacji o sobie.
    + */
    +enum {
    + GG_PUBDIR50_GENDER_SET_FEMALE, /**< Kobieta */
    + GG_PUBDIR50_GENDER_SET_MALE, /**< Mężczyzna */
    +};
    +
    +/**
    + * \ingroup pubdir50
    + *
    + * Wartość pola GG_PUBDIR50_ACTIVE.
    + */
    +enum {
    + GG_PUBDIR50_ACTIVE_TRUE, /**< Wyszukaj tylko osoby dostępne */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +/**
    + * Powód błędu operacji na katalogu publicznym.
    + *
    + * \ingroup http
    + */
    +typedef enum {
    + GG_PUBDIR_ERROR_NONE = 0, /**< Brak błędu */
    + GG_PUBDIR_ERROR_OTHER, /**< Nieznany błąd */
    + GG_PUBDIR_ERROR_TOKEN, /**< Błędny token */
    + GG_PUBDIR_ERROR_OLD_PASSWORD, /**< Niepoprawne stare hasło */
    + GG_PUBDIR_ERROR_NEW_PASSWORD, /**< Niepoprawne nowe hasło */
    +} gg_pubdir_error_t;
    +
    +/**
    + * Wynik operacji na katalogu publicznym.
    + *
    + * \ingroup http
    + */
    +struct gg_pubdir {
    + int success; /**< Flaga powodzenia operacji */
    + uin_t uin; /**< Otrzymany numer lub 0 w przypadku błędu */
    + gg_pubdir_error_t error; /**< Powód błędu */
    +};
    +
    +int gg_pubdir_watch_fd(struct gg_http *f);
    +void gg_pubdir_free(struct gg_http *f);
    +
    +/**
    + * Token autoryzacji niektórych operacji HTTP.
    + *
    + * \ingroup token
    + */
    +struct gg_token {
    + int width; /**< Szerokość obrazka */
    + int height; /**< Wysokość obrazka */
    + int length; /**< Liczba znaków w tokenie */
    + char *tokenid; /**< Identyfikator tokenu */
    +};
    +
    +struct gg_http *gg_token(int async);
    +int gg_token_watch_fd(struct gg_http *h);
    +void gg_token_free(struct gg_http *h);
    +
    +struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async);
    +#ifndef DOXYGEN
    +#define gg_register_watch_fd gg_pubdir_watch_fd
    +#define gg_register_free gg_pubdir_free
    +#endif
    +
    +struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async);
    +#ifndef DOXYGEN
    +#define gg_unregister_watch_fd gg_pubdir_watch_fd
    +#define gg_unregister_free gg_pubdir_free
    +#endif
    +
    +struct gg_http *gg_remind_passwd3(uin_t uin, const char *email, const char *tokenid, const char *tokenval, int async);
    +#ifndef DOXYGEN
    +#define gg_remind_passwd_watch_fd gg_pubdir_watch_fd
    +#define gg_remind_passwd_free gg_pubdir_free
    +#endif
    +
    +struct gg_http *gg_change_passwd4(uin_t uin, const char *email, const char *passwd, const char *newpasswd, const char *tokenid, const char *tokenval, int async);
    +#ifndef DOXYGEN
    +#define gg_change_passwd_watch_fd gg_pubdir_watch_fd
    +#define gg_change_passwd_free gg_pubdir_free
    +#endif
    +
    +extern int gg_dcc_port;
    +extern unsigned long gg_dcc_ip;
    +
    +int gg_dcc_request(struct gg_session *sess, uin_t uin);
    +
    +struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    +struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    +struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin);
    +void gg_dcc_set_type(struct gg_dcc *d, int type);
    +int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename);
    +int gg_dcc_fill_file_info2(struct gg_dcc *d, const char *filename, const char *local_filename);
    +int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length);
    +
    +#define GG_DCC_VOICE_FRAME_LENGTH 195 /**< Rozmiar pakietu głosowego przed wersją Gadu-Gadu 5.0.5 */
    +#define GG_DCC_VOICE_FRAME_LENGTH_505 326 /**< Rozmiar pakietu głosowego od wersji Gadu-Gadu 5.0.5 */
    +
    +struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port);
    +#ifndef DOXYGEN
    +#define gg_dcc_socket_free gg_dcc_free
    +#define gg_dcc_socket_watch_fd gg_dcc_watch_fd
    +#endif
    +
    +struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d);
    +
    +void gg_dcc_free(struct gg_dcc *c);
    +
    +struct gg_event *gg_dcc7_watch_fd(struct gg_dcc7 *d);
    +struct gg_dcc7 *gg_dcc7_send_file(struct gg_session *sess, uin_t rcpt, const char *filename, const char *filename1250, const char *hash);
    +struct gg_dcc7 *gg_dcc7_send_file_fd(struct gg_session *sess, uin_t rcpt, int fd, size_t size, const char *filename1250, const char *hash);
    +int gg_dcc7_accept(struct gg_dcc7 *dcc, unsigned int offset);
    +int gg_dcc7_reject(struct gg_dcc7 *dcc, int reason);
    +void gg_dcc7_free(struct gg_dcc7 *d);
    +
    +extern int gg_debug_level;
    +
    +extern void (*gg_debug_handler)(int level, const char *format, va_list ap);
    +extern void (*gg_debug_handler_session)(struct gg_session *sess, int level, const char *format, va_list ap);
    +
    +extern FILE *gg_debug_file;
    +
    +/**
    + * \ingroup debug
    + * @{
    + */
    +#define GG_DEBUG_NET 1 /**< Rejestracja zdarzeń związanych z siecią */
    +#define GG_DEBUG_TRAFFIC 2 /**< Rejestracja ruchu sieciowego */
    +#define GG_DEBUG_DUMP 4 /**< Rejestracja zawartości pakietów */
    +#define GG_DEBUG_FUNCTION 8 /**< Rejestracja wywołań funkcji */
    +#define GG_DEBUG_MISC 16 /**< Rejestracja różnych informacji */
    +#define GG_DEBUG_VERBOSE 32 /**< Rejestracja informacji szczegółowych */
    +#define GG_DEBUG_WARNING 64 /**< Rejestracja ostrzeżeń */
    +#define GG_DEBUG_ERROR 128 /**< Rejestracja błędów krytycznych */
    +/** @} */
    +
    +const char *gg_debug_state(enum gg_state_t state);
    +const char *gg_debug_event(enum gg_event_t event);
    +
    +#ifdef GG_DEBUG_DISABLE
    +#define gg_debug(...) do { } while (0)
    +#define gg_debug_session(...) do { } while (0)
    +#else
    +void gg_debug(int level, const char *format, ...) GG_GNUC_PRINTF(2, 3);
    +void gg_debug_session(struct gg_session *sess, int level, const char *format, ...) GG_GNUC_PRINTF(3, 4);
    +#endif
    +
    +const char *gg_libgadu_version(void);
    +
    +/**
    + * Lista funkcji biblioteki, które zależą od zewnętrznych bibliotek.
    + *
    + * \ingroup version
    + */
    +typedef enum {
    + GG_LIBGADU_FEATURE_SSL, /**< Biblioteka obsługuje połączenia szyfrowane */
    + GG_LIBGADU_FEATURE_PTHREAD, /**< Biblioteka obsługuje rozwiązywanie nazw za pomocą wątków */
    + GG_LIBGADU_FEATURE_USERLIST100, /**< Biblioteka obsługuje listę kontaktów zgodną z Gadu-Gadu 10 */
    +} gg_libgadu_feature_t;
    +
    +int gg_libgadu_check_feature(gg_libgadu_feature_t feature);
    +
    +extern int gg_proxy_enabled;
    +extern char *gg_proxy_host;
    +extern int gg_proxy_port;
    +extern char *gg_proxy_username;
    +extern char *gg_proxy_password;
    +extern int gg_proxy_http_only;
    +
    +extern unsigned long gg_local_ip;
    +
    +#define GG_LOGIN_HASH_GG32 0x01 /**< Algorytm Gadu-Gadu */
    +#define GG_LOGIN_HASH_SHA1 0x02 /**< Algorytm SHA1 */
    +
    +#ifndef DOXYGEN
    +
    +#define GG_PUBDIR50_WRITE 0x01
    +#define GG_PUBDIR50_READ 0x02
    +#define GG_PUBDIR50_SEARCH 0x03
    +#define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH
    +#define GG_PUBDIR50_SEARCH_REPLY 0x05
    +
    +#else
    +
    +/**
    + * \ingroup pubdir50
    + *
    + * Rodzaj zapytania lub odpowiedzi katalogu publicznego.
    + */
    +enum {
    + GG_PUBDIR50_WRITE, /**< Wysłanie do serwera informacji o sobie */
    + GG_PUBDIR50_READ, /**< Pobranie z serwera informacji o sobie */
    + GG_PUBDIR50_SEARCH, /**< Wyszukiwanie w katalogu publicznym */
    + GG_PUBDIR50_SEARCH_REPLY, /**< Wynik wyszukiwania w katalogu publicznym */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +/** \cond obsolete */
    +
    +#define gg_free_event gg_event_free
    +#define gg_free_http gg_http_free
    +#define gg_free_pubdir gg_pubdir_free
    +#define gg_free_register gg_pubdir_free
    +#define gg_free_remind_passwd gg_pubdir_free
    +#define gg_free_dcc gg_dcc_free
    +#define gg_free_change_passwd gg_pubdir_free
    +
    +struct gg_search_request {
    + int active;
    + unsigned int start;
    + char *nickname;
    + char *first_name;
    + char *last_name;
    + char *city;
    + int gender;
    + int min_birth;
    + int max_birth;
    + char *email;
    + char *phone;
    + uin_t uin;
    +} /* GG_DEPRECATED */;
    +
    +struct gg_search {
    + int count;
    + struct gg_search_result *results;
    +} GG_DEPRECATED;
    +
    +struct gg_search_result {
    + uin_t uin;
    + char *first_name;
    + char *last_name;
    + char *nickname;
    + int born;
    + int gender;
    + char *city;
    + int active;
    +} GG_DEPRECATED;
    +
    +#define GG_GENDER_NONE 0
    +#define GG_GENDER_FEMALE 1
    +#define GG_GENDER_MALE 2
    +
    +struct gg_http *gg_search(const struct gg_search_request *r, int async) GG_DEPRECATED;
    +int gg_search_watch_fd(struct gg_http *f) GG_DEPRECATED;
    +void gg_free_search(struct gg_http *f) GG_DEPRECATED;
    +#define gg_search_free gg_free_search
    +
    +const struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active, int start) GG_DEPRECATED;
    +const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start) GG_DEPRECATED;
    +const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start) GG_DEPRECATED;
    +const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start) GG_DEPRECATED;
    +void gg_search_request_free(struct gg_search_request *r) GG_DEPRECATED;
    +
    +struct gg_http *gg_register(const char *email, const char *password, int async) GG_DEPRECATED;
    +struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async) GG_DEPRECATED;
    +
    +struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async) GG_DEPRECATED;
    +struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async) GG_DEPRECATED;
    +
    +struct gg_http *gg_remind_passwd(uin_t uin, int async) GG_DEPRECATED;
    +struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async) GG_DEPRECATED;
    +
    +struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async) GG_DEPRECATED;
    +struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async) GG_DEPRECATED;
    +struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async) GG_DEPRECATED;
    +
    +struct gg_change_info_request {
    + char *first_name;
    + char *last_name;
    + char *nickname;
    + char *email;
    + int born;
    + int gender;
    + char *city;
    +} /* GG_DEPRECATED */;
    +
    +struct gg_change_info_request *gg_change_info_request_new(const char *first_name, const char *last_name, const char *nickname, const char *email, int born, int gender, const char *city) GG_DEPRECATED;
    +void gg_change_info_request_free(struct gg_change_info_request *r) GG_DEPRECATED;
    +
    +struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async) GG_DEPRECATED;
    +#define gg_change_pubdir_watch_fd gg_pubdir_watch_fd
    +#define gg_change_pubdir_free gg_pubdir_free
    +#define gg_free_change_pubdir gg_pubdir_free
    +
    +struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async) GG_DEPRECATED;
    +int gg_userlist_get_watch_fd(struct gg_http *f) GG_DEPRECATED;
    +void gg_userlist_get_free(struct gg_http *f) GG_DEPRECATED;
    +
    +struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async) GG_DEPRECATED;
    +int gg_userlist_put_watch_fd(struct gg_http *f) GG_DEPRECATED;
    +void gg_userlist_put_free(struct gg_http *f) GG_DEPRECATED;
    +
    +struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async) GG_DEPRECATED;
    +int gg_userlist_remove_watch_fd(struct gg_http *f) GG_DEPRECATED;
    +void gg_userlist_remove_free(struct gg_http *f) GG_DEPRECATED;
    +
    +int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) GG_DEPRECATED;
    +
    +/** \endcond */
    +
    +int gg_file_hash_sha1(int fd, uint8_t *result) GG_DEPRECATED;
    +
    +char *gg_saprintf(const char *format, ...) GG_GNUC_PRINTF(1, 2) GG_DEPRECATED;
    +char *gg_vsaprintf(const char *format, va_list ap) GG_DEPRECATED;
    +
    +#define gg_alloc_sprintf gg_saprintf
    +
    +char *gg_get_line(char **ptr) GG_DEPRECATED;
    +
    +int gg_connect(void *addr, int port, int async) GG_DEPRECATED;
    +struct in_addr *gg_gethostbyname(const char *hostname) GG_DEPRECATED;
    +char *gg_read_line(int sock, char *buf, int length) GG_DEPRECATED;
    +void gg_chomp(char *line) GG_DEPRECATED;
    +char *gg_urlencode(const char *str) GG_DEPRECATED;
    +int gg_http_hash(const char *format, ...) GG_DEPRECATED;
    +void gg_http_free_fields(struct gg_http *h) GG_DEPRECATED;
    +int gg_read(struct gg_session *sess, char *buf, int length) GG_DEPRECATED;
    +int gg_write(struct gg_session *sess, const char *buf, int length) GG_DEPRECATED;
    +void *gg_recv_packet(struct gg_session *sess) GG_DEPRECATED;
    +int gg_send_packet(struct gg_session *sess, int type, ...) GG_DEPRECATED;
    +unsigned int gg_login_hash(const unsigned char *password, unsigned int seed) GG_DEPRECATED;
    +void gg_login_hash_sha1(const char *password, uint32_t seed, uint8_t *result) GG_DEPRECATED;
    +uint32_t gg_fix32(uint32_t x);
    +uint16_t gg_fix16(uint16_t x);
    +#define fix16 gg_fix16
    +#define fix32 gg_fix32
    +char *gg_proxy_auth(void) GG_DEPRECATED;
    +char *gg_base64_encode(const char *buf) GG_DEPRECATED;
    +char *gg_base64_decode(const char *buf) GG_DEPRECATED;
    +int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq) GG_DEPRECATED;
    +
    +/**
    + * Kolejka odbieranych obrazków.
    + */
    +struct gg_image_queue {
    + uin_t sender; /**< Nadawca obrazka */
    + uint32_t size; /**< Rozmiar obrazka */
    + uint32_t crc32; /**< Suma kontrolna CRC32 */
    + char *filename; /**< Nazwa pliku */
    + char *image; /**< Bufor z odebranymi danymi */
    + uint32_t done; /**< Rozmiar odebranych danych */
    +
    + struct gg_image_queue *next; /**< Kolejny element listy */
    +
    + uint32_t packet_type; /**< \brief Rodzaj odbieranych pakietów. W niektórych przypadkach (przy multilogowaniu) serwer wysyła nam dwie kopie obrazka jako dwa różne typy pakietów */
    +} GG_DEPRECATED;
    +
    +int gg_dcc7_handle_id(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    +int gg_dcc7_handle_new(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    +int gg_dcc7_handle_info(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    +int gg_dcc7_handle_accept(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    +int gg_dcc7_handle_reject(struct gg_session *sess, struct gg_event *e, const void *payload, int len) GG_DEPRECATED;
    +
    +#define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
    +#define GG_APPMSG_PORT 80
    +#define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
    +#define GG_PUBDIR_PORT 80
    +#define GG_REGISTER_HOST "register.gadu-gadu.pl"
    +#define GG_REGISTER_PORT 80
    +#define GG_REMIND_HOST "retr.gadu-gadu.pl"
    +#define GG_REMIND_PORT 80
    +#define GG_RELAY_HOST "relay.gadu-gadu.pl"
    +#define GG_RELAY_PORT 80
    +
    +#define GG_DEFAULT_PORT 8074
    +#define GG_HTTPS_PORT 443
    +#define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
    +
    +#define GG_PROTOCOL_VERSION_100 0x2e
    +#define GG_PROTOCOL_VERSION_110 0x40
    +
    +/* GG_DEPRECATED */
    +#define GG_DEFAULT_CLIENT_VERSION "-"
    +
    +#define GG_DEFAULT_PROTOCOL_VERSION GG_PROTOCOL_VERSION_110
    +#define GG_DEFAULT_TIMEOUT 30
    +#define GG_HAS_AUDIO_MASK 0x40000000
    +#define GG_HAS_AUDIO7_MASK 0x20000000
    +#define GG_ERA_OMNIX_MASK 0x04000000
    +#undef GG_LIBGADU_VERSION
    +
    +#ifndef DOXYGEN
    +
    +#define GG_FEATURE_MSG77 0x0001
    +#define GG_FEATURE_STATUS77 0x0002
    +#define GG_FEATURE_UNKNOWN_4 0x0004
    +#define GG_FEATURE_UNKNOWN_8 0x0008
    +#define GG_FEATURE_DND_FFC 0x0010
    +#define GG_FEATURE_IMAGE_DESCR 0x0020
    +#define GG_FEATURE_UNKNOWN_40 0x0040
    +#define GG_FEATURE_UNKNOWN_80 0x0080
    +#define GG_FEATURE_UNKNOWN_100 0x0100
    +#define GG_FEATURE_USER_DATA 0x0200
    +#define GG_FEATURE_MSG_ACK 0x0400
    +#define GG_FEATURE_UNKNOWN_800 0x0800
    +#define GG_FEATURE_UNKNOWN_1000 0x1000
    +#define GG_FEATURE_TYPING_NOTIFICATION 0x2000
    +#define GG_FEATURE_MULTILOGON 0x4000
    +
    +/* Poniższe makra zostały zachowane dla zgodności API */
    +#define GG_FEATURE_MSG80 0
    +#define GG_FEATURE_STATUS80 0
    +#define GG_FEATURE_STATUS80BETA 0
    +
    +#define GG_FEATURE_ALL (GG_FEATURE_MSG80 | GG_FEATURE_STATUS80 | GG_FEATURE_DND_FFC | GG_FEATURE_IMAGE_DESCR | GG_FEATURE_UNKNOWN_100 | GG_FEATURE_USER_DATA | GG_FEATURE_MSG_ACK | GG_FEATURE_TYPING_NOTIFICATION)
    +
    +#else
    +
    +/**
    + * \ingroup login
    + *
    + * Flagi opcji protokołu.
    + */
    +enum {
    + GG_FEATURE_MSG77, /**< Klient życzy sobie otrzymywać wiadomości zgodnie z protokołem 7.7 */
    + GG_FEATURE_STATUS77, /**< Klient życzy sobie otrzymywać zmiany stanu zgodnie z protokołem 7.7 */
    + GG_FEATURE_DND_FFC, /**< Klient obsługuje statusy "nie przeszkadzać" i "poGGadaj ze mną" */
    + GG_FEATURE_IMAGE_DESCR, /**< Klient obsługuje opisy graficzne oraz flagę \c GG_STATUS80_DESCR_MASK */
    +};
    +
    +
    +#endif
    +
    +#define GG_DEFAULT_DCC_PORT 1550
    +
    +struct gg_header {
    + uint32_t type; /* typ pakietu */
    + uint32_t length; /* długość reszty pakietu */
    +} GG_PACKED;
    +
    +#define GG_WELCOME 0x0001
    +#define GG_NEED_EMAIL 0x0014
    +
    +struct gg_welcome {
    + uint32_t key; /* klucz szyfrowania hasła */
    +} GG_PACKED;
    +
    +#define GG_LOGIN 0x000c
    +
    +struct gg_login {
    + uint32_t uin; /* mój numerek */
    + uint32_t hash; /* hash hasła */
    + uint32_t status; /* status na dzień dobry */
    + uint32_t version; /* moja wersja klienta */
    + uint32_t local_ip; /* mój adres ip */
    + uint16_t local_port; /* port, na którym słucham */
    +} GG_PACKED;
    +
    +#define GG_LOGIN_EXT 0x0013
    +
    +struct gg_login_ext {
    + uint32_t uin; /* mój numerek */
    + uint32_t hash; /* hash hasła */
    + uint32_t status; /* status na dzień dobry */
    + uint32_t version; /* moja wersja klienta */
    + uint32_t local_ip; /* mój adres ip */
    + uint16_t local_port; /* port, na którym słucham */
    + uint32_t external_ip; /* zewnętrzny adres ip */
    + uint16_t external_port; /* zewnętrzny port */
    +} GG_PACKED;
    +
    +#define GG_LOGIN60 0x0015
    +
    +struct gg_login60 {
    + uint32_t uin; /* mój numerek */
    + uint32_t hash; /* hash hasła */
    + uint32_t status; /* status na dzień dobry */
    + uint32_t version; /* moja wersja klienta */
    + uint8_t dunno1; /* 0x00 */
    + uint32_t local_ip; /* mój adres ip */
    + uint16_t local_port; /* port, na którym słucham */
    + uint32_t external_ip; /* zewnętrzny adres ip */
    + uint16_t external_port; /* zewnętrzny port */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno2; /* 0xbe */
    +} GG_PACKED;
    +
    +#define GG_LOGIN70 0x0019
    +
    +struct gg_login70 {
    + uint32_t uin; /* mój numerek */
    + uint8_t hash_type; /* rodzaj hashowania hasła */
    + uint8_t hash[64]; /* hash hasła dopełniony zerami */
    + uint32_t status; /* status na dzień dobry */
    + uint32_t version; /* moja wersja klienta */
    + uint8_t dunno1; /* 0x00 */
    + uint32_t local_ip; /* mój adres ip */
    + uint16_t local_port; /* port, na którym słucham */
    + uint32_t external_ip; /* zewnętrzny adres ip (???) */
    + uint16_t external_port; /* zewnętrzny port (???) */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno2; /* 0xbe */
    +} GG_PACKED;
    +
    +#define GG_LOGIN_OK 0x0003
    +
    +#define GG_LOGIN_FAILED 0x0009
    +
    +#define GG_PUBDIR50_REQUEST 0x0014
    +
    +struct gg_pubdir50_request {
    + uint8_t type; /* GG_PUBDIR50_* */
    + uint32_t seq; /* czas wysłania zapytania */
    +} GG_PACKED;
    +
    +#define GG_PUBDIR50_REPLY 0x000e
    +
    +struct gg_pubdir50_reply {
    + uint8_t type; /* GG_PUBDIR50_* */
    + uint32_t seq; /* czas wysłania zapytania */
    +} GG_PACKED;
    +
    +#define GG_NEW_STATUS 0x0002
    +
    +#ifndef DOXYGEN
    +
    +#define GG_STATUS_NOT_AVAIL 0x0001
    +#define GG_STATUS_NOT_AVAIL_DESCR 0x0015
    +#define GG_STATUS_FFC 0x0017
    +#define GG_STATUS_FFC_DESCR 0x0018
    +#define GG_STATUS_AVAIL 0x0002
    +#define GG_STATUS_AVAIL_DESCR 0x0004
    +#define GG_STATUS_BUSY 0x0003
    +#define GG_STATUS_BUSY_DESCR 0x0005
    +#define GG_STATUS_DND 0x0021
    +#define GG_STATUS_DND_DESCR 0x0022
    +#define GG_STATUS_INVISIBLE 0x0014
    +#define GG_STATUS_INVISIBLE_DESCR 0x0016
    +#define GG_STATUS_BLOCKED 0x0006
    +
    +#define GG_STATUS_GGPLUS 0x0020
    +#define GG_STATUS_NOT_SET 0x0023
    +#define GG_STATUS_UNKNOWN 0x0025
    +
    +#define GG_STATUS_IMAGE_MASK 0x0100
    +#define GG_STATUS_DESCR_MASK 0x4000
    +#define GG_STATUS_FRIENDS_MASK 0x8000
    +
    +#define GG_STATUS_FLAG_UNKNOWN 0x00000001
    +#define GG_STATUS_FLAG_VIDEO 0x00000002
    +#define GG_STATUS_FLAG_INHERIT 0x00000020
    +#define GG_STATUS_FLAG_MOBILE 0x00100000
    +#define GG_STATUS_FLAG_SPAM 0x00800000
    +
    +#else
    +
    +/**
    + * Rodzaje statusów użytkownika.
    + *
    + * \ingroup status
    + */
    +enum {
    + GG_STATUS_NOT_AVAIL, /**< Niedostępny */
    + GG_STATUS_NOT_AVAIL_DESCR, /**< Niedostępny z opisem */
    + GG_STATUS_FFC, /**< PoGGadaj ze mnÄ… */
    + GG_STATUS_FFC_DESCR, /**< PoGGadaj ze mnÄ… z opisem */
    + GG_STATUS_AVAIL, /**< Dostępny */
    + GG_STATUS_AVAIL_DESCR, /**< Dostępny z opisem */
    + GG_STATUS_BUSY, /**< Zajęty */
    + GG_STATUS_BUSY_DESCR, /**< Zajęty z opisem */
    + GG_STATUS_DND, /**< Nie przeszkadzać */
    + GG_STATUS_DND_DESCR, /**< Nie przeszakdzać z opisem */
    + GG_STATUS_INVISIBLE, /**< Niewidoczny (tylko własny status) */
    + GG_STATUS_INVISIBLE_DESCR, /**< Niewidoczny z opisem (tylko własny status) */
    + GG_STATUS_BLOCKED, /**< Zablokowany (tylko status innych) */
    + GG_STATUS_GGPLUS, /**< Status "Korzystam z GG Plus" */
    + GG_STATUS_NOT_SET, /**< Status nie ustawiony (przy logowaniu siÄ™ do sieci) */
    + GG_STATUS_IMAGE_MASK, /**< Flaga bitowa oznaczająca opis graficzny (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
    + GG_STATUS_DESCR_MASK, /**< Flaga bitowa oznaczająca status z opisem (tylko jeśli wybrano \c GG_FEATURE_IMAGE_DESCR) */
    + GG_STATUS_FRIENDS_MASK, /**< Flaga bitowa dostępności tylko dla znajomych */
    +};
    +
    +/**
    + * Rodzaje statusów użytkownika. Mapa bitowa.
    + *
    + * \ingroup status
    + */
    +enum {
    + GG_STATUS_FLAG_UNKNOWN, /**< Przeznaczenie nieznane, ale występuje zawsze */
    + GG_STATUS_FLAG_VIDEO, /**< Klient obsługuje wideorozmowy */
    + GG_STATUS_FLAG_INHERIT, /**< Synchronizacja statusu do innych klientów (przy logowaniu się do sieci) */
    + GG_STATUS_FLAG_MOBILE, /**< Klient mobilny (ikona telefonu komórkowego) */
    + GG_STATUS_FLAG_SPAM, /**< Klient chce otrzymywać linki od nieznajomych */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +/**
    + * \ingroup status
    + *
    + * Flaga bitowa dostepnosci informujaca ze mozemy voipowac
    + */
    +
    +#define GG_STATUS_VOICE_MASK 0x20000 /**< czy ma wlaczone audio (7.7) */
    +
    +/**
    + * \ingroup status
    + *
    + * Maksymalna długośc opisu.
    + */
    +#define GG_STATUS_DESCR_MAXSIZE 255
    +#define GG_STATUS_DESCR_MAXSIZE_PRE_8_0 70
    +
    +#define GG_STATUS_MASK 0xff
    +
    +/* GG_S_F() tryb tylko dla znajomych */
    +#define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)
    +
    +/* GG_S() stan bez uwzględnienia dodatkowych flag */
    +#define GG_S(x) ((x) & GG_STATUS_MASK)
    +
    +
    +/* GG_S_FF() chętny do rozmowy */
    +#define GG_S_FF(x) (GG_S(x) == GG_STATUS_FFC || GG_S(x) == GG_STATUS_FFC_DESCR)
    +
    +/* GG_S_AV() dostępny */
    +#define GG_S_AV(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR)
    +
    +/* GG_S_AW() zaraz wracam */
    +#define GG_S_AW(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR)
    +
    +/* GG_S_DD() nie przeszkadzać */
    +#define GG_S_DD(x) (GG_S(x) == GG_STATUS_DND || GG_S(x) == GG_STATUS_DND_DESCR)
    +
    +/* GG_S_NA() niedostępny */
    +#define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR)
    +
    +/* GG_S_I() niewidoczny */
    +#define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
    +
    +
    +/* GG_S_A() dostępny lub chętny do rozmowy */
    +#define GG_S_A(x) (GG_S_FF(x) || GG_S_AV(x))
    +
    +/* GG_S_B() zajęty lub nie przeszkadzać */
    +#define GG_S_B(x) (GG_S_AW(x) || GG_S_DD(x))
    +
    +
    +/* GG_S_D() stan opisowy */
    +#define GG_S_D(x) (GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR || \
    + GG_S(x) == GG_STATUS_FFC_DESCR || \
    + GG_S(x) == GG_STATUS_AVAIL_DESCR || \
    + GG_S(x) == GG_STATUS_BUSY_DESCR || \
    + GG_S(x) == GG_STATUS_DND_DESCR || \
    + GG_S(x) == GG_STATUS_INVISIBLE_DESCR)
    +
    +/* GG_S_BL() blokowany lub blokujÄ…cy */
    +#define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED)
    +
    +/**
    + * Zmiana statusu (pakiet \c GG_NEW_STATUS i \c GG_NEW_STATUS80BETA)
    + */
    +struct gg_new_status {
    + uint32_t status; /**< Nowy status */
    +} GG_PACKED;
    +
    +#define GG_NOTIFY_FIRST 0x000f
    +#define GG_NOTIFY_LAST 0x0010
    +
    +#define GG_NOTIFY 0x0010
    +
    +struct gg_notify {
    + uint32_t uin; /* numerek danej osoby */
    + uint8_t dunno1; /* rodzaj wpisu w liście */
    +} GG_PACKED;
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USER_OFFLINE 0x01
    +#define GG_USER_NORMAL 0x03
    +#define GG_USER_BLOCKED 0x04
    +
    +#else
    +
    +/**
    + * \ingroup contacts
    + *
    + * Rodzaj kontaktu.
    + */
    +enum {
    + GG_USER_NORMAL, /**< Zwykły kontakt */
    + GG_USER_BLOCKED, /**< Zablokowany */
    + GG_USER_OFFLINE, /**< Niewidoczny dla kontaktu */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +#define GG_LIST_EMPTY 0x0012
    +
    +#define GG_NOTIFY_REPLY 0x000c /* tak, to samo co GG_LOGIN */
    +
    +struct gg_notify_reply {
    + uint32_t uin; /* numerek */
    + uint32_t status; /* status danej osoby */
    + uint32_t remote_ip; /* adres ip delikwenta */
    + uint16_t remote_port; /* port, na którym słucha klient */
    + uint32_t version; /* wersja klienta */
    + uint16_t dunno2; /* znowu port? */
    +} GG_PACKED;
    +
    +#define GG_NOTIFY_REPLY60 0x0011
    +
    +struct gg_notify_reply60 {
    + uint32_t uin; /* numerek plus flagi w MSB */
    + uint8_t status; /* status danej osoby */
    + uint32_t remote_ip; /* adres ip delikwenta */
    + uint16_t remote_port; /* port, na którym słucha klient */
    + uint8_t version; /* wersja klienta */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno1; /* 0x00 */
    +} GG_PACKED;
    +
    +#define GG_STATUS60 0x000f
    +
    +struct gg_status60 {
    + uint32_t uin; /* numerek plus flagi w MSB */
    + uint8_t status; /* status danej osoby */
    + uint32_t remote_ip; /* adres ip delikwenta */
    + uint16_t remote_port; /* port, na którym słucha klient */
    + uint8_t version; /* wersja klienta */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno1; /* 0x00 */
    +} GG_PACKED;
    +
    +#define GG_NOTIFY_REPLY77 0x0018
    +
    +struct gg_notify_reply77 {
    + uint32_t uin; /* numerek plus flagi w MSB */
    + uint8_t status; /* status danej osoby */
    + uint32_t remote_ip; /* adres ip delikwenta */
    + uint16_t remote_port; /* port, na którym słucha klient */
    + uint8_t version; /* wersja klienta */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno1; /* 0x00 */
    + uint32_t dunno2; /* ? */
    +} GG_PACKED;
    +
    +#define GG_STATUS77 0x0017
    +
    +struct gg_status77 {
    + uint32_t uin; /* numerek plus flagi w MSB */
    + uint8_t status; /* status danej osoby */
    + uint32_t remote_ip; /* adres ip delikwenta */
    + uint16_t remote_port; /* port, na którym słucha klient */
    + uint8_t version; /* wersja klienta */
    + uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */
    + uint8_t dunno1; /* 0x00 */
    + uint32_t dunno2; /* ? */
    +} GG_PACKED;
    +
    +#define GG_ADD_NOTIFY 0x000d
    +#define GG_REMOVE_NOTIFY 0x000e
    +
    +struct gg_add_remove {
    + uint32_t uin; /* numerek */
    + uint8_t dunno1; /* bitmapa */
    +} GG_PACKED;
    +
    +#define GG_STATUS 0x0002
    +
    +struct gg_status {
    + uint32_t uin; /* numerek */
    + uint32_t status; /* nowy stan */
    +} GG_PACKED;
    +
    +#define GG_SEND_MSG 0x000b
    +
    +#ifndef DOXYGEN
    +
    +#define GG_CLASS_QUEUED 0x0001
    +#define GG_CLASS_OFFLINE GG_CLASS_QUEUED
    +#define GG_CLASS_MSG 0x0004
    +#define GG_CLASS_CHAT 0x0008
    +#define GG_CLASS_CTCP 0x0010
    +#define GG_CLASS_ACK 0x0020
    +#define GG_CLASS_EXT GG_CLASS_ACK /**< Dla kompatybilności wstecz */
    +
    +#else
    +
    +/**
    + * Klasy wiadomości. Wartości są maskami bitowymi, które w większości
    + * przypadków można łączyć (połączenie \c GG_CLASS_MSG i \c GG_CLASS_CHAT
    + * nie ma sensu).
    + *
    + * \ingroup messages
    + */
    +enum {
    + GG_CLASS_MSG, /**< Wiadomość ma pojawić się w osobnym oknie */
    + GG_CLASS_CHAT, /**< Wiadomość ma pojawić się w oknie rozmowy */
    + GG_CLASS_CTCP, /**< Wiadomość przeznaczona dla klienta Gadu-Gadu */
    + GG_CLASS_ACK, /**< Klient nie życzy sobie potwierdzenia */
    + GG_CLASS_QUEUED, /**< Wiadomość zakolejkowana na serwerze (tylko przy odbieraniu) */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +/**
    + * Maksymalna długość wiadomości.
    + *
    + * \ingroup messages
    + */
    +#define GG_MSG_MAXSIZE 1989
    +
    +struct gg_send_msg {
    + uint32_t recipient;
    + uint32_t seq;
    + uint32_t msgclass;
    +} GG_PACKED;
    +
    +struct gg_msg_richtext {
    + uint8_t flag;
    + uint16_t length;
    +} GG_PACKED;
    +
    +/**
    + * Struktura opisująca formatowanie tekstu. W zależności od wartości pola
    + * \c font, zaraz za tą strukturą może wystąpić \c gg_msg_richtext_color
    + * lub \c gg_msg_richtext_image.
    + *
    + * \ingroup messages
    + */
    +struct gg_msg_richtext_format {
    + uint16_t position; /**< PoczÄ…tkowy znak formatowania (liczony od 0) */
    + uint8_t font; /**< Atrybuty formatowania */
    +} GG_PACKED;
    +
    +#ifndef DOXYGEN
    +
    +#define GG_FONT_BOLD 0x01
    +#define GG_FONT_ITALIC 0x02
    +#define GG_FONT_UNDERLINE 0x04
    +#define GG_FONT_COLOR 0x08
    +#define GG_FONT_IMAGE 0x80
    +
    +#else
    +
    +/**
    + * Atrybuty formatowania wiadomości.
    + *
    + * \ingroup messages
    + */
    +enum {
    + GG_FONT_BOLD,
    + GG_FONT_ITALIC,
    + GG_FONT_UNDERLINE,
    + GG_FONT_COLOR,
    + GG_FONT_IMAGE
    +};
    +
    +#endif /* DOXYGEN */
    +
    +/**
    + * Struktura opisujÄ…cÄ… kolor tekstu dla atrybutu \c GG_FONT_COLOR.
    + *
    + * \ingroup messages
    + */
    +struct gg_msg_richtext_color {
    + uint8_t red; /**< Składowa czerwona koloru */
    + uint8_t green; /**< Składowa zielona koloru */
    + uint8_t blue; /**< Składowa niebieska koloru */
    +} GG_PACKED;
    +
    +/**
    + * Strukturya opisująca obrazek wstawiony do wiadomości dla atrubutu
    + * \c GG_FONT_IMAGE.
    + *
    + * \ingroup messages
    + */
    +struct gg_msg_richtext_image {
    + uint16_t unknown1; /**< Nieznane pole o wartości 0x0109 */
    + uint32_t size; /**< Rozmiar obrazka */
    + uint32_t crc32; /**< Suma kontrolna CRC32 obrazka */
    +} GG_PACKED;
    +
    +struct gg_msg_recipients {
    + uint8_t flag;
    + uint32_t count;
    +} GG_PACKED;
    +
    +struct gg_msg_image_request {
    + uint8_t flag;
    + uint32_t size;
    + uint32_t crc32;
    +} GG_PACKED;
    +
    +struct gg_msg_image_reply {
    + uint8_t flag;
    + uint32_t size;
    + uint32_t crc32;
    + /* char filename[]; */
    + /* char image[]; */
    +} GG_PACKED;
    +
    +#define GG_SEND_MSG_ACK 0x0005
    +
    +#ifndef DOXYGEN
    +
    +#define GG_ACK_BLOCKED 0x0001
    +#define GG_ACK_DELIVERED 0x0002
    +#define GG_ACK_QUEUED 0x0003
    +#define GG_ACK_MBOXFULL 0x0004
    +#define GG_ACK_NOT_DELIVERED 0x0006
    +
    +#else
    +
    +/**
    + * Status doręczenia wiadomości.
    + *
    + * \ingroup messages
    + */
    +enum
    +{
    + GG_ACK_DELIVERED, /**< Wiadomość dostarczono. */
    + GG_ACK_QUEUED, /**< Wiadomość zakolejkowano z powodu niedostępności odbiorcy. */
    + GG_ACK_BLOCKED, /**< Wiadomość zablokowana przez serwer (spam, świąteczne ograniczenia itd.) */
    + GG_ACK_MBOXFULL, /**< Wiadomości nie dostarczono z powodu zapełnionej kolejki wiadomości odbiorcy. */
    + GG_ACK_NOT_DELIVERED /**< Wiadomości nie dostarczono (tylko dla \c GG_CLASS_CTCP). */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +struct gg_send_msg_ack {
    + uint32_t status;
    + uint32_t recipient;
    + uint32_t seq;
    +} GG_PACKED;
    +
    +#define GG_RECV_MSG 0x000a
    +
    +struct gg_recv_msg {
    + uint32_t sender;
    + uint32_t seq;
    + uint32_t time;
    + uint32_t msgclass;
    +} GG_PACKED;
    +
    +#define GG_PING 0x0008
    +
    +#define GG_PONG 0x0007
    +
    +#define GG_DISCONNECTING 0x000b
    +
    +#define GG_USERLIST_REQUEST 0x0016
    +
    +#define GG_XML_EVENT 0x0027
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USERLIST_PUT 0x00
    +#define GG_USERLIST_PUT_MORE 0x01
    +#define GG_USERLIST_GET 0x02
    +
    +#else
    +
    +/**
    + * \ingroup importexport
    + *
    + * Rodzaj zapytania.
    + */
    +enum {
    + GG_USERLIST_PUT, /**< Eksport listy kontaktów. */
    + GG_USERLIST_GET, /**< Import listy kontaktów. */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +struct gg_userlist_request {
    + uint8_t type;
    +} GG_PACKED;
    +
    +#define GG_USERLIST_REPLY 0x0010
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USERLIST_PUT_REPLY 0x00
    +#define GG_USERLIST_PUT_MORE_REPLY 0x02
    +#define GG_USERLIST_GET_REPLY 0x06
    +#define GG_USERLIST_GET_MORE_REPLY 0x04
    +
    +#else
    +
    +/**
    + * \ingroup importexport
    + *
    + * Rodzaj odpowiedzi.
    + */
    +enum {
    + GG_USERLIST_PUT_REPLY, /**< Wyeksportowano listy kontaktów. */
    + GG_USERLIST_GET_REPLY, /**< Zaimportowano listę kontaktów. */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +struct gg_userlist_reply {
    + uint8_t type;
    +} GG_PACKED;
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USERLIST100_PUT 0x00
    +#define GG_USERLIST100_GET 0x02
    +
    +#else
    +
    +/**
    + * \ingroup importexport
    + *
    + * Rodzaj zapytania (10.0).
    + */
    +enum {
    + GG_USERLIST100_PUT, /**< Eksport listy kontaktów. */
    + GG_USERLIST100_GET, /**< Import listy kontaktów. */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USERLIST100_FORMAT_TYPE_NONE 0x00
    +#define GG_USERLIST100_FORMAT_TYPE_GG70 0x01
    +#define GG_USERLIST100_FORMAT_TYPE_GG100 0x02
    +
    +#else
    +
    +/**
    + * \ingroup importexport
    + *
    + * Typ formatu listy kontaktów (10.0).
    + */
    +enum {
    + GG_USERLIST100_FORMAT_TYPE_NONE, /**< Brak treści listy kontaktów. */
    + GG_USERLIST100_FORMAT_TYPE_GG70, /**< Format listy kontaktów zgodny z Gadu-Gadu 7.0. */
    + GG_USERLIST100_FORMAT_TYPE_GG100, /**< Format listy kontaktów zgodny z Gadu-Gadu 10.0. */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +#ifndef DOXYGEN
    +
    +#define GG_USERLIST100_REPLY_LIST 0x00
    +#define GG_USERLIST100_REPLY_UPTODATE 0x01
    +#define GG_USERLIST100_REPLY_ACK 0x10
    +#define GG_USERLIST100_REPLY_REJECT 0x12
    +
    +#else
    +
    +/**
    + * \ingroup importexport
    + *
    + * Typ odpowiedzi listy kontaktów (10.0).
    + */
    +enum {
    + GG_USERLIST100_REPLY_LIST, /**< W odpowiedzi znajduje się aktualna lista kontaktów na serwerze. */
    + GG_USERLIST100_REPLY_UPTODATE, /**< Komunikat o tym, że lista kontaktów jest już zsynchronizowana. */
    + GG_USERLIST100_REPLY_ACK, /**< Potwierdzenie odebrania nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer nowej wersji listy kontaktów. */
    + GG_USERLIST100_REPLY_REJECT, /**< Odmowa przyjęcia nowej wersji listy kontaktów. W polu \c gg_userlist100_reply.version znajduje się numer wersji listy kontaktów aktualnie przechowywanej przez serwer. */
    +};
    +
    +#endif /* DOXYGEN */
    +
    +struct gg_dcc_tiny_packet {
    + uint8_t type; /* rodzaj pakietu */
    +} GG_PACKED;
    +
    +struct gg_dcc_small_packet {
    + uint32_t type; /* rodzaj pakietu */
    +} GG_PACKED;
    +
    +struct gg_dcc_big_packet {
    + uint32_t type; /* rodzaj pakietu */
    + uint32_t dunno1; /* niewiadoma */
    + uint32_t dunno2; /* niewiadoma */
    +} GG_PACKED;
    +
    +/*
    + * póki co, nie znamy dokładnie protokołu. nie wiemy, co czemu odpowiada.
    + * nazwy są niepoważne i tymczasowe.
    + */
    +#define GG_DCC_WANT_FILE 0x0003 /* peer chce plik */
    +#define GG_DCC_HAVE_FILE 0x0001 /* więc mu damy */
    +#define GG_DCC_HAVE_FILEINFO 0x0003 /* niech ma informacje o pliku */
    +#define GG_DCC_GIMME_FILE 0x0006 /* peer jest pewny */
    +#define GG_DCC_CATCH_FILE 0x0002 /* wysyłamy plik */
    +
    +#define GG_DCC_FILEATTR_READONLY 0x0020
    +
    +#define GG_DCC_TIMEOUT_SEND 1800 /* 30 minut */
    +#define GG_DCC_TIMEOUT_GET 1800 /* 30 minut */
    +#define GG_DCC_TIMEOUT_FILE_ACK 300 /* 5 minut */
    +#define GG_DCC_TIMEOUT_VOICE_ACK 300 /* 5 minut */
    +
    +#define GG_DCC7_INFO 0x1f
    +
    +struct gg_dcc7_info {
    + uint32_t uin; /* numer nadawcy */
    + uint32_t type; /* sposób połączenia */
    + gg_dcc7_id_t id; /* identyfikator połączenia */
    + char info[GG_DCC7_INFO_LEN]; /* informacje o połączeniu "ip port" */
    + char hash[GG_DCC7_INFO_HASH_LEN];/* skrót "ip" */
    +} GG_PACKED;
    +
    +#define GG_DCC7_NEW 0x20
    +
    +struct gg_dcc7_new {
    + gg_dcc7_id_t id; /* identyfikator połączenia */
    + uint32_t uin_from; /* numer nadawcy */
    + uint32_t uin_to; /* numer odbiorcy */
    + uint32_t type; /* rodzaj transmisji */
    + unsigned char filename[GG_DCC7_FILENAME_LEN]; /* nazwa pliku */
    + uint32_t size; /* rozmiar pliku */
    + uint32_t size_hi; /* rozmiar pliku (starsze bajty) */
    + unsigned char hash[GG_DCC7_HASH_LEN]; /* hash SHA1 */
    +} GG_PACKED;
    +
    +#define GG_DCC7_ACCEPT 0x21
    +
    +struct gg_dcc7_accept {
    + uint32_t uin; /* numer przyjmującego połączenie */
    + gg_dcc7_id_t id; /* identyfikator połączenia */
    + uint32_t offset; /* offset przy wznawianiu transmisji */
    + uint32_t dunno1; /* 0x00000000 */
    +} GG_PACKED;
    +
    +/* XXX API */
    +#define GG_DCC7_TYPE_P2P 0x00000001 /**< Połączenie bezpośrednie */
    +#define GG_DCC7_TYPE_SERVER 0x00000002 /**< Połączenie przez serwer */
    +
    +#define GG_DCC7_REJECT 0x22
    +
    +struct gg_dcc7_reject {
    + uint32_t uin; /**< Numer odrzucającego połączenie */
    + gg_dcc7_id_t id; /**< Identyfikator połączenia */
    + uint32_t reason; /**< Powód rozłączenia */
    +} GG_PACKED;
    +
    +/* XXX API */
    +#define GG_DCC7_REJECT_BUSY 0x00000001 /**< Połączenie bezpośrednie już trwa, nie umiem obsłużyć więcej */
    +#define GG_DCC7_REJECT_USER 0x00000002 /**< Użytkownik odrzucił połączenie */
    +#define GG_DCC7_REJECT_VERSION 0x00000006 /**< Druga strona ma wersję klienta nieobsługującą połączeń bezpośrednich tego typu */
    +
    +#define GG_DCC7_ID_REQUEST 0x23
    +
    +struct gg_dcc7_id_request {
    + uint32_t type; /**< Rodzaj tranmisji */
    +} GG_PACKED;
    +
    +/* XXX API */
    +#define GG_DCC7_TYPE_VOICE 0x00000001 /**< Transmisja głosu */
    +#define GG_DCC7_TYPE_FILE 0x00000004 /**< transmisja pliku */
    +
    +#define GG_DCC7_ID_REPLY 0x23
    +
    +struct gg_dcc7_id_reply {
    + uint32_t type; /** Rodzaj transmisji */
    + gg_dcc7_id_t id; /** Przyznany identyfikator */
    +} GG_PACKED;
    +
    +#define GG_DCC7_DUNNO1 0x24
    +
    +#define GG_DCC7_TIMEOUT_CONNECT 10 /* 10 sekund */
    +#define GG_DCC7_TIMEOUT_SEND 1800 /* 30 minut */
    +#define GG_DCC7_TIMEOUT_GET 1800 /* 30 minut */
    +#define GG_DCC7_TIMEOUT_FILE_ACK 300 /* 5 minut */
    +#define GG_DCC7_TIMEOUT_VOICE_ACK 300 /* 5 minut */
    +
    +#define GG_CHAT_INFO_UPDATE_ENTERED 0x01
    +#define GG_CHAT_INFO_UPDATE_EXITED 0x03
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#ifdef _WIN32
    +#pragma pack(pop)
    +#endif
    +
    +#endif /* LIBGADU_LIBGADU_H */
    +
    +/*
    + * Local variables:
    + * c-indentation-style: k&r
    + * c-basic-offset: 8
    + * indent-tabs-mode: notnil
    + * End:
    + *
    + * vim: shiftwidth=8:
    + */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/libpurple.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,22 @@
    +#include <libpurple/gaim-compat.h>
    +#include <libpurple/connection.h>
    +#include <libpurple/conversation.h>
    +#include <libpurple/core.h>
    +#include <libpurple/debug.h>
    +#include <libpurple/dnsquery.h>
    +#include <libpurple/ft.h>
    +#include <libpurple/imgstore.h>
    +#include <libpurple/network.h>
    +#include <libpurple/notify.h>
    +#include <libpurple/plugin.h>
    +#include <libpurple/pounce.h>
    +#include <libpurple/prefs.h>
    +#include <libpurple/privacy.h>
    +#include <libpurple/proxy.h>
    +#include <libpurple/request.h>
    +#include <libpurple/roomlist.h>
    +#include <libpurple/signals.h>
    +#include <libpurple/sslconn.h>
    +#include <libpurple/sound.h>
    +#include <libpurple/util.h>
    +#include <libpurple/whiteboard.h>
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/log.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,583 @@
    +/**
    + * @file log.h Logging API
    + * @ingroup core
    + * @see @ref log-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_LOG_H_
    +#define _PURPLE_LOG_H_
    +
    +#include <stdio.h>
    +
    +
    +/********************************************************
    + * DATA STRUCTURES **************************************
    + ********************************************************/
    +
    +typedef struct _PurpleLog PurpleLog;
    +typedef struct _PurpleLogLogger PurpleLogLogger;
    +typedef struct _PurpleLogCommonLoggerData PurpleLogCommonLoggerData;
    +typedef struct _PurpleLogSet PurpleLogSet;
    +
    +typedef enum {
    + PURPLE_LOG_IM,
    + PURPLE_LOG_CHAT,
    + PURPLE_LOG_SYSTEM
    +} PurpleLogType;
    +
    +typedef enum {
    + PURPLE_LOG_READ_NO_NEWLINE = 1
    +} PurpleLogReadFlags;
    +
    +#include "account.h"
    +#include "conversation.h"
    +
    +typedef void (*PurpleLogSetCallback) (GHashTable *sets, PurpleLogSet *set);
    +
    +/**
    + * A log logger.
    + *
    + * This struct gets filled out and is included in the PurpleLog. It contains everything
    + * needed to write and read from logs.
    + */
    +struct _PurpleLogLogger {
    + char *name; /**< The logger's name */
    + char *id; /**< an identifier to refer to this logger */
    +
    + /** This gets called when the log is first created.
    + I don't think this is actually needed. */
    + void (*create)(PurpleLog *log);
    +
    + /** This is used to write to the log file */
    + gsize (*write)(PurpleLog *log,
    + PurpleMessageFlags type,
    + const char *from,
    + time_t time,
    + const char *message);
    +
    + /** Called when the log is destroyed */
    + void (*finalize)(PurpleLog *log);
    +
    + /** This function returns a sorted GList of available PurpleLogs */
    + GList *(*list)(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    + /** Given one of the logs returned by the logger's list function,
    + * this returns the contents of the log in GtkIMHtml markup */
    + char *(*read)(PurpleLog *log, PurpleLogReadFlags *flags);
    +
    + /** Given one of the logs returned by the logger's list function,
    + * this returns the size of the log in bytes */
    + int (*size)(PurpleLog *log);
    +
    + /** Returns the total size of all the logs. If this is undefined a default
    + * implementation is used */
    + int (*total_size)(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    + /** This function returns a sorted GList of available system PurpleLogs */
    + GList *(*list_syslog)(PurpleAccount *account);
    +
    + /** Adds PurpleLogSets to a GHashTable. By passing the data in the PurpleLogSets
    + * to list, the caller can get every available PurpleLog from the logger.
    + * Loggers using purple_log_common_writer() (or otherwise storing their
    + * logs in the same directory structure as the stock loggers) do not
    + * need to implement this function.
    + *
    + * Loggers which implement this function must create a PurpleLogSet,
    + * then call @a cb with @a sets and the newly created PurpleLogSet. */
    + void (*get_log_sets)(PurpleLogSetCallback cb, GHashTable *sets);
    +
    + /* Attempts to delete the specified log, indicating success or failure */
    + gboolean (*remove)(PurpleLog *log);
    +
    + /* Tests whether a log is deletable */
    + gboolean (*is_deletable)(PurpleLog *log);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/**
    + * A log. Not the wooden type.
    + */
    +struct _PurpleLog {
    + PurpleLogType type; /**< The type of log this is */
    + char *name; /**< The name of this log */
    + PurpleAccount *account; /**< The account this log is taking
    + place on */
    + PurpleConversation *conv; /**< The conversation being logged */
    + time_t time; /**< The time this conversation
    + started, converted to the local timezone */
    +
    + PurpleLogLogger *logger; /**< The logging mechanism this log
    + is to use */
    + void *logger_data; /**< Data used by the log logger */
    + struct tm *tm; /**< The time this conversation
    + started, saved with original
    + timezone data, if available and
    + if struct tm has the BSD
    + timezone fields, else @c NULL.
    + Do NOT modify anything in this struct.*/
    +
    + /* IMPORTANT: Some code in log.c allocates these without zeroing them.
    + * IMPORTANT: Update that code if you add members here. */
    +};
    +
    +/**
    + * A common logger_data struct containing a file handle and path, as well
    + * as a pointer to something else for additional data.
    + */
    +struct _PurpleLogCommonLoggerData {
    + char *path;
    + FILE *file;
    + void *extra_data;
    +};
    +
    +/**
    + * Describes available logs.
    + *
    + * By passing the elements of this struct to purple_log_get_logs(), the caller
    + * can get all available PurpleLogs.
    + */
    +struct _PurpleLogSet {
    + PurpleLogType type; /**< The type of logs available */
    + char *name; /**< The name of the logs available */
    + PurpleAccount *account; /**< The account the available logs
    + took place on. This will be
    + @c NULL if the account no longer
    + exists. (Depending on a
    + logger's implementation of
    + list, it may not be possible
    + to load such logs.) */
    + gboolean buddy; /**< Is this (account, name) a buddy
    + on the buddy list? */
    + char *normalized_name; /**< The normalized version of
    + @a name. It must be set, and
    + may be set to the same pointer
    + value as @a name. */
    +
    + /* IMPORTANT: Some code in log.c allocates these without zeroing them.
    + * IMPORTANT: Update that code if you add members here. */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/***************************************/
    +/** @name Log Functions */
    +/***************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new log
    + *
    + * @param type The type of log this is.
    + * @param name The name of this conversation (buddy name, chat name,
    + * etc.)
    + * @param account The account the conversation is occurring on
    + * @param conv The conversation being logged
    + * @param time The time this conversation started
    + * @param tm The time this conversation started, with timezone data,
    + * if available and if struct tm has the BSD timezone fields.
    + * @return The new log
    + */
    +PurpleLog *purple_log_new(PurpleLogType type, const char *name, PurpleAccount *account,
    + PurpleConversation *conv, time_t time, const struct tm *tm);
    +
    +/**
    + * Frees a log
    + *
    + * @param log The log to destroy
    + */
    +void purple_log_free(PurpleLog *log);
    +
    +/**
    + * Writes to a log file. Assumes you have checked preferences already.
    + *
    + * @param log The log to write to
    + * @param type The type of message being logged
    + * @param from Whom this message is coming from, or @c NULL for
    + * system messages
    + * @param time A timestamp in UNIX time
    + * @param message The message to log
    + */
    +void purple_log_write(PurpleLog *log,
    + PurpleMessageFlags type,
    + const char *from,
    + time_t time,
    + const char *message);
    +
    +/**
    + * Reads from a log
    + *
    + * @param log The log to read from
    + * @param flags The returned logging flags.
    + *
    + * @return The contents of this log in Purple Markup.
    + */
    +char *purple_log_read(PurpleLog *log, PurpleLogReadFlags *flags);
    +
    +/**
    + * Returns a list of all available logs
    + *
    + * @param type The type of the log
    + * @param name The name of the log
    + * @param account The account
    + * @return A sorted list of PurpleLogs
    + */
    +GList *purple_log_get_logs(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    +/**
    + * Returns a GHashTable of PurpleLogSets.
    + *
    + * A "log set" here means the information necessary to gather the
    + * PurpleLogs for a given buddy/chat. This information would be passed
    + * to purple_log_list to get a list of PurpleLogs.
    + *
    + * The primary use of this function is to get a list of everyone the
    + * user has ever talked to (assuming he or she uses logging).
    + *
    + * The GHashTable that's returned will free all log sets in it when
    + * destroyed. If a PurpleLogSet is removed from the GHashTable, it
    + * must be freed with purple_log_set_free().
    + *
    + * @return A GHashTable of all available unique PurpleLogSets
    + */
    +GHashTable *purple_log_get_log_sets(void);
    +
    +/**
    + * Returns a list of all available system logs
    + *
    + * @param account The account
    + * @return A sorted list of PurpleLogs
    + */
    +GList *purple_log_get_system_logs(PurpleAccount *account);
    +
    +/**
    + * Returns the size of a log
    + *
    + * @param log The log
    + * @return The size of the log, in bytes
    + */
    +int purple_log_get_size(PurpleLog *log);
    +
    +/**
    + * Returns the size, in bytes, of all available logs in this conversation
    + *
    + * @param type The type of the log
    + * @param name The name of the log
    + * @param account The account
    + * @return The size in bytes
    + */
    +int purple_log_get_total_size(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    +/**
    + * Returns the activity score of a log, based on total size in bytes,
    + * which is then decayed based on age
    + *
    + * @param type The type of the log
    + * @param name The name of the log
    + * @param account The account
    + * @return The activity score
    + *
    + * @since 2.6.0
    + */
    +int purple_log_get_activity_score(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    +/**
    + * Tests whether a log is deletable
    + *
    + * A return value of @c FALSE indicates that purple_log_delete() will fail on this
    + * log, unless something changes between the two calls. A return value of @c TRUE,
    + * however, does not guarantee the log can be deleted.
    + *
    + * @param log The log
    + * @return A boolean indicating if the log is deletable
    + */
    +gboolean purple_log_is_deletable(PurpleLog *log);
    +
    +/**
    + * Deletes a log
    + *
    + * @param log The log
    + * @return A boolean indicating success or failure
    + */
    +gboolean purple_log_delete(PurpleLog *log);
    +
    +/**
    + * Returns the default logger directory Purple uses for a given account
    + * and username. This would be where Purple stores logs created by
    + * the built-in text or HTML loggers.
    + *
    + * @param type The type of the log.
    + * @param name The name of the log.
    + * @param account The account.
    + * @return The default logger directory for Purple.
    + */
    +char *purple_log_get_log_dir(PurpleLogType type, const char *name, PurpleAccount *account);
    +
    +/**
    + * Implements GCompareFunc for PurpleLogs
    + *
    + * @param y A PurpleLog
    + * @param z Another PurpleLog
    + * @return A value as specified by GCompareFunc
    + */
    +gint purple_log_compare(gconstpointer y, gconstpointer z);
    +
    +/**
    + * Implements GCompareFunc for PurpleLogSets
    + *
    + * @param y A PurpleLogSet
    + * @param z Another PurpleLogSet
    + * @return A value as specified by GCompareFunc
    + */
    +gint purple_log_set_compare(gconstpointer y, gconstpointer z);
    +
    +/**
    + * Frees a log set
    + *
    + * @param set The log set to destroy
    + */
    +void purple_log_set_free(PurpleLogSet *set);
    +
    +/*@}*/
    +
    +/******************************************/
    +/** @name Common Logger Functions */
    +/******************************************/
    +/*@{*/
    +
    +/**
    + * Opens a new log file in the standard Purple log location
    + * with the given file extension, named for the current time,
    + * for writing. If a log file is already open, the existing
    + * file handle is retained. The log's logger_data value is
    + * set to a PurpleLogCommonLoggerData struct containing the log
    + * file handle and log path.
    + *
    + * This function is intended to be used as a "common"
    + * implementation of a logger's @c write function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param log The log to write to.
    + * @param ext The file extension to give to this log file.
    + */
    +void purple_log_common_writer(PurpleLog *log, const char *ext);
    +
    +/**
    + * Returns a sorted GList of PurpleLogs of the requested type.
    + *
    + * This function should only be used with logs that are written
    + * with purple_log_common_writer(). It's intended to be used as
    + * a "common" implementation of a logger's @c list function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param type The type of the logs being listed.
    + * @param name The name of the log.
    + * @param account The account of the log.
    + * @param ext The file extension this log format uses.
    + * @param logger A reference to the logger struct for this log.
    + *
    + * @return A sorted GList of PurpleLogs matching the parameters.
    + */
    +GList *purple_log_common_lister(PurpleLogType type, const char *name,
    + PurpleAccount *account, const char *ext,
    + PurpleLogLogger *logger);
    +
    +/**
    + * Returns the total size of all the logs for a given user, with
    + * a given extension.
    + *
    + * This function should only be used with logs that are written
    + * with purple_log_common_writer(). It's intended to be used as
    + * a "common" implementation of a logger's @c total_size function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param type The type of the logs being sized.
    + * @param name The name of the logs to size
    + * (e.g. the username or chat name).
    + * @param account The account of the log.
    + * @param ext The file extension this log format uses.
    + *
    + * @return The size of all the logs with the specified extension
    + * for the specified user.
    + */
    +int purple_log_common_total_sizer(PurpleLogType type, const char *name,
    + PurpleAccount *account, const char *ext);
    +
    +/**
    + * Returns the size of a given PurpleLog.
    + *
    + * This function should only be used with logs that are written
    + * with purple_log_common_writer(). It's intended to be used as
    + * a "common" implementation of a logger's @c size function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param log The PurpleLog to size.
    + *
    + * @return An integer indicating the size of the log in bytes.
    + */
    +int purple_log_common_sizer(PurpleLog *log);
    +
    +/**
    + * Deletes a log
    + *
    + * This function should only be used with logs that are written
    + * with purple_log_common_writer(). It's intended to be used as
    + * a "common" implementation of a logger's @c delete function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param log The PurpleLog to delete.
    + *
    + * @return A boolean indicating success or failure.
    + */
    +gboolean purple_log_common_deleter(PurpleLog *log);
    +
    +/**
    + * Checks to see if a log is deletable
    + *
    + * This function should only be used with logs that are written
    + * with purple_log_common_writer(). It's intended to be used as
    + * a "common" implementation of a logger's @c is_deletable function.
    + * It should only be passed to purple_log_logger_new() and never
    + * called directly.
    + *
    + * @param log The PurpleLog to check.
    + *
    + * @return A boolean indicating if the log is deletable.
    + */
    +gboolean purple_log_common_is_deletable(PurpleLog *log);
    +
    +/*@}*/
    +
    +/******************************************/
    +/** @name Logger Functions */
    +/******************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new logger
    + *
    + * @param id The logger's id.
    + * @param name The logger's name.
    + * @param functions The number of functions being passed. The following
    + * functions are currently available (in order): @c create,
    + * @c write, @c finalize, @c list, @c read, @c size,
    + * @c total_size, @c list_syslog, @c get_log_sets,
    + * @c remove, @c is_deletable.
    + * For details on these functions, see PurpleLogLogger.
    + * Functions may not be skipped. For example, passing
    + * @c create and @c write is acceptable (for a total of
    + * two functions). Passing @c create and @c finalize,
    + * however, is not. To accomplish that, the caller must
    + * pass @c create, @c NULL (a placeholder for @c write),
    + * and @c finalize (for a total of 3 functions).
    + *
    + * @return The new logger
    + */
    +PurpleLogLogger *purple_log_logger_new(const char *id, const char *name, int functions, ...);
    +
    +/**
    + * Frees a logger
    + *
    + * @param logger The logger to free
    + */
    +void purple_log_logger_free(PurpleLogLogger *logger);
    +
    +/**
    + * Adds a new logger
    + *
    + * @param logger The new logger to add
    + */
    +void purple_log_logger_add (PurpleLogLogger *logger);
    +
    +/**
    + *
    + * Removes a logger
    + *
    + * @param logger The logger to remove
    + */
    +void purple_log_logger_remove (PurpleLogLogger *logger);
    +
    +/**
    + *
    + * Sets the current logger
    + *
    + * @param logger The logger to set
    + */
    +void purple_log_logger_set (PurpleLogLogger *logger);
    +
    +/**
    + *
    + * Returns the current logger
    + *
    + * @return logger The current logger
    + */
    +PurpleLogLogger *purple_log_logger_get (void);
    +
    +/**
    + * Returns a GList containing the IDs and names of the registered
    + * loggers.
    + *
    + * @return The list of IDs and names.
    + */
    +GList *purple_log_logger_get_options(void);
    +
    +/**************************************************************************/
    +/** @name Log Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Initializes the log subsystem.
    + */
    +void purple_log_init(void);
    +
    +/**
    + * Returns the log subsystem handle.
    + *
    + * @return The log subsystem handle.
    + */
    +void *purple_log_get_handle(void);
    +
    +/**
    + * Uninitializes the log subsystem.
    + */
    +void purple_log_uninit(void);
    +
    +/*@}*/
    +
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_LOG_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/marshallers.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,84 @@
    +
    +#ifndef __purple_smarshal_MARSHAL_H__
    +#define __purple_smarshal_MARSHAL_H__
    +
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +/* VOID:POINTER,POINTER,OBJECT (./marshallers.list:1) */
    +extern void purple_smarshal_VOID__POINTER_POINTER_OBJECT (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* BOOLEAN:OBJECT,POINTER,STRING (./marshallers.list:2) */
    +extern void purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:STRING,STRING (./marshallers.list:3) */
    +extern void purple_smarshal_VOID__STRING_STRING (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:STRING,STRING,DOUBLE (./marshallers.list:4) */
    +extern void purple_smarshal_VOID__STRING_STRING_DOUBLE (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:ENUM,STRING,STRING (./marshallers.list:5) */
    +extern void purple_smarshal_VOID__ENUM_STRING_STRING (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:ENUM,STRING,STRING,BOOLEAN (./marshallers.list:6) */
    +extern void purple_smarshal_VOID__ENUM_STRING_STRING_BOOLEAN (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:FLAGS,FLAGS (./marshallers.list:7) */
    +extern void purple_smarshal_VOID__FLAGS_FLAGS (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:STRING,STRING,OBJECT,OBJECT (./marshallers.list:8) */
    +extern void purple_smarshal_VOID__STRING_STRING_OBJECT_OBJECT (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +/* VOID:POINTER,POINTER,OBJECT,OBJECT (./marshallers.list:9) */
    +extern void purple_smarshal_VOID__POINTER_POINTER_OBJECT_OBJECT (GClosure *closure,
    + GValue *return_value,
    + guint n_param_values,
    + const GValue *param_values,
    + gpointer invocation_hint,
    + gpointer marshal_data);
    +
    +G_END_DECLS
    +
    +#endif /* __purple_smarshal_MARSHAL_H__ */
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media-gst.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,202 @@
    +/**
    + * @file media-gst.h Media 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_GST_H_
    +#define _PURPLE_MEDIA_GST_H_
    +
    +#include "media.h"
    +#include "mediamanager.h"
    +
    +#include <gst/gst.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_ELEMENT_TYPE (purple_media_element_type_get_type())
    +#define PURPLE_TYPE_MEDIA_ELEMENT_INFO (purple_media_element_info_get_type())
    +#define PURPLE_MEDIA_ELEMENT_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    +#define PURPLE_MEDIA_ELEMENT_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    +#define PURPLE_IS_MEDIA_ELEMENT_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO))
    +#define PURPLE_IS_MEDIA_ELEMENT_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_ELEMENT_INFO))
    +#define PURPLE_MEDIA_ELEMENT_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfo))
    +
    +/** An opaque structure representing an audio/video source/sink. */
    +typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo;
    +typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass;
    +typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +typedef enum {
    + PURPLE_MEDIA_ELEMENT_NONE = 0, /** empty element */
    + PURPLE_MEDIA_ELEMENT_AUDIO = 1, /** supports audio */
    + PURPLE_MEDIA_ELEMENT_VIDEO = 1 << 1, /** supports video */
    + PURPLE_MEDIA_ELEMENT_AUDIO_VIDEO = PURPLE_MEDIA_ELEMENT_AUDIO
    + | PURPLE_MEDIA_ELEMENT_VIDEO, /** supports audio and video */
    +
    + PURPLE_MEDIA_ELEMENT_NO_SRCS = 0, /** has no src pads */
    + PURPLE_MEDIA_ELEMENT_ONE_SRC = 1 << 2, /** has one src pad */
    + PURPLE_MEDIA_ELEMENT_MULTI_SRC = 1 << 3, /** has multiple src pads */
    + PURPLE_MEDIA_ELEMENT_REQUEST_SRC = 1 << 4, /** src pads must be requested */
    +
    + PURPLE_MEDIA_ELEMENT_NO_SINKS = 0, /** has no sink pads */
    + PURPLE_MEDIA_ELEMENT_ONE_SINK = 1 << 5, /** has one sink pad */
    + PURPLE_MEDIA_ELEMENT_MULTI_SINK = 1 << 6, /** has multiple sink pads */
    + PURPLE_MEDIA_ELEMENT_REQUEST_SINK = 1 << 7, /** sink pads must be requested */
    +
    + PURPLE_MEDIA_ELEMENT_UNIQUE = 1 << 8, /** This element is unique and
    + only one instance of it should
    + be created at a time */
    +
    + PURPLE_MEDIA_ELEMENT_SRC = 1 << 9, /** can be set as an active src */
    + PURPLE_MEDIA_ELEMENT_SINK = 1 << 10, /** can be set as an active sink */
    + PURPLE_MEDIA_ELEMENT_APPLICATION = 1 << 11, /** supports application data */
    +} PurpleMediaElementType;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Gets the element type's GType.
    + *
    + * @return The element type's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_element_type_get_type(void);
    +
    +/**
    + * Gets the element info's GType.
    + *
    + * @return The element info's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_element_info_get_type(void);
    +
    +/**
    + * Gets the source from a session
    + *
    + * @param media The media object the session is in.
    + * @param sess_id The session id of the session to get the source from.
    + *
    + * @return The source retrieved.
    + *
    + * @since 2.6.0
    + */
    +GstElement *purple_media_get_src(PurpleMedia *media, const gchar *sess_id);
    +
    +/**
    + * Gets the tee from a given session/stream.
    + *
    + * @param media The instance to get the tee from.
    + * @param session_id The id of the session to get the tee from.
    + * @param participant Optionally, the participant of the stream to get the tee from.
    + *
    + * @return The GstTee element from the chosen session/stream.
    + *
    + * @since 2.6.0
    + */
    +GstElement *purple_media_get_tee(PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +
    +/**
    + * Gets the pipeline from the media manager.
    + *
    + * @param manager The media manager to get the pipeline from.
    + *
    + * @return The pipeline.
    + *
    + * @since 2.6.0
    + */
    +GstElement *purple_media_manager_get_pipeline(PurpleMediaManager *manager);
    +
    +/**
    + * Returns a GStreamer source or sink for audio or video.
    + *
    + * @param manager The media manager to use to obtain the source/sink.
    + * @param type The type of source/sink to get.
    + * @param media The media call this element is requested for.
    + * @param session_id The id of the session this element is requested for or NULL.
    + * @param participant The remote user this element is requested for or NULL.
    + *
    + * @since 2.6.0
    + */
    +GstElement *purple_media_manager_get_element(PurpleMediaManager *manager,
    + PurpleMediaSessionType type, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +PurpleMediaElementInfo *purple_media_manager_get_element_info(
    + PurpleMediaManager *manager, const gchar *name);
    +gboolean purple_media_manager_register_element(PurpleMediaManager *manager,
    + PurpleMediaElementInfo *info);
    +gboolean purple_media_manager_unregister_element(PurpleMediaManager *manager,
    + const gchar *name);
    +gboolean purple_media_manager_set_active_element(PurpleMediaManager *manager,
    + PurpleMediaElementInfo *info);
    +PurpleMediaElementInfo *purple_media_manager_get_active_element(
    + PurpleMediaManager *manager, PurpleMediaElementType type);
    +
    +/**
    + * Reduces media formats supported by the video source to given set.
    + *
    + * Useful to force negotiation of smaller picture resolution more suitable for
    + * use with particular codec and communication protocol without rescaling.
    + *
    + * @param manager The media manager to set the media formats.
    + * @param caps Set of allowed media formats.
    + *
    + * @since 2.8.0
    + */
    +void purple_media_manager_set_video_caps(PurpleMediaManager *manager,
    + GstCaps *caps);
    +
    +/**
    + * Returns current set of media formats limiting the output from video source.
    + *
    + * @param manager The media manager to get the media formats from.
    + *
    + * @return @c GstCaps limiting the video source's formats.
    + *
    + * @since 2.8.0
    + */
    +GstCaps *purple_media_manager_get_video_caps(PurpleMediaManager *manager);
    +
    +gchar *purple_media_element_info_get_id(PurpleMediaElementInfo *info);
    +gchar *purple_media_element_info_get_name(PurpleMediaElementInfo *info);
    +PurpleMediaElementType purple_media_element_info_get_element_type(
    + PurpleMediaElementInfo *info);
    +GstElement *purple_media_element_info_call_create(
    + PurpleMediaElementInfo *info, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_GST_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,513 @@
    +/**
    + * @file media.h Media 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_H_
    +#define _PURPLE_MEDIA_H_
    +
    +#include "media/candidate.h"
    +#include "media/codec.h"
    +#include "media/enum-types.h"
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA (purple_media_get_type())
    +#define PURPLE_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA, PurpleMedia))
    +#define PURPLE_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA, PurpleMediaClass))
    +#define PURPLE_IS_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA))
    +#define PURPLE_IS_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA))
    +#define PURPLE_MEDIA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA, PurpleMediaClass))
    +
    +/** An opaque structure representing a media call. */
    +typedef struct _PurpleMedia PurpleMedia;
    +
    +#include "signals.h"
    +#include "util.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Gets the media class's GType
    + *
    + * @return The media class's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_get_type(void);
    +
    +/**
    + * Gets a list of session IDs.
    + *
    + * @param media The media session from which to retrieve session IDs.
    + *
    + * @return GList of session IDs. The caller must free the list.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_get_session_ids(PurpleMedia *media);
    +
    +/**
    + * Gets the PurpleAccount this media session is on.
    + *
    + * @param media The media session to retrieve the account from.
    + *
    + * @return The account retrieved.
    + *
    + * @since 2.6.0
    + */
    +PurpleAccount *purple_media_get_account(PurpleMedia *media);
    +
    +/**
    + * Gets the prpl data from the media session.
    + *
    + * @param media The media session to retrieve the prpl data from.
    + *
    + * @return The prpl data retrieved.
    + *
    + * @since 2.6.0
    + */
    +gpointer purple_media_get_prpl_data(PurpleMedia *media);
    +
    +/**
    + * Sets the prpl data on the media session.
    + *
    + * @param media The media session to set the prpl data on.
    + * @param prpl_data The data to set on the media session.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_set_prpl_data(PurpleMedia *media, gpointer prpl_data);
    +
    +/**
    + * Signals an error in the media session.
    + *
    + * @param media The media object to set the state on.
    + * @param error The format of the error message to send in the signal.
    + * @param ... The arguments to plug into the format.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_error(PurpleMedia *media, const gchar *error, ...);
    +
    +/**
    + * Ends all streams that match the given parameters
    + *
    + * @param media The media object with which to end streams.
    + * @param session_id The session to end streams on.
    + * @param participant The participant to end streams with.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_end(PurpleMedia *media, const gchar *session_id,
    + const gchar *participant);
    +
    +/**
    + * Signals different information about the given stream.
    + *
    + * @param media The media instance to containing the stream to signal.
    + * @param type The type of info being signaled.
    + * @param session_id The id of the session of the stream being signaled.
    + * @param participant The participant of the stream being signaled.
    + * @param local TRUE if the info originated locally, FALSE if on the remote end.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_stream_info(PurpleMedia *media, PurpleMediaInfoType type,
    + const gchar *session_id, const gchar *participant,
    + gboolean local);
    +
    +/**
    + * Sets various optional parameters of the media call.
    + *
    + * Currently supported are:
    + * - "sdes-cname" : The CNAME for the RTP sessions
    + * - "sdes-name" : Real name used to describe the source in SDES messages
    + * - "sdes-tool" : The TOOL to put in SDES messages
    + * - "sdes-email" : Email address to put in SDES messages
    + * - "sdes-location" : The LOCATION to put in SDES messages
    + * - "sdes-note" : The NOTE to put in SDES messages
    + * - "sdes-phone" : The PHONE to put in SDES messages
    + *
    + * @param media The media object to set the parameters on.
    + * @param num_params The number of parameters to pass
    + * @param params Array of @c GParameter to pass
    + *
    + * @since 2.8.0
    + */
    +void purple_media_set_params(PurpleMedia *media,
    + guint num_params, GParameter *params);
    +
    +/**
    + * Gets the list of optional parameters supported by the media backend.
    + *
    + * The list is owned by the @c PurpleMedia internals and should NOT be freed.
    + *
    + * @param media The media object
    + *
    + * @return NULL-terminated array of names of supported parameters.
    + *
    + * @since 2.8.0
    + */
    +const gchar **purple_media_get_available_params(PurpleMedia *media);
    +
    +/**
    + * Checks if given optional parameter is supported by the media backend.
    + *
    + * @param media The media object
    + * @param param name of parameter
    + *
    + * @return @c TRUE if backend recognizes the parameter, @c FALSE otherwise.
    + *
    + * @since 2.8.0
    + */
    +gboolean purple_media_param_is_supported(PurpleMedia *media, const gchar *param);
    +
    +/**
    + * Adds a stream to a session.
    + *
    + * It only adds a stream to one audio session or video session as
    + * the @c sess_id must be unique between sessions.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to add the stream to.
    + * @param who The name of the remote user to add the stream for.
    + * @param type The type of stream to create.
    + * @param initiator Whether or not the local user initiated the stream.
    + * @param transmitter The transmitter to use for the stream.
    + * @param num_params The number of parameters to pass to Farsight.
    + * @param params The parameters to pass to Farsight.
    + *
    + * @return @c TRUE The stream was added successfully, @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
    + const gchar *who, PurpleMediaSessionType type,
    + gboolean initiator, const gchar *transmitter,
    + guint num_params, GParameter *params);
    +
    +/**
    + * Gets the session type from a session
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to get the type from.
    + *
    + * @return The retreived session type.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaSessionType purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id);
    +
    +/**
    + * Gets the PurpleMediaManager this media session is a part of.
    + *
    + * @param media The media object to get the manager instance from.
    + *
    + * @return The PurpleMediaManager instance retrieved.
    + *
    + * @since 2.6.0
    + */
    +struct _PurpleMediaManager *purple_media_get_manager(PurpleMedia *media);
    +
    +/**
    + * Gets the codecs from a session.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to get the codecs from.
    + *
    + * @return The retreieved codecs.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_get_codecs(PurpleMedia *media, const gchar *sess_id);
    +
    +/**
    + * Adds remote candidates to the stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session find the stream in.
    + * @param participant The name of the remote user to add the candidates for.
    + * @param remote_candidates The remote candidates to add.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_add_remote_candidates(PurpleMedia *media,
    + const gchar *sess_id,
    + const gchar *participant,
    + GList *remote_candidates);
    +
    +/**
    + * Gets the local candidates from a stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to find the stream in.
    + * @param participant The name of the remote user to get the candidates from.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_get_local_candidates(PurpleMedia *media,
    + const gchar *sess_id,
    + const gchar *participant);
    +
    +/**
    + * Gets the active local candidates for the stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to find the stream in.
    + * @param participant The name of the remote user to get the active candidate
    + * from.
    + *
    + * @return The active candidates retrieved.
    + *
    + * @since 2.8.0
    + */
    +GList *purple_media_get_active_local_candidates(PurpleMedia *media,
    + const gchar *sess_id, const gchar *participant);
    +
    +/**
    + * Gets the active remote candidates for the stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to find the stream in.
    + * @param participant The name of the remote user to get the remote candidate
    + * from.
    + *
    + * @return The remote candidates retrieved.
    + *
    + * @since 2.8.0
    + */
    +GList *purple_media_get_active_remote_candidates(PurpleMedia *media,
    + const gchar *sess_id, const gchar *participant);
    +
    +/**
    + * Sets remote candidates from the stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session find the stream in.
    + * @param participant The name of the remote user to set the candidates from.
    + * @param codecs The list of remote codecs to set.
    + *
    + * @return @c TRUE The codecs were set successfully, or @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id,
    + const gchar *participant, GList *codecs);
    +
    +/**
    + * Returns whether or not the candidates for set of streams are prepared
    + *
    + * @param media The media object to find the remote user in.
    + * @param session_id The session id of the session to check.
    + * @param participant The remote user to check for.
    + *
    + * @return @c TRUE All streams for the given session_id/participant combination have candidates prepared, @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_candidates_prepared(PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +/**
    + * Sets the send codec for the a session.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to set the codec for.
    + * @param codec The codec to set the session to stream.
    + *
    + * @return @c TRUE The codec was successfully changed, or @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_set_send_codec(PurpleMedia *media, const gchar *sess_id, PurpleMediaCodec *codec);
    +
    +/**
    + * Sets the encryption parameters of our media in the session.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to set parameters of.
    + * @param cipher The cipher to use to encrypt our media in the session.
    + * @param auth The algorithm to use to compute authentication codes for our
    + * media frames.
    + * @param key The encryption key.
    + * @param key_len Byte length of the encryption key.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_set_encryption_parameters(PurpleMedia *media,
    + const gchar *sess_id, const gchar *cipher,
    + const gchar *auth, const gchar *key, gsize key_len);
    +
    +/**
    + * Sets the decryption parameters for a session participant's media.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to set parameters of.
    + * @param participant The participant of the session to set parameters of.
    + * @param cipher The cipher to use to decrypt media coming from this session's
    + * participant.
    + * @param auth The algorithm to use for authentication of the media coming
    + * from the session's participant.
    + * @param key The decryption key.
    + * @param key_len Byte length of the decryption key.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_set_decryption_parameters(PurpleMedia *media,
    + const gchar *sess_id, const gchar *participant,
    + const gchar *cipher, const gchar *auth,
    + const gchar *key, gsize key_len);
    +
    +/**
    + * Gets whether a session's codecs are ready to be used.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to check.
    + *
    + * @return @c TRUE The codecs are ready, or @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_codecs_ready(PurpleMedia *media, const gchar *sess_id);
    +
    +/**
    + * Sets the rtcp-mux option for the stream.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session find the stream in.
    + * @param participant The name of the remote user to set the rtcp-mux for.
    + * @paran send_rtcp_mux Whether to enable the rtcp-mux option
    + *
    + * @return @c TRUE RTCP-Mux was set successfully, or @c FALSE otherwise.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_set_send_rtcp_mux(PurpleMedia *media,
    + const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    +
    +/**
    + * Gets whether the local user is the conference/session/stream's initiator.
    + *
    + * @param media The media instance to find the session in.
    + * @param sess_id The session id of the session to check.
    + * @param participant The participant of the stream to check.
    + *
    + * @return TRUE if the local user is the stream's initator, else FALSE.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_is_initiator(PurpleMedia *media,
    + const gchar *sess_id, const gchar *participant);
    +
    +/**
    + * Gets whether a streams selected have been accepted.
    + *
    + * @param media The media object to find the session in.
    + * @param sess_id The session id of the session to check.
    + * @param participant The participant to check.
    + *
    + * @return @c TRUE The selected streams have been accepted, or @c FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_accepted(PurpleMedia *media, const gchar *sess_id,
    + const gchar *participant);
    +
    +/**
    + * Sets the input volume of all the selected sessions.
    + *
    + * @param media The media object the sessions are in.
    + * @param session_id The session to select (if any).
    + * @param level The level to set the volume to.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_set_input_volume(PurpleMedia *media, const gchar *session_id, double level);
    +
    +/**
    + * Sets the output volume of all the selected streams.
    + *
    + * @param media The media object the streams are in.
    + * @param session_id The session to limit the streams to (if any).
    + * @param participant The participant to limit the streams to (if any).
    + * @param level The level to set the volume to.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_set_output_volume(PurpleMedia *media, const gchar *session_id,
    + const gchar *participant, double level);
    +
    +/**
    + * Sets a video output window for the given session/stream.
    + *
    + * @param media The media instance to set the output window on.
    + * @param session_id The session to set the output window on.
    + * @param participant Optionally, the participant to set the output window on.
    + * @param window_id The window id use for embedding the video in.
    + *
    + * @return An id to reference the output window.
    + *
    + * @since 2.6.0
    + */
    +gulong purple_media_set_output_window(PurpleMedia *media,
    + const gchar *session_id, const gchar *participant,
    + gulong window_id);
    +
    +/**
    + * Removes all output windows from a given media session.
    + *
    + * @param media The instance to remove all output windows from.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_remove_output_windows(PurpleMedia *media);
    +
    +/**
    + * Sends a DTMF signal out-of-band.
    + *
    + * @param media The media instance to send a DTMF signal to.
    + * @param sess_id The session id of the session to send the DTMF signal on.
    + * @param dtmf The character representing the DTMF in the range [0-9#*A-D].
    + * @param volume The power level expressed in dBm0 after dropping the sign
    + * in the range of 0 to 63. A larger value represents a lower volume.
    + * @param duration The duration of the tone in milliseconds.
    + *
    + * @since 2.11
    + */
    +gboolean purple_media_send_dtmf(PurpleMedia *media, const gchar *session_id,
    + gchar dtmf, guint8 volume, guint16 duration);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/backend-iface.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,290 @@
    +/**
    + * @file backend-iface.h Interface for media backends
    + * @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
    + */
    +
    +#ifndef _MEDIA_BACKEND_IFACE_H_
    +#define _MEDIA_BACKEND_IFACE_H_
    +
    +#include "codec.h"
    +#include "enum-types.h"
    +
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_BACKEND (purple_media_backend_get_type())
    +#define PURPLE_IS_MEDIA_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_BACKEND))
    +#define PURPLE_MEDIA_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_BACKEND, PurpleMediaBackend))
    +#define PURPLE_MEDIA_BACKEND_GET_INTERFACE(inst)(G_TYPE_INSTANCE_GET_INTERFACE((inst), PURPLE_TYPE_MEDIA_BACKEND, PurpleMediaBackendIface))
    +
    +/** A placeholder to represent any media backend */
    +typedef struct _PurpleMediaBackend PurpleMediaBackend;
    +/** A structure to derive media backends from. */
    +typedef struct _PurpleMediaBackendIface PurpleMediaBackendIface;
    +
    +struct _PurpleMediaBackendIface
    +{
    + GTypeInterface parent_iface; /**< The parent iface class */
    +
    + /** Implementable functions called with purple_media_backend_* */
    + gboolean (*add_stream) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *who,
    + PurpleMediaSessionType type, gboolean initiator,
    + const gchar *transmitter,
    + guint num_params, GParameter *params);
    + void (*add_remote_candidates) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + GList *remote_candidates);
    + gboolean (*codecs_ready) (PurpleMediaBackend *self,
    + const gchar *sess_id);
    + GList *(*get_codecs) (PurpleMediaBackend *self,
    + const gchar *sess_id);
    + GList *(*get_local_candidates) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant);
    + gboolean (*set_remote_codecs) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + GList *codecs);
    + gboolean (*set_send_codec) (PurpleMediaBackend *self,
    + const gchar *sess_id, PurpleMediaCodec *codec);
    + gboolean (*set_encryption_parameters) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *cipher,
    + const gchar *auth, const gchar *key, gsize key_len);
    + gboolean (*set_decryption_parameters) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + const gchar *cipher, const gchar *auth,
    + const gchar *key, gsize key_len);
    + void (*set_params) (PurpleMediaBackend *self,
    + guint num_params, GParameter *params);
    + const gchar **(*get_available_params) (void);
    + gboolean (*send_dtmf) (PurpleMediaBackend *self,
    + const gchar *sess_id, gchar dtmf, guint8 volume,
    + guint16 duration);
    + gboolean (*set_send_rtcp_mux) (PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    +};
    +
    +/**
    + * Gets the media backend's GType.
    + *
    + * @return The media backend's GType.
    + *
    + * @since 2.7.0
    + */
    +GType purple_media_backend_get_type(void);
    +
    +/**
    + * Creates and adds a stream to the media backend.
    + *
    + * @param self The backend to add the stream to.
    + * @param sess_id The session id of the stream to add.
    + * @param who The remote participant of the stream to add.
    + * @param type The media type and direction of the stream to add.
    + * @param initiator True if the local user initiated the stream.
    + * @param transmitter The string id of the tranmsitter to use.
    + * @param num_params The number of parameters in the param parameter.
    + * @param params The additional parameters to pass when creating the stream.
    + *
    + * @return True if the stream was successfully created, othewise False.
    + *
    + * @since 2.7.0
    + */
    +gboolean purple_media_backend_add_stream(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *who,
    + PurpleMediaSessionType type, gboolean initiator,
    + const gchar *transmitter,
    + guint num_params, GParameter *params);
    +
    +/**
    + * Add remote candidates to a stream.
    + *
    + * @param self The backend the stream is in.
    + * @param sess_id The session id associated with the stream.
    + * @param participant The participant associated with the stream.
    + * @param remote_candidates The list of remote candidates to add.
    + *
    + * @since 2.7.0
    + */
    +void purple_media_backend_add_remote_candidates(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + GList *remote_candidates);
    +
    +/**
    + * Get whether or not a session's codecs are ready.
    + *
    + * A codec is ready if all of the attributes and additional
    + * parameters have been collected.
    + *
    + * @param self The media backend the session is in.
    + * @param sess_id The session id of the session to check.
    + *
    + * @return True if the codecs are ready, otherwise False.
    + *
    + * @since 2.7.0
    + */
    +gboolean purple_media_backend_codecs_ready(PurpleMediaBackend *self,
    + const gchar *sess_id);
    +
    +/**
    + * Gets the codec intersection list for a session.
    + *
    + * The intersection list consists of all codecs that are compatible
    + * between the local and remote software.
    + *
    + * @param self The media backend the session is in.
    + * @param sess_id The session id of the session to use.
    + *
    + * @return The codec intersection list.
    + *
    + * @since 2.7.0
    + */
    +GList *purple_media_backend_get_codecs(PurpleMediaBackend *self,
    + const gchar *sess_id);
    +
    +/**
    + * Gets the list of local candidates for a stream.
    + *
    + * @param self The media backend the stream is in.
    + * @param sess_id The session id associated with the stream.
    + * @param particilant The participant associated with the stream.
    + *
    + * @return The list of local candidates.
    + *
    + * @since 2.7.0
    + */
    +GList *purple_media_backend_get_local_candidates(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant);
    +
    +/**
    + * Sets the remote codecs on a stream.
    + *
    + * @param self The media backend the stream is in.
    + * @param sess_id The session id the stream is associated with.
    + * @param participant The participant the stream is associated with.
    + * @param codecs The list of remote codecs to set.
    + *
    + * @return True if the remote codecs were set successfully, otherwise False.
    + *
    + * @since 2.7.0
    + */
    +gboolean purple_media_backend_set_remote_codecs(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + GList *codecs);
    +
    +/**
    + * Sets which codec format to send media content in for a session.
    + *
    + * @param self The media backend the session is in.
    + * @param sess_id The session id of the session to set the codec for.
    + * @param codec The codec to set.
    + *
    + * @return True if set successfully, otherwise False.
    + *
    + * @since 2.7.0
    + */
    +gboolean purple_media_backend_set_send_codec(PurpleMediaBackend *self,
    + const gchar *sess_id, PurpleMediaCodec *codec);
    +
    +/**
    + * Sets the encryption parameters of our media in the session.
    + *
    + * @param self The media backend the session is in.
    + * @param sess_id The session id of the session to set parameters of.
    + * @param cipher The cipher to use to encrypt our media in the session.
    + * @param auth The algorithm to use to compute authentication codes for our
    + * media frames.
    + * @param key The encryption key.
    + * @param key_len Byte length of the encryption key.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_backend_set_encryption_parameters(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *cipher,
    + const gchar *auth, const gchar *key, gsize key_len);
    +
    +/**
    + * Sets the decryption parameters for a session participant's media.
    + *
    + * @param self The media backend the session is in.
    + * @param sess_id The session id of the session to set parameters of.
    + * @param participant The participant of the session to set parameters of.
    + * @param cipher The cipher to use to decrypt media coming from this session's
    + * participant.
    + * @param auth The algorithm to use for authentication of the media coming
    + * from the session's participant.
    + * @param key The decryption key.
    + * @param key_len Byte length of the decryption key.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_backend_set_decryption_parameters(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant,
    + const gchar *cipher, const gchar *auth,
    + const gchar *key, gsize key_len);
    +
    +/**
    + * Sets various optional parameters of the media backend.
    + *
    + * @param self The media backend to set the parameters on.
    + * @param num_params The number of parameters to pass to backend
    + * @param params Array of @c GParameter to pass to backend
    + *
    + * @since 2.8.0
    + */
    +void purple_media_backend_set_params(PurpleMediaBackend *self,
    + guint num_params, GParameter *params);
    +
    +/**
    + * Gets the list of optional parameters supported by the media backend.
    + *
    + * The list should NOT be freed.
    + *
    + * @param self The media backend
    + *
    + * @return NULL-terminated array of names of supported parameters.
    + *
    + * @since 2.8.0
    + */
    +const gchar **purple_media_backend_get_available_params(PurpleMediaBackend *self);
    +
    +/**
    + * purple_media_backend_set_send_rtcp_mux:
    + * @self: The media backend the session is in.
    + * @sess_id: The session id of the session to set the rtcp-mux option to
    + * @participant: The participant the stream is associated with.
    + * @send_rtcp_mux: Whether or not to enable rtcp-mux
    + *
    + * Controls whether or not the RTCP should be muxed with the RTP
    + *
    + * Returns: True if set successfully, otherwise False.
    + *
    + * @since 2.11.0
    + */
    +gboolean purple_media_backend_set_send_rtcp_mux(PurpleMediaBackend *self,
    + const gchar *sess_id, const gchar *participant, gboolean send_rtcp_mux);
    +
    +
    +G_END_DECLS
    +
    +#endif /* _MEDIA_BACKEND_IFACE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/candidate.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,252 @@
    +/**
    + * @file candidate.h Candidate for Media 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_CANDIDATE_H_
    +#define _PURPLE_MEDIA_CANDIDATE_H_
    +
    +#include "enum-types.h"
    +
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_CANDIDATE (purple_media_candidate_get_type())
    +#define PURPLE_IS_MEDIA_CANDIDATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CANDIDATE))
    +#define PURPLE_IS_MEDIA_CANDIDATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CANDIDATE))
    +#define PURPLE_MEDIA_CANDIDATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    +#define PURPLE_MEDIA_CANDIDATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    +#define PURPLE_MEDIA_CANDIDATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CANDIDATE, PurpleMediaCandidate))
    +
    +/** An opaque structure representing a network candidate (IP Address and port pair). */
    +typedef struct _PurpleMediaCandidate PurpleMediaCandidate;
    +
    +/**
    + * Gets the type of the media candidate structure.
    + *
    + * @return The media canditate's GType
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_candidate_get_type(void);
    +
    +/**
    + * Creates a PurpleMediaCandidate instance.
    + *
    + * @param foundation The foundation of the candidate.
    + * @param component_id The component this candidate is for.
    + * @param type The type of candidate.
    + * @param proto The protocol this component is for.
    + * @param ip The IP address of this component.
    + * @param port The network port.
    + *
    + * @return The newly created PurpleMediaCandidate instance.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaCandidate *purple_media_candidate_new(
    + const gchar *foundation, guint component_id,
    + PurpleMediaCandidateType type,
    + PurpleMediaNetworkProtocol proto,
    + const gchar *ip, guint port);
    +
    +/**
    + * Copies a PurpleMediaCandidate.
    + *
    + * @param candidate The candidate to copy.
    + *
    + * @return The copy of the PurpleMediaCandidate.
    + *
    + * @since 2.7.0
    + */
    +PurpleMediaCandidate *purple_media_candidate_copy(
    + PurpleMediaCandidate *candidate);
    +
    +/**
    + * Copies a GList of PurpleMediaCandidate and its contents.
    + *
    + * @param candidates The list of candidates to be copied.
    + *
    + * @return The copy of the GList.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_candidate_list_copy(GList *candidates);
    +
    +/**
    + * Frees a GList of PurpleMediaCandidate and its contents.
    + *
    + * @param candidates The list of candidates to be freed.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_candidate_list_free(GList *candidates);
    +
    +/**
    + * Gets the foundation (identifier) from the candidate.
    + *
    + * @param candidate The candidate to get the foundation from.
    + *
    + * @return The foundation.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_candidate_get_foundation(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the component id (rtp or rtcp)
    + *
    + * @param candidate The candidate to get the compnent id from.
    + *
    + * @return The component id.
    + *
    + * @since 2.6.0
    + */
    +guint purple_media_candidate_get_component_id(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the IP address.
    + *
    + * @param candidate The candidate to get the IP address from.
    + *
    + * @return The IP address.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_candidate_get_ip(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the port.
    + *
    + * @param candidate The candidate to get the port from.
    + *
    + * @return The port.
    + *
    + * @since 2.6.0
    + */
    +guint16 purple_media_candidate_get_port(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the base (internal) IP address.
    + *
    + * This can be NULL.
    + *
    + * @param candidate The candidate to get the base IP address from.
    + *
    + * @return The base IP address.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_candidate_get_base_ip(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the base (internal) port.
    + *
    + * Invalid if the base IP is NULL.
    + *
    + * @param candidate The candidate to get the base port.
    + *
    + * @return The base port.
    + *
    + * @since 2.6.0
    + */
    +guint16 purple_media_candidate_get_base_port(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the protocol (TCP or UDP).
    + *
    + * @param candidate The candidate to get the protocol from.
    + *
    + * @return The protocol.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaNetworkProtocol purple_media_candidate_get_protocol(
    + PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the priority.
    + *
    + * @param candidate The candidate to get the priority from.
    + *
    + * @return The priority.
    + *
    + * @since 2.6.0
    + */
    +guint32 purple_media_candidate_get_priority(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the candidate type.
    + *
    + * @param candidate The candidate to get the candidate type from.
    + *
    + * @return The candidate type.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaCandidateType purple_media_candidate_get_candidate_type(
    + PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the username.
    + *
    + * This can be NULL. It depends on the transmission type.
    + *
    + * @param The candidate to get the username from.
    + *
    + * @return The username.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_candidate_get_username(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the password.
    + *
    + * This can be NULL. It depends on the transmission type.
    + *
    + * @param The candidate to get the password from.
    + *
    + * @return The password.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_candidate_get_password(PurpleMediaCandidate *candidate);
    +
    +/**
    + * Gets the TTL.
    + *
    + * @param The candidate to get the TTL from.
    + *
    + * @return The TTL.
    + *
    + * @since 2.6.0
    + */
    +guint purple_media_candidate_get_ttl(PurpleMediaCandidate *candidate);
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_CANDIDATE_H_ */
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/codec.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,214 @@
    +/**
    + * @file codec.h Codec for Media 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_CODEC_H_
    +#define _PURPLE_MEDIA_CODEC_H_
    +
    +#include "enum-types.h"
    +
    +/** An opaque structure representing an audio or video codec. */
    +typedef struct _PurpleMediaCodec PurpleMediaCodec;
    +
    +#include "../util.h"
    +
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_CODEC (purple_media_codec_get_type())
    +#define PURPLE_IS_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CODEC))
    +#define PURPLE_IS_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CODEC))
    +#define PURPLE_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    +#define PURPLE_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    +#define PURPLE_MEDIA_CODEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
    +
    +
    +/**
    + * Gets the type of the media codec structure.
    + *
    + * @return The media codec's GType
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_codec_get_type(void);
    +
    +/**
    + * Creates a new PurpleMediaCodec instance.
    + *
    + * @param id Codec identifier.
    + * @param encoding_name Name of the media type this encodes.
    + * @param media_type PurpleMediaSessionType of this codec.
    + * @param clock_rate The clock rate this codec encodes at, if applicable.
    + *
    + * @return The newly created PurpleMediaCodec.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaCodec *purple_media_codec_new(int id, const char *encoding_name,
    + PurpleMediaSessionType media_type, guint clock_rate);
    +
    +/**
    + * Gets the codec id.
    + *
    + * @param The codec to get the id from.
    + *
    + * @return The codec id.
    + *
    + * @since 2.6.0
    + */
    +guint purple_media_codec_get_id(PurpleMediaCodec *codec);
    +
    +/**
    + * Gets the encoding name.
    + *
    + * @param The codec to get the encoding name from.
    + *
    + * @return The encoding name.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_codec_get_encoding_name(PurpleMediaCodec *codec);
    +
    +/**
    + * Gets the clock rate.
    + *
    + * @param The codec to get the clock rate from.
    + *
    + * @return The clock rate.
    + *
    + * @since 2.6.0
    + */
    +guint purple_media_codec_get_clock_rate(PurpleMediaCodec *codec);
    +
    +/**
    + * Gets the number of channels.
    + *
    + * @param The codec to get the number of channels from.
    + *
    + * @return The number of channels.
    + *
    + * @since 2.6.0
    + */
    +guint purple_media_codec_get_channels(PurpleMediaCodec *codec);
    +
    +/**
    + * Gets a list of the optional parameters.
    + *
    + * The list consists of PurpleKeyValuePair's.
    + *
    + * @param The codec to get the optional parameters from.
    + *
    + * @return The list of optional parameters. The list is owned by the codec and
    + * should not be freed.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec);
    +
    +/**
    + * Adds an optional parameter to the codec.
    + *
    + * @param codec The codec to add the parameter to.
    + * @param name The name of the parameter to add.
    + * @param value The value of the parameter to add.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
    + const gchar *name, const gchar *value);
    +
    +/**
    + * Removes an optional parameter from the codec.
    + *
    + * @param codec The codec to remove the parameter from.
    + * @param param A pointer to the parameter to remove.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
    + PurpleKeyValuePair *param);
    +
    +/**
    + * Gets an optional parameter based on the values given.
    + *
    + * @param codec The codec to find the parameter in.
    + * @param name The name of the parameter to search for.
    + * @param value The value to search for or NULL.
    + *
    + * @return The value found or NULL.
    + *
    + * @since 2.6.0
    + */
    +PurpleKeyValuePair *purple_media_codec_get_optional_parameter(
    + PurpleMediaCodec *codec, const gchar *name,
    + const gchar *value);
    +
    +/**
    + * Copies a PurpleMediaCodec object.
    + *
    + * @param codec The codec to copy.
    + *
    + * @return The copy of the codec.
    + *
    + * @since 2.7.0
    + */
    +PurpleMediaCodec *purple_media_codec_copy(PurpleMediaCodec *codec);
    +
    +/**
    + * Copies a GList of PurpleMediaCodec and its contents.
    + *
    + * @param codecs The list of codecs to be copied.
    + *
    + * @return The copy of the GList.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_codec_list_copy(GList *codecs);
    +
    +/**
    + * Frees a GList of PurpleMediaCodec and its contents.
    + *
    + * @param codecs The list of codecs to be freed.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_codec_list_free(GList *codecs);
    +
    +/**
    + * Creates a string representation of the codec.
    + *
    + * @param codec The codec to create the string of.
    + *
    + * @return The new string representation.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_media_codec_to_string(const PurpleMediaCodec *codec);
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_CODEC_H_ */
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/media/enum-types.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,168 @@
    +/**
    + * @file enum-types.h Enum types for Media 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_ENUM_TYPES_H_
    +#define _PURPLE_MEDIA_ENUM_TYPES_H_
    +
    +#include <glib-object.h>
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_CANDIDATE_TYPE (purple_media_candidate_type_get_type())
    +#define PURPLE_MEDIA_TYPE_CAPS (purple_media_caps_get_type())
    +#define PURPLE_MEDIA_TYPE_INFO_TYPE (purple_media_info_type_get_type())
    +#define PURPLE_TYPE_MEDIA_NETWORK_PROTOCOL (purple_media_network_protocol_get_type())
    +#define PURPLE_TYPE_MEDIA_SESSION_TYPE (purple_media_session_type_get_type())
    +#define PURPLE_MEDIA_TYPE_STATE (purple_media_state_changed_get_type())
    +
    +/** Media candidate types */
    +typedef enum {
    + PURPLE_MEDIA_CANDIDATE_TYPE_HOST,
    + PURPLE_MEDIA_CANDIDATE_TYPE_SRFLX,
    + PURPLE_MEDIA_CANDIDATE_TYPE_PRFLX,
    + PURPLE_MEDIA_CANDIDATE_TYPE_RELAY,
    + PURPLE_MEDIA_CANDIDATE_TYPE_MULTICAST
    +} PurpleMediaCandidateType;
    +
    +/** Media caps */
    +typedef enum {
    + PURPLE_MEDIA_CAPS_NONE = 0,
    + PURPLE_MEDIA_CAPS_AUDIO = 1,
    + PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION = 1 << 1,
    + PURPLE_MEDIA_CAPS_VIDEO = 1 << 2,
    + PURPLE_MEDIA_CAPS_VIDEO_SINGLE_DIRECTION = 1 << 3,
    + PURPLE_MEDIA_CAPS_AUDIO_VIDEO = 1 << 4,
    + PURPLE_MEDIA_CAPS_MODIFY_SESSION = 1 << 5,
    + PURPLE_MEDIA_CAPS_CHANGE_DIRECTION = 1 << 6
    +} PurpleMediaCaps;
    +
    +/** Media component types */
    +typedef enum {
    + PURPLE_MEDIA_COMPONENT_NONE = 0,
    + PURPLE_MEDIA_COMPONENT_RTP = 1,
    + PURPLE_MEDIA_COMPONENT_RTCP = 2
    +} PurpleMediaComponentType;
    +
    +/** Media info types */
    +typedef enum {
    + PURPLE_MEDIA_INFO_HANGUP = 0,
    + PURPLE_MEDIA_INFO_ACCEPT,
    + PURPLE_MEDIA_INFO_REJECT,
    + PURPLE_MEDIA_INFO_MUTE,
    + PURPLE_MEDIA_INFO_UNMUTE,
    + PURPLE_MEDIA_INFO_PAUSE,
    + PURPLE_MEDIA_INFO_UNPAUSE,
    + PURPLE_MEDIA_INFO_HOLD,
    + PURPLE_MEDIA_INFO_UNHOLD
    +} PurpleMediaInfoType;
    +
    +/** Media network protocols */
    +typedef enum {
    + PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
    + PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_PASSIVE,
    + PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_ACTIVE,
    + PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_SO,
    +} PurpleMediaNetworkProtocol;
    +
    +/** Media session types */
    +typedef enum {
    + PURPLE_MEDIA_NONE = 0,
    + PURPLE_MEDIA_RECV_AUDIO = 1 << 0,
    + PURPLE_MEDIA_SEND_AUDIO = 1 << 1,
    + PURPLE_MEDIA_RECV_VIDEO = 1 << 2,
    + PURPLE_MEDIA_SEND_VIDEO = 1 << 3,
    + PURPLE_MEDIA_RECV_APPLICATION = 1 << 4,
    + PURPLE_MEDIA_SEND_APPLICATION = 1 << 5,
    + PURPLE_MEDIA_AUDIO = PURPLE_MEDIA_RECV_AUDIO | PURPLE_MEDIA_SEND_AUDIO,
    + PURPLE_MEDIA_VIDEO = PURPLE_MEDIA_RECV_VIDEO | PURPLE_MEDIA_SEND_VIDEO,
    + PURPLE_MEDIA_APPLICATION = PURPLE_MEDIA_RECV_APPLICATION |
    + PURPLE_MEDIA_SEND_APPLICATION
    +} PurpleMediaSessionType;
    +
    +/** Media state-changed types */
    +typedef enum {
    + PURPLE_MEDIA_STATE_NEW = 0,
    + PURPLE_MEDIA_STATE_CONNECTED,
    + PURPLE_MEDIA_STATE_END
    +} PurpleMediaState;
    +
    +/**
    + * Gets the media candidate type's GType
    + *
    + * @return The media candidate type's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_candidate_type_get_type(void);
    +
    +/**
    + * Gets the type of the media caps flags
    + *
    + * @return The media caps flags' GType
    + *
    + * @since 2.7.0
    + */
    +GType purple_media_caps_get_type(void);
    +
    +/**
    + * Gets the type of the info type enum
    + *
    + * @return The info type enum's GType
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_info_type_get_type(void);
    +
    +/**
    + * Gets the media network protocol's GType
    + *
    + * @return The media network protocol's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_network_protocol_get_type(void);
    +
    +/**
    + * Gets the media session type's GType
    + *
    + * @return The media session type's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_session_type_get_type(void);
    +
    +/**
    + * Gets the type of the state-changed enum
    + *
    + * @return The state-changed enum's GType
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_state_changed_get_type(void);
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_ENUM_TYPES_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/mediamanager.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,385 @@
    +/**
    + * @file mediamanager.h Media Manager 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
    + */
    +
    +#ifndef _PURPLE_MEDIA_MANAGER_H_
    +#define _PURPLE_MEDIA_MANAGER_H_
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +
    +/** An opaque structure representing a group of (usually all) media calls. */
    +typedef struct _PurpleMediaManager PurpleMediaManager;
    +/** The GObject class structure of the PurpleMediaManager object. */
    +typedef struct _PurpleMediaManagerClass PurpleMediaManagerClass;
    +
    +#include "account.h"
    +#include "media.h"
    +
    +/**
    + * PurpleMediaAppDataCallbacks:
    + * @readable: Called when the stream has received data and is readable.
    + * @writable: Called when the stream has become writable or has stopped being
    + * writable.
    + *
    + * A set of callbacks that can be installed on an Application data session with
    + * purple_media_manager_set_application_data_callbacks()
    + *
    + * Once installed the @readable callback will get called as long as data is
    + * available to read, so the data must be read completely.
    + * The @writable callback will only be called when the writable state of the
    + * stream changes. The @writable argument defines whether the stream has
    + * become writable or stopped being writable.
    + *
    + */
    +typedef struct {
    + void (*readable) (PurpleMediaManager *manager, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant, gpointer user_data);
    + void (*writable) (PurpleMediaManager *manager, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant, gboolean writable,
    + gpointer user_data);
    +} PurpleMediaAppDataCallbacks;
    +
    +G_BEGIN_DECLS
    +
    +#define PURPLE_TYPE_MEDIA_MANAGER (purple_media_manager_get_type())
    +#define PURPLE_MEDIA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManager))
    +#define PURPLE_MEDIA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerClass))
    +#define PURPLE_IS_MEDIA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_MANAGER))
    +#define PURPLE_IS_MEDIA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_MANAGER))
    +#define PURPLE_MEDIA_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerClass))
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Media Manager API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Gets the media manager's GType.
    + *
    + * @return The media manager's GType.
    + *
    + * @since 2.6.0
    + */
    +GType purple_media_manager_get_type(void);
    +
    +/**
    + * Gets the "global" media manager object. It's created if it doesn't already exist.
    + *
    + * @return The "global" instance of the media manager object.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaManager *purple_media_manager_get(void);
    +
    +/**
    + * Creates a media session.
    + *
    + * @param manager The media manager to create the session under.
    + * @param account The account to create the session on.
    + * @param conference_type The conference type to feed into Farsight2.
    + * @param remote_user The remote user to initiate the session with.
    + * @param initiator TRUE if the local user is the initiator of this media call, FALSE otherwise.
    + *
    + * @return A newly created media session.
    + *
    + * @since 2.6.0
    + */
    +PurpleMedia *purple_media_manager_create_media(PurpleMediaManager *manager,
    + PurpleAccount *account,
    + const char *conference_type,
    + const char *remote_user,
    + gboolean initiator);
    +
    +/**
    + * Gets all of the media sessions.
    + *
    + * @param manager The media manager to get all of the sessions from.
    + *
    + * @return A list of all the media sessions.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_manager_get_media(PurpleMediaManager *manager);
    +
    +/**
    + * Gets all of the media sessions for a given account.
    + *
    + * @param manager The media manager to get the sessions from.
    + * @param account The account the sessions are on.
    + *
    + * @return A list of the media sessions on the given account.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_media_manager_get_media_by_account(
    + PurpleMediaManager *manager, PurpleAccount *account);
    +
    +/**
    + * Removes a media session from the media manager.
    + *
    + * @param manager The media manager to remove the media session from.
    + * @param media The media session to remove.
    + *
    + * @since 2.6.0
    + */
    +void
    +purple_media_manager_remove_media(PurpleMediaManager *manager,
    + PurpleMedia *media);
    +
    +/**
    + * Creates a private media session. A private media session is a
    + * media session which is private to the caller. It is meant to be
    + * used by plugins to create a media session that the front-end does
    + * not get notified about. It is useful especially for sessions with a
    + * type of PURPLE_MEDIA_APPLICATION which the front-end wouldn't know
    + * how to handle.
    + *
    + * @param manager The media manager to create the session under.
    + * @param account The account to create the session on.
    + * @param conference_type The conference type to feed into Farsight2.
    + * @param remote_user The remote user to initiate the session with.
    + * @param initiator TRUE if the local user is the initiator of this media
    + * call, FALSE otherwise.
    + *
    + * @return A newly created media session.
    + *
    + * @since 2.11.0
    + */
    +PurpleMedia *purple_media_manager_create_private_media(
    + PurpleMediaManager *manager,
    + PurpleAccount *account,
    + const char *conference_type,
    + const char *remote_user,
    + gboolean initiator);
    +
    +/**
    + * Gets all of the private media sessions.
    + *
    + * @param manager The media manager to get all of the sessions from.
    + *
    + * @return A list of all the private media sessions.
    + *
    + * @since 2.11.0
    + */
    +GList *purple_media_manager_get_private_media(PurpleMediaManager *manager);
    +
    +/**
    + * Gets all of the private media sessions for a given account.
    + *
    + * @param manager The media manager to get the sessions from.
    + * @param account The account the sessions are on.
    + *
    + * @return A list of the private media sessions on the given account.
    + *
    + * @since 2.11.0
    + */
    +GList *purple_media_manager_get_private_media_by_account(
    + PurpleMediaManager *manager, PurpleAccount *account);
    +
    +/**
    + * Signals that output windows should be created for the chosen stream.
    + *
    + * This shouldn't be called outside of mediamanager.c and media.c
    + *
    + * @param manager Manager the output windows are registered with.
    + * @param media Media session the output windows are registered for.
    + * @param session_id The session the output windows are registered with.
    + * @param participant The participant the output windows are registered with.
    + *
    + * @return TRUE if it succeeded, FALSE if it failed.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_manager_create_output_window(
    + PurpleMediaManager *manager, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +/**
    + * Registers a video output window to be created for a given stream.
    + *
    + * @param manager The manager to register the output window with.
    + * @param media The media instance to find the stream in.
    + * @param session_id The session the stream is associated with.
    + * @param participant The participant the stream is associated with.
    + * @param window_id The window ID to embed the video in.
    + *
    + * @return A unique ID to the registered output window, 0 if it failed.
    + *
    + * @since 2.6.0
    + */
    +gulong purple_media_manager_set_output_window(PurpleMediaManager *manager,
    + PurpleMedia *media, const gchar *session_id,
    + const gchar *participant, gulong window_id);
    +
    +/**
    + * Remove a previously registerd output window.
    + *
    + * @param manager The manager the output window was registered with.
    + * @param output_window_id The ID of the output window.
    + *
    + * @return TRUE if it found the output window and was successful, else FALSE.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_media_manager_remove_output_window(
    + PurpleMediaManager *manager, gulong output_window_id);
    +
    +/**
    + * Remove all output windows for a given conference/session/participant/stream.
    + *
    + * @param manager The manager the output windows were registered with.
    + * @param media The media instance the output windows were registered for.
    + * @param session_id The session the output windows were registered for.
    + * @param participant The participant the output windows were registered for.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_manager_remove_output_windows(
    + PurpleMediaManager *manager, PurpleMedia *media,
    + const gchar *session_id, const gchar *participant);
    +
    +/**
    + * Sets which media caps the UI supports.
    + *
    + * @param manager The manager to set the caps on.
    + * @param caps The caps to set.
    + *
    + * @since 2.6.0
    + */
    +void purple_media_manager_set_ui_caps(PurpleMediaManager *manager,
    + PurpleMediaCaps caps);
    +
    +/**
    + * Gets which media caps the UI supports.
    + *
    + * @param manager The manager to get caps from.
    + *
    + * @return caps The caps retrieved.
    + *
    + * @since 2.6.0
    + */
    +PurpleMediaCaps purple_media_manager_get_ui_caps(PurpleMediaManager *manager);
    +
    +/**
    + * Sets which media backend type media objects will use.
    + *
    + * @param manager The manager to set the caps on.
    + * @param backend_type The media backend type to use.
    + *
    + * @since 2.7.0
    + */
    +void purple_media_manager_set_backend_type(PurpleMediaManager *manager,
    + GType backend_type);
    +
    +/**
    + * Gets which media backend type media objects will use.
    + *
    + * @param manager The manager to get the media backend type from.
    + *
    + * @return The type of media backend type media objects will use.
    + *
    + * @since 2.7.0
    + */
    +GType purple_media_manager_get_backend_type(PurpleMediaManager *manager);
    +
    +/**
    + * purple_media_manager_set_application_data_callbacks:
    + * @manager: The manager to register the callbacks with.
    + * @media: The media instance to register the callbacks with.
    + * @session_id: The session to register the callbacks with.
    + * @participant: The participant to register the callbacks with.
    + * @callbacks: The callbacks to be set on the session.
    + * @user_data: a user_data argument for the callbacks.
    + * @notify: a destroy notify function.
    + *
    + * Set callbacks on a session to be called when the stream becomes writable
    + * or readable for media sessions of type #PURPLE_MEDIA_APPLICATION
    + */
    +void purple_media_manager_set_application_data_callbacks(
    + PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    + const gchar *participant, PurpleMediaAppDataCallbacks *callbacks,
    + gpointer user_data, GDestroyNotify notify);
    +
    +/**
    + * purple_media_manager_send_application_data:
    + * @manager: The manager to send data with.
    + * @media: The media instance to which the session belongs.
    + * @session_id: The session to send data to.
    + * @participant: The participant to send data to.
    + * @buffer: The buffer of data to send.
    + * @size: The size of @buffer
    + * @blocking: Whether to block until the data was send or not.
    + *
    + * Sends a buffer of data to a #PURPLE_MEDIA_APPLICATION session.
    + * If @blocking is set, unless an error occured, the function will not return
    + * until the data has been flushed into the network.
    + * If the stream is not writable, the data will be queued. It is the
    + * responsability of the user to stop sending data when the stream isn't
    + * writable anymore. It is also the responsability of the user to only start
    + * sending data after the stream has been configured correctly (encryption
    + * parameters for example).
    + *
    + * Returns: Number of bytes sent or -1 in case of error.
    + */
    +gint purple_media_manager_send_application_data (
    + PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    + const gchar *participant, gpointer buffer, guint size, gboolean blocking);
    +
    +/**
    + * purple_media_manager_receive_application_data:
    + * @manager: The manager to receive data with.
    + * @media: The media instance to which the session belongs.
    + * @session_id: The session to receive data from.
    + * @participant: The participant to receive data from.
    + * @buffer: The buffer to receive data into.
    + * @max_size: The max_size of @buffer
    + * @blocking: Whether to block until the buffer is entirely filled or return
    + * with currently available data.
    + *
    + * Receive a buffer of data from a #PURPLE_MEDIA_APPLICATION session.
    + * If @blocking is set, unless an error occured, the function will not return
    + * until @max_size bytes are read.
    + *
    + * Returns: Number of bytes received or -1 in case of error.
    + */
    +gint purple_media_manager_receive_application_data (
    + PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
    + const gchar *participant, gpointer buffer, guint max_size,
    + gboolean blocking);
    +
    +/*}@*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +G_END_DECLS
    +
    +#endif /* _PURPLE_MEDIA_MANAGER_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/mime.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,218 @@
    +/*
    + * 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.
    + */
    +
    +#ifndef _PURPLE_MIME_H
    +#define _PURPLE_MIME_H
    +
    +#include <glib.h>
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * @file mime.h
    + * @ingroup core
    + *
    + * Rudimentary parsing of multi-part MIME messages into more
    + * accessible structures.
    + */
    +
    +/**
    + * A MIME document.
    + */
    +typedef struct _PurpleMimeDocument PurpleMimeDocument;
    +
    +/**
    + * A part of a multipart MIME document.
    + */
    +typedef struct _PurpleMimePart PurpleMimePart;
    +
    +/**
    + * Allocate an empty MIME document.
    + */
    +PurpleMimeDocument *purple_mime_document_new(void);
    +
    +/**
    + * Frees memory used in a MIME document and all of its parts and fields
    + *
    + * @param doc The MIME document to free.
    + */
    +void purple_mime_document_free(PurpleMimeDocument *doc);
    +
    +/**
    + * Parse a MIME document from a NUL-terminated string.
    + *
    + * @param buf The NULL-terminated string containing the MIME-encoded data.
    + *
    + * @returns A MIME document.
    + */
    +PurpleMimeDocument *purple_mime_document_parse(const char *buf);
    +
    +/**
    + * Parse a MIME document from a string
    + *
    + * @param buf The string containing the MIME-encoded data.
    + * @param len Length of buf.
    + *
    + * @returns A MIME document.
    + */
    +PurpleMimeDocument *purple_mime_document_parsen(const char *buf, gsize len);
    +
    +/**
    + * Write (append) a MIME document onto a GString.
    + */
    +void purple_mime_document_write(PurpleMimeDocument *doc, GString *str);
    +
    +/**
    + * The list of fields in the header of a document
    + *
    + * @param doc The MIME document.
    + *
    + * @constreturn A list of strings indicating the fields (but not the values
    + * of the fields) in the header of doc.
    + */
    +GList *purple_mime_document_get_fields(PurpleMimeDocument *doc);
    +
    +/**
    + * Get the value of a specific field in the header of a document.
    + *
    + * @param doc The MIME document.
    + * @param field Case-insensitive field name.
    + *
    + * @returns Value associated with the indicated header field, or
    + * NULL if the field doesn't exist.
    + */
    +const char *purple_mime_document_get_field(PurpleMimeDocument *doc,
    + const char *field);
    +
    +/**
    + * Set or replace the value of a specific field in the header of a
    + * document.
    + *
    + * @param doc The MIME document.
    + * @param field Case-insensitive field name.
    + * @param value Value to associate with the indicated header field,
    + * of NULL to remove the field.
    + */
    +void purple_mime_document_set_field(PurpleMimeDocument *doc,
    + const char *field,
    + const char *value);
    +
    +/**
    + * The list of parts in a multipart document.
    + *
    + * @param doc The MIME document.
    + *
    + * @constreturn List of PurpleMimePart contained within doc.
    + */
    +GList *purple_mime_document_get_parts(PurpleMimeDocument *doc);
    +
    +/**
    + * Create and insert a new part into a MIME document.
    + *
    + * @param doc The new part's parent MIME document.
    + */
    +PurpleMimePart *purple_mime_part_new(PurpleMimeDocument *doc);
    +
    +
    +/**
    + * The list of fields in the header of a document part.
    + *
    + * @param part The MIME document part.
    + *
    + * @constreturn List of strings indicating the fields (but not the values
    + * of the fields) in the header of part.
    + */
    +GList *purple_mime_part_get_fields(PurpleMimePart *part);
    +
    +
    +/**
    + * Get the value of a specific field in the header of a document part.
    + *
    + * @param part The MIME document part.
    + * @param field Case-insensitive name of the header field.
    + *
    + * @returns Value of the specified header field, or NULL if the
    + * field doesn't exist.
    + */
    +const char *purple_mime_part_get_field(PurpleMimePart *part,
    + const char *field);
    +
    +/**
    + * Get the decoded value of a specific field in the header of a
    + * document part.
    + */
    +char *purple_mime_part_get_field_decoded(PurpleMimePart *part,
    + const char *field);
    +
    +/**
    + * Set or replace the value of a specific field in the header of a
    + * document.
    + *
    + * @param part The part of the MIME document.
    + * @param field Case-insensitive field name
    + * @param value Value to associate with the indicated header field,
    + * of NULL to remove the field.
    + */
    +void purple_mime_part_set_field(PurpleMimePart *part,
    + const char *field,
    + const char *value);
    +
    +/**
    + * Get the (possibly encoded) data portion of a MIME document part.
    + *
    + * @param part The MIME document part.
    + *
    + * @returns NULL-terminated data found in the document part
    + */
    +const char *purple_mime_part_get_data(PurpleMimePart *part);
    +
    +/**
    + * Get the data portion of a MIME document part, after attempting to
    + * decode it according to the content-transfer-encoding field. If the
    + * specified encoding method is not supported, this function will
    + * return NULL.
    + *
    + * @param part The MIME documemt part.
    + * @param data Buffer for the data.
    + * @param len The length of the buffer.
    + */
    +void purple_mime_part_get_data_decoded(PurpleMimePart *part,
    + guchar **data, gsize *len);
    +
    +/**
    + * Get the length of the data portion of a MIME document part.
    + *
    + * @param part The MIME document part.
    + * @returns Length of the data in the document part.
    + */
    +gsize purple_mime_part_get_length(PurpleMimePart *part);
    +
    +void purple_mime_part_set_data(PurpleMimePart *part, const char *data);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/namespaces.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,112 @@
    +/*
    + * purple - Jabber Protocol Plugin
    + *
    + * 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
    + *
    + */
    +
    +#ifndef PURPLE_JABBER_NAMESPACES_H_
    +#define PURPLE_JABBER_NAMESPACES_H_
    +
    +#define NS_XMPP_BIND "urn:ietf:params:xml:ns:xmpp-bind"
    +#define NS_XMPP_CLIENT "jabber:client"
    +#define NS_XMPP_SASL "urn:ietf:params:xml:ns:xmpp-sasl"
    +#define NS_XMPP_SESSION "urn:ietf:params:xml:ns:xmpp-session"
    +#define NS_XMPP_STANZAS "urn:ietf:params:xml:ns:xmpp-stanzas"
    +#define NS_XMPP_STREAMS "http://etherx.jabber.org/streams"
    +#define NS_XMPP_TLS "urn:ietf:params:xml:ns:xmpp-tls"
    +
    +/* XEP-0012 Last Activity (and XEP-0256 Last Activity in Presence) */
    +#define NS_LAST_ACTIVITY "jabber:iq:last"
    +
    +/* XEP-0030 Service Discovery */
    +#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info"
    +#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items"
    +
    +/* XEP-0047 IBB (In-band bytestreams) */
    +#define NS_IBB "http://jabber.org/protocol/ibb"
    +
    +/* XEP-0065 SOCKS5 Bytestreams */
    +#define NS_BYTESTREAMS "http://jabber.org/protocol/bytestreams"
    +
    +/* XEP-0066 Out of Band Data (OOB) */
    +#define NS_OOB_IQ_DATA "jabber:iq:oob"
    +#define NS_OOB_X_DATA "jabber:x:oob"
    +
    +/* XEP-0071 XHTML-IM (rich-text messages) */
    +#define NS_XHTML_IM "http://jabber.org/protocol/xhtml-im"
    +#define NS_XHTML "http://www.w3.org/1999/xhtml"
    +
    +/* XEP-0084 v0.12 User Avatar */
    +#define NS_AVATAR_0_12_DATA "http://www.xmpp.org/extensions/xep-0084.html#ns-data"
    +#define NS_AVATAR_0_12_METADATA "http://www.xmpp.org/extensions/xep-0084.html#ns-metadata"
    +
    +/* XEP-0084 v1.1 User Avatar */
    +#define NS_AVATAR_1_1_DATA "urn:xmpp:avatar:data"
    +#define NS_AVATAR_1_1_METADATA "urn:xmpp:avatar:metadata"
    +
    +/* XEP-0096 SI File Transfer */
    +#define NS_SI_FILE_TRANSFER "http://jabber.org/protocol/si/profile/file-transfer"
    +
    +/* XEP-0124 Bidirectional-streams Over Synchronous HTTP (BOSH) */
    +#define NS_BOSH "http://jabber.org/protocol/httpbind"
    +
    +/* XEP-0191 Simple Communications Blocking */
    +#define NS_SIMPLE_BLOCKING "urn:xmpp:blocking"
    +
    +/* XEP-0199 Ping */
    +#define NS_PING "urn:xmpp:ping"
    +
    +/* XEP-0202 Entity Time */
    +#define NS_ENTITY_TIME "urn:xmpp:time"
    +
    +/* XEP-0203 Delayed Delivery (and legacy delayed delivery) */
    +#define NS_DELAYED_DELIVERY "urn:xmpp:delay"
    +#define NS_DELAYED_DELIVERY_LEGACY "jabber:x:delay"
    +
    +/* XEP-0206 XMPP over BOSH */
    +#define NS_XMPP_BOSH "urn:xmpp:xbosh"
    +
    +/* XEP-0224 Attention */
    +#define NS_ATTENTION "urn:xmpp:attention:0"
    +
    +/* XEP-0231 BoB (Bits of Binary) */
    +#define NS_BOB "urn:xmpp:bob"
    +
    +/* XEP-0237 Roster Versioning */
    +#define NS_ROSTER_VERSIONING "urn:xmpp:features:rosterver"
    +
    +/* XEP-0264 File Transfer Thumbnails (Thumbs) */
    +#define NS_THUMBS "urn:xmpp:thumbs:0"
    +
    +/* Google extensions */
    +#define NS_GOOGLE_CAMERA "http://www.google.com/xmpp/protocol/camera/v1"
    +#define NS_GOOGLE_VIDEO "http://www.google.com/xmpp/protocol/video/v1"
    +#define NS_GOOGLE_VOICE "http://www.google.com/xmpp/protocol/voice/v1"
    +#define NS_GOOGLE_JINGLE_INFO "google:jingleinfo"
    +
    +#define NS_GOOGLE_MAIL_NOTIFY "google:mail:notify"
    +#define NS_GOOGLE_ROSTER "google:roster"
    +
    +#define NS_GOOGLE_PROTOCOL_SESSION "http://www.google.com/xmpp/protocol/session"
    +#define NS_GOOGLE_SESSION "http://www.google.com/session"
    +#define NS_GOOGLE_SESSION_PHONE "http://www.google.com/session/phone"
    +#define NS_GOOGLE_SESSION_VIDEO "http://www.google.com/session/video"
    +
    +#endif /* PURPLE_JABBER_NAMESPACES_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/nat-pmp.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,77 @@
    +/**
    + * @file nat-pmp.h NAT-PMP Implementation
    + * @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.
    + *
    + * Most code in nat-pmp.h copyright (C) 2007, R. Tyler Ballance, bleep, LLC.
    + * This file is distributed under the 3-clause (modified) BSD license:
    + * Redistribution and use in source and binary forms, with or without modification, are permitted
    + * provided that the following conditions are met:
    + *
    + * Redistributions of source code must retain the above copyright notice, this list of conditions and
    + * the following disclaimer.
    + * Neither the name of the bleep. LLC nor the names of its contributors may be used to endorse or promote
    + * products derived from this software without specific prior written permission.
    + *
    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
    + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
    + * OF SUCH DAMAGE.
    + */
    +
    +#ifndef _PURPLE_NAT_PMP_H
    +#define _PURPLE_NAT_PMP_H
    +
    +#include <glib.h>
    +
    +#define PURPLE_PMP_LIFETIME 3600 /* 3600 seconds */
    +
    +typedef enum {
    + PURPLE_PMP_TYPE_UDP,
    + PURPLE_PMP_TYPE_TCP
    +} PurplePmpType;
    +
    +/**
    + * Initialize nat-pmp
    + */
    +void purple_pmp_init(void);
    +
    +/**
    + *
    + */
    +char *purple_pmp_get_public_ip(void);
    +
    +/**
    + * Remove the NAT-PMP mapping for a specified type on a specified port
    + *
    + * @param type The PurplePmpType
    + * @param privateport The private port on which we are listening locally
    + * @param publicport The public port on which we are expecting a response
    + * @param lifetime The lifetime of the mapping. It is recommended that this be PURPLE_PMP_LIFETIME.
    + *
    + * @returns TRUE if succesful; FALSE if unsuccessful
    + */
    +gboolean purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime);
    +
    +/**
    + * Remove the NAT-PMP mapping for a specified type on a specified port
    + *
    + * @param type The PurplePmpType
    + * @param privateport The private port on which the mapping was previously made
    + *
    + * @returns TRUE if succesful; FALSE if unsuccessful
    + */
    +gboolean purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport);
    +
    +#endif
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/network.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,359 @@
    +/**
    + * @file network.h Network 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
    + */
    +#ifndef _PURPLE_NETWORK_H_
    +#define _PURPLE_NETWORK_H_
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Network API */
    +/**************************************************************************/
    +/*@{*/
    +
    +typedef struct _PurpleNetworkListenData PurpleNetworkListenData;
    +
    +typedef void (*PurpleNetworkListenCallback) (int listenfd, gpointer data);
    +
    +/**
    + * Converts a dot-decimal IP address to an array of unsigned
    + * chars. For example, converts 192.168.0.1 to a 4 byte
    + * array containing 192, 168, 0 and 1.
    + *
    + * @param ip An IP address in dot-decimal notiation.
    + * @return An array of 4 bytes containing an IP addresses
    + * equivalent to the given parameter, or NULL if
    + * the given IP address is invalid. This value
    + * is statically allocated and should not be
    + * freed.
    + */
    +const unsigned char *purple_network_ip_atoi(const char *ip);
    +
    +/**
    + * Sets the IP address of the local system in preferences. This
    + * is the IP address that should be used for incoming connections
    + * (file transfer, direct IM, etc.) and should therefore be
    + * publicly accessible.
    + *
    + * @param ip The local IP address.
    + */
    +void purple_network_set_public_ip(const char *ip);
    +
    +/**
    + * Returns the IP address of the local system set in preferences.
    + *
    + * This returns the value set via purple_network_set_public_ip().
    + * You probably want to use purple_network_get_my_ip() instead.
    + *
    + * @return The local IP address set in preferences.
    + */
    +const char *purple_network_get_public_ip(void);
    +
    +/**
    + * Returns the IP address of the local system.
    + *
    + * You probably want to use purple_network_get_my_ip() instead.
    + *
    + * @note The returned string is a pointer to a static buffer. If this
    + * function is called twice, it may be important to make a copy
    + * of the returned string.
    + *
    + * @param fd The fd to use to help figure out the IP, or else -1.
    + * @return The local IP address.
    + */
    +const char *purple_network_get_local_system_ip(int fd);
    +
    +/**
    + * Returns all IP addresses of the local system.
    + *
    + * @note The caller must free this list. If libpurple was built with
    + * support for it, this function also enumerates IPv6 addresses.
    + * @since 2.7.0
    + *
    + * @return A list of local IP addresses.
    + */
    +GList *purple_network_get_all_local_system_ips(void);
    +
    +/**
    + * Returns the IP address that should be used anywhere a
    + * public IP addresses is needed (listening for an incoming
    + * file transfer, etc).
    + *
    + * If the user has manually specified an IP address via
    + * preferences, then this IP is returned. Otherwise the
    + * IP address returned by purple_network_get_local_system_ip()
    + * is returned.
    + *
    + * @note The returned string is a pointer to a static buffer. If this
    + * function is called twice, it may be important to make a copy
    + * of the returned string.
    + *
    + * @param fd The fd to use to help figure out the IP, or -1.
    + * @return The local IP address to be used.
    + */
    +const char *purple_network_get_my_ip(int fd);
    +
    +/**
    + * Should calls to purple_network_listen() and purple_network_listen_range()
    + * map the port externally using NAT-PMP or UPnP?
    + * The default value is TRUE
    + *
    + * @param map_external Should the open port be mapped externally?
    + * @deprecated In 3.0.0 a boolean will be added to the functions mentioned
    + * above to perform the same function.
    + * @since 2.3.0
    + */
    +void purple_network_listen_map_external(gboolean map_external);
    +
    +/**
    + * Attempts to open a listening port ONLY on the specified port number.
    + * You probably want to use purple_network_listen_range() instead of this.
    + * This function is useful, for example, if you wanted to write a telnet
    + * server as a Purple plugin, and you HAD to listen on port 23. Why anyone
    + * would want to do that is beyond me.
    + *
    + * This opens a listening port. The caller will want to set up a watcher
    + * of type PURPLE_INPUT_READ on the fd returned in cb. It will probably call
    + * accept in the watcher callback, and then possibly remove the watcher and
    + * close the listening socket, and add a new watcher on the new socket accept
    + * returned.
    + *
    + * @param port The port number to bind to. Must be greater than 0.
    + * @param socket_type The type of socket to open for listening.
    + * This will be either SOCK_STREAM for TCP or SOCK_DGRAM for UDP.
    + * @param cb The callback to be invoked when the port to listen on is available.
    + * The file descriptor of the listening socket will be specified in
    + * this callback, or -1 if no socket could be established.
    + * @param cb_data extra data to be returned when cb is called
    + *
    + * @return A pointer to a data structure that can be used to cancel
    + * the pending listener, or NULL if unable to obtain a local
    + * socket to listen on.
    + */
    +PurpleNetworkListenData *purple_network_listen(unsigned short port,
    + int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data);
    +
    +/**
    + * \copydoc purple_network_listen
    + *
    + * Libpurple does not currently do any port mapping (stateful firewall hole
    + * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
    + * addresses, a mapping is done).
    + *
    + * @param socket_family The protocol family of the socket. This should be
    + * AF_INET for IPv4 or AF_INET6 for IPv6. IPv6 sockets
    + * may or may not be able to accept IPv4 connections
    + * based on the system configuration (use
    + * purple_socket_speaks_ipv4 to check). If an IPv6
    + * socket doesn't accept V4-mapped addresses, you will
    + * need a second listener to support both v4 and v6.
    + * @since 2.7.0
    + * @deprecated This function will be renamed to purple_network_listen in 3.0.0.
    + */
    +PurpleNetworkListenData *purple_network_listen_family(unsigned short port,
    + int socket_family, int socket_type, PurpleNetworkListenCallback cb,
    + gpointer cb_data);
    +
    +/**
    + * Opens a listening port selected from a range of ports. The range of
    + * ports used is chosen in the following manner:
    + * If a range is specified in preferences, these values are used.
    + * If a non-0 values are passed to the function as parameters, these
    + * values are used.
    + * Otherwise a port is chosen at random by the operating system.
    + *
    + * This opens a listening port. The caller will want to set up a watcher
    + * of type PURPLE_INPUT_READ on the fd returned in cb. It will probably call
    + * accept in the watcher callback, and then possibly remove the watcher and close
    + * the listening socket, and add a new watcher on the new socket accept
    + * returned.
    + *
    + * @param start The port number to bind to, or 0 to pick a random port.
    + * Users are allowed to override this arg in prefs.
    + * @param end The highest possible port in the range of ports to listen on,
    + * or 0 to pick a random port. Users are allowed to override this
    + * arg in prefs.
    + * @param socket_type The type of socket to open for listening.
    + * This will be either SOCK_STREAM for TCP or SOCK_DGRAM for UDP.
    + * @param cb The callback to be invoked when the port to listen on is available.
    + * The file descriptor of the listening socket will be specified in
    + * this callback, or -1 if no socket could be established.
    + * @param cb_data extra data to be returned when cb is called
    + *
    + * @return A pointer to a data structure that can be used to cancel
    + * the pending listener, or NULL if unable to obtain a local
    + * socket to listen on.
    + */
    +PurpleNetworkListenData *purple_network_listen_range(unsigned short start,
    + unsigned short end, int socket_type,
    + PurpleNetworkListenCallback cb, gpointer cb_data);
    +
    +/**
    + * \copydoc purple_network_listen_range
    + *
    + * Libpurple does not currently do any port mapping (stateful firewall hole
    + * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
    + * addresses, a mapping is done).
    + *
    + * @param socket_family The protocol family of the socket. This should be
    + * AF_INET for IPv4 or AF_INET6 for IPv6. IPv6 sockets
    + * may or may not be able to accept IPv4 connections
    + * based on the system configuration (use
    + * purple_socket_speaks_ipv4 to check). If an IPv6
    + * socket doesn't accept V4-mapped addresses, you will
    + * need a second listener to support both v4 and v6.
    + * @since 2.7.0
    + * @deprecated This function will be renamed to purple_network_listen_range
    + * in 3.0.0.
    + */
    +PurpleNetworkListenData *purple_network_listen_range_family(
    + unsigned short start, unsigned short end, int socket_family,
    + int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data);
    +
    +/**
    + * This can be used to cancel any in-progress listener connection
    + * by passing in the return value from either purple_network_listen()
    + * or purple_network_listen_range().
    + *
    + * @param listen_data This listener attempt will be cancelled and
    + * the struct will be freed.
    + */
    +void purple_network_listen_cancel(PurpleNetworkListenData *listen_data);
    +
    +/**
    + * Gets a port number from a file descriptor.
    + *
    + * @param fd The file descriptor. This should be a tcp socket. The current
    + * implementation probably dies on anything but IPv4. Perhaps this
    + * possible bug will inspire new and valuable contributors to Purple.
    + * @return The port number, in host byte order.
    + */
    +unsigned short purple_network_get_port_from_fd(int fd);
    +
    +/**
    + * Detects if there is an available network connection.
    + *
    + * @return TRUE if the network is available
    + */
    +gboolean purple_network_is_available(void);
    +
    +/**
    + * Makes purple_network_is_available() always return @c TRUE.
    + *
    + * This is what backs the --force-online command line argument in Pidgin,
    + * for example. This is useful for offline testing, especially when
    + * combined with nullprpl.
    + *
    + * @since 2.6.0
    + */
    +void purple_network_force_online(void);
    +
    +/**
    + * Get the handle for the network system
    + *
    + * @return the handle to the network system
    + */
    +void *purple_network_get_handle(void);
    +
    +/**
    + * Update the STUN server IP given the host name
    + * Will result in a DNS query being executed asynchronous
    + *
    + * @param stun_server The host name of the STUN server to set
    + * @since 2.6.0
    + */
    +void purple_network_set_stun_server(const gchar *stun_server);
    +
    +/**
    + * Get the IP address of the STUN server as a string representation
    + *
    + * @return the IP address
    + * @since 2.6.0
    + */
    +const gchar *purple_network_get_stun_ip(void);
    +
    +/**
    + * Update the TURN server IP given the host name
    + * Will result in a DNS query being executed asynchronous
    + *
    + * @param turn_server The host name of the TURN server to set
    + * @since 2.6.0
    + */
    +void purple_network_set_turn_server(const gchar *turn_server);
    +
    +/**
    + * Get the IP address of the TURN server as a string representation
    + *
    + * @return the IP address
    + * @since 2.6.0
    + */
    +const gchar *purple_network_get_turn_ip(void);
    +
    +/**
    + * Remove a port mapping (UPnP or NAT-PMP) associated with listening socket
    + *
    + * @param fd Socket to remove the port mapping for
    + * @since 2.6.0
    + */
    +void purple_network_remove_port_mapping(gint fd);
    +
    +/**
    + * Convert a UTF-8 domain name to ASCII in accordance with the IDNA
    + * specification. If libpurple is compiled without IDN support, this function
    + * copies the input into the output buffer.
    + *
    + * Because this function is used by DNS resolver child/threads, it uses no
    + * other libpurple API and is threadsafe.
    + *
    + * In general, a buffer of about 512 bytes is the appropriate size to use.
    + *
    + * @param in The hostname to be converted.
    + * @param out The output buffer where an allocated string will be returned.
    + * The caller is responsible for freeing this.
    + * @returns 0 on success, -1 if the out is NULL, or an error code
    + * that currently corresponds to the Idna_rc enum in libidn.
    + * @since 2.6.0
    + */
    +int purple_network_convert_idn_to_ascii(const gchar *in, gchar **out);
    +
    +/**
    + * Initializes the network subsystem.
    + */
    +void purple_network_init(void);
    +
    +/**
    + * Shuts down the network subsystem.
    + */
    +void purple_network_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_NETWORK_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/notify.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,814 @@
    +/**
    + * @file notify.h Notification API
    + * @ingroup core
    + * @see @ref notify-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_NOTIFY_H_
    +#define _PURPLE_NOTIFY_H_
    +
    +#include <stdlib.h>
    +#include <glib-object.h>
    +#include <glib.h>
    +
    +typedef struct _PurpleNotifyUserInfoEntry PurpleNotifyUserInfoEntry;
    +typedef struct _PurpleNotifyUserInfo PurpleNotifyUserInfo;
    +
    +#include "connection.h"
    +
    +/**
    + * Notification close callbacks.
    + */
    +typedef void (*PurpleNotifyCloseCallback) (gpointer user_data);
    +
    +
    +/**
    + * Notification types.
    + */
    +typedef enum
    +{
    + PURPLE_NOTIFY_MESSAGE = 0, /**< Message notification. */
    + PURPLE_NOTIFY_EMAIL, /**< Single email notification. */
    + PURPLE_NOTIFY_EMAILS, /**< Multiple email notification. */
    + PURPLE_NOTIFY_FORMATTED, /**< Formatted text. */
    + PURPLE_NOTIFY_SEARCHRESULTS, /**< Buddy search results. */
    + PURPLE_NOTIFY_USERINFO, /**< Formatted userinfo text. */
    + PURPLE_NOTIFY_URI /**< URI notification or display. */
    +
    +} PurpleNotifyType;
    +
    +
    +/**
    + * Notification message types.
    + */
    +typedef enum
    +{
    + PURPLE_NOTIFY_MSG_ERROR = 0, /**< Error notification. */
    + PURPLE_NOTIFY_MSG_WARNING, /**< Warning notification. */
    + PURPLE_NOTIFY_MSG_INFO /**< Information notification. */
    +
    +} PurpleNotifyMsgType;
    +
    +
    +/**
    + * The types of buttons
    + */
    +typedef enum
    +{
    + PURPLE_NOTIFY_BUTTON_LABELED = 0, /**< special use, see _button_add_labeled */
    + PURPLE_NOTIFY_BUTTON_CONTINUE = 1,
    + PURPLE_NOTIFY_BUTTON_ADD,
    + PURPLE_NOTIFY_BUTTON_INFO,
    + PURPLE_NOTIFY_BUTTON_IM,
    + PURPLE_NOTIFY_BUTTON_JOIN,
    + PURPLE_NOTIFY_BUTTON_INVITE
    +} PurpleNotifySearchButtonType;
    +
    +
    +/**
    + * Search results object.
    + */
    +typedef struct
    +{
    + GList *columns; /**< List of the search column objects. */
    + GList *rows; /**< List of rows in the result. */
    + GList *buttons; /**< List of buttons to display. */
    +
    +} PurpleNotifySearchResults;
    +
    +/**
    + * Types of PurpleNotifyUserInfoEntry objects
    + */
    +typedef enum
    +{
    + PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR = 0,
    + PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK,
    + PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
    +} PurpleNotifyUserInfoEntryType;
    +
    +/**
    + * Single column of a search result.
    + */
    +typedef struct
    +{
    + char *title; /**< Title of the column. */
    +
    +} PurpleNotifySearchColumn;
    +
    +
    +/**
    + * Callback for a button in a search result.
    + *
    + * @param c the PurpleConnection passed to purple_notify_searchresults
    + * @param row the contents of the selected row
    + * @param user_data User defined data.
    + */
    +typedef void (*PurpleNotifySearchResultsCallback)(PurpleConnection *c, GList *row,
    + gpointer user_data);
    +
    +
    +/**
    + * Definition of a button.
    + */
    +typedef struct
    +{
    + PurpleNotifySearchButtonType type;
    + PurpleNotifySearchResultsCallback callback; /**< Function to be called when clicked. */
    + char *label; /**< only for PURPLE_NOTIFY_BUTTON_LABELED */
    +} PurpleNotifySearchButton;
    +
    +
    +/**
    + * Notification UI operations.
    + */
    +typedef struct
    +{
    + void *(*notify_message)(PurpleNotifyMsgType type, const char *title,
    + const char *primary, const char *secondary);
    +
    + void *(*notify_email)(PurpleConnection *gc,
    + const char *subject, const char *from,
    + const char *to, const char *url);
    +
    + void *(*notify_emails)(PurpleConnection *gc,
    + size_t count, gboolean detailed,
    + const char **subjects, const char **froms,
    + const char **tos, const char **urls);
    +
    + void *(*notify_formatted)(const char *title, const char *primary,
    + const char *secondary, const char *text);
    +
    + void *(*notify_searchresults)(PurpleConnection *gc, const char *title,
    + const char *primary, const char *secondary,
    + PurpleNotifySearchResults *results, gpointer user_data);
    +
    + void (*notify_searchresults_new_rows)(PurpleConnection *gc,
    + PurpleNotifySearchResults *results,
    + void *data);
    +
    + void *(*notify_userinfo)(PurpleConnection *gc, const char *who,
    + PurpleNotifyUserInfo *user_info);
    +
    + void *(*notify_uri)(const char *uri);
    +
    + void (*close_notify)(PurpleNotifyType type, void *ui_handle);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleNotifyUiOps;
    +
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +
    +/**************************************************************************/
    +/** Search results notification API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Displays results from a buddy search. This can be, for example,
    + * a window with a list of all found buddies, where you are given the
    + * option of adding buddies to your buddy list.
    + *
    + * @param gc The PurpleConnection handle associated with the information.
    + * @param title The title of the message. If this is NULL, the title
    + * will be "Search Results."
    + * @param primary The main point of the message.
    + * @param secondary The secondary information.
    + * @param results The PurpleNotifySearchResults instance.
    + * @param cb The callback to call when the user closes
    + * the notification.
    + * @param user_data The data to pass to the close callback and any other
    + * callback associated with a button.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_searchresults(PurpleConnection *gc, const char *title,
    + const char *primary, const char *secondary,
    + PurpleNotifySearchResults *results, PurpleNotifyCloseCallback cb,
    + gpointer user_data);
    +
    +/**
    + * Frees a PurpleNotifySearchResults object.
    + *
    + * @param results The PurpleNotifySearchResults to free.
    + */
    +void purple_notify_searchresults_free(PurpleNotifySearchResults *results);
    +
    +/**
    + * Replace old rows with the new. Reuse an existing window.
    + *
    + * @param gc The PurpleConnection structure.
    + * @param results The PurpleNotifySearchResults structure.
    + * @param data Data returned by the purple_notify_searchresults().
    + */
    +void purple_notify_searchresults_new_rows(PurpleConnection *gc,
    + PurpleNotifySearchResults *results,
    + void *data);
    +
    +
    +/**
    + * Adds a stock button that will be displayed in the search results dialog.
    + *
    + * @param results The search results object.
    + * @param type Type of the button. (TODO: Only one button of a given type
    + * can be displayed.)
    + * @param cb Function that will be called on the click event.
    + */
    +void purple_notify_searchresults_button_add(PurpleNotifySearchResults *results,
    + PurpleNotifySearchButtonType type,
    + PurpleNotifySearchResultsCallback cb);
    +
    +
    +/**
    + * Adds a plain labelled button that will be displayed in the search results
    + * dialog.
    + *
    + * @param results The search results object
    + * @param label The label to display
    + * @param cb Function that will be called on the click event
    + */
    +void purple_notify_searchresults_button_add_labeled(PurpleNotifySearchResults *results,
    + const char *label,
    + PurpleNotifySearchResultsCallback cb);
    +
    +
    +/**
    + * Returns a newly created search results object.
    + *
    + * @return The new search results object.
    + */
    +PurpleNotifySearchResults *purple_notify_searchresults_new(void);
    +
    +/**
    + * Returns a newly created search result column object.
    + *
    + * @param title Title of the column. NOTE: Title will get g_strdup()ed.
    + *
    + * @return The new search column object.
    + */
    +PurpleNotifySearchColumn *purple_notify_searchresults_column_new(const char *title);
    +
    +/**
    + * Adds a new column to the search result object.
    + *
    + * @param results The result object to which the column will be added.
    + * @param column The column that will be added to the result object.
    + */
    +void purple_notify_searchresults_column_add(PurpleNotifySearchResults *results,
    + PurpleNotifySearchColumn *column);
    +
    +/**
    + * Adds a new row of the results to the search results object.
    + *
    + * @param results The search results object.
    + * @param row The row of the results.
    + */
    +void purple_notify_searchresults_row_add(PurpleNotifySearchResults *results,
    + GList *row);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    +/**
    + * Returns a number of the rows in the search results object.
    + *
    + * @deprecated This function will be removed in Pidgin 3.0.0 unless
    + * there is sufficient demand to keep it. Using this
    + * function encourages looping through the results
    + * inefficiently. Instead of using this function you
    + * should iterate through the results using a loop
    + * similar to this:
    + * for (l = results->rows; l != NULL; l = l->next)
    + * If you really need to get the number of rows you
    + * can use g_list_length(results->rows).
    + *
    + * @param results The search results object.
    + *
    + * @return Number of the result rows.
    + */
    +guint purple_notify_searchresults_get_rows_count(PurpleNotifySearchResults *results);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    +/**
    + * Returns a number of the columns in the search results object.
    + *
    + * @deprecated This function will be removed in Pidgin 3.0.0 unless
    + * there is sufficient demand to keep it. Using this
    + * function encourages looping through the columns
    + * inefficiently. Instead of using this function you
    + * should iterate through the columns using a loop
    + * similar to this:
    + * for (l = results->columns; l != NULL; l = l->next)
    + * If you really need to get the number of columns you
    + * can use g_list_length(results->columns).
    + *
    + * @param results The search results object.
    + *
    + * @return Number of the columns.
    + */
    +guint purple_notify_searchresults_get_columns_count(PurpleNotifySearchResults *results);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    +/**
    + * Returns a row of the results from the search results object.
    + *
    + * @deprecated This function will be removed in Pidgin 3.0.0 unless
    + * there is sufficient demand to keep it. Using this
    + * function encourages looping through the results
    + * inefficiently. Instead of using this function you
    + * should iterate through the results using a loop
    + * similar to this:
    + * for (l = results->rows; l != NULL; l = l->next)
    + * If you really need to get the data for a particular
    + * row you can use g_list_nth_data(results->rows, row_id).
    + *
    + * @param results The search results object.
    + * @param row_id Index of the row to be returned.
    + *
    + * @return Row of the results.
    + */
    +GList *purple_notify_searchresults_row_get(PurpleNotifySearchResults *results,
    + unsigned int row_id);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    +/**
    + * Returns a title of the search results object's column.
    + *
    + * @deprecated This function will be removed in Pidgin 3.0.0 unless
    + * there is sufficient demand to keep it. Using this
    + * function encourages looping through the columns
    + * inefficiently. Instead of using this function you
    + * should iterate through the name of a particular
    + * column you can use
    + * g_list_nth_data(results->columns, row_id).
    + *
    + * @param results The search results object.
    + * @param column_id Index of the column.
    + *
    + * @return Title of the column.
    + */
    +char *purple_notify_searchresults_column_get_title(PurpleNotifySearchResults *results,
    + unsigned int column_id);
    +#endif
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Notification API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Displays a notification message to the user.
    + *
    + * @param handle The plugin or connection handle.
    + * @param type The notification type.
    + * @param title The title of the message.
    + * @param primary The main point of the message.
    + * @param secondary The secondary information.
    + * @param cb The callback to call when the user closes
    + * the notification.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_message(void *handle, PurpleNotifyMsgType type,
    + const char *title, const char *primary,
    + const char *secondary, PurpleNotifyCloseCallback cb,
    + gpointer user_data);
    +
    +/**
    + * Displays a single email notification to the user.
    + *
    + * @param handle The plugin or connection handle.
    + * @param subject The subject of the email.
    + * @param from The from address.
    + * @param to The destination address.
    + * @param url The URL where the message can be read.
    + * @param cb The callback to call when the user closes
    + * the notification.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_email(void *handle, const char *subject,
    + const char *from, const char *to,
    + const char *url, PurpleNotifyCloseCallback cb,
    + gpointer user_data);
    +
    +/**
    + * Displays a notification for multiple emails to the user.
    + *
    + * @param handle The plugin or connection handle.
    + * @param count The number of emails. '0' can be used to signify that
    + * the user has no unread emails and the UI should remove
    + * the mail notification.
    + * @param detailed @c TRUE if there is information for each email in the
    + * arrays.
    + * @param subjects The array of subjects.
    + * @param froms The array of from addresses.
    + * @param tos The array of destination addresses.
    + * @param urls The URLs where the messages can be read.
    + * @param cb The callback to call when the user closes
    + * the notification.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_emails(void *handle, size_t count, gboolean detailed,
    + const char **subjects, const char **froms,
    + const char **tos, const char **urls,
    + PurpleNotifyCloseCallback cb, gpointer user_data);
    +
    +/**
    + * Displays a notification with formatted text.
    + *
    + * The text is essentially a stripped-down format of HTML, the same that
    + * IMs may send.
    + *
    + * @param handle The plugin or connection handle.
    + * @param title The title of the message.
    + * @param primary The main point of the message.
    + * @param secondary The secondary information.
    + * @param text The formatted text.
    + * @param cb The callback to call when the user closes
    + * the notification.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_formatted(void *handle, const char *title,
    + const char *primary, const char *secondary,
    + const char *text, PurpleNotifyCloseCallback cb, gpointer user_data);
    +
    +/**
    + * Displays user information with formatted text, passing information giving
    + * the connection and username from which the user information came.
    + *
    + * The text is essentially a stripped-down format of HTML, the same that
    + * IMs may send.
    + *
    + * @param gc The PurpleConnection handle associated with the information.
    + * @param who The username associated with the information.
    + * @param user_info The PurpleNotifyUserInfo which contains the information
    + * @param cb The callback to call when the user closes the notification.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_notify_userinfo(PurpleConnection *gc, const char *who,
    + PurpleNotifyUserInfo *user_info, PurpleNotifyCloseCallback cb,
    + gpointer user_data);
    +
    +/**
    + * Create a new PurpleNotifyUserInfo which is suitable for passing to
    + * purple_notify_userinfo()
    + *
    + * @return A new PurpleNotifyUserInfo, which the caller must destroy when done
    + */
    +PurpleNotifyUserInfo *purple_notify_user_info_new(void);
    +
    +/**
    + * Destroy a PurpleNotifyUserInfo
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + */
    +void purple_notify_user_info_destroy(PurpleNotifyUserInfo *user_info);
    +
    +/**
    + * Retrieve the array of PurpleNotifyUserInfoEntry objects from a
    + * PurpleNotifyUserInfo
    + *
    + * This GList may be manipulated directly with normal GList functions such
    + * as g_list_insert(). Only PurpleNotifyUserInfoEntry are allowed in the
    + * list. If a PurpleNotifyUserInfoEntry item is added to the list, it
    + * should not be g_free()'d by the caller; PurpleNotifyUserInfo will g_free
    + * it when destroyed.
    + *
    + * To remove a PurpleNotifyUserInfoEntry, use
    + * purple_notify_user_info_remove_entry(). Do not use the GList directly.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + *
    + * @constreturn A GList of PurpleNotifyUserInfoEntry objects
    + */
    +GList *purple_notify_user_info_get_entries(PurpleNotifyUserInfo *user_info);
    +
    +/**
    + * Create a textual representation of a PurpleNotifyUserInfo, separating
    + * entries with newline
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param newline The separation character
    + */
    +char *purple_notify_user_info_get_text_with_newline(PurpleNotifyUserInfo *user_info, const char *newline);
    +
    +/**
    + * Add a label/value pair to a PurpleNotifyUserInfo object.
    + * PurpleNotifyUserInfo keeps track of the order in which pairs are added.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param label A label, which for example might be displayed by a
    + * UI with a colon after it ("Status:"). Do not include
    + * a colon. If NULL, value will be displayed without a
    + * label.
    + * @param value The value, which might be displayed by a UI after
    + * the label. This should be valid HTML. If you want
    + * to insert plaintext then use
    + * purple_notify_user_info_add_pair_plaintext(), instead.
    + * If this is NULL the label will still be displayed;
    + * the UI should treat label as independent and not
    + * include a colon if it would otherwise.
    + */
    +/*
    + * TODO: In 3.0.0 this function should be renamed to
    + * purple_notify_user_info_add_pair_html(). And optionally
    + * purple_notify_user_info_add_pair_plaintext() could be renamed to
    + * purple_notify_user_info_add_pair().
    + */
    +void purple_notify_user_info_add_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    +
    +/**
    + * Like purple_notify_user_info_add_pair, but value should be plaintext
    + * and will be escaped using g_markup_escape_text().
    + */
    +void purple_notify_user_info_add_pair_plaintext(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    +
    +/**
    + * Prepend a label/value pair to a PurpleNotifyUserInfo object
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param label A label, which for example might be displayed by a
    + * UI with a colon after it ("Status:"). Do not include
    + * a colon. If NULL, value will be displayed without a
    + * label.
    + * @param value The value, which might be displayed by a UI after
    + * the label. If NULL, label will still be displayed;
    + * the UI should then treat label as independent and not
    + * include a colon if it would otherwise.
    + */
    +void purple_notify_user_info_prepend_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_NOTIFY_C_)
    +/**
    + * Remove a PurpleNotifyUserInfoEntry from a PurpleNotifyUserInfo object
    + * without freeing the entry.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + *
    + * @deprecated Nothing is using this function and it should be removed
    + * in 3.0.0. Or, if we decide we want to keep it in 3.0.0
    + * then we should make purple_notify_user_info_entry_destroy
    + * public so that entries can be free'd after they're removed.
    + */
    +void purple_notify_user_info_remove_entry(PurpleNotifyUserInfo *user_info, PurpleNotifyUserInfoEntry *user_info_entry);
    +#endif
    +
    +/**
    + * Create a new PurpleNotifyUserInfoEntry
    + *
    + * If added to a PurpleNotifyUserInfo object, this should not be free()'d,
    + * as PurpleNotifyUserInfo will do so when destroyed.
    + * purple_notify_user_info_add_pair() and
    + * purple_notify_user_info_prepend_pair() are convenience methods for
    + * creating entries and adding them to a PurpleNotifyUserInfo.
    + *
    + * @param label A label, which for example might be displayed by a UI
    + * with a colon after it ("Status:"). Do not include a
    + * colon. If NULL, value will be displayed without a label.
    + * @param value The value, which might be displayed by a UI after the
    + * label. If NULL, label will still be displayed; the UI
    + * should then treat label as independent and not include a
    + * colon if it would otherwise.
    + *
    + * @result A new PurpleNotifyUserInfoEntry
    + */
    +PurpleNotifyUserInfoEntry *purple_notify_user_info_entry_new(const char *label, const char *value);
    +
    +/**
    + * Add a section break. A UI might display this as a horizontal line.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + */
    +void purple_notify_user_info_add_section_break(PurpleNotifyUserInfo *user_info);
    +
    +/**
    + * Prepend a section break. A UI might display this as a horizontal line.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @since 2.5.0
    + */
    +void purple_notify_user_info_prepend_section_break(PurpleNotifyUserInfo *user_info);
    +
    +/**
    + * Add a section header. A UI might display this in a different font
    + * from other text.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param label The name of the section
    + */
    +void purple_notify_user_info_add_section_header(PurpleNotifyUserInfo *user_info, const char *label);
    +
    +/**
    + * Prepend a section header. A UI might display this in a different font
    + * from other text.
    + *
    + * @param user_info The PurpleNotifyUserInfo
    + * @param label The name of the section
    + * @since 2.5.0
    + */
    +void purple_notify_user_info_prepend_section_header(PurpleNotifyUserInfo *user_info, const char *label);
    +
    +/**
    + * Remove the last item which was added to a PurpleNotifyUserInfo. This
    + * could be used to remove a section header which is not needed.
    + */
    +void purple_notify_user_info_remove_last_item(PurpleNotifyUserInfo *user_info);
    +
    +/**
    + * Get the label for a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + *
    + * @return The label
    + */
    +const gchar *purple_notify_user_info_entry_get_label(PurpleNotifyUserInfoEntry *user_info_entry);
    +
    +/**
    + * Set the label for a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + * @param label The label
    + */
    +void purple_notify_user_info_entry_set_label(PurpleNotifyUserInfoEntry *user_info_entry, const char *label);
    +
    +/**
    + * Get the value for a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + *
    + * @result The value
    + */
    +const gchar *purple_notify_user_info_entry_get_value(PurpleNotifyUserInfoEntry *user_info_entry);
    +
    +/**
    + * Set the value for a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + * @param value The value
    + */
    +void purple_notify_user_info_entry_set_value(PurpleNotifyUserInfoEntry *user_info_entry, const char *value);
    +
    +
    +/**
    + * Get the type of a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + *
    + * @return The PurpleNotifyUserInfoEntryType
    + */
    +PurpleNotifyUserInfoEntryType purple_notify_user_info_entry_get_type(PurpleNotifyUserInfoEntry *user_info_entry);
    +
    +/**
    + * Set the type of a PurpleNotifyUserInfoEntry
    + *
    + * @param user_info_entry The PurpleNotifyUserInfoEntry
    + * @param type The PurpleNotifyUserInfoEntryType
    + */
    +void purple_notify_user_info_entry_set_type(PurpleNotifyUserInfoEntry *user_info_entry,
    + PurpleNotifyUserInfoEntryType type);
    +
    +/**
    + * Opens a URI or somehow presents it to the user.
    + *
    + * @param handle The plugin or connection handle.
    + * @param uri The URI to display or go to.
    + *
    + * @return A UI-specific handle, if any. This may only be presented if
    + * the UI code displays a dialog instead of a webpage, or something
    + * similar.
    + */
    +void *purple_notify_uri(void *handle, const char *uri);
    +
    +/**
    + * Closes a notification.
    + *
    + * This should be used only by the UI operation functions and part of the
    + * core.
    + *
    + * @param type The notification type.
    + * @param ui_handle The notification UI handle.
    + */
    +void purple_notify_close(PurpleNotifyType type, void *ui_handle);
    +
    +/**
    + * Closes all notifications registered with the specified handle.
    + *
    + * @param handle The handle.
    + */
    +void purple_notify_close_with_handle(void *handle);
    +
    +/**
    + * A wrapper for purple_notify_message that displays an information message.
    + */
    +#define purple_notify_info(handle, title, primary, secondary) \
    + purple_notify_message((handle), PURPLE_NOTIFY_MSG_INFO, (title), \
    + (primary), (secondary), NULL, NULL)
    +
    +/**
    + * A wrapper for purple_notify_message that displays a warning message.
    + */
    +#define purple_notify_warning(handle, title, primary, secondary) \
    + purple_notify_message((handle), PURPLE_NOTIFY_MSG_WARNING, (title), \
    + (primary), (secondary), NULL, NULL)
    +
    +/**
    + * A wrapper for purple_notify_message that displays an error message.
    + */
    +#define purple_notify_error(handle, title, primary, secondary) \
    + purple_notify_message((handle), PURPLE_NOTIFY_MSG_ERROR, (title), \
    + (primary), (secondary), NULL, NULL)
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used when displaying a
    + * notification.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_notify_set_ui_ops(PurpleNotifyUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used when displaying a
    + * notification.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleNotifyUiOps *purple_notify_get_ui_ops(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Notify Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the notify subsystem handle.
    + *
    + * @return The notify subsystem handle.
    + */
    +void *purple_notify_get_handle(void);
    +
    +/**
    + * Initializes the notify subsystem.
    + */
    +void purple_notify_init(void);
    +
    +/**
    + * Uninitializes the notify subsystem.
    + */
    +void purple_notify_uninit(void);
    +
    +/*@}*/
    +
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_NOTIFY_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/ntlm.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,73 @@
    +/**
    + * @file ntlm.h
    + */
    +
    +/* purple
    + *
    + * Copyright (C) 2005, Thomas Butter <butter@uni-mannheim.de>
    + *
    + * ntlm structs are taken from NTLM description on
    + * http://www.innovation.ch/java/ntlm.html
    + *
    + * 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
    + */
    +
    +#ifndef _PURPLE_NTLM_H
    +#define _PURPLE_NTLM_H
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Generates the base64 encoded type 1 message needed for NTLM authentication
    + *
    + * @param hostname Your hostname
    + * @param domain The domain to authenticate to
    + * @return base64 encoded string to send to the server. This should
    + * be g_free'd by the caller.
    + */
    +gchar *purple_ntlm_gen_type1(const gchar *hostname, const gchar *domain);
    +
    +/**
    + * Parses the ntlm type 2 message
    + *
    + * @param type2 String containing the base64 encoded type2 message
    + * @param flags If not @c NULL, this will store the flags for the message
    + *
    + * @return The nonce for use in message type3. This is a statically
    + * allocated 8 byte binary string.
    + */
    +guint8 *purple_ntlm_parse_type2(const gchar *type2, guint32 *flags);
    +
    +/**
    + * Generates a type3 message
    + *
    + * @param username The username
    + * @param passw The password
    + * @param hostname The hostname
    + * @param domain The domain to authenticate against
    + * @param nonce The nonce returned by purple_ntlm_parse_type2
    + * @param flags Pointer to the flags returned by purple_ntlm_parse_type2
    + * @return A base64 encoded type3 message. This should be g_free'd by
    + * the caller.
    + */
    +gchar *purple_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, const guint8 *nonce, guint32 *flags);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_NTLM_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/oscar.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1355 @@
    +/*
    + * Purple's oscar protocol plugin
    + * This file is the legal property of its developers.
    + * Please see the AUTHORS file distributed alongside this file.
    + *
    + * This library is free software; you can redistribute it and/or
    + * modify it under the terms of the GNU Lesser General Public
    + * License as published by the Free Software Foundation; either
    + * version 2 of the License, or (at your option) any later version.
    + *
    + * This library 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
    + * Lesser General Public License for more details.
    + *
    + * You should have received a copy of the GNU Lesser General Public
    + * License along with this library; if not, write to the Free Software
    + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    +*/
    +
    +/*
    + * Main libfaim header. Must be included in client for prototypes/macros.
    + *
    + * "come on, i turned a chick lesbian; i think this is the hackish equivalent"
    + * -- Josh Myer
    + *
    + */
    +
    +#ifndef _OSCAR_H_
    +#define _OSCAR_H_
    +
    +#include "internal.h"
    +#include "circbuffer.h"
    +#include "debug.h"
    +#include "eventloop.h"
    +#include "proxy.h"
    +#include "sslconn.h"
    +
    +#include <stdio.h>
    +#include <string.h>
    +#include <fcntl.h>
    +#include <sys/types.h>
    +#include <stdlib.h>
    +#include <stdarg.h>
    +#include <errno.h>
    +#include <time.h>
    +
    +#ifndef _WIN32
    +#include <sys/time.h>
    +#include <unistd.h>
    +#include <netdb.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#else
    +#include "libc_interface.h"
    +#endif
    +
    +typedef struct _ByteStream ByteStream;
    +typedef struct _ClientInfo ClientInfo;
    +typedef struct _FlapConnection FlapConnection;
    +typedef struct _FlapFrame FlapFrame;
    +typedef struct _IcbmArgsCh2 IcbmArgsCh2;
    +typedef struct _IcbmCookie IcbmCookie;
    +typedef struct _OscarData OscarData;
    +typedef struct _QueuedSnac QueuedSnac;
    +
    +typedef guint32 aim_snacid_t;
    +
    +#include "snactypes.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +#define FAIM_SNAC_HASH_SIZE 16
    +
    +/*
    + * Current Maximum Length for usernames (not including NULL)
    + *
    + * Currently only names up to 16 characters can be registered
    + * however it is apparently legal for them to be larger.
    + */
    +#define MAXSNLEN 97
    +
    +/*
    + * Current Maximum Length for Instant Messages
    + *
    + * This was found basically by experiment, but not wholly
    + * accurate experiment. It should not be regarded
    + * as completely correct. But its a decent approximation.
    + *
    + * Note that although we can send this much, its impossible
    + * for WinAIM clients (up through the latest (4.0.1957)) to
    + * send any more than 1kb. Amaze all your windows friends
    + * with utterly oversized instant messages!
    + */
    +#define MAXMSGLEN 2544
    +
    +/*
    + * Maximum size of a Buddy Icon.
    + */
    +#define MAXICONLEN 7168
    +#define AIM_ICONIDENT "AVT1picture.id"
    +
    +/*
    + * Found by trial and error.
    + */
    +#define MAXAVAILMSGLEN 251
    +
    +/**
    + * Maximum length for the password of an ICQ account
    + */
    +#define MAXICQPASSLEN 16
    +
    +#define AIM_MD5_STRING "AOL Instant Messenger (SM)"
    +
    +/*
    + * Client info. Filled in by the client and passed in to
    + * aim_send_login(). The information ends up getting passed to OSCAR
    + * through the initial login command.
    + *
    + */
    +struct _ClientInfo
    +{
    + const char *clientstring;
    + guint16 clientid;
    + guint16 major;
    + guint16 minor;
    + guint16 point;
    + guint16 build;
    + guint32 distrib;
    + const char *country; /* two-letter abbrev */
    + const char *lang; /* two-letter abbrev */
    +};
    +
    +/*
    + * We need to use the major-minor-micro versions from the official
    + * AIM and ICQ programs here or AOL won't let us use certain features.
    + *
    + * 0x00000611 is the distid given to us by AOL for use as the default
    + * libpurple distid.
    + */
    +#define CLIENTINFO_PURPLE_AIM { \
    + NULL, \
    + 0x0109, \
    + 0x0005, 0x0001, \
    + 0x0000, 0x0bdc, \
    + 0x00000611, \
    + "us", "en", \
    +}
    +
    +#define CLIENTINFO_PURPLE_ICQ { \
    + NULL, \
    + 0x010a, \
    + 0x0014, 0x0034, \
    + 0x0000, 0x0c18, \
    + 0x00000611, \
    + "us", "en", \
    +}
    +
    +typedef enum
    +{
    + OSCAR_DISCONNECT_DONE, /* not considered an error */
    + OSCAR_DISCONNECT_LOCAL_CLOSED, /* peer connections only, not considered an error */
    + OSCAR_DISCONNECT_REMOTE_CLOSED,
    + OSCAR_DISCONNECT_REMOTE_REFUSED, /* peer connections only */
    + OSCAR_DISCONNECT_LOST_CONNECTION,
    + OSCAR_DISCONNECT_INVALID_DATA,
    + OSCAR_DISCONNECT_COULD_NOT_CONNECT,
    + OSCAR_DISCONNECT_RETRYING /* peer connections only */
    +} OscarDisconnectReason;
    +
    +#define OSCAR_CAPABILITY_BUDDYICON 0x0000000000000001LL
    +#define OSCAR_CAPABILITY_TALK 0x0000000000000002LL
    +#define OSCAR_CAPABILITY_DIRECTIM 0x0000000000000004LL
    +#define OSCAR_CAPABILITY_CHAT 0x0000000000000008LL
    +#define OSCAR_CAPABILITY_GETFILE 0x0000000000000010LL
    +#define OSCAR_CAPABILITY_SENDFILE 0x0000000000000020LL
    +#define OSCAR_CAPABILITY_GAMES 0x0000000000000040LL
    +#define OSCAR_CAPABILITY_ADDINS 0x0000000000000080LL
    +#define OSCAR_CAPABILITY_SENDBUDDYLIST 0x0000000000000100LL
    +#define OSCAR_CAPABILITY_GAMES2 0x0000000000000200LL
    +#define OSCAR_CAPABILITY_ICQ_DIRECT 0x0000000000000400LL
    +#define OSCAR_CAPABILITY_APINFO 0x0000000000000800LL
    +#define OSCAR_CAPABILITY_ICQRTF 0x0000000000001000LL
    +#define OSCAR_CAPABILITY_EMPTY 0x0000000000002000LL
    +#define OSCAR_CAPABILITY_ICQSERVERRELAY 0x0000000000004000LL
    +#define OSCAR_CAPABILITY_UNICODEOLD 0x0000000000008000LL
    +#define OSCAR_CAPABILITY_TRILLIANCRYPT 0x0000000000010000LL
    +#define OSCAR_CAPABILITY_UNICODE 0x0000000000020000LL
    +#define OSCAR_CAPABILITY_INTEROPERATE 0x0000000000040000LL
    +#define OSCAR_CAPABILITY_SHORTCAPS 0x0000000000080000LL
    +#define OSCAR_CAPABILITY_HIPTOP 0x0000000000100000LL
    +#define OSCAR_CAPABILITY_SECUREIM 0x0000000000200000LL
    +#define OSCAR_CAPABILITY_SMS 0x0000000000400000LL
    +#define OSCAR_CAPABILITY_VIDEO 0x0000000000800000LL
    +#define OSCAR_CAPABILITY_ICHATAV 0x0000000001000000LL
    +#define OSCAR_CAPABILITY_LIVEVIDEO 0x0000000002000000LL
    +#define OSCAR_CAPABILITY_CAMERA 0x0000000004000000LL
    +#define OSCAR_CAPABILITY_ICHAT_SCREENSHARE 0x0000000008000000LL
    +#define OSCAR_CAPABILITY_TYPING 0x0000000010000000LL
    +#define OSCAR_CAPABILITY_NEWCAPS 0x0000000020000000LL
    +#define OSCAR_CAPABILITY_XTRAZ 0x0000000040000000LL
    +#define OSCAR_CAPABILITY_GENERICUNKNOWN 0x0000000080000000LL
    +#define OSCAR_CAPABILITY_HTML_MSGS 0x0000000100000000LL
    +#define OSCAR_CAPABILITY_LAST 0x0000000200000000LL
    +
    +#define OSCAR_STATUS_ID_INVISIBLE "invisible"
    +#define OSCAR_STATUS_ID_OFFLINE "offline"
    +#define OSCAR_STATUS_ID_AVAILABLE "available"
    +#define OSCAR_STATUS_ID_AWAY "away"
    +#define OSCAR_STATUS_ID_DND "dnd"
    +#define OSCAR_STATUS_ID_NA "na"
    +#define OSCAR_STATUS_ID_OCCUPIED "occupied"
    +#define OSCAR_STATUS_ID_FREE4CHAT "free4chat"
    +#define OSCAR_STATUS_ID_CUSTOM "custom"
    +#define OSCAR_STATUS_ID_MOBILE "mobile"
    +#define OSCAR_STATUS_ID_EVIL "evil"
    +#define OSCAR_STATUS_ID_DEPRESSION "depression"
    +#define OSCAR_STATUS_ID_ATHOME "athome"
    +#define OSCAR_STATUS_ID_ATWORK "atwork"
    +#define OSCAR_STATUS_ID_LUNCH "lunch"
    +
    +/*
    + * Byte Stream type. Sort of.
    + *
    + * Use of this type serves a couple purposes:
    + * - Buffer/buflen pairs are passed all around everywhere. This turns
    + * that into one value, as well as abstracting it slightly.
    + * - Through the abstraction, it is possible to enable bounds checking
    + * for robustness at the cost of performance. But a clean failure on
    + * weird packets is much better than a segfault.
    + * - I like having variables named "bs".
    + *
    + * Don't touch the insides of this struct. Or I'll have to kill you.
    + *
    + */
    +struct _ByteStream
    +{
    + guint8 *data;
    + size_t len;
    + size_t offset;
    +};
    +
    +struct _QueuedSnac
    +{
    + guint16 family;
    + guint16 subtype;
    + FlapFrame *frame;
    +};
    +
    +struct _FlapFrame
    +{
    + guint8 channel;
    + guint16 seqnum;
    + ByteStream data; /* payload stream */
    +};
    +
    +struct _FlapConnection
    +{
    + OscarData *od; /**< Pointer to parent session. */
    + gboolean connected;
    + time_t lastactivity; /**< Time of last transmit. */
    + guint destroy_timeout;
    + OscarDisconnectReason disconnect_reason;
    + gchar *error_message;
    + guint16 disconnect_code;
    +
    + /* A few variables that are only used when connecting */
    + PurpleProxyConnectData *connect_data;
    + guint16 cookielen;
    + guint8 *cookie;
    + gpointer new_conn_data;
    +
    + int fd;
    + PurpleSslConnection *gsc;
    + guint8 header[6];
    + gssize header_received;
    + FlapFrame buffer_incoming;
    + PurpleCircBuffer *buffer_outgoing;
    + guint watcher_incoming;
    + guint watcher_outgoing;
    +
    + guint16 type;
    + guint16 subtype;
    + guint16 seqnum_out; /**< The sequence number of most recently sent packet. */
    + guint16 seqnum_in; /**< The sequence number of most recently received packet. */
    + GSList *groups;
    + GSList *rateclasses; /* Contains nodes of struct rateclass. */
    + struct rateclass *default_rateclass;
    + GHashTable *rateclass_members; /* Key is family and subtype, value is pointer to the rateclass struct to use. */
    +
    + GQueue *queued_snacs; /**< Contains QueuedSnacs. */
    + GQueue *queued_lowpriority_snacs; /**< Contains QueuedSnacs to send only once queued_snacs is empty */
    + guint queued_timeout;
    +
    + void *internal; /* internal conn-specific libfaim data */
    +};
    +
    +struct _IcbmCookie
    +{
    + guchar cookie[8];
    + int type;
    + void *data;
    + time_t addtime;
    + struct _IcbmCookie *next;
    +};
    +
    +#include "peer.h"
    +
    +/*
    + * AIM Session: The main client-data interface.
    + *
    + */
    +struct _OscarData
    +{
    + /** Only used when connecting with clientLogin */
    + PurpleUtilFetchUrlData *url_data;
    +
    + gboolean iconconnecting;
    + gboolean set_icon;
    +
    + GSList *create_rooms;
    +
    + gboolean conf;
    + gboolean reqemail;
    + gboolean setemail;
    + char *email;
    + gboolean setnick;
    + char *newformatting;
    + gboolean chpass;
    + char *oldp;
    + char *newp;
    +
    + GSList *oscar_chats;
    + GHashTable *buddyinfo;
    + GSList *requesticon;
    +
    + gboolean use_ssl;
    + gboolean icq;
    + guint getblisttimer;
    +
    + struct {
    + guint maxwatchers; /* max users who can watch you */
    + guint maxbuddies; /* max users you can watch */
    + guint maxgroups; /* max groups in server list */
    + guint maxpermits; /* max users on permit list */
    + guint maxdenies; /* max users on deny list */
    + guint maxsiglen; /* max size (bytes) of profile */
    + guint maxawaymsglen; /* max size (bytes) of posted away message */
    + } rights;
    +
    + PurpleConnection *gc;
    +
    + void *modlistv;
    +
    + /*
    + * Outstanding snac handling
    + *
    + * TODO: Should these be per-connection? -mid
    + */
    + void *snac_hash[FAIM_SNAC_HASH_SIZE];
    + aim_snacid_t snacid_next;
    +
    + /*
    + * TODO: Data specific to a certain family should go into a
    + * hashtable and the core parts of libfaim shouldn't
    + * need to know about them.
    + */
    +
    + IcbmCookie *msgcookies;
    + GSList *icq_info;
    +
    + /** Only used when connecting with the old-style BUCP login. */
    + struct aim_authresp_info *authinfo;
    + struct aim_emailinfo *emailinfo;
    +
    + struct {
    + struct aim_userinfo_s *userinfo;
    + } locate;
    +
    + struct {
    + gboolean have_rights;
    + } bos;
    +
    + /* Server-stored information (ssi) */
    + struct {
    + gboolean received_data;
    + guint16 numitems;
    + struct aim_ssi_item *official;
    + struct aim_ssi_item *local;
    + struct aim_ssi_tmp *pending;
    + time_t timestamp;
    + gboolean waiting_for_ack;
    + gboolean in_transaction;
    + } ssi;
    +
    + /** Contains pointers to handler functions for each family/subtype. */
    + GHashTable *handlerlist;
    +
    + /** A linked list containing FlapConnections. */
    + GSList *oscar_connections;
    + guint16 default_port;
    +
    + /** A linked list containing PeerConnections. */
    + GSList *peer_connections;
    +};
    +
    +/* Valid for calling aim_icq_setstatus() and for aim_userinfo_t->icqinfo.status */
    +#define AIM_ICQ_STATE_NORMAL 0x00000000
    +#define AIM_ICQ_STATE_AWAY 0x00000001
    +#define AIM_ICQ_STATE_DND 0x00000002
    +#define AIM_ICQ_STATE_OUT 0x00000004
    +#define AIM_ICQ_STATE_BUSY 0x00000010
    +#define AIM_ICQ_STATE_CHAT 0x00000020
    +#define AIM_ICQ_STATE_INVISIBLE 0x00000100
    +#define AIM_ICQ_STATE_EVIL 0x00003000
    +#define AIM_ICQ_STATE_DEPRESSION 0x00004000
    +#define AIM_ICQ_STATE_ATHOME 0x00005000
    +#define AIM_ICQ_STATE_ATWORK 0x00006000
    +#define AIM_ICQ_STATE_LUNCH 0x00002001
    +#define AIM_ICQ_STATE_EVIL 0x00003000
    +#define AIM_ICQ_STATE_WEBAWARE 0x00010000
    +#define AIM_ICQ_STATE_HIDEIP 0x00020000
    +#define AIM_ICQ_STATE_BIRTHDAY 0x00080000
    +#define AIM_ICQ_STATE_ICQHOMEPAGE 0x00200000
    +#define AIM_ICQ_STATE_DIRECTREQUIREAUTH 0x10000000
    +
    +/**
    + * Only used when connecting with the old-style BUCP login.
    + */
    +struct aim_clientrelease
    +{
    + char *name;
    + guint32 build;
    + char *url;
    + char *info;
    +};
    +
    +/**
    + * Only used when connecting with the old-style BUCP login.
    + */
    +struct aim_authresp_info
    +{
    + char *bn;
    + guint16 errorcode;
    + char *errorurl;
    + guint16 regstatus;
    + char *email;
    + char *bosip;
    + guint16 cookielen;
    + guint8 *cookie;
    + char *chpassurl;
    + struct aim_clientrelease latestrelease;
    + struct aim_clientrelease latestbeta;
    +};
    +
    +/* Callback data for redirect. */
    +struct aim_redirect_data
    +{
    + guint16 group;
    + const char *ip;
    + guint16 cookielen;
    + const guint8 *cookie;
    + const char *ssl_cert_cn;
    + guint8 use_ssl;
    + struct { /* group == SNAC_FAMILY_CHAT */
    + guint16 exchange;
    + const char *room;
    + guint16 instance;
    + } chat;
    +};
    +
    +int oscar_connect_to_bos(PurpleConnection *gc, OscarData *od, const char *host, guint16 port, guint8 *cookie, guint16 cookielen, const char *tls_certname);
    +
    +/* family_auth.c */
    +
    +/**
    + * Only used when connecting with the old-style BUCP login.
    + */
    +int aim_request_login(OscarData *od, FlapConnection *conn, const char *bn);
    +
    +/**
    + * Only used when connecting with the old-style BUCP login.
    + */
    +int aim_send_login(OscarData *od, FlapConnection *conn, const char *bn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key, gboolean allow_multiple_logins);
    +
    +/**
    + * Only used when connecting with the old-style BUCP login.
    + */
    +/* 0x000b */ int aim_auth_securid_send(OscarData *od, const char *securid);
    +
    +/**
    + * Only used when connecting with clientLogin.
    + */
    +void send_client_login(OscarData *od, const char *username);
    +
    +/**
    + * Only used when connecting with kerberos login.
    + */
    +void send_kerberos_login(OscarData *od, const char *username);
    +
    +/* flap_connection.c */
    +FlapConnection *flap_connection_new(OscarData *, int type);
    +void flap_connection_close(OscarData *od, FlapConnection *conn);
    +void flap_connection_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    +void flap_connection_schedule_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    +FlapConnection *flap_connection_findbygroup(OscarData *od, guint16 group);
    +FlapConnection *flap_connection_getbytype(OscarData *, int type);
    +FlapConnection *flap_connection_getbytype_all(OscarData *, int type);
    +void flap_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond);
    +void flap_connection_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond);
    +
    +void flap_connection_send(FlapConnection *conn, FlapFrame *frame);
    +void flap_connection_send_version(OscarData *od, FlapConnection *conn);
    +void flap_connection_send_version_with_cookie(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy);
    +void flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci, gboolean allow_multiple_login);
    +void flap_connection_send_snac(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, aim_snacid_t snacid, ByteStream *data);
    +void flap_connection_send_snac_with_priority(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, aim_snacid_t snacid, ByteStream *data, gboolean high_priority);
    +void flap_connection_send_keepalive(OscarData *od, FlapConnection *conn);
    +FlapFrame *flap_frame_new(OscarData *od, guint16 channel, int datalen);
    +
    +/* oscar_data.c */
    +typedef int (*aim_rxcallback_t)(OscarData *od, FlapConnection *conn, FlapFrame *frame, ...);
    +
    +OscarData *oscar_data_new(void);
    +void oscar_data_destroy(OscarData *);
    +void oscar_data_addhandler(OscarData *od, guint16 family, guint16 subtype, aim_rxcallback_t newhandler, guint16 flags);
    +aim_rxcallback_t aim_callhandler(OscarData *od, guint16 family, guint16 subtype);
    +
    +/* 0x0001 - family_oservice.c */
    +/* 0x0002 */ void aim_srv_clientready(OscarData *od, FlapConnection *conn);
    +/* 0x0004 */ void aim_srv_requestnew(OscarData *od, guint16 serviceid);
    +/* 0x0006 */ void aim_srv_reqrates(OscarData *od, FlapConnection *conn);
    +/* 0x0008 */ void aim_srv_rates_addparam(OscarData *od, FlapConnection *conn);
    +/* 0x000e */ void aim_srv_reqpersonalinfo(OscarData *od, FlapConnection *conn);
    +/* 0x0011 */ void aim_srv_setidle(OscarData *od, guint32 idletime);
    +/* 0x0017 */ void aim_srv_setversions(OscarData *od, FlapConnection *conn);
    +/* 0x001e */ int aim_srv_setextrainfo(OscarData *od, gboolean seticqstatus, guint32 icqstatus, gboolean setstatusmsg, const char *statusmsg, const char *itmsurl);
    +void aim_srv_set_dc_info(OscarData *od);
    +
    +
    +void aim_bos_reqrights(OscarData *od, FlapConnection *conn);
    +
    +#define AIM_RATE_CODE_LIMIT 0x0003
    +
    +/* family_icbm.c */
    +#define AIM_OFT_SUBTYPE_SEND_DIR 0x0002
    +
    +#define AIM_TRANSFER_DENY_DECLINE 0x0001
    +
    +#define AIM_IMPARAM_FLAG_CHANNEL_MSGS_ALLOWED 0x00000001
    +#define AIM_IMPARAM_FLAG_MISSED_CALLS_ENABLED 0x00000002
    +#define AIM_IMPARAM_FLAG_EVENTS_ALLOWED 0x00000008
    +#define AIM_IMPARAM_FLAG_SMS_SUPPORTED 0x00000010
    +#define AIM_IMPARAM_FLAG_OFFLINE_MSGS_ALLOWED 0x00000100
    +
    +/**
    + * This flag tells the server that we always send HTML in messages
    + * sent from an ICQ account to an ICQ account. (If this flag is
    + * not sent then plaintext is sent ICQ<-->ICQ (HTML is sent in all
    + * other cases)).
    + *
    + * If we send an HTML message to an old client that doesn't support
    + * HTML messages, then the oscar servers will merrily strip the HTML
    + * for us.
    + *
    + * All incoming IMs are treated as HTML.
    + */
    +#define AIM_IMPARAM_FLAG_USE_HTML_FOR_ICQ 0x00000400
    +
    +struct aim_icbmparameters
    +{
    + guint16 maxchan;
    + guint32 flags; /* AIM_IMPARAM_FLAG_ */
    + guint16 maxmsglen; /* message size that you will accept */
    + guint16 maxsenderwarn; /* this and below are *10 (999=99.9%) */
    + guint16 maxrecverwarn;
    + guint32 minmsginterval; /* in milliseconds? */
    +};
    +
    +/*
    + * TODO: Should probably combine this with struct chat_connection.
    + */
    +struct aim_chat_roominfo
    +{
    + guint16 exchange;
    + char *name;
    + guint8 namelen;
    + guint16 instance;
    +};
    +
    +struct chat_connection
    +{
    + char *name;
    + char *show; /* AOL did something funny to us */
    + guint16 exchange;
    + guint16 instance;
    + FlapConnection *conn;
    + int id;
    + PurpleConnection *gc;
    + PurpleConversation *conv;
    + guint16 maxlen;
    + guint16 maxvis;
    +};
    +
    +/*
    + * All this chat struct stuff should be in family_chat.c
    + */
    +void oscar_chat_destroy(struct chat_connection *cc);
    +
    +#define AIM_IMFLAGS_AWAY 0x0001 /* mark as an autoreply */
    +#define AIM_IMFLAGS_ACK 0x0002 /* request a receipt notice */
    +#define AIM_IMFLAGS_BUDDYREQ 0x0010 /* buddy icon requested */
    +#define AIM_IMFLAGS_HASICON 0x0020 /* already has icon */
    +#define AIM_IMFLAGS_SUBENC_MACINTOSH 0x0040 /* damn that Steve Jobs! */
    +#define AIM_IMFLAGS_CUSTOMFEATURES 0x0080 /* features field present */
    +#define AIM_IMFLAGS_OFFLINE 0x0800 /* send to offline user */
    +#define AIM_IMFLAGS_TYPINGNOT 0x1000 /* typing notification */
    +
    +#define AIM_CHARSET_ASCII 0x0000 /* ISO 646 */
    +#define AIM_CHARSET_UNICODE 0x0002 /* ISO 10646 (UTF-16/UCS-2BE) */
    +#define AIM_CHARSET_LATIN_1 0x0003 /* ISO 8859-1 */
    +
    +/*
    + * Arguments to aim_send_im_ext().
    + *
    + * This is really complicated. But immensely versatile.
    + *
    + */
    +struct aim_sendimext_args
    +{
    + /* These are _required_ */
    + const char *destbn;
    + guint32 flags; /* often 0 */
    +
    + const char *msg;
    + gsize msglen;
    +
    + /* Only used if AIM_IMFLAGS_HASICON is set */
    + guint32 iconlen;
    + time_t iconstamp;
    + guint32 iconsum;
    +
    + guint16 featureslen;
    + guint8 *features;
    +
    + guint16 charset;
    +};
    +
    +/*
    + * This information is provided in the Incoming ICBM callback for
    + * Channel 1 ICBM's.
    + */
    +struct aim_incomingim_ch1_args
    +{
    + guint32 icbmflags; /* some flags apply only to ->msg, not all mpmsg */
    + time_t timestamp; /* Only set for offline messages */
    +
    + gchar *msg;
    +
    + /* Only provided if AIM_IMFLAGS_HASICON is set */
    + time_t iconstamp;
    + guint32 iconlen;
    + guint16 iconsum;
    +};
    +
    +/* Valid values for channel 2 args->status */
    +#define AIM_RENDEZVOUS_PROPOSE 0x0000
    +#define AIM_RENDEZVOUS_CANCEL 0x0001
    +#define AIM_RENDEZVOUS_CONNECTED 0x0002
    +
    +struct _IcbmArgsCh2
    +{
    + guint16 status;
    + guchar cookie[8];
    + guint64 type; /* One of the OSCAR_CAPABILITY_ constants */
    + const char *proxyip;
    + const char *clientip;
    + const char *verifiedip;
    + guint16 port;
    + gboolean use_proxy;
    + guint16 errorcode;
    + const char *msg; /* invite message or file description */
    + guint16 msglen;
    + const char *encoding;
    + const char *language;
    + guint16 requestnumber;
    + union {
    + struct {
    + guint32 checksum;
    + guint32 length;
    + time_t timestamp;
    + guint8 *icon;
    + } icon;
    + struct {
    + struct aim_chat_roominfo roominfo;
    + } chat;
    + struct {
    + guint8 msgtype;
    + const char *msg;
    + } rtfmsg;
    + struct {
    + guint16 subtype;
    + guint16 totfiles;
    + guint32 totsize;
    + char *filename;
    + } sendfile;
    + } info;
    + void *destructor; /* used internally only */
    +};
    +
    +struct aim_incomingim_ch4_args
    +{
    + guint32 uin; /* Of the sender of the ICBM */
    + guint8 type;
    + guint8 flags;
    + gchar *msg; /* Reason for auth request, deny, or accept */
    + int msglen;
    +};
    +
    +/* SNAC sending functions */
    +/* 0x0002 */ int aim_im_setparams(OscarData *od, struct aim_icbmparameters *params);
    +/* 0x0004 */ int aim_im_reqparams(OscarData *od);
    +/* 0x0006 */ int aim_im_sendch1_ext(OscarData *od, struct aim_sendimext_args *args);
    +/* 0x0006 */ int aim_im_sendch1(OscarData *, const char *destbn, guint16 flags, const char *msg);
    +/* 0x0006 */ int aim_im_sendch2_chatinvite(OscarData *od, const char *bn, const char *msg, guint16 exchange, const char *roomname, guint16 instance);
    +/* 0x0006 */ int aim_im_sendch2_icon(OscarData *od, const char *bn, const guint8 *icon, int iconlen, time_t stamp, guint16 iconsum);
    +
    +/* 0x0006 */ void aim_im_sendch2_cancel(PeerConnection *peer_conn);
    +/* 0x0006 */ void aim_im_sendch2_connected(PeerConnection *peer_conn);
    +/* 0x0006 */ void aim_im_sendch2_odc_requestdirect(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 port, guint16 requestnumber);
    +/* 0x0006 */ void aim_im_sendch2_odc_requestproxy(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 pin, guint16 requestnumber);
    +/* 0x0006 */ void aim_im_sendch2_sendfile_requestdirect(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 port, guint16 requestnumber, const gchar *filename, guint32 size, guint16 numfiles);
    +/* 0x0006 */ void aim_im_sendch2_sendfile_requestproxy(OscarData *od, guchar *cookie, const char *bn, const guint8 *ip, guint16 pin, guint16 requestnumber, const gchar *filename, guint32 size, guint16 numfiles);
    +
    +/* 0x000b */ int aim_im_denytransfer(OscarData *od, const char *bn, const guchar *cookie, guint16 code);
    +/* 0x0010 */ int aim_im_reqofflinemsgs(OscarData *od);
    +/* 0x0014 */ int aim_im_sendmtn(OscarData *od, guint16 type1, const char *bn, guint16 type2);
    +/* 0x000b */ int icq_relay_xstatus (OscarData *od, const char *sn, const guchar* cookie);
    +void aim_icbm_makecookie(guchar* cookie);
    +void aim_im_send_icq_confirmation(OscarData *od, const char *bn, const guchar *cookie);
    +
    +/* 0x0002 - family_locate.c */
    +/*
    + * AIM User Info, Standard Form.
    + */
    +#define AIM_FLAG_ADMINISTRATOR 0x0002
    +#define AIM_FLAG_AOL 0x0004
    +#define AIM_FLAG_AWAY 0x0020
    +#define AIM_FLAG_WIRELESS 0x0080
    +#define AIM_FLAG_ICQ 0x0040
    +#define AIM_FLAG_ACTIVEBUDDY 0x0400
    +
    +#define AIM_USERINFO_PRESENT_FLAGS 0x00000001
    +#define AIM_USERINFO_PRESENT_MEMBERSINCE 0x00000002
    +#define AIM_USERINFO_PRESENT_ONLINESINCE 0x00000004
    +#define AIM_USERINFO_PRESENT_IDLE 0x00000008
    +#define AIM_USERINFO_PRESENT_ICQEXTSTATUS 0x00000010
    +#define AIM_USERINFO_PRESENT_ICQIPADDR 0x00000020
    +#define AIM_USERINFO_PRESENT_ICQDATA 0x00000040
    +#define AIM_USERINFO_PRESENT_CAPABILITIES 0x00000080
    +#define AIM_USERINFO_PRESENT_SESSIONLEN 0x00000100
    +#define AIM_USERINFO_PRESENT_CREATETIME 0x00000200
    +
    +struct userinfo_node
    +{
    + char *bn;
    + struct userinfo_node *next;
    +};
    +
    +typedef struct aim_userinfo_s
    +{
    + char *bn;
    + guint16 warnlevel; /* evil percent * 10 (999 = 99.9%) */
    + guint16 idletime; /* in seconds */
    + guint16 flags;
    + guint32 createtime; /* time_t */
    + guint32 membersince; /* time_t */
    + guint32 onlinesince; /* time_t */
    + guint32 sessionlen; /* in seconds */
    + guint64 capabilities;
    + struct {
    + guint32 status;
    + guint32 ipaddr;
    + guint8 crap[0x25]; /* until we figure it out... */
    + } icqinfo;
    + guint32 present;
    +
    + guint8 iconcsumtype;
    + guint16 iconcsumlen;
    + guint8 *iconcsum;
    +
    + char *info;
    + char *info_encoding;
    + guint16 info_len;
    +
    + char *status;
    + char *status_encoding;
    + guint16 status_len;
    +
    + char *itmsurl;
    + char *itmsurl_encoding;
    + guint16 itmsurl_len;
    +
    + char *away;
    + char *away_encoding;
    + guint16 away_len;
    +
    + struct aim_userinfo_s *next;
    +} aim_userinfo_t;
    +
    +#define AIM_SENDMEMBLOCK_FLAG_ISREQUEST 0
    +#define AIM_SENDMEMBLOCK_FLAG_ISHASH 1
    +
    +int aim_sendmemblock(OscarData *od, FlapConnection *conn, guint32 offset, guint32 len, const guint8 *buf, guint8 flag);
    +
    +struct aim_invite_priv
    +{
    + char *bn;
    + char *roomname;
    + guint16 exchange;
    + guint16 instance;
    +};
    +
    +#define AIM_COOKIETYPE_CHAT 0x01
    +#define AIM_COOKIETYPE_INVITE 0x02
    +
    +aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *bn);
    +void aim_locate_dorequest(OscarData *od);
    +
    +/* 0x0002 */ int aim_locate_reqrights(OscarData *od);
    +/* 0x0004 */ int aim_locate_setcaps(OscarData *od, guint64 caps);
    +/* 0x0004 */ int aim_locate_setprofile(OscarData *od, const char *profile_encoding, const gchar *profile, const int profile_len, const char *awaymsg_encoding, const gchar *awaymsg, const int awaymsg_len);
    +/* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *bn, guint32 flags);
    +
    +guint64 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len);
    +guint64 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len);
    +void aim_info_free(aim_userinfo_t *);
    +int aim_info_extract(OscarData *od, ByteStream *bs, aim_userinfo_t *);
    +int aim_putuserinfo(ByteStream *bs, aim_userinfo_t *info);
    +PurpleMood* icq_get_purple_moods(PurpleAccount *account);
    +const char* icq_get_custom_icon_description(const char *mood);
    +guint8* icq_get_custom_icon_data(const char *mood);
    +int icq_im_xstatus_request(OscarData *od, const char *sn);
    +
    +/* 0x0003 - family_buddy.c */
    +/* 0x0002 */ void aim_buddylist_reqrights(OscarData *, FlapConnection *);
    +
    +
    +/* 0x000a - family_userlookup.c */
    +int aim_search_address(OscarData *, const char *);
    +
    +struct aim_chat_exchangeinfo
    +{
    + guint16 number;
    + guint16 flags;
    + char *name;
    + char *charset1;
    + char *lang1;
    + char *charset2;
    + char *lang2;
    +};
    +
    +#define AIM_CHATFLAGS_NOREFLECT 0x0001
    +#define AIM_CHATFLAGS_AWAY 0x0002
    +int aim_chat_send_im(OscarData *od, FlapConnection *conn, guint16 flags, const gchar *msg, int msglen, const char *encoding, const char *language);
    +int aim_chat_join(OscarData *od, guint16 exchange, const char *roomname, guint16 instance);
    +
    +void aim_chatnav_reqrights(OscarData *od, FlapConnection *conn);
    +
    +int aim_chatnav_createroom(OscarData *od, FlapConnection *conn, const char *name, guint16 exchange);
    +
    +
    +/* 0x0010 - family_bart.c */
    +int aim_bart_upload(OscarData *od, const guint8 *icon, guint16 iconlen);
    +int aim_bart_request(OscarData *od, const char *bn, guint8 iconcsumtype, const guint8 *iconstr, guint16 iconstrlen);
    +
    +
    +
    +/* 0x0013 - family_feedbag.c */
    +#define AIM_SSI_TYPE_BUDDY 0x0000
    +#define AIM_SSI_TYPE_GROUP 0x0001
    +#define AIM_SSI_TYPE_PERMIT 0x0002
    +#define AIM_SSI_TYPE_DENY 0x0003
    +#define AIM_SSI_TYPE_PDINFO 0x0004
    +#define AIM_SSI_TYPE_PRESENCEPREFS 0x0005
    +#define AIM_SSI_TYPE_ICQDENY 0x000e
    +#define AIM_SSI_TYPE_ICONINFO 0x0014
    +
    +/* These flags are set in the 0x00c9 TLV of SSI type 0x0005 */
    +#define AIM_SSI_PRESENCE_FLAG_SHOWIDLE 0x00000400
    +#define AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES 0x00020000
    +
    +struct aim_ssi_item
    +{
    + char *name;
    + guint16 gid;
    + guint16 bid;
    + guint16 type;
    + GSList *data;
    + struct aim_ssi_item *next;
    +};
    +
    +struct aim_ssi_tmp
    +{
    + guint16 action;
    + guint16 ack;
    + char *name;
    + struct aim_ssi_item *item;
    + struct aim_ssi_tmp *next;
    +};
    +
    +/* These build the actual SNACs and queue them to be sent */
    +/* 0x0002 */ int aim_ssi_reqrights(OscarData *od);
    +/* 0x0004 */ int aim_ssi_reqdata(OscarData *od);
    +/* 0x0007 */ int aim_ssi_enable(OscarData *od);
    +/* 0x0011 */ int aim_ssi_modbegin(OscarData *od);
    +/* 0x0012 */ int aim_ssi_modend(OscarData *od);
    +/* 0x0018 */ int aim_ssi_sendauthrequest(OscarData *od, const char *bn, const char *msg);
    +/* 0x001a */ int aim_ssi_sendauthreply(OscarData *od, const char *bn, guint8 reply, const char *msg);
    +
    +/* Client functions for retrieving SSI data */
    +struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, guint16 gid, guint16 bid);
    +struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, const char *gn, const char *bn, guint16 type);
    +struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *bn);
    +char *aim_ssi_itemlist_findparentname(struct aim_ssi_item *list, const char *bn);
    +int aim_ssi_getpermdeny(struct aim_ssi_item *list);
    +guint32 aim_ssi_getpresence(struct aim_ssi_item *list);
    +char *aim_ssi_getalias(struct aim_ssi_item *list, const char *gn, const char *bn);
    +char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *bn);
    +gboolean aim_ssi_waitingforauth(struct aim_ssi_item *list, const char *gn, const char *bn);
    +
    +/* Client functions for changing SSI data */
    +int aim_ssi_addbuddy(OscarData *od, const char *name, const char *group, GSList *tlvlist, const char *alias, const char *comment, const char *smsnum, gboolean needauth);
    +int aim_ssi_delbuddy(OscarData *od, const char *name, const char *group);
    +int aim_ssi_delgroup(OscarData *od, const char *group);
    +int aim_ssi_movebuddy(OscarData *od, const char *oldgn, const char *newgn, const char *bn);
    +int aim_ssi_aliasbuddy(OscarData *od, const char *gn, const char *bn, const char *alias);
    +int aim_ssi_editcomment(OscarData *od, const char *gn, const char *bn, const char *alias);
    +int aim_ssi_rename_group(OscarData *od, const char *oldgn, const char *newgn);
    +int aim_ssi_cleanlist(OscarData *od);
    +int aim_ssi_deletelist(OscarData *od);
    +int aim_ssi_setpermdeny(OscarData *od, guint8 permdeny);
    +int aim_ssi_setpresence(OscarData *od, guint32 presence);
    +int aim_ssi_seticon(OscarData *od, const guint8 *iconsum, guint8 iconsumlen);
    +int aim_ssi_delicon(OscarData *od);
    +int aim_ssi_add_to_private_list(OscarData *od, const char* name, guint16 list_type);
    +int aim_ssi_del_from_private_list(OscarData* od, const char* name, guint16 list_type);
    +
    +guint16 aim_ssi_getdenyentrytype(OscarData* od);
    +
    +struct aim_icq_info
    +{
    + guint16 reqid;
    +
    + /* simple */
    + guint32 uin;
    +
    + /* general and "home" information (0x00c8) */
    + char *nick;
    + char *first;
    + char *last;
    + char *email;
    + char *homecity;
    + char *homestate;
    + char *homephone;
    + char *homefax;
    + char *homeaddr;
    + char *mobile;
    + char *homezip;
    + guint16 homecountry;
    +/* guint8 timezone;
    + guint8 hideemail; */
    +
    + /* personal (0x00dc) */
    + guint8 age;
    + guint8 unknown;
    + guint8 gender;
    + char *personalwebpage;
    + guint16 birthyear;
    + guint8 birthmonth;
    + guint8 birthday;
    + guint8 language1;
    + guint8 language2;
    + guint8 language3;
    +
    + /* work (0x00d2) */
    + char *workcity;
    + char *workstate;
    + char *workphone;
    + char *workfax;
    + char *workaddr;
    + char *workzip;
    + guint16 workcountry;
    + char *workcompany;
    + char *workdivision;
    + char *workposition;
    + char *workwebpage;
    +
    + /* additional personal information (0x00e6) */
    + char *info;
    +
    + /* email (0x00eb) */
    + guint16 numaddresses;
    + char **email2;
    +
    + /* status note info */
    + guint8 icbm_cookie[8];
    + char *status_note_title;
    +
    + gboolean for_auth_request;
    + char *auth_request_reason;
    +};
    +
    +int aim_icq_setsecurity(OscarData *od, gboolean auth_required, gboolean webaware);
    +int aim_icq_changepasswd(OscarData *od, const char *passwd);
    +int aim_icq_getalias(OscarData *od, const char *uin, gboolean for_auth_request, char *auth_request_reason);
    +int aim_icq_getallinfo(OscarData *od, const char *uin);
    +int aim_icq_sendsms(OscarData *od, const char *name, const char *msg, const char *alias);
    +
    +
    +/* 0x0017 - family_auth.c */
    +void aim_sendcookie(OscarData *, FlapConnection *, const guint16 length, const guint8 *);
    +void aim_admin_changepasswd(OscarData *, FlapConnection *, const char *newpw, const char *curpw);
    +void aim_admin_reqconfirm(OscarData *od, FlapConnection *conn);
    +void aim_admin_getinfo(OscarData *od, FlapConnection *conn, guint16 info);
    +void aim_admin_setemail(OscarData *od, FlapConnection *conn, const char *newemail);
    +void aim_admin_setnick(OscarData *od, FlapConnection *conn, const char *newnick);
    +
    +
    +
    +/* 0x0018 - family_alert.c */
    +struct aim_emailinfo
    +{
    + guint8 *cookie16;
    + guint8 *cookie8;
    + char *url;
    + guint16 nummsgs;
    + guint8 unread;
    + char *domain;
    + guint16 flag;
    + struct aim_emailinfo *next;
    +};
    +
    +int aim_email_sendcookies(OscarData *od);
    +int aim_email_activate(OscarData *od);
    +
    +
    +
    +/* tlv.c - TLV handling */
    +
    +/* TLV structure */
    +typedef struct aim_tlv_s
    +{
    + guint16 type;
    + guint16 length;
    + guint8 *value;
    +} aim_tlv_t;
    +
    +/* TLV handling functions */
    +char *aim_tlv_getvalue_as_string(aim_tlv_t *tlv);
    +
    +aim_tlv_t *aim_tlv_gettlv(GSList *list, const guint16 type, const int nth);
    +int aim_tlv_getlength(GSList *list, const guint16 type, const int nth);
    +char *aim_tlv_getstr(GSList *list, const guint16 type, const int nth);
    +guint8 aim_tlv_get8(GSList *list, const guint16 type, const int nth);
    +guint16 aim_tlv_get16(GSList *list, const guint16 type, const int nth);
    +guint32 aim_tlv_get32(GSList *list, const guint16 type, const int nth);
    +
    +/* TLV list handling functions */
    +GSList *aim_tlvlist_read(ByteStream *bs);
    +GSList *aim_tlvlist_readnum(ByteStream *bs, guint16 num);
    +GSList *aim_tlvlist_readlen(ByteStream *bs, guint16 len);
    +GSList *aim_tlvlist_copy(GSList *orig);
    +
    +int aim_tlvlist_count(GSList *list);
    +int aim_tlvlist_size(GSList *list);
    +int aim_tlvlist_cmp(GSList *one, GSList *two);
    +int aim_tlvlist_write(ByteStream *bs, GSList **list);
    +void aim_tlvlist_free(GSList *list);
    +
    +int aim_tlvlist_add_raw(GSList **list, const guint16 type, const guint16 length, const guint8 *value);
    +int aim_tlvlist_add_noval(GSList **list, const guint16 type);
    +int aim_tlvlist_add_8(GSList **list, const guint16 type, const guint8 value);
    +int aim_tlvlist_add_16(GSList **list, const guint16 type, const guint16 value);
    +int aim_tlvlist_add_32(GSList **list, const guint16 type, const guint32 value);
    +int aim_tlvlist_add_str(GSList **list, const guint16 type, const char *value);
    +int aim_tlvlist_add_caps(GSList **list, const guint16 type, const guint64 caps, const char *mood);
    +int aim_tlvlist_add_userinfo(GSList **list, guint16 type, aim_userinfo_t *userinfo);
    +int aim_tlvlist_add_chatroom(GSList **list, guint16 type, guint16 exchange, const char *roomname, guint16 instance);
    +int aim_tlvlist_add_frozentlvlist(GSList **list, guint16 type, GSList **tl);
    +
    +int aim_tlvlist_replace_raw(GSList **list, const guint16 type, const guint16 lenth, const guint8 *value);
    +int aim_tlvlist_replace_str(GSList **list, const guint16 type, const char *str);
    +int aim_tlvlist_replace_noval(GSList **list, const guint16 type);
    +int aim_tlvlist_replace_8(GSList **list, const guint16 type, const guint8 value);
    +int aim_tlvlist_replace_16(GSList **list, const guint16 type, const guint16 value);
    +int aim_tlvlist_replace_32(GSList **list, const guint16 type, const guint32 value);
    +
    +void aim_tlvlist_remove(GSList **list, const guint16 type);
    +
    +
    +
    +/* util.c */
    +/* These are really ugly. You'd think this was LISP. I wish it was. */
    +#define aimutil_put8(buf, data) ((*(buf) = (guint8)(data)&0xff),1)
    +#define aimutil_get8(buf) ((*(buf))&0xff)
    +#define aimutil_put16(buf, data) ( \
    + (*(buf) = (guint8)((data)>>8)&0xff), \
    + (*((buf)+1) = (guint8)(data)&0xff), \
    + 2)
    +#define aimutil_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff))
    +#define aimutil_put32(buf, data) ( \
    + (*((buf)) = (guint8)((data)>>24)&0xff), \
    + (*((buf)+1) = (guint8)((data)>>16)&0xff), \
    + (*((buf)+2) = (guint8)((data)>>8)&0xff), \
    + (*((buf)+3) = (guint8)(data)&0xff), \
    + 4)
    +#define aimutil_get32(buf) ((((*(buf))<<24)&0xff000000) + \
    + (((*((buf)+1))<<16)&0x00ff0000) + \
    + (((*((buf)+2))<< 8)&0x0000ff00) + \
    + (((*((buf)+3) )&0x000000ff)))
    +
    +/* Little-endian versions (damn ICQ) */
    +#define aimutil_putle8(buf, data) ( \
    + (*(buf) = (guint8)(data) & 0xff), \
    + 1)
    +#define aimutil_getle8(buf) ( \
    + (*(buf)) & 0xff \
    + )
    +#define aimutil_putle16(buf, data) ( \
    + (*((buf)+0) = (guint8)((data) >> 0) & 0xff), \
    + (*((buf)+1) = (guint8)((data) >> 8) & 0xff), \
    + 2)
    +#define aimutil_getle16(buf) ( \
    + (((*((buf)+0)) << 0) & 0x00ff) + \
    + (((*((buf)+1)) << 8) & 0xff00) \
    + )
    +#define aimutil_putle32(buf, data) ( \
    + (*((buf)+0) = (guint8)((data) >> 0) & 0xff), \
    + (*((buf)+1) = (guint8)((data) >> 8) & 0xff), \
    + (*((buf)+2) = (guint8)((data) >> 16) & 0xff), \
    + (*((buf)+3) = (guint8)((data) >> 24) & 0xff), \
    + 4)
    +#define aimutil_getle32(buf) ( \
    + (((*((buf)+0)) << 0) & 0x000000ff) + \
    + (((*((buf)+1)) << 8) & 0x0000ff00) + \
    + (((*((buf)+2)) << 16) & 0x00ff0000) + \
    + (((*((buf)+3)) << 24) & 0xff000000))
    +
    +const char *oscar_get_msgerr_reason(size_t reason);
    +int oscar_get_ui_info_int(const char *str, int default_value);
    +const char *oscar_get_ui_info_string(const char *str, const char *default_value);
    +gchar *oscar_get_clientstring(void);
    +
    +guint16 aimutil_iconsum(const guint8 *buf, int buflen);
    +
    +gboolean oscar_util_valid_name(const char *bn);
    +gboolean oscar_util_valid_name_icq(const char *bn);
    +gboolean oscar_util_valid_name_sms(const char *bn);
    +int oscar_util_name_compare(const char *bn1, const char *bn2);
    +gchar *oscar_util_format_string(const char *str, const char *name);
    +gchar *oscar_format_buddies(GSList *buddies, const gchar *no_buddies_message);
    +
    +typedef struct {
    + guint16 family;
    + guint16 subtype;
    + guint16 flags;
    + guint32 id;
    +} aim_modsnac_t;
    +
    +#define AIM_MODULENAME_MAXLEN 16
    +#define AIM_MODFLAG_MULTIFAMILY 0x0001
    +typedef struct aim_module_s
    +{
    + guint16 family;
    + guint16 version;
    + guint16 toolid;
    + guint16 toolversion;
    + guint16 flags;
    + char name[AIM_MODULENAME_MAXLEN+1];
    + int (*snachandler)(OscarData *od, FlapConnection *conn, struct aim_module_s *mod, FlapFrame *rx, aim_modsnac_t *snac, ByteStream *bs);
    + void (*shutdown)(OscarData *od, struct aim_module_s *mod);
    + void *priv;
    + struct aim_module_s *next;
    +} aim_module_t;
    +
    +int aim__registermodule(OscarData *od, int (*modfirst)(OscarData *, aim_module_t *));
    +void aim__shutdownmodules(OscarData *od);
    +aim_module_t *aim__findmodulebygroup(OscarData *od, guint16 group);
    +aim_module_t *aim__findmodule(OscarData *od, const char *name);
    +
    +int admin_modfirst(OscarData *od, aim_module_t *mod);
    +int buddylist_modfirst(OscarData *od, aim_module_t *mod);
    +int bos_modfirst(OscarData *od, aim_module_t *mod);
    +int search_modfirst(OscarData *od, aim_module_t *mod);
    +int stats_modfirst(OscarData *od, aim_module_t *mod);
    +int auth_modfirst(OscarData *od, aim_module_t *mod);
    +int msg_modfirst(OscarData *od, aim_module_t *mod);
    +int misc_modfirst(OscarData *od, aim_module_t *mod);
    +int chatnav_modfirst(OscarData *od, aim_module_t *mod);
    +int chat_modfirst(OscarData *od, aim_module_t *mod);
    +int locate_modfirst(OscarData *od, aim_module_t *mod);
    +int service_modfirst(OscarData *od, aim_module_t *mod);
    +int popups_modfirst(OscarData *od, aim_module_t *mod);
    +int bart_modfirst(OscarData *od, aim_module_t *mod);
    +int ssi_modfirst(OscarData *od, aim_module_t *mod);
    +int icq_modfirst(OscarData *od, aim_module_t *mod);
    +int email_modfirst(OscarData *od, aim_module_t *mod);
    +
    +void aim_genericreq_n(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype);
    +void aim_genericreq_n_snacid(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype);
    +void aim_genericreq_l(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype, guint32 *);
    +
    +/* bstream.c */
    +int byte_stream_new(ByteStream *bs, size_t len);
    +int byte_stream_init(ByteStream *bs, guint8 *data, size_t len);
    +void byte_stream_destroy(ByteStream *bs);
    +size_t byte_stream_bytes_left(ByteStream *bs);
    +int byte_stream_curpos(ByteStream *bs);
    +int byte_stream_setpos(ByteStream *bs, size_t off);
    +void byte_stream_rewind(ByteStream *bs);
    +int byte_stream_advance(ByteStream *bs, int n);
    +guint8 byte_stream_get8(ByteStream *bs);
    +guint16 byte_stream_get16(ByteStream *bs);
    +guint32 byte_stream_get32(ByteStream *bs);
    +guint8 byte_stream_getle8(ByteStream *bs);
    +guint16 byte_stream_getle16(ByteStream *bs);
    +guint32 byte_stream_getle32(ByteStream *bs);
    +int byte_stream_getrawbuf(ByteStream *bs, guint8 *buf, size_t len);
    +guint8 *byte_stream_getraw(ByteStream *bs, size_t len);
    +char *byte_stream_getstr(ByteStream *bs, size_t len);
    +int byte_stream_put8(ByteStream *bs, guint8 v);
    +int byte_stream_put16(ByteStream *bs, guint16 v);
    +int byte_stream_put32(ByteStream *bs, guint32 v);
    +int byte_stream_putle8(ByteStream *bs, guint8 v);
    +int byte_stream_putle16(ByteStream *bs, guint16 v);
    +int byte_stream_putle32(ByteStream *bs, guint32 v);
    +int byte_stream_putraw(ByteStream *bs, const guint8 *v, size_t len);
    +int byte_stream_putstr(ByteStream *bs, const char *str);
    +int byte_stream_putbs(ByteStream *bs, ByteStream *srcbs, size_t len);
    +int byte_stream_putuid(ByteStream *bs, OscarData *od);
    +int byte_stream_putcaps(ByteStream *bs, guint64 caps);
    +
    +/**
    + * Inserts a BART asset block into the given byte stream. The flags
    + * and length are set appropriately based on the value of data.
    + */
    +void byte_stream_put_bart_asset(ByteStream *bs, guint16 type, ByteStream *data);
    +
    +/**
    + * A helper function that calls byte_stream_put_bart_asset with the
    + * appropriate data ByteStream given the datastr.
    + */
    +void byte_stream_put_bart_asset_str(ByteStream *bs, guint16 type, const char *datastr);
    +
    +/*
    + * Generic SNAC structure. Rarely if ever used.
    + */
    +typedef struct aim_snac_s {
    + aim_snacid_t id;
    + guint16 family;
    + guint16 type;
    + guint16 flags;
    + void *data;
    + time_t issuetime;
    + struct aim_snac_s *next;
    +} aim_snac_t;
    +
    +/* snac.c */
    +void aim_initsnachash(OscarData *od);
    +aim_snacid_t aim_newsnac(OscarData *, aim_snac_t *newsnac);
    +aim_snacid_t aim_cachesnac(OscarData *od, const guint16 family, const guint16 type, const guint16 flags, const void *data, const int datalen);
    +aim_snac_t *aim_remsnac(OscarData *, aim_snacid_t id);
    +void aim_cleansnacs(OscarData *, int maxage);
    +int aim_putsnac(ByteStream *, guint16 family, guint16 type, aim_snacid_t id);
    +
    +struct chatsnacinfo {
    + guint16 exchange;
    + char name[128];
    + guint16 instance;
    +};
    +
    +struct rateclass {
    + guint16 classid;
    + guint32 windowsize;
    + guint32 clear;
    + guint32 alert;
    + guint32 limit;
    + guint32 disconnect;
    + guint32 current;
    + guint32 max;
    + guint8 dropping_snacs;
    +
    + struct timeval last; /**< The time when we last sent a SNAC of this rate class. */
    +};
    +
    +int aim_cachecookie(OscarData *od, IcbmCookie *cookie);
    +IcbmCookie *aim_uncachecookie(OscarData *od, guint8 *cookie, int type);
    +IcbmCookie *aim_mkcookie(guint8 *, int, void *);
    +IcbmCookie *aim_checkcookie(OscarData *, const unsigned char *, const int);
    +int aim_freecookie(OscarData *od, IcbmCookie *cookie);
    +int aim_cookie_free(OscarData *od, IcbmCookie *cookie);
    +
    +int aim_chat_readroominfo(ByteStream *bs, struct aim_chat_roominfo *outinfo);
    +
    +void flap_connection_destroy_chat(OscarData *od, FlapConnection *conn);
    +
    +/* userinfo.c - displaying user information */
    +
    +void oscar_user_info_append_status(PurpleConnection *gc, PurpleNotifyUserInfo *user_info, PurpleBuddy *b, aim_userinfo_t *userinfo, gboolean use_html_status);
    +void oscar_user_info_append_extra_info(PurpleConnection *gc, PurpleNotifyUserInfo *user_info, PurpleBuddy *b, aim_userinfo_t *userinfo);
    +void oscar_user_info_display_error(OscarData *od, guint16 error_reason, char *buddy);
    +void oscar_user_info_display_icq(OscarData *od, struct aim_icq_info *info);
    +void oscar_user_info_display_aim(OscarData *od, aim_userinfo_t *userinfo);
    +
    +/* authorization.c - OSCAR authorization requests */
    +void oscar_auth_sendrequest(PurpleConnection *gc, const char *name, const char *msg);
    +void oscar_auth_sendrequest_menu(PurpleBlistNode *node, gpointer ignored);
    +void oscar_auth_recvrequest(PurpleConnection *gc, gchar *name, gchar *nick, gchar *reason);
    +
    +void oscar_set_aim_permdeny(PurpleConnection *gc);
    +
    +struct buddyinfo
    +{
    + gboolean typingnot;
    + guint32 ipaddr;
    +
    + unsigned long ico_me_len;
    + unsigned long ico_me_csum;
    + time_t ico_me_time;
    + gboolean ico_informed;
    +
    + unsigned long ico_len;
    + unsigned long ico_csum;
    + time_t ico_time;
    + gboolean ico_need;
    + gboolean ico_sent;
    +};
    +
    +struct name_data
    +{
    + PurpleConnection *gc;
    + gchar *name;
    + gchar *nick;
    +};
    +
    +void oscar_free_name_data(struct name_data *data);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _OSCAR_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/peer.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,282 @@
    +/*
    + * Purple's oscar protocol plugin
    + * This file is the legal property of its developers.
    + * Please see the AUTHORS file distributed alongside this file.
    + *
    + * This library is free software; you can redistribute it and/or
    + * modify it under the terms of the GNU Lesser General Public
    + * License as published by the Free Software Foundation; either
    + * version 2 of the License, or (at your option) any later version.
    + *
    + * This library 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
    + * Lesser General Public License for more details.
    + *
    + * You should have received a copy of the GNU Lesser General Public
    + * License along with this library; if not, write to the Free Software
    + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    +*/
    +
    +/*
    + * OFT and ODC Services
    + */
    +
    +#ifndef _PEER_H_
    +#define _PEER_H_
    +
    +#include "ft.h"
    +#include "network.h"
    +#include "proxy.h"
    +
    +typedef struct _ChecksumData ChecksumData;
    +typedef struct _OdcFrame OdcFrame;
    +typedef struct _OftFrame OftFrame;
    +typedef struct _ProxyFrame ProxyFrame;
    +typedef struct _PeerConnection PeerConnection;
    +
    +#define PEER_CONNECTION_FLAG_INITIATED_BY_ME 0x0001
    +#define PEER_CONNECTION_FLAG_APPROVED 0x0002
    +#define PEER_CONNECTION_FLAG_TRIED_DIRECT 0x0004
    +#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0008
    +#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0010
    +#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0020
    +
    +#define PEER_TYPE_PROMPT 0x0101 /* "I am going to send you this file, is that ok?" */
    +#define PEER_TYPE_RESUMEACCEPT 0x0106 /* We are accepting the resume */
    +#define PEER_TYPE_ACK 0x0202 /* "Yes, it is ok for you to send me that file" */
    +#define PEER_TYPE_DONE 0x0204 /* "I received that file with no problems" or "I already have that file, great!" */
    +#define PEER_TYPE_RESUME 0x0205 /* Resume transferring, sent by whoever receives */
    +#define PEER_TYPE_RESUMEACK 0x0207 /* Our resume accept was ACKed */
    +
    +#define PEER_TYPE_GETFILE_REQUESTLISTING 0x1108 /* "I have a listing.txt file, do you want it?" */
    +#define PEER_TYPE_GETFILE_RECEIVELISTING 0x1209 /* "Yes, please send me your listing.txt file" */
    +#define PEER_TYPE_GETFILE_RECEIVEDLISTING 0x120a /* received corrupt listing.txt file? I'm just guessing about this one... */
    +#define PEER_TYPE_GETFILE_ACKLISTING 0x120b /* "I received the listing.txt file successfully" */
    +#define PEER_TYPE_GETFILE_REQUESTFILE 0x120c /* "Please send me this file" */
    +
    +/*
    + * For peer proxying
    + */
    +#define AIM_PEER_PROXY_SERVER "ars.oscar.aol.com"
    +#define ICQ_PEER_PROXY_SERVER "ars.icq.com"
    +#define PEER_PROXY_PORT 5190 /* The port we should always connect to */
    +#define PEER_PROXY_PACKET_VERSION 0x044a
    +
    +/* Thanks to Keith Lea and the Joust project for documenting these */
    +#define PEER_PROXY_TYPE_ERROR 0x0001
    +#define PEER_PROXY_TYPE_CREATE 0x0002
    +#define PEER_PROXY_TYPE_CREATED 0x0003
    +#define PEER_PROXY_TYPE_JOIN 0x0004
    +#define PEER_PROXY_TYPE_READY 0x0005
    +
    +struct _OdcFrame
    +{
    + /* guchar magic[4]; */ /* 0 */
    + /* guint16 length; */ /* 4 */
    + guint16 type; /* 6 */
    + guint16 subtype; /* 8 */
    + /* Unknown */ /* 10 */
    + guchar cookie[8]; /* 12 */
    + /* Unknown */
    + /* guint32 payloadlength; */ /* 28 */
    + guint16 encoding; /* 32 */
    + /* Unknown */
    + guint16 flags; /* 38 */
    + /* Unknown */
    + guchar bn[32]; /* 44 */
    + /* Unknown */
    + ByteStream payload; /* 76 */
    +};
    +
    +struct _OftFrame
    +{
    + /* guchar magic[4]; */ /* 0 */
    + /* guint16 length; */ /* 4 */
    + guint16 type; /* 6 */
    + guchar cookie[8]; /* 8 */
    + guint16 encrypt; /* 16 */
    + guint16 compress; /* 18 */
    + guint16 totfiles; /* 20 */
    + guint16 filesleft; /* 22 */
    + guint16 totparts; /* 24 */
    + guint16 partsleft; /* 26 */
    + guint32 totsize; /* 28 */
    + guint32 size; /* 32 */
    + guint32 modtime; /* 36 */
    + guint32 checksum; /* 40 */
    + guint32 rfrcsum; /* 44 */
    + guint32 rfsize; /* 48 */
    + guint32 cretime; /* 52 */
    + guint32 rfcsum; /* 56 */
    + guint32 nrecvd; /* 60 */
    + guint32 recvcsum; /* 64 */
    + guchar idstring[32]; /* 68 */
    + guint8 flags; /* 100 */
    + guint8 lnameoffset; /* 101 */
    + guint8 lsizeoffset; /* 102 */
    + guchar dummy[69]; /* 103 */
    + guchar macfileinfo[16]; /* 172 */
    + guint16 nencode; /* 188 */
    + guint16 nlanguage; /* 190 */
    + guchar *name; /* 192 */
    + size_t name_length;
    + /* Payload? */ /* 256 */
    +};
    +
    +struct _ProxyFrame
    +{
    + /* guint16 length; */ /* 0 */
    + guint16 version; /* 2 */
    + guint16 type; /* 4 */
    + guint32 unknown; /* 6 */
    + guint16 flags; /* 10 */
    + ByteStream payload; /* 12 */
    +};
    +
    +struct _PeerConnection
    +{
    + OscarData *od;
    + guint64 type;
    + char *bn;
    + guchar magic[4];
    + guchar cookie[8];
    + guint16 lastrequestnumber;
    +
    + gboolean ready;
    + int flags; /**< Bitmask of PEER_CONNECTION_FLAG_ */
    + time_t lastactivity; /**< Time of last transmit. */
    + guint destroy_timeout;
    + OscarDisconnectReason disconnect_reason;
    + char *error_message;
    +
    + /**
    + * A pointer to either an OdcFrame or an OftFrame.
    + */
    + gpointer frame;
    +
    + /**
    + * This is only used when the peer connection is being established.
    + */
    + PurpleProxyConnectData *client_connect_data;
    + PurpleProxyConnectData *verified_connect_data;
    +
    + /**
    + * This is only used when the peer connection is being established.
    + */
    + PurpleNetworkListenData *listen_data;
    +
    +
    + /**
    + * This is only used when the peer connection is being established.
    + */
    + guint connect_timeout_timer;
    +
    + /**
    + * This is only used while the remote user is attempting to
    + * connect to us.
    + */
    + int listenerfd;
    +
    + int fd;
    + guint8 header[6];
    + gssize header_received;
    + guint8 proxy_header[12];
    + gssize proxy_header_received;
    + ByteStream buffer_incoming;
    + PurpleCircBuffer *buffer_outgoing;
    + guint watcher_incoming;
    + guint watcher_outgoing;
    +
    + /**
    + * IP address of the proxy server, if applicable.
    + */
    + gchar *proxyip;
    +
    + /**
    + * IP address of the remote user from THEIR point of view.
    + */
    + gchar *clientip;
    +
    + /**
    + * IP address of the remote user from the oscar server's
    + * point of view.
    + */
    + gchar *verifiedip;
    +
    + guint16 port;
    + gboolean use_proxy;
    +
    + /**
    + * Checksumming
    + */
    + ChecksumData *checksum_data;
    +
    + /* TODOFT */
    + PurpleXfer *xfer;
    + OftFrame xferdata;
    + guint sending_data_timer;
    +};
    +
    +/*
    + * For all peer connections
    + */
    +
    +/**
    + * Create a new PeerConnection structure and initialize it with some
    + * sane defaults.
    + *
    + * @param type The type of the peer connection. One of
    + * OSCAR_CAPABILITY_DIRECTIM or OSCAR_CAPABILITY_SENDFILE.
    + */
    +PeerConnection *peer_connection_new(OscarData *od, guint64 type, const char *bn);
    +
    +void peer_connection_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    +void peer_connection_schedule_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
    +PeerConnection *peer_connection_find_by_type(OscarData *od, const char *bn, guint64 type);
    +PeerConnection *peer_connection_find_by_cookie(OscarData *od, const char *bn, const guchar *cookie);
    +
    +void peer_connection_listen_cb(gpointer data, gint source, PurpleInputCondition cond);
    +void peer_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond);
    +void peer_connection_send(PeerConnection *conn, ByteStream *bs);
    +
    +void peer_connection_trynext(PeerConnection *conn);
    +void peer_connection_finalize_connection(PeerConnection *conn);
    +void peer_connection_propose(OscarData *od, guint64 type, const char *bn);
    +void peer_connection_got_proposition(OscarData *od, const gchar *bn, const gchar *message, IcbmArgsCh2 *args);
    +
    +/*
    + * For ODC
    + */
    +void peer_odc_close(PeerConnection *conn);
    +void peer_odc_recv_frame(PeerConnection *conn, ByteStream *bs);
    +void peer_odc_send_cookie(PeerConnection *conn);
    +void peer_odc_send_typing(PeerConnection *conn, PurpleTypingState typing);
    +void peer_odc_send_im(PeerConnection *conn, const char *msg, int len, int encoding, gboolean autoreply);
    +
    +/*
    + * For OFT
    + */
    +void peer_oft_close(PeerConnection *conn);
    +void peer_oft_recv_frame(PeerConnection *conn, ByteStream *bs);
    +void peer_oft_send_prompt(PeerConnection *conn);
    +void peer_oft_checksum_destroy(ChecksumData *checksum_data);
    +
    +/* Xfer callbacks for receiving a file */
    +void peer_oft_recvcb_init(PurpleXfer *xfer);
    +void peer_oft_recvcb_end(PurpleXfer *xfer);
    +void peer_oft_recvcb_ack_recv(PurpleXfer *xfer, const guchar *buffer, size_t size);
    +
    +/* Xfer callbacks for sending a file */
    +void peer_oft_sendcb_init(PurpleXfer *xfer);
    +void peer_oft_sendcb_ack(PurpleXfer *xfer, const guchar *buffer, size_t size);
    +
    +/* Xfer callbacks for both sending and receiving */
    +void peer_oft_cb_generic_cancel(PurpleXfer *xfer);
    +
    +/*
    + * For peer proxying
    + */
    +void peer_proxy_connection_established_cb(gpointer data, gint source, const gchar *error_message);
    +
    +#endif /* _PEER_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/plugin.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,740 @@
    +/**
    + * @file plugin.h Plugin API
    + * @ingroup core
    + * @see @ref plugin-signals
    + * @see @ref plugin-ids
    + * @see @ref plugin-i18n
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_PLUGIN_H_
    +#define _PURPLE_PLUGIN_H_
    +
    +#include <glib.h>
    +#include <gmodule.h>
    +#include "signals.h"
    +#include "value.h"
    +
    +/** @copydoc _PurplePlugin */
    +typedef struct _PurplePlugin PurplePlugin;
    +/** @copydoc _PurplePluginInfo */
    +typedef struct _PurplePluginInfo PurplePluginInfo;
    +/** @copydoc _PurplePluginUiInfo */
    +typedef struct _PurplePluginUiInfo PurplePluginUiInfo;
    +/** @copydoc _PurplePluginLoaderInfo */
    +typedef struct _PurplePluginLoaderInfo PurplePluginLoaderInfo;
    +
    +/** @copydoc _PurplePluginAction */
    +typedef struct _PurplePluginAction PurplePluginAction;
    +
    +typedef int PurplePluginPriority; /**< Plugin priority. */
    +
    +#include "pluginpref.h"
    +
    +/**
    + * Plugin types.
    + */
    +typedef enum
    +{
    + PURPLE_PLUGIN_UNKNOWN = -1, /**< Unknown type. */
    + PURPLE_PLUGIN_STANDARD = 0, /**< Standard plugin. */
    + PURPLE_PLUGIN_LOADER, /**< Loader plugin. */
    + PURPLE_PLUGIN_PROTOCOL /**< Protocol plugin. */
    +
    +} PurplePluginType;
    +
    +#define PURPLE_PRIORITY_DEFAULT 0
    +#define PURPLE_PRIORITY_HIGHEST 9999
    +#define PURPLE_PRIORITY_LOWEST -9999
    +
    +#define PURPLE_PLUGIN_FLAG_INVISIBLE 0x01
    +
    +#define PURPLE_PLUGIN_MAGIC 5 /* once we hit 6.0.0 I think we can remove this */
    +
    +/**
    + * Detailed information about a plugin.
    + *
    + * This is used in the version 2.0 API and up.
    + */
    +struct _PurplePluginInfo
    +{
    + unsigned int magic;
    + unsigned int major_version;
    + unsigned int minor_version;
    + PurplePluginType type;
    + char *ui_requirement;
    + unsigned long flags;
    + GList *dependencies;
    + PurplePluginPriority priority;
    +
    + char *id;
    + char *name;
    + char *version;
    + char *summary;
    + char *description;
    + char *author;
    + char *homepage;
    +
    + /**
    + * If a plugin defines a 'load' function, and it returns FALSE,
    + * then the plugin will not be loaded.
    + */
    + gboolean (*load)(PurplePlugin *plugin);
    + gboolean (*unload)(PurplePlugin *plugin);
    + void (*destroy)(PurplePlugin *plugin);
    +
    + void *ui_info; /**< Used only by UI-specific plugins to build a preference screen with a custom UI */
    + void *extra_info;
    + PurplePluginUiInfo *prefs_info; /**< Used by any plugin to display preferences. If #ui_info has been specified, this will be ignored. */
    +
    + /**
    + * This callback has a different use depending on whether this
    + * plugin type is PURPLE_PLUGIN_STANDARD or PURPLE_PLUGIN_PROTOCOL.
    + *
    + * If PURPLE_PLUGIN_STANDARD then the list of actions will show up
    + * in the Tools menu, under a submenu with the name of the plugin.
    + * context will be NULL.
    + *
    + * If PURPLE_PLUGIN_PROTOCOL then the list of actions will show up
    + * in the Accounts menu, under a submenu with the name of the
    + * account. context will be set to the PurpleConnection for that
    + * account. This callback will only be called for online accounts.
    + */
    + GList *(*actions)(PurplePlugin *plugin, gpointer context);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/**
    + * Extra information for loader plugins.
    + */
    +struct _PurplePluginLoaderInfo
    +{
    + GList *exts;
    +
    + gboolean (*probe)(PurplePlugin *plugin);
    + gboolean (*load)(PurplePlugin *plugin);
    + gboolean (*unload)(PurplePlugin *plugin);
    + void (*destroy)(PurplePlugin *plugin);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +/**
    + * A plugin handle.
    + */
    +struct _PurplePlugin
    +{
    + gboolean native_plugin; /**< Native C plugin. */
    + gboolean loaded; /**< The loaded state. */
    + void *handle; /**< The module handle. */
    + char *path; /**< The path to the plugin. */
    + PurplePluginInfo *info; /**< The plugin information. */
    + char *error;
    + void *ipc_data; /**< IPC data. */
    + void *extra; /**< Plugin-specific data. */
    + gboolean unloadable; /**< Unloadable */
    + GList *dependent_plugins; /**< Plugins depending on this */
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +#define PURPLE_PLUGIN_LOADER_INFO(plugin) \
    + ((PurplePluginLoaderInfo *)(plugin)->info->extra_info)
    +
    +struct _PurplePluginUiInfo {
    + PurplePluginPrefFrame *(*get_plugin_pref_frame)(PurplePlugin *plugin);
    +
    + int page_num; /**< Reserved */
    + PurplePluginPrefFrame *frame; /**< Reserved */
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +#define PURPLE_PLUGIN_HAS_PREF_FRAME(plugin) \
    + ((plugin)->info != NULL && (plugin)->info->prefs_info != NULL)
    +
    +#define PURPLE_PLUGIN_UI_INFO(plugin) \
    + ((PurplePluginUiInfo*)(plugin)->info->prefs_info)
    +
    +
    +/**
    + * The structure used in the actions member of PurplePluginInfo
    + */
    +struct _PurplePluginAction {
    + char *label;
    + void (*callback)(PurplePluginAction *);
    +
    + /** set to the owning plugin */
    + PurplePlugin *plugin;
    +
    + /** NULL for plugin actions menu, set to the PurpleConnection for
    + account actions menu */
    + gpointer context;
    +
    + gpointer user_data;
    +};
    +
    +#define PURPLE_PLUGIN_HAS_ACTIONS(plugin) \
    + ((plugin)->info != NULL && (plugin)->info->actions != NULL)
    +
    +#define PURPLE_PLUGIN_ACTIONS(plugin, context) \
    + (PURPLE_PLUGIN_HAS_ACTIONS(plugin)? \
    + (plugin)->info->actions(plugin, context): NULL)
    +
    +
    +/**
    + * Handles the initialization of modules.
    + */
    +#if !defined(PURPLE_PLUGINS) || defined(PURPLE_STATIC_PRPL)
    +# define _FUNC_NAME(x) purple_init_##x##_plugin
    +# define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
    + gboolean _FUNC_NAME(pluginname)(void);\
    + gboolean _FUNC_NAME(pluginname)(void) { \
    + PurplePlugin *plugin = purple_plugin_new(TRUE, NULL); \
    + plugin->info = &(plugininfo); \
    + initfunc((plugin)); \
    + purple_plugin_load((plugin)); \
    + return purple_plugin_register(plugin); \
    + }
    +#else /* PURPLE_PLUGINS && !PURPLE_STATIC_PRPL */
    +# define PURPLE_INIT_PLUGIN(pluginname, initfunc, plugininfo) \
    + G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin); \
    + G_MODULE_EXPORT gboolean purple_init_plugin(PurplePlugin *plugin) { \
    + plugin->info = &(plugininfo); \
    + initfunc((plugin)); \
    + return purple_plugin_register(plugin); \
    + }
    +#endif
    +
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Plugin API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new plugin structure.
    + *
    + * @param native Whether or not the plugin is native.
    + * @param path The path to the plugin, or @c NULL if statically compiled.
    + *
    + * @return A new PurplePlugin structure.
    + */
    +PurplePlugin *purple_plugin_new(gboolean native, const char *path);
    +
    +/**
    + * Probes a plugin, retrieving the information on it and adding it to the
    + * list of available plugins.
    + *
    + * @param filename The plugin's filename.
    + *
    + * @return The plugin handle.
    + *
    + * @see purple_plugin_load()
    + * @see purple_plugin_destroy()
    + */
    +PurplePlugin *purple_plugin_probe(const char *filename);
    +
    +/**
    + * Registers a plugin and prepares it for loading.
    + *
    + * This shouldn't be called by anything but the internal module code.
    + * Plugins should use the PURPLE_INIT_PLUGIN() macro to register themselves
    + * with the core.
    + *
    + * @param plugin The plugin to register.
    + *
    + * @return @c TRUE if the plugin was registered successfully. Otherwise
    + * @c FALSE is returned (this happens if the plugin does not contain
    + * the necessary information).
    + */
    +gboolean purple_plugin_register(PurplePlugin *plugin);
    +
    +/**
    + * Attempts to load a previously probed plugin.
    + *
    + * @param plugin The plugin to load.
    + *
    + * @return @c TRUE if successful, or @c FALSE otherwise.
    + *
    + * @see purple_plugin_reload()
    + * @see purple_plugin_unload()
    + */
    +gboolean purple_plugin_load(PurplePlugin *plugin);
    +
    +/**
    + * Unloads the specified plugin.
    + *
    + * @param plugin The plugin handle.
    + *
    + * @return @c TRUE if successful, or @c FALSE otherwise.
    + *
    + * @see purple_plugin_load()
    + * @see purple_plugin_reload()
    + */
    +gboolean purple_plugin_unload(PurplePlugin *plugin);
    +
    +/**
    + * Disable a plugin.
    + *
    + * This function adds the plugin to a list of plugins to "disable at the next
    + * startup" by excluding said plugins from the list of plugins to save. The
    + * UI needs to call purple_plugins_save_loaded() after calling this for it
    + * to have any effect.
    + *
    + * @since 2.3.0
    + */
    +void purple_plugin_disable(PurplePlugin *plugin);
    +
    +/**
    + * Reloads a plugin.
    + *
    + * @param plugin The old plugin handle.
    + *
    + * @return @c TRUE if successful, or @c FALSE otherwise.
    + *
    + * @see purple_plugin_load()
    + * @see purple_plugin_unload()
    + */
    +gboolean purple_plugin_reload(PurplePlugin *plugin);
    +
    +/**
    + * Unloads a plugin and destroys the structure from memory.
    + *
    + * @param plugin The plugin handle.
    + */
    +void purple_plugin_destroy(PurplePlugin *plugin);
    +
    +/**
    + * Returns whether or not a plugin is currently loaded.
    + *
    + * @param plugin The plugin.
    + *
    + * @return @c TRUE if loaded, or @c FALSE otherwise.
    + */
    +gboolean purple_plugin_is_loaded(const PurplePlugin *plugin);
    +
    +/**
    + * Returns whether or not a plugin is unloadable.
    + *
    + * If this returns @c TRUE, the plugin is guaranteed to not
    + * be loadable. However, a return value of @c FALSE does not
    + * guarantee the plugin is loadable.
    + *
    + * @param plugin The plugin.
    + *
    + * @return @c TRUE if the plugin is known to be unloadable,\
    + * @c FALSE otherwise
    + */
    +gboolean purple_plugin_is_unloadable(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's id.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's id.
    + */
    +const gchar *purple_plugin_get_id(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's name.
    + *
    + * @param plugin The plugin.
    + *
    + * @return THe name of the plugin, or @c NULL.
    + */
    +const gchar *purple_plugin_get_name(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's version.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's version or @c NULL.
    + */
    +const gchar *purple_plugin_get_version(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's summary.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's summary.
    + */
    +const gchar *purple_plugin_get_summary(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's description.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's description.
    + */
    +const gchar *purple_plugin_get_description(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's author.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's author.
    + */
    +const gchar *purple_plugin_get_author(const PurplePlugin *plugin);
    +
    +/**
    + * Returns a plugin's homepage.
    + *
    + * @param plugin The plugin.
    + *
    + * @return The plugin's homepage.
    + */
    +const gchar *purple_plugin_get_homepage(const PurplePlugin *plugin);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Plugin IPC API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Registers an IPC command in a plugin.
    + *
    + * @param plugin The plugin to register the command with.
    + * @param command The name of the command.
    + * @param func The function to execute.
    + * @param marshal The marshalling function.
    + * @param ret_value The return value type.
    + * @param num_params The number of parameters.
    + * @param ... The parameter types.
    + *
    + * @return TRUE if the function was registered successfully, or
    + * FALSE otherwise.
    + */
    +gboolean purple_plugin_ipc_register(PurplePlugin *plugin, const char *command,
    + PurpleCallback func,
    + PurpleSignalMarshalFunc marshal,
    + PurpleValue *ret_value, int num_params, ...);
    +
    +/**
    + * Unregisters an IPC command in a plugin.
    + *
    + * @param plugin The plugin to unregister the command from.
    + * @param command The name of the command.
    + */
    +void purple_plugin_ipc_unregister(PurplePlugin *plugin, const char *command);
    +
    +/**
    + * Unregisters all IPC commands in a plugin.
    + *
    + * @param plugin The plugin to unregister the commands from.
    + */
    +void purple_plugin_ipc_unregister_all(PurplePlugin *plugin);
    +
    +/**
    + * Returns a list of value types used for an IPC command.
    + *
    + * @param plugin The plugin.
    + * @param command The name of the command.
    + * @param ret_value The returned return value.
    + * @param num_params The returned number of parameters.
    + * @param params The returned list of parameters.
    + *
    + * @return TRUE if the command was found, or FALSE otherwise.
    + */
    +gboolean purple_plugin_ipc_get_params(PurplePlugin *plugin, const char *command,
    + PurpleValue **ret_value, int *num_params,
    + PurpleValue ***params);
    +
    +/**
    + * Executes an IPC command.
    + *
    + * @param plugin The plugin to execute the command on.
    + * @param command The name of the command.
    + * @param ok TRUE if the call was successful, or FALSE otherwise.
    + * @param ... The parameters to pass.
    + *
    + * @return The return value, which will be NULL if the command doesn't
    + * return a value.
    + */
    +void *purple_plugin_ipc_call(PurplePlugin *plugin, const char *command,
    + gboolean *ok, ...);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Plugins API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Add a new directory to search for plugins
    + *
    + * @param path The new search path.
    + */
    +void purple_plugins_add_search_path(const char *path);
    +
    +/**
    + * Returns a list of plugin search paths.
    + *
    + * @constreturn A list of searched paths.
    + *
    + * @since 2.6.0
    + */
    +GList *purple_plugins_get_search_paths(void);
    +
    +/**
    + * Unloads all loaded plugins.
    + */
    +void purple_plugins_unload_all(void);
    +
    +/**
    + * Unloads all plugins of a specific type.
    + */
    +void purple_plugins_unload(PurplePluginType type);
    +
    +/**
    + * Destroys all registered plugins.
    + */
    +void purple_plugins_destroy_all(void);
    +
    +/**
    + * Saves the list of loaded plugins to the specified preference key
    + *
    + * @param key The preference key to save the list of plugins to.
    + */
    +void purple_plugins_save_loaded(const char *key);
    +
    +/**
    + * Attempts to load all the plugins in the specified preference key
    + * that were loaded when purple last quit.
    + *
    + * @param key The preference key containing the list of plugins.
    + */
    +void purple_plugins_load_saved(const char *key);
    +
    +/**
    + * Probes for plugins in the registered module paths.
    + *
    + * @param ext The extension type to probe for, or @c NULL for all.
    + *
    + * @see purple_plugin_set_probe_path()
    + */
    +void purple_plugins_probe(const char *ext);
    +
    +/**
    + * Returns whether or not plugin support is enabled.
    + *
    + * @return TRUE if plugin support is enabled, or FALSE otherwise.
    + */
    +gboolean purple_plugins_enabled(void);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Registers a function that will be called when probing is finished.
    + *
    + * @param func The callback function.
    + * @param data Data to pass to the callback.
    + * @deprecated If you need this, ask for a plugin-probe signal to be added.
    + */
    +void purple_plugins_register_probe_notify_cb(void (*func)(void *), void *data);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Unregisters a function that would be called when probing is finished.
    + *
    + * @param func The callback function.
    + * @deprecated If you need this, ask for a plugin-probe signal to be added.
    + */
    +void purple_plugins_unregister_probe_notify_cb(void (*func)(void *));
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Registers a function that will be called when a plugin is loaded.
    + *
    + * @param func The callback function.
    + * @param data Data to pass to the callback.
    + * @deprecated Use the plugin-load signal instead.
    + */
    +void purple_plugins_register_load_notify_cb(void (*func)(PurplePlugin *, void *),
    + void *data);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Unregisters a function that would be called when a plugin is loaded.
    + *
    + * @param func The callback function.
    + * @deprecated Use the plugin-load signal instead.
    + */
    +void purple_plugins_unregister_load_notify_cb(void (*func)(PurplePlugin *, void *));
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Registers a function that will be called when a plugin is unloaded.
    + *
    + * @param func The callback function.
    + * @param data Data to pass to the callback.
    + * @deprecated Use the plugin-unload signal instead.
    + */
    +void purple_plugins_register_unload_notify_cb(void (*func)(PurplePlugin *, void *),
    + void *data);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PLUGIN_C_)
    +/**
    + * Unregisters a function that would be called when a plugin is unloaded.
    + *
    + * @param func The callback function.
    + * @deprecated Use the plugin-unload signal instead.
    + */
    +void purple_plugins_unregister_unload_notify_cb(void (*func)(PurplePlugin *,
    + void *));
    +#endif
    +
    +/**
    + * Finds a plugin with the specified name.
    + *
    + * @param name The plugin name.
    + *
    + * @return The plugin if found, or @c NULL if not found.
    + */
    +PurplePlugin *purple_plugins_find_with_name(const char *name);
    +
    +/**
    + * Finds a plugin with the specified filename (filename with a path).
    + *
    + * @param filename The plugin filename.
    + *
    + * @return The plugin if found, or @c NULL if not found.
    + */
    +PurplePlugin *purple_plugins_find_with_filename(const char *filename);
    +
    +/**
    + * Finds a plugin with the specified basename (filename without a path).
    + *
    + * @param basename The plugin basename.
    + *
    + * @return The plugin if found, or @c NULL if not found.
    + */
    +PurplePlugin *purple_plugins_find_with_basename(const char *basename);
    +
    +/**
    + * Finds a plugin with the specified plugin ID.
    + *
    + * @param id The plugin ID.
    + *
    + * @return The plugin if found, or @c NULL if not found.
    + */
    +PurplePlugin *purple_plugins_find_with_id(const char *id);
    +
    +/**
    + * Returns a list of all loaded plugins.
    + *
    + * @constreturn A list of all loaded plugins.
    + */
    +GList *purple_plugins_get_loaded(void);
    +
    +/**
    + * Returns a list of all valid protocol plugins. A protocol
    + * plugin is considered invalid if it does not contain the call
    + * to the PURPLE_INIT_PLUGIN() macro, or if it was compiled
    + * against an incompatable API version.
    + *
    + * @constreturn A list of all protocol plugins.
    + */
    +GList *purple_plugins_get_protocols(void);
    +
    +/**
    + * Returns a list of all plugins, whether loaded or not.
    + *
    + * @constreturn A list of all plugins.
    + */
    +GList *purple_plugins_get_all(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Plugins SubSytem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the plugin subsystem handle.
    + *
    + * @return The plugin sybsystem handle.
    + */
    +void *purple_plugins_get_handle(void);
    +
    +/**
    + * Initializes the plugin subsystem
    + */
    +void purple_plugins_init(void);
    +
    +/**
    + * Uninitializes the plugin subsystem
    + */
    +void purple_plugins_uninit(void);
    +
    +/*@}*/
    +
    +/**
    + * Allocates and returns a new PurplePluginAction.
    + *
    + * @param label The description of the action to show to the user.
    + * @param callback The callback to call when the user selects this action.
    + */
    +PurplePluginAction *purple_plugin_action_new(const char* label, void (*callback)(PurplePluginAction *));
    +
    +/**
    + * Frees a PurplePluginAction
    + *
    + * @param action The PurplePluginAction to free.
    + */
    +void purple_plugin_action_free(PurplePluginAction *action);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_PLUGIN_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/pluginpref.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,269 @@
    +/**
    + * @file pluginpref.h Plugin Preferences 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
    + *
    + */
    +#ifndef _PURPLE_PLUGINPREF_H_
    +#define _PURPLE_PLUGINPREF_H_
    +
    +typedef struct _PurplePluginPrefFrame PurplePluginPrefFrame;
    +typedef struct _PurplePluginPref PurplePluginPref;
    +
    +/**
    + * String format for preferences.
    + */
    +typedef enum
    +{
    + PURPLE_STRING_FORMAT_TYPE_NONE = 0, /**< The string is plain text. */
    + PURPLE_STRING_FORMAT_TYPE_MULTILINE = 1 << 0, /**< The string can have newlines. */
    + PURPLE_STRING_FORMAT_TYPE_HTML = 1 << 1 /**< The string can be in HTML. */
    +} PurpleStringFormatType;
    +
    +typedef enum {
    + PURPLE_PLUGIN_PREF_NONE,
    + PURPLE_PLUGIN_PREF_CHOICE,
    + PURPLE_PLUGIN_PREF_INFO, /**< no-value label */
    + PURPLE_PLUGIN_PREF_STRING_FORMAT /**< The preference has a string value. */
    +} PurplePluginPrefType;
    +
    +#include <glib.h>
    +#include "prefs.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Plugin Preference API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Create a new plugin preference frame
    + *
    + * @return a new PurplePluginPrefFrame
    + */
    +PurplePluginPrefFrame *purple_plugin_pref_frame_new(void);
    +
    +/**
    + * Destroy a plugin preference frame
    + *
    + * @param frame The plugin frame to destroy
    + */
    +void purple_plugin_pref_frame_destroy(PurplePluginPrefFrame *frame);
    +
    +/**
    + * Adds a plugin preference to a plugin preference frame
    + *
    + * @param frame The plugin frame to add the preference to
    + * @param pref The preference to add to the frame
    + */
    +void purple_plugin_pref_frame_add(PurplePluginPrefFrame *frame, PurplePluginPref *pref);
    +
    +/**
    + * Get the plugin preferences from a plugin preference frame
    + *
    + * @param frame The plugin frame to get the plugin preferences from
    + * @constreturn a GList of plugin preferences
    + */
    +GList *purple_plugin_pref_frame_get_prefs(PurplePluginPrefFrame *frame);
    +
    +/**
    + * Create a new plugin preference
    + *
    + * @return a new PurplePluginPref
    + */
    +PurplePluginPref *purple_plugin_pref_new(void);
    +
    +/**
    + * Create a new plugin preference with name
    + *
    + * @param name The name of the pref
    + * @return a new PurplePluginPref
    + */
    +PurplePluginPref *purple_plugin_pref_new_with_name(const char *name);
    +
    +/**
    + * Create a new plugin preference with label
    + *
    + * @param label The label to be displayed
    + * @return a new PurplePluginPref
    + */
    +PurplePluginPref *purple_plugin_pref_new_with_label(const char *label);
    +
    +/**
    + * Create a new plugin preference with name and label
    + *
    + * @param name The name of the pref
    + * @param label The label to be displayed
    + * @return a new PurplePluginPref
    + */
    +PurplePluginPref *purple_plugin_pref_new_with_name_and_label(const char *name, const char *label);
    +
    +/**
    + * Destroy a plugin preference
    + *
    + * @param pref The preference to destroy
    + */
    +void purple_plugin_pref_destroy(PurplePluginPref *pref);
    +
    +/**
    + * Set a plugin pref name
    + *
    + * @param pref The plugin pref
    + * @param name The name of the pref
    + */
    +void purple_plugin_pref_set_name(PurplePluginPref *pref, const char *name);
    +
    +/**
    + * Get a plugin pref name
    + *
    + * @param pref The plugin pref
    + * @return The name of the pref
    + */
    +const char *purple_plugin_pref_get_name(PurplePluginPref *pref);
    +
    +/**
    + * Set a plugin pref label
    + *
    + * @param pref The plugin pref
    + * @param label The label for the plugin pref
    + */
    +void purple_plugin_pref_set_label(PurplePluginPref *pref, const char *label);
    +
    +/**
    + * Get a plugin pref label
    + *
    + * @param pref The plugin pref
    + * @return The label for the plugin pref
    + */
    +const char *purple_plugin_pref_get_label(PurplePluginPref *pref);
    +
    +/**
    + * Set the bounds for an integer pref
    + *
    + * @param pref The plugin pref
    + * @param min The min value
    + * @param max The max value
    + */
    +void purple_plugin_pref_set_bounds(PurplePluginPref *pref, int min, int max);
    +
    +/**
    + * Get the bounds for an integer pref
    + *
    + * @param pref The plugin pref
    + * @param min The min value
    + * @param max The max value
    + */
    +void purple_plugin_pref_get_bounds(PurplePluginPref *pref, int *min, int *max);
    +
    +/**
    + * Set the type of a plugin pref
    + *
    + * @param pref The plugin pref
    + * @param type The type
    + */
    +void purple_plugin_pref_set_type(PurplePluginPref *pref, PurplePluginPrefType type);
    +
    +/**
    + * Get the type of a plugin pref
    + *
    + * @param pref The plugin pref
    + * @return The type
    + */
    +PurplePluginPrefType purple_plugin_pref_get_type(PurplePluginPref *pref);
    +
    +/**
    + * Set the choices for a choices plugin pref
    + *
    + * @param pref The plugin pref
    + * @param label The label for the choice
    + * @param choice A gpointer of the choice
    + */
    +void purple_plugin_pref_add_choice(PurplePluginPref *pref, const char *label, gpointer choice);
    +
    +/**
    + * Get the choices for a choices plugin pref
    + *
    + * @param pref The plugin pref
    + * @constreturn GList of the choices
    + */
    +GList *purple_plugin_pref_get_choices(PurplePluginPref *pref);
    +
    +/**
    + * Set the max length for a string plugin pref
    + *
    + * @param pref The plugin pref
    + * @param max_length The max length of the string
    + */
    +void purple_plugin_pref_set_max_length(PurplePluginPref *pref, unsigned int max_length);
    +
    +/**
    + * Get the max length for a string plugin pref
    + *
    + * @param pref The plugin pref
    + * @return the max length
    + */
    +unsigned int purple_plugin_pref_get_max_length(PurplePluginPref *pref);
    +
    +/**
    + * Sets the masking of a string plugin pref
    + *
    + * @param pref The plugin pref
    + * @param mask The value to set
    + */
    +void purple_plugin_pref_set_masked(PurplePluginPref *pref, gboolean mask);
    +
    +/**
    + * Gets the masking of a string plugin pref
    + *
    + * @param pref The plugin pref
    + * @return The masking
    + */
    +gboolean purple_plugin_pref_get_masked(PurplePluginPref *pref);
    +
    +/**
    + * Sets the format type for a formattable-string plugin pref. You need to set the
    + * pref type to PURPLE_PLUGIN_PREF_STRING_FORMAT first before setting the format.
    + *
    + * @param pref The plugin pref
    + * @param format The format of the string
    + */
    +void purple_plugin_pref_set_format_type(PurplePluginPref *pref, PurpleStringFormatType format);
    +
    +/**
    + * Gets the format type of the formattable-string plugin pref.
    + *
    + * @param pref The plugin pref
    + * @return The format of the pref
    + */
    +PurpleStringFormatType purple_plugin_pref_get_format_type(PurplePluginPref *pref);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_PLUGINPREF_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/pounce.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,389 @@
    +/**
    + * @file pounce.h Buddy Pounce 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
    + */
    +#ifndef _PURPLE_POUNCE_H_
    +#define _PURPLE_POUNCE_H_
    +
    +typedef struct _PurplePounce PurplePounce;
    +
    +#include <glib.h>
    +#include "account.h"
    +
    +/**
    + * Events that trigger buddy pounces.
    + */
    +typedef enum
    +{
    + PURPLE_POUNCE_NONE = 0x000, /**< No events. */
    + PURPLE_POUNCE_SIGNON = 0x001, /**< The buddy signed on. */
    + PURPLE_POUNCE_SIGNOFF = 0x002, /**< The buddy signed off. */
    + PURPLE_POUNCE_AWAY = 0x004, /**< The buddy went away. */
    + PURPLE_POUNCE_AWAY_RETURN = 0x008, /**< The buddy returned from away. */
    + PURPLE_POUNCE_IDLE = 0x010, /**< The buddy became idle. */
    + PURPLE_POUNCE_IDLE_RETURN = 0x020, /**< The buddy is no longer idle. */
    + PURPLE_POUNCE_TYPING = 0x040, /**< The buddy started typing. */
    + PURPLE_POUNCE_TYPED = 0x080, /**< The buddy has entered text. */
    + PURPLE_POUNCE_TYPING_STOPPED = 0x100, /**< The buddy stopped typing. */
    + PURPLE_POUNCE_MESSAGE_RECEIVED = 0x200 /**< The buddy sent a message */
    +
    +} PurplePounceEvent;
    +
    +typedef enum
    +{
    + PURPLE_POUNCE_OPTION_NONE = 0x00, /**< No Option */
    + PURPLE_POUNCE_OPTION_AWAY = 0x01 /**< Pounce only when away */
    +} PurplePounceOption;
    +
    +/** A pounce callback. */
    +typedef void (*PurplePounceCb)(PurplePounce *, PurplePounceEvent, void *);
    +
    +/**
    + * A buddy pounce structure.
    + *
    + * Buddy pounces are actions triggered by a buddy-related event. For
    + * example, a sound can be played or an IM window opened when a buddy
    + * signs on or returns from away. Such responses are handled in the
    + * UI. The events themselves are done in the core.
    + */
    +struct _PurplePounce
    +{
    + char *ui_type; /**< The type of UI. */
    +
    + PurplePounceEvent events; /**< The event(s) to pounce on. */
    + PurplePounceOption options; /**< The pounce options */
    + PurpleAccount *pouncer; /**< The user who is pouncing. */
    +
    + char *pouncee; /**< The buddy to pounce on. */
    +
    + GHashTable *actions; /**< The registered actions. */
    +
    + gboolean save; /**< Whether or not the pounce should
    + be saved after activation. */
    + void *data; /**< Pounce-specific data. */
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Buddy Pounce API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new buddy pounce.
    + *
    + * @param ui_type The type of UI the pounce is for.
    + * @param pouncer The account that will pounce.
    + * @param pouncee The buddy to pounce on.
    + * @param event The event(s) to pounce on.
    + * @param option Pounce options.
    + *
    + * @return The new buddy pounce structure.
    + */
    +PurplePounce *purple_pounce_new(const char *ui_type, PurpleAccount *pouncer,
    + const char *pouncee, PurplePounceEvent event,
    + PurplePounceOption option);
    +
    +/**
    + * Destroys a buddy pounce.
    + *
    + * @param pounce The buddy pounce.
    + */
    +void purple_pounce_destroy(PurplePounce *pounce);
    +
    +/**
    + * Destroys all buddy pounces for the account
    + *
    + * @param account The account to remove all pounces from.
    + */
    +void purple_pounce_destroy_all_by_account(PurpleAccount *account);
    +
    +/**
    + * Destroys all buddy pounces for a buddy
    + *
    + * @param buddy The buddy whose pounces are to be removed
    + *
    + * @since 2.8.0
    + */
    +void purple_pounce_destroy_all_by_buddy(PurpleBuddy *buddy);
    +
    +/**
    + * Sets the events a pounce should watch for.
    + *
    + * @param pounce The buddy pounce.
    + * @param events The events to watch for.
    + */
    +void purple_pounce_set_events(PurplePounce *pounce, PurplePounceEvent events);
    +
    +/**
    + * Sets the options for a pounce.
    + *
    + * @param pounce The buddy pounce.
    + * @param options The options for the pounce.
    + */
    +void purple_pounce_set_options(PurplePounce *pounce, PurplePounceOption options);
    +
    +/**
    + * Sets the account that will do the pouncing.
    + *
    + * @param pounce The buddy pounce.
    + * @param pouncer The account that will pounce.
    + */
    +void purple_pounce_set_pouncer(PurplePounce *pounce, PurpleAccount *pouncer);
    +
    +/**
    + * Sets the buddy a pounce should pounce on.
    + *
    + * @param pounce The buddy pounce.
    + * @param pouncee The buddy to pounce on.
    + */
    +void purple_pounce_set_pouncee(PurplePounce *pounce, const char *pouncee);
    +
    +/**
    + * Sets whether or not the pounce should be saved after execution.
    + *
    + * @param pounce The buddy pounce.
    + * @param save @c TRUE if the pounce should be saved, or @c FALSE otherwise.
    + */
    +void purple_pounce_set_save(PurplePounce *pounce, gboolean save);
    +
    +/**
    + * Registers an action type for the pounce.
    + *
    + * @param pounce The buddy pounce.
    + * @param name The action name.
    + */
    +void purple_pounce_action_register(PurplePounce *pounce, const char *name);
    +
    +/**
    + * Enables or disables an action for a pounce.
    + *
    + * @param pounce The buddy pounce.
    + * @param action The name of the action.
    + * @param enabled The enabled state.
    + */
    +void purple_pounce_action_set_enabled(PurplePounce *pounce, const char *action,
    + gboolean enabled);
    +
    +/**
    + * Sets a value for an attribute in an action.
    + *
    + * If @a value is @c NULL, the value will be unset.
    + *
    + * @param pounce The buddy pounce.
    + * @param action The action name.
    + * @param attr The attribute name.
    + * @param value The value.
    + */
    +void purple_pounce_action_set_attribute(PurplePounce *pounce, const char *action,
    + const char *attr, const char *value);
    +
    +/**
    + * Sets the pounce-specific data.
    + *
    + * @param pounce The buddy pounce.
    + * @param data Data specific to the pounce.
    + */
    +void purple_pounce_set_data(PurplePounce *pounce, void *data);
    +
    +/**
    + * Returns the events a pounce should watch for.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return The events the pounce is watching for.
    + */
    +PurplePounceEvent purple_pounce_get_events(const PurplePounce *pounce);
    +
    +/**
    + * Returns the options for a pounce.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return The options for the pounce.
    + */
    +PurplePounceOption purple_pounce_get_options(const PurplePounce *pounce);
    +
    +/**
    + * Returns the account that will do the pouncing.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return The account that will pounce.
    + */
    +PurpleAccount *purple_pounce_get_pouncer(const PurplePounce *pounce);
    +
    +/**
    + * Returns the buddy a pounce should pounce on.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return The buddy to pounce on.
    + */
    +const char *purple_pounce_get_pouncee(const PurplePounce *pounce);
    +
    +/**
    + * Returns whether or not the pounce should save after execution.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return @c TRUE if the pounce should be saved after execution, or
    + * @c FALSE otherwise.
    + */
    +gboolean purple_pounce_get_save(const PurplePounce *pounce);
    +
    +/**
    + * Returns whether or not an action is enabled.
    + *
    + * @param pounce The buddy pounce.
    + * @param action The action name.
    + *
    + * @return @c TRUE if the action is enabled, or @c FALSE otherwise.
    + */
    +gboolean purple_pounce_action_is_enabled(const PurplePounce *pounce,
    + const char *action);
    +
    +/**
    + * Returns the value for an attribute in an action.
    + *
    + * @param pounce The buddy pounce.
    + * @param action The action name.
    + * @param attr The attribute name.
    + *
    + * @return The attribute value, if it exists, or @c NULL.
    + */
    +const char *purple_pounce_action_get_attribute(const PurplePounce *pounce,
    + const char *action,
    + const char *attr);
    +
    +/**
    + * Returns the pounce-specific data.
    + *
    + * @param pounce The buddy pounce.
    + *
    + * @return The data specific to a buddy pounce.
    + */
    +void *purple_pounce_get_data(const PurplePounce *pounce);
    +
    +/**
    + * Executes a pounce with the specified pouncer, pouncee, and event type.
    + *
    + * @param pouncer The account that will do the pouncing.
    + * @param pouncee The buddy that is being pounced.
    + * @param events The events that triggered the pounce.
    + */
    +void purple_pounce_execute(const PurpleAccount *pouncer, const char *pouncee,
    + PurplePounceEvent events);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Buddy Pounce Subsystem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Finds a pounce with the specified event(s) and buddy.
    + *
    + * @param pouncer The account to match against.
    + * @param pouncee The buddy to match against.
    + * @param events The event(s) to match against.
    + *
    + * @return The pounce if found, or @c NULL otherwise.
    + */
    +PurplePounce *purple_find_pounce(const PurpleAccount *pouncer,
    + const char *pouncee, PurplePounceEvent events);
    +
    +
    +/**
    + * Loads the pounces.
    + *
    + * @return @c TRUE if the pounces could be loaded.
    + */
    +gboolean purple_pounces_load(void);
    +
    +/**
    + * Registers a pounce handler for a UI.
    + *
    + * @param ui The UI name.
    + * @param cb The callback function.
    + * @param new_pounce The function called when a pounce is created.
    + * @param free_pounce The function called when a pounce is freed.
    + */
    +void purple_pounces_register_handler(const char *ui, PurplePounceCb cb,
    + void (*new_pounce)(PurplePounce *pounce),
    + void (*free_pounce)(PurplePounce *pounce));
    +
    +/**
    + * Unregisters a pounce handle for a UI.
    + *
    + * @param ui The UI name.
    + */
    +void purple_pounces_unregister_handler(const char *ui);
    +
    +/**
    + * Returns a list of all registered buddy pounces.
    + *
    + * @constreturn The list of buddy pounces.
    + */
    +GList *purple_pounces_get_all(void);
    +
    +/**
    + * Returns a list of registered buddy pounces for the ui-type.
    + *
    + * @param ui The ID of the UI using the core.
    + *
    + * @return The list of buddy pounces. The list should be freed by
    + * the caller when it's no longer used.
    + * @since 2.1.0
    + */
    +GList *purple_pounces_get_all_for_ui(const char *ui);
    +
    +/**
    + * Returns the buddy pounce subsystem handle.
    + *
    + * @return The subsystem handle.
    + */
    +void *purple_pounces_get_handle(void);
    +
    +/**
    + * Initializes the pounces subsystem.
    + */
    +void purple_pounces_init(void);
    +
    +/**
    + * Uninitializes the pounces subsystem.
    + */
    +void purple_pounces_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_POUNCE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/prefs.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,485 @@
    +/**
    + * @file prefs.h Prefs 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
    + *
    + */
    +#ifndef _PURPLE_PREFS_H_
    +#define _PURPLE_PREFS_H_
    +
    +#include <glib.h>
    +
    +/**
    + * Preference data types.
    + */
    +typedef enum _PurplePrefType
    +{
    + PURPLE_PREF_NONE, /**< No type. */
    + PURPLE_PREF_BOOLEAN, /**< Boolean. */
    + PURPLE_PREF_INT, /**< Integer. */
    + PURPLE_PREF_STRING, /**< String. */
    + PURPLE_PREF_STRING_LIST, /**< List of strings. */
    + PURPLE_PREF_PATH, /**< Path. */
    + PURPLE_PREF_PATH_LIST /**< List of paths. */
    +
    +} PurplePrefType;
    +
    +/**
    + * The type of callbacks for preference changes.
    + *
    + * @param name the name of the preference which has changed.
    + * @param type the type of the preferenced named @a name
    + * @param val the new value of the preferencs; should be cast to the correct
    + * type. For instance, to recover the value of a #PURPLE_PREF_INT
    + * preference, use <tt>GPOINTER_TO_INT(val)</tt>. Alternatively,
    + * just call purple_prefs_get_int(), purple_prefs_get_string_list()
    + * etc.
    + * @param data Arbitrary data specified when the callback was connected with
    + * purple_prefs_connect_callback().
    + *
    + * @see purple_prefs_connect_callback()
    + */
    +typedef void (*PurplePrefCallback) (const char *name, PurplePrefType type,
    + gconstpointer val, gpointer data);
    +
    +/**
    + * Opaque type to carry callback information
    + *
    + * @since 2.11.0
    + */
    +typedef struct _PurplePrefCallbackData PurplePrefCallbackData;
    +
    +
    +/** @copydoc _PurplePrefsUiOps */
    +typedef struct _PurplePrefsUiOps PurplePrefsUiOps;
    +
    +
    +/**
    + * Prefs UI operations. This allows overriding the prefs.xml storage with
    + * anything else.
    + *
    + * Unless specified otherwise, each entry provides an implementation for the
    + * corresponding purple_prefs_* method, and disables the prefs.xml code for it.
    + * This means that to do anything useful, all the methods must be implemented.
    + *
    + * @since 2.11.0
    + */
    +struct _PurplePrefsUiOps
    +{
    + void (*add_none)(const char *name);
    + void (*add_bool)(const char *name, gboolean value);
    + void (*add_int)(const char *name, int value);
    + void (*add_string)(const char *name, const char *value);
    + void (*add_string_list)(const char *name, GList *value);
    +
    + void (*set_bool)(const char *name, gboolean value);
    + void (*set_int)(const char *name, int value);
    + void (*set_string)(const char *name, const char *value);
    + void (*set_string_list)(const char *name, GList *value);
    +
    + gboolean (*get_bool)(const char *name);
    + int (*get_int)(const char *name);
    + const char *(*get_string)(const char *name);
    + GList *(*get_string_list)(const char *name);
    +
    + PurplePrefType (*get_type)(const char *name);
    + GList *(*get_children_names)(const char *name);
    +
    + gboolean (*exists)(const char *name);
    + void (*remove)(const char *name);
    +
    + void (*rename)(const char *oldname, const char *newname);
    + void (*rename_boolean_toggle)(const char *oldname, const char *newname);
    +
    + gboolean (*load)(void);
    + void (*save)(void);
    + void (*schedule_save)(void);
    +
    + /**
    + * Called when a callback is added to a preference. The UI must keep
    + * track of it and call #purple_prefs_trigger_callback_object with the
    + * data attribute.
    + *
    + * @param name The preference name.
    + * @param data The object to be passed when triggering the callback
    + * @return A pointer to a ui_data object.
    + * */
    + void *(*connect_callback)(const char *name, PurplePrefCallbackData *data);
    +
    + /**
    + * Called when a callback is removed from a preference. The ui_data
    + * object is the one returned from connect_callback.
    + *
    + * @param name The preference name
    + * @param ui_data The object that was returned from the
    + * connect_callback UI OP.
    + * */
    + void (*disconnect_callback)(const char *name, void *ui_data);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    + void (*_purple_reserved5)(void);
    +};
    +
    +
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +/**
    + * Sets the UI operations structure to be used for preferences.
    + *
    + * @param ops The UI operations structure.
    + * @since 2.11.0
    + */
    +void purple_prefs_set_ui_ops(PurplePrefsUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure used for preferences.
    + *
    + * @return The UI operations structure in use.
    + * @since 2.11.0
    + */
    +PurplePrefsUiOps *purple_prefs_get_ui_ops(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Prefs API
    + Preferences are named according to a directory-like structure.
    + Example: "/plugins/core/potato/is_from_idaho" (probably a boolean) */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the prefs subsystem handle.
    + *
    + * @return The prefs subsystem handle.
    + */
    +void *purple_prefs_get_handle(void);
    +
    +/**
    + * Initialize core prefs
    + */
    +void purple_prefs_init(void);
    +
    +/**
    + * Uninitializes the prefs subsystem.
    + */
    +void purple_prefs_uninit(void);
    +
    +/**
    + * Add a new typeless pref.
    + *
    + * @param name The name of the pref
    + */
    +void purple_prefs_add_none(const char *name);
    +
    +/**
    + * Add a new boolean pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + */
    +void purple_prefs_add_bool(const char *name, gboolean value);
    +
    +/**
    + * Add a new integer pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + */
    +void purple_prefs_add_int(const char *name, int value);
    +
    +/**
    + * Add a new string pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + */
    +void purple_prefs_add_string(const char *name, const char *value);
    +
    +/**
    + * Add a new string list pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + * @note This function takes a copy of the strings in the value list. The list
    + * itself and original copies of the strings are up to the caller to
    + * free.
    + */
    +void purple_prefs_add_string_list(const char *name, GList *value);
    +
    +/**
    + * Add a new path pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + */
    +void purple_prefs_add_path(const char *name, const char *value);
    +
    +/**
    + * Add a new path list pref.
    + *
    + * @param name The name of the pref
    + * @param value The initial value to set
    + * @note This function takes a copy of the strings in the value list. The list
    + * itself and original copies of the strings are up to the caller to
    + * free.
    + */
    +void purple_prefs_add_path_list(const char *name, GList *value);
    +
    +
    +/**
    + * Remove a pref.
    + *
    + * @param name The name of the pref
    + */
    +void purple_prefs_remove(const char *name);
    +
    +/**
    + * Rename a pref
    + *
    + * @param oldname The old name of the pref
    + * @param newname The new name for the pref
    + */
    +void purple_prefs_rename(const char *oldname, const char *newname);
    +
    +/**
    + * Rename a boolean pref, toggling it's value
    + *
    + * @param oldname The old name of the pref
    + * @param newname The new name for the pref
    + */
    +void purple_prefs_rename_boolean_toggle(const char *oldname, const char *newname);
    +
    +/**
    + * Remove all prefs.
    + */
    +void purple_prefs_destroy(void);
    +
    +/**
    + * Set raw pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + *
    + * @deprecated We're not really sure what purpose this function serves, so it
    + * will be removed in 3.0.0. Preferences values set using this
    + * function aren't serialized to prefs.xml, which could be
    + * misleading. There is also no purple_prefs_get_generic, which
    + * means that if you can't really get the value (other in a
    + * connected callback). If you think you have a use for this then
    + * please let us know.
    + */
    +/* TODO: When this is removed, also remove struct purple_pref->value.generic */
    +void purple_prefs_set_generic(const char *name, gpointer value);
    +
    +/**
    + * Set boolean pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_bool(const char *name, gboolean value);
    +
    +/**
    + * Set integer pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_int(const char *name, int value);
    +
    +/**
    + * Set string pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_string(const char *name, const char *value);
    +
    +/**
    + * Set string list pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_string_list(const char *name, GList *value);
    +
    +/**
    + * Set path pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_path(const char *name, const char *value);
    +
    +/**
    + * Set path list pref value
    + *
    + * @param name The name of the pref
    + * @param value The value to set
    + */
    +void purple_prefs_set_path_list(const char *name, GList *value);
    +
    +
    +/**
    + * Check if a pref exists
    + *
    + * @param name The name of the pref
    + * @return TRUE if the pref exists. Otherwise FALSE.
    + */
    +gboolean purple_prefs_exists(const char *name);
    +
    +/**
    + * Get pref type
    + *
    + * @param name The name of the pref
    + * @return The type of the pref
    + */
    +PurplePrefType purple_prefs_get_type(const char *name);
    +
    +/**
    + * Get boolean pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +gboolean purple_prefs_get_bool(const char *name);
    +
    +/**
    + * Get integer pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +int purple_prefs_get_int(const char *name);
    +
    +/**
    + * Get string pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +const char *purple_prefs_get_string(const char *name);
    +
    +/**
    + * Get string list pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +GList *purple_prefs_get_string_list(const char *name);
    +
    +/**
    + * Get path pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +const char *purple_prefs_get_path(const char *name);
    +
    +/**
    + * Get path list pref value
    + *
    + * @param name The name of the pref
    + * @return The value of the pref
    + */
    +GList *purple_prefs_get_path_list(const char *name);
    +
    +/**
    + * Returns a list of children for a pref
    + *
    + * @param name The parent pref
    + * @return A list of newly allocated strings denoting the names of the children.
    + * Returns @c NULL if there are no children or if pref doesn't exist.
    + * The caller must free all the strings and the list.
    + *
    + * @since 2.1.0
    + */
    +GList *purple_prefs_get_children_names(const char *name);
    +
    +/**
    + * Add a callback to a pref (and its children)
    + *
    + * @param handle The handle of the receiver.
    + * @param name The name of the preference
    + * @param cb The callback function
    + * @param data The data to pass to the callback function.
    + *
    + * @return An id to disconnect the callback
    + *
    + * @see purple_prefs_disconnect_callback
    + */
    +guint purple_prefs_connect_callback(void *handle, const char *name, PurplePrefCallback cb,
    + gpointer data);
    +
    +/**
    + * Remove a callback to a pref
    + */
    +void purple_prefs_disconnect_callback(guint callback_id);
    +
    +/**
    + * Remove all pref callbacks by handle
    + */
    +void purple_prefs_disconnect_by_handle(void *handle);
    +
    +/**
    + * Trigger callbacks as if the pref changed
    + */
    +void purple_prefs_trigger_callback(const char *name);
    +
    +/**
    + * Trigger callbacks as if the pref changed, taking a #PurplePrefCallbackData
    + * instead of a name
    + *
    + * @since 2.11.0
    + */
    +void purple_prefs_trigger_callback_object(PurplePrefCallbackData *data);
    +
    +
    +/**
    + * Read preferences
    + */
    +gboolean purple_prefs_load(void);
    +
    +/**
    + * Rename legacy prefs and delete some that no longer exist.
    + */
    +void purple_prefs_update_old(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_PREFS_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/presence.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,103 @@
    +/**
    + * @file presence.h Presence
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_PRESENCE_H_
    +#define PURPLE_JABBER_PRESENCE_H_
    +
    +typedef enum {
    + JABBER_PRESENCE_ERROR = -2,
    + JABBER_PRESENCE_PROBE = -1,
    + JABBER_PRESENCE_AVAILABLE,
    + JABBER_PRESENCE_UNAVAILABLE,
    + JABBER_PRESENCE_SUBSCRIBE,
    + JABBER_PRESENCE_SUBSCRIBED,
    + JABBER_PRESENCE_UNSUBSCRIBE,
    + JABBER_PRESENCE_UNSUBSCRIBED
    +} JabberPresenceType;
    +
    +typedef struct _JabberPresenceChatInfo JabberPresenceChatInfo;
    +typedef struct _JabberPresence JabberPresence;
    +
    +#include "buddy.h"
    +#include "chat.h"
    +#include "jabber.h"
    +#include "jutil.h"
    +#include "xmlnode.h"
    +
    +struct _JabberPresenceChatInfo {
    + GSList *codes;
    + xmlnode *item;
    +};
    +
    +struct _JabberPresence {
    + JabberPresenceType type;
    + JabberID *jid_from;
    + const char *from;
    + const char *to;
    + const char *id;
    +
    + JabberBuddy *jb;
    + JabberChat *chat;
    + JabberPresenceChatInfo chat_info;
    + xmlnode *caps; /* TODO: Temporary, see presence.c:parse_caps */
    +
    + JabberBuddyState state;
    + gchar *status;
    + int priority;
    +
    + char *vcard_avatar_hash;
    + char *nickname;
    +
    + gboolean delayed;
    + time_t sent;
    + int idle;
    +};
    +
    +typedef void (JabberPresenceHandler)(JabberStream *js, JabberPresence *presence,
    + xmlnode *child);
    +void jabber_presence_register_handler(const char *node, const char *xmlns,
    + JabberPresenceHandler *handler);
    +
    +void jabber_presence_init(void);
    +void jabber_presence_uninit(void);
    +
    +void jabber_set_status(PurpleAccount *account, PurpleStatus *status);
    +
    +/**
    + * Send a full presence stanza.
    + *
    + * @param js A JabberStream object.
    + * @param force Force sending the presence stanza, irrespective of whether
    + * the contents seem to have changed.
    + */
    +void jabber_presence_send(JabberStream *js, gboolean force);
    +
    +xmlnode *jabber_presence_create(JabberBuddyState state, const char *msg, int priority); /* DEPRECATED */
    +xmlnode *jabber_presence_create_js(JabberStream *js, JabberBuddyState state, const char *msg, int priority);
    +void jabber_presence_parse(JabberStream *js, xmlnode *packet);
    +void jabber_presence_subscription_set(JabberStream *js, const char *who,
    + const char *type);
    +void jabber_presence_fake_to_self(JabberStream *js, PurpleStatus *status);
    +void purple_status_to_jabber(const PurpleStatus *status, JabberBuddyState *state, char **msg, int *priority);
    +
    +#endif /* PURPLE_JABBER_PRESENCE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/privacy.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,194 @@
    +/**
    + * @file privacy.h Privacy 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
    + */
    +#ifndef _PURPLE_PRIVACY_H_
    +#define _PURPLE_PRIVACY_H_
    +
    +/**
    + * Privacy data types.
    + */
    +typedef enum _PurplePrivacyType
    +{
    + PURPLE_PRIVACY_ALLOW_ALL = 1,
    + PURPLE_PRIVACY_DENY_ALL,
    + PURPLE_PRIVACY_ALLOW_USERS,
    + PURPLE_PRIVACY_DENY_USERS,
    + PURPLE_PRIVACY_ALLOW_BUDDYLIST
    +} PurplePrivacyType;
    +
    +#include "account.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Privacy core/UI operations.
    + */
    +typedef struct
    +{
    + void (*permit_added)(PurpleAccount *account, const char *name);
    + void (*permit_removed)(PurpleAccount *account, const char *name);
    + void (*deny_added)(PurpleAccount *account, const char *name);
    + void (*deny_removed)(PurpleAccount *account, const char *name);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurplePrivacyUiOps;
    +
    +/**
    + * Adds a user to the account's permit list.
    + *
    + * @param account The account.
    + * @param name The name of the user to add to the list.
    + * @param local_only If TRUE, only the local list is updated, and not
    + * the server.
    + *
    + * @return TRUE if the user was added successfully, or @c FALSE otherwise.
    + */
    +gboolean purple_privacy_permit_add(PurpleAccount *account, const char *name,
    + gboolean local_only);
    +
    +/**
    + * Removes a user from the account's permit list.
    + *
    + * @param account The account.
    + * @param name The name of the user to add to the list.
    + * @param local_only If TRUE, only the local list is updated, and not
    + * the server.
    + *
    + * @return TRUE if the user was removed successfully, or @c FALSE otherwise.
    + */
    +gboolean purple_privacy_permit_remove(PurpleAccount *account, const char *name,
    + gboolean local_only);
    +
    +/**
    + * Adds a user to the account's deny list.
    + *
    + * @param account The account.
    + * @param name The name of the user to add to the list.
    + * @param local_only If TRUE, only the local list is updated, and not
    + * the server.
    + *
    + * @return TRUE if the user was added successfully, or @c FALSE otherwise.
    + */
    +gboolean purple_privacy_deny_add(PurpleAccount *account, const char *name,
    + gboolean local_only);
    +
    +/**
    + * Removes a user from the account's deny list.
    + *
    + * @param account The account.
    + * @param name The name of the user to add to the list.
    + * @param local_only If TRUE, only the local list is updated, and not
    + * the server.
    + *
    + * @return TRUE if the user was removed successfully, or @c FALSE otherwise.
    + */
    +gboolean purple_privacy_deny_remove(PurpleAccount *account, const char *name,
    + gboolean local_only);
    +
    +/**
    + * Allow a user to send messages. If current privacy setting for the account is:
    + * PURPLE_PRIVACY_ALLOW_USERS: The user is added to the allow-list.
    + * PURPLE_PRIVACY_DENY_USERS : The user is removed from the deny-list.
    + * PURPLE_PRIVACY_ALLOW_ALL : No changes made.
    + * PURPLE_PRIVACY_DENY_ALL : The privacy setting is changed to
    + * PURPLE_PRIVACY_ALLOW_USERS and the user
    + * is added to the allow-list.
    + * PURPLE_PRIVACY_ALLOW_BUDDYLIST: No changes made if the user is already in
    + * the buddy-list. Otherwise the setting is
    + * changed to PURPLE_PRIVACY_ALLOW_USERS, all the
    + * buddies are added to the allow-list, and the
    + * user is also added to the allow-list.
    + *
    + * @param account The account.
    + * @param who The name of the user.
    + * @param local Whether the change is local-only.
    + * @param restore Should the previous allow/deny list be restored if the
    + * privacy setting is changed.
    + */
    +void purple_privacy_allow(PurpleAccount *account, const char *who, gboolean local,
    + gboolean restore);
    +
    +/**
    + * Block messages from a user. If current privacy setting for the account is:
    + * PURPLE_PRIVACY_ALLOW_USERS: The user is removed from the allow-list.
    + * PURPLE_PRIVACY_DENY_USERS : The user is added to the deny-list.
    + * PURPLE_PRIVACY_DENY_ALL : No changes made.
    + * PURPLE_PRIVACY_ALLOW_ALL : The privacy setting is changed to
    + * PURPLE_PRIVACY_DENY_USERS and the user is
    + * added to the deny-list.
    + * PURPLE_PRIVACY_ALLOW_BUDDYLIST: If the user is not in the buddy-list,
    + * then no changes made. Otherwise, the setting
    + * is changed to PURPLE_PRIVACY_ALLOW_USERS, all
    + * the buddies are added to the allow-list, and
    + * this user is removed from the list.
    + *
    + * @param account The account.
    + * @param who The name of the user.
    + * @param local Whether the change is local-only.
    + * @param restore Should the previous allow/deny list be restored if the
    + * privacy setting is changed.
    + */
    +void purple_privacy_deny(PurpleAccount *account, const char *who, gboolean local,
    + gboolean restore);
    +
    +/**
    + * Check the privacy-setting for a user.
    + *
    + * @param account The account.
    + * @param who The name of the user.
    + *
    + * @return @c FALSE if the specified account's privacy settings block the user or @c TRUE otherwise. The meaning of "block" is protocol-dependent and generally relates to status and/or sending of messages.
    + */
    +gboolean purple_privacy_check(PurpleAccount *account, const char *who);
    +
    +/**
    + * Sets the UI operations structure for the privacy subsystem.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_privacy_set_ui_ops(PurplePrivacyUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure for the privacy subsystem.
    + *
    + * @return The UI operations structure.
    + */
    +PurplePrivacyUiOps *purple_privacy_get_ui_ops(void);
    +
    +/**
    + * Initializes the privacy subsystem.
    + */
    +void purple_privacy_init(void);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_PRIVACY_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/proxy.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,372 @@
    +/**
    + * @file proxy.h Proxy 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
    + */
    +#ifndef _PURPLE_PROXY_H_
    +#define _PURPLE_PROXY_H_
    +
    +#include <glib.h>
    +#include "eventloop.h"
    +
    +/**
    + * A type of proxy connection.
    + */
    +typedef enum
    +{
    + PURPLE_PROXY_USE_GLOBAL = -1, /**< Use the global proxy information. */
    + PURPLE_PROXY_NONE = 0, /**< No proxy. */
    + PURPLE_PROXY_HTTP, /**< HTTP proxy. */
    + PURPLE_PROXY_SOCKS4, /**< SOCKS 4 proxy. */
    + PURPLE_PROXY_SOCKS5, /**< SOCKS 5 proxy. */
    + PURPLE_PROXY_USE_ENVVAR, /**< Use environmental settings. */
    + PURPLE_PROXY_TOR /**< Use a Tor proxy (SOCKS 5 really) */
    +
    +} PurpleProxyType;
    +
    +/**
    + * Information on proxy settings.
    + */
    +typedef struct
    +{
    + PurpleProxyType type; /**< The proxy type. */
    +
    + char *host; /**< The host. */
    + int port; /**< The port number. */
    + char *username; /**< The username. */
    + char *password; /**< The password. */
    +
    +} PurpleProxyInfo;
    +
    +typedef struct _PurpleProxyConnectData PurpleProxyConnectData;
    +
    +typedef void (*PurpleProxyConnectFunction)(gpointer data, gint source, const gchar *error_message);
    +
    +
    +#include "account.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Proxy structure API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a proxy information structure.
    + *
    + * @return The proxy information structure.
    + */
    +PurpleProxyInfo *purple_proxy_info_new(void);
    +
    +/**
    + * Destroys a proxy information structure.
    + *
    + * @param info The proxy information structure to destroy.
    + */
    +void purple_proxy_info_destroy(PurpleProxyInfo *info);
    +
    +/**
    + * Sets the type of proxy.
    + *
    + * @param info The proxy information.
    + * @param type The proxy type.
    + */
    +void purple_proxy_info_set_type(PurpleProxyInfo *info, PurpleProxyType type);
    +
    +/**
    + * Sets the proxy host.
    + *
    + * @param info The proxy information.
    + * @param host The host.
    + */
    +void purple_proxy_info_set_host(PurpleProxyInfo *info, const char *host);
    +
    +/**
    + * Sets the proxy port.
    + *
    + * @param info The proxy information.
    + * @param port The port.
    + */
    +void purple_proxy_info_set_port(PurpleProxyInfo *info, int port);
    +
    +/**
    + * Sets the proxy username.
    + *
    + * @param info The proxy information.
    + * @param username The username.
    + */
    +void purple_proxy_info_set_username(PurpleProxyInfo *info, const char *username);
    +
    +/**
    + * Sets the proxy password.
    + *
    + * @param info The proxy information.
    + * @param password The password.
    + */
    +void purple_proxy_info_set_password(PurpleProxyInfo *info, const char *password);
    +
    +/**
    + * Returns the proxy's type.
    + *
    + * @param info The proxy information.
    + *
    + * @return The type.
    + */
    +PurpleProxyType purple_proxy_info_get_type(const PurpleProxyInfo *info);
    +
    +/**
    + * Returns the proxy's host.
    + *
    + * @param info The proxy information.
    + *
    + * @return The host.
    + */
    +const char *purple_proxy_info_get_host(const PurpleProxyInfo *info);
    +
    +/**
    + * Returns the proxy's port.
    + *
    + * @param info The proxy information.
    + *
    + * @return The port.
    + */
    +int purple_proxy_info_get_port(const PurpleProxyInfo *info);
    +
    +/**
    + * Returns the proxy's username.
    + *
    + * @param info The proxy information.
    + *
    + * @return The username.
    + */
    +const char *purple_proxy_info_get_username(const PurpleProxyInfo *info);
    +
    +/**
    + * Returns the proxy's password.
    + *
    + * @param info The proxy information.
    + *
    + * @return The password.
    + */
    +const char *purple_proxy_info_get_password(const PurpleProxyInfo *info);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Global Proxy API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns purple's global proxy information.
    + *
    + * @return The global proxy information.
    + */
    +PurpleProxyInfo *purple_global_proxy_get_info(void);
    +
    +/**
    + * Set purple's global proxy information.
    + *
    + * @param info The proxy information.
    + * @since 2.6.0
    + */
    +void purple_global_proxy_set_info(PurpleProxyInfo *info);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Proxy API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the proxy subsystem handle.
    + *
    + * @return The proxy subsystem handle.
    + */
    +void *purple_proxy_get_handle(void);
    +
    +/**
    + * Initializes the proxy subsystem.
    + */
    +void purple_proxy_init(void);
    +
    +/**
    + * Uninitializes the proxy subsystem.
    + */
    +void purple_proxy_uninit(void);
    +
    +/**
    + * Returns configuration of a proxy.
    + *
    + * @param account The account for which the configuration is needed.
    + *
    + * @return The configuration of a proxy.
    + */
    +PurpleProxyInfo *purple_proxy_get_setup(PurpleAccount *account);
    +
    +/**
    + * Makes a connection to the specified host and port. Note that this
    + * function name can be misleading--although it is called "proxy
    + * connect," it is used for establishing any outgoing TCP connection,
    + * whether through a proxy or not.
    + *
    + * @param handle A handle that should be associated with this
    + * connection attempt. The handle can be used
    + * to cancel the connection attempt using the
    + * purple_proxy_connect_cancel_with_handle()
    + * function.
    + * @param account The account making the connection.
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param connect_cb The function to call when the connection is
    + * established. If the connection failed then
    + * fd will be -1 and error message will be set
    + * to something descriptive (hopefully).
    + * @param data User-defined data.
    + *
    + * @return NULL if there was an error, or a reference to an
    + * opaque data structure that can be used to cancel
    + * the pending connection, if needed.
    + */
    +PurpleProxyConnectData *purple_proxy_connect(void *handle,
    + PurpleAccount *account,
    + const char *host, int port,
    + PurpleProxyConnectFunction connect_cb, gpointer data);
    +
    +/**
    + * Makes a connection to the specified host and port. Note that this
    + * function name can be misleading--although it is called "proxy
    + * connect," it is used for establishing any outgoing UDP connection,
    + * whether through a proxy or not.
    + *
    + * @param handle A handle that should be associated with this
    + * connection attempt. The handle can be used
    + * to cancel the connection attempt using the
    + * purple_proxy_connect_cancel_with_handle()
    + * function.
    + * @param account The account making the connection.
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param connect_cb The function to call when the connection is
    + * established. If the connection failed then
    + * fd will be -1 and error message will be set
    + * to something descriptive (hopefully).
    + * @param data User-defined data.
    + *
    + * @return NULL if there was an error, or a reference to an
    + * opaque data structure that can be used to cancel
    + * the pending connection, if needed.
    + */
    +PurpleProxyConnectData *purple_proxy_connect_udp(void *handle,
    + PurpleAccount *account,
    + const char *host, int port,
    + PurpleProxyConnectFunction connect_cb, gpointer data);
    +
    +/**
    + * Makes a connection through a SOCKS5 proxy.
    + *
    + * Note that if the account that is making the connection uses a proxy, this
    + * connection to a SOCKS5 proxy will be made through the account proxy.
    + *
    + * @param handle A handle that should be associated with this
    + * connection attempt. The handle can be used
    + * to cancel the connection attempt using the
    + * purple_proxy_connect_cancel_with_handle()
    + * function.
    + * @param account The account making the connection.
    + * @param gpi The PurpleProxyInfo specifying the proxy settings
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param connect_cb The function to call when the connection is
    + * established. If the connection failed then
    + * fd will be -1 and error message will be set
    + * to something descriptive (hopefully).
    + * @param data User-defined data.
    + *
    + * @return NULL if there was an error, or a reference to an
    + * opaque data structure that can be used to cancel
    + * the pending connection, if needed.
    + */
    +PurpleProxyConnectData *purple_proxy_connect_socks5_account(void *handle,
    + PurpleAccount *account, PurpleProxyInfo *gpi,
    + const char *host, int port,
    + PurpleProxyConnectFunction connect_cb, gpointer data);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PROXY_C_)
    +/**
    + * Makes a connection through a SOCKS5 proxy.
    + *
    + * @param handle A handle that should be associated with this
    + * connection attempt. The handle can be used
    + * to cancel the connection attempt using the
    + * purple_proxy_connect_cancel_with_handle()
    + * function.
    + * @param gpi The PurpleProxyInfo specifying the proxy settings
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param connect_cb The function to call when the connection is
    + * established. If the connection failed then
    + * fd will be -1 and error message will be set
    + * to something descriptive (hopefully).
    + * @param data User-defined data.
    + *
    + * @return NULL if there was an error, or a reference to an
    + * opaque data structure that can be used to cancel
    + * the pending connection, if needed.
    + * @deprecated Use purple_proxy_connect_socks5_account instead
    + */
    +PurpleProxyConnectData *purple_proxy_connect_socks5(void *handle,
    + PurpleProxyInfo *gpi,
    + const char *host, int port,
    + PurpleProxyConnectFunction connect_cb, gpointer data);
    +#endif
    +
    +/**
    + * Cancel an in-progress connection attempt. This should be called
    + * by the PRPL if the user disables an account while it is still
    + * performing the initial sign on. Or when establishing a file
    + * transfer, if we attempt to connect to a remote user but they
    + * are behind a firewall then the PRPL can cancel the connection
    + * attempt early rather than just letting the OS's TCP/IP stack
    + * time-out the connection.
    + */
    +void purple_proxy_connect_cancel(PurpleProxyConnectData *connect_data);
    +
    +/*
    + * Closes all proxy connections registered with the specified handle.
    + *
    + * @param handle The handle.
    + */
    +void purple_proxy_connect_cancel_with_handle(void *handle);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_PROXY_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/prpl.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1019 @@
    +/**
    + * @file prpl.h Protocol Plugin functions
    + * @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
    + */
    +
    +/* this file should be all that prpls need to include. therefore, by including
    + * this file, they should get glib, proxy, purple_connection, prpl, etc. */
    +
    +#ifndef _PURPLE_PRPL_H_
    +#define _PURPLE_PRPL_H_
    +
    +typedef struct _PurplePluginProtocolInfo PurplePluginProtocolInfo;
    +/** @copydoc _PurpleAttentionType */
    +typedef struct _PurpleAttentionType PurpleAttentionType;
    +
    +/**************************************************************************/
    +/** @name Basic Protocol Information */
    +/**************************************************************************/
    +
    +typedef enum {
    + PURPLE_ICON_SCALE_DISPLAY = 0x01, /**< We scale the icon when we display it */
    + PURPLE_ICON_SCALE_SEND = 0x02 /**< We scale the icon before we send it to the server */
    +} PurpleIconScaleRules;
    +
    +
    +/**
    + * A description of a Buddy Icon specification. This tells Purple what kind of image file
    + * it should give this prpl, and what kind of image file it should expect back.
    + * Dimensions less than 1 should be ignored and the image not scaled.
    + */
    +typedef struct _PurpleBuddyIconSpec PurpleBuddyIconSpec;
    +
    +/**
    + * A description of a file transfer thumbnail specification.
    + * This tells the UI if and what image formats the prpl support for file
    + * transfer thumbnails.
    + */
    +typedef struct _PurpleThumbnailSpec PurpleThumbnailSpec;
    +
    +/**
    + * This \#define exists just to make it easier to fill out the buddy icon
    + * field in the prpl info struct for protocols that couldn't care less.
    + */
    +#define NO_BUDDY_ICONS {NULL, 0, 0, 0, 0, 0, 0}
    +
    +#ifdef HAVE_UNISTD_H
    +#include <unistd.h>
    +#endif
    +
    +#include "blist.h"
    +#include "conversation.h"
    +#include "ft.h"
    +#include "imgstore.h"
    +#include "media.h"
    +#include "notify.h"
    +#include "proxy.h"
    +#include "plugin.h"
    +#include "roomlist.h"
    +#include "status.h"
    +#include "whiteboard.h"
    +
    +
    +/** @copydoc PurpleBuddyIconSpec */
    +struct _PurpleBuddyIconSpec {
    + /** This is a comma-delimited list of image formats or @c NULL if icons
    + * are not supported. Neither the core nor the prpl will actually
    + * check to see if the data it's given matches this; it's entirely up
    + * to the UI to do what it wants
    + */
    + char *format;
    +
    + int min_width; /**< Minimum width of this icon */
    + int min_height; /**< Minimum height of this icon */
    + int max_width; /**< Maximum width of this icon */
    + int max_height; /**< Maximum height of this icon */
    + size_t max_filesize; /**< Maximum size in bytes */
    + PurpleIconScaleRules scale_rules; /**< How to stretch this icon */
    +};
    +
    +/** Represents an entry containing information that must be supplied by the
    + * user when joining a chat.
    + */
    +struct proto_chat_entry {
    + const char *label; /**< User-friendly name of the entry */
    + const char *identifier; /**< Used by the PRPL to identify the option */
    + gboolean required; /**< True if it's required */
    + gboolean is_int; /**< True if the entry expects an integer */
    + int min; /**< Minimum value in case of integer */
    + int max; /**< Maximum value in case of integer */
    + gboolean secret; /**< True if the entry is secret (password) */
    +};
    +
    +/** Represents "nudges" and "buzzes" that you may send to a buddy to attract
    + * their attention (or vice-versa).
    + */
    +struct _PurpleAttentionType
    +{
    + const char *name; /**< Shown in GUI elements */
    + const char *incoming_description; /**< Shown when sent */
    + const char *outgoing_description; /**< Shown when receied */
    + const char *icon_name; /**< Icon to display (optional) */
    + const char *unlocalized_name; /**< Unlocalized name for UIs needing it */
    +
    + /* Reserved fields for future purposes */
    + gpointer _reserved2;
    + gpointer _reserved3;
    + gpointer _reserved4;
    +};
    +
    +/**
    + * Protocol options
    + *
    + * These should all be stuff that some plugins can do and others can't.
    + */
    +typedef enum
    +{
    + /**
    + * User names are unique to a chat and are not shared between rooms.
    + *
    + * XMPP lets you choose what name you want in chats, so it shouldn't
    + * be pulling the aliases from the buddy list for the chat list;
    + * it gets annoying.
    + */
    + OPT_PROTO_UNIQUE_CHATNAME = 0x00000004,
    +
    + /**
    + * Chat rooms have topics.
    + *
    + * IRC and XMPP support this.
    + */
    + OPT_PROTO_CHAT_TOPIC = 0x00000008,
    +
    + /**
    + * Don't require passwords for sign-in.
    + *
    + * Zephyr doesn't require passwords, so there's no
    + * need for a password prompt.
    + */
    + OPT_PROTO_NO_PASSWORD = 0x00000010,
    +
    + /**
    + * Notify on new mail.
    + *
    + * If a protocol notifies you when you have new mail.
    + */
    + OPT_PROTO_MAIL_CHECK = 0x00000020,
    +
    + /**
    + * Images in IMs.
    + *
    + * Oscar lets you send images in direct IMs.
    + */
    + OPT_PROTO_IM_IMAGE = 0x00000040,
    +
    + /**
    + * Allow passwords to be optional.
    + *
    + * Passwords in IRC are optional, and are needed for certain
    + * functionality.
    + */
    + OPT_PROTO_PASSWORD_OPTIONAL = 0x00000080,
    +
    + /**
    + * Allows font size to be specified in sane point size
    + *
    + * Probably just XMPP and Y!M
    + */
    + OPT_PROTO_USE_POINTSIZE = 0x00000100,
    +
    + /**
    + * Set the Register button active even when the username has not
    + * been specified.
    + *
    + * Gadu-Gadu doesn't need a username to register new account (because
    + * usernames are assigned by the server).
    + */
    + OPT_PROTO_REGISTER_NOSCREENNAME = 0x00000200,
    +
    + /**
    + * Indicates that slash commands are native to this protocol.
    + * Used as a hint that unknown commands should not be sent as messages.
    + * @since 2.1.0
    + */
    + OPT_PROTO_SLASH_COMMANDS_NATIVE = 0x00000400,
    +
    + /**
    + * Indicates that this protocol supports sending a user-supplied message
    + * along with an invitation.
    + * @since 2.8.0
    + */
    + OPT_PROTO_INVITE_MESSAGE = 0x00000800
    +
    +} PurpleProtocolOptions;
    +
    +/**
    + * A protocol plugin information structure.
    + *
    + * Every protocol plugin initializes this structure. It is the gateway
    + * between purple and the protocol plugin. Many of these callbacks can be
    + * NULL. If a callback must be implemented, it has a comment indicating so.
    + */
    +struct _PurplePluginProtocolInfo
    +{
    + PurpleProtocolOptions options; /**< Protocol options. */
    +
    + GList *user_splits; /**< A GList of PurpleAccountUserSplit */
    + GList *protocol_options; /**< A GList of PurpleAccountOption */
    +
    + PurpleBuddyIconSpec icon_spec; /**< The icon spec. */
    +
    + /**
    + * Returns the base icon name for the given buddy and account.
    + * If buddy is NULL and the account is non-NULL, it will return the
    + * name to use for the account's icon. If both are NULL, it will
    + * return the name to use for the protocol's icon.
    + *
    + * This must be implemented.
    + */
    + const char *(*list_icon)(PurpleAccount *account, PurpleBuddy *buddy);
    +
    + /**
    + * Fills the four char**'s with string identifiers for "emblems"
    + * that the UI will interpret and display as relevant
    + */
    + const char *(*list_emblem)(PurpleBuddy *buddy);
    +
    + /**
    + * Gets a short string representing this buddy's status. This will
    + * be shown on the buddy list.
    + */
    + char *(*status_text)(PurpleBuddy *buddy);
    +
    + /**
    + * Allows the prpl to add text to a buddy's tooltip.
    + */
    + void (*tooltip_text)(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboolean full);
    +
    + /**
    + * Returns a list of #PurpleStatusType which exist for this account;
    + * this must be implemented, and must add at least the offline and
    + * online states.
    + */
    + GList *(*status_types)(PurpleAccount *account);
    +
    + /**
    + * Returns a list of #PurpleMenuAction structs, which represent extra
    + * actions to be shown in (for example) the right-click menu for @a
    + * node.
    + */
    + GList *(*blist_node_menu)(PurpleBlistNode *node);
    +
    + /**
    + * Returns a list of #proto_chat_entry structs, which represent
    + * information required by the PRPL to join a chat. libpurple will
    + * call join_chat along with the information filled by the user.
    + *
    + * @return A list of #proto_chat_entry structs
    + */
    + GList *(*chat_info)(PurpleConnection *);
    +
    + /**
    + * Returns a hashtable which maps #proto_chat_entry struct identifiers
    + * to default options as strings based on chat_name. The resulting
    + * hashtable should be created with g_hash_table_new_full(g_str_hash,
    + * g_str_equal, NULL, g_free);. Use #get_chat_name if you instead need
    + * to extract a chat name from a hashtable.
    + *
    + * @param chat_name The chat name to be turned into components
    + * @return Hashtable containing the information extracted from chat_name
    + */
    + GHashTable *(*chat_info_defaults)(PurpleConnection *, const char *chat_name);
    +
    + /* All the server-related functions */
    +
    + /** This must be implemented. */
    + void (*login)(PurpleAccount *);
    +
    + /** This must be implemented. */
    + void (*close)(PurpleConnection *);
    +
    + /**
    + * This PRPL function should return a positive value on success.
    + * If the message is too big to be sent, return -E2BIG. If
    + * the account is not connected, return -ENOTCONN. If the
    + * PRPL is unable to send the message for another reason, return
    + * some other negative value. You can use one of the valid
    + * errno values, or just big something. If the message should
    + * not be echoed to the conversation window, return 0.
    + */
    + int (*send_im)(PurpleConnection *, const char *who,
    + const char *message,
    + PurpleMessageFlags flags);
    +
    + void (*set_info)(PurpleConnection *, const char *info);
    +
    + /**
    + * @return If this protocol requires the PURPLE_TYPING message to
    + * be sent repeatedly to signify that the user is still
    + * typing, then the PRPL should return the number of
    + * seconds to wait before sending a subsequent notification.
    + * Otherwise the PRPL should return 0.
    + */
    + unsigned int (*send_typing)(PurpleConnection *, const char *name, PurpleTypingState state);
    +
    + /**
    + * Should arrange for purple_notify_userinfo() to be called with
    + * @a who's user info.
    + */
    + void (*get_info)(PurpleConnection *, const char *who);
    + void (*set_status)(PurpleAccount *account, PurpleStatus *status);
    +
    + void (*set_idle)(PurpleConnection *, int idletime);
    + void (*change_passwd)(PurpleConnection *, const char *old_pass,
    + const char *new_pass);
    + /**
    + * Add a buddy to a group on the server.
    + *
    + * This PRPL function may be called in situations in which the buddy is
    + * already in the specified group. If the protocol supports
    + * authorization and the user is not already authorized to see the
    + * status of \a buddy, \a add_buddy should request authorization.
    + *
    + * @deprecated Since 2.8.0, add_buddy_with_invite is preferred.
    + * @see add_buddy_with_invite
    + */
    + void (*add_buddy)(PurpleConnection *, PurpleBuddy *buddy, PurpleGroup *group);
    + void (*add_buddies)(PurpleConnection *, GList *buddies, GList *groups);
    + void (*remove_buddy)(PurpleConnection *, PurpleBuddy *buddy, PurpleGroup *group);
    + void (*remove_buddies)(PurpleConnection *, GList *buddies, GList *groups);
    + void (*add_permit)(PurpleConnection *, const char *name);
    + void (*add_deny)(PurpleConnection *, const char *name);
    + void (*rem_permit)(PurpleConnection *, const char *name);
    + void (*rem_deny)(PurpleConnection *, const char *name);
    + void (*set_permit_deny)(PurpleConnection *);
    +
    + /**
    + * Called when the user requests joining a chat. Should arrange for
    + * #serv_got_joined_chat to be called.
    + *
    + * @param components A hashtable containing information required to
    + * join the chat as described by the entries returned
    + * by #chat_info. It may also be called when accepting
    + * an invitation, in which case this matches the
    + * data parameter passed to #serv_got_chat_invite.
    + */
    + void (*join_chat)(PurpleConnection *, GHashTable *components);
    +
    + /**
    + * Called when the user refuses a chat invitation.
    + *
    + * @param components A hashtable containing information required to
    + * join the chat as passed to #serv_got_chat_invite.
    + */
    + void (*reject_chat)(PurpleConnection *, GHashTable *components);
    +
    + /**
    + * Returns a chat name based on the information in components. Use
    + * #chat_info_defaults if you instead need to generate a hashtable
    + * from a chat name.
    + *
    + * @param components A hashtable containing information about the chat.
    + */
    + char *(*get_chat_name)(GHashTable *components);
    +
    + /**
    + * Invite a user to join a chat.
    + *
    + * @param id The id of the chat to invite the user to.
    + * @param message A message displayed to the user when the invitation
    + * is received.
    + * @param who The name of the user to send the invation to.
    + */
    + void (*chat_invite)(PurpleConnection *, int id,
    + const char *message, const char *who);
    + /**
    + * Called when the user requests leaving a chat.
    + *
    + * @param id The id of the chat to leave
    + */
    + void (*chat_leave)(PurpleConnection *, int id);
    +
    + /**
    + * Send a whisper to a user in a chat.
    + *
    + * @param id The id of the chat.
    + * @param who The name of the user to send the whisper to.
    + * @param message The message of the whisper.
    + */
    + void (*chat_whisper)(PurpleConnection *, int id,
    + const char *who, const char *message);
    +
    + /**
    + * Send a message to a chat.
    + * This PRPL function should return a positive value on success.
    + * If the message is too big to be sent, return -E2BIG. If
    + * the account is not connected, return -ENOTCONN. If the
    + * PRPL is unable to send the message for another reason, return
    + * some other negative value. You can use one of the valid
    + * errno values, or just big something.
    + *
    + * @param id The id of the chat to send the message to.
    + * @param message The message to send to the chat.
    + * @param flags A bitwise OR of #PurpleMessageFlags representing
    + * message flags.
    + * @return A positive number or 0 in case of success,
    + * a negative error number in case of failure.
    + */
    + int (*chat_send)(PurpleConnection *, int id, const char *message, PurpleMessageFlags flags);
    +
    + /** If implemented, this will be called regularly for this prpl's
    + * active connections. You'd want to do this if you need to repeatedly
    + * send some kind of keepalive packet to the server to avoid being
    + * disconnected. ("Regularly" is defined by
    + * <code>KEEPALIVE_INTERVAL</code> in <tt>libpurple/connection.c</tt>.)
    + */
    + void (*keepalive)(PurpleConnection *);
    +
    + /** new user registration */
    + void (*register_user)(PurpleAccount *);
    +
    + /**
    + * @deprecated Use #PurplePluginProtocolInfo.get_info instead.
    + */
    + void (*get_cb_info)(PurpleConnection *, int, const char *who);
    + /**
    + * @deprecated Use #PurplePluginProtocolInfo.get_cb_real_name and
    + * #PurplePluginProtocolInfo.status_text instead.
    + */
    + void (*get_cb_away)(PurpleConnection *, int, const char *who);
    +
    + /** save/store buddy's alias on server list/roster */
    + void (*alias_buddy)(PurpleConnection *, const char *who,
    + const char *alias);
    +
    + /** change a buddy's group on a server list/roster */
    + void (*group_buddy)(PurpleConnection *, const char *who,
    + const char *old_group, const char *new_group);
    +
    + /** rename a group on a server list/roster */
    + void (*rename_group)(PurpleConnection *, const char *old_name,
    + PurpleGroup *group, GList *moved_buddies);
    +
    + void (*buddy_free)(PurpleBuddy *);
    +
    + void (*convo_closed)(PurpleConnection *, const char *who);
    +
    + /**
    + * Convert the username @a who to its canonical form. (For example,
    + * AIM treats "fOo BaR" and "foobar" as the same user; this function
    + * should return the same normalized string for both of those.)
    + */
    + const char *(*normalize)(const PurpleAccount *, const char *who);
    +
    + /**
    + * Set the buddy icon for the given connection to @a img. The prpl
    + * does NOT own a reference to @a img; if it needs one, it must
    + * #purple_imgstore_ref(@a img) itself.
    + */
    + void (*set_buddy_icon)(PurpleConnection *, PurpleStoredImage *img);
    +
    + void (*remove_group)(PurpleConnection *gc, PurpleGroup *group);
    +
    + /** Gets the real name of a participant in a chat. For example, on
    + * XMPP this turns a chat room nick <tt>foo</tt> into
    + * <tt>room\@server/foo</tt>
    + * @param gc the connection on which the room is.
    + * @param id the ID of the chat room.
    + * @param who the nickname of the chat participant.
    + * @return the real name of the participant. This string must be
    + * freed by the caller.
    + */
    + char *(*get_cb_real_name)(PurpleConnection *gc, int id, const char *who);
    +
    + void (*set_chat_topic)(PurpleConnection *gc, int id, const char *topic);
    +
    + PurpleChat *(*find_blist_chat)(PurpleAccount *account, const char *name);
    +
    + /* room listing prpl callbacks */
    + PurpleRoomlist *(*roomlist_get_list)(PurpleConnection *gc);
    + void (*roomlist_cancel)(PurpleRoomlist *list);
    + void (*roomlist_expand_category)(PurpleRoomlist *list, PurpleRoomlistRoom *category);
    +
    + /* file transfer callbacks */
    + gboolean (*can_receive_file)(PurpleConnection *, const char *who);
    + void (*send_file)(PurpleConnection *, const char *who, const char *filename);
    + PurpleXfer *(*new_xfer)(PurpleConnection *, const char *who);
    +
    + /** Checks whether offline messages to @a buddy are supported.
    + * @return @c TRUE if @a buddy can be sent messages while they are
    + * offline, or @c FALSE if not.
    + */
    + gboolean (*offline_message)(const PurpleBuddy *buddy);
    +
    + PurpleWhiteboardPrplOps *whiteboard_prpl_ops;
    +
    + /** For use in plugins that may understand the underlying protocol */
    + int (*send_raw)(PurpleConnection *gc, const char *buf, int len);
    +
    + /* room list serialize */
    + char *(*roomlist_room_serialize)(PurpleRoomlistRoom *room);
    +
    + /** Remove the user from the server. The account can either be
    + * connected or disconnected. After the removal is finished, the
    + * connection will stay open and has to be closed!
    + */
    + /* This is here rather than next to register_user for API compatibility
    + * reasons.
    + */
    + void (*unregister_user)(PurpleAccount *, PurpleAccountUnregistrationCb cb, void *user_data);
    +
    + /* Attention API for sending & receiving zaps/nudges/buzzes etc. */
    + gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type);
    + GList *(*get_attention_types)(PurpleAccount *acct);
    +
    + /**
    + * The size of the PurplePluginProtocolInfo. This should always be sizeof(PurplePluginProtocolInfo).
    + * This allows adding more functions to this struct without requiring a major version bump.
    + */
    + unsigned long struct_size;
    +
    + /* NOTE:
    + * If more functions are added, they should accessed using the following syntax:
    + *
    + * if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, new_function))
    + * prpl->new_function(...);
    + *
    + * instead of
    + *
    + * if (prpl->new_function != NULL)
    + * prpl->new_function(...);
    + *
    + * The PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro can be used for the older member
    + * functions (e.g. login, send_im etc.) too.
    + */
    +
    + /** This allows protocols to specify additional strings to be used for
    + * various purposes. The idea is to stuff a bunch of strings in this hash
    + * table instead of expanding the struct for every addition. This hash
    + * table is allocated every call and MUST be unrefed by the caller.
    + *
    + * @param account The account to specify. This can be NULL.
    + * @return The protocol's string hash table. The hash table should be
    + * destroyed by the caller when it's no longer needed.
    + */
    + GHashTable *(*get_account_text_table)(PurpleAccount *account);
    +
    + /**
    + * Initiate a media session with the given contact.
    + *
    + * @param account The account to initiate the media session on.
    + * @param who The remote user to initiate the session with.
    + * @param type The type of media session to initiate.
    + * @return TRUE if the call succeeded else FALSE. (Doesn't imply the media session or stream will be successfully created)
    + */
    + gboolean (*initiate_media)(PurpleAccount *account, const char *who,
    + PurpleMediaSessionType type);
    +
    + /**
    + * Checks to see if the given contact supports the given type of media session.
    + *
    + * @param account The account the contact is on.
    + * @param who The remote user to check for media capability with.
    + * @return The media caps the contact supports.
    + */
    + PurpleMediaCaps (*get_media_caps)(PurpleAccount *account,
    + const char *who);
    +
    + /**
    + * Returns an array of "PurpleMood"s, with the last one having
    + * "mood" set to @c NULL.
    + * @since 2.7.0
    + */
    + PurpleMood *(*get_moods)(PurpleAccount *account);
    +
    + /**
    + * Set the user's "friendly name" (or alias or nickname or
    + * whatever term you want to call it) on the server. The
    + * protocol plugin should call success_cb or failure_cb
    + * *asynchronously* (if it knows immediately that the set will fail,
    + * call one of the callbacks from an idle/0-second timeout) depending
    + * on if the nickname is set successfully.
    + *
    + * @param gc The connection for which to set an alias
    + * @param alias The new server-side alias/nickname for this account,
    + * or NULL to unset the alias/nickname (or return it to
    + * a protocol-specific "default").
    + * @param success_cb Callback to be called if the public alias is set
    + * @param failure_cb Callback to be called if setting the public alias
    + * fails
    + * @see purple_account_set_public_alias
    + * @since 2.7.0
    + */
    + void (*set_public_alias)(PurpleConnection *gc, const char *alias,
    + PurpleSetPublicAliasSuccessCallback success_cb,
    + PurpleSetPublicAliasFailureCallback failure_cb);
    + /**
    + * Retrieve the user's "friendly name" as set on the server.
    + * The protocol plugin should call success_cb or failure_cb
    + * *asynchronously* (even if it knows immediately that the get will fail,
    + * call one of the callbacks from an idle/0-second timeout) depending
    + * on if the nickname is retrieved.
    + *
    + * @param gc The connection for which to retireve the alias
    + * @param success_cb Callback to be called with the retrieved alias
    + * @param failure_cb Callback to be called if the prpl is unable to
    + * retrieve the alias
    + * @see purple_account_get_public_alias
    + * @since 2.7.0
    + */
    + void (*get_public_alias)(PurpleConnection *gc,
    + PurpleGetPublicAliasSuccessCallback success_cb,
    + PurpleGetPublicAliasFailureCallback failure_cb);
    +
    + /**
    + * Add a buddy to a group on the server.
    + *
    + * This PRPL function may be called in situations in which the buddy is
    + * already in the specified group. If the protocol supports
    + * authorization and the user is not already authorized to see the
    + * status of \a buddy, \a add_buddy should request authorization.
    + *
    + * If authorization is required, then use the supplied invite message.
    + *
    + * @since 2.8.0
    + */
    + void (*add_buddy_with_invite)(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char *message);
    + void (*add_buddies_with_invite)(PurpleConnection *pc, GList *buddies, GList *groups, const char *message);
    +};
    +
    +#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \
    + (((G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < G_STRUCT_OFFSET(PurplePluginProtocolInfo, struct_size)) \
    + || (G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < prpl->struct_size)) && \
    + prpl->member != NULL)
    +
    +
    +#define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \
    + ((plugin)->info->type == PURPLE_PLUGIN_PROTOCOL)
    +
    +#define PURPLE_PLUGIN_PROTOCOL_INFO(plugin) \
    + ((PurplePluginProtocolInfo *)(plugin)->info->extra_info)
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Attention Type API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new #PurpleAttentionType object and sets its mandatory parameters.
    + *
    + * @param ulname A non-localized string that can be used by UIs in need of such
    + * non-localized strings. This should be the same as @a name,
    + * without localization.
    + * @param name A localized string that the UI may display for the event. This
    + * should be the same string as @a ulname, with localization.
    + * @param inc_desc A localized description shown when the event is received.
    + * @param out_desc A localized description shown when the event is sent.
    + * @return A pointer to the new object.
    + * @since 2.4.0
    + */
    +PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name,
    + const char *inc_desc, const char *out_desc);
    +
    +/**
    + * Sets the displayed name of the attention-demanding event.
    + *
    + * @param type The attention type.
    + * @param name The localized name that will be displayed by UIs. This should be
    + * the same string given as the unlocalized name, but with
    + * localization.
    + * @since 2.4.0
    + */
    +void purple_attention_type_set_name(PurpleAttentionType *type, const char *name);
    +
    +/**
    + * Sets the description of the attention-demanding event shown in conversations
    + * when the event is received.
    + *
    + * @param type The attention type.
    + * @param desc The localized description for incoming events.
    + * @since 2.4.0
    + */
    +void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc);
    +
    +/**
    + * Sets the description of the attention-demanding event shown in conversations
    + * when the event is sent.
    + *
    + * @param type The attention type.
    + * @param desc The localized description for outgoing events.
    + * @since 2.4.0
    + */
    +void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc);
    +
    +/**
    + * Sets the name of the icon to display for the attention event; this is optional.
    + *
    + * @param type The attention type.
    + * @param name The icon's name.
    + * @note Icons are optional for attention events.
    + * @since 2.4.0
    + */
    +void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name);
    +
    +/**
    + * Sets the unlocalized name of the attention event; some UIs may need this,
    + * thus it is required.
    + *
    + * @param type The attention type.
    + * @param ulname The unlocalized name. This should be the same string given as
    + * the localized name, but without localization.
    + * @since 2.4.0
    + */
    +void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname);
    +
    +/**
    + * Get the attention type's name as displayed by the UI.
    + *
    + * @param type The attention type.
    + * @return The name.
    + * @since 2.4.0
    + */
    +const char *purple_attention_type_get_name(const PurpleAttentionType *type);
    +
    +/**
    + * Get the attention type's description shown when the event is received.
    + *
    + * @param type The attention type.
    + * @return The description.
    + * @since 2.4.0
    + */
    +const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type);
    +
    +/**
    + * Get the attention type's description shown when the event is sent.
    + *
    + * @param type The attention type.
    + * @return The description.
    + * @since 2.4.0
    + */
    +const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type);
    +
    +/**
    + * Get the attention type's icon name.
    + *
    + * @param type The attention type.
    + * @return The icon name or @c NULL if unset/empty.
    + * @note Icons are optional for attention events.
    + * @since 2.4.0
    + */
    +const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type);
    +
    +/**
    + * Get the attention type's unlocalized name; this is useful for some UIs.
    + *
    + * @param type The attention type
    + * @return The unlocalized name.
    + * @since 2.4.0
    + */
    +const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Protocol Plugin API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Notifies Purple that our account's idle state and time have changed.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account.
    + * @param idle The user's idle state.
    + * @param idle_time The user's idle time.
    + */
    +void purple_prpl_got_account_idle(PurpleAccount *account, gboolean idle,
    + time_t idle_time);
    +
    +/**
    + * Notifies Purple of our account's log-in time.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param login_time The user's log-in time.
    + */
    +void purple_prpl_got_account_login_time(PurpleAccount *account, time_t login_time);
    +
    +/**
    + * Notifies Purple that our account's status has changed.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param status_id The status ID.
    + * @param ... A NULL-terminated list of attribute IDs and values,
    + * beginning with the value for @a attr_id.
    + */
    +void purple_prpl_got_account_status(PurpleAccount *account,
    + const char *status_id, ...) G_GNUC_NULL_TERMINATED;
    +
    +/**
    + * Notifies Purple that our account's actions have changed. This is only
    + * called after the initial connection. Emits the account-actions-changed
    + * signal.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account.
    + *
    + * @see account-actions-changed
    + * @since 2.6.0
    + */
    +void purple_prpl_got_account_actions(PurpleAccount *account);
    +
    +/**
    + * Notifies Purple that a buddy's idle state and time have changed.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param name The name of the buddy.
    + * @param idle The user's idle state.
    + * @param idle_time The user's idle time. This is the time at
    + * which the user became idle, in seconds since
    + * the epoch. If the PRPL does not know this value
    + * then it should pass 0.
    + */
    +void purple_prpl_got_user_idle(PurpleAccount *account, const char *name,
    + gboolean idle, time_t idle_time);
    +
    +/**
    + * Notifies Purple of a buddy's log-in time.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param name The name of the buddy.
    + * @param login_time The user's log-in time.
    + */
    +void purple_prpl_got_user_login_time(PurpleAccount *account, const char *name,
    + time_t login_time);
    +
    +/**
    + * Notifies Purple that a buddy's status has been activated.
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param name The name of the buddy.
    + * @param status_id The status ID.
    + * @param ... A NULL-terminated list of attribute IDs and values,
    + * beginning with the value for @a attr_id.
    + */
    +void purple_prpl_got_user_status(PurpleAccount *account, const char *name,
    + const char *status_id, ...) G_GNUC_NULL_TERMINATED;
    +
    +/**
    + * Notifies libpurple that a buddy's status has been deactivated
    + *
    + * This is meant to be called from protocol plugins.
    + *
    + * @param account The account the user is on.
    + * @param name The name of the buddy.
    + * @param status_id The status ID.
    + */
    +void purple_prpl_got_user_status_deactive(PurpleAccount *account, const char *name,
    + const char *status_id);
    +
    +/**
    + * Informs the server that our account's status changed.
    + *
    + * @param account The account the user is on.
    + * @param old_status The previous status.
    + * @param new_status The status that was activated, or deactivated
    + * (in the case of independent statuses).
    + */
    +void purple_prpl_change_account_status(PurpleAccount *account,
    + PurpleStatus *old_status,
    + PurpleStatus *new_status);
    +
    +/**
    + * Retrieves the list of stock status types from a prpl.
    + *
    + * @param account The account the user is on.
    + * @param presence The presence for which we're going to get statuses
    + *
    + * @return List of statuses
    + */
    +GList *purple_prpl_get_statuses(PurpleAccount *account, PurplePresence *presence);
    +
    +/**
    + * Send an attention request message.
    + *
    + * @param gc The connection to send the message on.
    + * @param who Whose attention to request.
    + * @param type_code An index into the prpl's attention_types list determining the type
    + * of the attention request command to send. 0 if prpl only defines one,
    + * but protocols are allowed to define more.
    + *
    + * Note that you can't send arbitrary PurpleAttentionType's, because there is
    + * only a fixed set of attention commands.
    + *
    + * @since 2.5.0
    + */
    +void purple_prpl_send_attention(PurpleConnection *gc, const char *who, guint type_code);
    +
    +/**
    + * Process an incoming attention message.
    + *
    + * @param gc The connection that received the attention message.
    + * @param who Who requested your attention.
    + * @param type_code An index into the prpl's attention_types list determining the type
    + * of the attention request command to send.
    + *
    + * @since 2.5.0
    + */
    +void purple_prpl_got_attention(PurpleConnection *gc, const char *who, guint type_code);
    +
    +/**
    + * Process an incoming attention message in a chat.
    + *
    + * @param gc The connection that received the attention message.
    + * @param id The chat id.
    + * @param who Who requested your attention.
    + * @param type_code An index into the prpl's attention_types list determining the type
    + * of the attention request command to send.
    + *
    + * @since 2.5.0
    + */
    +void purple_prpl_got_attention_in_chat(PurpleConnection *gc, int id, const char *who, guint type_code);
    +
    +/**
    + * Determines if the contact supports the given media session type.
    + *
    + * @param account The account the user is on.
    + * @param who The name of the contact to check capabilities for.
    + *
    + * @return The media caps the contact supports.
    + */
    +PurpleMediaCaps purple_prpl_get_media_caps(PurpleAccount *account,
    + const char *who);
    +
    +/**
    + * Initiates a media session with the given contact.
    + *
    + * @param account The account the user is on.
    + * @param who The name of the contact to start a session with.
    + * @param type The type of media session to start.
    + *
    + * @return TRUE if the call succeeded else FALSE. (Doesn't imply the media session or stream will be successfully created)
    + */
    +gboolean purple_prpl_initiate_media(PurpleAccount *account,
    + const char *who,
    + PurpleMediaSessionType type);
    +
    +/**
    + * Signals that the prpl received capabilities for the given contact.
    + *
    + * This function is intended to be used only by prpls.
    + *
    + * @param account The account the user is on.
    + * @param who The name of the contact for which capabilities have been received.
    + * @since 2.7.0
    + */
    +void purple_prpl_got_media_caps(PurpleAccount *account, const char *who);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Protocol Plugin Subsystem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Finds a protocol plugin structure of the specified type.
    + *
    + * @param id The protocol plugin;
    + */
    +PurplePlugin *purple_find_prpl(const char *id);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#ifdef __COVERITY__
    +#undef PURPLE_PROTOCOL_PLUGIN_HAS_FUNC
    +#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) (prpl->member != NULL)
    +#endif
    +
    +#endif /* _PRPL_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/purple.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,105 @@
    +/**
    + * @file purple.h Header files and defines
    + * This file contains all the necessary preprocessor directives to include
    + * libpurple's headers and other preprocessor directives required for plugins
    + * or UIs to build. Including this file eliminates the need to directly
    + * include any other libpurple files.
    + *
    + * @ingroup core libpurple
    + * @since 2.3.0
    + */
    +
    +/* 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
    + */
    +
    +#ifndef _PURPLE_PURPLE_H_
    +#define _PURPLE_PURPLE_H_
    +
    +#include <glib.h>
    +
    +#ifndef G_GNUC_NULL_TERMINATED
    +# if __GNUC__ >= 4
    +# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
    +# else
    +# define G_GNUC_NULL_TERMINATED
    +# endif
    +#endif
    +
    +#undef PURPLE_PLUGINS
    +
    +#include <account.h>
    +#include <accountopt.h>
    +#include <blist.h>
    +#include <buddyicon.h>
    +#include <certificate.h>
    +#include <cipher.h>
    +#include <circbuffer.h>
    +#include <cmds.h>
    +#include <connection.h>
    +#include <conversation.h>
    +#include <core.h>
    +#include <debug.h>
    +#include <desktopitem.h>
    +#include <dnsquery.h>
    +#include <dnssrv.h>
    +#include <eventloop.h>
    +#include <ft.h>
    +#include <idle.h>
    +#include <imgstore.h>
    +#include <log.h>
    +#include <media.h>
    +#include <mediamanager.h>
    +#include <mime.h>
    +#include <nat-pmp.h>
    +#include <network.h>
    +#include <notify.h>
    +#include <ntlm.h>
    +#include <plugin.h>
    +#include <pluginpref.h>
    +#include <pounce.h>
    +#include <prefs.h>
    +#include <privacy.h>
    +#include <proxy.h>
    +#include <prpl.h>
    +#include <request.h>
    +#include <roomlist.h>
    +#include <savedstatuses.h>
    +#include <server.h>
    +#include <signals.h>
    +#include <smiley.h>
    +#include <sound.h>
    +#include <sound-theme.h>
    +#include <sound-theme-loader.h>
    +#include <sslconn.h>
    +#include <status.h>
    +#include <stringref.h>
    +#include <stun.h>
    +#include <theme.h>
    +#include <theme-loader.h>
    +#include <theme-manager.h>
    +#include <upnp.h>
    +#include <util.h>
    +#include <value.h>
    +#include <version.h>
    +#include <whiteboard.h>
    +#include <xmlnode.h>
    +
    +#endif
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/request.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1608 @@
    +/**
    + * @file request.h Request 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
    + */
    +#ifndef _PURPLE_REQUEST_H_
    +#define _PURPLE_REQUEST_H_
    +
    +#include <stdlib.h>
    +#include <glib-object.h>
    +#include <glib.h>
    +
    +/** @copydoc _PurpleRequestField */
    +typedef struct _PurpleRequestField PurpleRequestField;
    +
    +#include "account.h"
    +
    +#define PURPLE_DEFAULT_ACTION_NONE -1
    +
    +/**
    + * Request types.
    + */
    +typedef enum
    +{
    + PURPLE_REQUEST_INPUT = 0, /**< Text input request. */
    + PURPLE_REQUEST_CHOICE, /**< Multiple-choice request. */
    + PURPLE_REQUEST_ACTION, /**< Action request. */
    + PURPLE_REQUEST_FIELDS, /**< Multiple fields request. */
    + PURPLE_REQUEST_FILE, /**< File open or save request. */
    + PURPLE_REQUEST_FOLDER /**< Folder selection request. */
    +
    +} PurpleRequestType;
    +
    +/**
    + * A type of field.
    + */
    +typedef enum
    +{
    + PURPLE_REQUEST_FIELD_NONE,
    + PURPLE_REQUEST_FIELD_STRING,
    + PURPLE_REQUEST_FIELD_INTEGER,
    + PURPLE_REQUEST_FIELD_BOOLEAN,
    + PURPLE_REQUEST_FIELD_CHOICE,
    + PURPLE_REQUEST_FIELD_LIST,
    + PURPLE_REQUEST_FIELD_LABEL,
    + PURPLE_REQUEST_FIELD_IMAGE,
    + PURPLE_REQUEST_FIELD_ACCOUNT
    +
    +} PurpleRequestFieldType;
    +
    +/**
    + * Multiple fields request data.
    + */
    +typedef struct
    +{
    + GList *groups;
    +
    + GHashTable *fields;
    +
    + GList *required_fields;
    +
    + void *ui_data;
    +
    +} PurpleRequestFields;
    +
    +/**
    + * A group of fields with a title.
    + */
    +typedef struct
    +{
    + PurpleRequestFields *fields_list;
    +
    + char *title;
    +
    + GList *fields;
    +
    +} PurpleRequestFieldGroup;
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_REQUEST_C_)
    +/**
    + * A request field.
    + */
    +struct _PurpleRequestField
    +{
    + PurpleRequestFieldType type;
    + PurpleRequestFieldGroup *group;
    +
    + char *id;
    + char *label;
    + char *type_hint;
    +
    + gboolean visible;
    + gboolean required;
    +
    + union
    + {
    + struct
    + {
    + gboolean multiline;
    + gboolean masked;
    + gboolean editable;
    + char *default_value;
    + char *value;
    +
    + } string;
    +
    + struct
    + {
    + int default_value;
    + int value;
    +
    + } integer;
    +
    + struct
    + {
    + gboolean default_value;
    + gboolean value;
    +
    + } boolean;
    +
    + struct
    + {
    + int default_value;
    + int value;
    +
    + GList *labels;
    +
    + } choice;
    +
    + struct
    + {
    + GList *items;
    + GList *icons;
    + GHashTable *item_data;
    + GList *selected;
    + GHashTable *selected_table;
    +
    + gboolean multiple_selection;
    +
    + } list;
    +
    + struct
    + {
    + PurpleAccount *default_account;
    + PurpleAccount *account;
    + gboolean show_all;
    +
    + PurpleFilterAccountFunc filter_func;
    +
    + } account;
    +
    + struct
    + {
    + unsigned int scale_x;
    + unsigned int scale_y;
    + const char *buffer;
    + gsize size;
    + } image;
    +
    + } u;
    +
    + void *ui_data;
    +
    +};
    +#endif
    +
    +/**
    + * Request UI operations.
    + */
    +typedef struct
    +{
    + /** @see purple_request_input(). */
    + void *(*request_input)(const char *title, const char *primary,
    + const char *secondary, const char *default_value,
    + gboolean multiline, gboolean masked, gchar *hint,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv, void *user_data);
    +
    + /** @see purple_request_choice_varg(). */
    + void *(*request_choice)(const char *title, const char *primary,
    + const char *secondary, int default_value,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv, void *user_data,
    + va_list choices);
    +
    + /** @see purple_request_action_varg(). */
    + void *(*request_action)(const char *title, const char *primary,
    + const char *secondary, int default_action,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv, void *user_data,
    + size_t action_count, va_list actions);
    +
    + /** @see purple_request_fields(). */
    + void *(*request_fields)(const char *title, const char *primary,
    + const char *secondary, PurpleRequestFields *fields,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv, void *user_data);
    +
    + /** @see purple_request_file(). */
    + void *(*request_file)(const char *title, const char *filename,
    + gboolean savedialog, GCallback ok_cb,
    + GCallback cancel_cb, PurpleAccount *account,
    + const char *who, PurpleConversation *conv,
    + void *user_data);
    +
    + void (*close_request)(PurpleRequestType type, void *ui_handle);
    +
    + /** @see purple_request_folder(). */
    + void *(*request_folder)(const char *title, const char *dirname,
    + GCallback ok_cb, GCallback cancel_cb,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv, void *user_data);
    +
    + /** @see purple_request_action_with_icon_varg(). */
    + void *(*request_action_with_icon)(const char *title, const char *primary,
    + const char *secondary, int default_action,
    + PurpleAccount *account, const char *who,
    + PurpleConversation *conv,
    + gconstpointer icon_data, gsize icon_size,
    + void *user_data,
    + size_t action_count, va_list actions);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    +} PurpleRequestUiOps;
    +
    +typedef void (*PurpleRequestInputCb)(void *, const char *);
    +
    +/** The type of callbacks passed to purple_request_action(). The first
    + * argument is the @a user_data parameter; the second is the index in the list
    + * of actions of the one chosen.
    + */
    +typedef void (*PurpleRequestActionCb)(void *, int);
    +typedef void (*PurpleRequestChoiceCb)(void *, int);
    +typedef void (*PurpleRequestFieldsCb)(void *, PurpleRequestFields *fields);
    +typedef void (*PurpleRequestFileCb)(void *, const char *filename);
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Field List API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a list of fields to pass to purple_request_fields().
    + *
    + * @return A PurpleRequestFields structure.
    + */
    +PurpleRequestFields *purple_request_fields_new(void);
    +
    +/**
    + * Destroys a list of fields.
    + *
    + * @param fields The list of fields to destroy.
    + */
    +void purple_request_fields_destroy(PurpleRequestFields *fields);
    +
    +/**
    + * Adds a group of fields to the list.
    + *
    + * @param fields The fields list.
    + * @param group The group to add.
    + */
    +void purple_request_fields_add_group(PurpleRequestFields *fields,
    + PurpleRequestFieldGroup *group);
    +
    +/**
    + * Returns a list of all groups in a field list.
    + *
    + * @param fields The fields list.
    + *
    + * @constreturn A list of groups.
    + */
    +GList *purple_request_fields_get_groups(const PurpleRequestFields *fields);
    +
    +/**
    + * Returns whether or not the field with the specified ID exists.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return TRUE if the field exists, or FALSE.
    + */
    +gboolean purple_request_fields_exists(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns a list of all required fields.
    + *
    + * @param fields The fields list.
    + *
    + * @constreturn The list of required fields.
    + */
    +GList *purple_request_fields_get_required(const PurpleRequestFields *fields);
    +
    +/**
    + * Returns whether or not a field with the specified ID is required.
    + *
    + * @param fields The fields list.
    + * @param id The field ID.
    + *
    + * @return TRUE if the specified field is required, or FALSE.
    + */
    +gboolean purple_request_fields_is_field_required(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns whether or not all required fields have values.
    + *
    + * @param fields The fields list.
    + *
    + * @return TRUE if all required fields have values, or FALSE.
    + */
    +gboolean purple_request_fields_all_required_filled(
    + const PurpleRequestFields *fields);
    +
    +/**
    + * Return the field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The field, if found.
    + */
    +PurpleRequestField *purple_request_fields_get_field(
    + const PurpleRequestFields *fields, const char *id);
    +
    +/**
    + * Returns the string value of a field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The string value, if found, or @c NULL otherwise.
    + */
    +const char *purple_request_fields_get_string(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns the integer value of a field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The integer value, if found, or 0 otherwise.
    + */
    +int purple_request_fields_get_integer(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns the boolean value of a field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The boolean value, if found, or @c FALSE otherwise.
    + */
    +gboolean purple_request_fields_get_bool(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns the choice index of a field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The choice index, if found, or -1 otherwise.
    + */
    +int purple_request_fields_get_choice(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/**
    + * Returns the account of a field with the specified ID.
    + *
    + * @param fields The fields list.
    + * @param id The ID of the field.
    + *
    + * @return The account value, if found, or NULL otherwise.
    + */
    +PurpleAccount *purple_request_fields_get_account(const PurpleRequestFields *fields,
    + const char *id);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Fields Group API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a fields group with an optional title.
    + *
    + * @param title The optional title to give the group.
    + *
    + * @return A new fields group
    + */
    +PurpleRequestFieldGroup *purple_request_field_group_new(const char *title);
    +
    +/**
    + * Destroys a fields group.
    + *
    + * @param group The group to destroy.
    + */
    +void purple_request_field_group_destroy(PurpleRequestFieldGroup *group);
    +
    +/**
    + * Adds a field to the group.
    + *
    + * @param group The group to add the field to.
    + * @param field The field to add to the group.
    + */
    +void purple_request_field_group_add_field(PurpleRequestFieldGroup *group,
    + PurpleRequestField *field);
    +
    +/**
    + * Returns the title of a fields group.
    + *
    + * @param group The group.
    + *
    + * @return The title, if set.
    + */
    +const char *purple_request_field_group_get_title(
    + const PurpleRequestFieldGroup *group);
    +
    +/**
    + * Returns a list of all fields in a group.
    + *
    + * @param group The group.
    + *
    + * @constreturn The list of fields in the group.
    + */
    +GList *purple_request_field_group_get_fields(
    + const PurpleRequestFieldGroup *group);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a field of the specified type.
    + *
    + * @param id The field ID.
    + * @param text The text label of the field.
    + * @param type The type of field.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_new(const char *id, const char *text,
    + PurpleRequestFieldType type);
    +
    +/**
    + * Destroys a field.
    + *
    + * @param field The field to destroy.
    + */
    +void purple_request_field_destroy(PurpleRequestField *field);
    +
    +/**
    + * Sets the label text of a field.
    + *
    + * @param field The field.
    + * @param label The text label.
    + */
    +void purple_request_field_set_label(PurpleRequestField *field, const char *label);
    +
    +/**
    + * Sets whether or not a field is visible.
    + *
    + * @param field The field.
    + * @param visible TRUE if visible, or FALSE if not.
    + */
    +void purple_request_field_set_visible(PurpleRequestField *field, gboolean visible);
    +
    +/**
    + * Sets the type hint for the field.
    + *
    + * This is optionally used by the UIs to provide such features as
    + * auto-completion for type hints like "account" and "screenname".
    + *
    + * @param field The field.
    + * @param type_hint The type hint.
    + */
    +void purple_request_field_set_type_hint(PurpleRequestField *field,
    + const char *type_hint);
    +
    +/**
    + * Sets whether or not a field is required.
    + *
    + * @param field The field.
    + * @param required TRUE if required, or FALSE.
    + */
    +void purple_request_field_set_required(PurpleRequestField *field,
    + gboolean required);
    +
    +/**
    + * Returns the type of a field.
    + *
    + * @param field The field.
    + *
    + * @return The field's type.
    + */
    +PurpleRequestFieldType purple_request_field_get_type(const PurpleRequestField *field);
    +
    +/**
    + * Returns the group for the field.
    + *
    + * @param field The field.
    + *
    + * @return The UI data.
    + *
    + * @since 2.6.0
    + */
    +PurpleRequestFieldGroup *purple_request_field_get_group(const PurpleRequestField *field);
    +
    +/**
    + * Returns the ID of a field.
    + *
    + * @param field The field.
    + *
    + * @return The ID
    + */
    +const char *purple_request_field_get_id(const PurpleRequestField *field);
    +
    +/**
    + * Returns the label text of a field.
    + *
    + * @param field The field.
    + *
    + * @return The label text.
    + */
    +const char *purple_request_field_get_label(const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not a field is visible.
    + *
    + * @param field The field.
    + *
    + * @return TRUE if the field is visible. FALSE otherwise.
    + */
    +gboolean purple_request_field_is_visible(const PurpleRequestField *field);
    +
    +/**
    + * Returns the field's type hint.
    + *
    + * @param field The field.
    + *
    + * @return The field's type hint.
    + */
    +const char *purple_request_field_get_type_hint(const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not a field is required.
    + *
    + * @param field The field.
    + *
    + * @return TRUE if the field is required, or FALSE.
    + */
    +gboolean purple_request_field_is_required(const PurpleRequestField *field);
    +
    +/**
    + * Returns the ui_data for a field.
    + *
    + * @param field The field.
    + *
    + * @return The UI data.
    + *
    + * @since 2.6.0
    + */
    +gpointer purple_request_field_get_ui_data(const PurpleRequestField *field);
    +
    +/**
    + * Sets the ui_data for a field.
    + *
    + * @param field The field.
    + * @param ui_data The UI data.
    + *
    + * @return The UI data.
    + *
    + * @since 2.6.0
    + */
    +void purple_request_field_set_ui_data(PurpleRequestField *field,
    + gpointer ui_data);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name String Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a string request field.
    + *
    + * @param id The field ID.
    + * @param text The text label of the field.
    + * @param default_value The optional default value.
    + * @param multiline Whether or not this should be a multiline string.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_string_new(const char *id,
    + const char *text,
    + const char *default_value,
    + gboolean multiline);
    +
    +/**
    + * Sets the default value in a string field.
    + *
    + * @param field The field.
    + * @param default_value The default value.
    + */
    +void purple_request_field_string_set_default_value(PurpleRequestField *field,
    + const char *default_value);
    +
    +/**
    + * Sets the value in a string field.
    + *
    + * @param field The field.
    + * @param value The value.
    + */
    +void purple_request_field_string_set_value(PurpleRequestField *field,
    + const char *value);
    +
    +/**
    + * Sets whether or not a string field is masked
    + * (commonly used for password fields).
    + *
    + * @param field The field.
    + * @param masked The masked value.
    + */
    +void purple_request_field_string_set_masked(PurpleRequestField *field,
    + gboolean masked);
    +
    +/**
    + * Sets whether or not a string field is editable.
    + *
    + * @param field The field.
    + * @param editable The editable value.
    + */
    +void purple_request_field_string_set_editable(PurpleRequestField *field,
    + gboolean editable);
    +
    +/**
    + * Returns the default value in a string field.
    + *
    + * @param field The field.
    + *
    + * @return The default value.
    + */
    +const char *purple_request_field_string_get_default_value(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns the user-entered value in a string field.
    + *
    + * @param field The field.
    + *
    + * @return The value.
    + */
    +const char *purple_request_field_string_get_value(const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not a string field is multi-line.
    + *
    + * @param field The field.
    + *
    + * @return @c TRUE if the field is mulit-line, or @c FALSE otherwise.
    + */
    +gboolean purple_request_field_string_is_multiline(const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not a string field is masked.
    + *
    + * @param field The field.
    + *
    + * @return @c TRUE if the field is masked, or @c FALSE otherwise.
    + */
    +gboolean purple_request_field_string_is_masked(const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not a string field is editable.
    + *
    + * @param field The field.
    + *
    + * @return @c TRUE if the field is editable, or @c FALSE otherwise.
    + */
    +gboolean purple_request_field_string_is_editable(const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Integer Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates an integer field.
    + *
    + * @param id The field ID.
    + * @param text The text label of the field.
    + * @param default_value The default value.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_int_new(const char *id,
    + const char *text,
    + int default_value);
    +
    +/**
    + * Sets the default value in an integer field.
    + *
    + * @param field The field.
    + * @param default_value The default value.
    + */
    +void purple_request_field_int_set_default_value(PurpleRequestField *field,
    + int default_value);
    +
    +/**
    + * Sets the value in an integer field.
    + *
    + * @param field The field.
    + * @param value The value.
    + */
    +void purple_request_field_int_set_value(PurpleRequestField *field, int value);
    +
    +/**
    + * Returns the default value in an integer field.
    + *
    + * @param field The field.
    + *
    + * @return The default value.
    + */
    +int purple_request_field_int_get_default_value(const PurpleRequestField *field);
    +
    +/**
    + * Returns the user-entered value in an integer field.
    + *
    + * @param field The field.
    + *
    + * @return The value.
    + */
    +int purple_request_field_int_get_value(const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Boolean Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a boolean field.
    + *
    + * This is often represented as a checkbox.
    + *
    + * @param id The field ID.
    + * @param text The text label of the field.
    + * @param default_value The default value.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_bool_new(const char *id,
    + const char *text,
    + gboolean default_value);
    +
    +/**
    + * Sets the default value in an boolean field.
    + *
    + * @param field The field.
    + * @param default_value The default value.
    + */
    +void purple_request_field_bool_set_default_value(PurpleRequestField *field,
    + gboolean default_value);
    +
    +/**
    + * Sets the value in an boolean field.
    + *
    + * @param field The field.
    + * @param value The value.
    + */
    +void purple_request_field_bool_set_value(PurpleRequestField *field,
    + gboolean value);
    +
    +/**
    + * Returns the default value in an boolean field.
    + *
    + * @param field The field.
    + *
    + * @return The default value.
    + */
    +gboolean purple_request_field_bool_get_default_value(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns the user-entered value in an boolean field.
    + *
    + * @param field The field.
    + *
    + * @return The value.
    + */
    +gboolean purple_request_field_bool_get_value(const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Choice Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a multiple choice field.
    + *
    + * This is often represented as a group of radio buttons.
    + *
    + * @param id The field ID.
    + * @param text The optional label of the field.
    + * @param default_value The default choice.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_choice_new(const char *id,
    + const char *text,
    + int default_value);
    +
    +/**
    + * Adds a choice to a multiple choice field.
    + *
    + * @param field The choice field.
    + * @param label The choice label.
    + */
    +void purple_request_field_choice_add(PurpleRequestField *field,
    + const char *label);
    +
    +/**
    + * Sets the default value in an choice field.
    + *
    + * @param field The field.
    + * @param default_value The default value.
    + */
    +void purple_request_field_choice_set_default_value(PurpleRequestField *field,
    + int default_value);
    +
    +/**
    + * Sets the value in an choice field.
    + *
    + * @param field The field.
    + * @param value The value.
    + */
    +void purple_request_field_choice_set_value(PurpleRequestField *field, int value);
    +
    +/**
    + * Returns the default value in an choice field.
    + *
    + * @param field The field.
    + *
    + * @return The default value.
    + */
    +int purple_request_field_choice_get_default_value(const PurpleRequestField *field);
    +
    +/**
    + * Returns the user-entered value in an choice field.
    + *
    + * @param field The field.
    + *
    + * @return The value.
    + */
    +int purple_request_field_choice_get_value(const PurpleRequestField *field);
    +
    +/**
    + * Returns a list of labels in a choice field.
    + *
    + * @param field The field.
    + *
    + * @constreturn The list of labels.
    + */
    +GList *purple_request_field_choice_get_labels(const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name List Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a multiple list item field.
    + *
    + * @param id The field ID.
    + * @param text The optional label of the field.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_list_new(const char *id, const char *text);
    +
    +/**
    + * Sets whether or not a list field allows multiple selection.
    + *
    + * @param field The list field.
    + * @param multi_select TRUE if multiple selection is enabled,
    + * or FALSE otherwise.
    + */
    +void purple_request_field_list_set_multi_select(PurpleRequestField *field,
    + gboolean multi_select);
    +
    +/**
    + * Returns whether or not a list field allows multiple selection.
    + *
    + * @param field The list field.
    + *
    + * @return TRUE if multiple selection is enabled, or FALSE otherwise.
    + */
    +gboolean purple_request_field_list_get_multi_select(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns the data for a particular item.
    + *
    + * @param field The list field.
    + * @param text The item text.
    + *
    + * @return The data associated with the item.
    + */
    +void *purple_request_field_list_get_data(const PurpleRequestField *field,
    + const char *text);
    +
    +/**
    + * Adds an item to a list field.
    + *
    + * @param field The list field.
    + * @param item The list item.
    + * @param data The associated data.
    + *
    + * @deprecated Use purple_request_field_list_add_icon() instead.
    + */
    +void purple_request_field_list_add(PurpleRequestField *field,
    + const char *item, void *data);
    +
    +/**
    + * Adds an item to a list field.
    + *
    + * @param field The list field.
    + * @param item The list item.
    + * @param icon_path The path to icon file, or @c NULL for no icon.
    + * @param data The associated data.
    + */
    +void purple_request_field_list_add_icon(PurpleRequestField *field,
    + const char *item, const char* icon_path, void* data);
    +
    +/**
    + * Adds a selected item to the list field.
    + *
    + * @param field The field.
    + * @param item The item to add.
    + */
    +void purple_request_field_list_add_selected(PurpleRequestField *field,
    + const char *item);
    +
    +/**
    + * Clears the list of selected items in a list field.
    + *
    + * @param field The field.
    + */
    +void purple_request_field_list_clear_selected(PurpleRequestField *field);
    +
    +/**
    + * Sets a list of selected items in a list field.
    + *
    + * @param field The field.
    + * @param items The list of selected items, which is not modified or freed.
    + */
    +void purple_request_field_list_set_selected(PurpleRequestField *field,
    + GList *items);
    +
    +/**
    + * Returns whether or not a particular item is selected in a list field.
    + *
    + * @param field The field.
    + * @param item The item.
    + *
    + * @return TRUE if the item is selected. FALSE otherwise.
    + */
    +gboolean purple_request_field_list_is_selected(const PurpleRequestField *field,
    + const char *item);
    +
    +/**
    + * Returns a list of selected items in a list field.
    + *
    + * To retrieve the data for each item, use
    + * purple_request_field_list_get_data().
    + *
    + * @param field The field.
    + *
    + * @constreturn The list of selected items.
    + */
    +GList *purple_request_field_list_get_selected(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns a list of items in a list field.
    + *
    + * @param field The field.
    + *
    + * @constreturn The list of items.
    + */
    +GList *purple_request_field_list_get_items(const PurpleRequestField *field);
    +
    +/**
    + * Returns a list of icons in a list field.
    + *
    + * The icons will correspond with the items, in order.
    + *
    + * @param field The field.
    + *
    + * @constreturn The list of icons or @c NULL (i.e. the empty GList) if no
    + * items have icons.
    + */
    +GList *purple_request_field_list_get_icons(const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Label Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a label field.
    + *
    + * @param id The field ID.
    + * @param text The label of the field.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_label_new(const char *id,
    + const char *text);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Image Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates an image field.
    + *
    + * @param id The field ID.
    + * @param text The label of the field.
    + * @param buf The image data.
    + * @param size The size of the data in @a buffer.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_image_new(const char *id, const char *text,
    + const char *buf, gsize size);
    +
    +/**
    + * Sets the scale factors of an image field.
    + *
    + * @param field The image field.
    + * @param x The x scale factor.
    + * @param y The y scale factor.
    + */
    +void purple_request_field_image_set_scale(PurpleRequestField *field, unsigned int x, unsigned int y);
    +
    +/**
    + * Returns pointer to the image.
    + *
    + * @param field The image field.
    + *
    + * @return Pointer to the image.
    + */
    +const char *purple_request_field_image_get_buffer(PurpleRequestField *field);
    +
    +/**
    + * Returns size (in bytes) of the image.
    + *
    + * @param field The image field.
    + *
    + * @return Size of the image.
    + */
    +gsize purple_request_field_image_get_size(PurpleRequestField *field);
    +
    +/**
    + * Returns X scale coefficient of the image.
    + *
    + * @param field The image field.
    + *
    + * @return X scale coefficient of the image.
    + */
    +unsigned int purple_request_field_image_get_scale_x(PurpleRequestField *field);
    +
    +/**
    + * Returns Y scale coefficient of the image.
    + *
    + * @param field The image field.
    + *
    + * @return Y scale coefficient of the image.
    + */
    +unsigned int purple_request_field_image_get_scale_y(PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Account Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates an account field.
    + *
    + * By default, this field will not show offline accounts.
    + *
    + * @param id The field ID.
    + * @param text The text label of the field.
    + * @param account The optional default account.
    + *
    + * @return The new field.
    + */
    +PurpleRequestField *purple_request_field_account_new(const char *id,
    + const char *text,
    + PurpleAccount *account);
    +
    +/**
    + * Sets the default account on an account field.
    + *
    + * @param field The account field.
    + * @param default_value The default account.
    + */
    +void purple_request_field_account_set_default_value(PurpleRequestField *field,
    + PurpleAccount *default_value);
    +
    +/**
    + * Sets the account in an account field.
    + *
    + * @param field The account field.
    + * @param value The account.
    + */
    +void purple_request_field_account_set_value(PurpleRequestField *field,
    + PurpleAccount *value);
    +
    +/**
    + * Sets whether or not to show all accounts in an account field.
    + *
    + * If TRUE, all accounts, online or offline, will be shown. If FALSE,
    + * only online accounts will be shown.
    + *
    + * @param field The account field.
    + * @param show_all Whether or not to show all accounts.
    + */
    +void purple_request_field_account_set_show_all(PurpleRequestField *field,
    + gboolean show_all);
    +
    +/**
    + * Sets the account filter function in an account field.
    + *
    + * This function will determine which accounts get displayed and which
    + * don't.
    + *
    + * @param field The account field.
    + * @param filter_func The account filter function.
    + */
    +void purple_request_field_account_set_filter(PurpleRequestField *field,
    + PurpleFilterAccountFunc filter_func);
    +
    +/**
    + * Returns the default account in an account field.
    + *
    + * @param field The field.
    + *
    + * @return The default account.
    + */
    +PurpleAccount *purple_request_field_account_get_default_value(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns the user-entered account in an account field.
    + *
    + * @param field The field.
    + *
    + * @return The user-entered account.
    + */
    +PurpleAccount *purple_request_field_account_get_value(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns whether or not to show all accounts in an account field.
    + *
    + * If TRUE, all accounts, online or offline, will be shown. If FALSE,
    + * only online accounts will be shown.
    + *
    + * @param field The account field.
    + * @return Whether or not to show all accounts.
    + */
    +gboolean purple_request_field_account_get_show_all(
    + const PurpleRequestField *field);
    +
    +/**
    + * Returns the account filter function in an account field.
    + *
    + * This function will determine which accounts get displayed and which
    + * don't.
    + *
    + * @param field The account field.
    + *
    + * @return The account filter function.
    + */
    +PurpleFilterAccountFunc purple_request_field_account_get_filter(
    + const PurpleRequestField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Request API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Prompts the user for text input.
    + *
    + * @param handle The plugin or connection handle. For some
    + * things this is <em>extremely</em> important. The
    + * handle is used to programmatically close the request
    + * dialog when it is no longer needed. For PRPLs this
    + * is often a pointer to the #PurpleConnection
    + * instance. For plugins this should be a similar,
    + * unique memory location. This value is important
    + * because it allows a request to be closed with
    + * purple_request_close_with_handle() when, for
    + * example, you sign offline. If the request is
    + * <em>not</em> closed it is <strong>very</strong>
    + * likely to cause a crash whenever the callback
    + * handler functions are triggered.
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param primary The main point of the message, or @c NULL if you're
    + * feeling enigmatic.
    + * @param secondary Secondary information, or @c NULL if there is none.
    + * @param default_value The default value.
    + * @param multiline @c TRUE if the inputted text can span multiple lines.
    + * @param masked @c TRUE if the inputted text should be masked in some
    + * way (such as by displaying characters as stars). This
    + * might be because the input is some kind of password.
    + * @param hint Optionally suggest how the input box should appear.
    + * Use "html", for example, to allow the user to enter
    + * HTML.
    + * @param ok_text The text for the @c OK button, which may not be @c NULL.
    + * @param ok_cb The callback for the @c OK button, which may not be @c
    + * NULL.
    + * @param cancel_text The text for the @c Cancel button, which may not be @c
    + * NULL.
    + * @param cancel_cb The callback for the @c Cancel button, which may be
    + * @c NULL.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is.
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is.
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is.
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_input(void *handle, const char *title, const char *primary,
    + const char *secondary, const char *default_value, gboolean multiline,
    + gboolean masked, gchar *hint,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data);
    +
    +/**
    + * Prompts the user for multiple-choice input.
    + *
    + * @param handle The plugin or connection handle. For some things this
    + * is <em>extremely</em> important. See the comments on
    + * purple_request_input().
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param primary The main point of the message, or @c NULL if you're
    + * feeling enigmatic.
    + * @param secondary Secondary information, or @c NULL if there is none.
    + * @param default_value The default choice; this should be one of the values
    + * listed in the varargs.
    + * @param ok_text The text for the @c OK button, which may not be @c NULL.
    + * @param ok_cb The callback for the @c OK button, which may not be @c
    + * NULL.
    + * @param cancel_text The text for the @c Cancel button, which may not be @c
    + * NULL.
    + * @param cancel_cb The callback for the @c Cancel button, or @c NULL to
    + * do nothing.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is.
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is.
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is.
    + * @param user_data The data to pass to the callback.
    + * @param ... The choices, which should be pairs of <tt>char *</tt>
    + * descriptions and <tt>int</tt> values, terminated with a
    + * @c NULL parameter.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_choice(void *handle, const char *title, const char *primary,
    + const char *secondary, int default_value,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data, ...) G_GNUC_NULL_TERMINATED;
    +
    +/**
    + * <tt>va_list</tt> version of purple_request_choice(); see its documentation.
    + */
    +void *purple_request_choice_varg(void *handle, const char *title,
    + const char *primary, const char *secondary, int default_value,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data, va_list choices);
    +
    +/**
    + * Prompts the user for an action.
    + *
    + * This is often represented as a dialog with a button for each action.
    + *
    + * @param handle The plugin or connection handle. For some things this
    + * is <em>extremely</em> important. See the comments on
    + * purple_request_input().
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param primary The main point of the message, or @c NULL if you're
    + * feeling enigmatic.
    + * @param secondary Secondary information, or @c NULL if there is none.
    + * @param default_action The default action, zero-indexed; if the third action
    + * supplied should be the default, supply <tt>2</tt>.
    + * The should be the action that users are most likely
    + * to select.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is.
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is.
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is.
    + * @param user_data The data to pass to the callback.
    + * @param action_count The number of actions.
    + * @param ... A list of actions. These are pairs of
    + * arguments. The first of each pair is the
    + * <tt>char *</tt> label that appears on the button. It
    + * should have an underscore before the letter you want
    + * to use as the accelerator key for the button. The
    + * second of each pair is the #PurpleRequestActionCb
    + * function to use when the button is clicked.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_action(void *handle, const char *title, const char *primary,
    + const char *secondary, int default_action, PurpleAccount *account,
    + const char *who, PurpleConversation *conv, void *user_data,
    + size_t action_count, ...);
    +
    +/**
    + * <tt>va_list</tt> version of purple_request_action(); see its documentation.
    + */
    +void *purple_request_action_varg(void *handle, const char *title,
    + const char *primary, const char *secondary, int default_action,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data, size_t action_count, va_list actions);
    +
    +/**
    + * Version of purple_request_action() supplying an image for the UI to
    + * optionally display as an icon in the dialog; see its documentation
    + * @since 2.7.0
    + */
    +void *purple_request_action_with_icon(void *handle, const char *title,
    + const char *primary, const char *secondary, int default_action,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + gconstpointer icon_data, gsize icon_size, void *user_data,
    + size_t action_count, ...);
    +
    +/**
    + * <tt>va_list</tt> version of purple_request_action_with_icon();
    + * see its documentation.
    + * @since 2.7.0
    + */
    +void *purple_request_action_with_icon_varg(void *handle, const char *title,
    + const char *primary, const char *secondary, int default_action,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + gconstpointer icon_data, gsize icon_size,
    + void *user_data, size_t action_count, va_list actions);
    +
    +
    +/**
    + * Displays groups of fields for the user to fill in.
    + *
    + * @param handle The plugin or connection handle. For some things this
    + * is <em>extremely</em> important. See the comments on
    + * purple_request_input().
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param primary The main point of the message, or @c NULL if you're
    + * feeling enigmatic.
    + * @param secondary Secondary information, or @c NULL if there is none.
    + * @param fields The list of fields.
    + * @param ok_text The text for the @c OK button, which may not be @c NULL.
    + * @param ok_cb The callback for the @c OK button, which may not be @c
    + * NULL.
    + * @param cancel_text The text for the @c Cancel button, which may not be @c
    + * NULL.
    + * @param cancel_cb The callback for the @c Cancel button, which may be
    + * @c NULL.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_fields(void *handle, const char *title, const char *primary,
    + const char *secondary, PurpleRequestFields *fields,
    + const char *ok_text, GCallback ok_cb,
    + const char *cancel_text, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data);
    +
    +/**
    + * Closes a request.
    + *
    + * @param type The request type.
    + * @param uihandle The request UI handle.
    + */
    +void purple_request_close(PurpleRequestType type, void *uihandle);
    +
    +/**
    + * Closes all requests registered with the specified handle.
    + *
    + * @param handle The handle, as supplied as the @a handle parameter to one of the
    + * <tt>purple_request_*</tt> functions.
    + *
    + * @see purple_request_input().
    + */
    +void purple_request_close_with_handle(void *handle);
    +
    +/**
    + * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
    + */
    +#define purple_request_yes_no(handle, title, primary, secondary, \
    + default_action, account, who, conv, \
    + user_data, yes_cb, no_cb) \
    + purple_request_action((handle), (title), (primary), (secondary), \
    + (default_action), account, who, conv, (user_data), 2, \
    + _("_Yes"), (yes_cb), _("_No"), (no_cb))
    +
    +/**
    + * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
    + */
    +#define purple_request_ok_cancel(handle, title, primary, secondary, \
    + default_action, account, who, conv, \
    + user_data, ok_cb, cancel_cb) \
    + purple_request_action((handle), (title), (primary), (secondary), \
    + (default_action), account, who, conv, (user_data), 2, \
    + _("_OK"), (ok_cb), _("_Cancel"), (cancel_cb))
    +
    +/**
    + * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
    + */
    +#define purple_request_accept_cancel(handle, title, primary, secondary, \
    + default_action, account, who, conv, \
    + user_data, accept_cb, cancel_cb) \
    + purple_request_action((handle), (title), (primary), (secondary), \
    + (default_action), account, who, conv, (user_data), 2, \
    + _("_Accept"), (accept_cb), _("_Cancel"), (cancel_cb))
    +
    +/**
    + * A wrapper for purple_request_action_with_icon() that uses Accept and Cancel
    + * buttons.
    + */
    +#define purple_request_accept_cancel_with_icon(handle, title, primary, secondary, \
    + default_action, account, who, conv, \
    + icon_data, icon_size, \
    + user_data, accept_cb, cancel_cb) \
    + purple_request_action_with_icon((handle), (title), (primary), (secondary), \
    + (default_action), account, who, conv, icon_data, icon_size, \
    + (user_data), 2, \
    + _("_Accept"), (accept_cb), _("_Cancel"), (cancel_cb))
    +
    +/**
    + * Displays a file selector request dialog. Returns the selected filename to
    + * the callback. Can be used for either opening a file or saving a file.
    + *
    + * @param handle The plugin or connection handle. For some things this
    + * is <em>extremely</em> important. See the comments on
    + * purple_request_input().
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param filename The default filename (may be @c NULL)
    + * @param savedialog True if this dialog is being used to save a file.
    + * False if it is being used to open a file.
    + * @param ok_cb The callback for the @c OK button.
    + * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_file(void *handle, const char *title, const char *filename,
    + gboolean savedialog, GCallback ok_cb, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data);
    +
    +/**
    + * Displays a folder select dialog. Returns the selected filename to
    + * the callback.
    + *
    + * @param handle The plugin or connection handle. For some things this
    + * is <em>extremely</em> important. See the comments on
    + * purple_request_input().
    + * @param title The title of the message, or @c NULL if it should have
    + * no title.
    + * @param dirname The default directory name (may be @c NULL)
    + * @param ok_cb The callback for the @c OK button.
    + * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL.
    + * @param account The #PurpleAccount associated with this request, or @c
    + * NULL if none is
    + * @param who The username of the buddy associated with this request,
    + * or @c NULL if none is
    + * @param conv The #PurpleConversation associated with this request, or
    + * @c NULL if none is
    + * @param user_data The data to pass to the callback.
    + *
    + * @return A UI-specific handle.
    + */
    +void *purple_request_folder(void *handle, const char *title, const char *dirname,
    + GCallback ok_cb, GCallback cancel_cb,
    + PurpleAccount *account, const char *who, PurpleConversation *conv,
    + void *user_data);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used when displaying a
    + * request.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_request_set_ui_ops(PurpleRequestUiOps *ops);
    +
    +/**
    + * Returns the UI operations structure to be used when displaying a
    + * request.
    + *
    + * @return The UI operations structure.
    + */
    +PurpleRequestUiOps *purple_request_get_ui_ops(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_REQUEST_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/roomlist.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,398 @@
    +/**
    + * @file roomlist.h Room List 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
    + */
    +
    +#ifndef _PURPLE_ROOMLIST_H_
    +#define _PURPLE_ROOMLIST_H_
    +
    +typedef struct _PurpleRoomlist PurpleRoomlist;
    +typedef struct _PurpleRoomlistRoom PurpleRoomlistRoom;
    +typedef struct _PurpleRoomlistField PurpleRoomlistField;
    +/** @copydoc _PurpleRoomlistUiOps */
    +typedef struct _PurpleRoomlistUiOps PurpleRoomlistUiOps;
    +
    +/**
    + * The types of rooms.
    + *
    + * These are ORable flags.
    + */
    +typedef enum
    +{
    + PURPLE_ROOMLIST_ROOMTYPE_CATEGORY = 0x01, /**< It's a category, but not a room you can join. */
    + PURPLE_ROOMLIST_ROOMTYPE_ROOM = 0x02 /**< It's a room, like the kind you can join. */
    +
    +} PurpleRoomlistRoomType;
    +
    +/**
    + * The types of fields.
    + */
    +typedef enum
    +{
    + PURPLE_ROOMLIST_FIELD_BOOL,
    + PURPLE_ROOMLIST_FIELD_INT,
    + PURPLE_ROOMLIST_FIELD_STRING /**< We do a g_strdup on the passed value if it's this type. */
    +
    +} PurpleRoomlistFieldType;
    +
    +#include "account.h"
    +#include <glib.h>
    +
    +/**************************************************************************/
    +/** Data Structures */
    +/**************************************************************************/
    +
    +/**
    + * Represents a list of rooms for a given connection on a given protocol.
    + */
    +struct _PurpleRoomlist {
    + PurpleAccount *account; /**< The account this list belongs to. */
    + GList *fields; /**< The fields. */
    + GList *rooms; /**< The list of rooms. */
    + gboolean in_progress; /**< The listing is in progress. */
    + gpointer ui_data; /**< UI private data. */
    + gpointer proto_data; /** Prpl private data. */
    + guint ref; /**< The reference count. */
    +};
    +
    +/**
    + * Represents a room.
    + */
    +struct _PurpleRoomlistRoom {
    + PurpleRoomlistRoomType type; /**< The type of room. */
    + gchar *name; /**< The name of the room. */
    + GList *fields; /**< Other fields. */
    + PurpleRoomlistRoom *parent; /**< The parent room, or NULL. */
    + gboolean expanded_once; /**< A flag the UI uses to avoid multiple expand prpl cbs. */
    +};
    +
    +/**
    + * A field a room might have.
    + */
    +struct _PurpleRoomlistField {
    + PurpleRoomlistFieldType type; /**< The type of field. */
    + gchar *label; /**< The i18n user displayed name of the field. */
    + gchar *name; /**< The internal name of the field. */
    + gboolean hidden; /**< Hidden? */
    +};
    +
    +/**
    + * The room list ops to be filled out by the UI.
    + */
    +struct _PurpleRoomlistUiOps {
    + void (*show_with_account)(PurpleAccount *account); /**< Force the ui to pop up a dialog and get the list */
    + void (*create)(PurpleRoomlist *list); /**< A new list was created. */
    + void (*set_fields)(PurpleRoomlist *list, GList *fields); /**< Sets the columns. */
    + void (*add_room)(PurpleRoomlist *list, PurpleRoomlistRoom *room); /**< Add a room to the list. */
    + void (*in_progress)(PurpleRoomlist *list, gboolean flag); /**< Are we fetching stuff still? */
    + void (*destroy)(PurpleRoomlist *list); /**< We're destroying list. */
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Room List API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * This is used to get the room list on an account, asking the UI
    + * to pop up a dialog with the specified account already selected,
    + * and pretend the user clicked the get list button.
    + * While we're pretending, predend I didn't say anything about dialogs
    + * or buttons, since this is the core.
    + *
    + * @param account The account to get the list on.
    + */
    +void purple_roomlist_show_with_account(PurpleAccount *account);
    +
    +/**
    + * Returns a newly created room list object.
    + *
    + * It has an initial reference count of 1.
    + *
    + * @param account The account that's listing rooms.
    + * @return The new room list handle.
    + */
    +PurpleRoomlist *purple_roomlist_new(PurpleAccount *account);
    +
    +/**
    + * Increases the reference count on the room list.
    + *
    + * @param list The object to ref.
    + */
    +void purple_roomlist_ref(PurpleRoomlist *list);
    +
    +/**
    + * Decreases the reference count on the room list.
    + *
    + * The room list will be destroyed when this reaches 0.
    + *
    + * @param list The room list object to unref and possibly
    + * destroy.
    + */
    +void purple_roomlist_unref(PurpleRoomlist *list);
    +
    +/**
    + * Set the different field types and their names for this protocol.
    + *
    + * This must be called before purple_roomlist_room_add().
    + *
    + * @param list The room list.
    + * @param fields A GList of PurpleRoomlistField's. UI's are encouraged
    + * to default to displaying them in the order given.
    + */
    +void purple_roomlist_set_fields(PurpleRoomlist *list, GList *fields);
    +
    +/**
    + * Set the "in progress" state of the room list.
    + *
    + * The UI is encouraged to somehow hint to the user
    + * whether or not we're busy downloading a room list or not.
    + *
    + * @param list The room list.
    + * @param in_progress We're downloading it, or we're not.
    + */
    +void purple_roomlist_set_in_progress(PurpleRoomlist *list, gboolean in_progress);
    +
    +/**
    + * Gets the "in progress" state of the room list.
    + *
    + * The UI is encouraged to somehow hint to the user
    + * whether or not we're busy downloading a room list or not.
    + *
    + * @param list The room list.
    + * @return True if we're downloading it, or false if we're not.
    + */
    +gboolean purple_roomlist_get_in_progress(PurpleRoomlist *list);
    +
    +/**
    + * Adds a room to the list of them.
    + *
    + * @param list The room list.
    + * @param room The room to add to the list. The GList of fields must be in the same
    + order as was given in purple_roomlist_set_fields().
    +*/
    +void purple_roomlist_room_add(PurpleRoomlist *list, PurpleRoomlistRoom *room);
    +
    +/**
    + * Returns a PurpleRoomlist structure from the prpl, and
    + * instructs the prpl to start fetching the list.
    + *
    + * @param gc The PurpleConnection to have get a list.
    + *
    + * @return A PurpleRoomlist* or @c NULL if the protocol
    + * doesn't support that.
    + */
    +PurpleRoomlist *purple_roomlist_get_list(PurpleConnection *gc);
    +
    +/**
    + * Tells the prpl to stop fetching the list.
    + * If this is possible and done, the prpl will
    + * call set_in_progress with @c FALSE and possibly
    + * unref the list if it took a reference.
    + *
    + * @param list The room list to cancel a get_list on.
    + */
    +void purple_roomlist_cancel_get_list(PurpleRoomlist *list);
    +
    +/**
    + * Tells the prpl that a category was expanded.
    + *
    + * On some protocols, the rooms in the category
    + * won't be fetched until this is called.
    + *
    + * @param list The room list.
    + * @param category The category that was expanded. The expression
    + * (category->type & PURPLE_ROOMLIST_ROOMTYPE_CATEGORY)
    + * must be true.
    + */
    +void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category);
    +
    +/**
    + * Get the list of fields for a roomlist.
    + *
    + * @param roomlist The roomlist, which must not be @c NULL.
    + * @constreturn A list of fields
    + * @since 2.4.0
    + */
    +GList * purple_roomlist_get_fields(PurpleRoomlist *roomlist);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Room API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new room, to be added to the list.
    + *
    + * @param type The type of room.
    + * @param name The name of the room.
    + * @param parent The room's parent, if any.
    + *
    + * @return A new room.
    + */
    +PurpleRoomlistRoom *purple_roomlist_room_new(PurpleRoomlistRoomType type, const gchar *name,
    + PurpleRoomlistRoom *parent);
    +
    +/**
    + * Adds a field to a room.
    + *
    + * @param list The room list the room belongs to.
    + * @param room The room.
    + * @param field The field to append. Strings get g_strdup'd internally.
    + */
    +void purple_roomlist_room_add_field(PurpleRoomlist *list, PurpleRoomlistRoom *room, gconstpointer field);
    +
    +/**
    + * Join a room, given a PurpleRoomlistRoom and it's associated PurpleRoomlist.
    + *
    + * @param list The room list the room belongs to.
    + * @param room The room to join.
    + */
    +void purple_roomlist_room_join(PurpleRoomlist *list, PurpleRoomlistRoom *room);
    +
    +/**
    + * Get the type of a room.
    + * @param room The room, which must not be @c NULL.
    + * @return The type of the room.
    + * @since 2.4.0
    + */
    +PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room);
    +
    +/**
    + * Get the name of a room.
    + * @param room The room, which must not be @c NULL.
    + * @return The name of the room.
    + * @since 2.4.0
    + */
    +const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room);
    +
    +/**
    + * Get the parent of a room.
    + * @param room The room, which must not be @c NULL.
    + * @return The parent of the room, which can be @c NULL.
    + * @since 2.4.0
    + */
    +PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room);
    +
    +/**
    + * Get the list of fields for a room.
    + *
    + * @param room The room, which must not be @c NULL.
    + * @constreturn A list of fields
    + * @since 2.4.0
    + */
    +GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Room Field API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new field.
    + *
    + * @param type The type of the field.
    + * @param label The i18n'ed, user displayable name.
    + * @param name The internal name of the field.
    + * @param hidden Hide the field.
    + *
    + * @return A new PurpleRoomlistField, ready to be added to a GList and passed to
    + * purple_roomlist_set_fields().
    + */
    +PurpleRoomlistField *purple_roomlist_field_new(PurpleRoomlistFieldType type,
    + const gchar *label, const gchar *name,
    + gboolean hidden);
    +
    +/**
    + * Get the type of a field.
    + *
    + * @param field A PurpleRoomlistField, which must not be @c NULL.
    + *
    + * @return The type of the field.
    + * @since 2.4.0
    + */
    +PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field);
    +
    +/**
    + * Get the label of a field.
    + *
    + * @param field A PurpleRoomlistField, which must not be @c NULL.
    + *
    + * @return The label of the field.
    + * @since 2.4.0
    + */
    +const char * purple_roomlist_field_get_label(PurpleRoomlistField *field);
    +
    +/**
    + * Check whether a roomlist-field is hidden.
    + * @param field A PurpleRoomlistField, which must not be @c NULL.
    + *
    + * @return @c TRUE if the field is hidden, @c FALSE otherwise.
    + * @since 2.4.0
    + */
    +gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name UI Registration Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations structure to be used in all purple room lists.
    + *
    + * @param ops The UI operations structure.
    + */
    +void purple_roomlist_set_ui_ops(PurpleRoomlistUiOps *ops);
    +
    +/**
    + * Returns the purple window UI operations structure to be used in
    + * new windows.
    + *
    + * @return A filled-out PurpleRoomlistUiOps structure.
    + */
    +PurpleRoomlistUiOps *purple_roomlist_get_ui_ops(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_ROOMLIST_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/savedstatuses.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,425 @@
    +/**
    + * @file savedstatuses.h Saved Status API
    + * @ingroup core
    + * @see @ref savedstatus-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_SAVEDSTATUSES_H_
    +#define _PURPLE_SAVEDSTATUSES_H_
    +
    +/**
    + * Saved statuses don't really interact much with the rest of Purple. It
    + * could really be a plugin. It's just a list of away states. When
    + * a user chooses one of the saved states, their Purple accounts are set
    + * to the settings of that state.
    + *
    + * In the savedstatus API, there is the concept of a 'transient'
    + * saved status. A transient saved status is one that is not
    + * permanent. Purple will removed it automatically if it isn't
    + * used for a period of time. Transient saved statuses don't
    + * have titles and they don't show up in the list of saved
    + * statuses. In fact, if a saved status does not have a title
    + * then it is transient. If it does have a title, then it is not
    + * transient.
    + *
    + * What good is a transient status, you ask? They can be used to
    + * keep track of the user's 5 most recently used statuses, for
    + * example. Basically if they just set a message on the fly,
    + * we'll cache it for them in case they want to use it again. If
    + * they don't use it again, we'll just delete it.
    + */
    +
    +/*
    + * TODO: Hmm. We should probably just be saving PurplePresences. That's
    + * something we should look into once the status box gets fleshed
    + * out more.
    + */
    +
    +typedef struct _PurpleSavedStatus PurpleSavedStatus;
    +typedef struct _PurpleSavedStatusSub PurpleSavedStatusSub;
    +
    +#include "status.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Saved status subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Create a new saved status. This will add the saved status to the
    + * list of saved statuses and writes the revised list to status.xml.
    + *
    + * @param title The title of the saved status. This must be
    + * unique. Or, if you want to create a transient
    + * saved status, then pass in NULL.
    + * @param type The type of saved status.
    + *
    + * @return The newly created saved status, or NULL if the title you
    + * used was already taken.
    + */
    +PurpleSavedStatus *purple_savedstatus_new(const char *title,
    + PurpleStatusPrimitive type);
    +
    +/**
    + * Set the title for the given saved status.
    + *
    + * @param status The saved status.
    + * @param title The title of the saved status.
    + */
    +void purple_savedstatus_set_title(PurpleSavedStatus *status,
    + const char *title);
    +
    +/**
    + * Set the type for the given saved status.
    + *
    + * @param status The saved status.
    + * @param type The type of saved status.
    + */
    +void purple_savedstatus_set_type(PurpleSavedStatus *status,
    + PurpleStatusPrimitive type);
    +
    +/**
    + * Set the message for the given saved status.
    + *
    + * @param status The saved status.
    + * @param message The message, or NULL if you want to unset the
    + * message for this status.
    + */
    +void purple_savedstatus_set_message(PurpleSavedStatus *status,
    + const char *message);
    +
    +/**
    + * Set a substatus for an account in a saved status.
    + *
    + * @param status The saved status.
    + * @param account The account.
    + * @param type The status type for the account in the staved
    + * status.
    + * @param message The message for the account in the substatus.
    + */
    +void purple_savedstatus_set_substatus(PurpleSavedStatus *status,
    + const PurpleAccount *account,
    + const PurpleStatusType *type,
    + const char *message);
    +
    +/**
    + * Unset a substatus for an account in a saved status. This clears
    + * the previosly set substatus for the PurpleSavedStatus. If this
    + * saved status is activated then this account will use the default
    + * status type and message.
    + *
    + * @param saved_status The saved status.
    + * @param account The account.
    +*/
    +void purple_savedstatus_unset_substatus(PurpleSavedStatus *saved_status,
    + const PurpleAccount *account);
    +
    +/**
    + * Delete a saved status. This removes the saved status from the list
    + * of saved statuses, and writes the revised list to status.xml.
    + *
    + * @param title The title of the saved status.
    + *
    + * @return TRUE if the status was successfully deleted. FALSE if the
    + * status could not be deleted because no saved status exists
    + * with the given title.
    + */
    +gboolean purple_savedstatus_delete(const char *title);
    +
    +/**
    + * Delete a saved status. This removes the saved status from the list
    + * of saved statuses, and writes the revised list to status.xml.
    + *
    + * @param saved_status the status to delete, the pointer is invalid after
    + * the call
    + *
    + */
    +void purple_savedstatus_delete_by_status(PurpleSavedStatus *saved_status);
    +
    +/**
    + * Returns all saved statuses.
    + *
    + * @constreturn A list of saved statuses.
    + */
    +GList *purple_savedstatuses_get_all(void);
    +
    +/**
    + * Returns the n most popular saved statuses. "Popularity" is
    + * determined by when the last time a saved_status was used and
    + * how many times it has been used. Transient statuses without
    + * messages are not included in the list.
    + *
    + * @param how_many The maximum number of saved statuses
    + * to return, or '0' to get all saved
    + * statuses sorted by popularity.
    + * @return A linked list containing at most how_many
    + * PurpleSavedStatuses. This list should be
    + * g_list_free'd by the caller (but the
    + * PurpleSavedStatuses must not be free'd).
    + */
    +GList *purple_savedstatuses_get_popular(unsigned int how_many);
    +
    +/**
    + * Returns the currently selected saved status. If we are idle
    + * then this returns purple_savedstatus_get_idleaway(). Otherwise
    + * it returns purple_savedstatus_get_default().
    + *
    + * @return A pointer to the in-use PurpleSavedStatus.
    + * This function never returns NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_get_current(void);
    +
    +/**
    + * Returns the default saved status that is used when our
    + * accounts are not idle-away.
    + *
    + * @return A pointer to the in-use PurpleSavedStatus.
    + * This function never returns NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_get_default(void);
    +
    +/**
    + * Returns the saved status that is used when your
    + * accounts become idle-away.
    + *
    + * @return A pointer to the idle-away PurpleSavedStatus.
    + * This function never returns NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_get_idleaway(void);
    +
    +/**
    + * Return TRUE if we are currently idle-away. Otherwise
    + * returns FALSE.
    + *
    + * @return TRUE if our accounts have been set to idle-away.
    + */
    +gboolean purple_savedstatus_is_idleaway(void);
    +
    +/**
    + * Set whether accounts in Purple are idle-away or not.
    + *
    + * @param idleaway TRUE if accounts should be switched to use the
    + * idle-away saved status. FALSE if they should
    + * be switched to use the default status.
    + */
    +void purple_savedstatus_set_idleaway(gboolean idleaway);
    +
    +/**
    + * Returns the status to be used when purple is starting up
    + *
    + * @return A pointer to the startup PurpleSavedStatus.
    + * This function never returns NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_get_startup(void);
    +
    +/**
    + * Finds a saved status with the specified title.
    + *
    + * @param title The name of the saved status.
    + *
    + * @return The saved status if found, or NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_find(const char *title);
    +
    +/**
    + * Finds a saved status with the specified creation time.
    + *
    + * @param creation_time The timestamp when the saved
    + * status was created.
    + *
    + * @return The saved status if found, or NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_find_by_creation_time(time_t creation_time);
    +
    +/**
    + * Finds a saved status with the specified primitive and message.
    + *
    + * @param type The PurpleStatusPrimitive for the status you're trying
    + * to find.
    + * @param message The message for the status you're trying
    + * to find.
    + *
    + * @return The saved status if found, or NULL.
    + */
    +PurpleSavedStatus *purple_savedstatus_find_transient_by_type_and_message(PurpleStatusPrimitive type, const char *message);
    +
    +/**
    + * Determines if a given saved status is "transient."
    + * A transient saved status is one that was not
    + * explicitly added by the user. Transient statuses
    + * are automatically removed if they are not used
    + * for a period of time.
    + *
    + * A transient saved statuses is automatically
    + * created by the status box when the user sets himself
    + * to one of the generic primitive statuses. The reason
    + * we need to save this status information is so we can
    + * restore it when Purple restarts.
    + *
    + * @param saved_status The saved status.
    + *
    + * @return TRUE if the saved status is transient.
    + */
    +gboolean purple_savedstatus_is_transient(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Return the name of a given saved status.
    + *
    + * @param saved_status The saved status.
    + *
    + * @return The title. This value may be a static buffer which may
    + * be overwritten on subsequent calls to this function. If
    + * you need a reference to the title for prolonged use then
    + * you should make a copy of it.
    + */
    +const char *purple_savedstatus_get_title(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Return the type of a given saved status.
    + *
    + * @param saved_status The saved status.
    + *
    + * @return The name.
    + */
    +PurpleStatusPrimitive purple_savedstatus_get_type(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Return the default message of a given saved status.
    + *
    + * @param saved_status The saved status.
    + *
    + * @return The message. This will return NULL if the saved
    + * status does not have a message. This will
    + * contain the normal markup that is created by
    + * Purple's IMHTML (basically HTML markup).
    + */
    +const char *purple_savedstatus_get_message(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Return the time in seconds-since-the-epoch when this
    + * saved status was created. Note: For any status created
    + * by Purple 1.5.0 or older this value will be invalid and
    + * very small (close to 0). This is because Purple 1.5.0
    + * and older did not record the timestamp when the status
    + * was created.
    + *
    + * However, this value is guaranteed to be a unique
    + * identifier for the given saved status.
    + *
    + * @param saved_status The saved status.
    + *
    + * @return The timestamp when this saved status was created.
    + */
    +time_t purple_savedstatus_get_creation_time(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Determine if a given saved status has "substatuses,"
    + * or if it is a simple status (the same for all
    + * accounts).
    + *
    + * @param saved_status The saved status.
    + *
    + * @return TRUE if the saved_status has substatuses.
    + * FALSE otherwise.
    + */
    +gboolean purple_savedstatus_has_substatuses(const PurpleSavedStatus *saved_status);
    +
    +/**
    + * Get the substatus for an account in a saved status.
    + *
    + * @param saved_status The saved status.
    + * @param account The account.
    + *
    + * @return The PurpleSavedStatusSub for the account, or NULL if
    + * the given account does not have a substatus that
    + * differs from the default status of this PurpleSavedStatus.
    + */
    +PurpleSavedStatusSub *purple_savedstatus_get_substatus(
    + const PurpleSavedStatus *saved_status,
    + const PurpleAccount *account);
    +
    +/**
    + * Get the status type of a given substatus.
    + *
    + * @param substatus The substatus.
    + *
    + * @return The status type.
    + */
    +const PurpleStatusType *purple_savedstatus_substatus_get_type(const PurpleSavedStatusSub *substatus);
    +
    +/**
    + * Get the message of a given substatus.
    + *
    + * @param substatus The substatus.
    + *
    + * @return The message of the substatus, or NULL if this substatus does
    + * not have a message.
    + */
    +const char *purple_savedstatus_substatus_get_message(const PurpleSavedStatusSub *substatus);
    +
    +/**
    + * Sets the statuses for all your accounts to those specified
    + * by the given saved_status. This function calls
    + * purple_savedstatus_activate_for_account() for all your accounts.
    + *
    + * @param saved_status The status you want to set your accounts to.
    + */
    +void purple_savedstatus_activate(PurpleSavedStatus *saved_status);
    +
    +/**
    + * Sets the statuses for a given account to those specified
    + * by the given saved_status.
    + *
    + * @param saved_status The status you want to set your accounts to.
    + * @param account The account whose statuses you want to change.
    + */
    +void purple_savedstatus_activate_for_account(const PurpleSavedStatus *saved_status, PurpleAccount *account);
    +
    +/**
    + * Get the handle for the status subsystem.
    + *
    + * @return the handle to the status subsystem
    + */
    +void *purple_savedstatuses_get_handle(void);
    +
    +/**
    + * Initializes the status subsystem.
    + */
    +void purple_savedstatuses_init(void);
    +
    +/**
    + * Uninitializes the status subsystem.
    + */
    +void purple_savedstatuses_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SAVEDSTATUSES_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/search.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,152 @@
    +/**
    + * @file search.h
    + *
    + * purple
    + *
    + * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
    + *
    + * 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
    + */
    +
    +
    +#ifndef _PURPLE_GG_SEARCH_H
    +#define _PURPLE_GG_SEARCH_H
    +
    +#include "connection.h"
    +
    +#include <libgadu.h>
    +#include "gg.h"
    +
    +
    +typedef enum {
    + GGP_SEARCH_TYPE_INFO,
    + GGP_SEARCH_TYPE_FULL
    +
    +} GGPSearchType;
    +
    +typedef struct {
    +
    + char *uin;
    + char *lastname;
    + char *firstname;
    + char *nickname;
    + char *city;
    + char *birthyear;
    + char *gender;
    + char *active;
    +
    + GGPSearchType search_type;
    + guint32 seq;
    + guint16 page_number;
    + guint16 page_size; /* how many contacts fits into one page of results */
    +
    + void *user_data;
    + void *window;
    +} GGPSearchForm;
    +
    +typedef GHashTable GGPSearches;
    +
    +
    +/**
    + * Create a new GGPSearchForm structure, and set the fields
    + * to the sane defaults.
    + *
    + * @return Newly allocated GGPSearchForm.
    + */
    +GGPSearchForm *
    +ggp_search_form_new(GGPSearchType st);
    +
    +/**
    + * Destroy a Search Form.
    + *
    + * @param form Search Form to destroy.
    + */
    +void
    +ggp_search_form_destroy(GGPSearchForm *form);
    +
    +/**
    + * Add a search to the list of searches.
    + *
    + * @param searches The list of searches.
    + * @param seq Search (form) ID number.
    + * @param form The search form to add.
    + */
    +void
    +ggp_search_add(GGPSearches *searches, guint32 seq, GGPSearchForm *form);
    +
    +/**
    + * Remove a search from the list.
    + *
    + * If you want to destory the search completely also call:
    + * ggp_search_form_destroy().
    + *
    + * @param searches The list of searches.
    + * @param seq ID number of the search.
    + */
    +void
    +ggp_search_remove(GGPSearches *searches, guint32 seq);
    +
    +/**
    + * Return the search with the specified ID.
    + *
    + * @param searches The list of searches.
    + * @param seq ID number of the search.
    + */
    +GGPSearchForm *
    +ggp_search_get(GGPSearches *searches, guint32 seq);
    +
    +/**
    + * Create a new GGPSearches structure.
    + *
    + * @return GGPSearches instance.
    + */
    +GGPSearches *
    +ggp_search_new(void);
    +
    +/**
    + * Destroy GGPSearches instance.
    + *
    + * @param searches GGPSearches instance.
    + */
    +void
    +ggp_search_destroy(GGPSearches *searches);
    +
    +/**
    + * Initiate a search in the public directory.
    + *
    + * @param gc PurpleConnection.
    + * @param form Filled in GGPSearchForm.
    + *
    + * @return Sequence number of a search or 0 if an error occurred.
    + */
    +guint32
    +ggp_search_start(PurpleConnection *gc, GGPSearchForm *form);
    +
    +/*
    + * Return converted to the UTF-8 value of the specified field.
    + *
    + * @param res Public directory look-up result.
    + * @param num Id of the record.
    + * @param fileld Name of the field.
    + *
    + * @return UTF-8 encoded value of the field.
    + */
    +char *
    +ggp_search_get_result(gg_pubdir50_t res, int num, const char *field);
    +
    +
    +#endif /* _PURPLE_GG_SEARCH_H */
    +
    +/* vim: set ts=8 sts=0 sw=8 noet: */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/server.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,218 @@
    +/**
    + * @file server.h Server 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
    + */
    +#ifndef _PURPLE_SERVER_H_
    +#define _PURPLE_SERVER_H_
    +
    +#include "account.h"
    +#include "conversation.h"
    +#include "prpl.h"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Send a typing message to a given user over a given connection.
    + *
    + * TODO: Could probably move this into the conversation API.
    + *
    + * @param gc The connection over which to send the typing notification.
    + * @param name The user to send the typing notification to.
    + * @param state One of PURPLE_TYPING, PURPLE_TYPED, or PURPLE_NOT_TYPING.
    + * @return A quiet-period, specified in seconds, where Purple will not
    + * send any additional typing notification messages. Most
    + * protocols should return 0, which means that no additional
    + * PURPLE_TYPING messages need to be sent. If this is 5, for
    + * example, then Purple will wait five seconds, and if the Purple
    + * user is still typing then Purple will send another PURPLE_TYPING
    + * message.
    + */
    +unsigned int serv_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state);
    +
    +void serv_move_buddy(PurpleBuddy *, PurpleGroup *, PurpleGroup *);
    +int serv_send_im(PurpleConnection *, const char *, const char *, PurpleMessageFlags flags);
    +
    +/** Get information about an account's attention commands, from the prpl.
    + *
    + * @return The attention command numbered 'code' from the prpl's attention_types, or NULL.
    + */
    +PurpleAttentionType *purple_get_attention_type_from_code(PurpleAccount *account, guint type_code);
    +
    +/** Send an attention request message.
    + *
    + * @deprecated Use purple_prpl_send_attention() instead.
    + *
    + * @param gc The connection to send the message on.
    + * @param who Whose attention to request.
    + * @param type_code An index into the prpl's attention_types list determining the type
    + * of the attention request command to send. 0 if prpl only defines one,
    + * but protocols are allowed to define more.
    + *
    + * Note that you can't send arbitrary PurpleAttentionType's, because there is
    + * only a fixed set of attention commands.
    + */
    +void serv_send_attention(PurpleConnection *gc, const char *who, guint type_code);
    +
    +/** Process an incoming attention message.
    + *
    + * @deprecated Use purple_prpl_got_attention() instead.
    + *
    + * @param gc The connection that received the attention message.
    + * @param who Who requested your attention.
    + * @param type_code An index into the prpl's attention_types list determining the type
    + * of the attention request command to send.
    + */
    +void serv_got_attention(PurpleConnection *gc, const char *who, guint type_code);
    +
    +void serv_get_info(PurpleConnection *, const char *);
    +void serv_set_info(PurpleConnection *, const char *);
    +
    +void serv_add_permit(PurpleConnection *, const char *);
    +void serv_add_deny(PurpleConnection *, const char *);
    +void serv_rem_permit(PurpleConnection *, const char *);
    +void serv_rem_deny(PurpleConnection *, const char *);
    +void serv_set_permit_deny(PurpleConnection *);
    +void serv_chat_invite(PurpleConnection *, int, const char *, const char *);
    +void serv_chat_leave(PurpleConnection *, int);
    +void serv_chat_whisper(PurpleConnection *, int, const char *, const char *);
    +int serv_chat_send(PurpleConnection *, int, const char *, PurpleMessageFlags flags);
    +void serv_alias_buddy(PurpleBuddy *);
    +void serv_got_alias(PurpleConnection *gc, const char *who, const char *alias);
    +
    +/**
    + * A protocol plugin should call this when it retrieves a private alias from
    + * the server. Private aliases are the aliases the user sets, while public
    + * aliases are the aliases or display names that buddies set for themselves.
    + *
    + * @param gc The connection on which the alias was received.
    + * @param who The name of the buddy whose alias was received.
    + * @param alias The alias that was received.
    + */
    +void purple_serv_got_private_alias(PurpleConnection *gc, const char *who, const char *alias);
    +
    +
    +/**
    + * Receive a typing message from a remote user. Either PURPLE_TYPING
    + * or PURPLE_TYPED. If the user has stopped typing then use
    + * serv_got_typing_stopped instead.
    + *
    + * TODO: Could probably move this into the conversation API.
    + *
    + * @param gc The connection on which the typing message was received.
    + * @param name The name of the remote user.
    + * @param timeout If this is a number greater than 0, then
    + * Purple will wait this number of seconds and then
    + * set this buddy to the PURPLE_NOT_TYPING state. This
    + * is used by protocols that send repeated typing messages
    + * while the user is composing the message.
    + * @param state The typing state received
    + */
    +void serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
    + PurpleTypingState state);
    +
    +/**
    + * TODO: Could probably move this into the conversation API.
    + */
    +void serv_got_typing_stopped(PurpleConnection *gc, const char *name);
    +
    +void serv_got_im(PurpleConnection *gc, const char *who, const char *msg,
    + PurpleMessageFlags flags, time_t mtime);
    +
    +/**
    + * @param data The hash function should be g_str_hash() and the equal
    + * function should be g_str_equal().
    + */
    +void serv_join_chat(PurpleConnection *, GHashTable *data);
    +
    +/**
    + * @param data The hash function should be g_str_hash() and the equal
    + * function should be g_str_equal().
    + */
    +void serv_reject_chat(PurpleConnection *, GHashTable *data);
    +
    +/**
    + * Called by a prpl when an account is invited into a chat.
    + *
    + * @param gc The connection on which the invite arrived.
    + * @param name The name of the chat you're being invited to.
    + * @param who The username of the person inviting the account.
    + * @param message The optional invite message.
    + * @param data The components necessary if you want to call serv_join_chat().
    + * The hash function should be g_str_hash() and the equal
    + * function should be g_str_equal().
    + */
    +void serv_got_chat_invite(PurpleConnection *gc, const char *name,
    + const char *who, const char *message,
    + GHashTable *data);
    +
    +/**
    + * Called by a prpl when an account has joined a chat.
    + *
    + * @param gc The connection on which the chat was joined.
    + * @param id The id of the chat, assigned by the prpl.
    + * @param name The name of the chat.
    + * @return The resulting conversation
    + */
    +PurpleConversation *serv_got_joined_chat(PurpleConnection *gc,
    + int id, const char *name);
    +/**
    + * Called by a prpl when an attempt to join a chat via serv_join_chat()
    + * fails.
    + *
    + * @param gc The connection on which chat joining failed
    + * @param data The components passed to serv_join_chat() originally.
    + * The hash function should be g_str_hash() and the equal
    + * function should be g_str_equal().
    + */
    +void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data);
    +
    +/**
    + * Called by a prpl when an account has left a chat.
    + *
    + * @param g The connection on which the chat was left.
    + * @param id The id of the chat, as assigned by the prpl.
    + */
    +void serv_got_chat_left(PurpleConnection *g, int id);
    +
    +/**
    + * Called by a prpl when a message has been received in a chat.
    + *
    + * @param g The connection on which the message was received.
    + * @param id The id of the chat, as assigned by the prpl.
    + * @param who The name of the user who sent the message.
    + * @param flags The flags of the message.
    + * @param message The message received in the chat.
    + * @param mtime The time when the message was received.
    + */
    +void serv_got_chat_in(PurpleConnection *g, int id, const char *who,
    + PurpleMessageFlags flags, const char *message, time_t mtime);
    +void serv_send_file(PurpleConnection *gc, const char *who, const char *file);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SERVER_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/si.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,40 @@
    +/**
    + * @file si.h SI transfer functions
    + *
    + * 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
    + */
    +#ifndef PURPLE_JABBER_SI_H_
    +#define PURPLE_JABBER_SI_H_
    +
    +#include "ft.h"
    +
    +#include "jabber.h"
    +
    +void jabber_bytestreams_parse(JabberStream *js, const char *from,
    + JabberIqType type, const char *id, xmlnode *query);
    +void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type,
    + const char *id, xmlnode *si);
    +PurpleXfer *jabber_si_new_xfer(PurpleConnection *gc, const char *who);
    +void jabber_si_xfer_send(PurpleConnection *gc, const char *who, const char *file);
    +void jabber_si_init(void);
    +void jabber_si_uninit(void);
    +
    +#endif /* PURPLE_JABBER_SI_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/signals.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,380 @@
    +/**
    + * @file signals.h Signal 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
    + */
    +#ifndef _PURPLE_SIGNALS_H_
    +#define _PURPLE_SIGNALS_H_
    +
    +#include <glib.h>
    +#include "value.h"
    +
    +#define PURPLE_CALLBACK(func) ((PurpleCallback)func)
    +
    +typedef void (*PurpleCallback)(void);
    +typedef void (*PurpleSignalMarshalFunc)(PurpleCallback cb, va_list args,
    + void *data, void **return_val);
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Signal API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/** The priority of a signal connected using purple_signal_connect().
    + *
    + * @see purple_signal_connect_priority()
    + */
    +#define PURPLE_SIGNAL_PRIORITY_DEFAULT 0
    +/** The largest signal priority; signals with this priority will be called
    + * <em>last</em>. (This is highest as in numerical value, not as in order of
    + * importance.)
    + *
    + * @see purple_signal_connect_priority().
    + */
    +#define PURPLE_SIGNAL_PRIORITY_HIGHEST 9999
    +/** The smallest signal priority; signals with this priority will be called
    + * <em>first</em>. (This is lowest as in numerical value, not as in order of
    + * importance.)
    + *
    + * @see purple_signal_connect_priority().
    + */
    +#define PURPLE_SIGNAL_PRIORITY_LOWEST -9999
    +
    +/**
    + * Registers a signal in an instance.
    + *
    + * @param instance The instance to register the signal for.
    + * @param signal The signal name.
    + * @param marshal The marshal function.
    + * @param ret_value The return value type, or NULL for no return value.
    + * @param num_values The number of values to be passed to the callbacks.
    + * @param ... The values to pass to the callbacks.
    + *
    + * @return The signal ID local to that instance, or 0 if the signal
    + * couldn't be registered.
    + *
    + * @see PurpleValue
    + */
    +gulong purple_signal_register(void *instance, const char *signal,
    + PurpleSignalMarshalFunc marshal,
    + PurpleValue *ret_value, int num_values, ...);
    +
    +/**
    + * Unregisters a signal in an instance.
    + *
    + * @param instance The instance to unregister the signal for.
    + * @param signal The signal name.
    + */
    +void purple_signal_unregister(void *instance, const char *signal);
    +
    +/**
    + * Unregisters all signals in an instance.
    + *
    + * @param instance The instance to unregister the signal for.
    + */
    +void purple_signals_unregister_by_instance(void *instance);
    +
    +/**
    + * Returns a list of value types used for a signal.
    + *
    + * @param instance The instance the signal is registered to.
    + * @param signal The signal.
    + * @param ret_value The return value from the last signal handler.
    + * @param num_values The returned number of values.
    + * @param values The returned list of values.
    + */
    +void purple_signal_get_values(void *instance, const char *signal,
    + PurpleValue **ret_value,
    + int *num_values, PurpleValue ***values);
    +
    +/**
    + * Connects a signal handler to a signal for a particular object.
    + *
    + * Take care not to register a handler function twice. Purple will
    + * not correct any mistakes for you in this area.
    + *
    + * @param instance The instance to connect to.
    + * @param signal The name of the signal to connect.
    + * @param handle The handle of the receiver.
    + * @param func The callback function.
    + * @param data The data to pass to the callback function.
    + * @param priority The priority with which the handler should be called. Signal
    + * handlers are called in ascending numerical order of @a
    + * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
    + * #PURPLE_SIGNAL_PRIORITY_HIGHEST.
    + *
    + * @return The signal handler ID.
    + *
    + * @see purple_signal_disconnect()
    + */
    +gulong purple_signal_connect_priority(void *instance, const char *signal,
    + void *handle, PurpleCallback func, void *data, int priority);
    +
    +/**
    + * Connects a signal handler to a signal for a particular object.
    + * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
    + *
    + * Take care not to register a handler function twice. Purple will
    + * not correct any mistakes for you in this area.
    + *
    + * @param instance The instance to connect to.
    + * @param signal The name of the signal to connect.
    + * @param handle The handle of the receiver.
    + * @param func The callback function.
    + * @param data The data to pass to the callback function.
    + *
    + * @return The signal handler ID.
    + *
    + * @see purple_signal_disconnect()
    + */
    +gulong purple_signal_connect(void *instance, const char *signal,
    + void *handle, PurpleCallback func, void *data);
    +
    +/**
    + * Connects a signal handler to a signal for a particular object.
    + *
    + * The signal handler will take a va_args of arguments, instead of
    + * individual arguments.
    + *
    + * Take care not to register a handler function twice. Purple will
    + * not correct any mistakes for you in this area.
    + *
    + * @param instance The instance to connect to.
    + * @param signal The name of the signal to connect.
    + * @param handle The handle of the receiver.
    + * @param func The callback function.
    + * @param data The data to pass to the callback function.
    + * @param priority The priority with which the handler should be called. Signal
    + * handlers are called in ascending numerical order of @a
    + * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to
    + * #PURPLE_SIGNAL_PRIORITY_HIGHEST.
    + *
    + * @return The signal handler ID.
    + *
    + * @see purple_signal_disconnect()
    + */
    +gulong purple_signal_connect_priority_vargs(void *instance, const char *signal,
    + void *handle, PurpleCallback func, void *data, int priority);
    +
    +/**
    + * Connects a signal handler to a signal for a particular object.
    + * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.)
    + *
    + * The signal handler will take a va_args of arguments, instead of
    + * individual arguments.
    + *
    + * Take care not to register a handler function twice. Purple will
    + * not correct any mistakes for you in this area.
    + *
    + * @param instance The instance to connect to.
    + * @param signal The name of the signal to connect.
    + * @param handle The handle of the receiver.
    + * @param func The callback function.
    + * @param data The data to pass to the callback function.
    + *
    + * @return The signal handler ID.
    + *
    + * @see purple_signal_disconnect()
    + */
    +gulong purple_signal_connect_vargs(void *instance, const char *signal,
    + void *handle, PurpleCallback func, void *data);
    +
    +/**
    + * Disconnects a signal handler from a signal on an object.
    + *
    + * @param instance The instance to disconnect from.
    + * @param signal The name of the signal to disconnect.
    + * @param handle The handle of the receiver.
    + * @param func The registered function to disconnect.
    + *
    + * @see purple_signal_connect()
    + */
    +void purple_signal_disconnect(void *instance, const char *signal,
    + void *handle, PurpleCallback func);
    +
    +/**
    + * Removes all callbacks associated with a receiver handle.
    + *
    + * @param handle The receiver handle.
    + */
    +void purple_signals_disconnect_by_handle(void *handle);
    +
    +/**
    + * Emits a signal.
    + *
    + * @param instance The instance emitting the signal.
    + * @param signal The signal being emitted.
    + *
    + * @see purple_signal_connect()
    + * @see purple_signal_disconnect()
    + */
    +void purple_signal_emit(void *instance, const char *signal, ...);
    +
    +/**
    + * Emits a signal, using a va_list of arguments.
    + *
    + * @param instance The instance emitting the signal.
    + * @param signal The signal being emitted.
    + * @param args The arguments list.
    + *
    + * @see purple_signal_connect()
    + * @see purple_signal_disconnect()
    + */
    +void purple_signal_emit_vargs(void *instance, const char *signal, va_list args);
    +
    +/**
    + * Emits a signal and returns the first non-NULL return value.
    + *
    + * Further signal handlers are NOT called after a handler returns
    + * something other than NULL.
    + *
    + * @param instance The instance emitting the signal.
    + * @param signal The signal being emitted.
    + *
    + * @return The first non-NULL return value
    + */
    +void *purple_signal_emit_return_1(void *instance, const char *signal, ...);
    +
    +/**
    + * Emits a signal and returns the first non-NULL return value.
    + *
    + * Further signal handlers are NOT called after a handler returns
    + * something other than NULL.
    + *
    + * @param instance The instance emitting the signal.
    + * @param signal The signal being emitted.
    + * @param args The arguments list.
    + *
    + * @return The first non-NULL return value
    + */
    +void *purple_signal_emit_vargs_return_1(void *instance, const char *signal,
    + va_list args);
    +
    +/**
    + * Initializes the signals subsystem.
    + */
    +void purple_signals_init(void);
    +
    +/**
    + * Uninitializes the signals subsystem.
    + */
    +void purple_signals_uninit(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Marshal Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +void purple_marshal_VOID(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__INT_INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_INT_INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_INT_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_UINT_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +
    +void purple_marshal_INT__INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_INT__INT_INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_INT__POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_INT__POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +
    +void purple_marshal_BOOLEAN__POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_BOOLEAN(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_UINT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +
    +void purple_marshal_BOOLEAN__INT_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +
    +void purple_marshal_POINTER__POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_POINTER__POINTER_INT(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_POINTER__POINTER_INT64(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_POINTER__POINTER_INT_BOOLEAN(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_POINTER__POINTER_INT64_BOOLEAN(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +void purple_marshal_POINTER__POINTER_POINTER(
    + PurpleCallback cb, va_list args, void *data, void **return_val);
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SIGNALS_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/smiley.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,262 @@
    +/**
    + * @file smiley.h Smiley API
    + * @ingroup core
    + * @since 2.5.0
    + */
    +
    +/* 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
    + *
    + */
    +
    +#ifndef _PURPLE_SMILEY_H_
    +#define _PURPLE_SMILEY_H_
    +
    +#include <glib-object.h>
    +
    +#include "imgstore.h"
    +#include "util.h"
    +
    +/**
    + * A custom smiley.
    + * This contains everything Purple will ever need to know about a custom smiley.
    + * Everything.
    + *
    + * PurpleSmiley is a GObject.
    + */
    +typedef struct _PurpleSmiley PurpleSmiley;
    +typedef struct _PurpleSmileyClass PurpleSmileyClass;
    +
    +#define PURPLE_TYPE_SMILEY (purple_smiley_get_type ())
    +#define PURPLE_SMILEY(smiley) (G_TYPE_CHECK_INSTANCE_CAST ((smiley), PURPLE_TYPE_SMILEY, PurpleSmiley))
    +#define PURPLE_SMILEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PURPLE_TYPE_SMILEY, PurpleSmileyClass))
    +#define PURPLE_IS_SMILEY(smiley) (G_TYPE_CHECK_INSTANCE_TYPE ((smiley), PURPLE_TYPE_SMILEY))
    +#define PURPLE_IS_SMILEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PURPLE_TYPE_SMILEY))
    +#define PURPLE_SMILEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PURPLE_TYPE_SMILEY, PurpleSmileyClass))
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Custom Smiley API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * GObject-fu.
    + * @internal.
    + */
    +GType purple_smiley_get_type(void);
    +
    +/**
    + * Creates a new custom smiley from a PurpleStoredImage.
    + *
    + * If a custom smiley with the given shortcut already exists, it
    + * will be automaticaly returned.
    + *
    + * @param img The image associated with the smiley.
    + * @param shortcut The associated shortcut (e.g. "(homer)").
    + *
    + * @return The custom smiley.
    + */
    +PurpleSmiley *
    +purple_smiley_new(PurpleStoredImage *img, const char *shortcut);
    +
    +/**
    + * Creates a new custom smiley, reading the image data from a file.
    + *
    + * If a custom smiley with the given shortcut already exists, it
    + * will be automaticaly returned.
    + *
    + * @param shortcut The associated shortcut (e.g. "(homer)").
    + * @param filepath The image file.
    + *
    + * @return The custom smiley.
    + */
    +PurpleSmiley *
    +purple_smiley_new_from_file(const char *shortcut, const char *filepath);
    +
    +/**
    + * Destroys the custom smiley and releases the associated resources.
    + *
    + * @param smiley The custom smiley.
    + */
    +void
    +purple_smiley_delete(PurpleSmiley *smiley);
    +
    +/**
    + * Changes the custom smiley's shortcut.
    + *
    + * @param smiley The custom smiley.
    + * @param shortcut The new shortcut. A custom smiley with this shortcut
    + * cannot already be in use.
    + *
    + * @return TRUE if the shortcut was changed. FALSE otherwise.
    + */
    +gboolean
    +purple_smiley_set_shortcut(PurpleSmiley *smiley, const char *shortcut);
    +
    +/**
    + * Changes the custom smiley's image data.
    + *
    + * @param smiley The custom smiley.
    + * @param smiley_data The custom smiley data, which the smiley code
    + * takes ownership of and will free.
    + * @param smiley_data_len The length of the data in @a smiley_data.
    + */
    +void
    +purple_smiley_set_data(PurpleSmiley *smiley, guchar *smiley_data,
    + size_t smiley_data_len);
    +
    +/**
    + * Returns the custom smiley's associated shortcut (e.g. "(homer)").
    + *
    + * @param smiley The custom smiley.
    + *
    + * @return The shortcut.
    + */
    +const char *purple_smiley_get_shortcut(const PurpleSmiley *smiley);
    +
    +/**
    + * Returns the custom smiley data's checksum.
    + *
    + * @param smiley The custom smiley.
    + *
    + * @return The checksum.
    + */
    +const char *purple_smiley_get_checksum(const PurpleSmiley *smiley);
    +
    +/**
    + * Returns the PurpleStoredImage with the reference counter incremented.
    + *
    + * The returned PurpleStoredImage reference counter must be decremented
    + * when the caller is done using it.
    + *
    + * @param smiley The custom smiley.
    + *
    + * @return A PurpleStoredImage.
    + */
    +PurpleStoredImage *purple_smiley_get_stored_image(const PurpleSmiley *smiley);
    +
    +/**
    + * Returns the custom smiley's data.
    + *
    + * @param smiley The custom smiley.
    + * @param len If not @c NULL, the length of the image data returned
    + * will be set in the location pointed to by this.
    + *
    + * @return A pointer to the custom smiley data.
    + */
    +gconstpointer purple_smiley_get_data(const PurpleSmiley *smiley, size_t *len);
    +
    +/**
    + * Returns an extension corresponding to the custom smiley's file type.
    + *
    + * @param smiley The custom smiley.
    + *
    + * @return The custom smiley's extension, "icon" if unknown, or @c NULL if
    + * the image data has disappeared.
    + */
    +const char *purple_smiley_get_extension(const PurpleSmiley *smiley);
    +
    +/**
    + * Returns a full path to an custom smiley.
    + *
    + * If the custom smiley has data and the file exists in the cache, this
    + * will return a full path to the cached file.
    + *
    + * In general, it is not appropriate to be poking in the file cache
    + * directly. If you find yourself wanting to use this function, think
    + * very long and hard about it, and then don't.
    + *
    + * Think some more.
    + *
    + * @param smiley The custom smiley.
    + *
    + * @return A full path to the file, or @c NULL under various conditions.
    + * The caller should use g_free to free the returned string.
    + */
    +char *purple_smiley_get_full_path(PurpleSmiley *smiley);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Custom Smiley Subsystem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns a list of all custom smileys. The caller is responsible for freeing
    + * the list.
    + *
    + * @return A list of all custom smileys.
    + */
    +GList *
    +purple_smileys_get_all(void);
    +
    +/**
    + * Returns a custom smiley given its shortcut.
    + *
    + * @param shortcut The custom smiley's shortcut.
    + *
    + * @return The custom smiley if found, or @c NULL if not found.
    + */
    +PurpleSmiley *
    +purple_smileys_find_by_shortcut(const char *shortcut);
    +
    +/**
    + * Returns a custom smiley given its checksum.
    + *
    + * @param checksum The custom smiley's checksum.
    + *
    + * @return The custom smiley if found, or @c NULL if not found.
    + */
    +PurpleSmiley *
    +purple_smileys_find_by_checksum(const char *checksum);
    +
    +/**
    + * Returns the directory used to store custom smiley cached files.
    + *
    + * The default directory is PURPLEDIR/custom_smiley.
    + *
    + * @return The directory in which to store custom smileys cached files.
    + */
    +const char *purple_smileys_get_storing_dir(void);
    +
    +/**
    + * Initializes the custom smiley subsystem.
    + */
    +void purple_smileys_init(void);
    +
    +/**
    + * Uninitializes the custom smiley subsystem.
    + */
    +void purple_smileys_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SMILEY_H_ */
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/snactypes.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,287 @@
    +/*
    + * Purple's oscar protocol plugin
    + * This file is the legal property of its developers.
    + * Please see the AUTHORS file distributed alongside this file.
    + *
    + * This library is free software; you can redistribute it and/or
    + * modify it under the terms of the GNU Lesser General Public
    + * License as published by the Free Software Foundation; either
    + * version 2 of the License, or (at your option) any later version.
    + *
    + * This library 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
    + * Lesser General Public License for more details.
    + *
    + * You should have received a copy of the GNU Lesser General Public
    + * License along with this library; if not, write to the Free Software
    + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    +*/
    +
    +/*
    + * AIM Callback Types
    + *
    + */
    +#ifndef _SNACTYPES_H_
    +#define _SNACTYPES_H_
    +
    +/*
    + * SNAC Families.
    + */
    +#define SNAC_FAMILY_OSERVICE 0x0001
    +#define SNAC_FAMILY_LOCATE 0x0002
    +#define SNAC_FAMILY_BUDDY 0x0003
    +#define SNAC_FAMILY_ICBM 0x0004
    +#define SNAC_FAMILY_ADVERT 0x0005
    +#define SNAC_FAMILY_INVITE 0x0006
    +#define SNAC_FAMILY_ADMIN 0x0007
    +#define SNAC_FAMILY_POPUP 0x0008
    +#define SNAC_FAMILY_BOS 0x0009
    +#define SNAC_FAMILY_USERLOOKUP 0x000a
    +#define SNAC_FAMILY_STATS 0x000b
    +#define SNAC_FAMILY_TRANSLATE 0x000c
    +#define SNAC_FAMILY_CHATNAV 0x000d
    +#define SNAC_FAMILY_CHAT 0x000e
    +#define SNAC_FAMILY_ODIR 0x000f
    +#define SNAC_FAMILY_BART 0x0010
    +#define SNAC_FAMILY_FEEDBAG 0x0013
    +#define SNAC_FAMILY_ICQ 0x0015
    +#define SNAC_FAMILY_AUTH 0x0017
    +#define SNAC_FAMILY_ALERT 0x0018
    +
    +#define AIM_CB_FAM_SPECIAL 0xffff /* Internal libfaim use */
    +
    +/*
    + * SNAC Family: Ack.
    + *
    + * Not really a family, but treating it as one really
    + * helps it fit into the libfaim callback structure better.
    + *
    + */
    +#define AIM_CB_ACK_ACK 0x0001
    +
    +/*
    + * SNAC Family: General.
    + */
    +#define SNAC_SUBTYPE_OSERVICE_ERROR 0x0001
    +#define SNAC_SUBTYPE_OSERVICE_CLIENTREADY 0x0002
    +#define SNAC_SUBTYPE_OSERVICE_SERVERREADY 0x0003
    +#define SNAC_SUBTYPE_OSERVICE_SERVICEREQ 0x0004
    +#define SNAC_SUBTYPE_OSERVICE_REDIRECT 0x0005
    +#define SNAC_SUBTYPE_OSERVICE_RATEINFOREQ 0x0006
    +#define SNAC_SUBTYPE_OSERVICE_RATEINFO 0x0007
    +#define SNAC_SUBTYPE_OSERVICE_RATEINFOACK 0x0008
    +#define SNAC_SUBTYPE_OSERVICE_RATECHANGE 0x000a
    +#define SNAC_SUBTYPE_OSERVICE_SERVERPAUSE 0x000b
    +#define SNAC_SUBTYPE_OSERVICE_SERVERRESUME 0x000d
    +#define SNAC_SUBTYPE_OSERVICE_REQSELFINFO 0x000e
    +#define SNAC_SUBTYPE_OSERVICE_SELFINFO 0x000f
    +#define SNAC_SUBTYPE_OSERVICE_EVIL 0x0010
    +#define SNAC_SUBTYPE_OSERVICE_SETIDLE 0x0011
    +#define SNAC_SUBTYPE_OSERVICE_MIGRATIONREQ 0x0012
    +#define SNAC_SUBTYPE_OSERVICE_MOTD 0x0013
    +#define SNAC_SUBTYPE_OSERVICE_SETPRIVFLAGS 0x0014
    +#define SNAC_SUBTYPE_OSERVICE_WELLKNOWNURL 0x0015
    +#define SNAC_SUBTYPE_OSERVICE_NOP 0x0016
    +#define SNAC_SUBTYPE_OSERVICE_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Location Services.
    + */
    +#define SNAC_SUBTYPE_LOCATE_ERROR 0x0001
    +#define SNAC_SUBTYPE_LOCATE_REQRIGHTS 0x0002
    +#define SNAC_SUBTYPE_LOCATE_RIGHTSINFO 0x0003
    +#define SNAC_SUBTYPE_LOCATE_SETUSERINFO 0x0004
    +#define SNAC_SUBTYPE_LOCATE_REQUSERINFO 0x0005
    +#define SNAC_SUBTYPE_LOCATE_USERINFO 0x0006
    +#define SNAC_SUBTYPE_LOCATE_WATCHERSUBREQ 0x0007
    +#define SNAC_SUBTYPE_LOCATE_WATCHERNOT 0x0008
    +#define SNAC_SUBTYPE_LOCATE_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Buddy List Management Services.
    + */
    +#define SNAC_SUBTYPE_BUDDY_ERROR 0x0001
    +#define SNAC_SUBTYPE_BUDDY_REQRIGHTS 0x0002
    +#define SNAC_SUBTYPE_BUDDY_RIGHTSINFO 0x0003
    +#define SNAC_SUBTYPE_BUDDY_ADDBUDDY 0x0004
    +#define SNAC_SUBTYPE_BUDDY_REMBUDDY 0x0005
    +#define SNAC_SUBTYPE_BUDDY_REJECT 0x000a
    +#define SNAC_SUBTYPE_BUDDY_ONCOMING 0x000b
    +#define SNAC_SUBTYPE_BUDDY_OFFGOING 0x000c
    +#define SNAC_SUBTYPE_BUDDY_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Messaging Services.
    + */
    +#define SNAC_SUBTYPE_ICBM_ERROR 0x0001
    +#define SNAC_SUBTYPE_ICBM_PARAMINFO 0x0005
    +#define SNAC_SUBTYPE_ICBM_INCOMING 0x0007
    +#define SNAC_SUBTYPE_ICBM_EVIL 0x0009
    +#define SNAC_SUBTYPE_ICBM_MISSEDCALL 0x000a
    +#define SNAC_SUBTYPE_ICBM_CLIENTAUTORESP 0x000b
    +#define SNAC_SUBTYPE_ICBM_ACK 0x000c
    +#define SNAC_SUBTYPE_ICBM_MTN 0x0014
    +#define SNAC_SUBTYPE_ICBM_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Advertisement Services
    + */
    +#define SNAC_SUBTYPE_ADVERT_ERROR 0x0001
    +#define SNAC_SUBTYPE_ADVERT_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Invitation Services.
    + */
    +#define SNAC_SUBTYPE_INVITE_ERROR 0x0001
    +#define SNAC_SUBTYPE_INVITE_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Administrative Services.
    + */
    +#define SNAC_SUBTYPE_ADMIN_ERROR 0x0001
    +#define SNAC_SUBTYPE_ADMIN_INFOCHANGE_REPLY 0x0005
    +#define SNAC_SUBTYPE_ADMIN_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Popup Messages
    + */
    +#define SNAC_SUBTYPE_POPUP_ERROR 0x0001
    +#define SNAC_SUBTYPE_POPUP_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Misc BOS Services.
    + */
    +#define SNAC_SUBTYPE_BOS_ERROR 0x0001
    +#define SNAC_SUBTYPE_BOS_RIGHTSQUERY 0x0002
    +#define SNAC_SUBTYPE_BOS_RIGHTS 0x0003
    +#define SNAC_SUBTYPE_BOS_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: User Lookup Services
    + */
    +#define SNAC_SUBTYPE_USERLOOKUP_ERROR 0x0001
    +#define SNAC_SUBTYPE_USERLOOKUP_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: User Status Services
    + */
    +#define SNAC_SUBTYPE_STATS_ERROR 0x0001
    +#define SNAC_SUBTYPE_STATS_SETREPORTINTERVAL 0x0002
    +#define SNAC_SUBTYPE_STATS_REPORTACK 0x0004
    +#define SNAC_SUBTYPE_STATS_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Translation Services
    + */
    +#define SNAC_SUBTYPE_TRANSLATE_ERROR 0x0001
    +#define SNAC_SUBTYPE_TRANSLATE_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Chat Navigation Services
    + */
    +#define SNAC_SUBTYPE_CHATNAV_ERROR 0x0001
    +#define SNAC_SUBTYPE_CHATNAV_CREATE 0x0008
    +#define SNAC_SUBTYPE_CHATNAV_INFO 0x0009
    +#define SNAC_SUBTYPE_CHATNAV_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Chat Services
    + */
    +#define SNAC_SUBTYPE_CHAT_ERROR 0x0001
    +#define SNAC_SUBTYPE_CHAT_ROOMINFOUPDATE 0x0002
    +#define SNAC_SUBTYPE_CHAT_USERJOIN 0x0003
    +#define SNAC_SUBTYPE_CHAT_USERLEAVE 0x0004
    +#define SNAC_SUBTYPE_CHAT_OUTGOINGMSG 0x0005
    +#define SNAC_SUBTYPE_CHAT_INCOMINGMSG 0x0006
    +#define SNAC_SUBTYPE_CHAT_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: "New" Search
    + */
    +#define SNAC_SUBTYPE_ODIR_ERROR 0x0001
    +#define SNAC_SUBTYPE_ODIR_SEARCH 0x0002
    +#define SNAC_SUBTYPE_ODIR_RESULTS 0x0003
    +
    +/*
    + * SNAC Family: Buddy icons
    + */
    +#define SNAC_SUBTYPE_BART_ERROR 0x0001
    +#define SNAC_SUBTYPE_BART_REQUEST 0x0004
    +#define SNAC_SUBTYPE_BART_RESPONSE 0x0005
    +
    +/*
    + * SNAC Family: Server-Stored Buddy Lists
    + */
    +#define SNAC_SUBTYPE_FEEDBAG_ERROR 0x0001
    +#define SNAC_SUBTYPE_FEEDBAG_REQRIGHTS 0x0002
    +#define SNAC_SUBTYPE_FEEDBAG_RIGHTSINFO 0x0003
    +#define SNAC_SUBTYPE_FEEDBAG_REQDATA 0x0004
    +#define SNAC_SUBTYPE_FEEDBAG_REQIFCHANGED 0x0005
    +#define SNAC_SUBTYPE_FEEDBAG_LIST 0x0006
    +#define SNAC_SUBTYPE_FEEDBAG_ACTIVATE 0x0007
    +#define SNAC_SUBTYPE_FEEDBAG_ADD 0x0008
    +#define SNAC_SUBTYPE_FEEDBAG_MOD 0x0009
    +#define SNAC_SUBTYPE_FEEDBAG_DEL 0x000A
    +#define SNAC_SUBTYPE_FEEDBAG_SRVACK 0x000E
    +#define SNAC_SUBTYPE_FEEDBAG_NOLIST 0x000F
    +#define SNAC_SUBTYPE_FEEDBAG_EDITSTART 0x0011
    +#define SNAC_SUBTYPE_FEEDBAG_EDITSTOP 0x0012
    +#define SNAC_SUBTYPE_FEEDBAG_SENDAUTH 0x0014
    +#define SNAC_SUBTYPE_FEEDBAG_RECVAUTH 0x0015
    +#define SNAC_SUBTYPE_FEEDBAG_SENDAUTHREQ 0x0018
    +#define SNAC_SUBTYPE_FEEDBAG_RECVAUTHREQ 0x0019
    +#define SNAC_SUBTYPE_FEEDBAG_SENDAUTHREP 0x001a
    +#define SNAC_SUBTYPE_FEEDBAG_RECVAUTHREP 0x001b
    +#define SNAC_SUBTYPE_FEEDBAG_ADDED 0x001c
    +
    +/*
    + * SNAC Family: ICQ
    + *
    + * Most of these are actually special.
    + */
    +#define SNAC_SUBTYPE_ICQ_ERROR 0x0001
    +#define SNAC_SUBTYPE_ICQ_OFFLINEMSG 0x00f0
    +#define SNAC_SUBTYPE_ICQ_OFFLINEMSGCOMPLETE 0x00f1
    +#define SNAC_SUBTYPE_ICQ_INFO 0x00f2
    +#define SNAC_SUBTYPE_ICQ_ALIAS 0x00f3
    +#define SNAC_SUBTYPE_ICQ_DEFAULT 0xffff
    +
    +/*
    + * SNAC Family: Authorizer
    + *
    + * Used only in protocol versions three and above.
    + */
    +#define SNAC_SUBTYPE_AUTH_ERROR 0x0001
    +#define SNAC_SUBTYPE_AUTH_LOGINREQEST 0x0002
    +#define SNAC_SUBTYPE_AUTH_LOGINRESPONSE 0x0003
    +#define SNAC_SUBTYPE_AUTH_AUTHREQ 0x0006
    +#define SNAC_SUBTYPE_AUTH_AUTHRESPONSE 0x0007
    +#define SNAC_SUBTYPE_AUTH_SECURID_REQUEST 0x000a
    +#define SNAC_SUBTYPE_AUTH_SECURID_RESPONSE 0x000b
    +
    +/*
    + * SNAC Family: Email
    + *
    + * Used for getting information on the email address
    + * associated with your username.
    + */
    +#define SNAC_SUBTYPE_ALERT_ERROR 0x0001
    +#define SNAC_SUBTYPE_ALERT_SENDCOOKIES 0x0006
    +#define SNAC_SUBTYPE_ALERT_MAILSTATUS 0x0007
    +#define SNAC_SUBTYPE_ALERT_INIT 0x0016
    +
    +/*
    + * SNAC Family: Internal Messages
    + *
    + * This isn't truly a SNAC family either, but using
    + * these, we can integrated non-SNAC services into
    + * the SNAC-centered libfaim callback structure.
    + */
    +#define AIM_CB_SPECIAL_CONNERR 0x0003
    +#define AIM_CB_SPECIAL_CONNINITDONE 0x0006
    +
    +/* SNAC flags */
    +#define AIM_SNACFLAGS_DESTRUCTOR 0x0001
    +
    +#endif /* _SNACTYPES_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound-theme-loader.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,71 @@
    +/**
    + * @file sound-theme-loader.h Purple Sound Theme Loader Class API
    + */
    +
    +/* 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
    + */
    +
    +#ifndef PURPLE_SOUND_THEME_LOADER_H
    +#define PURPLE_SOUND_THEME_LOADER_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +#include "theme-loader.h"
    +
    +/**
    + * A purple sound theme loader. extends PurpleThemeLoader (theme-loader.h)
    + * This is a class designed to build sound themes
    + *
    + * PurpleSoundThemeLoader is a GObject.
    + */
    +typedef struct _PurpleSoundThemeLoader PurpleSoundThemeLoader;
    +typedef struct _PurpleSoundThemeLoaderClass PurpleSoundThemeLoaderClass;
    +
    +#define PURPLE_TYPE_SOUND_THEME_LOADER (purple_sound_theme_loader_get_type())
    +#define PURPLE_SOUND_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoader))
    +#define PURPLE_SOUND_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoaderClass))
    +#define PURPLE_IS_SOUND_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_SOUND_THEME_LOADER))
    +#define PURPLE_IS_SOUND_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_SOUND_THEME_LOADER))
    +#define PURPLE_SOUND_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_SOUND_THEME_LOADER, PurpleSoundThemeLoaderClass))
    +
    +struct _PurpleSoundThemeLoader
    +{
    + PurpleThemeLoader parent;
    +};
    +
    +struct _PurpleSoundThemeLoaderClass
    +{
    + PurpleThemeLoaderClass parent_class;
    +};
    +
    +/**************************************************************************/
    +/** @name Purple Theme-Loader API */
    +/**************************************************************************/
    +G_BEGIN_DECLS
    +
    +/**
    + * GObject foo.
    + * @internal.
    + */
    +GType purple_sound_theme_loader_get_type(void);
    +
    +G_END_DECLS
    +#endif /* PURPLE_SOUND_THEME_LOADER_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound-theme.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,108 @@
    +/**
    + * @file sound-theme.h Purple Sound Theme Abstact Class API
    + */
    +
    +/* 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
    + */
    +
    +#ifndef PURPLE_SOUND_THEME_H
    +#define PURPLE_SOUND_THEME_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +#include "theme.h"
    +#include "sound.h"
    +
    +/**
    + * extends PurpleTheme (theme.h)
    + * A purple sound theme.
    + * This is an object for Purple to represent a sound theme.
    + *
    + * PurpleSoundTheme is a PurpleTheme Object.
    + */
    +typedef struct _PurpleSoundTheme PurpleSoundTheme;
    +typedef struct _PurpleSoundThemeClass PurpleSoundThemeClass;
    +
    +#define PURPLE_TYPE_SOUND_THEME (purple_sound_theme_get_type())
    +#define PURPLE_SOUND_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_SOUND_THEME, PurpleSoundTheme))
    +#define PURPLE_SOUND_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_SOUND_THEME, PurpleSoundThemeClass))
    +#define PURPLE_IS_SOUND_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_SOUND_THEME))
    +#define PURPLE_IS_SOUND_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_SOUND_THEME))
    +#define PURPLE_SOUND_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_SOUND_THEME, PurpleSoundThemeClass))
    +
    +struct _PurpleSoundTheme
    +{
    + PurpleTheme parent;
    + gpointer priv;
    +};
    +
    +struct _PurpleSoundThemeClass
    +{
    + PurpleThemeClass parent_class;
    +};
    +
    +/**************************************************************************/
    +/** @name Purple Sound Theme API */
    +/**************************************************************************/
    +G_BEGIN_DECLS
    +
    +/**
    + * GObject foo.
    + * @internal.
    + */
    +GType purple_sound_theme_get_type(void);
    +
    +/**
    + * Returns a copy of the filename for the sound event.
    + *
    + * @param theme The theme.
    + * @param event The purple sound event to look up.
    + *
    + * @returns The filename of the sound event.
    + */
    +const gchar *purple_sound_theme_get_file(PurpleSoundTheme *theme,
    + const gchar *event);
    +
    +/**
    + * Returns a copy of the directory and filename for the sound event
    + *
    + * @param theme The theme.
    + * @param event The purple sound event to look up
    + *
    + * @returns The directory + '/' + filename of the sound event. This is
    + * a newly allocated string that should be freed with g_free.
    + */
    +gchar *purple_sound_theme_get_file_full(PurpleSoundTheme *theme,
    + const gchar *event);
    +
    +/**
    + * Sets the filename for a given sound event
    + *
    + * @param theme The theme.
    + * @param event the purple sound event to look up
    + * @param filename the name of the file to be used for the event
    + */
    +void purple_sound_theme_set_file(PurpleSoundTheme *theme,
    + const gchar *event,
    + const gchar *filename);
    +
    +G_END_DECLS
    +#endif /* PURPLE_SOUND_THEME_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sound.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,143 @@
    +/**
    + * @file sound.h Sound API
    + * @ingroup core
    + * @see @ref sound-signals
    + */
    +
    +/* 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
    + */
    +#ifndef _PURPLE_SOUND_H_
    +#define _PURPLE_SOUND_H_
    +
    +#include "account.h"
    +
    +/**************************************************************************/
    +/** Data Structures */
    +/**************************************************************************/
    +
    +
    +/**
    + * A type of sound.
    + */
    +
    +typedef enum _PurpleSoundEventID
    +{
    + PURPLE_SOUND_BUDDY_ARRIVE = 0, /**< Buddy signs on. */
    + PURPLE_SOUND_BUDDY_LEAVE, /**< Buddy signs off. */
    + PURPLE_SOUND_RECEIVE, /**< Receive an IM. */
    + PURPLE_SOUND_FIRST_RECEIVE, /**< Receive an IM that starts a conv. */
    + PURPLE_SOUND_SEND, /**< Send an IM. */
    + PURPLE_SOUND_CHAT_JOIN, /**< Someone joins a chat. */
    + PURPLE_SOUND_CHAT_LEAVE, /**< Someone leaves a chat. */
    + PURPLE_SOUND_CHAT_YOU_SAY, /**< You say something in a chat. */
    + PURPLE_SOUND_CHAT_SAY, /**< Someone else says somthing in a chat. */
    + PURPLE_SOUND_POUNCE_DEFAULT, /**< Default sound for a buddy pounce. */
    + PURPLE_SOUND_CHAT_NICK, /**< Someone says your name in a chat. */
    + PURPLE_SOUND_GOT_ATTENTION, /**< Got an attention */
    + PURPLE_NUM_SOUNDS /**< Total number of sounds. */
    +
    +} PurpleSoundEventID;
    +
    +/** Operations used by the core to request that particular sound files, or the
    + * sound associated with a particular event, should be played.
    + */
    +typedef struct _PurpleSoundUiOps
    +{
    + void (*init)(void);
    + void (*uninit)(void);
    + void (*play_file)(const char *filename);
    + void (*play_event)(PurpleSoundEventID event);
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleSoundUiOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name Sound API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Plays the specified sound file.
    + *
    + * @param filename The file to play.
    + * @param account The account that this sound is associated with, or
    + * NULL if the sound is not associated with any specific
    + * account. This is needed for the "sounds while away?"
    + * preference to work correctly.
    + */
    +void purple_sound_play_file(const char *filename, const PurpleAccount *account);
    +
    +/**
    + * Plays the sound associated with the specified event.
    + *
    + * @param event The event.
    + * @param account The account that this sound is associated with, or
    + * NULL if the sound is not associated with any specific
    + * account. This is needed for the "sounds while away?"
    + * preference to work correctly.
    + */
    +void purple_sound_play_event(PurpleSoundEventID event, const PurpleAccount *account);
    +
    +/**
    + * Sets the UI sound operations
    + *
    + * @param ops The UI sound operations structure.
    + */
    +void purple_sound_set_ui_ops(PurpleSoundUiOps *ops);
    +
    +/**
    + * Gets the UI sound operations
    + *
    + * @return The UI sound operations structure.
    + */
    +PurpleSoundUiOps *purple_sound_get_ui_ops(void);
    +
    +/**
    + * Initializes the sound subsystem
    + */
    +void purple_sound_init(void);
    +
    +/**
    + * Shuts down the sound subsystem
    + */
    +void purple_sound_uninit(void);
    +
    +/**
    + * Returns the sound subsystem handle.
    + *
    + * @return The sound subsystem handle.
    + */
    +void *purple_sounds_get_handle(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SOUND_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/sslconn.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,346 @@
    +/**
    + * @file sslconn.h SSL 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
    + */
    +#ifndef _PURPLE_SSLCONN_H_
    +#define _PURPLE_SSLCONN_H_
    +
    +/** Possible SSL errors. */
    +typedef enum
    +{
    + PURPLE_SSL_HANDSHAKE_FAILED = 1,
    + PURPLE_SSL_CONNECT_FAILED = 2,
    + PURPLE_SSL_CERTIFICATE_INVALID = 3
    +} PurpleSslErrorType;
    +
    +#include "certificate.h"
    +#include "proxy.h"
    +
    +#define PURPLE_SSL_DEFAULT_PORT 443
    +
    +/** @copydoc _PurpleSslConnection */
    +typedef struct _PurpleSslConnection PurpleSslConnection;
    +
    +typedef void (*PurpleSslInputFunction)(gpointer, PurpleSslConnection *,
    + PurpleInputCondition);
    +typedef void (*PurpleSslErrorFunction)(PurpleSslConnection *, PurpleSslErrorType,
    + gpointer);
    +
    +struct _PurpleSslConnection
    +{
    + /** Hostname to which the SSL connection will be made */
    + char *host;
    + /** Port to connect to */
    + int port;
    + /** Data to pass to PurpleSslConnection::connect_cb() */
    + void *connect_cb_data;
    + /** Callback triggered once the SSL handshake is complete */
    + PurpleSslInputFunction connect_cb;
    + /** Callback triggered if there is an error during connection */
    + PurpleSslErrorFunction error_cb;
    + /** Data passed to PurpleSslConnection::recv_cb() */
    + void *recv_cb_data;
    + /** User-defined callback executed when the SSL connection receives data */
    + PurpleSslInputFunction recv_cb;
    +
    + /** File descriptor used to refer to the socket */
    + int fd;
    + /** Glib event source ID; used to refer to the received data callback
    + * in the glib eventloop */
    + guint inpa;
    + /** Data related to the underlying TCP connection */
    + PurpleProxyConnectData *connect_data;
    +
    + /** Internal connection data managed by the SSL backend (GnuTLS/LibNSS/whatever) */
    + void *private_data;
    +
    + /** Verifier to use in authenticating the peer */
    + PurpleCertificateVerifier *verifier;
    +
    + /** Handle to the account for which this connection is being made. Can be NULL. */
    + PurpleAccount *account;
    +};
    +
    +/**
    + * SSL implementation operations structure.
    + *
    + * Every SSL implementation must provide all of these and register it via purple_ssl_set_ops()
    + * These should not be called directly! Instead, use the purple_ssl_* functions.
    + */
    +typedef struct
    +{
    + /** Initializes the SSL system provided.
    + * @return @a TRUE if initialization succeeded
    + * @see purple_ssl_init
    + */
    + gboolean (*init)(void);
    + /** Unloads the SSL system. Inverse of PurpleSslOps::init.
    + * @see purple_ssl_uninit
    + */
    + void (*uninit)(void);
    + /** Sets up the SSL connection for a #PurpleSslConnection once
    + * the TCP connection has been established
    + * @see purple_ssl_connect
    + */
    + void (*connectfunc)(PurpleSslConnection *gsc);
    + /** Destroys the internal data of the SSL connection provided.
    + * Freeing gsc itself is left to purple_ssl_close()
    + * @see purple_ssl_close
    + */
    + void (*close)(PurpleSslConnection *gsc);
    + /** Reads data from a connection (like POSIX read())
    + * @param gsc Connection context
    + * @param data Pointer to buffer to drop data into
    + * @param len Maximum number of bytes to read
    + * @return Number of bytes actually written into @a data (which may be
    + * less than @a len), or <0 on error
    + * @see purple_ssl_read
    + */
    + size_t (*read)(PurpleSslConnection *gsc, void *data, size_t len);
    + /** Writes data to a connection (like POSIX send())
    + * @param gsc Connection context
    + * @param data Data buffer to send data from
    + * @param len Number of bytes to send from buffer
    + * @return The number of bytes written to @a data (may be less than
    + * @a len) or <0 on error
    + * @see purple_ssl_write
    + */
    + size_t (*write)(PurpleSslConnection *gsc, const void *data, size_t len);
    + /** Obtains the certificate chain provided by the peer
    + *
    + * @param gsc Connection context
    + * @return A newly allocated list containing the certificates
    + * the peer provided.
    + * @see PurpleCertificate
    + * @todo Decide whether the ordering of certificates in this
    + * list can be guaranteed.
    + */
    + GList * (* get_peer_certificates)(PurpleSslConnection * gsc);
    +
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleSslOps;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name SSL API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns whether or not SSL is currently supported.
    + *
    + * @return @a TRUE if SSL is supported, or @a FALSE otherwise.
    + */
    +gboolean purple_ssl_is_supported(void);
    +
    +/**
    + * Returns a human-readable string for an SSL error.
    + *
    + * @param error Error code
    + * @return Human-readable error explanation
    + */
    +const gchar * purple_ssl_strerror(PurpleSslErrorType error);
    +
    +/**
    + * Makes a SSL connection to the specified host and port. The caller
    + * should keep track of the returned value and use it to cancel the
    + * connection, if needed.
    + *
    + * @param account The account making the connection.
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param func The SSL input handler function.
    + * @param error_func The SSL error handler function. This function
    + * should <strong>NOT</strong> call purple_ssl_close(). In
    + * the event of an error the #PurpleSslConnection will be
    + * destroyed for you.
    + * @param data User-defined data.
    + *
    + * @return The SSL connection handle.
    + */
    +PurpleSslConnection *purple_ssl_connect(PurpleAccount *account, const char *host,
    + int port, PurpleSslInputFunction func,
    + PurpleSslErrorFunction error_func,
    + void *data);
    +
    +/**
    + * Makes a SSL connection to the specified host and port, using the separate
    + * name to verify with the certificate. The caller should keep track of the
    + * returned value and use it to cancel the connection, if needed.
    + *
    + * @param account The account making the connection.
    + * @param host The destination host.
    + * @param port The destination port.
    + * @param func The SSL input handler function.
    + * @param error_func The SSL error handler function. This function
    + * should <strong>NOT</strong> call purple_ssl_close(). In
    + * the event of an error the #PurpleSslConnection will be
    + * destroyed for you.
    + * @param ssl_host The hostname of the other peer (to verify the CN)
    + * @param data User-defined data.
    + *
    + * @return The SSL connection handle.
    + * @since 2.6.0
    + */
    +PurpleSslConnection *purple_ssl_connect_with_ssl_cn(PurpleAccount *account, const char *host,
    + int port, PurpleSslInputFunction func,
    + PurpleSslErrorFunction error_func,
    + const char *ssl_host,
    + void *data);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_SSLCONN_C_)
    +/**
    + * Makes a SSL connection using an already open file descriptor.
    + *
    + * @deprecated Use purple_ssl_connect_with_host_fd() instead.
    + *
    + * @param account The account making the connection.
    + * @param fd The file descriptor.
    + * @param func The SSL input handler function.
    + * @param error_func The SSL error handler function.
    + * @param data User-defined data.
    + *
    + * @return The SSL connection handle.
    + */
    +PurpleSslConnection *purple_ssl_connect_fd(PurpleAccount *account, int fd,
    + PurpleSslInputFunction func,
    + PurpleSslErrorFunction error_func,
    + void *data);
    +#endif
    +
    +/**
    + * Makes a SSL connection using an already open file descriptor.
    + *
    + * @param account The account making the connection.
    + * @param fd The file descriptor.
    + * @param func The SSL input handler function.
    + * @param error_func The SSL error handler function.
    + * @param host The hostname of the other peer (to verify the CN)
    + * @param data User-defined data.
    + *
    + * @return The SSL connection handle.
    + *
    + * @since 2.2.0
    + */
    +PurpleSslConnection *purple_ssl_connect_with_host_fd(PurpleAccount *account, int fd,
    + PurpleSslInputFunction func,
    + PurpleSslErrorFunction error_func,
    + const char *host,
    + void *data);
    +
    +/**
    + * Adds an input watcher for the specified SSL connection.
    + * Once the SSL handshake is complete, use this to watch for actual data across it.
    + *
    + * @param gsc The SSL connection handle.
    + * @param func The callback function.
    + * @param data User-defined data.
    + */
    +void purple_ssl_input_add(PurpleSslConnection *gsc, PurpleSslInputFunction func,
    + void *data);
    +
    +/**
    + * Closes a SSL connection.
    + *
    + * @param gsc The SSL connection to close.
    + */
    +void purple_ssl_close(PurpleSslConnection *gsc);
    +
    +/**
    + * Reads data from an SSL connection.
    + *
    + * @param gsc The SSL connection handle.
    + * @param buffer The destination buffer.
    + * @param len The maximum number of bytes to read.
    + *
    + * @return The number of bytes read.
    + */
    +size_t purple_ssl_read(PurpleSslConnection *gsc, void *buffer, size_t len);
    +
    +/**
    + * Writes data to an SSL connection.
    + *
    + * @param gsc The SSL connection handle.
    + * @param buffer The buffer to write.
    + * @param len The length of the data to write.
    + *
    + * @return The number of bytes written.
    + */
    +size_t purple_ssl_write(PurpleSslConnection *gsc, const void *buffer, size_t len);
    +
    +/**
    + * Obtains the peer's presented certificates
    + *
    + * @param gsc The SSL connection handle
    + *
    + * @return The peer certificate chain, in the order of certificate, issuer,
    + * issuer's issuer, etc. @a NULL if no certificates have been provided,
    + *
    + * @since 2.2.0
    + */
    +GList * purple_ssl_get_peer_certificates(PurpleSslConnection *gsc);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Subsystem API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the current SSL operations structure.
    + *
    + * @param ops The SSL operations structure to assign.
    + */
    +void purple_ssl_set_ops(PurpleSslOps *ops);
    +
    +/**
    + * Returns the current SSL operations structure.
    + *
    + * @return The SSL operations structure.
    + */
    +PurpleSslOps *purple_ssl_get_ops(void);
    +
    +/**
    + * Initializes the SSL subsystem.
    + */
    +void purple_ssl_init(void);
    +
    +/**
    + * Uninitializes the SSL subsystem.
    + */
    +void purple_ssl_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_SSLCONN_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/status.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1103 @@
    +/*
    + * 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
    + */
    +#ifndef _PURPLE_STATUS_H_
    +#define _PURPLE_STATUS_H_
    +
    +/**
    + * @file status.h Status API
    + * @ingroup core
    + *
    + * A brief explanation of the status API:
    + *
    + * PurpleStatusType's are created by each PRPL. They outline the
    + * available statuses of the protocol. AIM, for example, supports
    + * an available state with an optional available message, an away
    + * state with a mandatory message, and an invisible state (which is
    + * technically "independent" of the other two, but we'll get into
    + * that later). PurpleStatusTypes are very permanent. They are
    + * hardcoded in each PRPL and will not change often. And because
    + * they are hardcoded, they do not need to be saved to any XML file.
    + *
    + * A PurpleStatus can be thought of as an "instance" of a PurpleStatusType.
    + * If you're familiar with object-oriented programming languages
    + * then this should be immediately clear. Say, for example, that
    + * one of your AIM buddies has set himself as "away." You have a
    + * PurpleBuddy node for this person in your buddy list. Purple wants
    + * to mark this buddy as "away," so it creates a new PurpleStatus.
    + * The PurpleStatus has its PurpleStatusType set to the "away" state
    + * for the oscar PRPL. The PurpleStatus also contains the buddy's
    + * away message. PurpleStatuses are sometimes saved, depending on
    + * the context. The current PurpleStatuses associated with each of
    + * your accounts are saved so that the next time you start Purple,
    + * your accounts will be set to their last known statuses. There
    + * is also a list of saved statuses that are written to the
    + * status.xml file. Also, each PurpleStatus has a "saveable" boolean.
    + * If "saveable" is set to FALSE then the status is NEVER saved.
    + * All PurpleStatuses should be inside a PurplePresence.
    + *
    + *
    + * A PurpleStatus is either "independent" or "exclusive."
    + * Independent statuses can be active or inactive and they don't
    + * affect anything else. However, you can only have one exclusive
    + * status per PurplePresence. If you activate one exclusive status,
    + * then the previous exclusive status is automatically deactivated.
    + *
    + * A PurplePresence is like a collection of PurpleStatuses (plus some
    + * other random info). For any buddy, or for any one of your accounts,
    + * or for any person with which you're chatting, you may know various
    + * amounts of information. This information is all contained in
    + * one PurplePresence. If one of your buddies is away and idle,
    + * then the presence contains the PurpleStatus for their awayness,
    + * and it contains their current idle time. PurplePresences are
    + * never saved to disk. The information they contain is only relevant
    + * for the current PurpleSession.
    + */
    +
    +/**
    + * PurpleStatusType's are created by each PRPL. They outline the
    + * available statuses of the protocol. AIM, for example, supports
    + * an available state with an optional available message, an away
    + * state with a mandatory message, and an invisible state (which is
    + * technically "independent" of the other two, but we'll get into
    + * that later). PurpleStatusTypes are very permanent. They are
    + * hardcoded in each PRPL and will not change often. And because
    + * they are hardcoded, they do not need to be saved to any XML file.
    + */
    +typedef struct _PurpleStatusType PurpleStatusType;
    +typedef struct _PurpleStatusAttr PurpleStatusAttr;
    +typedef struct _PurplePresence PurplePresence;
    +typedef struct _PurpleStatus PurpleStatus;
    +
    +typedef struct _PurpleMood {
    + const char *mood;
    + const char *description;
    + gpointer *padding;
    +} PurpleMood;
    +
    +/**
    + * A context for a presence.
    + *
    + * The context indicates to what the presence applies.
    + */
    +typedef enum
    +{
    + PURPLE_PRESENCE_CONTEXT_UNSET = 0,
    + PURPLE_PRESENCE_CONTEXT_ACCOUNT,
    + PURPLE_PRESENCE_CONTEXT_CONV,
    + PURPLE_PRESENCE_CONTEXT_BUDDY
    +
    +} PurplePresenceContext;
    +
    +/**
    + * A primitive defining the basic structure of a status type.
    + */
    +/*
    + * If you add a value to this enum, make sure you update
    + * the status_primitive_map and primitive_scores arrays in status.c.
    + */
    +typedef enum
    +{
    + PURPLE_STATUS_UNSET = 0,
    + PURPLE_STATUS_OFFLINE,
    + PURPLE_STATUS_AVAILABLE,
    + PURPLE_STATUS_UNAVAILABLE,
    + PURPLE_STATUS_INVISIBLE,
    + PURPLE_STATUS_AWAY,
    + PURPLE_STATUS_EXTENDED_AWAY,
    + PURPLE_STATUS_MOBILE,
    + PURPLE_STATUS_TUNE,
    + PURPLE_STATUS_MOOD,
    + PURPLE_STATUS_NUM_PRIMITIVES
    +} PurpleStatusPrimitive;
    +
    +#include "account.h"
    +#include "blist.h"
    +#include "conversation.h"
    +#include "value.h"
    +
    +#define PURPLE_TUNE_ARTIST "tune_artist"
    +#define PURPLE_TUNE_TITLE "tune_title"
    +#define PURPLE_TUNE_ALBUM "tune_album"
    +#define PURPLE_TUNE_GENRE "tune_genre"
    +#define PURPLE_TUNE_COMMENT "tune_comment"
    +#define PURPLE_TUNE_TRACK "tune_track"
    +#define PURPLE_TUNE_TIME "tune_time"
    +#define PURPLE_TUNE_YEAR "tune_year"
    +#define PURPLE_TUNE_URL "tune_url"
    +#define PURPLE_TUNE_FULL "tune_full"
    +
    +#define PURPLE_MOOD_NAME "mood"
    +#define PURPLE_MOOD_COMMENT "moodtext"
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name PurpleStatusPrimitive API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Lookup the id of a primitive status type based on the type. This
    + * ID is a unique plain-text name of the status, without spaces.
    + *
    + * @param type A primitive status type.
    + *
    + * @return The unique ID for this type.
    + */
    +const char *purple_primitive_get_id_from_type(PurpleStatusPrimitive type);
    +
    +/**
    + * Lookup the name of a primitive status type based on the type. This
    + * name is the plain-English name of the status type. It is usually one
    + * or two words.
    + *
    + * @param type A primitive status type.
    + *
    + * @return The name of this type, suitable for users to see.
    + */
    +const char *purple_primitive_get_name_from_type(PurpleStatusPrimitive type);
    +
    +/**
    + * Lookup the value of a primitive status type based on the id. The
    + * ID is a unique plain-text name of the status, without spaces.
    + *
    + * @param id The unique ID of a primitive status type.
    + *
    + * @return The PurpleStatusPrimitive value.
    + */
    +PurpleStatusPrimitive purple_primitive_get_type_from_id(const char *id);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name PurpleStatusType API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new status type.
    + *
    + * @param primitive The primitive status type.
    + * @param id The ID of the status type, or @c NULL to use the id of
    + * the primitive status type.
    + * @param name The name presented to the user, or @c NULL to use the
    + * name of the primitive status type.
    + * @param saveable TRUE if the information set for this status by the
    + * user can be saved for future sessions.
    + * @param user_settable TRUE if this is a status the user can manually set.
    + * @param independent TRUE if this is an independent (non-exclusive)
    + * status type.
    + *
    + * @return A new status type.
    + */
    +PurpleStatusType *purple_status_type_new_full(PurpleStatusPrimitive primitive,
    + const char *id, const char *name,
    + gboolean saveable,
    + gboolean user_settable,
    + gboolean independent);
    +
    +/**
    + * Creates a new status type with some default values (
    + * saveable and not independent).
    + *
    + * @param primitive The primitive status type.
    + * @param id The ID of the status type, or @c NULL to use the id of
    + * the primitive status type.
    + * @param name The name presented to the user, or @c NULL to use the
    + * name of the primitive status type.
    + * @param user_settable TRUE if this is a status the user can manually set.
    + *
    + * @return A new status type.
    + */
    +PurpleStatusType *purple_status_type_new(PurpleStatusPrimitive primitive,
    + const char *id, const char *name,
    + gboolean user_settable);
    +
    +/**
    + * Creates a new status type with attributes.
    + *
    + * @param primitive The primitive status type.
    + * @param id The ID of the status type, or @c NULL to use the id of
    + * the primitive status type.
    + * @param name The name presented to the user, or @c NULL to use the
    + * name of the primitive status type.
    + * @param saveable TRUE if the information set for this status by the
    + * user can be saved for future sessions.
    + * @param user_settable TRUE if this is a status the user can manually set.
    + * @param independent TRUE if this is an independent (non-exclusive)
    + * status type.
    + * @param attr_id The ID of the first attribute.
    + * @param attr_name The name of the first attribute.
    + * @param attr_value The value type of the first attribute attribute.
    + * @param ... Additional attribute information.
    + *
    + * @return A new status type.
    + */
    +PurpleStatusType *purple_status_type_new_with_attrs(PurpleStatusPrimitive primitive,
    + const char *id,
    + const char *name,
    + gboolean saveable,
    + gboolean user_settable,
    + gboolean independent,
    + const char *attr_id,
    + const char *attr_name,
    + PurpleValue *attr_value, ...) G_GNUC_NULL_TERMINATED;
    +
    +/**
    + * Destroys a status type.
    + *
    + * @param status_type The status type to destroy.
    + */
    +void purple_status_type_destroy(PurpleStatusType *status_type);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Sets a status type's primary attribute.
    + *
    + * The value for the primary attribute is used as the description for
    + * the particular status type. An example is an away message. The message
    + * would be the primary attribute.
    + *
    + * @param status_type The status type.
    + * @param attr_id The ID of the primary attribute.
    + *
    + * @deprecated This function isn't used and should be removed in 3.0.0.
    + */
    +void purple_status_type_set_primary_attr(PurpleStatusType *status_type,
    + const char *attr_id);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Adds an attribute to a status type.
    + *
    + * @param status_type The status type to add the attribute to.
    + * @param id The ID of the attribute.
    + * @param name The name presented to the user.
    + * @param value The value type of this attribute.
    + *
    + * @deprecated This function isn't needed and should be removed in 3.0.0.
    + * Status type attributes should be set when the status type
    + * is created, in the call to purple_status_type_new_with_attrs.
    + */
    +void purple_status_type_add_attr(PurpleStatusType *status_type, const char *id,
    + const char *name, PurpleValue *value);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Adds multiple attributes to a status type.
    + *
    + * @param status_type The status type to add the attribute to.
    + * @param id The ID of the first attribute.
    + * @param name The description of the first attribute.
    + * @param value The value type of the first attribute attribute.
    + * @param ... Additional attribute information.
    + *
    + * @deprecated This function isn't needed and should be removed in 3.0.0.
    + * Status type attributes should be set when the status type
    + * is created, in the call to purple_status_type_new_with_attrs.
    + */
    +void purple_status_type_add_attrs(PurpleStatusType *status_type, const char *id,
    + const char *name, PurpleValue *value, ...) G_GNUC_NULL_TERMINATED;
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Adds multiple attributes to a status type using a va_list.
    + *
    + * @param status_type The status type to add the attribute to.
    + * @param args The va_list of attributes.
    + *
    + * @deprecated This function isn't needed and should be removed in 3.0.0.
    + * Status type attributes should be set when the status type
    + * is created, in the call to purple_status_type_new_with_attrs.
    + */
    +void purple_status_type_add_attrs_vargs(PurpleStatusType *status_type,
    + va_list args);
    +#endif
    +
    +/**
    + * Returns the primitive type of a status type.
    + *
    + * @param status_type The status type.
    + *
    + * @return The primitive type of the status type.
    + */
    +PurpleStatusPrimitive purple_status_type_get_primitive(
    + const PurpleStatusType *status_type);
    +
    +/**
    + * Returns the ID of a status type.
    + *
    + * @param status_type The status type.
    + *
    + * @return The ID of the status type.
    + */
    +const char *purple_status_type_get_id(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns the name of a status type.
    + *
    + * @param status_type The status type.
    + *
    + * @return The name of the status type.
    + */
    +const char *purple_status_type_get_name(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns whether or not the status type is saveable.
    + *
    + * @param status_type The status type.
    + *
    + * @return TRUE if user-defined statuses based off this type are saveable.
    + * FALSE otherwise.
    + */
    +gboolean purple_status_type_is_saveable(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns whether or not the status type can be set or modified by the
    + * user.
    + *
    + * @param status_type The status type.
    + *
    + * @return TRUE if the status type can be set or modified by the user.
    + * FALSE if it's a protocol-set setting.
    + */
    +gboolean purple_status_type_is_user_settable(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns whether or not the status type is independent.
    + *
    + * Independent status types are non-exclusive. If other status types on
    + * the same hierarchy level are set, this one will not be affected.
    + *
    + * @param status_type The status type.
    + *
    + * @return TRUE if the status type is independent, or FALSE otherwise.
    + */
    +gboolean purple_status_type_is_independent(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns whether the status type is exclusive.
    + *
    + * @param status_type The status type.
    + *
    + * @return TRUE if the status type is exclusive, FALSE otherwise.
    + */
    +gboolean purple_status_type_is_exclusive(const PurpleStatusType *status_type);
    +
    +/**
    + * Returns whether or not a status type is available.
    + *
    + * Available status types are online and possibly invisible, but not away.
    + *
    + * @param status_type The status type.
    + *
    + * @return TRUE if the status is available, or FALSE otherwise.
    + */
    +gboolean purple_status_type_is_available(const PurpleStatusType *status_type);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Returns a status type's primary attribute ID.
    + *
    + * @param type The status type.
    + *
    + * @return The primary attribute's ID.
    + *
    + * @deprecated This function isn't used and should be removed in 3.0.0.
    + */
    +const char *purple_status_type_get_primary_attr(const PurpleStatusType *type);
    +#endif
    +
    +/**
    + * Returns the attribute with the specified ID.
    + *
    + * @param status_type The status type containing the attribute.
    + * @param id The ID of the desired attribute.
    + *
    + * @return The attribute, if found. NULL otherwise.
    + */
    +PurpleStatusAttr *purple_status_type_get_attr(const PurpleStatusType *status_type,
    + const char *id);
    +
    +/**
    + * Returns a list of all attributes in a status type.
    + *
    + * @param status_type The status type.
    + *
    + * @constreturn The list of attributes.
    + */
    +GList *purple_status_type_get_attrs(const PurpleStatusType *status_type);
    +
    +/**
    + * Find the PurpleStatusType with the given id.
    + *
    + * @param status_types A list of status types. Often account->status_types.
    + * @param id The unique ID of the status type you wish to find.
    + *
    + * @return The status type with the given ID, or NULL if one could
    + * not be found.
    + */
    +const PurpleStatusType *purple_status_type_find_with_id(GList *status_types,
    + const char *id);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name PurpleStatusAttr API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new status attribute.
    + *
    + * @param id The ID of the attribute.
    + * @param name The name presented to the user.
    + * @param value_type The type of data contained in the attribute.
    + *
    + * @return A new status attribute.
    + */
    +PurpleStatusAttr *purple_status_attr_new(const char *id, const char *name,
    + PurpleValue *value_type);
    +
    +/**
    + * Destroys a status attribute.
    + *
    + * @param attr The status attribute to destroy.
    + */
    +void purple_status_attr_destroy(PurpleStatusAttr *attr);
    +
    +/**
    + * Returns the ID of a status attribute.
    + *
    + * @param attr The status attribute.
    + *
    + * @return The status attribute's ID.
    + */
    +const char *purple_status_attr_get_id(const PurpleStatusAttr *attr);
    +
    +/**
    + * Returns the name of a status attribute.
    + *
    + * @param attr The status attribute.
    + *
    + * @return The status attribute's name.
    + */
    +const char *purple_status_attr_get_name(const PurpleStatusAttr *attr);
    +
    +/**
    + * Returns the value of a status attribute.
    + *
    + * @param attr The status attribute.
    + *
    + * @return The status attribute's value.
    + */
    +PurpleValue *purple_status_attr_get_value(const PurpleStatusAttr *attr);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name PurpleStatus API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new status.
    + *
    + * @param status_type The type of status.
    + * @param presence The parent presence.
    + *
    + * @return The new status.
    + */
    +PurpleStatus *purple_status_new(PurpleStatusType *status_type,
    + PurplePresence *presence);
    +
    +/**
    + * Destroys a status.
    + *
    + * @param status The status to destroy.
    + */
    +void purple_status_destroy(PurpleStatus *status);
    +
    +/**
    + * Sets whether or not a status is active.
    + *
    + * This should only be called by the account, conversation, and buddy APIs.
    + *
    + * @param status The status.
    + * @param active The active state.
    + */
    +void purple_status_set_active(PurpleStatus *status, gboolean active);
    +
    +/**
    + * Sets whether or not a status is active.
    + *
    + * This should only be called by the account, conversation, and buddy APIs.
    + *
    + * @param status The status.
    + * @param active The active state.
    + * @param args A list of attributes to set on the status. This list is
    + * composed of key/value pairs, where each key is a valid
    + * attribute name for this PurpleStatusType. The list should
    + * be NULL terminated.
    + */
    +void purple_status_set_active_with_attrs(PurpleStatus *status, gboolean active,
    + va_list args);
    +
    +/**
    + * Sets whether or not a status is active.
    + *
    + * This should only be called by the account, conversation, and buddy APIs.
    + *
    + * @param status The status.
    + * @param active The active state.
    + * @param attrs A list of attributes to set on the status. This list is
    + * composed of key/value pairs, where each key is a valid
    + * attribute name for this PurpleStatusType. The list is
    + * not modified or freed by this function.
    + */
    +void purple_status_set_active_with_attrs_list(PurpleStatus *status, gboolean active,
    + GList *attrs);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Sets the boolean value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + * @param value The boolean value.
    + *
    + * @deprecated This function is only used by status.c and should be made
    + * static in 3.0.0.
    + */
    +void purple_status_set_attr_boolean(PurpleStatus *status, const char *id,
    + gboolean value);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Sets the integer value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + * @param value The integer value.
    + *
    + * @deprecated This function is only used by status.c and should be made
    + * static in 3.0.0.
    + */
    +void purple_status_set_attr_int(PurpleStatus *status, const char *id,
    + int value);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Sets the string value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + * @param value The string value.
    + *
    + * @deprecated This function is only used by status.c and should be made
    + * static in 3.0.0.
    + */
    +void purple_status_set_attr_string(PurpleStatus *status, const char *id,
    + const char *value);
    +#endif
    +
    +/**
    + * Returns the status's type.
    + *
    + * @param status The status.
    + *
    + * @return The status's type.
    + */
    +PurpleStatusType *purple_status_get_type(const PurpleStatus *status);
    +
    +/**
    + * Returns the status's presence.
    + *
    + * @param status The status.
    + *
    + * @return The status's presence.
    + */
    +PurplePresence *purple_status_get_presence(const PurpleStatus *status);
    +
    +/**
    + * Returns the status's type ID.
    + *
    + * This is a convenience method for
    + * purple_status_type_get_id(purple_status_get_type(status)).
    + *
    + * @param status The status.
    + *
    + * @return The status's ID.
    + */
    +const char *purple_status_get_id(const PurpleStatus *status);
    +
    +/**
    + * Returns the status's name.
    + *
    + * This is a convenience method for
    + * purple_status_type_get_name(purple_status_get_type(status)).
    + *
    + * @param status The status.
    + *
    + * @return The status's name.
    + */
    +const char *purple_status_get_name(const PurpleStatus *status);
    +
    +/**
    + * Returns whether or not a status is independent.
    + *
    + * This is a convenience method for
    + * purple_status_type_is_independent(purple_status_get_type(status)).
    + *
    + * @param status The status.
    + *
    + * @return TRUE if the status is independent, or FALSE otherwise.
    + */
    +gboolean purple_status_is_independent(const PurpleStatus *status);
    +
    +/**
    + * Returns whether or not a status is exclusive.
    + *
    + * This is a convenience method for
    + * purple_status_type_is_exclusive(purple_status_get_type(status)).
    + *
    + * @param status The status.
    + *
    + * @return TRUE if the status is exclusive, FALSE otherwise.
    + */
    +gboolean purple_status_is_exclusive(const PurpleStatus *status);
    +
    +/**
    + * Returns whether or not a status is available.
    + *
    + * Available statuses are online and possibly invisible, but not away or idle.
    + *
    + * This is a convenience method for
    + * purple_status_type_is_available(purple_status_get_type(status)).
    + *
    + * @param status The status.
    + *
    + * @return TRUE if the status is available, or FALSE otherwise.
    + */
    +gboolean purple_status_is_available(const PurpleStatus *status);
    +
    +/**
    + * Returns the active state of a status.
    + *
    + * @param status The status.
    + *
    + * @return The active state of the status.
    + */
    +gboolean purple_status_is_active(const PurpleStatus *status);
    +
    +/**
    + * Returns whether or not a status is considered 'online'
    + *
    + * @param status The status.
    + *
    + * @return TRUE if the status is considered online, FALSE otherwise
    + */
    +gboolean purple_status_is_online(const PurpleStatus *status);
    +
    +/**
    + * Returns the value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + *
    + * @return The value of the attribute.
    + */
    +PurpleValue *purple_status_get_attr_value(const PurpleStatus *status,
    + const char *id);
    +
    +/**
    + * Returns the boolean value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + *
    + * @return The boolean value of the attribute.
    + */
    +gboolean purple_status_get_attr_boolean(const PurpleStatus *status,
    + const char *id);
    +
    +/**
    + * Returns the integer value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + *
    + * @return The integer value of the attribute.
    + */
    +int purple_status_get_attr_int(const PurpleStatus *status, const char *id);
    +
    +/**
    + * Returns the string value of an attribute in a status with the specified ID.
    + *
    + * @param status The status.
    + * @param id The attribute ID.
    + *
    + * @return The string value of the attribute.
    + */
    +const char *purple_status_get_attr_string(const PurpleStatus *status,
    + const char *id);
    +
    +/**
    + * Compares two statuses for availability.
    + *
    + * @param status1 The first status.
    + * @param status2 The second status.
    + *
    + * @return -1 if @a status1 is more available than @a status2.
    + * 0 if @a status1 is equal to @a status2.
    + * 1 if @a status2 is more available than @a status1.
    + */
    +gint purple_status_compare(const PurpleStatus *status1, const PurpleStatus *status2);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name PurplePresence API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Creates a new presence.
    + *
    + * @param context The presence context.
    + *
    + * @return A new presence.
    + */
    +PurplePresence *purple_presence_new(PurplePresenceContext context);
    +
    +/**
    + * Creates a presence for an account.
    + *
    + * @param account The account.
    + *
    + * @return The new presence.
    + */
    +PurplePresence *purple_presence_new_for_account(PurpleAccount *account);
    +
    +/**
    + * Creates a presence for a conversation.
    + *
    + * @param conv The conversation.
    + *
    + * @return The new presence.
    + */
    +PurplePresence *purple_presence_new_for_conv(PurpleConversation *conv);
    +
    +/**
    + * Creates a presence for a buddy.
    + *
    + * @param buddy The buddy.
    + *
    + * @return The new presence.
    + */
    +PurplePresence *purple_presence_new_for_buddy(PurpleBuddy *buddy);
    +
    +/**
    + * Destroys a presence.
    + *
    + * All statuses added to this list will be destroyed along with
    + * the presence.
    + *
    + * @param presence The presence to destroy.
    + */
    +void purple_presence_destroy(PurplePresence *presence);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Adds a status to a presence.
    + *
    + * @param presence The presence.
    + * @param status The status to add.
    + *
    + * @deprecated This function is only used by purple_presence_add_list,
    + * and both should be removed in 3.0.0.
    + */
    +void purple_presence_add_status(PurplePresence *presence, PurpleStatus *status);
    +#endif
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_STATUS_C_)
    +/**
    + * Adds a list of statuses to the presence.
    + *
    + * @param presence The presence.
    + * @param source_list The source list of statuses to add, which is not
    + * modified or freed by this function.
    + *
    + * @deprecated This function isn't used and should be removed in 3.0.0.
    + */
    +void purple_presence_add_list(PurplePresence *presence, GList *source_list);
    +#endif
    +
    +/**
    + * Sets the active state of a status in a presence.
    + *
    + * Only independent statuses can be set unactive. Normal statuses can only
    + * be set active, so if you wish to disable a status, set another
    + * non-independent status to active, or use purple_presence_switch_status().
    + *
    + * @param presence The presence.
    + * @param status_id The ID of the status.
    + * @param active The active state.
    + */
    +void purple_presence_set_status_active(PurplePresence *presence,
    + const char *status_id, gboolean active);
    +
    +/**
    + * Switches the active status in a presence.
    + *
    + * This is similar to purple_presence_set_status_active(), except it won't
    + * activate independent statuses.
    + *
    + * @param presence The presence.
    + * @param status_id The status ID to switch to.
    + */
    +void purple_presence_switch_status(PurplePresence *presence,
    + const char *status_id);
    +
    +/**
    + * Sets the idle state and time on a presence.
    + *
    + * @param presence The presence.
    + * @param idle The idle state.
    + * @param idle_time The idle time, if @a idle is TRUE. This
    + * is the time at which the user became idle,
    + * in seconds since the epoch. If this value is
    + * unknown then 0 should be used.
    + */
    +void purple_presence_set_idle(PurplePresence *presence, gboolean idle,
    + time_t idle_time);
    +
    +/**
    + * Sets the login time on a presence.
    + *
    + * @param presence The presence.
    + * @param login_time The login time.
    + */
    +void purple_presence_set_login_time(PurplePresence *presence, time_t login_time);
    +
    +
    +/**
    + * Returns the presence's context.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's context.
    + */
    +PurplePresenceContext purple_presence_get_context(const PurplePresence *presence);
    +
    +/**
    + * Returns a presence's account.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's account.
    + */
    +PurpleAccount *purple_presence_get_account(const PurplePresence *presence);
    +
    +/**
    + * Returns a presence's conversation.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's conversation.
    + */
    +PurpleConversation *purple_presence_get_conversation(const PurplePresence *presence);
    +
    +/**
    + * Returns a presence's chat user.
    + *
    + * @param presence The presence.
    + *
    + * @return The chat's user.
    + */
    +const char *purple_presence_get_chat_user(const PurplePresence *presence);
    +
    +/**
    + * Returns the presence's buddy.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's buddy.
    + */
    +PurpleBuddy *purple_presence_get_buddy(const PurplePresence *presence);
    +
    +/**
    + * Returns all the statuses in a presence.
    + *
    + * @param presence The presence.
    + *
    + * @constreturn The statuses.
    + */
    +GList *purple_presence_get_statuses(const PurplePresence *presence);
    +
    +/**
    + * Returns the status with the specified ID from a presence.
    + *
    + * @param presence The presence.
    + * @param status_id The ID of the status.
    + *
    + * @return The status if found, or NULL.
    + */
    +PurpleStatus *purple_presence_get_status(const PurplePresence *presence,
    + const char *status_id);
    +
    +/**
    + * Returns the active exclusive status from a presence.
    + *
    + * @param presence The presence.
    + *
    + * @return The active exclusive status.
    + */
    +PurpleStatus *purple_presence_get_active_status(const PurplePresence *presence);
    +
    +/**
    + * Returns whether or not a presence is available.
    + *
    + * Available presences are online and possibly invisible, but not away or idle.
    + *
    + * @param presence The presence.
    + *
    + * @return TRUE if the presence is available, or FALSE otherwise.
    + */
    +gboolean purple_presence_is_available(const PurplePresence *presence);
    +
    +/**
    + * Returns whether or not a presence is online.
    + *
    + * @param presence The presence.
    + *
    + * @return TRUE if the presence is online, or FALSE otherwise.
    + */
    +gboolean purple_presence_is_online(const PurplePresence *presence);
    +
    +/**
    + * Returns whether or not a status in a presence is active.
    + *
    + * A status is active if itself or any of its sub-statuses are active.
    + *
    + * @param presence The presence.
    + * @param status_id The ID of the status.
    + *
    + * @return TRUE if the status is active, or FALSE.
    + */
    +gboolean purple_presence_is_status_active(const PurplePresence *presence,
    + const char *status_id);
    +
    +/**
    + * Returns whether or not a status with the specified primitive type
    + * in a presence is active.
    + *
    + * A status is active if itself or any of its sub-statuses are active.
    + *
    + * @param presence The presence.
    + * @param primitive The status primitive.
    + *
    + * @return TRUE if the status is active, or FALSE.
    + */
    +gboolean purple_presence_is_status_primitive_active(
    + const PurplePresence *presence, PurpleStatusPrimitive primitive);
    +
    +/**
    + * Returns whether or not a presence is idle.
    + *
    + * @param presence The presence.
    + *
    + * @return TRUE if the presence is idle, or FALSE otherwise.
    + * If the presence is offline (purple_presence_is_online()
    + * returns FALSE) then FALSE is returned.
    + */
    +gboolean purple_presence_is_idle(const PurplePresence *presence);
    +
    +/**
    + * Returns the presence's idle time.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's idle time.
    + */
    +time_t purple_presence_get_idle_time(const PurplePresence *presence);
    +
    +/**
    + * Returns the presence's login time.
    + *
    + * @param presence The presence.
    + *
    + * @return The presence's login time.
    + */
    +time_t purple_presence_get_login_time(const PurplePresence *presence);
    +
    +/**
    + * Compares two presences for availability.
    + *
    + * @param presence1 The first presence.
    + * @param presence2 The second presence.
    + *
    + * @return -1 if @a presence1 is more available than @a presence2.
    + * 0 if @a presence1 is equal to @a presence2.
    + * 1 if @a presence1 is less available than @a presence2.
    + */
    +gint purple_presence_compare(const PurplePresence *presence1,
    + const PurplePresence *presence2);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Status subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Get the handle for the status subsystem.
    + *
    + * @return the handle to the status subsystem
    + */
    +void *purple_status_get_handle(void);
    +
    +/**
    + * Initializes the status subsystem.
    + */
    +void purple_status_init(void);
    +
    +/**
    + * Uninitializes the status subsystem.
    + */
    +void purple_status_uninit(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_STATUS_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/stringref.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,138 @@
    +/* TODO: Can we just replace this whole thing with a GCache */
    +
    +/**
    + * @file stringref.h Reference-counted immutable strings
    + * @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
    + *
    + */
    +#ifndef _PURPLE_STRINGREF_H_
    +#define _PURPLE_STRINGREF_H_
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +typedef struct _PurpleStringref PurpleStringref;
    +
    +/**
    + * Creates an immutable reference-counted string object. The newly
    + * created object will have a reference count of 1.
    + *
    + * @param value This will be the value of the string; it will be
    + * duplicated.
    + *
    + * @return A newly allocated string reference object with a refcount
    + * of 1.
    + */
    +PurpleStringref *purple_stringref_new(const char *value);
    +
    +/**
    + * Creates an immutable reference-counted string object. The newly
    + * created object will have a reference count of zero, and if it is
    + * not referenced before the next iteration of the mainloop it will
    + * be freed at that time.
    + *
    + * @param value This will be the value of the string; it will be
    + * duplicated.
    + *
    + * @return A newly allocated string reference object with a refcount
    + * of zero.
    + */
    +PurpleStringref *purple_stringref_new_noref(const char *value);
    +
    +/**
    + * Creates an immutable reference-counted string object from a printf
    + * format specification and arguments. The created object will have a
    + * reference count of 1.
    + *
    + * @param format A printf-style format specification.
    + *
    + * @return A newly allocated string reference object with a refcount
    + * of 1.
    + */
    +PurpleStringref *purple_stringref_printf(const char *format, ...);
    +
    +/**
    + * Increase the reference count of the given stringref.
    + *
    + * @param stringref String to be referenced.
    + *
    + * @return A pointer to the referenced string.
    + */
    +PurpleStringref *purple_stringref_ref(PurpleStringref *stringref);
    +
    +/**
    + * Decrease the reference count of the given stringref. If this
    + * reference count reaches zero, the stringref will be freed; thus
    + * you MUST NOT use this string after dereferencing it.
    + *
    + * @param stringref String to be dereferenced.
    + */
    +void purple_stringref_unref(PurpleStringref *stringref);
    +
    +/**
    + * Retrieve the value of a stringref.
    + *
    + * @note This value should not be cached or stored in a local variable.
    + * While there is nothing inherently incorrect about doing so, it
    + * is easy to forget that the cached value is in fact a
    + * reference-counted object and accidentally use it after
    + * dereferencing. This is more problematic for a reference-
    + * counted object than a heap-allocated object, as it may seem to
    + * be valid or invalid nondeterministically based on how many
    + * other references to it exist.
    + *
    + * @param stringref String reference from which to retrieve the value.
    + *
    + * @return The contents of the string reference.
    + */
    +const char *purple_stringref_value(const PurpleStringref *stringref);
    +
    +/**
    + * Compare two stringrefs for string equality. This returns the same
    + * value as strcmp would, where <0 indicates that s1 is "less than" s2
    + * in the ASCII lexicography, 0 indicates equality, etc.
    + *
    + * @param s1 The reference string.
    + *
    + * @param s2 The string to compare against the reference.
    + *
    + * @return An ordering indication on s1 and s2.
    + */
    +int purple_stringref_cmp(const PurpleStringref *s1, const PurpleStringref *s2);
    +
    +/**
    + * Find the length of the string inside a stringref.
    + *
    + * @param stringref The string in whose length we are interested.
    + *
    + * @return The length of the string in stringref
    + */
    +size_t purple_stringref_len(const PurpleStringref *stringref);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_STRINGREF_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/stun.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,88 @@
    +/**
    + * @file stun.h STUN 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
    + */
    +#ifndef _PURPLE_STUN_H_
    +#define _PURPLE_STUN_H_
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name STUN API */
    +/**************************************************************************/
    +/*@{*/
    +
    +typedef struct _PurpleStunNatDiscovery PurpleStunNatDiscovery;
    +
    +typedef enum {
    + PURPLE_STUN_STATUS_UNDISCOVERED = -1,
    + PURPLE_STUN_STATUS_UNKNOWN, /* no STUN server reachable */
    + PURPLE_STUN_STATUS_DISCOVERING,
    + PURPLE_STUN_STATUS_DISCOVERED
    +} PurpleStunStatus;
    +
    +typedef enum {
    + PURPLE_STUN_NAT_TYPE_PUBLIC_IP,
    + PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT,
    + PURPLE_STUN_NAT_TYPE_FULL_CONE,
    + PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE,
    + PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE,
    + PURPLE_STUN_NAT_TYPE_SYMMETRIC
    +} PurpleStunNatType;
    +
    +struct _PurpleStunNatDiscovery {
    + PurpleStunStatus status;
    + PurpleStunNatType type;
    + char publicip[16];
    + char *servername;
    + time_t lookup_time;
    +};
    +
    +typedef void (*StunCallback) (PurpleStunNatDiscovery *);
    +
    +/**
    + * Starts a NAT discovery. It returns a PurpleStunNatDiscovery if the discovery
    + * is already done. Otherwise the callback is called when the discovery is over
    + * and NULL is returned.
    + *
    + * @param cb The callback to call when the STUN discovery is finished if the
    + * discovery would block. If the discovery is done, this is NOT
    + * called.
    + *
    + * @return a PurpleStunNatDiscovery which includes the public IP and the type
    + * of NAT or NULL is discovery would block
    + */
    +PurpleStunNatDiscovery *purple_stun_discover(StunCallback cb);
    +
    +void purple_stun_init(void);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_STUN_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme-loader.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,93 @@
    +/**
    + * @file theme-loader.h Purple Theme Loader Abstact Class API
    + */
    +
    +/* 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
    + */
    +
    +#ifndef PURPLE_THEME_LOADER_H
    +#define PURPLE_THEME_LOADER_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +#include "theme.h"
    +
    +/**
    + * A purple theme loader.
    + * This is an abstract class for Purple to use with the Purple theme manager.
    + * The loader is responsible for building each type of theme
    + *
    + * PurpleThemeLoader is a GObject.
    + */
    +typedef struct _PurpleThemeLoader PurpleThemeLoader;
    +typedef struct _PurpleThemeLoaderClass PurpleThemeLoaderClass;
    +
    +#define PURPLE_TYPE_THEME_LOADER (purple_theme_loader_get_type())
    +#define PURPLE_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoader))
    +#define PURPLE_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoaderClass))
    +#define PURPLE_IS_THEME_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_THEME_LOADER))
    +#define PURPLE_IS_THEME_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_THEME_LOADER))
    +#define PURPLE_THEME_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_THEME_LOADER, PurpleThemeLoaderClass))
    +
    +struct _PurpleThemeLoader
    +{
    + GObject parent;
    + gpointer priv;
    +};
    +
    +struct _PurpleThemeLoaderClass
    +{
    + GObjectClass parent_class;
    + PurpleTheme *((*purple_theme_loader_build)(const gchar*));
    +};
    +
    +/**************************************************************************/
    +/** @name Purple Theme-Loader API */
    +/**************************************************************************/
    +G_BEGIN_DECLS
    +
    +/**
    + * GObject foo.
    + * @internal.
    + */
    +GType purple_theme_loader_get_type(void);
    +
    +/**
    + * Returns the string representing the type of the theme loader
    + *
    + * @param self The theme loader
    + *
    + * @returns The string representing this type
    + */
    +const gchar *purple_theme_loader_get_type_string(PurpleThemeLoader *self);
    +
    +/**
    + * Creates a new PurpleTheme
    + *
    + * @param loader The theme loader
    + * @param dir The directory containing the theme
    + *
    + * @returns A PurpleTheme containing the information from the directory
    + */
    +PurpleTheme *purple_theme_loader_build(PurpleThemeLoader *loader, const gchar *dir);
    +
    +G_END_DECLS
    +#endif /* PURPLE_THEME_LOADER_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme-manager.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,139 @@
    +/**
    + * @file theme-manager.h Theme Manager API
    + */
    +
    +/*
    + * 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
    + */
    +
    +#ifndef PURPLE_THEME_MANAGER_H
    +#define PURPLE_THEME_MANAGER_H
    +
    +#include <glib-object.h>
    +#include <glib.h>
    +#include "theme.h"
    +#include "theme-loader.h"
    +
    +typedef void (*PTFunc) (PurpleTheme *);
    +
    +typedef struct _PurpleThemeManager PurpleThemeManager;
    +typedef struct _PurpleThemeManagerClass PurpleThemeManagerClass;
    +
    +#define PURPLE_TYPE_THEME_MANAGER (purple_theme_manager_get_type())
    +#define PURPLE_THEME_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManager))
    +#define PURPLE_THEME_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManagerClass))
    +#define PURPLE_IS_THEME_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_THEME_MANAGER))
    +#define PURPLE_IS_THEME_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_THEME_MANAGER))
    +#define PURPLE_GET_THEME_MANAGER_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_THEME_MANAGER, PurpleThemeManagerClass))
    +
    +struct _PurpleThemeManager {
    + GObject parent;
    +};
    +
    +struct _PurpleThemeManagerClass {
    + GObjectClass parent_class;
    +};
    +
    +/**************************************************************************/
    +/** @name Purple Theme Manager API */
    +/**************************************************************************/
    +G_BEGIN_DECLS
    +
    +/**
    + * GObject foo.
    + *
    + * @internal.
    + */
    +GType purple_theme_manager_get_type(void);
    +
    +/**
    + * Initalizes the theme manager.
    + */
    +void purple_theme_manager_init(void);
    +
    +/**
    + * Uninitalizes the manager then frees all the themes and loaders it is
    + * responsible for.
    + */
    +void purple_theme_manager_uninit(void);
    +
    +/**
    + * Rebuilds all the themes in the theme manager.
    + * (Removes all current themes but keeps the added loaders.)
    + */
    +void purple_theme_manager_refresh(void);
    +
    +/**
    + * Finds the PurpleTheme object stored by the theme manager.
    + *
    + * @param name The name of the PurpleTheme.
    + * @param type The type of the PurpleTheme.
    + *
    + * @returns The PurpleTheme, or NULL if it wasn't found.
    + */
    +PurpleTheme *purple_theme_manager_find_theme(const gchar *name, const gchar *type);
    +
    +/**
    + * Adds a PurpleTheme to the theme manager. If the theme already exists
    + * then this function does nothing.
    + *
    + * @param theme The PurpleTheme to add to the manager.
    + */
    +void purple_theme_manager_add_theme(PurpleTheme *theme);
    +
    +/**
    + * Removes a PurpleTheme from the theme manager and frees the theme.
    + *
    + * @param theme The PurpleTheme to remove from the manager.
    + */
    +void purple_theme_manager_remove_theme(PurpleTheme *theme);
    +
    +/**
    + * Adds a loader to the theme manager so it knows how to build themes.
    + *
    + * @param loader The PurpleThemeLoader to add.
    + */
    +void purple_theme_manager_register_type(PurpleThemeLoader *loader);
    +
    +/**
    + * Removes the loader and all themes of the same type from the loader.
    + *
    + * @param loader The PurpleThemeLoader to be removed.
    + */
    +void purple_theme_manager_unregister_type(PurpleThemeLoader *loader);
    +
    +/**
    + * Calls the given function on each purple theme.
    + *
    + * @param func The PTFunc to be applied to each theme.
    + */
    +void purple_theme_manager_for_each_theme(PTFunc func);
    +
    +/**
    + * Loads a theme of the given type without adding it to the manager
    + *
    + * @param theme_dir the directory of the theme to load
    + * @param type the type of theme to load
    + */
    +PurpleTheme *purple_theme_manager_load_theme(const gchar *theme_dir, const gchar *type);
    +
    +G_END_DECLS
    +#endif /* PURPLE_THEME_MANAGER_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/theme.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,175 @@
    +/**
    + * @file theme.h Purple Theme Abstact Class API
    + */
    +
    +/* 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
    + */
    +
    +#ifndef PURPLE_THEME_H
    +#define PURPLE_THEME_H
    +
    +#include <glib.h>
    +#include <glib-object.h>
    +#include "imgstore.h"
    +
    +/**
    + * A purple theme.
    + * This is an abstract class for Purple to use with the Purple theme manager.
    + *
    + * PurpleTheme is a GObject.
    + */
    +typedef struct _PurpleTheme PurpleTheme;
    +typedef struct _PurpleThemeClass PurpleThemeClass;
    +
    +#define PURPLE_TYPE_THEME (purple_theme_get_type ())
    +#define PURPLE_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PURPLE_TYPE_THEME, PurpleTheme))
    +#define PURPLE_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PURPLE_TYPE_THEME, PurpleThemeClass))
    +#define PURPLE_IS_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PURPLE_TYPE_THEME))
    +#define PURPLE_IS_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PURPLE_TYPE_THEME))
    +#define PURPLE_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PURPLE_TYPE_THEME, PurpleThemeClass))
    +
    +struct _PurpleTheme
    +{
    + GObject parent;
    + gpointer priv;
    +};
    +
    +struct _PurpleThemeClass
    +{
    + GObjectClass parent_class;
    +};
    +
    +/**************************************************************************/
    +/** @name Purple Theme API */
    +/**************************************************************************/
    +G_BEGIN_DECLS
    +
    +/**
    + * GObject foo.
    + * @internal.
    + */
    +GType purple_theme_get_type(void);
    +
    +/**
    + * Returns the name of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The string representing the name of the theme.
    + */
    +const gchar *purple_theme_get_name(PurpleTheme *theme);
    +
    +/**
    + * Sets the name of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + * @param name The name of the PurpleTheme object.
    + */
    +void purple_theme_set_name(PurpleTheme *theme, const gchar *name);
    +
    +/**
    + * Returns the description of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return A short description of the theme.
    + */
    +const gchar *purple_theme_get_description(PurpleTheme *theme);
    +
    +/**
    + * Sets the description of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + * @param description The description of the PurpleTheme object.
    + */
    +void purple_theme_set_description(PurpleTheme *theme, const gchar *description);
    +
    +/**
    + * Returns the author of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The author of the theme.
    + */
    +const gchar *purple_theme_get_author(PurpleTheme *theme);
    +
    +/**
    + * Sets the author of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + * @param author The author of the PurpleTheme object.
    + */
    +void purple_theme_set_author(PurpleTheme *theme, const gchar *author);
    +
    +/**
    + * Returns the type (string) of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The string representing the type.
    + */
    +const gchar *purple_theme_get_type_string(PurpleTheme *theme);
    +
    +/**
    + * Returns the directory of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The string representing the theme directory.
    + */
    +const gchar *purple_theme_get_dir(PurpleTheme *theme);
    +
    +/**
    + * Sets the directory of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + * @param dir The directory of the PurpleTheme object.
    + */
    +void purple_theme_set_dir(PurpleTheme *theme, const gchar *dir);
    +
    +/**
    + * Returns the image preview of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The image preview of the PurpleTheme object.
    + */
    +const gchar *purple_theme_get_image(PurpleTheme *theme);
    +
    +/**
    + * Returns the image preview and directory of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + *
    + * @return The image preview of the PurpleTheme object.
    + */
    +gchar *purple_theme_get_image_full(PurpleTheme *theme);
    +
    +/**
    + * Sets the directory of the PurpleTheme object.
    + *
    + * @param theme The purple theme.
    + * @param img The image preview of the PurpleTheme object.
    + */
    +void purple_theme_set_image(PurpleTheme *theme, const gchar *img);
    +
    +G_END_DECLS
    +#endif /* PURPLE_THEME_H */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/upnp.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,132 @@
    +/**
    + * @file upnp.h Universal Plug N Play 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
    + */
    +
    +#ifndef _PURPLE_UPNP_H_
    +#define _PURPLE_UPNP_H_
    +
    +typedef struct _UPnPMappingAddRemove UPnPMappingAddRemove;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**************************************************************************/
    +/** @name UPnP API */
    +/**************************************************************************/
    +/*@{*/
    +
    +/* typedef struct _PurpleUPnPRequestData PurpleUPnPRequestData; */
    +
    +typedef void (*PurpleUPnPCallback) (gboolean success, gpointer data);
    +
    +
    +/**
    + * Initialize UPnP
    + */
    +void purple_upnp_init(void);
    +
    +
    +/**
    + * Sends a discovery request to search for a UPnP enabled IGD that
    + * contains the WANIPConnection service that will allow us to recieve the
    + * public IP address of the IGD, and control it for forwarding ports.
    + * The result will be cached for further use.
    + *
    + * @param cb an optional callback function to be notified when the UPnP
    + * discovery is complete
    + * @param cb_data Extra data to be passed to the callback
    + */
    +void purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data);
    +
    +#if 0
    +/**
    + * Retrieve the current UPnP control info, if there is any available.
    + * This will only be filled in if purple_upnp_discover() had been called,
    + * and finished discovering.
    + *
    + * @return The control URL for the IGD we'll use to use the IGD services
    + */
    +const PurpleUPnPControlInfo* purple_upnp_get_control_info(void);
    +#endif
    +
    +/**
    + * Gets the IP address from a UPnP enabled IGD that sits on the local
    + * network, so when getting the network IP, instead of returning the
    + * local network IP, the public IP is retrieved. This is a cached value from
    + * the time of the UPnP discovery.
    + *
    + * @return The IP address of the network, or NULL if something went wrong
    + */
    +const gchar* purple_upnp_get_public_ip(void);
    +
    +/**
    + * Cancel a pending port mapping request initiated with either
    + * purple_upnp_set_port_mapping() or purple_upnp_remove_port_mapping().
    + *
    + * @param mapping_data The data returned when you initiated the UPnP mapping request.
    + */
    +void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove *mapping_data);
    +
    +/**
    + * Maps Ports in a UPnP enabled IGD that sits on the local network to
    + * this purple client. Essentially, this function takes care of the port
    + * forwarding so things like file transfers can work behind NAT firewalls
    + *
    + * @param portmap The port to map to this client
    + * @param protocol The protocol to map, either "TCP" or "UDP"
    + * @param cb an optional callback function to be notified when the mapping
    + * addition is complete
    + * @param cb_data Extra data to be passed to the callback
    + *
    + * @return Data which can be passed to purple_upnp_port_mapping_cancel() to cancel
    + */
    +UPnPMappingAddRemove *purple_upnp_set_port_mapping(unsigned short portmap, const gchar* protocol,
    + PurpleUPnPCallback cb, gpointer cb_data);
    +
    +/**
    + * Deletes a port mapping in a UPnP enabled IGD that sits on the local network
    + * to this purple client. Essentially, this function takes care of deleting the
    + * port forwarding after they have completed a connection so another client on
    + * the local network can take advantage of the port forwarding
    + *
    + * @param portmap The port to delete the mapping for
    + * @param protocol The protocol to map to. Either "TCP" or "UDP"
    + * @param cb an optional callback function to be notified when the mapping
    + * removal is complete
    + * @param cb_data Extra data to be passed to the callback
    + *
    + * @return Data which can be passed to purple_upnp_port_mapping_cancel() to cancel
    + */
    +UPnPMappingAddRemove *purple_upnp_remove_port_mapping(unsigned short portmap,
    + const gchar* protocol, PurpleUPnPCallback cb, gpointer cb_data);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_UPNP_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/util.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,1516 @@
    +/**
    + * @file util.h Utility Functions
    + * @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
    + *
    + * @todo Rename the functions so that they live somewhere in the purple
    + * namespace.
    + */
    +#ifndef _PURPLE_UTIL_H_
    +#define _PURPLE_UTIL_H_
    +
    +#include <stdio.h>
    +
    +/**
    + * An opaque structure representing a URL request. Can be used to cancel
    + * the request.
    + */
    +typedef struct _PurpleUtilFetchUrlData PurpleUtilFetchUrlData;
    +/** @copydoc _PurpleMenuAction */
    +typedef struct _PurpleMenuAction PurpleMenuAction;
    +/** @copydoc _PurpleKeyValuePair */
    +typedef struct _PurpleKeyValuePair PurpleKeyValuePair;
    +
    +#include "account.h"
    +#include "signals.h"
    +#include "xmlnode.h"
    +#include "notify.h"
    +
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +struct _PurpleMenuAction
    +{
    + char *label;
    + PurpleCallback callback;
    + gpointer data;
    + GList *children;
    +};
    +
    +typedef char *(*PurpleInfoFieldFormatCallback)(const char *field, size_t len);
    +
    +/**
    + * A key-value pair.
    + *
    + * This is used by, among other things, purple_gtk_combo* functions to pass in a
    + * list of key-value pairs so it can display a user-friendly value.
    + */
    +struct _PurpleKeyValuePair
    +{
    + gchar *key;
    + void *value;
    +
    +};
    +
    +/**
    + * Creates a new PurpleMenuAction.
    + *
    + * @param label The text label to display for this action.
    + * @param callback The function to be called when the action is used on
    + * the selected item.
    + * @param data Additional data to be passed to the callback.
    + * @param children A GList of PurpleMenuActions to be added as a submenu
    + * of the action.
    + * @return The PurpleMenuAction.
    + */
    +PurpleMenuAction *purple_menu_action_new(const char *label, PurpleCallback callback,
    + gpointer data, GList *children);
    +
    +/**
    + * Frees a PurpleMenuAction
    + *
    + * @param act The PurpleMenuAction to free.
    + */
    +void purple_menu_action_free(PurpleMenuAction *act);
    +
    +/**
    + * Set the appropriate presence values for the currently playing song.
    + *
    + * @param title The title of the song, @c NULL to unset the value.
    + * @param artist The artist of the song, can be @c NULL.
    + * @param album The album of the song, can be @c NULL.
    + * @since 2.4.0
    + */
    +void purple_util_set_current_song(const char *title, const char *artist,
    + const char *album);
    +
    +/**
    + * Format song information.
    + *
    + * @param title The title of the song, @c NULL to unset the value.
    + * @param artist The artist of the song, can be @c NULL.
    + * @param album The album of the song, can be @c NULL.
    + * @param unused Currently unused, must be @c NULL.
    + *
    + * @return The formatted string. The caller must g_free the returned string.
    + * @since 2.4.0
    + */
    +char * purple_util_format_song_info(const char *title, const char *artist,
    + const char *album, gpointer unused);
    +
    +/**************************************************************************/
    +/** @name Utility Subsystem */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Initializes the utility subsystem.
    + *
    + * @since 2.3.0
    + */
    +void purple_util_init(void);
    +
    +/**
    + * Uninitializes the util subsystem.
    + *
    + * @since 2.3.0
    + */
    +void purple_util_uninit(void);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Base16 Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Converts a chunk of binary data to its base-16 equivalent.
    + *
    + * @param data The data to convert.
    + * @param len The length of the data.
    + *
    + * @return The base-16 string in the ASCII encoding. Must be
    + * g_free'd when no longer needed.
    + *
    + * @see purple_base16_decode()
    + */
    +gchar *purple_base16_encode(const guchar *data, gsize len);
    +
    +/**
    + * Converts an ASCII string of base-16 encoded data to
    + * the binary equivalent.
    + *
    + * @param str The base-16 string to convert to raw data.
    + * @param ret_len The length of the returned data. You can
    + * pass in NULL if you're sure that you know
    + * the length of the decoded data, or if you
    + * know you'll be able to use strlen to
    + * determine the length, etc.
    + *
    + * @return The raw data. Must be g_free'd when no longer needed.
    + *
    + * @see purple_base16_encode()
    + */
    +guchar *purple_base16_decode(const char *str, gsize *ret_len);
    +
    +/**
    + * Converts a chunk of binary data to a chunked base-16 representation
    + * (handy for key fingerprints)
    + *
    + * Example output: 01:23:45:67:89:AB:CD:EF
    + *
    + * @param data The data to convert.
    + * @param len The length of the data.
    + *
    + * @return The base-16 string in the ASCII chunked encoding. Must be
    + * g_free'd when no longer needed.
    + */
    +gchar *purple_base16_encode_chunked(const guchar *data, gsize len);
    +
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Base64 Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Converts a chunk of binary data to its base-64 equivalent.
    + *
    + * @param data The data to convert.
    + * @param len The length of the data.
    + *
    + * @return The base-64 string in the ASCII encoding. Must be
    + * g_free'd when no longer needed.
    + *
    + * @see purple_base64_decode()
    + */
    +gchar *purple_base64_encode(const guchar *data, gsize len);
    +
    +/**
    + * Converts an ASCII string of base-64 encoded data to
    + * the binary equivalent.
    + *
    + * @param str The base-64 string to convert to raw data.
    + * @param ret_len The length of the returned data. You can
    + * pass in NULL if you're sure that you know
    + * the length of the decoded data, or if you
    + * know you'll be able to use strlen to
    + * determine the length, etc.
    + *
    + * @return The raw data. Must be g_free'd when no longer needed.
    + *
    + * @see purple_base64_encode()
    + */
    +guchar *purple_base64_decode(const char *str, gsize *ret_len);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name Quoted Printable Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Converts a quoted printable string back to its readable equivalent.
    + * What is a quoted printable string, you ask? It's an encoding used
    + * to transmit binary data as ASCII. It's intended purpose is to send
    + * emails containing non-ASCII characters. Wikipedia has a pretty good
    + * explanation. Also see RFC 2045.
    + *
    + * @param str The quoted printable ASCII string to convert to raw data.
    + * @param ret_len The length of the returned data.
    + *
    + * @return The readable string. Must be g_free'd when no longer needed.
    + */
    +guchar *purple_quotedp_decode(const char *str, gsize *ret_len);
    +
    +/*@}*/
    +
    +/**************************************************************************/
    +/** @name MIME Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Converts a MIME header field string back to its readable equivalent
    + * according to RFC 2047. Basically, a header is plain ASCII and can
    + * contain any number of sections called "encoded-words." The format
    + * of an encoded word is =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?=
    + * =? designates the beginning of the encoded-word
    + * ?= designates the end of the encoded-word
    + *
    + * An encoded word is segmented into three pieces by the use of a
    + * question mark. The first piece is the character set, the second
    + * piece is the encoding, and the third piece is the encoded text.
    + *
    + * @param str The ASCII string, possibly containing any number of
    + * encoded-word sections.
    + *
    + * @return The string, with any encoded-word sections decoded and
    + * converted to UTF-8. Must be g_free'd when no longer
    + * needed.
    + */
    +char *purple_mime_decode_field(const char *str);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Date/Time Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Formats a time into the specified format.
    + *
    + * This is essentially strftime(), but it has a static buffer
    + * and handles the UTF-8 conversion for the caller.
    + *
    + * This function also provides the GNU %z formatter if the underlying C
    + * library doesn't. However, the format string parser is very naive, which
    + * means that conversions specifiers to %z cannot be guaranteed. The GNU
    + * strftime(3) man page describes %z as: 'The time-zone as hour offset from
    + * GMT. Required to emit RFC822-conformant dates
    + * (using "%a, %d %b %Y %H:%M:%S %z"). (GNU)'
    + *
    + * On Windows, this function also converts the results for %Z from a timezone
    + * name (as returned by the system strftime() %Z format string) to a timezone
    + * abbreviation (as is the case on Unix). As with %z, conversion specifiers
    + * should not be used.
    + *
    + * @param format The format string, in UTF-8
    + * @param tm The time to format, or @c NULL to use the current local time
    + *
    + * @return The formatted time, in UTF-8.
    + *
    + * @note @a format is required to be in UTF-8. This differs from strftime(),
    + * where the format is provided in the locale charset.
    + */
    +const char *purple_utf8_strftime(const char *format, const struct tm *tm);
    +
    +/**
    + * Gets a string representation of the local timezone offset
    + *
    + * @param tm The time to get the timezone for
    + * @param iso TRUE to format the offset according to ISO-8601, FALSE to
    + * not substitute 'Z' for 0 offset, and to not separate
    + * hours and minutes with a colon.
    + */
    +const char *purple_get_tzoff_str(const struct tm *tm, gboolean iso);
    +
    +/**
    + * Formats a time into the user's preferred short date format.
    + *
    + * The returned string is stored in a static buffer, so the result
    + * should be g_strdup()'d if it's going to be kept.
    + *
    + * @param tm The time to format, or @c NULL to use the current local time
    + *
    + * @return The date, formatted as per the user's settings.
    + */
    +const char *purple_date_format_short(const struct tm *tm);
    +
    +/**
    + * Formats a time into the user's preferred short date plus time format.
    + *
    + * The returned string is stored in a static buffer, so the result
    + * should be g_strdup()'d if it's going to be kept.
    + *
    + * @param tm The time to format, or @c NULL to use the current local time
    + *
    + * @return The timestamp, formatted as per the user's settings.
    + */
    +const char *purple_date_format_long(const struct tm *tm);
    +
    +/**
    + * Formats a time into the user's preferred full date and time format.
    + *
    + * The returned string is stored in a static buffer, so the result
    + * should be g_strdup()'d if it's going to be kept.
    + *
    + * @param tm The time to format, or @c NULL to use the current local time
    + *
    + * @return The date and time, formatted as per the user's settings.
    + */
    +const char *purple_date_format_full(const struct tm *tm);
    +
    +/**
    + * Formats a time into the user's preferred time format.
    + *
    + * The returned string is stored in a static buffer, so the result
    + * should be g_strdup()'d if it's going to be kept.
    + *
    + * @param tm The time to format, or @c NULL to use the current local time
    + *
    + * @return The time, formatted as per the user's settings.
    + */
    +const char *purple_time_format(const struct tm *tm);
    +
    +/**
    + * Builds a time_t from the supplied information.
    + *
    + * @param year The year.
    + * @param month The month.
    + * @param day The day.
    + * @param hour The hour.
    + * @param min The minute.
    + * @param sec The second.
    + *
    + * @return A time_t.
    + */
    +time_t purple_time_build(int year, int month, int day, int hour,
    + int min, int sec);
    +
    +/** Used by purple_str_to_time to indicate no timezone offset was
    + * specified in the timestamp string. */
    +#define PURPLE_NO_TZ_OFF -500000
    +
    +/**
    + * Parses a timestamp in jabber, ISO8601, or MM/DD/YYYY format and returns
    + * a time_t.
    + *
    + * @param timestamp The timestamp
    + * @param utc Assume UTC if no timezone specified
    + * @param tm If not @c NULL, the caller can get a copy of the
    + * struct tm used to calculate the time_t return value.
    + * @param tz_off If not @c NULL, the caller can get a copy of the
    + * timezone offset (from UTC) used to calculate the time_t
    + * return value. Note: Zero is a valid offset. As such,
    + * the value of the macro @c PURPLE_NO_TZ_OFF indicates no
    + * offset was specified (which means that the local
    + * timezone was used in the calculation).
    + * @param rest If not @c NULL, the caller can get a pointer to the
    + * part of @a timestamp left over after parsing is
    + * completed, if it's not the end of @a timestamp.
    + *
    + * @return A time_t.
    + */
    +time_t purple_str_to_time(const char *timestamp, gboolean utc,
    + struct tm *tm, long *tz_off, const char **rest);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Markup Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Escapes special characters in a plain-text string so they display
    + * correctly as HTML. For example, & is replaced with &amp; and < is
    + * replaced with &lt;
    + *
    + * This is exactly the same as g_markup_escape_text(), except that it
    + * does not change ' to &apos; because &apos; is not a valid HTML 4 entity,
    + * and is displayed literally in IE7.
    + *
    + * @since 2.6.0
    + */
    +gchar *purple_markup_escape_text(const gchar *text, gssize length);
    +
    +/**
    + * Finds an HTML tag matching the given name.
    + *
    + * This locates an HTML tag's start and end, and stores its attributes
    + * in a GData hash table. The names of the attributes are lower-cased
    + * in the hash table, and the name of the tag is case insensitive.
    + *
    + * @param needle The name of the tag
    + * @param haystack The null-delimited string to search in
    + * @param start A pointer to the start of the tag if found
    + * @param end A pointer to the end of the tag if found
    + * @param attributes The attributes, if the tag was found. This should
    + * be freed with g_datalist_clear().
    + * @return TRUE if the tag was found
    + */
    +gboolean purple_markup_find_tag(const char *needle, const char *haystack,
    + const char **start, const char **end,
    + GData **attributes);
    +
    +/**
    + * Extracts a field of data from HTML.
    + *
    + * This is a scary function. It used to be used for MSN and Yahoo prpls,
    + * but since those prpls have been removed, this is now deprecated.
    + *
    + * @param str The string to parse.
    + * @param len The size of str.
    + * @param user_info The destination PurpleNotifyUserInfo to which the new
    + * field info should be added.
    + * @param start_token The beginning token.
    + * @param skip The number of characters to skip after the
    + * start token.
    + * @param end_token The ending token.
    + * @param check_value The value that the last character must meet.
    + * @param no_value_token The token indicating no value is given.
    + * @param display_name The short descriptive name to display for this token.
    + * @param is_link TRUE if this should be a link, or FALSE otherwise.
    + * @param link_prefix The prefix for the link.
    + * @param format_cb A callback to format the value before adding it.
    + *
    + * @return TRUE if successful, or FALSE otherwise.
    + */
    +gboolean purple_markup_extract_info_field(const char *str, int len, PurpleNotifyUserInfo *user_info,
    + const char *start_token, int skip,
    + const char *end_token, char check_value,
    + const char *no_value_token,
    + const char *display_name, gboolean is_link,
    + const char *link_prefix,
    + PurpleInfoFieldFormatCallback format_cb);
    +
    +/**
    + * Converts HTML markup to XHTML.
    + *
    + * @param html The HTML markup.
    + * @param dest_xhtml The destination XHTML output.
    + * @param dest_plain The destination plain-text output.
    + */
    +void purple_markup_html_to_xhtml(const char *html, char **dest_xhtml,
    + char **dest_plain);
    +
    +/**
    + * Strips HTML tags from a string.
    + *
    + * @param str The string to strip HTML from.
    + *
    + * @return The new string without HTML. You must g_free this string
    + * when finished with it.
    + */
    +char *purple_markup_strip_html(const char *str);
    +
    +/**
    + * Adds the necessary HTML code to turn URIs into HTML links in a string.
    + *
    + * @param str The string to linkify.
    + *
    + * @return The new string with all URIs surrounded in standard
    + * HTML <a href="whatever"></a> tags. You must g_free this
    + * string when finished with it.
    + */
    +char *purple_markup_linkify(const char *str);
    +
    +/**
    + * Unescapes HTML entities to their literal characters in the text.
    + * For example "&amp;" is replaced by '&' and so on. Also converts
    + * numerical entities (e.g. "&#38;" is also '&').
    + *
    + * This function currently supports the following named entities:
    + * "&amp;", "&lt;", "&gt;", "&copy;", "&quot;", "&reg;", "&apos;"
    + *
    + * purple_unescape_html() is similar, but also converts "<br>" into "\n".
    + *
    + * @param text The string in which to unescape any HTML entities
    + *
    + * @return The text with HTML entities literalized. You must g_free
    + * this string when finished with it.
    + *
    + * @see purple_unescape_html()
    + * @since 2.7.0
    + */
    +char *purple_unescape_text(const char *text);
    +
    +/**
    + * Unescapes HTML entities to their literal characters and converts
    + * "<br>" to "\n". See purple_unescape_text() for more details.
    + *
    + * @param html The string in which to unescape any HTML entities
    + *
    + * @return The text with HTML entities literalized. You must g_free
    + * this string when finished with it.
    + *
    + * @see purple_unescape_text()
    + */
    +char *purple_unescape_html(const char *html);
    +
    +/**
    + * Returns a newly allocated substring of the HTML UTF-8 string "str".
    + * The markup is preserved such that the substring will have the same
    + * formatting as original string, even though some tags may have been
    + * opened before "x", or may close after "y". All open tags are closed
    + * at the end of the returned string, in the proper order.
    + *
    + * Note that x and y are in character offsets, not byte offsets, and
    + * are offsets into an unformatted version of str. Because of this,
    + * this function may be sensitive to changes in GtkIMHtml and may break
    + * when used with other UI's. libpurple users are encouraged to report and
    + * work out any problems encountered.
    + *
    + * @param str The input NUL terminated, HTML, UTF-8 (or ASCII) string.
    + * @param x The character offset into an unformatted version of str to
    + * begin at.
    + * @param y The character offset (into an unformatted vesion of str) of
    + * one past the last character to include in the slice.
    + *
    + * @return The HTML slice of string, with all formatting retained.
    + */
    +char *purple_markup_slice(const char *str, guint x, guint y);
    +
    +/**
    + * Returns a newly allocated string containing the name of the tag
    + * located at "tag". Tag is expected to point to a '<', and contain
    + * a '>' sometime after that. If there is no '>' and the string is
    + * not NUL terminated, this function can be expected to segfault.
    + *
    + * @param tag The string starting a HTML tag.
    + * @return A string containing the name of the tag.
    + */
    +char *purple_markup_get_tag_name(const char *tag);
    +
    +/**
    + * Returns a constant string of the character representation of the HTML
    + * entity pointed to by @a text. For example, purple_markup_unescape_entity("&amp;")
    + * will return "&". The @a text variable is expected to point to an '&',
    + * the first character of the entity. If given an unrecognized entity, the function
    + * returns @c NULL.
    + *
    + * Note that this function, unlike purple_unescape_html(), does not search
    + * the string for the entity, does not replace the entity, and does not
    + * return a newly allocated string.
    + *
    + * @param text A string containing an HTML entity.
    + * @param length If not @c NULL, the string length of the entity is stored in this location.
    + *
    + * @return A constant string containing the character representation of the given entity.
    + */
    +const char * purple_markup_unescape_entity(const char *text, int *length);
    +
    +/**
    + * Returns a newly allocated string containing the value of the CSS property specified
    + * in opt. The @a style argument is expected to point to a HTML inline CSS.
    + * The function will seek for the CSS property and return its value.
    + *
    + * For example, purple_markup_get_css_property("direction:rtl;color:#dc4d1b;",
    + * "color") would return "#dc4d1b".
    + *
    + * On error or if the requested property was not found, the function returns
    + * @c NULL.
    + *
    + * @param style A string containing the inline CSS text.
    + * @param opt The requested CSS property.
    + *
    + * @return The value of the requested CSS property.
    + */
    +char * purple_markup_get_css_property(const gchar *style, const gchar *opt);
    +
    +/**
    + * Check if the given HTML contains RTL text.
    + *
    + * @param html The HTML text.
    + *
    + * @return TRUE if the text contains RTL text, FALSE otherwise.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_markup_is_rtl(const char *html);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Path/Filename Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Returns the user's home directory.
    + *
    + * @return The user's home directory.
    + *
    + * @see purple_user_dir()
    + */
    +const gchar *purple_home_dir(void);
    +
    +/**
    + * Returns the purple settings directory in the user's home directory.
    + * This is usually ~/.purple
    + *
    + * @return The purple settings directory.
    + *
    + * @see purple_home_dir()
    + */
    +const char *purple_user_dir(void);
    +
    +/**
    + * Define a custom purple settings directory, overriding the default (user's home directory/.purple)
    + * @param dir The custom settings directory
    + */
    +void purple_util_set_user_dir(const char *dir);
    +
    +/**
    + * Builds a complete path from the root, making any directories along
    + * the path which do not already exist.
    + *
    + * @param path The path you wish to create. Note that it must start
    + * from the root or this function will fail.
    + * @param mode Unix-style permissions for this directory.
    + *
    + * @return 0 for success, nonzero on any error.
    + */
    +int purple_build_dir(const char *path, int mode);
    +
    +/**
    + * Write a string of data to a file of the given name in the Purple
    + * user directory ($HOME/.purple by default). The data is typically
    + * a serialized version of one of Purple's config files, such as
    + * prefs.xml, accounts.xml, etc. And the string is typically
    + * obtained using xmlnode_to_formatted_str. However, this function
    + * should work fine for saving binary files as well.
    + *
    + * @param filename The basename of the file to write in the purple_user_dir.
    + * @param data A null-terminated string of data to write.
    + * @param size The size of the data to save. If data is
    + * null-terminated you can pass in -1.
    + *
    + * @return TRUE if the file was written successfully. FALSE otherwise.
    + */
    +gboolean purple_util_write_data_to_file(const char *filename, const char *data,
    + gssize size);
    +
    +/**
    + * Write data to a file using the absolute path.
    + *
    + * This exists for Glib backwards compatibility reasons.
    + *
    + * @param filename_full Filename to write to
    + * @param data A null-terminated string of data to write.
    + * @param size The size of the data to save. If data is
    + * null-terminated you can pass in -1.
    + *
    + * @return TRUE if the file was written successfully. FALSE otherwise.
    + *
    + * @todo Remove this function (use g_file_set_contents instead) when 3.0.0
    + * rolls around.
    + * @see purple_util_write_data_to_file()
    + *
    + */
    +gboolean
    +purple_util_write_data_to_file_absolute(const char *filename_full, const char *data, gssize size);
    +
    +/**
    + * Read the contents of a given file and parse the results into an
    + * xmlnode tree structure. This is intended to be used to read
    + * Purple's configuration xml files (prefs.xml, pounces.xml, etc.)
    + *
    + * @param filename The basename of the file to open in the purple_user_dir.
    + * @param description A very short description of the contents of this
    + * file. This is used in error messages shown to the
    + * user when the file can not be opened. For example,
    + * "preferences," or "buddy pounces."
    + *
    + * @return An xmlnode tree of the contents of the given file. Or NULL, if
    + * the file does not exist or there was an error reading the file.
    + */
    +xmlnode *purple_util_read_xml_from_file(const char *filename,
    + const char *description);
    +
    +/**
    + * Creates a temporary file and returns a file pointer to it.
    + *
    + * This is like mkstemp(), but returns a file pointer and uses a
    + * pre-set template. It uses the semantics of tempnam() for the
    + * directory to use and allocates the space for the file path.
    + *
    + * The caller is responsible for closing the file and removing it when
    + * done, as well as freeing the space pointed to by @a path with
    + * g_free().
    + *
    + * @param path The returned path to the temp file.
    + * @param binary Text or binary, for platforms where it matters.
    + *
    + * @return A file pointer to the temporary file, or @c NULL on failure.
    + */
    +FILE *purple_mkstemp(char **path, gboolean binary);
    +
    +/**
    + * Returns an extension corresponding to the image data's file type.
    + *
    + * @param data A pointer to the image data
    + * @param len The length of the image data
    + *
    + * @return The appropriate extension, or "icon" if unknown.
    + */
    +const char *
    +purple_util_get_image_extension(gconstpointer data, size_t len);
    +
    +/**
    + * Returns a SHA-1 hash string of the data passed in.
    + */
    +char *purple_util_get_image_checksum(gconstpointer image_data, size_t image_len);
    +
    +/**
    + * @return A hex encoded version of the SHA-1 hash of the data passed
    + * in with the correct file extention appended. The file
    + * extension is determined by calling
    + * purple_util_get_image_extension(). This return value must
    + * be g_freed by the caller.
    + */
    +char *purple_util_get_image_filename(gconstpointer image_data, size_t image_len);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name Environment Detection Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Checks if the given program name is valid and executable.
    + *
    + * @param program The file name of the application.
    + *
    + * @return TRUE if the program is runable.
    + */
    +gboolean purple_program_is_valid(const char *program);
    +
    +/**
    + * Check if running GNOME.
    + *
    + * @return TRUE if running GNOME, FALSE otherwise.
    + */
    +gboolean purple_running_gnome(void);
    +
    +/**
    + * Check if running KDE.
    + *
    + * @return TRUE if running KDE, FALSE otherwise.
    + */
    +gboolean purple_running_kde(void);
    +
    +/**
    + * Check if running OS X.
    + *
    + * @return TRUE if running OS X, FALSE otherwise.
    + */
    +gboolean purple_running_osx(void);
    +
    +/**
    + * Returns the IP address from a socket file descriptor.
    + *
    + * @param fd The socket file descriptor.
    + *
    + * @return The IP address, or @c NULL on error.
    + */
    +char *purple_fd_get_ip(int fd);
    +
    +/**
    + * Returns the address family of a socket.
    + *
    + * @param fd The socket file descriptor.
    + *
    + * @return The address family of the socket (AF_INET, AF_INET6, etc) or -1
    + * on error.
    + * @since 2.7.0
    + */
    +int purple_socket_get_family(int fd);
    +
    +/**
    + * Returns TRUE if a socket is capable of speaking IPv4.
    + *
    + * This is the case for IPv4 sockets and, on some systems, IPv6 sockets
    + * (due to the IPv4-mapped address functionality).
    + *
    + * @param fd The socket file descriptor
    + * @return TRUE if a socket can speak IPv4.
    + * @since 2.7.0
    + */
    +gboolean purple_socket_speaks_ipv4(int fd);
    +
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name String Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +/**
    + * Tests two strings for equality.
    + *
    + * Unlike strcmp(), this function will not crash if one or both of the
    + * strings are @c NULL.
    + *
    + * @param left A string
    + * @param right A string to compare with left
    + *
    + * @return @c TRUE if the strings are the same, else @c FALSE.
    + *
    + * @since 2.6.0
    + */
    +gboolean purple_strequal(const gchar *left, const gchar *right);
    +
    +/**
    + * Normalizes a string, so that it is suitable for comparison.
    + *
    + * The returned string will point to a static buffer, so if the
    + * string is intended to be kept long-term, you <i>must</i>
    + * g_strdup() it. Also, calling normalize() twice in the same line
    + * will lead to problems.
    + *
    + * @param account The account the string belongs to, or NULL if you do
    + * not know the account. If you use NULL, the string
    + * will still be normalized, but if the PRPL uses a
    + * custom normalization function then the string may
    + * not be normalized correctly.
    + * @param str The string to normalize.
    + *
    + * @return A pointer to the normalized version stored in a static buffer.
    + */
    +const char *purple_normalize(const PurpleAccount *account, const char *str);
    +
    +/**
    + * Normalizes a string, so that it is suitable for comparison.
    + *
    + * This is one possible implementation for the PRPL callback
    + * function "normalize." It returns a lowercase and UTF-8
    + * normalized version of the string.
    + *
    + * @param account The account the string belongs to.
    + * @param str The string to normalize.
    + *
    + * @return A pointer to the normalized version stored in a static buffer.
    + */
    +const char *purple_normalize_nocase(const PurpleAccount *account, const char *str);
    +
    +/**
    + * Compares two strings to see if the first contains the second as
    + * a proper prefix.
    + *
    + * @param s The string to check.
    + * @param p The prefix in question.
    + *
    + * @return TRUE if p is a prefix of s, otherwise FALSE.
    + */
    +gboolean purple_str_has_prefix(const char *s, const char *p);
    +
    +/**
    + * Compares two strings to see if the second is a proper suffix
    + * of the first.
    + *
    + * @param s The string to check.
    + * @param x The suffix in question.
    + *
    + * @return TRUE if x is a a suffix of s, otherwise FALSE.
    + */
    +gboolean purple_str_has_suffix(const char *s, const char *x);
    +
    +/**
    + * Duplicates a string and replaces all newline characters from the
    + * source string with HTML linebreaks.
    + *
    + * @param src The source string.
    + *
    + * @return The new string. Must be g_free'd by the caller.
    + */
    +gchar *purple_strdup_withhtml(const gchar *src);
    +
    +/**
    + * Ensures that all linefeeds have a matching carriage return.
    + *
    + * @param str The source string.
    + *
    + * @return The string with carriage returns.
    + */
    +char *purple_str_add_cr(const char *str);
    +
    +/**
    + * Strips all instances of the given character from the
    + * given string. The string is modified in place. This
    + * is useful for stripping new line characters, for example.
    + *
    + * Example usage:
    + * purple_str_strip_char(my_dumb_string, '\n');
    + *
    + * @param str The string to strip characters from.
    + * @param thechar The character to strip from the given string.
    + */
    +void purple_str_strip_char(char *str, char thechar);
    +
    +/**
    + * Given a string, this replaces all instances of one character
    + * with another. This happens inline (the original string IS
    + * modified).
    + *
    + * @param string The string from which to replace stuff.
    + * @param delimiter The character you want replaced.
    + * @param replacement The character you want inserted in place
    + * of the delimiting character.
    + */
    +void purple_util_chrreplace(char *string, char delimiter,
    + char replacement);
    +
    +/**
    + * Given a string, this replaces one substring with another
    + * and returns a newly allocated string.
    + *
    + * @param string The string from which to replace stuff.
    + * @param delimiter The substring you want replaced.
    + * @param replacement The substring you want inserted in place
    + * of the delimiting substring.
    + *
    + * @return A new string, after performing the substitution.
    + * free this with g_free().
    + */
    +gchar *purple_strreplace(const char *string, const char *delimiter,
    + const char *replacement);
    +
    +
    +/**
    + * Given a string, this replaces any utf-8 substrings in that string with
    + * the corresponding numerical character reference, and returns a newly
    + * allocated string.
    + *
    + * @param in The string which might contain utf-8 substrings
    + *
    + * @return A new string, with utf-8 replaced with numerical character
    + * references, free this with g_free()
    +*/
    +char *purple_utf8_ncr_encode(const char *in);
    +
    +
    +/**
    + * Given a string, this replaces any numerical character references
    + * in that string with the corresponding actual utf-8 substrings,
    + * and returns a newly allocated string.
    + *
    + * @param in The string which might contain numerical character references.
    + *
    + * @return A new string, with numerical character references
    + * replaced with actual utf-8, free this with g_free().
    + */
    +char *purple_utf8_ncr_decode(const char *in);
    +
    +
    +/**
    + * Given a string, this replaces one substring with another
    + * ignoring case and returns a newly allocated string.
    + *
    + * @param string The string from which to replace stuff.
    + * @param delimiter The substring you want replaced.
    + * @param replacement The substring you want inserted in place
    + * of the delimiting substring.
    + *
    + * @return A new string, after performing the substitution.
    + * free this with g_free().
    + */
    +gchar *purple_strcasereplace(const char *string, const char *delimiter,
    + const char *replacement);
    +
    +/**
    + * This is like strstr, except that it ignores ASCII case in
    + * searching for the substring.
    + *
    + * @param haystack The string to search in.
    + * @param needle The substring to find.
    + *
    + * @return the location of the substring if found, or NULL if not
    + */
    +const char *purple_strcasestr(const char *haystack, const char *needle);
    +
    +/**
    + * Returns a string representing a filesize in the appropriate
    + * units (MB, KB, GB, etc.)
    + *
    + * @param size The size
    + *
    + * @return The string in units form. This must be freed.
    + */
    +char *purple_str_size_to_units(size_t size);
    +
    +/**
    + * Converts seconds into a human-readable form.
    + *
    + * @param sec The seconds.
    + *
    + * @return A human-readable form, containing days, hours, minutes, and
    + * seconds.
    + */
    +char *purple_str_seconds_to_string(guint sec);
    +
    +/**
    + * Converts a binary string into a NUL terminated ascii string,
    + * replacing nonascii characters and characters below SPACE (including
    + * NUL) into \\xyy, where yy are two hex digits. Also backslashes are
    + * changed into two backslashes (\\\\). The returned, newly allocated
    + * string can be outputted to the console, and must be g_free()d.
    + *
    + * @param binary A string of random data, possibly with embedded NULs
    + * and such.
    + * @param len The length in bytes of the input string. Must not be 0.
    + *
    + * @return A newly allocated ASCIIZ string.
    + */
    +char *purple_str_binary_to_ascii(const unsigned char *binary, guint len);
    +/*@}*/
    +
    +
    +/**************************************************************************/
    +/** @name URI/URL Functions */
    +/**************************************************************************/
    +/*@{*/
    +
    +void purple_got_protocol_handler_uri(const char *uri);
    +
    +/**
    + * Parses a URL, returning its host, port, file path, username and password.
    + *
    + * The returned data must be freed.
    + *
    + * @param url The URL to parse.
    + * @param ret_host The returned host.
    + * @param ret_port The returned port.
    + * @param ret_path The returned path.
    + * @param ret_user The returned username.
    + * @param ret_passwd The returned password.
    + */
    +gboolean purple_url_parse(const char *url, char **ret_host, int *ret_port,
    + char **ret_path, char **ret_user, char **ret_passwd);
    +
    +/**
    + * This is the signature used for functions that act as the callback
    + * to purple_util_fetch_url() or purple_util_fetch_url_request().
    + *
    + * @param url_data The same value that was returned when you called
    + * purple_fetch_url() or purple_fetch_url_request().
    + * @param user_data The user data that your code passed into either
    + * purple_util_fetch_url() or purple_util_fetch_url_request().
    + * @param url_text This will be NULL on error. Otherwise this
    + * will contain the contents of the URL.
    + * @param len 0 on error, otherwise this is the length of buf.
    + * @param error_message If something went wrong then this will contain
    + * a descriptive error message, and buf will be
    + * NULL and len will be 0.
    + */
    +typedef void (*PurpleUtilFetchUrlCallback)(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param cb The callback function.
    + * @param data The user data to pass to the callback function.
    + */
    +#define purple_util_fetch_url(url, full, user_agent, http11, cb, data) \
    + purple_util_fetch_url_request(url, full, user_agent, http11, NULL, \
    + FALSE, cb, data);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param max_len The maximum number of bytes to retrieve (-1 for unlimited)
    + * @param cb The callback function.
    + * @param data The user data to pass to the callback function.
    + * @deprecated In 3.0.0, we'll rename this to "purple_util_fetch_url" and get rid of the old one
    + */
    +#define purple_util_fetch_url_len(url, full, user_agent, http11, max_len, cb, data) \
    + purple_util_fetch_url_request_len(url, full, user_agent, http11, NULL, \
    + FALSE, max_len, cb, data);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param request A HTTP request to send to the server instead of the
    + * standard GET
    + * @param include_headers
    + * If TRUE, include the HTTP headers in the response.
    + * @param callback The callback function.
    + * @param data The user data to pass to the callback function.
    + */
    +PurpleUtilFetchUrlData *purple_util_fetch_url_request(const gchar *url,
    + gboolean full, const gchar *user_agent, gboolean http11,
    + const gchar *request, gboolean include_headers,
    + PurpleUtilFetchUrlCallback callback, gpointer data);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param request A HTTP request to send to the server instead of the
    + * standard GET
    + * @param include_headers
    + * If TRUE, include the HTTP headers in the response.
    + * @param max_len The maximum number of bytes to retrieve (-1 for unlimited)
    + * @param callback The callback function.
    + * @param data The user data to pass to the callback function.
    + * @deprecated In 3.0.0, this will go away.
    + */
    +PurpleUtilFetchUrlData *purple_util_fetch_url_request_len(const gchar *url,
    + gboolean full, const gchar *user_agent, gboolean http11,
    + const gchar *request, gboolean include_headers, gssize max_len,
    + PurpleUtilFetchUrlCallback callback, gpointer data);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param account The account for which the request is needed, or NULL.
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param request A HTTP request to send to the server instead of the
    + * standard GET
    + * @param include_headers
    + * If TRUE, include the HTTP headers in the response.
    + * @param max_len The maximum number of bytes to retrieve, or a negative
    + * number to use the default max of 512 KiB.
    + * @param callback The callback function.
    + * @param data The user data to pass to the callback function.
    + * @deprecated In 3.0.0, we'll rename this to "purple_util_fetch_url_request" and get rid of the old one
    + */
    +PurpleUtilFetchUrlData *purple_util_fetch_url_request_len_with_account(
    + PurpleAccount *account, const gchar *url,
    + gboolean full, const gchar *user_agent, gboolean http11,
    + const gchar *request, gboolean include_headers, gssize max_len,
    + PurpleUtilFetchUrlCallback callback, gpointer data);
    +
    +/**
    + * Fetches the data from a URL, and passes it to a callback function.
    + *
    + * @param account The account for which the request is needed, or NULL.
    + * @param url The URL.
    + * @param full TRUE if this is the full URL, or FALSE if it's a
    + * partial URL.
    + * @param user_agent The user agent field to use, or NULL.
    + * @param http11 TRUE if HTTP/1.1 should be used to download the file.
    + * @param request A HTTP request to send to the server instead of the
    + * standard GET
    + * @param request_len
    + * Then length of the request being sent
    + * @param include_headers
    + * If TRUE, include the HTTP headers in the response.
    + * @param max_len The maximum number of bytes to retrieve, or a negative
    + * number to use the default max of 512 KiB.
    + * @param callback The callback function.
    + * @param data The user data to pass to the callback function.
    + * @deprecated In 3.0.0, we'll rename this to "purple_util_fetch_url_request" and get rid of the old one
    + */
    +PurpleUtilFetchUrlData *
    +purple_util_fetch_url_request_data_len_with_account(PurpleAccount *account,
    + const char *url, gboolean full, const char *user_agent, gboolean http11,
    + const char *request, gsize request_len, gboolean include_headers, gssize max_len,
    + PurpleUtilFetchUrlCallback callback, void *user_data);
    +/**
    + * Cancel a pending URL request started with either
    + * purple_util_fetch_url_request() or purple_util_fetch_url().
    + *
    + * @param url_data The data returned when you initiated the URL fetch.
    + */
    +void purple_util_fetch_url_cancel(PurpleUtilFetchUrlData *url_data);
    +
    +/**
    + * Decodes a URL into a plain string.
    + *
    + * This will change hex codes and such to their ascii equivalents.
    + *
    + * @param str The string to translate.
    + *
    + * @return The resulting string.
    + */
    +const char *purple_url_decode(const char *str);
    +
    +/**
    + * Encodes a URL into an escaped string.
    + *
    + * This will change non-alphanumeric characters to hex codes.
    + *
    + * @param str The string to translate.
    + *
    + * @return The resulting string.
    + */
    +const char *purple_url_encode(const char *str);
    +
    +/**
    + * Checks if the given email address is syntactically valid.
    + *
    + * @param address The email address to validate.
    + *
    + * @return True if the email address is syntactically correct.
    + */
    +gboolean purple_email_is_valid(const char *address);
    +
    +/**
    + * Checks if the given IP address is a syntactically valid IPv4 address.
    + *
    + * @param ip The IP address to validate.
    + *
    + * @return True if the IP address is syntactically correct.
    + * @deprecated This function will be replaced with one that validates
    + * as either IPv4 or IPv6 in 3.0.0. If you don't want this,
    + * behavior, use one of the more specific functions.
    + */
    +gboolean purple_ip_address_is_valid(const char *ip);
    +
    +/**
    + * Checks if the given IP address is a syntactically valid IPv4 address.
    + *
    + * @param ip The IP address to validate.
    + *
    + * @return True if the IP address is syntactically correct.
    + * @since 2.6.0
    + */
    +gboolean purple_ipv4_address_is_valid(const char *ip);
    +
    +/**
    + * Checks if the given IP address is a syntactically valid IPv6 address.
    + *
    + * @param ip The IP address to validate.
    + *
    + * @return True if the IP address is syntactically correct.
    + * @since 2.6.0
    + */
    +gboolean purple_ipv6_address_is_valid(const char *ip);
    +
    +/**
    + * This function extracts a list of URIs from the a "text/uri-list"
    + * string. It was "borrowed" from gnome_uri_list_extract_uris
    + *
    + * @param uri_list An uri-list in the standard format.
    + *
    + * @return A GList containing strings allocated with g_malloc
    + * that have been splitted from uri-list.
    + */
    +GList *purple_uri_list_extract_uris(const gchar *uri_list);
    +
    +/**
    + * This function extracts a list of filenames from a
    + * "text/uri-list" string. It was "borrowed" from
    + * gnome_uri_list_extract_filenames
    + *
    + * @param uri_list A uri-list in the standard format.
    + *
    + * @return A GList containing strings allocated with g_malloc that
    + * contain the filenames in the uri-list. Note that unlike
    + * purple_uri_list_extract_uris() function, this will discard
    + * any non-file uri from the result value.
    + */
    +GList *purple_uri_list_extract_filenames(const gchar *uri_list);
    +
    +/*@}*/
    +
    +/**************************************************************************
    + * UTF8 String Functions
    + **************************************************************************/
    +/*@{*/
    +
    +/**
    + * Attempts to convert a string to UTF-8 from an unknown encoding.
    + *
    + * This function checks the locale and tries sane defaults.
    + *
    + * @param str The source string.
    + *
    + * @return The UTF-8 string, or @c NULL if it could not be converted.
    + */
    +gchar *purple_utf8_try_convert(const char *str);
    +
    +/**
    + * Salvages the valid UTF-8 characters from a string, replacing any
    + * invalid characters with a filler character (currently hardcoded to
    + * '?').
    + *
    + * @param str The source string.
    + *
    + * @return A valid UTF-8 string.
    + */
    +gchar *purple_utf8_salvage(const char *str);
    +
    +/**
    + * Removes unprintable characters from a UTF-8 string. These characters
    + * (in particular low-ASCII characters) are invalid in XML 1.0 and thus
    + * are not allowed in XMPP and are rejected by libxml2 by default.
    + *
    + * The returned string must be freed by the caller.
    + *
    + * @param str A valid UTF-8 string.
    + *
    + * @return A newly allocated UTF-8 string without the unprintable characters.
    + * @since 2.6.0
    + */
    +gchar *purple_utf8_strip_unprintables(const gchar *str);
    +
    +/**
    + * Return the UTF-8 version of gai_strerror(). It calls gai_strerror()
    + * then converts the result to UTF-8. This function is analogous to
    + * g_strerror().
    + *
    + * @param errnum The error code.
    + *
    + * @return The UTF-8 error message.
    + * @since 2.4.0
    + */
    +G_CONST_RETURN gchar *purple_gai_strerror(gint errnum);
    +
    +/**
    + * Compares two UTF-8 strings case-insensitively. This comparison is
    + * more expensive than a simple g_utf8_collate() comparison because
    + * it calls g_utf8_casefold() on each string, which allocates new
    + * strings.
    + *
    + * @param a The first string.
    + * @param b The second string.
    + *
    + * @return -1 if @a is less than @a b.
    + * 0 if @a is equal to @a b.
    + * 1 if @a is greater than @a b.
    + */
    +int purple_utf8_strcasecmp(const char *a, const char *b);
    +
    +/**
    + * Case insensitive search for a word in a string. The needle string
    + * must be contained in the haystack string and not be immediately
    + * preceded or immediately followed by another alpha-numeric character.
    + *
    + * @param haystack The string to search in.
    + * @param needle The substring to find.
    + *
    + * @return TRUE if haystack has the word, otherwise FALSE
    + */
    +gboolean purple_utf8_has_word(const char *haystack, const char *needle);
    +
    +/**
    + * Prints a UTF-8 message to the given file stream. The function
    + * tries to convert the UTF-8 message to user's locale. If this
    + * is not possible, the original UTF-8 text will be printed.
    + *
    + * @param filestream The file stream (e.g. STDOUT or STDERR)
    + * @param message The message to print.
    + */
    +void purple_print_utf8_to_console(FILE *filestream, char *message);
    +
    +/**
    + * Checks for messages starting (post-HTML) with "/me ", including the space.
    + *
    + * @param message The message to check
    + * @param len The message length, or -1
    + *
    + * @return TRUE if it starts with "/me ", and it has been removed, otherwise
    + * FALSE
    + */
    +gboolean purple_message_meify(char *message, gssize len);
    +
    +/**
    + * Removes the underscore characters from a string used identify the mnemonic
    + * character.
    + *
    + * @param in The string to strip
    + *
    + * @return The stripped string
    + */
    +char *purple_text_strip_mnemonic(const char *in);
    +
    +/*@}*/
    +
    +/**
    + * Adds 8 to something.
    + *
    + * Blame SimGuy.
    + *
    + * @param x The number to add 8 to.
    + *
    + * @return x + 8
    + */
    +#define purple_add_eight(x) ((x)+8)
    +
    +/**
    + * Does the reverse of purple_escape_filename
    + *
    + * This will change hex codes and such to their ascii equivalents.
    + *
    + * @param str The string to translate.
    + *
    + * @return The resulting string.
    + */
    +const char *purple_unescape_filename(const char *str);
    +
    +/**
    + * Escapes filesystem-unfriendly characters from a filename
    + *
    + * @param str The string to translate.
    + *
    + * @return The resulting string.
    + */
    +const char *purple_escape_filename(const char *str);
    +
    +/**
    + * This is added temporarily to assist the split of oscar into aim and icq.
    + * This should not be used by plugins.
    + *
    + * @deprecated This function should not be used in new code and should be
    + * removed in 3.0.0. The aim/icq prpl split happened a long
    + * time ago, and we don't need to keep migrating old data.
    + */
    +const char *_purple_oscar_convert(const char *act, const char *protocol);
    +
    +/**
    + * Restore default signal handlers for signals which might reasonably have
    + * handlers. This should be called by a fork()'d child process, since child processes
    + * inherit the handlers of the parent.
    + */
    +void purple_restore_default_signal_handlers(void);
    +
    +/**
    + * Gets the host name of the machine. If it not possible to determine the
    + * host name, "localhost" is returned
    + *
    + * @constreturn The hostname
    + */
    +const gchar *purple_get_host_name(void);
    +
    +/**
    + * Returns a type 4 (random) UUID
    + *
    + * @return A UUID, caller is responsible for freeing it
    + * @since 2.7.0
    + */
    +gchar *purple_uuid_random(void);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_UTIL_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/value.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,504 @@
    +/**
    + * @file value.h Value wrapper 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
    + */
    +#ifndef _PURPLE_VALUE_H_
    +#define _PURPLE_VALUE_H_
    +
    +#include <glib.h>
    +
    +/**
    + * Specific value types.
    + */
    +typedef enum
    +{
    + PURPLE_TYPE_UNKNOWN = 0, /**< Unknown type. */
    + PURPLE_TYPE_SUBTYPE, /**< Subtype. */
    + PURPLE_TYPE_CHAR, /**< Character. */
    + PURPLE_TYPE_UCHAR, /**< Unsigned character. */
    + PURPLE_TYPE_BOOLEAN, /**< Boolean. */
    + PURPLE_TYPE_SHORT, /**< Short integer. */
    + PURPLE_TYPE_USHORT, /**< Unsigned short integer. */
    + PURPLE_TYPE_INT, /**< Integer. */
    + PURPLE_TYPE_UINT, /**< Unsigned integer. */
    + PURPLE_TYPE_LONG, /**< Long integer. */
    + PURPLE_TYPE_ULONG, /**< Unsigned long integer. */
    + PURPLE_TYPE_INT64, /**< 64-bit integer. */
    + PURPLE_TYPE_UINT64, /**< 64-bit unsigned integer. */
    + PURPLE_TYPE_STRING, /**< String. */
    + PURPLE_TYPE_OBJECT, /**< Object pointer. */
    + PURPLE_TYPE_POINTER, /**< Generic pointer. */
    + PURPLE_TYPE_ENUM, /**< Enum. */
    + PURPLE_TYPE_BOXED /**< Boxed pointer with specific type. */
    +
    +} PurpleType;
    +
    +
    +/**
    + * Purple-specific subtype values.
    + */
    +typedef enum
    +{
    + PURPLE_SUBTYPE_UNKNOWN = 0,
    + PURPLE_SUBTYPE_ACCOUNT,
    + PURPLE_SUBTYPE_BLIST,
    + PURPLE_SUBTYPE_BLIST_BUDDY,
    + PURPLE_SUBTYPE_BLIST_GROUP,
    + PURPLE_SUBTYPE_BLIST_CHAT,
    + PURPLE_SUBTYPE_BUDDY_ICON,
    + PURPLE_SUBTYPE_CONNECTION,
    + PURPLE_SUBTYPE_CONVERSATION,
    + PURPLE_SUBTYPE_PLUGIN,
    + PURPLE_SUBTYPE_BLIST_NODE,
    + PURPLE_SUBTYPE_CIPHER,
    + PURPLE_SUBTYPE_STATUS,
    + PURPLE_SUBTYPE_LOG,
    + PURPLE_SUBTYPE_XFER,
    + PURPLE_SUBTYPE_SAVEDSTATUS,
    + PURPLE_SUBTYPE_XMLNODE,
    + PURPLE_SUBTYPE_USERINFO,
    + PURPLE_SUBTYPE_STORED_IMAGE,
    + PURPLE_SUBTYPE_CERTIFICATEPOOL,
    + PURPLE_SUBTYPE_CHATBUDDY
    +} PurpleSubType;
    +
    +/**
    + * A wrapper for a type, subtype, and specific type of value.
    + */
    +typedef struct
    +{
    + PurpleType type;
    + unsigned short flags;
    +
    + union
    + {
    + char char_data;
    + unsigned char uchar_data;
    + gboolean boolean_data;
    + short short_data;
    + unsigned short ushort_data;
    + int int_data;
    + unsigned int uint_data;
    + long long_data;
    + unsigned long ulong_data;
    + gint64 int64_data;
    + guint64 uint64_data;
    + char *string_data;
    + void *object_data;
    + void *pointer_data;
    + int enum_data;
    + void *boxed_data;
    +
    + } data;
    +
    + union
    + {
    + unsigned int subtype;
    + char *specific_type;
    +
    + } u;
    +
    +} PurpleValue;
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Creates a new PurpleValue.
    + *
    + * This function takes a type and, depending on that type, a sub-type
    + * or specific type.
    + *
    + * If @a type is PURPLE_TYPE_BOXED, the next parameter must be a
    + * string representing the specific type.
    + *
    + * If @a type is PURPLE_TYPE_SUBTYPE, the next parameter must be a
    + * integer or enum representing the sub-type.
    + *
    + * If the subtype or specific type is not set when required, random
    + * errors may occur. You have been warned.
    + *
    + * @param type The type.
    + *
    + * @return The new value.
    + */
    +PurpleValue *purple_value_new(PurpleType type, ...);
    +
    +/**
    + * Creates a new outgoing PurpleValue. If a value is an "outgoing" value
    + * it means the value can be modified by plugins and scripts.
    + *
    + * This function takes a type and, depending on that type, a sub-type
    + * or specific type.
    + *
    + * If @a type is PURPLE_TYPE_BOXED, the next parameter must be a
    + * string representing the specific type.
    + *
    + * If @a type is PURPLE_TYPE_SUBTYPE, the next parameter must be a
    + * integer or enum representing the sub-type.
    + *
    + * If the sub-type or specific type is not set when required, random
    + * errors may occur. You have been warned.
    + *
    + * @param type The type.
    + *
    + * @return The new value.
    + */
    +PurpleValue *purple_value_new_outgoing(PurpleType type, ...);
    +
    +/**
    + * Destroys a PurpleValue.
    + *
    + * @param value The value to destroy.
    + */
    +void purple_value_destroy(PurpleValue *value);
    +
    +/**
    + * Duplicated a PurpleValue.
    + *
    + * @param value The value to duplicate.
    + *
    + * @return The duplicate value.
    + */
    +PurpleValue *purple_value_dup(const PurpleValue *value);
    +
    +/**
    + * Returns a value's type.
    + *
    + * @param value The value whose type you want.
    + *
    + * @return The value's type.
    + */
    +PurpleType purple_value_get_type(const PurpleValue *value);
    +
    +/**
    + * Returns a value's subtype.
    + *
    + * If the value's type is not PURPLE_TYPE_SUBTYPE, this will return 0.
    + * Subtypes should never have a subtype of 0.
    + *
    + * @param value The value whose subtype you want.
    + *
    + * @return The value's subtype, or 0 if @a type is not PURPLE_TYPE_SUBTYPE.
    + */
    +unsigned int purple_value_get_subtype(const PurpleValue *value);
    +
    +/**
    + * Returns a value's specific type.
    + *
    + * If the value's type is not PURPLE_TYPE_BOXED, this will return @c NULL.
    + *
    + * @param value The value whose specific type you want.
    + *
    + * @return The value's specific type, or @a NULL if not PURPLE_TYPE_BOXED.
    + */
    +const char *purple_value_get_specific_type(const PurpleValue *value);
    +
    +/**
    + * Returns whether or not the value is an outgoing value.
    + *
    + * @param value The value.
    + *
    + * @return TRUE if the value is outgoing, or FALSE otherwise.
    + */
    +gboolean purple_value_is_outgoing(const PurpleValue *value);
    +
    +/**
    + * Sets the value's character data.
    + *
    + * @param value The value.
    + * @param data The character data.
    + */
    +void purple_value_set_char(PurpleValue *value, char data);
    +
    +/**
    + * Sets the value's unsigned character data.
    + *
    + * @param value The value.
    + * @param data The unsigned character data.
    + */
    +void purple_value_set_uchar(PurpleValue *value, unsigned char data);
    +
    +/**
    + * Sets the value's boolean data.
    + *
    + * @param value The value.
    + * @param data The boolean data.
    + */
    +void purple_value_set_boolean(PurpleValue *value, gboolean data);
    +
    +/**
    + * Sets the value's short integer data.
    + *
    + * @param value The value.
    + * @param data The short integer data.
    + */
    +void purple_value_set_short(PurpleValue *value, short data);
    +
    +/**
    + * Sets the value's unsigned short integer data.
    + *
    + * @param value The value.
    + * @param data The unsigned short integer data.
    + */
    +void purple_value_set_ushort(PurpleValue *value, unsigned short data);
    +
    +/**
    + * Sets the value's integer data.
    + *
    + * @param value The value.
    + * @param data The integer data.
    + */
    +void purple_value_set_int(PurpleValue *value, int data);
    +
    +/**
    + * Sets the value's unsigned integer data.
    + *
    + * @param value The value.
    + * @param data The unsigned integer data.
    + */
    +void purple_value_set_uint(PurpleValue *value, unsigned int data);
    +
    +/**
    + * Sets the value's long integer data.
    + *
    + * @param value The value.
    + * @param data The long integer data.
    + */
    +void purple_value_set_long(PurpleValue *value, long data);
    +
    +/**
    + * Sets the value's unsigned long integer data.
    + *
    + * @param value The value.
    + * @param data The unsigned long integer data.
    + */
    +void purple_value_set_ulong(PurpleValue *value, unsigned long data);
    +
    +/**
    + * Sets the value's 64-bit integer data.
    + *
    + * @param value The value.
    + * @param data The 64-bit integer data.
    + */
    +void purple_value_set_int64(PurpleValue *value, gint64 data);
    +
    +/**
    + * Sets the value's unsigned 64-bit integer data.
    + *
    + * @param value The value.
    + * @param data The unsigned 64-bit integer data.
    + */
    +void purple_value_set_uint64(PurpleValue *value, guint64 data);
    +
    +/**
    + * Sets the value's string data.
    + *
    + * @param value The value.
    + * @param data The string data.
    + */
    +void purple_value_set_string(PurpleValue *value, const char *data);
    +
    +/**
    + * Sets the value's object data.
    + *
    + * @param value The value.
    + * @param data The object data.
    + */
    +void purple_value_set_object(PurpleValue *value, void *data);
    +
    +/**
    + * Sets the value's pointer data.
    + *
    + * @param value The value.
    + * @param data The pointer data.
    + */
    +void purple_value_set_pointer(PurpleValue *value, void *data);
    +
    +/**
    + * Sets the value's enum data.
    + *
    + * @param value The value.
    + * @param data The enum data.
    + */
    +void purple_value_set_enum(PurpleValue *value, int data);
    +
    +/**
    + * Sets the value's boxed data.
    + *
    + * @param value The value.
    + * @param data The boxed data.
    + */
    +void purple_value_set_boxed(PurpleValue *value, void *data);
    +
    +/**
    + * Returns the value's character data.
    + *
    + * @param value The value.
    + *
    + * @return The character data.
    + */
    +char purple_value_get_char(const PurpleValue *value);
    +
    +/**
    + * Returns the value's unsigned character data.
    + *
    + * @param value The value.
    + *
    + * @return The unsigned character data.
    + */
    +unsigned char purple_value_get_uchar(const PurpleValue *value);
    +
    +/**
    + * Returns the value's boolean data.
    + *
    + * @param value The value.
    + *
    + * @return The boolean data.
    + */
    +gboolean purple_value_get_boolean(const PurpleValue *value);
    +
    +/**
    + * Returns the value's short integer data.
    + *
    + * @param value The value.
    + *
    + * @return The short integer data.
    + */
    +short purple_value_get_short(const PurpleValue *value);
    +
    +/**
    + * Returns the value's unsigned short integer data.
    + *
    + * @param value The value.
    + *
    + * @return The unsigned short integer data.
    + */
    +unsigned short purple_value_get_ushort(const PurpleValue *value);
    +
    +/**
    + * Returns the value's integer data.
    + *
    + * @param value The value.
    + *
    + * @return The integer data.
    + */
    +int purple_value_get_int(const PurpleValue *value);
    +
    +/**
    + * Returns the value's unsigned integer data.
    + *
    + * @param value The value.
    + *
    + * @return The unsigned integer data.
    + */
    +unsigned int purple_value_get_uint(const PurpleValue *value);
    +
    +/**
    + * Returns the value's long integer data.
    + *
    + * @param value The value.
    + *
    + * @return The long integer data.
    + */
    +long purple_value_get_long(const PurpleValue *value);
    +
    +/**
    + * Returns the value's unsigned long integer data.
    + *
    + * @param value The value.
    + *
    + * @return The unsigned long integer data.
    + */
    +unsigned long purple_value_get_ulong(const PurpleValue *value);
    +
    +/**
    + * Returns the value's 64-bit integer data.
    + *
    + * @param value The value.
    + *
    + * @return The 64-bit integer data.
    + */
    +gint64 purple_value_get_int64(const PurpleValue *value);
    +
    +/**
    + * Returns the value's unsigned 64-bit integer data.
    + *
    + * @param value The value.
    + *
    + * @return The unsigned 64-bit integer data.
    + */
    +guint64 purple_value_get_uint64(const PurpleValue *value);
    +
    +/**
    + * Returns the value's string data.
    + *
    + * @param value The value.
    + *
    + * @return The string data.
    + */
    +const char *purple_value_get_string(const PurpleValue *value);
    +
    +/**
    + * Returns the value's object data.
    + *
    + * @param value The value.
    + *
    + * @return The object data.
    + */
    +void *purple_value_get_object(const PurpleValue *value);
    +
    +/**
    + * Returns the value's pointer data.
    + *
    + * @param value The value.
    + *
    + * @return The pointer data.
    + */
    +void *purple_value_get_pointer(const PurpleValue *value);
    +
    +/**
    + * Returns the value's enum data.
    + *
    + * @param value The value.
    + *
    + * @return The enum data.
    + */
    +int purple_value_get_enum(const PurpleValue *value);
    +
    +/**
    + * Returns the value's boxed data.
    + *
    + * @param value The value.
    + *
    + * @return The boxed data.
    + */
    +void *purple_value_get_boxed(const PurpleValue *value);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_VALUE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/version.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,88 @@
    +/**
    + * @file version.h Purple Versioning
    + *
    + * 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
    + */
    +#ifndef _PURPLE_VERSION_H_
    +#define _PURPLE_VERSION_H_
    +
    +/** The major version of the running libpurple. */
    +#define PURPLE_MAJOR_VERSION (2)
    +/** The minor version of the running libpurple. */
    +#define PURPLE_MINOR_VERSION (12)
    +/** The micro version of the running libpurple. */
    +#define PURPLE_MICRO_VERSION (0)
    +
    +#define PURPLE_VERSION_CHECK(x,y,z) ((x) == PURPLE_MAJOR_VERSION && \
    + ((y) < PURPLE_MINOR_VERSION || \
    + ((y) == PURPLE_MINOR_VERSION && (z) <= PURPLE_MICRO_VERSION)))
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * Checks that the libpurple version is compatible with the requested
    + * version
    + *
    + * @param required_major: the required major version.
    + * @param required_minor: the required minor version.
    + * @param required_micro: the required micro version.
    + *
    + * @return NULL if the versions are compatible, or a string describing
    + * the version mismatch if not compatible.
    + */
    +const char *purple_version_check(guint required_major, guint required_minor, guint required_micro);
    +
    +/**
    + * The major version of the running libpurple. Contrast with
    + * #PURPLE_MAJOR_VERSION, which expands at compile time to the major version of
    + * libpurple being compiled against.
    + *
    + * @since 2.4.0
    + */
    +extern const guint purple_major_version;
    +
    +/**
    + * The minor version of the running libpurple. Contrast with
    + * #PURPLE_MINOR_VERSION, which expands at compile time to the minor version of
    + * libpurple being compiled against.
    + *
    + * @since 2.4.0
    + */
    +extern const guint purple_minor_version;
    +
    +/**
    + *
    + * The micro version of the running libpurple. Contrast with
    + * #PURPLE_MICRO_VERSION, which expands at compile time to the micro version of
    + * libpurple being compiled against.
    + *
    + * @since 2.4.0
    + */
    +extern const guint purple_micro_version;
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_VERSION_H_ */
    +
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/whiteboard.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,262 @@
    +/**
    + * @file whiteboard.h The PurpleWhiteboard core object
    + */
    +
    +/* 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
    + */
    +
    +#ifndef _PURPLE_WHITEBOARD_H_
    +#define _PURPLE_WHITEBOARD_H_
    +
    +/**
    + * Whiteboard PRPL Operations
    + */
    +typedef struct _PurpleWhiteboardPrplOps PurpleWhiteboardPrplOps;
    +
    +#include "account.h"
    +
    +/**
    + * A PurpleWhiteboard
    + */
    +typedef struct _PurpleWhiteboard
    +{
    + int state; /**< State of whiteboard session */
    +
    + PurpleAccount *account; /**< Account associated with this session */
    + char *who; /**< Name of the remote user */
    +
    + void *ui_data; /**< Graphical user-interface data */
    + void *proto_data; /**< Protocol specific data */
    + PurpleWhiteboardPrplOps *prpl_ops; /**< Protocol-plugin operations */
    +
    + GList *draw_list; /**< List of drawing elements/deltas to send */
    +} PurpleWhiteboard;
    +
    +/**
    + * The PurpleWhiteboard UI Operations
    + */
    +typedef struct _PurpleWhiteboardUiOps
    +{
    + void (*create)(PurpleWhiteboard *wb); /**< create function */
    + void (*destroy)(PurpleWhiteboard *wb); /**< destory function */
    + void (*set_dimensions)(PurpleWhiteboard *wb, int width, int height); /**< set_dimensions function */
    + void (*set_brush) (PurpleWhiteboard *wb, int size, int color); /**< set the size and color of the brush */
    + void (*draw_point)(PurpleWhiteboard *wb, int x, int y,
    + int color, int size); /**< draw_point function */
    + void (*draw_line)(PurpleWhiteboard *wb, int x1, int y1,
    + int x2, int y2,
    + int color, int size); /**< draw_line function */
    + void (*clear)(PurpleWhiteboard *wb); /**< clear function */
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +} PurpleWhiteboardUiOps;
    +
    +/**
    + * PurpleWhiteboard PRPL Operations
    + */
    +struct _PurpleWhiteboardPrplOps
    +{
    + void (*start)(PurpleWhiteboard *wb); /**< start function */
    + void (*end)(PurpleWhiteboard *wb); /**< end function */
    + void (*get_dimensions)(const PurpleWhiteboard *wb, int *width, int *height); /**< get_dimensions function */
    + void (*set_dimensions)(PurpleWhiteboard *wb, int width, int height); /**< set_dimensions function */
    + void (*get_brush) (const PurpleWhiteboard *wb, int *size, int *color); /**< get the brush size and color */
    + void (*set_brush) (PurpleWhiteboard *wb, int size, int color); /**< set the brush size and color */
    + void (*send_draw_list)(PurpleWhiteboard *wb, GList *draw_list); /**< send_draw_list function */
    + void (*clear)(PurpleWhiteboard *wb); /**< clear function */
    +
    + void (*_purple_reserved1)(void);
    + void (*_purple_reserved2)(void);
    + void (*_purple_reserved3)(void);
    + void (*_purple_reserved4)(void);
    +};
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif /* __cplusplus */
    +
    +/******************************************************************************/
    +/** @name PurpleWhiteboard API */
    +/******************************************************************************/
    +/*@{*/
    +
    +/**
    + * Sets the UI operations
    + *
    + * @param ops The UI operations to set
    + */
    +void purple_whiteboard_set_ui_ops(PurpleWhiteboardUiOps *ops);
    +
    +/**
    + * Sets the prpl operations for a whiteboard
    + *
    + * @param wb The whiteboard for which to set the prpl operations
    + * @param ops The prpl operations to set
    + */
    +void purple_whiteboard_set_prpl_ops(PurpleWhiteboard *wb, PurpleWhiteboardPrplOps *ops);
    +
    +/**
    + * Creates a whiteboard
    + *
    + * @param account The account.
    + * @param who Who you're drawing with.
    + * @param state The state.
    + *
    + * @return The new whiteboard
    + */
    +PurpleWhiteboard *purple_whiteboard_create(PurpleAccount *account, const char *who, int state);
    +
    +/**
    + * Destroys a whiteboard
    + *
    + * @param wb The whiteboard.
    + */
    +void purple_whiteboard_destroy(PurpleWhiteboard *wb);
    +
    +/**
    + * Starts a whiteboard
    + *
    + * @param wb The whiteboard.
    + */
    +void purple_whiteboard_start(PurpleWhiteboard *wb);
    +
    +/**
    + * Finds a whiteboard from an account and user.
    + *
    + * @param account The account.
    + * @param who The user.
    + *
    + * @return The whiteboard if found, otherwise @c NULL.
    + */
    +PurpleWhiteboard *purple_whiteboard_get_session(const PurpleAccount *account, const char *who);
    +
    +/**
    + * Destorys a drawing list for a whiteboard
    + *
    + * @param draw_list The drawing list.
    + */
    +void purple_whiteboard_draw_list_destroy(GList *draw_list);
    +
    +/**
    + * Gets the dimension of a whiteboard.
    + *
    + * @param wb The whiteboard.
    + * @param width The width to be set.
    + * @param height The height to be set.
    + *
    + * @return TRUE if the values of width and height were set.
    + */
    +gboolean purple_whiteboard_get_dimensions(const PurpleWhiteboard *wb, int *width, int *height);
    +
    +/**
    + * Sets the dimensions for a whiteboard.
    + *
    + * @param wb The whiteboard.
    + * @param width The width.
    + * @param height The height.
    + */
    +void purple_whiteboard_set_dimensions(PurpleWhiteboard *wb, int width, int height);
    +
    +/**
    + * Draws a point on a whiteboard.
    + *
    + * @param wb The whiteboard.
    + * @param x The x coordinate.
    + * @param y The y coordinate.
    + * @param color The color to use.
    + * @param size The brush size.
    + */
    +void purple_whiteboard_draw_point(PurpleWhiteboard *wb, int x, int y, int color, int size);
    +
    +/**
    + * Send a list of points to draw to the buddy.
    + *
    + * @param wb The whiteboard
    + * @param list A GList of points
    + */
    +void purple_whiteboard_send_draw_list(PurpleWhiteboard *wb, GList *list);
    +
    +/**
    + * Draws a line on a whiteboard
    + *
    + * @param wb The whiteboard.
    + * @param x1 The top-left x coordinate.
    + * @param y1 The top-left y coordinate.
    + * @param x2 The bottom-right x coordinate.
    + * @param y2 The bottom-right y coordinate.
    + * @param color The color to use.
    + * @param size The brush size.
    + */
    +void purple_whiteboard_draw_line(PurpleWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size);
    +
    +/**
    + * Clears a whiteboard
    + *
    + * @param wb The whiteboard.
    + */
    +void purple_whiteboard_clear(PurpleWhiteboard *wb);
    +
    +/**
    + * Sends a request to the buddy to clear the whiteboard.
    + *
    + * @param wb The whiteboard
    + */
    +void purple_whiteboard_send_clear(PurpleWhiteboard *wb);
    +
    +/**
    + * Sends a request to change the size and color of the brush.
    + *
    + * @param wb The whiteboard
    + * @param size The size of the brush
    + * @param color The color of the brush
    + */
    +void purple_whiteboard_send_brush(PurpleWhiteboard *wb, int size, int color);
    +
    +/**
    + * Gets the size and color of the brush.
    + *
    + * @param wb The whiteboard
    + * @param size The size of the brush
    + * @param color The color of the brush
    + *
    + * @return TRUE if the size and color were set.
    + */
    +gboolean purple_whiteboard_get_brush(const PurpleWhiteboard *wb, int *size, int *color);
    +
    +/**
    + * Sets the size and color of the brush.
    + *
    + * @param wb The whiteboard
    + * @param size The size of the brush
    + * @param color The color of the brush
    + */
    +void purple_whiteboard_set_brush(PurpleWhiteboard *wb, int size, int color);
    +
    +/*@}*/
    +
    +#ifdef __cplusplus
    +}
    +#endif /* __cplusplus */
    +
    +#endif /* _PURPLE_WHITEBOARD_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Headers/xmlnode.h Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,397 @@
    +/**
    + * @file xmlnode.h XML DOM functions
    + * @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
    + */
    +#ifndef _PURPLE_XMLNODE_H_
    +#define _PURPLE_XMLNODE_H_
    +
    +#include <glib.h>
    +
    +#ifdef __cplusplus
    +extern "C" {
    +#endif
    +
    +/**
    + * The valid types for an xmlnode
    + */
    +typedef enum _XMLNodeType
    +{
    + XMLNODE_TYPE_TAG, /**< Just a tag */
    + XMLNODE_TYPE_ATTRIB, /**< Has attributes */
    + XMLNODE_TYPE_DATA /**< Has data */
    +} XMLNodeType;
    +
    +/**
    + * An xmlnode.
    + */
    +typedef struct _xmlnode xmlnode;
    +struct _xmlnode
    +{
    + char *name; /**< The name of the node. */
    + char *xmlns; /**< The namespace of the node */
    + XMLNodeType type; /**< The type of the node. */
    + char *data; /**< The data for the node. */
    + size_t data_sz; /**< The size of the data. */
    + xmlnode *parent; /**< The parent node or @c NULL.*/
    + xmlnode *child; /**< The child node or @c NULL.*/
    + xmlnode *lastchild; /**< The last child node or @c NULL.*/
    + xmlnode *next; /**< The next node or @c NULL. */
    + char *prefix; /**< The namespace prefix if any. */
    + GHashTable *namespace_map; /**< The namespace map. */
    +};
    +
    +/**
    + * Creates a new xmlnode.
    + *
    + * @param name The name of the node.
    + *
    + * @return The new node.
    + */
    +xmlnode *xmlnode_new(const char *name);
    +
    +/**
    + * Creates a new xmlnode child.
    + *
    + * @param parent The parent node.
    + * @param name The name of the child node.
    + *
    + * @return The new child node.
    + */
    +xmlnode *xmlnode_new_child(xmlnode *parent, const char *name);
    +
    +/**
    + * Inserts a node into a node as a child.
    + *
    + * @param parent The parent node to insert child into.
    + * @param child The child node to insert into parent.
    + */
    +void xmlnode_insert_child(xmlnode *parent, xmlnode *child);
    +
    +/**
    + * Gets a child node named name.
    + *
    + * @param parent The parent node.
    + * @param name The child's name.
    + *
    + * @return The child or NULL.
    + */
    +xmlnode *xmlnode_get_child(const xmlnode *parent, const char *name);
    +
    +/**
    + * Gets a child node named name in a namespace.
    + *
    + * @param parent The parent node.
    + * @param name The child's name.
    + * @param xmlns The namespace.
    + *
    + * @return The child or NULL.
    + */
    +xmlnode *xmlnode_get_child_with_namespace(const xmlnode *parent, const char *name, const char *xmlns);
    +
    +/**
    + * Gets the next node with the same name as node.
    + *
    + * @param node The node of a twin to find.
    + *
    + * @return The twin of node or NULL.
    + */
    +xmlnode *xmlnode_get_next_twin(xmlnode *node);
    +
    +/**
    + * Inserts data into a node.
    + *
    + * @param node The node to insert data into.
    + * @param data The data to insert.
    + * @param size The size of the data to insert. If data is
    + * null-terminated you can pass in -1.
    + */
    +void xmlnode_insert_data(xmlnode *node, const char *data, gssize size);
    +
    +/**
    + * Gets (escaped) data from a node.
    + *
    + * @param node The node to get data from.
    + *
    + * @return The data from the node or NULL. This data is in raw escaped format.
    + * You must g_free this string when finished using it.
    + */
    +char *xmlnode_get_data(const xmlnode *node);
    +
    +/**
    + * Gets unescaped data from a node.
    + *
    + * @param node The node to get data from.
    + *
    + * @return The data from the node, in unescaped form. You must g_free
    + * this string when finished using it.
    + */
    +char *xmlnode_get_data_unescaped(const xmlnode *node);
    +
    +/**
    + * Sets an attribute for a node.
    + *
    + * @param node The node to set an attribute for.
    + * @param attr The name of the attribute.
    + * @param value The value of the attribute.
    + */
    +void xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value);
    +
    +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_XMLNODE_C_)
    +/**
    + * Sets a prefixed attribute for a node
    + *
    + * @param node The node to set an attribute for.
    + * @param attr The name of the attribute to set
    + * @param prefix The prefix of the attribute to ste
    + * @param value The value of the attribute
    + *
    + * @deprecated Use xmlnode_set_attrib_full instead.
    + */
    +void xmlnode_set_attrib_with_prefix(xmlnode *node, const char *attr, const char *prefix, const char *value);
    +
    +/**
    + * Sets a namespaced attribute for a node
    + *
    + * @param node The node to set an attribute for.
    + * @param attr The name of the attribute to set
    + * @param xmlns The namespace of the attribute to ste
    + * @param value The value of the attribute
    + *
    + * @deprecated Use xmlnode_set_attrib_full instead.
    + */
    +void xmlnode_set_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns, const char *value);
    +#endif /* PURPLE_DISABLE_DEPRECATED */
    +
    +/**
    + * Sets a namespaced attribute for a node
    + *
    + * @param node The node to set an attribute for.
    + * @param attr The name of the attribute to set
    + * @param xmlns The namespace of the attribute to ste
    + * @param prefix The prefix of the attribute to ste
    + * @param value The value of the attribute
    + *
    + * @since 2.6.0
    + */
    +void xmlnode_set_attrib_full(xmlnode *node, const char *attr, const char *xmlns,
    + const char *prefix, const char *value);
    +
    +/**
    + * Gets an attribute from a node.
    + *
    + * @param node The node to get an attribute from.
    + * @param attr The attribute to get.
    + *
    + * @return The value of the attribute.
    + */
    +const char *xmlnode_get_attrib(const xmlnode *node, const char *attr);
    +
    +/**
    + * Gets a namespaced attribute from a node
    + *
    + * @param node The node to get an attribute from.
    + * @param attr The attribute to get
    + * @param xmlns The namespace of the attribute to get
    + *
    + * @return The value of the attribute/
    + */
    +const char *xmlnode_get_attrib_with_namespace(const xmlnode *node, const char *attr, const char *xmlns);
    +
    +/**
    + * Removes an attribute from a node.
    + *
    + * @param node The node to remove an attribute from.
    + * @param attr The attribute to remove.
    + */
    +void xmlnode_remove_attrib(xmlnode *node, const char *attr);
    +
    +/**
    + * Removes a namespaced attribute from a node
    + *
    + * @param node The node to remove an attribute from
    + * @param attr The attribute to remove
    + * @param xmlns The namespace of the attribute to remove
    + */
    +void xmlnode_remove_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns);
    +
    +/**
    + * Sets the namespace of a node
    + *
    + * @param node The node to qualify
    + * @param xmlns The namespace of the node
    + */
    +void xmlnode_set_namespace(xmlnode *node, const char *xmlns);
    +
    +/**
    + * Returns the namespace of a node
    + *
    + * @param node The node to get the namepsace from
    + * @return The namespace of this node
    + */
    +const char *xmlnode_get_namespace(const xmlnode *node);
    +
    +/**
    + * Returns the current default namespace. The default
    + * namespace is the current namespace which applies to child
    + * elements which are unprefixed and which do not contain their
    + * own namespace.
    + *
    + * For example, given:
    + * <iq type='get' xmlns='jabber:client' xmlns:ns1='http://example.org/ns1'>
    + * <ns1:element><child1/></ns1:element>
    + * </iq>
    + *
    + * The default namespace of all nodes (including 'child1') is "jabber:client",
    + * though the namespace for 'element' is "http://example.org/ns1".
    + *
    + * @param node The node for which to return the default namespace
    + * @return The default namespace of this node
    + */
    +const char *xmlnode_get_default_namespace(const xmlnode *node);
    +
    +/**
    + * Returns the defined namespace for a prefix.
    + *
    + * @param node The node from which to start the search.
    + * @param prefix The prefix for which to return the associated namespace.
    + * @return The namespace for this prefix.
    + */
    +const char *xmlnode_get_prefix_namespace(const xmlnode *node, const char *prefix);
    +
    +/**
    + * Sets the prefix of a node
    + *
    + * @param node The node to qualify
    + * @param prefix The prefix of the node
    + */
    +void xmlnode_set_prefix(xmlnode *node, const char *prefix);
    +
    +/**
    + * Returns the prefix of a node
    + *
    + * @param node The node to get the prefix from
    + * @return The prefix of this node
    + */
    +const char *xmlnode_get_prefix(const xmlnode *node);
    +
    +/**
    + * Remove all element prefixes from an xmlnode tree. The prefix's
    + * namespace is transformed into the default namespace for an element.
    + *
    + * Note that this will not necessarily remove all prefixes in use
    + * (prefixed attributes may still exist), and that this usage may
    + * break some applications (SOAP / XPath apparently often rely on
    + * the prefixes having the same name.
    + *
    + * @param node The node from which to strip prefixes
    + */
    +void xmlnode_strip_prefixes(xmlnode *node);
    +
    +/**
    + * Gets the parent node.
    + *
    + * @param child The child node.
    + *
    + * @return The parent or NULL.
    + *
    + * @since 2.6.0
    + */
    +xmlnode *xmlnode_get_parent(const xmlnode *child);
    +
    +/**
    + * Returns the node in a string of xml.
    + *
    + * @param node The starting node to output.
    + * @param len Address for the size of the string.
    + *
    + * @return The node represented as a string. You must
    + * g_free this string when finished using it.
    + */
    +char *xmlnode_to_str(const xmlnode *node, int *len);
    +
    +/**
    + * Returns the node in a string of human readable xml.
    + *
    + * @param node The starting node to output.
    + * @param len Address for the size of the string.
    + *
    + * @return The node as human readable string including
    + * tab and new line characters. You must
    + * g_free this string when finished using it.
    + */
    +char *xmlnode_to_formatted_str(const xmlnode *node, int *len);
    +
    +/**
    + * Creates a node from a string of XML. Calling this on the
    + * root node of an XML document will parse the entire document
    + * into a tree of nodes, and return the xmlnode of the root.
    + *
    + * @param str The string of xml.
    + * @param size The size of the string, or -1 if @a str is
    + * NUL-terminated.
    + *
    + * @return The new node.
    + */
    +xmlnode *xmlnode_from_str(const char *str, gssize size);
    +
    +/**
    + * Creates a new node from the source node.
    + *
    + * @param src The node to copy.
    + *
    + * @return A new copy of the src node.
    + */
    +xmlnode *xmlnode_copy(const xmlnode *src);
    +
    +/**
    + * Frees a node and all of its children.
    + *
    + * @param node The node to free.
    + */
    +void xmlnode_free(xmlnode *node);
    +
    +/**
    + * Creates a node from a XML File. Calling this on the
    + * root node of an XML document will parse the entire document
    + * into a tree of nodes, and return the xmlnode of the root.
    + *
    + * @param dir The directory where the file is located
    + * @param filename The filename
    + * @param description A description of the file being parsed. Displayed to
    + * the user if the file cannot be read.
    + * @param process The subsystem that is calling xmlnode_from_file. Used as
    + * the category for debugging.
    + *
    + * @return The new node or NULL if an error occurred.
    + *
    + * @since 2.6.0
    + */
    +xmlnode *xmlnode_from_file(const char *dir, const char *filename,
    + const char *description, const char *process);
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif /* _PURPLE_XMLNODE_H_ */
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/English.lproj/InfoPlist.strings Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,3 @@
    +/* Localized versions of Info.plist keys */
    +
    +CFBundleName = "libpurple";
    --- /dev/null Thu Jan 01 00:00:00 1970 +0000
    +++ b/Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/Info.plist Tue Mar 21 20:37:34 2017 +0100
    @@ -0,0 +1,18 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    +<plist version="1.0">
    +<dict>
    + <key>CFBundleDevelopmentRegion</key>
    + <string>English</string>
    + <key>CFBundleInfoDictionaryVersion</key>
    + <string>6.0</string>
    + <key>CFBundlePackageType</key>
    + <string>FMWK</string>
    + <key>CFBundleSignature</key>
    + <string>????</string>
    + <key>CFBundleVersion</key>
    + <string>0.0.1d1</string>
    + <key>CFBundleIdentifier</key>
    + <string>im.pidgin.libpurple</string>
    +</dict>
    +</plist>
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/as/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ast/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/bn_IN/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/br/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/brx/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ca/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/cs/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/da/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/de/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/el/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_AU/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_CA/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/en_GB/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/es/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/es_AR/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/fi/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/fr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/hr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/hu/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/it/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ja/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/kk/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ks/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ku_IQ/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/lv/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mai/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mhr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ml/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/mr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/nb/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/nl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pt/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/pt_BR/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/ru/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sd/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sl/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/sv/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/tr/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/tt/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/uk/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/uz/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/zh_CN/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/Resources/zh_TW/LC_MESSAGES/pidgin.mo has changed
    Binary file Frameworks/libpurple.framework/Versions/2.12.0r11b8084bcff4/libpurple has changed
    --- a/Frameworks/libpurple.framework/Versions/Current Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libpurple.framework/Versions/Current Tue Mar 21 20:37:34 2017 +0100
    @@ -1,1 +1,1 @@
    -2.10.12r8d2874a79747
    \ No newline at end of file
    +2.12.0r11b8084bcff4
    \ No newline at end of file
    --- a/Frameworks/libpurple.framework/libpurple Tue Mar 21 20:36:54 2017 +0100
    +++ b/Frameworks/libpurple.framework/libpurple Tue Mar 21 20:37:34 2017 +0100
    @@ -1,1 +1,1 @@
    -Versions/2.10.12r8d2874a79747/libpurple
    \ No newline at end of file
    +Versions/2.12.0r11b8084bcff4/libpurple
    \ No newline at end of file