From 9d20827c4609baa8b135212ed58c59ce92c2d549 Mon Sep 17 00:00:00 2001 From: synzr Date: Thu, 25 Dec 2025 01:37:49 +0500 Subject: [PATCH] initial commit --- .darcs_binaries | 41 + .darcs_boring | 140 + .gitignore | 42 + COPYING | 55 + INSTALL | 35 + README | 21 + admin/bundle_qca.sh | 26 + admin/legoptx.txt | 154 + admin/prune.sh | 8 + admin/update_iconsets.sh | 47 + admin/update_options_ts.py | 27 + certs/README | 11 + certs/rootcerts.pem | 29 + certs/startcom_ca.crt | 30 + conf_windows.pri | 31 + configure | 2303 ++++ crashreporter/.gitignore | 12 + crashreporter/crashreporter.cpp | 294 + crashreporter/crashreporter.pro | 33 + crashreporter/crashreporter.ui | 59 + crashreporter/mailmsg/mailmsg.pri | 7 + crashreporter/mailmsg/mailmsg_windows.cpp | 124 + crashreporter/mailmsg/mailmsg_windows.h | 31 + doc/Doxyfile.private | 288 + doc/Doxyfile.public | 288 + doc/build-mac.txt | 22 + doc/build-unix.txt | 75 + doc/build-win.txt | 79 + dsa_pub.pem | 20 + iconsets.qrc | 160 + iconsets/emoticons/default/angry.png | Bin 0 -> 679 bytes iconsets/emoticons/default/bat.png | Bin 0 -> 678 bytes iconsets/emoticons/default/beer.png | Bin 0 -> 695 bytes iconsets/emoticons/default/biggrin.png | Bin 0 -> 708 bytes iconsets/emoticons/default/blush.png | Bin 0 -> 657 bytes iconsets/emoticons/default/boy.png | Bin 0 -> 678 bytes iconsets/emoticons/default/brflower.png | Bin 0 -> 701 bytes iconsets/emoticons/default/brheart.png | Bin 0 -> 720 bytes iconsets/emoticons/default/coffee.png | Bin 0 -> 872 bytes iconsets/emoticons/default/coolglasses.png | Bin 0 -> 624 bytes iconsets/emoticons/default/cry.png | Bin 0 -> 779 bytes iconsets/emoticons/default/cuffs.png | Bin 0 -> 714 bytes iconsets/emoticons/default/devil.png | Bin 0 -> 684 bytes iconsets/emoticons/default/drink.png | Bin 0 -> 673 bytes iconsets/emoticons/default/flower.png | Bin 0 -> 681 bytes iconsets/emoticons/default/frowning.png | Bin 0 -> 944 bytes iconsets/emoticons/default/girl.png | Bin 0 -> 689 bytes iconsets/emoticons/default/heart.png | Bin 0 -> 627 bytes iconsets/emoticons/default/hugleft.png | Bin 0 -> 749 bytes iconsets/emoticons/default/hugright.png | Bin 0 -> 712 bytes iconsets/emoticons/default/icondef.xml | 280 + iconsets/emoticons/default/kiss.png | Bin 0 -> 681 bytes iconsets/emoticons/default/lamp.png | Bin 0 -> 768 bytes iconsets/emoticons/default/mail.png | Bin 0 -> 899 bytes iconsets/emoticons/default/music.png | Bin 0 -> 794 bytes iconsets/emoticons/default/no.png | Bin 0 -> 689 bytes iconsets/emoticons/default/oh.png | Bin 0 -> 780 bytes iconsets/emoticons/default/phone.png | Bin 0 -> 580 bytes iconsets/emoticons/default/photo.png | Bin 0 -> 757 bytes iconsets/emoticons/default/pussy.png | Bin 0 -> 753 bytes iconsets/emoticons/default/rainbow.png | Bin 0 -> 832 bytes iconsets/emoticons/default/smile.png | Bin 0 -> 770 bytes iconsets/emoticons/default/star.png | Bin 0 -> 715 bytes iconsets/emoticons/default/stare.png | Bin 0 -> 766 bytes iconsets/emoticons/default/tongue.png | Bin 0 -> 609 bytes iconsets/emoticons/default/unhappy.png | Bin 0 -> 825 bytes iconsets/emoticons/default/wink.png | Bin 0 -> 766 bytes iconsets/emoticons/default/yes.png | Bin 0 -> 693 bytes iconsets/roster/README | 36 + iconsets/roster/crystal-aim.jisp | Bin 0 -> 10310 bytes iconsets/roster/crystal-gadu.jisp | Bin 0 -> 11335 bytes iconsets/roster/crystal-icq.jisp | Bin 0 -> 11312 bytes iconsets/roster/crystal-msn.jisp | Bin 0 -> 10376 bytes iconsets/roster/crystal-roster.jisp | Bin 0 -> 44279 bytes iconsets/roster/crystal-service.jisp | Bin 0 -> 10465 bytes iconsets/roster/crystal-sms.jisp | Bin 0 -> 10874 bytes iconsets/roster/crystal-yahoo.jisp | Bin 0 -> 9705 bytes iconsets/roster/default/ask.png | Bin 0 -> 954 bytes iconsets/roster/default/away.png | Bin 0 -> 928 bytes iconsets/roster/default/chat.fading.png | Bin 0 -> 9310 bytes iconsets/roster/default/chatty.png | Bin 0 -> 933 bytes iconsets/roster/default/dnd.png | Bin 0 -> 894 bytes iconsets/roster/default/file.fading.png | Bin 0 -> 11822 bytes iconsets/roster/default/groupclose.png | Bin 0 -> 266 bytes iconsets/roster/default/groupopen.png | Bin 0 -> 348 bytes iconsets/roster/default/headline.png | Bin 0 -> 833 bytes iconsets/roster/default/icondef.xml | 117 + iconsets/roster/default/invisible.png | Bin 0 -> 932 bytes iconsets/roster/default/message.fading.png | Bin 0 -> 12843 bytes iconsets/roster/default/noauth.png | Bin 0 -> 954 bytes iconsets/roster/default/offline.png | Bin 0 -> 866 bytes iconsets/roster/default/online.dimming.png | Bin 0 -> 11917 bytes iconsets/roster/default/online.png | Bin 0 -> 986 bytes iconsets/roster/default/perr.png | Bin 0 -> 792 bytes iconsets/roster/default/system.png | Bin 0 -> 571 bytes iconsets/roster/default/xa.png | Bin 0 -> 953 bytes iconsets/system/README | 79 + iconsets/system/default/account.png | Bin 0 -> 969 bytes iconsets/system/default/add.png | Bin 0 -> 1285 bytes iconsets/system/default/advanced.png | Bin 0 -> 603 bytes iconsets/system/default/appearance.png | Bin 0 -> 900 bytes iconsets/system/default/arrow_down.png | Bin 0 -> 742 bytes iconsets/system/default/arrow_left.png | Bin 0 -> 707 bytes iconsets/system/default/arrow_right.png | Bin 0 -> 710 bytes iconsets/system/default/arrow_up.png | Bin 0 -> 728 bytes iconsets/system/default/browse.png | Bin 0 -> 1080 bytes iconsets/system/default/cancel.png | Bin 0 -> 665 bytes iconsets/system/default/changeacc.png | Bin 0 -> 782 bytes iconsets/system/default/chatclear.png | Bin 0 -> 141 bytes iconsets/system/default/close.png | Bin 0 -> 891 bytes iconsets/system/default/closetab.png | Bin 0 -> 529 bytes iconsets/system/default/command.png | Bin 0 -> 796 bytes iconsets/system/default/configure-room.png | Bin 0 -> 1055 bytes .../system/default/configure_toolbars.png | Bin 0 -> 1017 bytes iconsets/system/default/disco.png | Bin 0 -> 911 bytes iconsets/system/default/download.png | Bin 0 -> 532 bytes iconsets/system/default/events.png | Bin 0 -> 571 bytes iconsets/system/default/eye_blue.png | Bin 0 -> 708 bytes iconsets/system/default/filemanager.png | Bin 0 -> 838 bytes iconsets/system/default/groupchat.png | Bin 0 -> 1059 bytes iconsets/system/default/help.png | Bin 0 -> 698 bytes iconsets/system/default/history.png | Bin 0 -> 1111 bytes iconsets/system/default/icondef.xml | 486 + iconsets/system/default/info.png | Bin 0 -> 855 bytes iconsets/system/default/jabber.png | Bin 0 -> 742 bytes iconsets/system/default/key.png | Bin 0 -> 693 bytes iconsets/system/default/key_bad.png | Bin 0 -> 871 bytes iconsets/system/default/key_unknown.png | Bin 0 -> 826 bytes iconsets/system/default/logo_128.png | Bin 0 -> 8640 bytes iconsets/system/default/logo_16.png | Bin 0 -> 835 bytes iconsets/system/default/logo_24.png | Bin 0 -> 1364 bytes iconsets/system/default/logo_256.png | Bin 0 -> 20197 bytes iconsets/system/default/logo_32.png | Bin 0 -> 1919 bytes iconsets/system/default/logo_48.png | Bin 0 -> 2886 bytes iconsets/system/default/logo_64.png | Bin 0 -> 3867 bytes iconsets/system/default/logo_96.png | Bin 0 -> 8524 bytes iconsets/system/default/ok.png | Bin 0 -> 518 bytes iconsets/system/default/options.png | Bin 0 -> 900 bytes iconsets/system/default/pgp.png | Bin 0 -> 558 bytes iconsets/system/default/play.png | Bin 0 -> 757 bytes iconsets/system/default/play_sounds.png | Bin 0 -> 778 bytes iconsets/system/default/psilogo.png | Bin 0 -> 1513 bytes iconsets/system/default/psimain.png | Bin 0 -> 1067 bytes iconsets/system/default/publish_tune.png | Bin 0 -> 988 bytes iconsets/system/default/quit.png | Bin 0 -> 863 bytes iconsets/system/default/register.png | Bin 0 -> 562 bytes iconsets/system/default/reload.png | Bin 0 -> 832 bytes iconsets/system/default/remove.png | Bin 0 -> 699 bytes iconsets/system/default/search.png | Bin 0 -> 1025 bytes iconsets/system/default/self.png | Bin 0 -> 768 bytes iconsets/system/default/send.png | Bin 0 -> 688 bytes iconsets/system/default/shortcuts.png | Bin 0 -> 661 bytes iconsets/system/default/show_away.png | Bin 0 -> 928 bytes iconsets/system/default/show_hidden.png | Bin 0 -> 1002 bytes iconsets/system/default/show_offline.png | Bin 0 -> 866 bytes iconsets/system/default/smile.png | Bin 0 -> 869 bytes iconsets/system/default/ssl_no.png | Bin 0 -> 460 bytes iconsets/system/default/ssl_yes.png | Bin 0 -> 749 bytes iconsets/system/default/start-chat.png | Bin 0 -> 533 bytes iconsets/system/default/status.png | Bin 0 -> 669 bytes iconsets/system/default/stop.png | Bin 0 -> 741 bytes iconsets/system/default/time.png | Bin 0 -> 960 bytes iconsets/system/default/tip.png | Bin 0 -> 588 bytes iconsets/system/default/upload.png | Bin 0 -> 528 bytes iconsets/system/default/url.png | Bin 0 -> 1069 bytes iconsets/system/default/vcard.png | Bin 0 -> 468 bytes .../default/whiteboarding/add_image.png | Bin 0 -> 653 bytes .../system/default/whiteboarding/add_text.png | Bin 0 -> 567 bytes .../default/whiteboarding/bring_forwards.png | Bin 0 -> 597 bytes .../default/whiteboarding/bring_to_front.png | Bin 0 -> 597 bytes .../default/whiteboarding/draw_circles.png | Bin 0 -> 781 bytes .../default/whiteboarding/draw_ellipses.png | Bin 0 -> 781 bytes .../default/whiteboarding/draw_lines.png | Bin 0 -> 450 bytes .../default/whiteboarding/draw_paths.png | Bin 0 -> 450 bytes .../default/whiteboarding/draw_rectangles.png | Bin 0 -> 443 bytes .../system/default/whiteboarding/erase.png | Bin 0 -> 141 bytes .../system/default/whiteboarding/group.png | Bin 0 -> 343 bytes .../system/default/whiteboarding/rotate.png | Bin 0 -> 1041 bytes .../system/default/whiteboarding/scale.png | Bin 0 -> 371 bytes .../system/default/whiteboarding/scroll.png | Bin 0 -> 750 bytes .../system/default/whiteboarding/select.png | Bin 0 -> 354 bytes .../default/whiteboarding/send_backwards.png | Bin 0 -> 597 bytes .../default/whiteboarding/send_to_back.png | Bin 0 -> 597 bytes .../default/whiteboarding/translate.png | Bin 0 -> 665 bytes .../system/default/whiteboarding/ungroup.png | Bin 0 -> 600 bytes .../default/whiteboarding/whiteboard.png | Bin 0 -> 703 bytes iconsets/system/default/xml.png | Bin 0 -> 796 bytes iris-legacy/cutestuff/cutestuff.pri | 32 + iris-legacy/cutestuff/legacy/ndns.cpp | 393 + iris-legacy/cutestuff/legacy/ndns.h | 90 + iris-legacy/cutestuff/legacy/safedelete.cpp | 111 + iris-legacy/cutestuff/legacy/safedelete.h | 60 + iris-legacy/cutestuff/legacy/servsock.cpp | 111 + iris-legacy/cutestuff/legacy/servsock.h | 68 + iris-legacy/cutestuff/legacy/srvresolver.cpp | 313 + iris-legacy/cutestuff/legacy/srvresolver.h | 66 + iris-legacy/cutestuff/network/bsocket.cpp | 474 + iris-legacy/cutestuff/network/bsocket.h | 90 + iris-legacy/cutestuff/network/httpconnect.cpp | 363 + iris-legacy/cutestuff/network/httpconnect.h | 67 + iris-legacy/cutestuff/network/httppoll.cpp | 666 + iris-legacy/cutestuff/network/httppoll.h | 104 + iris-legacy/cutestuff/network/socks.cpp | 1231 ++ iris-legacy/cutestuff/network/socks.h | 160 + iris-legacy/cutestuff/util/bytestream.cpp | 269 + iris-legacy/cutestuff/util/bytestream.h | 78 + iris-legacy/iris/COPYING | 504 + iris-legacy/iris/TODO | 18 + iris-legacy/iris/example/conntest/configure | 609 + .../iris/example/conntest/conntest.cpp | 578 + .../iris/example/conntest/conntest.pro | 15 + iris-legacy/iris/example/conntest/conntest.qc | 4 + iris-legacy/iris/example/conntest/prepare | 30 + iris-legacy/iris/example/server/server.cpp | 217 + iris-legacy/iris/example/server/server.pro | 15 + iris-legacy/iris/example/xmpptest/ui_test.ui | 470 + .../iris/example/xmpptest/xmpptest.cpp | 916 ++ .../iris/example/xmpptest/xmpptest.pro | 41 + iris-legacy/iris/include/im.h | 133 + iris-legacy/iris/include/xmpp.h | 235 + iris-legacy/iris/include/xmpp_address.h | 66 + iris-legacy/iris/include/xmpp_agentitem.h | 55 + iris-legacy/iris/include/xmpp_chatstate.h | 34 + iris-legacy/iris/include/xmpp_client.h | 193 + iris-legacy/iris/include/xmpp_clientstream.h | 202 + iris-legacy/iris/include/xmpp_discoitem.h | 86 + iris-legacy/iris/include/xmpp_features.h | 88 + iris-legacy/iris/include/xmpp_htmlelement.h | 46 + .../iris/include/xmpp_httpauthrequest.h | 57 + iris-legacy/iris/include/xmpp_jid.h | 83 + iris-legacy/iris/include/xmpp_liveroster.h | 43 + .../iris/include/xmpp_liverosteritem.h | 58 + iris-legacy/iris/include/xmpp_message.h | 189 + iris-legacy/iris/include/xmpp_muc.h | 137 + iris-legacy/iris/include/xmpp_pubsubitem.h | 42 + .../iris/include/xmpp_pubsubretraction.h | 41 + iris-legacy/iris/include/xmpp_receipts.h | 32 + iris-legacy/iris/include/xmpp_resource.h | 48 + iris-legacy/iris/include/xmpp_resourcelist.h | 45 + iris-legacy/iris/include/xmpp_roster.h | 47 + iris-legacy/iris/include/xmpp_rosteritem.h | 82 + iris-legacy/iris/include/xmpp_rosterx.h | 66 + iris-legacy/iris/include/xmpp_stanza.h | 138 + iris-legacy/iris/include/xmpp_status.h | 151 + iris-legacy/iris/include/xmpp_stream.h | 81 + iris-legacy/iris/include/xmpp_task.h | 82 + iris-legacy/iris/include/xmpp_url.h | 49 + iris-legacy/iris/include/xmpp_xdata.h | 158 + iris-legacy/iris/include/xmpp_yadatetime.h | 68 + iris-legacy/iris/include/xmpp_yalastmail.h | 48 + iris-legacy/iris/iris.pri | 89 + iris-legacy/iris/irisnet/Doxyfile | 1213 ++ iris-legacy/iris/irisnet/TODO | 4 + iris-legacy/iris/irisnet/irisnet.pri | 32 + iris-legacy/iris/irisnet/irisnet.pro | 7 + iris-legacy/iris/irisnet/irisnetexport.h | 36 + iris-legacy/iris/irisnet/irisnetglobal.cpp | 286 + iris-legacy/iris/irisnet/irisnetglobal.h | 39 + iris-legacy/iris/irisnet/irisnetglobal_p.h | 36 + iris-legacy/iris/irisnet/irisnetplugin.cpp | 52 + iris-legacy/iris/irisnet/irisnetplugin.h | 127 + iris-legacy/iris/irisnet/jdns/README | 85 + iris-legacy/iris/irisnet/jdns/TODO | 1 + iris-legacy/iris/irisnet/jdns/jdns.c | 3176 +++++ iris-legacy/iris/irisnet/jdns/jdns.h | 490 + iris-legacy/iris/irisnet/jdns/jdns.pri | 27 + iris-legacy/iris/irisnet/jdns/jdns.pro | 9 + iris-legacy/iris/irisnet/jdns/jdns_mdnsd.c | 1097 ++ iris-legacy/iris/irisnet/jdns/jdns_mdnsd.h | 120 + iris-legacy/iris/irisnet/jdns/jdns_p.h | 83 + iris-legacy/iris/irisnet/jdns/jdns_packet.c | 989 ++ iris-legacy/iris/irisnet/jdns/jdns_packet.h | 116 + iris-legacy/iris/irisnet/jdns/jdns_sys.c | 822 ++ iris-legacy/iris/irisnet/jdns/jdns_util.c | 1471 +++ iris-legacy/iris/irisnet/jdns/main.cpp | 596 + iris-legacy/iris/irisnet/jdns/qjdns.cpp | 908 ++ iris-legacy/iris/irisnet/jdns/qjdns.h | 158 + iris-legacy/iris/irisnet/jdns/qjdns_sock.cpp | 184 + iris-legacy/iris/irisnet/jdns/qjdns_sock.h | 33 + iris-legacy/iris/irisnet/jdnsshared.cpp | 1201 ++ iris-legacy/iris/irisnet/jdnsshared.h | 511 + iris-legacy/iris/irisnet/legacy/legacy.pri | 13 + iris-legacy/iris/irisnet/legacy/ndns.cpp | 147 + iris-legacy/iris/irisnet/legacy/ndns.h | 59 + .../iris/irisnet/legacy/safedelete.cpp | 114 + iris-legacy/iris/irisnet/legacy/safedelete.h | 59 + iris-legacy/iris/irisnet/legacy/servsock.cpp | 111 + iris-legacy/iris/irisnet/legacy/servsock.h | 68 + .../iris/irisnet/legacy/srvresolver.cpp | 298 + iris-legacy/iris/irisnet/legacy/srvresolver.h | 87 + iris-legacy/iris/irisnet/main.cpp | 589 + iris-legacy/iris/irisnet/netinterface.cpp | 498 + iris-legacy/iris/irisnet/netinterface.h | 211 + .../iris/irisnet/netinterface_unix.cpp | 425 + iris-legacy/iris/irisnet/netnames.cpp | 960 ++ iris-legacy/iris/irisnet/netnames.h | 537 + iris-legacy/iris/irisnet/netnames_jdns.cpp | 1143 ++ iris-legacy/iris/irisnet/processquit.cpp | 222 + iris-legacy/iris/irisnet/processquit.h | 109 + iris-legacy/iris/jabber/filetransfer.cpp | 782 ++ iris-legacy/iris/jabber/filetransfer.h | 183 + iris-legacy/iris/jabber/s5b.cpp | 2533 ++++ iris-legacy/iris/jabber/s5b.h | 345 + iris-legacy/iris/jabber/xmpp_ibb.cpp | 638 + iris-legacy/iris/jabber/xmpp_ibb.h | 145 + iris-legacy/iris/libidn.pri | 19 + iris-legacy/iris/libidn/gunicomp.h | 658 + iris-legacy/iris/libidn/gunidecomp.h | 10362 ++++++++++++++++ iris-legacy/iris/libidn/idn-int.h | 293 + iris-legacy/iris/libidn/idna.h | 95 + iris-legacy/iris/libidn/internal.h | 133 + iris-legacy/iris/libidn/nfkc.c | 1047 ++ iris-legacy/iris/libidn/profiles.c | 610 + iris-legacy/iris/libidn/punycode.h | 151 + iris-legacy/iris/libidn/qint.h | 15 + iris-legacy/iris/libidn/rfc3454.c | 3541 ++++++ iris-legacy/iris/libidn/stringprep.c | 475 + iris-legacy/iris/libidn/stringprep.h | 220 + .../unittest/yadatetime/testyadatetime.cpp | 127 + .../unittest/yadatetime/testyadatetime.pro | 9 + iris-legacy/iris/xmpp-core/compress.cpp | 200 + iris-legacy/iris/xmpp-core/compress.h | 54 + .../iris/xmpp-core/compressionhandler.cpp | 67 + .../iris/xmpp-core/compressionhandler.h | 35 + iris-legacy/iris/xmpp-core/connector.cpp | 742 ++ iris-legacy/iris/xmpp-core/jid.cpp | 441 + iris-legacy/iris/xmpp-core/parser.cpp | 798 ++ iris-legacy/iris/xmpp-core/parser.h | 86 + iris-legacy/iris/xmpp-core/protocol.cpp | 1695 +++ iris-legacy/iris/xmpp-core/protocol.h | 361 + iris-legacy/iris/xmpp-core/securestream.cpp | 651 + iris-legacy/iris/xmpp-core/securestream.h | 87 + iris-legacy/iris/xmpp-core/simplesasl.cpp | 676 + iris-legacy/iris/xmpp-core/simplesasl.h | 33 + iris-legacy/iris/xmpp-core/stream.cpp | 1389 +++ iris-legacy/iris/xmpp-core/td.h | 20 + iris-legacy/iris/xmpp-core/tlshandler.cpp | 171 + iris-legacy/iris/xmpp-core/xmlprotocol.cpp | 646 + iris-legacy/iris/xmpp-core/xmlprotocol.h | 146 + iris-legacy/iris/xmpp-core/xmpp_stanza.cpp | 660 + .../iris/xmpp-core/xmpp_yadatetime.cpp | 183 + iris-legacy/iris/xmpp-im/client.cpp | 1225 ++ iris-legacy/iris/xmpp-im/types.cpp | 3218 +++++ .../iris/xmpp-im/xmpp_discoinfotask.cpp | 180 + iris-legacy/iris/xmpp-im/xmpp_discoinfotask.h | 61 + iris-legacy/iris/xmpp-im/xmpp_discoitem.cpp | 199 + iris-legacy/iris/xmpp-im/xmpp_features.cpp | 289 + iris-legacy/iris/xmpp-im/xmpp_task.cpp | 301 + iris-legacy/iris/xmpp-im/xmpp_tasks.cpp | 2320 ++++ iris-legacy/iris/xmpp-im/xmpp_tasks.h | 530 + iris-legacy/iris/xmpp-im/xmpp_vcard.cpp | 1357 ++ iris-legacy/iris/xmpp-im/xmpp_vcard.h | 311 + iris-legacy/iris/xmpp-im/xmpp_xdata.cpp | 473 + iris-legacy/iris/xmpp-im/xmpp_xmlcommon.cpp | 500 + iris-legacy/iris/xmpp-im/xmpp_xmlcommon.h | 76 + iris/.gitignore | 10 + iris/COPYING | 504 + iris/README | 41 + iris/TODO | 46 + iris/common.pri | 21 + iris/conf_win.pri.example | 17 + iris/confapp.pri | 6 + iris/confapp_win.pri.example | 17 + iris/configure | 1982 +++ iris/include/iris/addressresolver.h | 1 + iris/include/iris/bsocket.h | 1 + iris/include/iris/bytestream.h | 1 + iris/include/iris/filetransfer.h | 1 + iris/include/iris/httpconnect.h | 1 + iris/include/iris/httppoll.h | 1 + iris/include/iris/ice176.h | 1 + iris/include/iris/im.h | 1 + iris/include/iris/irisnetexport.h | 1 + iris/include/iris/irisnetglobal.h | 1 + iris/include/iris/irisnetplugin.h | 1 + iris/include/iris/jdnsshared.h | 1 + iris/include/iris/ndns.h | 1 + iris/include/iris/netavailability.h | 1 + iris/include/iris/netinterface.h | 1 + iris/include/iris/netnames.h | 1 + iris/include/iris/objectsession.h | 1 + iris/include/iris/processquit.h | 1 + iris/include/iris/qjdns.h | 1 + iris/include/iris/s5b.h | 1 + iris/include/iris/safedelete.h | 1 + iris/include/iris/servsock.h | 1 + iris/include/iris/socks.h | 1 + iris/include/iris/srvresolver.h | 1 + iris/include/iris/stunallocate.h | 1 + iris/include/iris/stunbinding.h | 1 + iris/include/iris/stunmessage.h | 1 + iris/include/iris/stuntransaction.h | 1 + iris/include/iris/turnclient.h | 1 + iris/include/iris/udpportreserver.h | 1 + iris/include/iris/xmpp.h | 1 + iris/include/iris/xmpp_address.h | 1 + iris/include/iris/xmpp_agentitem.h | 1 + iris/include/iris/xmpp_chatstate.h | 1 + iris/include/iris/xmpp_client.h | 1 + iris/include/iris/xmpp_clientstream.h | 1 + iris/include/iris/xmpp_discoinfotask.h | 1 + iris/include/iris/xmpp_discoitem.h | 1 + iris/include/iris/xmpp_features.h | 1 + iris/include/iris/xmpp_htmlelement.h | 1 + iris/include/iris/xmpp_httpauthrequest.h | 1 + iris/include/iris/xmpp_jid.h | 1 + iris/include/iris/xmpp_liveroster.h | 1 + iris/include/iris/xmpp_liverosteritem.h | 1 + iris/include/iris/xmpp_message.h | 1 + iris/include/iris/xmpp_muc.h | 1 + iris/include/iris/xmpp_pubsubitem.h | 1 + iris/include/iris/xmpp_pubsubretraction.h | 1 + iris/include/iris/xmpp_receipts.h | 1 + iris/include/iris/xmpp_resource.h | 1 + iris/include/iris/xmpp_resourcelist.h | 1 + iris/include/iris/xmpp_roster.h | 1 + iris/include/iris/xmpp_rosteritem.h | 1 + iris/include/iris/xmpp_rosterx.h | 1 + iris/include/iris/xmpp_stanza.h | 1 + iris/include/iris/xmpp_status.h | 1 + iris/include/iris/xmpp_stream.h | 1 + iris/include/iris/xmpp_task.h | 1 + iris/include/iris/xmpp_tasks.h | 1 + iris/include/iris/xmpp_url.h | 1 + iris/include/iris/xmpp_vcard.h | 1 + iris/include/iris/xmpp_xdata.h | 1 + iris/include/iris/xmpp_xmlcommon.h | 1 + iris/include/iris/xmpp_yadatetime.h | 1 + iris/include/iris/xmpp_yalastmail.h | 1 + iris/iris.pri | 25 + iris/iris.pro | 21 + iris/iris.qc | 25 + iris/qcm/README | 5 + iris/qcm/buildmode.qcm | 201 + iris/qcm/extra.qcm | 90 + iris/qcm/qca.qcm | 126 + iris/qcm/qt42.qcm | 20 + iris/qcm/universal.qcm | 49 + iris/qcm/zlib.qcm | 55 + iris/src/irisnet/appledns/appledns.cpp | 1022 ++ iris/src/irisnet/appledns/appledns.pri | 6 + iris/src/irisnet/appledns/appledns.pro | 14 + iris/src/irisnet/appledns/qdnssd.cpp | 1081 ++ iris/src/irisnet/appledns/qdnssd.h | 161 + iris/src/irisnet/appledns/sdtest.cpp | 499 + iris/src/irisnet/appledns/sdtest.pro | 9 + iris/src/irisnet/corelib/addressresolver.cpp | 213 + iris/src/irisnet/corelib/addressresolver.h | 57 + iris/src/irisnet/corelib/corelib.pri | 49 + iris/src/irisnet/corelib/corelib.pro | 17 + iris/src/irisnet/corelib/irisnetexport.h | 36 + iris/src/irisnet/corelib/irisnetglobal.cpp | 304 + iris/src/irisnet/corelib/irisnetglobal.h | 39 + iris/src/irisnet/corelib/irisnetglobal_p.h | 36 + iris/src/irisnet/corelib/irisnetplugin.cpp | 84 + iris/src/irisnet/corelib/irisnetplugin.h | 177 + iris/src/irisnet/corelib/jdnsshared.cpp | 1426 +++ iris/src/irisnet/corelib/jdnsshared.h | 511 + iris/src/irisnet/corelib/netavailability.cpp | 58 + iris/src/irisnet/corelib/netavailability.h | 49 + iris/src/irisnet/corelib/netinterface.cpp | 423 + iris/src/irisnet/corelib/netinterface.h | 211 + .../src/irisnet/corelib/netinterface_unix.cpp | 430 + iris/src/irisnet/corelib/netinterface_win.cpp | 64 + iris/src/irisnet/corelib/netnames.cpp | 1115 ++ iris/src/irisnet/corelib/netnames.h | 560 + iris/src/irisnet/corelib/netnames_jdns.cpp | 2724 ++++ iris/src/irisnet/corelib/objectsession.cpp | 301 + iris/src/irisnet/corelib/objectsession.h | 88 + iris/src/irisnet/irisnet.pro | 13 + .../src/irisnet/noncore/cutestuff/bsocket.cpp | 458 + iris/src/irisnet/noncore/cutestuff/bsocket.h | 91 + .../irisnet/noncore/cutestuff/bytestream.cpp | 259 + .../irisnet/noncore/cutestuff/bytestream.h | 76 + .../irisnet/noncore/cutestuff/cutestuff.pri | 15 + .../irisnet/noncore/cutestuff/httpconnect.cpp | 387 + .../irisnet/noncore/cutestuff/httpconnect.h | 67 + .../irisnet/noncore/cutestuff/httppoll.cpp | 980 ++ iris/src/irisnet/noncore/cutestuff/httppoll.h | 143 + iris/src/irisnet/noncore/cutestuff/socks.cpp | 1135 ++ iris/src/irisnet/noncore/cutestuff/socks.h | 160 + iris/src/irisnet/noncore/ice176.cpp | 1342 ++ iris/src/irisnet/noncore/ice176.h | 189 + iris/src/irisnet/noncore/icecomponent.cpp | 1056 ++ iris/src/irisnet/noncore/icecomponent.h | 188 + .../src/irisnet/noncore/icelocaltransport.cpp | 888 ++ iris/src/irisnet/noncore/icelocaltransport.h | 103 + iris/src/irisnet/noncore/icetransport.cpp | 34 + iris/src/irisnet/noncore/icetransport.h | 75 + iris/src/irisnet/noncore/iceturntransport.cpp | 251 + iris/src/irisnet/noncore/iceturntransport.h | 78 + iris/src/irisnet/noncore/legacy/legacy.pri | 11 + iris/src/irisnet/noncore/legacy/ndns.cpp | 137 + iris/src/irisnet/noncore/legacy/ndns.h | 59 + .../src/irisnet/noncore/legacy/safedelete.cpp | 114 + iris/src/irisnet/noncore/legacy/safedelete.h | 59 + iris/src/irisnet/noncore/legacy/servsock.cpp | 111 + iris/src/irisnet/noncore/legacy/servsock.h | 69 + .../irisnet/noncore/legacy/srvresolver.cpp | 316 + iris/src/irisnet/noncore/legacy/srvresolver.h | 83 + iris/src/irisnet/noncore/noncore.pri | 49 + iris/src/irisnet/noncore/noncore.pro | 15 + iris/src/irisnet/noncore/processquit.cpp | 281 + iris/src/irisnet/noncore/processquit.h | 109 + iris/src/irisnet/noncore/stunallocate.cpp | 1455 +++ iris/src/irisnet/noncore/stunallocate.h | 135 + iris/src/irisnet/noncore/stunbinding.cpp | 300 + iris/src/irisnet/noncore/stunbinding.h | 83 + iris/src/irisnet/noncore/stunmessage.cpp | 733 ++ iris/src/irisnet/noncore/stunmessage.h | 111 + iris/src/irisnet/noncore/stuntransaction.cpp | 745 ++ iris/src/irisnet/noncore/stuntransaction.h | 207 + iris/src/irisnet/noncore/stuntypes.cpp | 738 ++ iris/src/irisnet/noncore/stuntypes.h | 146 + iris/src/irisnet/noncore/stunutil.cpp | 101 + iris/src/irisnet/noncore/stunutil.h | 44 + iris/src/irisnet/noncore/turnclient.cpp | 1141 ++ iris/src/irisnet/noncore/turnclient.h | 194 + iris/src/irisnet/noncore/udpportreserver.cpp | 435 + iris/src/irisnet/noncore/udpportreserver.h | 74 + iris/src/jdns/README | 85 + iris/src/jdns/TODO | 20 + iris/src/jdns/jdns.c | 3436 +++++ iris/src/jdns/jdns.h | 507 + iris/src/jdns/jdns.pri | 27 + iris/src/jdns/jdns.pro | 9 + iris/src/jdns/jdns_mdnsd.c | 1125 ++ iris/src/jdns/jdns_mdnsd.h | 120 + iris/src/jdns/jdns_p.h | 95 + iris/src/jdns/jdns_packet.c | 1008 ++ iris/src/jdns/jdns_packet.h | 116 + iris/src/jdns/jdns_sys.c | 829 ++ iris/src/jdns/jdns_util.c | 1553 +++ iris/src/jdns/main.cpp | 596 + iris/src/jdns/qjdns.cpp | 1047 ++ iris/src/jdns/qjdns.h | 158 + iris/src/jdns/qjdns_sock.cpp | 184 + iris/src/jdns/qjdns_sock.h | 33 + iris/src/libbase.pri | 8 + iris/src/libidn/gunicomp.h | 658 + iris/src/libidn/gunidecomp.h | 10362 ++++++++++++++++ iris/src/libidn/idn-int.h | 293 + iris/src/libidn/idna.h | 95 + iris/src/libidn/internal.h | 133 + iris/src/libidn/libidn.pri | 16 + iris/src/libidn/nfkc.c | 1047 ++ iris/src/libidn/profiles.c | 610 + iris/src/libidn/punycode.h | 151 + iris/src/libidn/qint.h | 15 + iris/src/libidn/rfc3454.c | 3541 ++++++ iris/src/libidn/stringprep.c | 475 + iris/src/libidn/stringprep.h | 220 + iris/src/src.pro | 10 + iris/src/xmpp/base/base.pri | 10 + iris/src/xmpp/base/randomnumbergenerator.cpp | 22 + iris/src/xmpp/base/randomnumbergenerator.h | 23 + .../src/xmpp/base/randrandomnumbergenerator.h | 27 + .../incrementingrandomnumbergenerator.h | 34 + .../unittest/randomnumbergeneratortest.cpp | 50 + .../randrandomnumbergeneratortest.cpp | 30 + iris/src/xmpp/base/unittest/unittest.pri | 3 + iris/src/xmpp/base/unittest/unittest.pro | 4 + iris/src/xmpp/base64/base64.cpp | 104 + iris/src/xmpp/base64/base64.h | 16 + iris/src/xmpp/base64/base64.pri | 8 + iris/src/xmpp/base64/unittest/base64test.cpp | 31 + iris/src/xmpp/base64/unittest/unittest.pri | 2 + iris/src/xmpp/base64/unittest/unittest.pro | 4 + iris/src/xmpp/common.pri | 3 + iris/src/xmpp/jid/jid.cpp | 403 + iris/src/xmpp/jid/jid.h | 89 + iris/src/xmpp/jid/jid.pri | 13 + iris/src/xmpp/jid/unittest/jidtest.cpp | 31 + iris/src/xmpp/jid/unittest/unittest.pri | 2 + iris/src/xmpp/jid/unittest/unittest.pro | 4 + iris/src/xmpp/modules.pri | 6 + iris/src/xmpp/qa/README | 24 + .../xmpp/qa/qttestutil/example/example.pro | 23 + .../qttestutil/example/myfirstclasstest.cpp | 23 + .../qttestutil/example/mysecondclasstest.cpp | 23 + iris/src/xmpp/qa/qttestutil/qttestutil.h | 28 + iris/src/xmpp/qa/qttestutil/qttestutil.pri | 5 + iris/src/xmpp/qa/qttestutil/simplechecker.cpp | 17 + .../src/xmpp/qa/qttestutil/testregistration.h | 38 + iris/src/xmpp/qa/qttestutil/testregistry.cpp | 32 + iris/src/xmpp/qa/qttestutil/testregistry.h | 49 + iris/src/xmpp/qa/unittest.pri | 26 + .../xmpp/qa/unittest.template/myclasstest.cpp | 29 + .../xmpp/qa/unittest.template/unittest.pri | 2 + .../xmpp/qa/unittest.template/unittest.pro | 4 + iris/src/xmpp/qa/unittests.pri | 4 + iris/src/xmpp/qa/unittests/unittests.pro | 6 + iris/src/xmpp/sasl/digestmd5proplist.cpp | 133 + iris/src/xmpp/sasl/digestmd5proplist.h | 47 + iris/src/xmpp/sasl/digestmd5response.cpp | 85 + iris/src/xmpp/sasl/digestmd5response.h | 42 + iris/src/xmpp/sasl/plainmessage.cpp | 15 + iris/src/xmpp/sasl/plainmessage.h | 27 + iris/src/xmpp/sasl/sasl.pri | 13 + .../sasl/unittest/digestmd5responsetest.cpp | 67 + .../xmpp/sasl/unittest/plainmessagetest.cpp | 36 + iris/src/xmpp/sasl/unittest/unittest.pri | 3 + iris/src/xmpp/sasl/unittest/unittest.pro | 10 + .../src/xmpp/xmpp-core/compressionhandler.cpp | 68 + iris/src/xmpp/xmpp-core/compressionhandler.h | 35 + iris/src/xmpp/xmpp-core/connector.cpp | 774 ++ iris/src/xmpp/xmpp-core/parser.cpp | 798 ++ iris/src/xmpp/xmpp-core/parser.h | 86 + iris/src/xmpp/xmpp-core/protocol.cpp | 1693 +++ iris/src/xmpp/xmpp-core/protocol.h | 364 + iris/src/xmpp/xmpp-core/securestream.cpp | 664 + iris/src/xmpp/xmpp-core/securestream.h | 87 + iris/src/xmpp/xmpp-core/simplesasl.cpp | 480 + iris/src/xmpp/xmpp-core/simplesasl.h | 33 + iris/src/xmpp/xmpp-core/stream.cpp | 1409 +++ iris/src/xmpp/xmpp-core/td.h | 20 + iris/src/xmpp/xmpp-core/tlshandler.cpp | 447 + iris/src/xmpp/xmpp-core/xmlprotocol.cpp | 643 + iris/src/xmpp/xmpp-core/xmlprotocol.h | 146 + iris/src/xmpp/xmpp-core/xmpp.h | 242 + iris/src/xmpp/xmpp-core/xmpp_clientstream.h | 205 + iris/src/xmpp/xmpp-core/xmpp_stanza.cpp | 660 + iris/src/xmpp/xmpp-core/xmpp_stanza.h | 138 + iris/src/xmpp/xmpp-core/xmpp_stream.h | 81 + iris/src/xmpp/xmpp-core/xmpp_yadatetime.cpp | 183 + iris/src/xmpp/xmpp-core/xmpp_yadatetime.h | 68 + iris/src/xmpp/xmpp-im/client.cpp | 1252 ++ iris/src/xmpp/xmpp-im/filetransfer.cpp | 783 ++ iris/src/xmpp/xmpp-im/filetransfer.h | 183 + iris/src/xmpp/xmpp-im/im.h | 133 + iris/src/xmpp/xmpp-im/s5b.cpp | 2536 ++++ iris/src/xmpp/xmpp-im/s5b.h | 342 + iris/src/xmpp/xmpp-im/types.cpp | 3225 +++++ iris/src/xmpp/xmpp-im/xmpp_address.h | 66 + iris/src/xmpp/xmpp-im/xmpp_agentitem.h | 55 + iris/src/xmpp/xmpp-im/xmpp_chatstate.h | 34 + iris/src/xmpp/xmpp-im/xmpp_client.h | 194 + iris/src/xmpp/xmpp-im/xmpp_discoinfotask.cpp | 178 + iris/src/xmpp/xmpp-im/xmpp_discoinfotask.h | 61 + iris/src/xmpp/xmpp-im/xmpp_discoitem.cpp | 199 + iris/src/xmpp/xmpp-im/xmpp_discoitem.h | 86 + iris/src/xmpp/xmpp-im/xmpp_features.cpp | 289 + iris/src/xmpp/xmpp-im/xmpp_features.h | 88 + iris/src/xmpp/xmpp-im/xmpp_htmlelement.h | 46 + iris/src/xmpp/xmpp-im/xmpp_httpauthrequest.h | 57 + iris/src/xmpp/xmpp-im/xmpp_ibb.cpp | 637 + iris/src/xmpp/xmpp-im/xmpp_ibb.h | 144 + iris/src/xmpp/xmpp-im/xmpp_liveroster.h | 43 + iris/src/xmpp/xmpp-im/xmpp_liverosteritem.h | 58 + iris/src/xmpp/xmpp-im/xmpp_message.h | 190 + iris/src/xmpp/xmpp-im/xmpp_muc.h | 137 + iris/src/xmpp/xmpp-im/xmpp_pubsubitem.h | 42 + iris/src/xmpp/xmpp-im/xmpp_pubsubretraction.h | 41 + iris/src/xmpp/xmpp-im/xmpp_receipts.h | 33 + iris/src/xmpp/xmpp-im/xmpp_resource.h | 48 + iris/src/xmpp/xmpp-im/xmpp_resourcelist.h | 45 + iris/src/xmpp/xmpp-im/xmpp_roster.h | 47 + iris/src/xmpp/xmpp-im/xmpp_rosteritem.h | 82 + iris/src/xmpp/xmpp-im/xmpp_rosterx.h | 66 + iris/src/xmpp/xmpp-im/xmpp_status.h | 140 + iris/src/xmpp/xmpp-im/xmpp_task.cpp | 297 + iris/src/xmpp/xmpp-im/xmpp_task.h | 82 + iris/src/xmpp/xmpp-im/xmpp_tasks.cpp | 2381 ++++ iris/src/xmpp/xmpp-im/xmpp_tasks.h | 538 + iris/src/xmpp/xmpp-im/xmpp_url.h | 49 + iris/src/xmpp/xmpp-im/xmpp_vcard.cpp | 1362 ++ iris/src/xmpp/xmpp-im/xmpp_vcard.h | 310 + iris/src/xmpp/xmpp-im/xmpp_xdata.cpp | 475 + iris/src/xmpp/xmpp-im/xmpp_xdata.h | 159 + iris/src/xmpp/xmpp-im/xmpp_xmlcommon.cpp | 596 + iris/src/xmpp/xmpp-im/xmpp_xmlcommon.h | 108 + iris/src/xmpp/xmpp-im/xmpp_yalastmail.h | 48 + iris/src/xmpp/xmpp.pri | 98 + iris/src/xmpp/xmpp.pro | 17 + iris/src/xmpp/zlib/common.h | 24 + iris/src/xmpp/zlib/zlib.pri | 10 + iris/src/xmpp/zlib/zlibcompressor.cpp | 93 + iris/src/xmpp/zlib/zlibcompressor.h | 32 + iris/src/xmpp/zlib/zlibdecompressor.cpp | 95 + iris/src/xmpp/zlib/zlibdecompressor.h | 32 + iris/tools/icetunnel/icetunnel.pro | 30 + iris/tools/icetunnel/main.cpp | 1037 ++ iris/tools/nettool/main.cpp | 1291 ++ iris/tools/nettool/nettool.pro | 31 + iris/tools/tools.pro | 2 + iris/tools/xmpptest/test.ui | 482 + iris/tools/xmpptest/xmpptest.cpp | 962 ++ iris/tools/xmpptest/xmpptest.pro | 10 + iris/unittest/yadatetime/testyadatetime.cpp | 127 + iris/unittest/yadatetime/testyadatetime.pro | 9 + lang/.gitignore | 4 + lang/psi_ru.ts | 5325 ++++++++ lang/qt_ru.ts | 6839 ++++++++++ mac/Info.plist | 34 + mac/Makefile.jingle | 201 + mac/application.icns | Bin 0 -> 67906 bytes mac/normalize.rb | 7 + options/default.xml | 380 + options/macosx.xml | 17 + options/windows.xml | 5 + options/x11.xml | 8 + psi-jingle.qc | 41 + psi.desktop | 29 + psi.pro | 23 + psi.qc | 39 + psi.qrc | 13 + qa/guitest/guitest.cpp | 24 + qa/guitest/guitest.h | 15 + qa/guitest/guitest.pro | 19 + qa/guitest/guitestmanager.cpp | 43 + qa/guitest/guitestmanager.h | 24 + qa/oldtest/checkall | 12 + qa/oldtest/tests.txt | 7 + qa/oldtest/unittest.pri | 67 + qa/oldtest/unittest.pro | 12 + qa/oldtest/update.rb | 32 + qa/unittest/unittest.cpp | 25 + qa/unittest/unittest.pro | 24 + qa/unittest/unittestutil.cpp | 13 + qa/unittest/unittestutil.h | 11 + qa/valgrind/valgrind.pri | 26 + qcm/aspell.qcm | 64 + qcm/bundled-qca.qcm | 29 + qcm/certstore.qcm | 117 + qcm/conf.qcm | 31 + qcm/cyrussasl.qcm | 62 + qcm/debug.qcm | 27 + qcm/dnotify.qcm | 44 + qcm/ghbnr.qcm | 30 + qcm/google_ft.qcm | 66 + qcm/growl.qcm | 63 + qcm/jingle.qcm | 376 + qcm/kde.qcm | 25 + qcm/openssl.qcm | 94 + qcm/plugins.qcm | 41 + qcm/qca.qcm | 53 + qcm/qdbus.qcm | 43 + qcm/qt4.qcm | 16 + qcm/tests.qcm | 63 + qcm/universal.qcm | 25 + qcm/xmms.qcm | 154 + qcm/xss.qcm | 44 + qcm/zlib.qcm | 55 + ...emit signals when clearing selection.patch | 20 + ...ll-all-SmoothScrollBar compatibility.patch | 21 + .../003-all-all-YaTabBar compatibility.patch | 12 + ...04-all-4.3-updated autoscroll region.patch | 12 + ...005-all-all-YaBoldMenu compatibility.patch | 13 + qt-patches/006-win-all-hide menu gutter.patch | 13 + .../007-win-4.4-YaWindow minimize fix.patch | 19 + ...enuEvent correctly handles modifiers.patch | 91 + ...-all-disable inlining when debugging.patch | 11 + qt-patches/010-win-4.4-win improvements.patch | 142 + qt-patches/010-win-4.5-win improvements.patch | 148 + .../011-all-all-multiline tabs enabler.patch | 12 + .../012-win-all-com server installation.patch | 29 + ...ll-YaFlashingScrollBar compatibility.patch | 46 + .../014-win-4.5-breakpad on exceptions.patch | 313 + ...5-win-all-getopenfilename thumbnails.patch | 104 + .../016-win-4.5-all-appwindow windows.patch | 14 + .../017-all-all-QPointer improvements.patch | 129 + .../018-win-all-disable CoUnitialize.patch | 12 + ...in-all-build with multiple processes.patch | 15 + .../020-all-all-prettify wavy underline.patch | 60 + qt-patches/patch-qt.rb | 57 + sound/chat1.wav | Bin 0 -> 63654 bytes sound/chat2.wav | Bin 0 -> 42166 bytes sound/ft_complete.wav | Bin 0 -> 112568 bytes sound/ft_incoming.wav | Bin 0 -> 132336 bytes sound/offline.wav | Bin 0 -> 43358 bytes sound/online.wav | Bin 0 -> 53566 bytes sound/send.wav | Bin 0 -> 60766 bytes sound/subscribe.wav | Bin 0 -> 184160 bytes sound/unsubscribe.wav | Bin 0 -> 61228 bytes src/.gitignore | 16 + src/about.ui | 312 + src/aboutdlg.cpp | 141 + src/aboutdlg.h | 44 + src/accountadd.ui | 167 + src/accountadddlg.cpp | 125 + src/accountadddlg.h | 49 + src/accountlabel.cpp | 71 + src/accountlabel.h | 50 + src/accountmanage.ui | 169 + src/accountmanagedlg.cpp | 394 + src/accountmanagedlg.h | 58 + src/accountmodify.ui | 1121 ++ src/accountmodifydlg.cpp | 637 + src/accountmodifydlg.h | 92 + src/accountreg.ui | 304 + src/accountregdlg.cpp | 371 + src/accountregdlg.h | 106 + src/accountremove.ui | 170 + src/accountscombobox.cpp | 141 + src/accountscombobox.h | 64 + src/actionlist.cpp | 217 + src/actionlist.h | 74 + src/activeprofiles.cpp | 116 + src/activeprofiles.h | 64 + src/activeprofiles_dbus.cpp | 241 + src/activeprofiles_stub.cpp | 82 + src/activeprofiles_win.cpp | 368 + src/addurl.ui | 122 + src/adduser.ui | 439 + src/adduserdlg.cpp | 304 + src/adduserdlg.h | 67 + src/adhoc_fileserver.cpp | 90 + src/adhoc_fileserver.h | 38 + src/ahcexecutetask.cpp | 73 + src/ahcexecutetask.h | 43 + src/ahcformdlg.cpp | 196 + src/ahcformdlg.h | 67 + src/ahcommand.cpp | 365 + src/ahcommand.h | 112 + src/ahcommanddlg.cpp | 207 + src/ahcommanddlg.h | 64 + src/ahcommandserver.cpp | 40 + src/ahcommandserver.h | 53 + src/ahcservermanager.cpp | 265 + src/ahcservermanager.h | 60 + src/alertable.cpp | 84 + src/alertable.h | 49 + src/alerticon.cpp | 299 + src/alerticon.h | 63 + src/applicationinfo.cpp | 216 + src/applicationinfo.h | 36 + src/avatars.cpp | 747 ++ src/avatars.h | 128 + src/bookmarkmanage.ui | 165 + src/bookmarkmanagedlg.cpp | 212 + src/bookmarkmanagedlg.h | 84 + src/bookmarkmanager.cpp | 225 + src/bookmarkmanager.h | 70 + src/capabilities/capabilities.pri | 12 + src/capabilities/capsmanager.cpp | 294 + src/capabilities/capsmanager.h | 83 + src/capabilities/capsregistry.cpp | 249 + src/capabilities/capsregistry.h | 84 + src/capabilities/capsspec.cpp | 118 + src/capabilities/capsspec.h | 49 + src/capabilities/unittest/capsmanagertest.cpp | 183 + src/capabilities/unittest/capsspectest.cpp | 124 + src/capabilities/unittest/unittest.pri | 3 + src/certutil.cpp | 165 + src/certutil.h | 19 + src/changepw.ui | 155 + src/changepwdlg.cpp | 160 + src/changepwdlg.h | 54 + src/chatdlg.cpp | 1073 ++ src/chatdlg.h | 187 + src/chatdlg.ui | 325 + src/chatdlgbase.cpp | 405 + src/chatdlgbase.h | 122 + src/chateditproxy.cpp | 122 + src/chateditproxy.h | 68 + src/chatsplitter.cpp | 167 + src/chatsplitter.h | 66 + src/common.cpp | 486 + src/common.h | 265 + src/conf_iris.pri | 29 + src/conferencebookmark.cpp | 125 + src/conferencebookmark.h | 60 + src/contactlistgroup.cpp | 396 + src/contactlistgroup.h | 115 + src/contactlistgroupcache.cpp | 100 + src/contactlistgroupcache.h | 53 + src/contactlistgroupmenu.cpp | 117 + src/contactlistgroupmenu.h | 44 + src/contactlistgroupstate.cpp | 225 + src/contactlistgroupstate.h | 73 + src/contactlistitem.cpp | 99 + src/contactlistitem.h | 64 + src/contactlistitemmenu.cpp | 73 + src/contactlistitemmenu.h | 52 + src/contactlistitemproxy.h | 43 + src/contactlistmodel.cpp | 714 ++ src/contactlistmodel.h | 187 + src/contactlistmodelupdater.cpp | 198 + src/contactlistmodelupdater.h | 87 + src/contactlistnestedgroup.cpp | 242 + src/contactlistnestedgroup.h | 48 + src/contactlistproxymodel.cpp | 112 + src/contactlistproxymodel.h | 48 + src/contactlistview.cpp | 568 + src/contactlistview.h | 120 + src/contactlistviewdelegate.cpp | 449 + src/contactlistviewdelegate.h | 81 + src/contactupdatesmanager.cpp | 336 + src/contactupdatesmanager.h | 158 + src/contactview.cpp | 3644 ++++++ src/contactview.h | 412 + src/dbus.cpp | 82 + src/dbus.h | 14 + src/deliveryconfirmationmanager.cpp | 331 + src/deliveryconfirmationmanager.h | 94 + src/desktoputil.cpp | 149 + src/desktoputil.h | 36 + src/disco.ui | 219 + src/discodlg.cpp | 1482 +++ src/discodlg.h | 55 + src/dummystream.cpp | 23 + src/dummystream.h | 48 + src/eventdb.cpp | 1211 ++ src/eventdb.h | 237 + src/eventdlg.cpp | 2145 ++++ src/eventdlg.h | 206 + src/filetrans.ui | 172 + src/filetransdlg.cpp | 1773 +++ src/filetransdlg.h | 136 + src/fileutil.cpp | 162 + src/fileutil.h | 47 + src/gcuserview.cpp | 383 + src/gcuserview.h | 95 + src/geolocation.cpp | 189 + src/geolocation.h | 68 + src/globaleventqueue.cpp | 83 + src/globaleventqueue.h | 56 + src/googleftmanager.cpp | 396 + src/googleftmanager.h | 143 + src/groupchatcontact.cpp | 183 + src/groupchatcontact.h | 70 + src/groupchatcontactmenu.cpp | 122 + src/groupchatcontactmenu.h | 48 + src/groupchatdlg.cpp | 554 + src/groupchatdlg.h | 173 + src/groupchatdlg.ui | 298 + src/historydlg.cpp | 797 ++ src/historydlg.h | 120 + src/hoverabletreeview.cpp | 160 + src/hoverabletreeview.h | 79 + src/httpauthmanager.cpp | 152 + src/httpauthmanager.h | 51 + src/info.ui | 524 + src/infodlg.cpp | 664 + src/infodlg.h | 97 + src/irisprotocol/iris_discoinfoquerier.cpp | 33 + src/irisprotocol/iris_discoinfoquerier.h | 34 + src/irisprotocol/irisprotocol.pri | 5 + src/jidutil.cpp | 171 + src/jidutil.h | 47 + src/jinglevoicecaller.cpp | 386 + src/jinglevoicecaller.h | 90 + src/lastactivitytask.cpp | 76 + src/lastactivitytask.h | 50 + src/main.cpp | 515 + src/main.h | 57 + src/mainwin.cpp | 1368 ++ src/mainwin.h | 167 + src/mainwin_p.cpp | 695 ++ src/mainwin_p.h | 164 + src/maybe.h | 67 + src/miniclient.cpp | 268 + src/miniclient.h | 83 + src/mood.cpp | 98 + src/mood.h | 63 + src/mood.ui | 109 + src/moodcatalog.cpp | 160 + src/moodcatalog.h | 65 + src/mooddlg.cpp | 55 + src/mooddlg.h | 45 + src/msgmle.cpp | 522 + src/msgmle.h | 148 + src/mucaffiliationsmodel.cpp | 282 + src/mucaffiliationsmodel.h | 66 + src/mucaffiliationsproxymodel.cpp | 23 + src/mucaffiliationsproxymodel.h | 16 + src/mucaffiliationsview.cpp | 82 + src/mucaffiliationsview.h | 45 + src/mucconfig.ui | 307 + src/mucconfigdlg.cpp | 343 + src/mucconfigdlg.h | 106 + src/mucjoin.ui | 221 + src/mucjoindlg.cpp | 282 + src/mucjoindlg.h | 115 + src/mucmanager.cpp | 637 + src/mucmanager.h | 132 + src/networkinterfacemanager.cpp | 98 + src/networkinterfacemanager.h | 50 + src/optioneditor.ui | 140 + src/options/opt_advanced.cpp | 153 + src/options/opt_advanced.h | 27 + src/options/opt_advanced.ui | 174 + src/options/opt_appearance.cpp | 326 + src/options/opt_appearance.h | 80 + src/options/opt_appearance.ui | 518 + src/options/opt_appearance_misc.ui | 186 + src/options/opt_application.cpp | 121 + src/options/opt_application.h | 25 + src/options/opt_application.ui | 197 + src/options/opt_chat.cpp | 141 + src/options/opt_chat.h | 26 + src/options/opt_chat.ui | 145 + src/options/opt_events.cpp | 134 + src/options/opt_events.h | 25 + src/options/opt_events.ui | 305 + src/options/opt_general_groupchat.ui | 307 + src/options/opt_groupchat.cpp | 201 + src/options/opt_groupchat.h | 37 + src/options/opt_iconset.cpp | 1153 ++ src/options/opt_iconset.h | 110 + src/options/opt_iconset_emo.ui | 135 + src/options/opt_iconset_roster.ui | 379 + src/options/opt_iconset_system.ui | 83 + src/options/opt_lookfeel_toolbars.ui | 400 + src/options/opt_plugins.cpp | 157 + src/options/opt_plugins.h | 30 + src/options/opt_plugins.ui | 134 + src/options/opt_shortcuts.cpp | 428 + src/options/opt_shortcuts.h | 66 + src/options/opt_shortcuts.ui | 106 + src/options/opt_sound.cpp | 214 + src/options/opt_sound.h | 39 + src/options/opt_sound.ui | 437 + src/options/opt_status.cpp | 291 + src/options/opt_status.h | 34 + src/options/opt_status.ui | 357 + src/options/opt_toolbars.cpp | 702 ++ src/options/opt_toolbars.h | 67 + src/options/opt_tree.cpp | 39 + src/options/opt_tree.h | 24 + src/options/options.pri | 68 + src/options/optionsdlg.cpp | 583 + src/options/optionsdlg.h | 33 + src/options/optionsdlgiface.h | 15 + src/options/optionstab.cpp | 286 + src/options/optionstab.h | 76 + src/options/ui_isdetails.ui | 363 + src/options/ui_options.ui | 203 + src/options/ui_positiontoolbar.ui | 245 + src/passphrase.ui | 133 + src/passphrasedlg.cpp | 44 + src/passphrasedlg.h | 40 + src/pepmanager.cpp | 685 + src/pepmanager.h | 98 + src/pgpkey.ui | 102 + src/pgpkeydlg.cpp | 107 + src/pgpkeydlg.h | 52 + src/pgptransaction.cpp | 77 + src/pgptransaction.h | 64 + src/pgputil.cpp | 281 + src/pgputil.h | 75 + src/physicallocation.cpp | 270 + src/physicallocation.h | 71 + src/pixmaputil.cpp | 48 + src/pixmaputil.h | 14 + src/pluginmanager.cpp | 452 + src/pluginmanager.h | 84 + .../generic/chess/chess-standalone.pro | 31 + src/plugins/generic/chess/chessplugin.cpp | 219 + src/plugins/generic/chess/chessplugin.pro | 29 + src/plugins/generic/chess/game-README | 25 + src/plugins/generic/chess/gameboard.cpp | 2018 +++ src/plugins/generic/chess/gameboard.h | 263 + src/plugins/generic/chess/gamesocket.cpp | 35 + src/plugins/generic/chess/gamesocket.h | 40 + src/plugins/generic/chess/main.cpp | 57 + src/plugins/generic/chess/mainwindow.cpp | 296 + src/plugins/generic/chess/mainwindow.h | 92 + .../generic/chess/xpm/black_bishop.xpm | 46 + .../generic/chess/xpm/black_castle.xpm | 46 + src/plugins/generic/chess/xpm/black_king.xpm | 46 + .../generic/chess/xpm/black_knight.xpm | 46 + src/plugins/generic/chess/xpm/black_pawn.xpm | 45 + src/plugins/generic/chess/xpm/black_queen.xpm | 46 + src/plugins/generic/chess/xpm/chess.xpm | 46 + src/plugins/generic/chess/xpm/new_game.xpm | 65 + src/plugins/generic/chess/xpm/quit.xpm | 68 + .../generic/chess/xpm/white_bishop.xpm | 46 + .../generic/chess/xpm/white_castle.xpm | 46 + src/plugins/generic/chess/xpm/white_king.xpm | 46 + .../generic/chess/xpm/white_knight.xpm | 46 + src/plugins/generic/chess/xpm/white_pawn.xpm | 46 + src/plugins/generic/chess/xpm/white_queen.xpm | 46 + .../generic/consoledump/consoledumpplugin.cpp | 54 + .../generic/consoledump/consoledumpplugin.pro | 8 + src/plugins/generic/echo/echoplugin.cpp | 73 + src/plugins/generic/echo/echoplugin.pro | 5 + .../noughtsandcrossesplugin.cpp | 191 + .../noughtsandcrossesplugin.pro | 10 + .../generic/noughtsandcrosses/tictac.cpp | 423 + .../generic/noughtsandcrosses/tictac.h | 133 + src/plugins/generic/null/nullplugin.cpp | 46 + src/plugins/generic/null/nullplugin.pro | 9 + src/plugins/generic/python/messagescript.py | 111 + src/plugins/generic/python/pythonplugin.cpp | 147 + src/plugins/generic/python/pythonplugin.pro | 9 + src/plugins/generic/python/xmlmessage.py | 110 + src/plugins/generic/urlwatcher/urlevent.h | 46 + .../generic/urlwatcher/urlwatcherplugin.cpp | 327 + .../generic/urlwatcher/urlwatcherplugin.pro | 10 + src/plugins/plugins.pri | 13 + src/plugins/windows/snarl/SnarlInterface.cpp | 131 + src/plugins/windows/snarl/SnarlInterface.h | 56 + src/plugins/windows/snarl/snarlplugin.cpp | 83 + src/plugins/windows/snarl/snarlplugin.pro | 12 + src/pongserver.cpp | 87 + src/pongserver.h | 55 + src/privacy/guitest/guitest.pri | 9 + src/privacy/guitest/mockprivacymanager.cpp | 88 + src/privacy/guitest/mockprivacymanager.h | 48 + src/privacy/guitest/privacydlgtest.cpp | 29 + src/privacy/guitest/privacyruledlgtest.cpp | 27 + src/privacy/privacy.pri | 25 + src/privacy/privacy.ui | 301 + src/privacy/privacydlg.cpp | 331 + src/privacy/privacydlg.h | 80 + src/privacy/privacylist.cpp | 162 + src/privacy/privacylist.h | 61 + src/privacy/privacylistblockedmodel.cpp | 43 + src/privacy/privacylistblockedmodel.h | 36 + src/privacy/privacylistitem.cpp | 181 + src/privacy/privacylistitem.h | 76 + src/privacy/privacylistmodel.cpp | 122 + src/privacy/privacylistmodel.h | 59 + src/privacy/privacymanager.h | 59 + src/privacy/privacyrule.ui | 214 + src/privacy/privacyruledlg.cpp | 146 + src/privacy/privacyruledlg.h | 47 + src/privacy/psiprivacymanager.cpp | 515 + src/privacy/psiprivacymanager.h | 88 + src/privacy/unittest/privacylistitemtest.cpp | 280 + src/privacy/unittest/unittest.pri | 2 + src/profiledlg.cpp | 345 + src/profiledlg.h | 77 + src/profilemanage.ui | 145 + src/profilenew.ui | 208 + src/profileopen.ui | 210 + src/profiles.h | 124 + src/protocol/discoinfoquerier.h | 48 + src/protocol/protocol.pri | 2 + src/proxy.cpp | 704 ++ src/proxy.h | 188 + src/proxy.ui | 187 + src/psi_profiles.cpp | 2108 ++++ src/psiaccount.cpp | 7396 +++++++++++ src/psiaccount.h | 509 + src/psiaccountmenu.cpp | 182 + src/psiaccountmenu.h | 20 + src/psiactionlist.cpp | 400 + src/psiactionlist.h | 48 + src/psiactions.h | 11 + src/psiapplication.cpp | 437 + src/psiapplication.h | 72 + src/psichatdlg.cpp | 460 + src/psichatdlg.h | 77 + src/psicli.h | 52 + src/psicon.cpp | 2241 ++++ src/psicon.h | 243 + src/psicontact.cpp | 1094 ++ src/psicontact.h | 189 + src/psicontactlist.cpp | 712 ++ src/psicontactlist.h | 225 + src/psicontactlistmodel.cpp | 179 + src/psicontactlistmodel.h | 48 + src/psicontactlistview.cpp | 125 + src/psicontactlistview.h | 61 + src/psicontactmenu.cpp | 673 + src/psicontactmenu.h | 48 + src/psidbusnotifier.cpp | 125 + src/psidbusnotifier.h | 47 + src/psievent.cpp | 1514 +++ src/psievent.h | 469 + src/psigroupchatdlg.cpp | 1342 ++ src/psigroupchatdlg.h | 124 + src/psigrowlnotifier.cpp | 98 + src/psigrowlnotifier.h | 59 + src/psihttpauthrequest.h | 19 + src/psiiconset.cpp | 654 + src/psiiconset.h | 96 + src/psilogger.cpp | 195 + src/psilogger.h | 59 + src/psinotifier.cpp | 281 + src/psinotifier.h | 50 + src/psinotifierbase.cpp | 32 + src/psinotifierbase.h | 47 + src/psioptions.cpp | 227 + src/psioptions.h | 59 + src/psioptionseditor.cpp | 262 + src/psioptionseditor.h | 47 + src/psiplugin.h | 173 + src/psipopup.cpp | 456 + src/psipopup.h | 77 + src/psiselfcontact.cpp | 67 + src/psiselfcontact.h | 42 + src/psitoolbar.cpp | 179 + src/psitoolbar.h | 65 + src/psitrayicon.cpp | 241 + src/psitrayicon.h | 54 + src/pubsubsubscription.cpp | 100 + src/pubsubsubscription.h | 53 + src/qwextend.cpp | 145 + src/qwextend.h | 12 + src/rc.cpp | 244 + src/rc.h | 69 + src/registrationdlg.cpp | 391 + src/registrationdlg.h | 61 + src/resourcemenu.cpp | 66 + src/resourcemenu.h | 44 + src/rosteritemexchangetask.cpp | 79 + src/rosteritemexchangetask.h | 48 + src/rtparse.cpp | 94 + src/rtparse.h | 44 + src/search.ui | 291 + src/searchdlg.cpp | 525 + src/searchdlg.h | 66 + src/serverinfomanager.cpp | 84 + src/serverinfomanager.h | 57 + src/serverlistquerier.cpp | 67 + src/serverlistquerier.h | 47 + src/shortcutmanager.cpp | 142 + src/shortcutmanager.h | 27 + src/showtextdlg.cpp | 62 + src/showtextdlg.h | 33 + src/src.pri | 544 + src/src.pro | 218 + src/sslcert.ui | 190 + src/sslcertdlg.cpp | 123 + src/sslcertdlg.h | 46 + src/statusdlg.cpp | 294 + src/statusdlg.h | 68 + src/statusmenu.cpp | 87 + src/statusmenu.h | 51 + src/statuspreset.cpp | 129 + src/statuspreset.h | 59 + src/systeminfo.cpp | 198 + src/systeminfo.h | 24 + src/tabcompletion.cpp | 246 + src/tabcompletion.h | 75 + src/tabcompletionmuc.h | 91 + src/tabs/tabbablewidget.cpp | 203 + src/tabs/tabbablewidget.h | 105 + src/tabs/tabdlg.cpp | 769 ++ src/tabs/tabdlg.h | 151 + src/tabs/tabmanager.cpp | 105 + src/tabs/tabmanager.h | 84 + src/tabs/tabs.pri | 12 + src/tasklist.h | 76 + src/textutil.cpp | 689 + src/textutil.h | 28 + src/tip.ui | 279 + src/tipdlg.cpp | 163 + src/tipdlg.h | 62 + src/tools/advwidget/advwidget.cpp | 704 ++ src/tools/advwidget/advwidget.h | 248 + src/tools/advwidget/advwidget.pri | 4 + src/tools/advwidget/movetest/main.cpp | 48 + src/tools/advwidget/movetest/test.pro | 6 + .../animationhelpers/animationhelpers.pri | 8 + src/tools/animationhelpers/customtimeline.cpp | 156 + src/tools/animationhelpers/customtimeline.h | 132 + src/tools/atomicxmlfile/atomicxmlfile.cpp | 145 + src/tools/atomicxmlfile/atomicxmlfile.h | 45 + src/tools/atomicxmlfile/atomicxmlfile.pri | 8 + src/tools/breakpad/breakpad.cpp | 192 + src/tools/breakpad/breakpad.h | 53 + src/tools/breakpad/breakpad.pri | 37 + src/tools/carboncocoa/carboncocoa.h | 26 + src/tools/carboncocoa/carboncocoa.m | 39 + src/tools/carboncocoa/carboncocoa.pri | 7 + src/tools/crash/crash.cpp | 32 + src/tools/crash/crash.h | 12 + src/tools/crash/crash.pri | 21 + src/tools/crash/crash_dummy.cpp | 9 + src/tools/crash/crash_kde.cpp | 12 + src/tools/crash/crash_sigsegv.cpp | 248 + src/tools/crash/crash_sigsegv.h | 49 + src/tools/cutejson/cutejson.cpp | 95 + src/tools/cutejson/cutejson.h | 34 + src/tools/cutejson/cutejson.pri | 5 + src/tools/globalshortcut/NDKeyboardLayout.h | 123 + src/tools/globalshortcut/NDKeyboardLayout.m | 453 + src/tools/globalshortcut/globalshortcut.pri | 18 + .../globalshortcut/globalshortcutmanager.cpp | 94 + .../globalshortcut/globalshortcutmanager.h | 47 + .../globalshortcutmanager_mac.mm | 301 + .../globalshortcutmanager_win.cpp | 203 + .../globalshortcutmanager_x11.cpp | 437 + .../globalshortcut/globalshortcuttrigger.h | 61 + .../grepshortcutkeydlg/grepshortcutkeydlg.cpp | 112 + .../grepshortcutkeydlg/grepshortcutkeydlg.h | 59 + .../grepshortcutkeydlg/grepshortcutkeydlg.pri | 6 + .../grepshortcutkeydlg/grepshortcutkeydlg.ui | 77 + src/tools/growlnotifier/growlnotifier.h | 53 + src/tools/growlnotifier/growlnotifier.mm | 159 + src/tools/growlnotifier/growlnotifier.pri | 6 + src/tools/growlnotifier/growltest.cpp | 129 + src/tools/growlnotifier/growltest.pro | 6 + src/tools/httphelper/fileuploaddevice.cpp | 125 + src/tools/httphelper/fileuploaddevice.h | 57 + src/tools/httphelper/httphelper.cpp | 308 + src/tools/httphelper/httphelper.h | 100 + src/tools/httphelper/httphelper.pri | 10 + src/tools/iconset/ICONSET-HOWTO | 127 + src/tools/iconset/anim.cpp | 440 + src/tools/iconset/anim.h | 72 + src/tools/iconset/iconset.cpp | 1701 +++ src/tools/iconset/iconset.h | 254 + src/tools/iconset/iconset.pri | 10 + .../unittest/iconsets/emoticons/puz.jisp | Bin 0 -> 3752 bytes .../unittest/iconsets/roster/default.jisp | Bin 0 -> 10051 bytes .../unittest/iconsets/roster/small.jisp | Bin 0 -> 2323 bytes .../iconsets/system/crystal_system.jisp | Bin 0 -> 75156 bytes src/tools/iconset/unittest/testiconset.cpp | 198 + src/tools/iconset/unittest/testiconset.pro | 23 + src/tools/idle/idle.cpp | 140 + src/tools/idle/idle.h | 65 + src/tools/idle/idle.pri | 14 + src/tools/idle/idle_mac.cpp | 59 + src/tools/idle/idle_win.cpp | 108 + src/tools/idle/idle_x11.cpp | 98 + src/tools/idle/win32/idleui.cpp | 175 + src/tools/idle/win32/idleui.def | 7 + src/tools/idle/win32/idleui.dll | Bin 0 -> 24576 bytes src/tools/idle/win32/idleui.h | 23 + src/tools/mac_dock/docktest.cpp | 80 + src/tools/mac_dock/docktest.pro | 6 + src/tools/mac_dock/mac_dock.h | 14 + src/tools/mac_dock/mac_dock.mm | 25 + src/tools/mac_dock/mac_dock.pri | 4 + .../optionstree/optionstest/optionstest.cpp | 71 + .../optionstree/optionstest/optionstest.pro | 8 + src/tools/optionstree/optionstree.cpp | 265 + src/tools/optionstree/optionstree.h | 75 + src/tools/optionstree/optionstree.pri | 13 + src/tools/optionstree/optionstreemodel.cpp | 318 + src/tools/optionstree/optionstreemodel.h | 79 + .../optionstreeviewtest.cpp | 48 + .../optionstreeviewtest.pro | 7 + src/tools/optionstree/varianttree.cpp | 549 + src/tools/optionstree/varianttree.h | 94 + src/tools/simplecli/simplecli.cpp | 249 + src/tools/simplecli/simplecli.h | 62 + src/tools/simplecli/simplecli.pri | 4 + src/tools/slickwidgets/m11edit.cpp | 113 + src/tools/slickwidgets/m11edit.h | 53 + src/tools/slickwidgets/m11editablelabel.cpp | 122 + src/tools/slickwidgets/m11editablelabel.h | 71 + src/tools/slickwidgets/slickwidgets.pri | 14 + src/tools/slickwidgets/utils.cpp | 108 + src/tools/slickwidgets/utils.h | 55 + src/tools/smoothscrollbar/form.ui | 233 + src/tools/smoothscrollbar/smoothscrollbar.cpp | 209 + src/tools/smoothscrollbar/smoothscrollbar.h | 84 + src/tools/smoothscrollbar/smoothscrollbar.pri | 8 + .../smoothscrollbar/smoothscrollbartest.pro | 25 + .../smoothscrollbartestmain.cpp | 37 + src/tools/sparkle/sparkle.h | 28 + src/tools/sparkle/sparkle.mm | 56 + src/tools/sparkle/sparkle.pri | 10 + src/tools/spellchecker/aspellchecker.cpp | 116 + src/tools/spellchecker/aspellchecker.h | 54 + src/tools/spellchecker/macspellchecker.h | 56 + src/tools/spellchecker/macspellchecker.mm | 132 + src/tools/spellchecker/privateqt_mac.h | 92 + src/tools/spellchecker/privateqt_mac.mm | 71 + src/tools/spellchecker/spellchecker.cpp | 185 + src/tools/spellchecker/spellchecker.h | 74 + src/tools/spellchecker/spellchecker.pri | 28 + .../spellchecker/spellcheckingtextedit.cpp | 219 + .../spellchecker/spellcheckingtextedit.h | 140 + src/tools/spellchecker/spellhighlighter.cpp | 26 + src/tools/spellchecker/spellhighlighter.h | 16 + src/tools/spellchecker/yandexspeller.cpp | 249 + src/tools/spellchecker/yandexspeller.h | 84 + src/tools/svgstreamviewer/main.cpp | 35 + src/tools/svgstreamviewer/mainwindow.cpp | 107 + src/tools/svgstreamviewer/mainwindow.h | 48 + .../svgstreamviewer/svgstreamrenderer.cpp | 225 + src/tools/svgstreamviewer/svgstreamrenderer.h | 50 + src/tools/svgstreamviewer/svgstreamviewer.pro | 13 + src/tools/svgstreamviewer/svgstreamwidget.cpp | 66 + src/tools/svgstreamviewer/svgstreamwidget.h | 51 + src/tools/systemwatch/systemwatch.cpp | 51 + src/tools/systemwatch/systemwatch.h | 45 + src/tools/systemwatch/systemwatch.pri | 17 + src/tools/systemwatch/systemwatch_mac.cpp | 89 + src/tools/systemwatch/systemwatch_mac.h | 37 + src/tools/systemwatch/systemwatch_unix.cpp | 25 + src/tools/systemwatch/systemwatch_unix.h | 33 + src/tools/systemwatch/systemwatch_win.cpp | 130 + src/tools/systemwatch/systemwatch_win.h | 18 + src/tools/trayicon/trayicon.cpp | 296 + src/tools/trayicon/trayicon.h | 99 + src/tools/trayicon/trayicon.pri | 14 + src/tools/trayicon/trayicon_mac.cpp | 17 + src/tools/trayicon/trayicon_win.cpp | 243 + src/tools/trayicon/trayicon_x11.cpp | 436 + .../tunecontroller/combinedtunecontroller.cpp | 56 + .../tunecontroller/combinedtunecontroller.h | 41 + .../tunecontroller/filetunecontroller.cpp | 68 + src/tools/tunecontroller/filetunecontroller.h | 39 + .../plugins/itunes/itunescontroller.cpp | 107 + .../plugins/itunes/itunescontroller.h | 21 + .../plugins/itunes/itunesplugin.cpp | 54 + .../plugins/psifile/psifilecontroller.cpp | 37 + .../plugins/psifile/psifilecontroller.h | 33 + .../plugins/psifile/psifileplugin.cpp | 34 + .../plugins/psifile/psifileplugin.h | 51 + .../plugins/winamp/third-party/wa_ipc.h | 1023 ++ .../plugins/winamp/winampcontroller.cpp | 196 + .../plugins/winamp/winampcontroller.h | 49 + .../plugins/winamp/winampplugin.cpp | 35 + .../plugins/winamp/winampplugin.h | 46 + .../plugins/xmms/xmmscontroller.cpp | 53 + .../plugins/xmms/xmmscontroller.h | 35 + .../plugins/xmms/xmmsplugin.cpp | 52 + .../tunecontroller/pollingtunecontroller.cpp | 72 + .../tunecontroller/pollingtunecontroller.h | 45 + src/tools/tunecontroller/src.pro | 20 + src/tools/tunecontroller/tune.h | 83 + src/tools/tunecontroller/tunecontroller.h | 52 + src/tools/tunecontroller/tunecontroller.pri | 84 + .../tunecontroller/tunecontrollerinterface.h | 28 + .../tunecontroller/tunecontrollermanager.cpp | 121 + .../tunecontroller/tunecontrollermanager.h | 51 + .../tunecontroller/tunecontrollerplugin.h | 51 + src/tools/yastuff/.gitignore | 1 + src/tools/yastuff/delayedvariable.h | 64 + src/tools/yastuff/delayedvariablebase.cpp | 57 + src/tools/yastuff/delayedvariablebase.h | 52 + src/tools/yastuff/fakegroupcontact.cpp | 102 + src/tools/yastuff/fakegroupcontact.h | 53 + .../iconsets/emoticons/yaemomidget/angel.gif | Bin 0 -> 1030 bytes .../iconsets/emoticons/yaemomidget/beer.png | Bin 0 -> 799 bytes .../iconsets/emoticons/yaemomidget/blush.gif | Bin 0 -> 940 bytes .../iconsets/emoticons/yaemomidget/bomb.gif | Bin 0 -> 800 bytes .../iconsets/emoticons/yaemomidget/boyan1.png | Bin 0 -> 508 bytes .../iconsets/emoticons/yaemomidget/boyan2.png | Bin 0 -> 988 bytes .../iconsets/emoticons/yaemomidget/boyan3.png | Bin 0 -> 714 bytes .../emoticons/yaemomidget/brainsucker.gif | Bin 0 -> 950 bytes .../emoticons/yaemomidget/brokenheart.gif | Bin 0 -> 719 bytes .../iconsets/emoticons/yaemomidget/cake.gif | Bin 0 -> 933 bytes .../iconsets/emoticons/yaemomidget/cup.gif | Bin 0 -> 586 bytes .../iconsets/emoticons/yaemomidget/earth.gif | Bin 0 -> 912 bytes .../iconsets/emoticons/yaemomidget/evil.gif | Bin 0 -> 965 bytes .../emoticons/yaemomidget/glasses.gif | Bin 0 -> 962 bytes .../iconsets/emoticons/yaemomidget/hmm.png | Bin 0 -> 780 bytes .../emoticons/yaemomidget/icondef.xml | 442 + .../iconsets/emoticons/yaemomidget/idea.gif | Bin 0 -> 602 bytes .../iconsets/emoticons/yaemomidget/jabber.png | Bin 0 -> 1421 bytes .../iconsets/emoticons/yaemomidget/kiss.png | Bin 0 -> 844 bytes .../iconsets/emoticons/yaemomidget/lol.gif | Bin 0 -> 869 bytes .../iconsets/emoticons/yaemomidget/love.gif | Bin 0 -> 955 bytes .../iconsets/emoticons/yaemomidget/mad.gif | Bin 0 -> 858 bytes .../iconsets/emoticons/yaemomidget/mail.png | Bin 0 -> 544 bytes .../iconsets/emoticons/yaemomidget/money.png | Bin 0 -> 1016 bytes .../iconsets/emoticons/yaemomidget/moon.png | Bin 0 -> 553 bytes .../iconsets/emoticons/yaemomidget/music.gif | Bin 0 -> 619 bytes .../iconsets/emoticons/yaemomidget/no.gif | Bin 0 -> 1293 bytes .../iconsets/emoticons/yaemomidget/phone.png | Bin 0 -> 1016 bytes .../iconsets/emoticons/yaemomidget/rain.gif | Bin 0 -> 587 bytes .../iconsets/emoticons/yaemomidget/rose.gif | Bin 0 -> 1168 bytes .../iconsets/emoticons/yaemomidget/sad.gif | Bin 0 -> 925 bytes .../emoticons/yaemomidget/sad_wink.gif | Bin 0 -> 980 bytes .../iconsets/emoticons/yaemomidget/sick.gif | Bin 0 -> 773 bytes .../iconsets/emoticons/yaemomidget/smile.gif | Bin 0 -> 941 bytes .../iconsets/emoticons/yaemomidget/snow.gif | Bin 0 -> 694 bytes .../iconsets/emoticons/yaemomidget/star.png | Bin 0 -> 717 bytes .../iconsets/emoticons/yaemomidget/sun.gif | Bin 0 -> 667 bytes .../iconsets/emoticons/yaemomidget/tired.gif | Bin 0 -> 851 bytes .../iconsets/emoticons/yaemomidget/tongue.gif | Bin 0 -> 883 bytes .../iconsets/emoticons/yaemomidget/tss.gif | Bin 0 -> 985 bytes .../iconsets/emoticons/yaemomidget/wait.png | Bin 0 -> 986 bytes .../iconsets/emoticons/yaemomidget/wet.gif | Bin 0 -> 733 bytes .../iconsets/emoticons/yaemomidget/wink.gif | Bin 0 -> 868 bytes .../iconsets/emoticons/yaemomidget/woot.gif | Bin 0 -> 879 bytes .../iconsets/emoticons/yaemomidget/worry.png | Bin 0 -> 851 bytes .../iconsets/emoticons/yaemomidget/yes.gif | Bin 0 -> 1258 bytes .../iconsets/roster/default/gc-available.png | Bin 0 -> 121 bytes .../iconsets/roster/default/gc-fav.png | Bin 0 -> 338 bytes .../roster/default/gc-unavailable.png | Bin 0 -> 121 bytes .../iconsets/roster/default/icon-away.png | Bin 0 -> 185 bytes .../iconsets/roster/default/icon-busy.png | Bin 0 -> 195 bytes .../roster/default/icon-invisible.png | Bin 0 -> 215 bytes .../iconsets/roster/default/icon-lock.png | Bin 0 -> 239 bytes .../iconsets/roster/default/icon-offline.png | Bin 0 -> 192 bytes .../iconsets/roster/default/icon-online.png | Bin 0 -> 192 bytes .../iconsets/roster/default/icon-warning.png | Bin 0 -> 201 bytes .../iconsets/roster/default/icondef.xml | 66 + .../iconsets/roster/roster-big/away.png | Bin 0 -> 242 bytes .../iconsets/roster/roster-big/dnd.png | Bin 0 -> 232 bytes .../iconsets/roster/roster-big/icondef.xml | 56 + .../iconsets/roster/roster-big/invisible.png | Bin 0 -> 242 bytes .../iconsets/roster/roster-big/lock.png | Bin 0 -> 264 bytes .../iconsets/roster/roster-big/offline.png | Bin 0 -> 248 bytes .../iconsets/roster/roster-big/online.png | Bin 0 -> 230 bytes .../iconsets/roster/roster-big/warning.png | Bin 0 -> 245 bytes src/tools/yastuff/images/addcontact.png | Bin 0 -> 280 bytes src/tools/yastuff/images/addcontactok.png | Bin 0 -> 190 bytes .../yastuff/images/addcontactok_over.png | Bin 0 -> 415 bytes src/tools/yastuff/images/avatars/avatar01.png | Bin 0 -> 17293 bytes src/tools/yastuff/images/avatars/avatar02.png | Bin 0 -> 17855 bytes src/tools/yastuff/images/avatars/avatar03.png | Bin 0 -> 19975 bytes src/tools/yastuff/images/avatars/avatar04.png | Bin 0 -> 20286 bytes src/tools/yastuff/images/avatars/avatar05.png | Bin 0 -> 12279 bytes src/tools/yastuff/images/avatars/avatar06.png | Bin 0 -> 15116 bytes src/tools/yastuff/images/avatars/avatar07.png | Bin 0 -> 11481 bytes src/tools/yastuff/images/avatars/avatar08.png | Bin 0 -> 12410 bytes src/tools/yastuff/images/avatars/avatar09.png | Bin 0 -> 11737 bytes src/tools/yastuff/images/avatars/avatar10.png | Bin 0 -> 11216 bytes src/tools/yastuff/images/avatars/avatar11.png | Bin 0 -> 10741 bytes src/tools/yastuff/images/avatars/avatar12.png | Bin 0 -> 11259 bytes src/tools/yastuff/images/avatars/avatar13.png | Bin 0 -> 10861 bytes src/tools/yastuff/images/avatars/avatar14.png | Bin 0 -> 11655 bytes src/tools/yastuff/images/avatars/avatar15.png | Bin 0 -> 10121 bytes src/tools/yastuff/images/avatars/avatar16.png | Bin 0 -> 11178 bytes src/tools/yastuff/images/avatars/avatar17.png | Bin 0 -> 5438 bytes src/tools/yastuff/images/avatars/avatar18.png | Bin 0 -> 5318 bytes src/tools/yastuff/images/avatars/avatar19.png | Bin 0 -> 2791 bytes src/tools/yastuff/images/avatars/avatar20.png | Bin 0 -> 10106 bytes src/tools/yastuff/images/avatars/avatar21.png | Bin 0 -> 6291 bytes src/tools/yastuff/images/avatars/avatar22.png | Bin 0 -> 8959 bytes src/tools/yastuff/images/avatars/avatar23.png | Bin 0 -> 11467 bytes src/tools/yastuff/images/avatars/avatar24.png | Bin 0 -> 7361 bytes .../yastuff/images/balloon/mood/arrow.png | Bin 0 -> 404 bytes .../images/balloon/mood/bottom_center.png | Bin 0 -> 109 bytes .../images/balloon/mood/bottom_left.png | Bin 0 -> 263 bytes .../images/balloon/mood/bottom_right.png | Bin 0 -> 266 bytes .../images/balloon/mood/middle_center.png | Bin 0 -> 85 bytes .../images/balloon/mood/middle_left.png | Bin 0 -> 109 bytes .../images/balloon/mood/middle_right.png | Bin 0 -> 107 bytes .../images/balloon/mood/top_center.png | Bin 0 -> 118 bytes .../yastuff/images/balloon/mood/top_left.png | Bin 0 -> 275 bytes .../yastuff/images/balloon/mood/top_right.png | Bin 0 -> 278 bytes .../images/balloon/mood_editing/arrow.png | Bin 0 -> 399 bytes .../balloon/mood_editing/bottom_center.png | Bin 0 -> 104 bytes .../balloon/mood_editing/bottom_left.png | Bin 0 -> 263 bytes .../balloon/mood_editing/bottom_right.png | Bin 0 -> 238 bytes .../balloon/mood_editing/middle_center.png | Bin 0 -> 88 bytes .../balloon/mood_editing/middle_left.png | Bin 0 -> 101 bytes .../balloon/mood_editing/middle_right.png | Bin 0 -> 101 bytes .../balloon/mood_editing/top_center.png | Bin 0 -> 104 bytes .../images/balloon/mood_editing/top_left.png | Bin 0 -> 259 bytes .../images/balloon/mood_editing/top_right.png | Bin 0 -> 263 bytes src/tools/yastuff/images/busy/0.png | Bin 0 -> 270 bytes src/tools/yastuff/images/busy/1.png | Bin 0 -> 543 bytes src/tools/yastuff/images/busy/2.png | Bin 0 -> 553 bytes src/tools/yastuff/images/busy/3.png | Bin 0 -> 542 bytes src/tools/yastuff/images/busy/4.png | Bin 0 -> 536 bytes src/tools/yastuff/images/busy/5.png | Bin 0 -> 521 bytes src/tools/yastuff/images/busy/6.png | Bin 0 -> 522 bytes src/tools/yastuff/images/chat/button.png | Bin 0 -> 216 bytes .../yastuff/images/chat/button_pressed.png | Bin 0 -> 224 bytes .../images/chat/button_pressed_background.png | Bin 0 -> 184 bytes .../yastuff/images/chat/closetab_button/1.png | Bin 0 -> 232 bytes .../yastuff/images/chat/closetab_button/2.png | Bin 0 -> 269 bytes .../yastuff/images/chat/closetab_button/3.png | Bin 0 -> 290 bytes .../yastuff/images/chat/closetab_button/4.png | Bin 0 -> 289 bytes .../yastuff/images/chat/closetab_button/5.png | Bin 0 -> 302 bytes .../yastuff/images/chat/closetab_button/6.png | Bin 0 -> 297 bytes .../yastuff/images/chat/closetab_button/7.png | Bin 0 -> 283 bytes .../images/chat/composing/keyboard.png | Bin 0 -> 503 bytes .../images/chat/composing/keys0001.png | Bin 0 -> 104 bytes .../images/chat/composing/keys0002.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0003.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0004.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0005.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0006.png | Bin 0 -> 104 bytes .../images/chat/composing/keys0007.png | Bin 0 -> 104 bytes .../images/chat/composing/keys0008.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0009.png | Bin 0 -> 105 bytes .../images/chat/composing/keys0010.png | Bin 0 -> 104 bytes .../images/chat/composing/keys0011.png | Bin 0 -> 105 bytes .../chat/delivery_confirmation_fail.png | Bin 0 -> 95 bytes .../images/chat/delivery_confirmation_ok.png | Bin 0 -> 142 bytes .../delivery_confirmation_server_fail.png | Bin 0 -> 152 bytes .../chat/delivery_confirmation_server_ok.png | Bin 0 -> 157 bytes .../images/chat/emoticon_background.png | Bin 0 -> 146 bytes .../yastuff/images/chat/emoticon_overlay.png | Bin 0 -> 908 bytes .../images/chat/emoticon_overlay_hover.png | Bin 0 -> 905 bytes src/tools/yastuff/images/chat/fader.png | Bin 0 -> 100 bytes .../yastuff/images/chat/info_button/0.png | Bin 0 -> 223 bytes .../yastuff/images/chat/info_button/1.png | Bin 0 -> 207 bytes .../yastuff/images/chat/info_button/2.png | Bin 0 -> 241 bytes .../yastuff/images/chat/info_button/3.png | Bin 0 -> 258 bytes .../yastuff/images/chat/info_button/4.png | Bin 0 -> 256 bytes .../yastuff/images/chat/info_button/5.png | Bin 0 -> 269 bytes .../yastuff/images/chat/info_button/6.png | Bin 0 -> 270 bytes .../yastuff/images/chat/info_button/7.png | Bin 0 -> 266 bytes .../images/chat/profile_background.png | Bin 0 -> 206 bytes .../chat/profile_background_academic.png | Bin 0 -> 212 bytes .../yastuff/images/chat/send_button/send.png | Bin 0 -> 525 bytes .../images/chat/send_button/send_disabled.png | Bin 0 -> 469 bytes .../images/chat/send_button/send_hover.png | Bin 0 -> 521 bytes .../images/chat/send_button/send_pressed.png | Bin 0 -> 497 bytes src/tools/yastuff/images/chat/smile.png | Bin 0 -> 503 bytes .../yastuff/images/chat/sprite-16x16.png | Bin 0 -> 2988 bytes src/tools/yastuff/images/chat/tab_active.png | Bin 0 -> 99 bytes .../yastuff/images/chat/tab_inactive.png | Bin 0 -> 120 bytes .../yastuff/images/chat/tooltip_area.png | Bin 0 -> 1130 bytes .../yastuff/images/chat/typo_disabled.png | Bin 0 -> 408 bytes .../images/chat/typo_disabled_hover.png | Bin 0 -> 463 bytes .../yastuff/images/chat/typo_enabled.png | Bin 0 -> 228 bytes .../images/chat/typo_enabled_hover.png | Bin 0 -> 259 bytes src/tools/yastuff/images/chat/upload.png | Bin 0 -> 465 bytes src/tools/yastuff/images/chat_send.png | Bin 0 -> 1115 bytes src/tools/yastuff/images/chat_windowicon.png | Bin 0 -> 607 bytes .../yastuff/images/chat_windowicon32.png | Bin 0 -> 1012 bytes src/tools/yastuff/images/checkbox_checked.png | Bin 0 -> 315 bytes .../images/checkbox_checked_disabled.png | Bin 0 -> 296 bytes .../yastuff/images/checkbox_checked_hover.png | Bin 0 -> 315 bytes .../images/checkbox_checked_pressed.png | Bin 0 -> 315 bytes .../yastuff/images/checkbox_unchecked.png | Bin 0 -> 200 bytes .../images/checkbox_unchecked_disabled.png | Bin 0 -> 173 bytes .../images/checkbox_unchecked_hover.png | Bin 0 -> 331 bytes .../images/checkbox_unchecked_pressed.png | Bin 0 -> 331 bytes src/tools/yastuff/images/chevron.png | Bin 0 -> 167 bytes src/tools/yastuff/images/chevron_blinking.png | Bin 0 -> 167 bytes src/tools/yastuff/images/chevron_pressed.png | Bin 0 -> 169 bytes src/tools/yastuff/images/closetab.png | Bin 0 -> 160 bytes src/tools/yastuff/images/closetab_chat.png | Bin 0 -> 160 bytes src/tools/yastuff/images/closetab_hover.png | Bin 0 -> 160 bytes src/tools/yastuff/images/closetab_pressed.png | Bin 0 -> 160 bytes src/tools/yastuff/images/down-arrow/hover.png | Bin 0 -> 110 bytes .../yastuff/images/down-arrow/normal.png | Bin 0 -> 112 bytes .../yastuff/images/down-arrow/pressed.png | Bin 0 -> 112 bytes src/tools/yastuff/images/down_arrow.png | Bin 0 -> 112 bytes .../yastuff/images/down_arrow_disabled.png | Bin 0 -> 174 bytes src/tools/yastuff/images/envelope_overlay.png | Bin 0 -> 144 bytes .../yastuff/images/eventnotifier_close.png | Bin 0 -> 397 bytes .../images/eventnotifier_close_informer.png | Bin 0 -> 367 bytes src/tools/yastuff/images/expand_closed.png | Bin 0 -> 192 bytes src/tools/yastuff/images/expand_opened.png | Bin 0 -> 220 bytes src/tools/yastuff/images/filter.png | Bin 0 -> 636 bytes .../yastuff/images/gender/default_avatar.png | Bin 0 -> 2195 bytes .../images/gender/default_multiple_avatar.png | Bin 0 -> 2690 bytes src/tools/yastuff/images/gender/gm.gif | Bin 0 -> 210 bytes src/tools/yastuff/images/gender/gn.gif | Bin 0 -> 199 bytes src/tools/yastuff/images/gender/gw.gif | Bin 0 -> 199 bytes src/tools/yastuff/images/group/background.png | Bin 0 -> 93 bytes .../yastuff/images/group/closed_hover.png | Bin 0 -> 163 bytes .../yastuff/images/group/closed_normal.png | Bin 0 -> 157 bytes src/tools/yastuff/images/group/open_hover.png | Bin 0 -> 165 bytes .../yastuff/images/group/open_normal.png | Bin 0 -> 160 bytes .../images/groupchat/edit_locked_idle.png | Bin 0 -> 418 bytes .../images/groupchat/edit_unlocked_hover.png | Bin 0 -> 360 bytes .../images/groupchat/edit_unlocked_idle.png | Bin 0 -> 364 bytes .../yastuff/images/groupchat/fav_hover.png | Bin 0 -> 427 bytes .../yastuff/images/groupchat/fav_idle.png | Bin 0 -> 392 bytes .../yastuff/images/groupchat/fav_pressed.png | Bin 0 -> 510 bytes .../yastuff/images/groupchat/gc-available.png | Bin 0 -> 741 bytes .../images/groupchat/join-close-hover.png | Bin 0 -> 268 bytes .../yastuff/images/groupchat/join-close.png | Bin 0 -> 213 bytes .../yastuff/images/groupchat/join-icon.png | Bin 0 -> 798 bytes .../images/groupchat/join-lineedit.png | Bin 0 -> 134 bytes .../images/groupchat/join-lineedit2.png | Bin 0 -> 137 bytes .../yastuff/images/groupchat/join-locked.png | Bin 0 -> 181 bytes .../images/groupchat/join-unlocked.png | Bin 0 -> 183 bytes .../yastuff/images/groupchat/occupants.png | Bin 0 -> 372 bytes .../yastuff/images/groupchat/splitter.png | Bin 0 -> 209 bytes src/tools/yastuff/images/jabber.png | Bin 0 -> 237 bytes src/tools/yastuff/images/mail.png | Bin 0 -> 3069 bytes .../main-window/connecting_animation.gif | Bin 0 -> 17620 bytes .../contact-list/bottom_center.png | Bin 0 -> 120 bytes .../main-window/contact-list/bottom_left.png | Bin 0 -> 142 bytes .../main-window/contact-list/bottom_right.png | Bin 0 -> 120 bytes .../contact-list/middle_center.png | Bin 0 -> 82 bytes .../main-window/contact-list/middle_left.png | Bin 0 -> 78 bytes .../main-window/contact-list/middle_right.png | Bin 0 -> 78 bytes .../main-window/contact-list/top_center.png | Bin 0 -> 81 bytes .../main-window/contact-list/top_left.png | Bin 0 -> 87 bytes .../main-window/contact-list/top_right.png | Bin 0 -> 90 bytes .../images/main-window/error_animation.gif | Bin 0 -> 1064 bytes src/tools/yastuff/images/no-contacts/yaru.png | Bin 0 -> 951 bytes src/tools/yastuff/images/okbutton.png | Bin 0 -> 170 bytes src/tools/yastuff/images/okbutton_pressed.png | Bin 0 -> 170 bytes .../images/pushbutton/cancel/cancel_hover.png | Bin 0 -> 913 bytes .../images/pushbutton/cancel/cancel_idle.png | Bin 0 -> 896 bytes .../pushbutton/cancel/cancel_pressed.png | Bin 0 -> 898 bytes .../images/pushbutton/green/pushbutton.png | Bin 0 -> 981 bytes .../pushbutton/green/pushbutton_hover.png | Bin 0 -> 914 bytes .../pushbutton/green/pushbutton_pressed.png | Bin 0 -> 918 bytes .../yastuff/images/pushbutton/ok/ok_hover.png | Bin 0 -> 879 bytes .../yastuff/images/pushbutton/ok/ok_idle.png | Bin 0 -> 871 bytes .../images/pushbutton/ok/ok_pressed.png | Bin 0 -> 856 bytes .../pushbutton/preferences_tab/pushbutton.png | Bin 0 -> 174 bytes .../preferences_tab/pushbutton_hover.png | Bin 0 -> 169 bytes .../preferences_tab/pushbutton_pressed.png | Bin 0 -> 181 bytes .../images/pushbutton/red/pushbutton.png | Bin 0 -> 972 bytes .../pushbutton/red/pushbutton_hover.png | Bin 0 -> 920 bytes .../pushbutton/red/pushbutton_pressed.png | Bin 0 -> 936 bytes .../yastuff/images/radiobutton_checked.png | Bin 0 -> 487 bytes .../images/radiobutton_checked_hover.png | Bin 0 -> 487 bytes .../images/radiobutton_checked_pressed.png | Bin 0 -> 487 bytes .../yastuff/images/radiobutton_unchecked.png | Bin 0 -> 230 bytes .../images/radiobutton_unchecked_hover.png | Bin 0 -> 490 bytes .../images/radiobutton_unchecked_pressed.png | Bin 0 -> 490 bytes src/tools/yastuff/images/roster_lineedit.png | Bin 0 -> 180 bytes .../yastuff/images/rostertab_background.png | Bin 0 -> 132 bytes .../yastuff/images/rostertab_background2.png | Bin 0 -> 149 bytes .../images/rostertab_background_inactive.png | Bin 0 -> 131 bytes .../images/scrollbar/background_active.png | Bin 0 -> 434 bytes .../images/scrollbar/background_inactive.png | Bin 0 -> 397 bytes .../images/scrollbar/background_inactive2.png | Bin 0 -> 429 bytes .../yastuff/images/scrollbar/dbutton_idle.png | Bin 0 -> 188 bytes .../yastuff/images/scrollbar/dbutton_over.png | Bin 0 -> 373 bytes .../images/scrollbar/dbutton_pressed.png | Bin 0 -> 371 bytes .../yastuff/images/scrollbar/handle_idle.png | Bin 0 -> 565 bytes .../yastuff/images/scrollbar/handle_over.png | Bin 0 -> 1057 bytes .../images/scrollbar/handle_pressed.png | Bin 0 -> 1076 bytes .../yastuff/images/scrollbar/ubutton_idle.png | Bin 0 -> 182 bytes .../yastuff/images/scrollbar/ubutton_over.png | Bin 0 -> 355 bytes .../images/scrollbar/ubutton_pressed.png | Bin 0 -> 353 bytes src/tools/yastuff/images/sizegrip.png | Bin 0 -> 90 bytes src/tools/yastuff/images/spindown.png | Bin 0 -> 255 bytes src/tools/yastuff/images/spindown_hover.png | Bin 0 -> 251 bytes src/tools/yastuff/images/spindown_off.png | Bin 0 -> 218 bytes src/tools/yastuff/images/spindown_pressed.png | Bin 0 -> 232 bytes src/tools/yastuff/images/spinup.png | Bin 0 -> 239 bytes src/tools/yastuff/images/spinup_hover.png | Bin 0 -> 235 bytes src/tools/yastuff/images/spinup_off.png | Bin 0 -> 223 bytes src/tools/yastuff/images/spinup_pressed.png | Bin 0 -> 227 bytes src/tools/yastuff/images/trayicon/away.png | Bin 0 -> 830 bytes src/tools/yastuff/images/trayicon/dnd.png | Bin 0 -> 775 bytes src/tools/yastuff/images/trayicon/offline.png | Bin 0 -> 761 bytes src/tools/yastuff/images/trayicon/online.png | Bin 0 -> 771 bytes src/tools/yastuff/images/trayicon/problem.png | Bin 0 -> 804 bytes .../yastuff/images/trayicon/problem_away.png | Bin 0 -> 799 bytes .../yastuff/images/trayicon/problem_dnd.png | Bin 0 -> 746 bytes src/tools/yastuff/images/up_arrow.png | Bin 0 -> 171 bytes .../yastuff/images/up_arrow_disabled.png | Bin 0 -> 172 bytes .../images/user-actions/button_glyph_add.png | Bin 0 -> 693 bytes .../user-actions/button_glyph_block.png | Bin 0 -> 486 bytes .../user-actions/button_glyph_email.png | Bin 0 -> 1551 bytes .../user-actions/button_glyph_fotki.png | Bin 0 -> 606 bytes .../user-actions/button_glyph_history.png | Bin 0 -> 1843 bytes .../user-actions/button_glyph_profile.png | Bin 0 -> 870 bytes .../user-actions/button_glyph_remove.png | Bin 0 -> 611 bytes .../user-actions/button_glyph_rename.png | Bin 0 -> 488 bytes .../images/window/aa-corner/bottom_left.png | Bin 0 -> 100 bytes .../images/window/aa-corner/bottom_right.png | Bin 0 -> 101 bytes .../images/window/aa-corner/top_left.png | Bin 0 -> 134 bytes .../images/window/aa-corner/top_right.png | Bin 0 -> 132 bytes .../images/window/background/academic.png | Bin 0 -> 83 bytes .../images/window/background/baroque.png | Bin 0 -> 4521 bytes .../images/window/background/glamour.png | Bin 0 -> 10398 bytes .../images/window/background/hawaii.png | Bin 0 -> 8715 bytes .../yastuff/images/window/background/ice.png | Bin 0 -> 180 bytes .../window/background/logo/academic.png | Bin 0 -> 312 bytes .../images/window/background/logo/baroque.png | Bin 0 -> 312 bytes .../images/window/background/logo/glamour.png | Bin 0 -> 312 bytes .../images/window/background/logo/hawaii.png | Bin 0 -> 1565 bytes .../images/window/background/logo/ice.png | Bin 0 -> 312 bytes .../images/window/background/logo/sea.png | Bin 0 -> 312 bytes .../images/window/background/logo/sky.png | Bin 0 -> 312 bytes .../images/window/background/logo/spring.png | Bin 0 -> 1566 bytes .../images/window/background/logo/violet.png | Bin 0 -> 1560 bytes .../window/background/relief/glamour.png | Bin 0 -> 14283 bytes .../yastuff/images/window/background/sea.png | Bin 0 -> 218 bytes .../yastuff/images/window/background/sky.png | Bin 0 -> 187 bytes .../images/window/background/spring.png | Bin 0 -> 202 bytes .../images/window/background/violet.png | Bin 0 -> 173 bytes .../images/window/buttons/academic/close.png | Bin 0 -> 112 bytes .../images/window/buttons/academic/gear.png | Bin 0 -> 342 bytes .../window/buttons/academic/maximize.png | Bin 0 -> 93 bytes .../window/buttons/academic/minimize.png | Bin 0 -> 92 bytes .../images/window/buttons/black/close.png | Bin 0 -> 108 bytes .../images/window/buttons/glamour/close.png | Bin 0 -> 286 bytes .../images/window/buttons/glamour/gear.png | Bin 0 -> 901 bytes .../window/buttons/glamour/maximize.png | Bin 0 -> 414 bytes .../window/buttons/glamour/minimize.png | Bin 0 -> 213 bytes .../images/window/buttons/ice/close.png | Bin 0 -> 264 bytes .../images/window/buttons/ice/gear.png | Bin 0 -> 895 bytes .../images/window/buttons/ice/maximize.png | Bin 0 -> 418 bytes .../images/window/buttons/ice/minimize.png | Bin 0 -> 214 bytes .../images/window/buttons/normal/close.png | Bin 0 -> 108 bytes .../images/window/buttons/normal/gear.png | Bin 0 -> 294 bytes .../images/window/buttons/normal/maximize.png | Bin 0 -> 154 bytes .../images/window/buttons/normal/minimize.png | Bin 0 -> 88 bytes .../images/window/buttons/spring/close.png | Bin 0 -> 283 bytes .../images/window/buttons/spring/gear.png | Bin 0 -> 898 bytes .../images/window/buttons/spring/maximize.png | Bin 0 -> 411 bytes .../images/window/buttons/spring/minimize.png | Bin 0 -> 211 bytes .../window/online_expansion/academic.png | Bin 0 -> 397 bytes .../window/online_expansion/baroque.png | Bin 0 -> 397 bytes .../window/online_expansion/glamour.png | Bin 0 -> 409 bytes .../images/window/online_expansion/hawaii.png | Bin 0 -> 409 bytes .../images/window/online_expansion/ice.png | Bin 0 -> 442 bytes .../images/window/online_expansion/sea.png | Bin 0 -> 411 bytes .../images/window/online_expansion/sky.png | Bin 0 -> 442 bytes .../images/window/online_expansion/spring.png | Bin 0 -> 410 bytes .../images/window/online_expansion/violet.png | Bin 0 -> 410 bytes .../images/window/online_expansion_aa.png | Bin 0 -> 173 bytes .../images/window/online_expansion_mask.bmp | Bin 0 -> 464 bytes .../images/window/online_expansion_shadow.png | Bin 0 -> 538 bytes .../images/window/shadow/bottom_center.png | Bin 0 -> 103 bytes .../images/window/shadow/bottom_left.png | Bin 0 -> 304 bytes .../images/window/shadow/bottom_right.png | Bin 0 -> 317 bytes .../images/window/shadow/middle_center.png | Bin 0 -> 88 bytes .../images/window/shadow/middle_left.png | Bin 0 -> 108 bytes .../images/window/shadow/middle_right.png | Bin 0 -> 108 bytes .../images/window/shadow/top_center.png | Bin 0 -> 148 bytes .../yastuff/images/window/shadow/top_left.png | Bin 0 -> 366 bytes .../images/window/shadow/top_right.png | Bin 0 -> 428 bytes .../images/window/shadow2/bottom_center.png | Bin 0 -> 111 bytes .../images/window/shadow2/bottom_left.png | Bin 0 -> 604 bytes .../images/window/shadow2/bottom_right.png | Bin 0 -> 637 bytes .../images/window/shadow2/middle_center.png | Bin 0 -> 88 bytes .../images/window/shadow2/middle_left.png | Bin 0 -> 107 bytes .../images/window/shadow2/middle_right.png | Bin 0 -> 108 bytes .../images/window/shadow2/top_center.png | Bin 0 -> 110 bytes .../images/window/shadow2/top_left.png | Bin 0 -> 550 bytes .../images/window/shadow2/top_right.png | Bin 0 -> 624 bytes src/tools/yastuff/images/window/themes.xml | 83 + .../window/top_left_corner_mask_4px.bmp | Bin 0 -> 80 bytes .../window/top_left_corner_mask_6px.bmp | Bin 0 -> 88 bytes .../window/top_left_corner_mask_8px.bmp | Bin 0 -> 96 bytes src/tools/yastuff/images/windowicon_green.png | Bin 0 -> 771 bytes .../yastuff/images/windowicon_green32.png | Bin 0 -> 1762 bytes src/tools/yastuff/images/windowicon_red.png | Bin 0 -> 773 bytes src/tools/yastuff/images/windowicon_red32.png | Bin 0 -> 1739 bytes .../yastuff/images/windowicon_yellow.png | Bin 0 -> 762 bytes .../yastuff/images/windowicon_yellow32.png | Bin 0 -> 1714 bytes .../combinedsyntaxhighlighter.cpp | 53 + .../combinedsyntaxhighlighter.h | 56 + .../syntaxhighlighters/cpphighlighter.cpp | 183 + .../syntaxhighlighters/cpphighlighter.h | 44 + .../syntaxhighlighters/listhighlighter.cpp | 77 + .../syntaxhighlighters/listhighlighter.h | 37 + .../quotationhighlighter.cpp | 47 + .../syntaxhighlighters/quotationhighlighter.h | 37 + .../syntaxhighlighters/syntaxhighlighter.cpp | 83 + .../syntaxhighlighters/syntaxhighlighter.h | 79 + .../syntaxhighlighters/syntaxhighlighters.pri | 23 + .../yastuff/syntaxhighlighters/test/main.cpp | 67 + .../yastuff/syntaxhighlighters/test/test.pro | 21 + .../typographyhighlighter.cpp | 159 + .../typographyhighlighter.h | 54 + .../syntaxhighlighters/wikihighlighter.cpp | 93 + .../syntaxhighlighters/wikihighlighter.h | 40 + .../syntaxhighlighters/yaautoreplacer.cpp | 151 + .../syntaxhighlighters/yaautoreplacer.h | 60 + .../syntaxhighlighters/yaspellhighlighter.cpp | 70 + .../syntaxhighlighters/yaspellhighlighter.h | 46 + src/tools/yastuff/tostertest/main.cpp | 84 + src/tools/yastuff/tostertest/tostertest.pro | 18 + src/tools/yastuff/uitest/.gitignore | 2 + src/tools/yastuff/uitest/stylesheeteditor.cpp | 69 + src/tools/yastuff/uitest/stylesheeteditor.h | 49 + src/tools/yastuff/uitest/stylesheeteditor.ui | 105 + src/tools/yastuff/uitest/uitest.cpp | 53 + src/tools/yastuff/uitest/uitest.pro | 26 + src/tools/yastuff/yaabout.cpp | 107 + src/tools/yastuff/yaabout.h | 54 + src/tools/yastuff/yaabout.ui | 191 + src/tools/yastuff/yaaddcontacthelper.cpp | 330 + src/tools/yastuff/yaaddcontacthelper.h | 80 + src/tools/yastuff/yachatdialog.ui | 332 + src/tools/yastuff/yachatdlg.cpp | 488 + src/tools/yastuff/yachatdlg.h | 117 + src/tools/yastuff/yachatdlgshared.cpp | 168 + src/tools/yastuff/yachatdlgshared.h | 74 + src/tools/yastuff/yachattiplabel.cpp | 58 + src/tools/yastuff/yachattiplabel.h | 41 + src/tools/yastuff/yachattooltip.cpp | 92 + src/tools/yastuff/yachattooltip.h | 60 + src/tools/yastuff/yacommon.cpp | 879 ++ src/tools/yastuff/yacommon.h | 170 + .../yastuff/yacontactlistcontactsmodel.cpp | 72 + .../yastuff/yacontactlistcontactsmodel.h | 48 + src/tools/yastuff/yacontactlistmodel.cpp | 804 ++ src/tools/yastuff/yacontactlistmodel.h | 145 + .../yastuff/yacontactlistmodelselection.cpp | 192 + .../yastuff/yacontactlistmodelselection.h | 76 + src/tools/yastuff/yadayuse.cpp | 246 + src/tools/yastuff/yadayuse.h | 63 + src/tools/yastuff/yadebugconsole.cpp | 213 + src/tools/yastuff/yadebugconsole.h | 75 + src/tools/yastuff/yadebugconsole.ui | 283 + src/tools/yastuff/yaeventnotifier.cpp | 242 + src/tools/yastuff/yaeventnotifier.h | 99 + src/tools/yastuff/yaeventnotifier.ui | 268 + src/tools/yastuff/yaexception.cpp | 28 + src/tools/yastuff/yaexception.h | 30 + src/tools/yastuff/yagroupchatcombobox.cpp | 49 + src/tools/yastuff/yagroupchatcombobox.h | 45 + .../yastuff/yagroupchatcontactlistmenu.cpp | 164 + .../yastuff/yagroupchatcontactlistmenu.h | 67 + .../yastuff/yagroupchatcontactlistmodel.cpp | 226 + .../yastuff/yagroupchatcontactlistmodel.h | 88 + .../yastuff/yagroupchatcontactlistview.cpp | 181 + .../yastuff/yagroupchatcontactlistview.h | 71 + src/tools/yastuff/yagroupchatdialog.ui | 462 + src/tools/yastuff/yagroupchatdlg.cpp | 687 + src/tools/yastuff/yagroupchatdlg.h | 96 + src/tools/yastuff/yagroupchatroomlist.cpp | 227 + src/tools/yastuff/yagroupchatroomlist.h | 76 + src/tools/yastuff/yahistorycachemanager.cpp | 345 + src/tools/yastuff/yahistorycachemanager.h | 110 + src/tools/yastuff/yaiconsets.qrc | 71 + src/tools/yastuff/yainfo.ui | 592 + src/tools/yastuff/yainformersmodel.cpp | 51 + src/tools/yastuff/yainformersmodel.h | 40 + src/tools/yastuff/yaipc.cpp | 144 + src/tools/yastuff/yaipc.h | 37 + src/tools/yastuff/yaj2jtransport.cpp | 307 + src/tools/yastuff/yaj2jtransport.h | 74 + src/tools/yastuff/yalicense.cpp | 143 + src/tools/yastuff/yalicense.h | 54 + src/tools/yastuff/yalicense.ui | 60 + src/tools/yastuff/yalogeventsmanager.cpp | 231 + src/tools/yastuff/yalogeventsmanager.h | 75 + src/tools/yastuff/yaloginpage.cpp | 339 + src/tools/yastuff/yaloginpage.h | 82 + src/tools/yastuff/yaloginpage.ui | 235 + src/tools/yastuff/yamainwin.cpp | 1176 ++ src/tools/yastuff/yamainwin.h | 205 + src/tools/yastuff/yamainwindow.ui | 337 + src/tools/yastuff/yamrimtransport.cpp | 301 + src/tools/yastuff/yamrimtransport.h | 74 + src/tools/yastuff/yamucmanager.cpp | 177 + src/tools/yastuff/yamucmanager.h | 63 + src/tools/yastuff/yanaroddiskmanager.cpp | 721 ++ src/tools/yastuff/yanaroddiskmanager.h | 182 + src/tools/yastuff/yaonline.cpp | 1868 +++ src/tools/yastuff/yaonline.h | 250 + src/tools/yastuff/yaonlinemainwin.cpp | 955 ++ src/tools/yastuff/yaonlinemainwin.h | 203 + src/tools/yastuff/yaoptionsdialog.ui | 357 + src/tools/yastuff/yapddmanager.cpp | 212 + src/tools/yastuff/yapddmanager.h | 87 + src/tools/yastuff/yapopupnotification.cpp | 191 + src/tools/yastuff/yapopupnotification.h | 58 + src/tools/yastuff/yapreferences.cpp | 1029 ++ src/tools/yastuff/yapreferences.h | 119 + src/tools/yastuff/yapreferences.ui | 707 ++ src/tools/yastuff/yaprivacymanager.cpp | 282 + src/tools/yastuff/yaprivacymanager.h | 82 + src/tools/yastuff/yaprofile.cpp | 243 + src/tools/yastuff/yaprofile.h | 105 + src/tools/yastuff/yapsi.qss | 623 + src/tools/yastuff/yapsiserver.cpp | 590 + src/tools/yastuff/yapsiserver.h | 205 + .../yaremoveconfirmationmessagebox.cpp | 310 + .../yastuff/yaremoveconfirmationmessagebox.h | 126 + src/tools/yastuff/yaroster.cpp | 2820 +++++ src/tools/yastuff/yaroster.h | 248 + src/tools/yastuff/yarostertiplabel.cpp | 925 ++ src/tools/yastuff/yarostertiplabel.h | 196 + src/tools/yastuff/yarostertiplabel.ui | 579 + src/tools/yastuff/yarostertoolbutton.cpp | 202 + src/tools/yastuff/yarostertoolbutton.h | 78 + src/tools/yastuff/yarostertooltip.cpp | 243 + src/tools/yastuff/yarostertooltip.h | 105 + src/tools/yastuff/yastuff.pri | 163 + src/tools/yastuff/yastuff.qrc | 363 + src/tools/yastuff/yastyle.cpp | 412 + src/tools/yastuff/yastyle.h | 67 + src/tools/yastuff/yatabbednotifier.cpp | 68 + src/tools/yastuff/yatabbednotifier.h | 44 + src/tools/yastuff/yatoastercentral.cpp | 116 + src/tools/yastuff/yatoastercentral.h | 71 + src/tools/yastuff/yatokenauth.cpp | 184 + src/tools/yastuff/yatokenauth.h | 84 + src/tools/yastuff/yatoster.cpp | 253 + src/tools/yastuff/yatoster.h | 86 + src/tools/yastuff/yatransportmanager.cpp | 408 + src/tools/yastuff/yatransportmanager.h | 132 + src/tools/yastuff/yatrayicon.cpp | 175 + src/tools/yastuff/yatrayicon.h | 69 + src/tools/yastuff/yaunreadmessagesmanager.cpp | 135 + src/tools/yastuff/yaunreadmessagesmanager.h | 75 + .../yawidgets/accountinformerdelegate.cpp | 314 + .../yawidgets/accountinformerdelegate.h | 82 + .../yawidgets/accountinformermodel.cpp | 317 + .../yastuff/yawidgets/accountinformermodel.h | 96 + .../accountinformertest.pro | 40 + .../accountinformertest.ui | 57 + .../accountinformertestmain.cpp | 67 + .../accountinformertest/testmodel.cpp | 23 + .../yawidgets/accountinformertest/testmodel.h | 20 + .../yastuff/yawidgets/accountinformerview.cpp | 345 + .../yastuff/yawidgets/accountinformerview.h | 87 + .../animatedstackedwidget.cpp | 259 + .../animatedstackedwidget.h | 108 + .../animatedstackedwidgettest.pro | 30 + .../animatedstackedwidgettest.ui | 152 + .../animatedstackedwidgettestmain.cpp | 38 + .../baseanimatedstackedwidget.cpp | 169 + .../baseanimatedstackedwidget.h | 96 + .../yastuff/yawidgets/borderrenderer.cpp | 286 + src/tools/yastuff/yawidgets/borderrenderer.h | 95 + .../busywidgettest/busywidgettest.pro | 34 + .../busywidgettest/busywidgettest.qrc | 11 + .../busywidgettest/busywidgettest.ui | 47 + .../busywidgettest/busywidgettestmain.cpp | 15 + .../busywidgettest/yabusywidget2.cpp | 248 + .../yawidgets/busywidgettest/yabusywidget2.h | 77 + .../chatseparatortest/chatseparatortest.pro | 41 + .../chatseparatortest/chatseparatortest.qrc | 30 + .../chatseparatortestmain.cpp | 54 + .../yawidgets/chatviewbench/chatviewbench.pro | 39 + .../chatviewbench/chatviewbenchmain.cpp | 175 + .../yawidgets/chatviewtest/chatviewtest.pro | 44 + .../chatviewtest/chatviewtestmain.cpp | 21 + .../yawidgets/chatviewtest/testmodel.cpp | 23 + .../yawidgets/chatviewtest/testmodel.h | 16 + .../customwindowtest/customwindowtest.pro | 39 + .../customwindowtest/customwindowtest.qrc | 7 + .../customwindowtest/customwindowtestmain.cpp | 62 + .../yawidgets/customwindowtest/mywindow.ui | 124 + .../yawidgets/expandingextrawidget.cpp | 250 + .../yastuff/yawidgets/expandingextrawidget.h | 92 + .../expandingoverlaylineedittest.pro | 30 + .../expandingoverlaylineedittestmain.cpp | 49 + .../expandingoverlaylineedittest/test.ui | 102 + .../fadingmultilinelabel.cpp | 129 + .../fadingmultilinelabel.h | 62 + .../fadingmultilinelabeltest.pro | 26 + .../fadingmultilinelabeltestmain.cpp | 16 + .../yawidgets/newselfavatar/newselfavatar.pro | 47 + .../yawidgets/newselfavatar/newselfavatar.qrc | 35 + .../yastuff/yawidgets/newselfavatar/test.ui | 87 + .../yawidgets/newselfavatar/yaselfmood.cpp | 1542 +++ .../yawidgets/newselfavatar/yaselfmood.h | 261 + .../newselfavatar/yaselfmoodaction.cpp | 316 + .../newselfavatar/yaselfmoodaction.h | 100 + src/tools/yastuff/yawidgets/overlaywidget.h | 226 + .../yawidgets/private/qabstractitemview_p.h | 450 + .../yawidgets/private/qabstractscrollarea_p.h | 144 + .../yastuff/yawidgets/private/qeffects_p.h | 84 + .../yastuff/yawidgets/private/qframe_p.h | 84 + .../yastuff/yawidgets/private/qobject_p.h | 303 + .../yawidgets/private/qtextcontrol_p.h | 307 + .../yawidgets/private/qtextcontrol_p_p.h | 220 + .../yastuff/yawidgets/private/qtreeview_p.h | 241 + .../yastuff/yawidgets/private/qwidget_p.h | 955 ++ .../rostertabstest/rostertabtest.pro | 32 + .../rostertabstest/rostertabtestmain.cpp | 37 + .../yawidgets/rostertest/rostertest.pri | 26 + .../yawidgets/rostertest/rostertest.pro | 27 + .../yawidgets/rostertest/rostertest.qrc | 17 + .../yawidgets/rostertest/rostertest.ui | 83 + .../yawidgets/rostertest/rostertestmain.cpp | 62 + .../yawidgets/rostertest/testmodel.cpp | 33 + .../yastuff/yawidgets/rostertest/testmodel.h | 18 + .../yawidgets/rostertest/userpics/0.png | Bin 0 -> 9898 bytes .../yawidgets/rostertest/userpics/1.jpg | Bin 0 -> 1377 bytes .../yawidgets/rostertest/userpics/2.jpg | Bin 0 -> 2302 bytes .../yawidgets/rostertest/userpics/3.jpg | Bin 0 -> 40851 bytes .../yawidgets/rostertest/userpics/4.jpg | Bin 0 -> 42850 bytes .../yawidgets/rostertest/userpics/5.jpg | Bin 0 -> 40083 bytes .../yawidgets/rostertest/userpics/6.jpg | Bin 0 -> 44986 bytes .../yawidgets/rostertest/userpics/7.jpg | Bin 0 -> 38095 bytes .../settingsbuttontest/settingsbuttontest.pro | 38 + .../settingsbuttontestmain.cpp | 15 + .../settingsbuttontest/settingstest.ui | 92 + .../settingsbuttontest/yasettingsbutton.cpp | 65 + .../settingsbuttontest/yasettingsbutton.h | 39 + .../yawidgets/statusbartest/statusbartest.pro | 52 + .../yawidgets/statusbartest/statusbartest.qrc | 17 + .../yawidgets/statusbartest/statusbartest.ui | 69 + .../statusbartest/statusbartestmain.cpp | 31 + .../yawidgets/statusbartest/testmodel.cpp | 31 + .../yawidgets/statusbartest/testmodel.h | 18 + .../yawidgets/tabbartest/tabbartest.pro | 48 + .../yawidgets/tabbartest/tabbartest.qrc | 17 + .../yawidgets/tabbartest/tabbartestmain.cpp | 44 + .../yawidgets/tabbartest2/tabbartest2.pro | 53 + .../yawidgets/tabbartest2/tabbartest2.qrc | 17 + .../yawidgets/tabbartest2/tabbartestmain2.cpp | 101 + .../yawidgets/trimmablemultilinelabel.cpp | 235 + .../yawidgets/trimmablemultilinelabel.h | 81 + .../trimmablemultilinelabeltest/main.ui | 60 + .../trimmablemultilinelabeltest.pro | 18 + .../trimmablemultilinelabeltestmain.cpp | 20 + .../yachatviewmodel/testyachatviewmodel.cpp | 652 + .../yachatviewmodel/testyachatviewmodel.pro | 29 + src/tools/yastuff/yawidgets/visibletext.cpp | 89 + src/tools/yastuff/yawidgets/visibletext.h | 30 + .../yastuff/yawidgets/yaaccountselector.cpp | 68 + .../yastuff/yawidgets/yaaccountselector.h | 47 + src/tools/yastuff/yawidgets/yaavatarlabel.cpp | 87 + src/tools/yastuff/yawidgets/yaavatarlabel.h | 62 + src/tools/yastuff/yawidgets/yaboldmenu.cpp | 61 + src/tools/yastuff/yawidgets/yaboldmenu.h | 39 + src/tools/yastuff/yawidgets/yabusywidget.cpp | 203 + src/tools/yastuff/yawidgets/yabusywidget.h | 75 + .../yastuff/yawidgets/yachatcontactinfo.cpp | 264 + .../yastuff/yawidgets/yachatcontactinfo.h | 99 + .../yastuff/yawidgets/yachatcontactstatus.cpp | 263 + .../yastuff/yawidgets/yachatcontactstatus.h | 86 + src/tools/yastuff/yawidgets/yachatedit.cpp | 237 + src/tools/yastuff/yawidgets/yachatedit.h | 61 + .../yastuff/yawidgets/yachatsendbutton.cpp | 166 + .../yastuff/yawidgets/yachatsendbutton.h | 53 + .../yastuff/yawidgets/yachatseparator.cpp | 1083 ++ src/tools/yastuff/yawidgets/yachatseparator.h | 268 + src/tools/yastuff/yawidgets/yachatview.cpp | 958 ++ src/tools/yastuff/yawidgets/yachatview.h | 142 + .../yastuff/yawidgets/yachatviewdelegate.cpp | 1116 ++ .../yastuff/yawidgets/yachatviewdelegate.h | 146 + .../yastuff/yawidgets/yachatviewmodel.cpp | 1205 ++ src/tools/yastuff/yawidgets/yachatviewmodel.h | 289 + .../yastuff/yawidgets/yachevronbutton.cpp | 147 + src/tools/yastuff/yawidgets/yachevronbutton.h | 64 + src/tools/yastuff/yawidgets/yaclosebutton.cpp | 142 + src/tools/yastuff/yawidgets/yaclosebutton.h | 57 + .../yawidgets/yacontactavatarlabel.cpp | 78 + .../yastuff/yawidgets/yacontactavatarlabel.h | 56 + .../yastuff/yawidgets/yacontactlabel.cpp | 177 + src/tools/yastuff/yawidgets/yacontactlabel.h | 63 + .../yastuff/yawidgets/yacontactlistview.cpp | 1073 ++ .../yastuff/yawidgets/yacontactlistview.h | 161 + .../yawidgets/yacontactlistviewdelegate.cpp | 661 + .../yawidgets/yacontactlistviewdelegate.h | 124 + .../yacontactlistviewdelegateselector.cpp | 102 + .../yacontactlistviewdelegateselector.h | 63 + .../yacontactlistviewlargedelegate.cpp | 105 + .../yacontactlistviewlargedelegate.h | 40 + .../yacontactlistviewslimdelegate.cpp | 107 + .../yawidgets/yacontactlistviewslimdelegate.h | 42 + .../yastuff/yawidgets/yaeditorcontextmenu.cpp | 166 + .../yastuff/yawidgets/yaeditorcontextmenu.h | 68 + .../yastuff/yawidgets/yaemptytextlineedit.cpp | 275 + .../yastuff/yawidgets/yaemptytextlineedit.h | 86 + .../yastuff/yawidgets/yaeventmessage.cpp | 38 + src/tools/yastuff/yawidgets/yaeventmessage.h | 36 + .../yawidgets/yaeventnotifierframe.cpp | 263 + .../yastuff/yawidgets/yaeventnotifierframe.h | 112 + .../yawidgets/yaexpandingoverlaylineedit.cpp | 209 + .../yawidgets/yaexpandingoverlaylineedit.h | 80 + .../yawidgets/yafilteredcontactlistview.cpp | 149 + .../yawidgets/yafilteredcontactlistview.h | 54 + .../yastuff/yawidgets/yaflashingscrollbar.cpp | 220 + .../yastuff/yawidgets/yaflashingscrollbar.h | 57 + src/tools/yastuff/yawidgets/yainformer.cpp | 288 + src/tools/yastuff/yawidgets/yainformer.h | 94 + .../yastuff/yawidgets/yainformerbutton.cpp | 164 + .../yastuff/yawidgets/yainformerbutton.h | 62 + src/tools/yastuff/yawidgets/yajidlabel.cpp | 57 + src/tools/yastuff/yawidgets/yajidlabel.h | 43 + src/tools/yastuff/yawidgets/yalabel.cpp | 214 + src/tools/yastuff/yawidgets/yalabel.h | 70 + .../yastuff/yawidgets/yalastmailinformer.cpp | 122 + .../yastuff/yawidgets/yalastmailinformer.h | 67 + .../yastuff/yawidgets/yalastmailinformer.ui | 73 + .../yawidgets/yalastmailinformerdelegate.cpp | 71 + .../yawidgets/yalastmailinformerdelegate.h | 52 + .../yawidgets/yalastmailinformermodel.cpp | 77 + .../yawidgets/yalastmailinformermodel.h | 56 + .../yawidgets/yalastmailinformerview.cpp | 53 + .../yawidgets/yalastmailinformerview.h | 36 + src/tools/yastuff/yawidgets/yalinkbutton.cpp | 136 + src/tools/yastuff/yawidgets/yalinkbutton.h | 54 + .../yastuff/yawidgets/yamanageaccounts.cpp | 710 ++ .../yastuff/yawidgets/yamanageaccounts.h | 90 + .../yastuff/yawidgets/yamanageaccounts.ui | 126 + src/tools/yastuff/yawidgets/yamucjoin.cpp | 302 + src/tools/yastuff/yawidgets/yamucjoin.h | 80 + src/tools/yastuff/yawidgets/yamucjoin.ui | 229 + .../yastuff/yawidgets/yamultilinetabbar.cpp | 750 ++ .../yastuff/yawidgets/yamultilinetabbar.h | 109 + .../yawidgets/yaofficebackgroundhelper.cpp | 88 + .../yawidgets/yaofficebackgroundhelper.h | 52 + src/tools/yastuff/yawidgets/yaokbutton.cpp | 56 + src/tools/yastuff/yawidgets/yaokbutton.h | 40 + .../yawidgets/yapreferencestabbutton.cpp | 94 + .../yawidgets/yapreferencestabbutton.h | 49 + .../yastuff/yawidgets/yaprogressdialog.cpp | 69 + .../yastuff/yawidgets/yaprogressdialog.h | 52 + .../yastuff/yawidgets/yaprogressdialog.ui | 64 + src/tools/yastuff/yawidgets/yapushbutton.cpp | 270 + src/tools/yastuff/yawidgets/yapushbutton.h | 65 + .../yastuff/yawidgets/yarostercombobox.cpp | 89 + .../yastuff/yawidgets/yarostercombobox.h | 43 + src/tools/yastuff/yawidgets/yarotation.cpp | 73 + src/tools/yastuff/yawidgets/yarotation.h | 53 + .../yastuff/yawidgets/yaselfavatarlabel.cpp | 717 ++ .../yastuff/yawidgets/yaselfavatarlabel.h | 110 + src/tools/yastuff/yawidgets/yaselflabel.cpp | 87 + src/tools/yastuff/yawidgets/yaselflabel.h | 57 + src/tools/yastuff/yawidgets/yaselfstatus.cpp | 89 + src/tools/yastuff/yawidgets/yaselfstatus.h | 52 + src/tools/yastuff/yawidgets/yasplitter.cpp | 151 + src/tools/yastuff/yawidgets/yasplitter.h | 40 + src/tools/yastuff/yawidgets/yastatusbar.cpp | 352 + src/tools/yastuff/yawidgets/yastatusbar.h | 101 + .../yastuff/yawidgets/yastatusbarlayout.cpp | 152 + .../yastuff/yawidgets/yastatusbarlayout.h | 54 + src/tools/yastuff/yawidgets/yatabbar.cpp | 498 + src/tools/yastuff/yawidgets/yatabbar.h | 114 + src/tools/yastuff/yawidgets/yatabbarbase.cpp | 610 + src/tools/yastuff/yawidgets/yatabbarbase.h | 125 + src/tools/yastuff/yawidgets/yatabwidget.cpp | 360 + src/tools/yastuff/yawidgets/yatabwidget.h | 87 + src/tools/yastuff/yawidgets/yatoolbox.cpp | 143 + src/tools/yastuff/yawidgets/yatoolbox.h | 68 + .../yastuff/yawidgets/yatoolboxanimation.cpp | 107 + .../yastuff/yawidgets/yatoolboxanimation.h | 55 + src/tools/yastuff/yawidgets/yatoolboxpage.cpp | 142 + src/tools/yastuff/yawidgets/yatoolboxpage.h | 83 + src/tools/yastuff/yawidgets/yavisualutil.cpp | 879 ++ src/tools/yastuff/yawidgets/yavisualutil.h | 143 + src/tools/yastuff/yawidgets/yawidgets.cpp | 755 ++ src/tools/yastuff/yawidgets/yawidgets.pri | 178 + src/tools/yastuff/yawidgets/yawidgets.pro | 17 + src/tools/yastuff/yawidgets/yawindow.cpp | 1243 ++ src/tools/yastuff/yawidgets/yawindow.h | 281 + .../yastuff/yawidgets/yawindowextrabutton.cpp | 129 + .../yastuff/yawidgets/yawindowextrabutton.h | 71 + src/tools/yastuff/yawidgets/yawindowtheme.cpp | 367 + src/tools/yastuff/yawidgets/yawindowtheme.h | 139 + src/tools/zip/minizip/ChangeLogUnzip | 38 + src/tools/zip/minizip/miniunz.c | 508 + src/tools/zip/minizip/minizip.c | 302 + src/tools/zip/minizip/other/zip.c | 718 ++ src/tools/zip/minizip/other/zip.def | 5 + src/tools/zip/minizip/other/zip.h | 150 + src/tools/zip/minizip/readme.txt | 37 + src/tools/zip/minizip/unzip.c | 1299 ++ src/tools/zip/minizip/unzip.def | 15 + src/tools/zip/minizip/unzip.h | 275 + src/tools/zip/minizip/win32/libz.a | Bin 0 -> 55978 bytes src/tools/zip/minizip/win32/zconf.h | 279 + src/tools/zip/minizip/win32/zlib.h | 893 ++ src/tools/zip/minizip/zlibvc.def | 74 + src/tools/zip/minizip/zlibvc.dsp | 651 + src/tools/zip/minizip/zlibvc.dsw | 41 + src/tools/zip/zip.cpp | 159 + src/tools/zip/zip.h | 48 + src/tools/zip/zip.pri | 18 + src/translationmanager.cpp | 181 + src/translationmanager.h | 56 + .../testcontactlistnestedgroup.cpp | 204 + .../testcontactlistnestedgroup.pro | 4 + src/unittest/half_of_psi.pri | 21 + src/unittest/psiiconset/testpsiiconset.cpp | 78 + src/unittest/psiiconset/testpsiiconset.pro | 4 + src/unittest/psipopup/testpsipopup.cpp | 86 + src/unittest/psipopup/testpsipopup.pro | 4 + src/urlbookmark.cpp | 71 + src/urlbookmark.h | 49 + src/userlist.cpp | 699 ++ src/userlist.h | 176 + src/utilities/iodeviceopener.cpp | 44 + src/utilities/iodeviceopener.h | 72 + src/utilities/maybe.h | 67 + src/utilities/unittest/iodeviceopenertest.cpp | 154 + src/utilities/unittest/unittest.pri | 2 + src/utilities/utilities.pri | 9 + src/varlist.cpp | 123 + src/varlist.h | 64 + src/vcardfactory.cpp | 207 + src/vcardfactory.h | 73 + src/voicecall.ui | 77 + src/voicecalldlg.cpp | 210 + src/voicecalldlg.h | 73 + src/voicecaller.h | 115 + src/wbdlg.cpp | 490 + src/wbdlg.h | 222 + src/wbitems.cpp | 2185 ++++ src/wbitems.h | 745 ++ src/wbmanager.cpp | 705 ++ src/wbmanager.h | 153 + src/wbscene.cpp | 672 + src/wbscene.h | 174 + src/wbwidget.cpp | 531 + src/wbwidget.h | 128 + src/widgets/README | 21 + src/widgets/busywidget.cpp | 513 + src/widgets/busywidget.h | 73 + src/widgets/fancylabel.cpp | 442 + src/widgets/fancylabel.h | 107 + src/widgets/fancypopup.cpp | 408 + src/widgets/fancypopup.h | 58 + src/widgets/fancypopuplist.h | 74 + src/widgets/iconaction.cpp | 475 + src/widgets/iconaction.h | 115 + src/widgets/iconbutton.h | 65 + src/widgets/iconlabel.h | 50 + src/widgets/iconselect.cpp | 392 + src/widgets/iconselect.h | 52 + src/widgets/iconsetdisplay.h | 41 + src/widgets/iconsetselect.h | 52 + src/widgets/icontoolbutton.h | 59 + src/widgets/iconwidget.cpp | 832 ++ src/widgets/iconwidget.h | 39 + src/widgets/private/qeffects_p.h | 62 + src/widgets/psirichtext.cpp | 427 + src/widgets/psirichtext.h | 50 + src/widgets/psitabbar.cpp | 143 + src/widgets/psitabbar.h | 62 + src/widgets/psitabwidget.cpp | 319 + src/widgets/psitabwidget.h | 98 + src/widgets/psitextview.cpp | 290 + src/widgets/psitextview.h | 76 + src/widgets/psitiplabel.cpp | 255 + src/widgets/psitiplabel.h | 56 + src/widgets/psitooltip.cpp | 267 + src/widgets/psitooltip.h | 68 + src/widgets/psiwidgets.cpp | 558 + src/widgets/psiwidgets.h | 55 + src/widgets/stretchwidget.h | 13 + .../unittest/iconaction/iconaction.pro | 24 + .../unittest/iconaction/testiconaction.cpp | 76 + src/widgets/unittest/richtext/main.cpp | 36 + src/widgets/unittest/richtext/richtext.pro | 10 + src/widgets/updatingcombobox.h | 22 + src/widgets/urllabel.cpp | 121 + src/widgets/urllabel.h | 61 + src/widgets/urlobject.cpp | 178 + src/widgets/urlobject.h | 57 + src/widgets/widgets.pri | 48 + src/widgets/widgets.pro | 53 + src/xdata_widget.cpp | 530 + src/xdata_widget.h | 58 + src/xmlconsole.cpp | 263 + src/xmlconsole.h | 82 + src/xmlconsole.ui | 158 + src/yapsi_qt_translations.sh | 15 + src/yapsi_revision.sh | 37 + src/yapsi_translations.sh | 13 + src/yapsi_update_private_headers.sh | 18 + third-party/JsonQt/CMakeLists.txt | 32 + third-party/JsonQt/COMPATIBILITY | 11 + third-party/JsonQt/COPYING.HEADER | 13 + third-party/JsonQt/Doxyfile.cmake | 299 + third-party/JsonQt/add-copyright-header.sh | 13 + third-party/JsonQt/jsonqt.pri | 21 + third-party/JsonQt/lib/CMakeLists.txt | 76 + third-party/JsonQt/lib/JsonQtExport.h | 24 + third-party/JsonQt/lib/JsonRpc.cpp | 167 + third-party/JsonQt/lib/JsonRpc.h | 105 + third-party/JsonQt/lib/JsonRpcAdaptor.cpp | 19 + third-party/JsonQt/lib/JsonRpcAdaptor.h | 69 + .../JsonQt/lib/JsonRpcAdaptorPrivate.cpp | 351 + .../JsonQt/lib/JsonRpcAdaptorPrivate.h | 44 + third-party/JsonQt/lib/JsonToProperties.cpp | 53 + third-party/JsonQt/lib/JsonToProperties.h | 52 + third-party/JsonQt/lib/JsonToVariant.cpp | 606 + third-party/JsonQt/lib/JsonToVariant.h | 160 + third-party/JsonQt/lib/ParseException.cpp | 47 + third-party/JsonQt/lib/ParseException.h | 63 + third-party/JsonQt/lib/VariantToJson.cpp | 64 + third-party/JsonQt/lib/VariantToJson.h | 40 + third-party/JsonQt/tests/CMakeLists.txt | 44 + third-party/JsonQt/tests/JsonRpc.cpp | 300 + third-party/JsonQt/tests/JsonRpcAdaptor.cpp | 258 + third-party/JsonQt/tests/JsonToProperties.cpp | 46 + third-party/JsonQt/tests/JsonToVariant.cpp | 166 + third-party/JsonQt/tests/VariantToJson.cpp | 46 + third-party/qca/.gitignore | 8 + third-party/qca/qca-cyrus-sasl.pri | 1 + .../qca/qca-cyrus-sasl/qca-cyrus-sasl.cpp | 948 ++ third-party/qca/qca-gnupg.pri | 12 + third-party/qca/qca-gnupg/gpgop.cpp | 1641 +++ third-party/qca/qca-gnupg/gpgop.h | 208 + third-party/qca/qca-gnupg/gpgproc/README | 8 + third-party/qca/qca-gnupg/gpgproc/gpgproc.cpp | 830 ++ third-party/qca/qca-gnupg/gpgproc/gpgproc.h | 114 + third-party/qca/qca-gnupg/gpgproc/gpgproc.pri | 8 + .../qca/qca-gnupg/gpgproc/sprocess.cpp | 55 + third-party/qca/qca-gnupg/gpgproc/sprocess.h | 48 + third-party/qca/qca-gnupg/qca-gnupg.cpp | 1790 +++ third-party/qca/qca-ossl.pri | 5 + third-party/qca/qca-ossl/qca-ossl.cpp | 7033 +++++++++++ third-party/qca/qca.pri | 4 + third-party/qca/qca.pro | 90 + third-party/qca/qca/certs/README | 5 + third-party/qca/qca/certs/rootcerts.pem | 2822 +++++ third-party/qca/qca/include/QtCrypto/QtCrypto | 1 + third-party/qca/qca/include/QtCrypto/qca.h | 47 + .../qca/qca/include/QtCrypto/qca_basic.h | 1004 ++ .../qca/qca/include/QtCrypto/qca_cert.h | 2676 ++++ .../qca/qca/include/QtCrypto/qca_core.h | 1678 +++ .../qca/qca/include/QtCrypto/qca_export.h | 52 + .../qca/qca/include/QtCrypto/qca_keystore.h | 798 ++ .../qca/qca/include/QtCrypto/qca_publickey.h | 1484 +++ .../qca/include/QtCrypto/qca_securelayer.h | 1251 ++ .../qca/include/QtCrypto/qca_securemessage.h | 955 ++ .../qca/qca/include/QtCrypto/qca_support.h | 1111 ++ .../qca/qca/include/QtCrypto/qca_textfilter.h | 327 + .../qca/qca/include/QtCrypto/qca_tools.h | 853 ++ .../qca/qca/include/QtCrypto/qcaprovider.h | 2987 +++++ third-party/qca/qca/include/QtCrypto/qpipe.h | 534 + third-party/qca/qca/src/botantools/README | 84 + .../qca/src/botantools/addlicenseheaders.sh | 12 + .../qca/qca/src/botantools/addnamespace.sh | 6 + .../botantools/botan/alloc_mmap/mmap_mem.cpp | 173 + .../botantools/botan/alloc_mmap/mmap_mem.h | 58 + .../qca/qca/src/botantools/botan/big_base.cpp | 416 + .../qca/qca/src/botantools/botan/big_code.cpp | 195 + .../qca/qca/src/botantools/botan/big_io.cpp | 88 + .../qca/qca/src/botantools/botan/big_ops2.cpp | 272 + .../qca/qca/src/botantools/botan/big_ops3.cpp | 234 + .../qca/qca/src/botantools/botan/bit_ops.cpp | 128 + .../qca/src/botantools/botan/botan/allocate.h | 71 + .../qca/src/botantools/botan/botan/bigint.h | 208 + .../qca/src/botantools/botan/botan/bit_ops.h | 94 + .../qca/src/botantools/botan/botan/charset.h | 85 + .../qca/src/botantools/botan/botan/defalloc.h | 71 + .../qca/src/botantools/botan/botan/exceptn.h | 246 + .../qca/src/botantools/botan/botan/libstate.h | 181 + .../qca/src/botantools/botan/botan/mem_ops.h | 66 + .../qca/src/botantools/botan/botan/mem_pool.h | 113 + .../qca/src/botantools/botan/botan/mmap_mem.h | 58 + .../qca/src/botantools/botan/botan/modules.h | 109 + .../qca/src/botantools/botan/botan/mp_asm.h | 81 + .../qca/src/botantools/botan/botan/mp_asmi.h | 215 + .../qca/src/botantools/botan/botan/mp_core.h | 118 + .../qca/src/botantools/botan/botan/mp_types.h | 61 + .../qca/src/botantools/botan/botan/mutex.h | 101 + .../qca/src/botantools/botan/botan/mux_qt.h | 54 + .../qca/src/botantools/botan/botan/numthry.h | 131 + .../qca/src/botantools/botan/botan/parsing.h | 70 + .../qca/src/botantools/botan/botan/secmem.h | 245 + .../qca/src/botantools/botan/botan/stl_util.h | 114 + .../qca/src/botantools/botan/botan/types.h | 86 + .../qca/qca/src/botantools/botan/botan/util.h | 76 + .../qca/qca/src/botantools/botan/charset.cpp | 224 + .../qca/qca/src/botantools/botan/defalloc.cpp | 142 + .../qca/qca/src/botantools/botan/divide.cpp | 136 + .../qca/qca/src/botantools/botan/exceptn.cpp | 102 + .../qca/qca/src/botantools/botan/libstate.cpp | 487 + .../qca/qca/src/botantools/botan/license.txt | 23 + .../qca/qca/src/botantools/botan/mem_pool.cpp | 319 + .../src/botantools/botan/ml_unix/mlock.cpp | 67 + .../src/botantools/botan/ml_win32/mlock.cpp | 59 + .../qca/qca/src/botantools/botan/modules.cpp | 324 + .../qca/qca/src/botantools/botan/mp_asm.cpp | 243 + .../qca/qca/src/botantools/botan/mp_comba.cpp | 416 + .../qca/qca/src/botantools/botan/mp_misc.cpp | 151 + .../qca/qca/src/botantools/botan/mp_mul.cpp | 212 + .../qca/qca/src/botantools/botan/mp_mulop.cpp | 68 + .../qca/qca/src/botantools/botan/mp_shift.cpp | 144 + .../qca/qca/src/botantools/botan/mutex.cpp | 133 + .../src/botantools/botan/mux_qt/mux_qt.cpp | 64 + .../qca/src/botantools/botan/mux_qt/mux_qt.h | 54 + .../qca/qca/src/botantools/botan/parsing.cpp | 278 + .../qca/qca/src/botantools/botan/util.cpp | 121 + .../qca/qca/src/botantools/botantools.diff | 1276 ++ .../qca/qca/src/botantools/botantools.h | 30 + .../qca/qca/src/botantools/botantools.pri | 52 + third-party/qca/qca/src/botantools/btest.cpp | 26 + third-party/qca/qca/src/botantools/btest.pro | 7 + third-party/qca/qca/src/botantools/wrapns.c | 270 + third-party/qca/qca/src/qca_basic.cpp | 547 + third-party/qca/qca/src/qca_cert.cpp | 2987 +++++ third-party/qca/qca/src/qca_core.cpp | 2108 ++++ third-party/qca/qca/src/qca_default.cpp | 1323 ++ third-party/qca/qca/src/qca_keystore.cpp | 1719 +++ third-party/qca/qca/src/qca_plugin.cpp | 807 ++ third-party/qca/qca/src/qca_plugin.h | 74 + third-party/qca/qca/src/qca_publickey.cpp | 1501 +++ third-party/qca/qca/src/qca_safeobj.cpp | 33 + third-party/qca/qca/src/qca_safeobj.h | 107 + third-party/qca/qca/src/qca_securelayer.cpp | 1989 +++ third-party/qca/qca/src/qca_securemessage.cpp | 687 + third-party/qca/qca/src/qca_systemstore.h | 36 + .../qca/qca/src/qca_systemstore_flatfile.cpp | 38 + .../qca/qca/src/qca_systemstore_mac.cpp | 56 + .../qca/qca/src/qca_systemstore_win.cpp | 73 + third-party/qca/qca/src/qca_textfilter.cpp | 517 + third-party/qca/qca/src/qca_tools.cpp | 1001 ++ third-party/qca/qca/src/support/console.cpp | 1019 ++ third-party/qca/qca/src/support/dirwatch.cpp | 239 + third-party/qca/qca/src/support/logger.cpp | 119 + third-party/qca/qca/src/support/qpipe.cpp | 2154 ++++ .../qca/qca/src/support/synchronizer.cpp | 497 + .../qca/qca/src/support/syncthread.cpp | 223 + win32/app.ico | Bin 0 -> 125395 bytes win32/psi_win32.manifest | 15 + win32/psi_win32.rc | 4 + win32/tod.exe | Bin 0 -> 28672 bytes win32/yapsi_version.rc | 26 + win32/yapsiserver.def | 8 + win32/yapsiserver.rc | 5 + yapsi_version | 1 + 2469 files changed, 470994 insertions(+) create mode 100644 .darcs_binaries create mode 100644 .darcs_boring create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 README create mode 100644 admin/bundle_qca.sh create mode 100644 admin/legoptx.txt create mode 100644 admin/prune.sh create mode 100644 admin/update_iconsets.sh create mode 100644 admin/update_options_ts.py create mode 100644 certs/README create mode 100644 certs/rootcerts.pem create mode 100644 certs/startcom_ca.crt create mode 100644 conf_windows.pri create mode 100644 configure create mode 100644 crashreporter/.gitignore create mode 100644 crashreporter/crashreporter.cpp create mode 100644 crashreporter/crashreporter.pro create mode 100644 crashreporter/crashreporter.ui create mode 100644 crashreporter/mailmsg/mailmsg.pri create mode 100644 crashreporter/mailmsg/mailmsg_windows.cpp create mode 100644 crashreporter/mailmsg/mailmsg_windows.h create mode 100644 doc/Doxyfile.private create mode 100644 doc/Doxyfile.public create mode 100644 doc/build-mac.txt create mode 100644 doc/build-unix.txt create mode 100644 doc/build-win.txt create mode 100644 dsa_pub.pem create mode 100644 iconsets.qrc create mode 100644 iconsets/emoticons/default/angry.png create mode 100644 iconsets/emoticons/default/bat.png create mode 100644 iconsets/emoticons/default/beer.png create mode 100644 iconsets/emoticons/default/biggrin.png create mode 100644 iconsets/emoticons/default/blush.png create mode 100644 iconsets/emoticons/default/boy.png create mode 100644 iconsets/emoticons/default/brflower.png create mode 100644 iconsets/emoticons/default/brheart.png create mode 100644 iconsets/emoticons/default/coffee.png create mode 100644 iconsets/emoticons/default/coolglasses.png create mode 100644 iconsets/emoticons/default/cry.png create mode 100644 iconsets/emoticons/default/cuffs.png create mode 100644 iconsets/emoticons/default/devil.png create mode 100644 iconsets/emoticons/default/drink.png create mode 100644 iconsets/emoticons/default/flower.png create mode 100644 iconsets/emoticons/default/frowning.png create mode 100644 iconsets/emoticons/default/girl.png create mode 100644 iconsets/emoticons/default/heart.png create mode 100644 iconsets/emoticons/default/hugleft.png create mode 100644 iconsets/emoticons/default/hugright.png create mode 100644 iconsets/emoticons/default/icondef.xml create mode 100644 iconsets/emoticons/default/kiss.png create mode 100644 iconsets/emoticons/default/lamp.png create mode 100644 iconsets/emoticons/default/mail.png create mode 100644 iconsets/emoticons/default/music.png create mode 100644 iconsets/emoticons/default/no.png create mode 100644 iconsets/emoticons/default/oh.png create mode 100644 iconsets/emoticons/default/phone.png create mode 100644 iconsets/emoticons/default/photo.png create mode 100644 iconsets/emoticons/default/pussy.png create mode 100644 iconsets/emoticons/default/rainbow.png create mode 100644 iconsets/emoticons/default/smile.png create mode 100644 iconsets/emoticons/default/star.png create mode 100644 iconsets/emoticons/default/stare.png create mode 100644 iconsets/emoticons/default/tongue.png create mode 100644 iconsets/emoticons/default/unhappy.png create mode 100644 iconsets/emoticons/default/wink.png create mode 100644 iconsets/emoticons/default/yes.png create mode 100644 iconsets/roster/README create mode 100644 iconsets/roster/crystal-aim.jisp create mode 100644 iconsets/roster/crystal-gadu.jisp create mode 100644 iconsets/roster/crystal-icq.jisp create mode 100644 iconsets/roster/crystal-msn.jisp create mode 100644 iconsets/roster/crystal-roster.jisp create mode 100644 iconsets/roster/crystal-service.jisp create mode 100644 iconsets/roster/crystal-sms.jisp create mode 100644 iconsets/roster/crystal-yahoo.jisp create mode 100644 iconsets/roster/default/ask.png create mode 100644 iconsets/roster/default/away.png create mode 100644 iconsets/roster/default/chat.fading.png create mode 100644 iconsets/roster/default/chatty.png create mode 100644 iconsets/roster/default/dnd.png create mode 100644 iconsets/roster/default/file.fading.png create mode 100644 iconsets/roster/default/groupclose.png create mode 100644 iconsets/roster/default/groupopen.png create mode 100644 iconsets/roster/default/headline.png create mode 100644 iconsets/roster/default/icondef.xml create mode 100644 iconsets/roster/default/invisible.png create mode 100644 iconsets/roster/default/message.fading.png create mode 100644 iconsets/roster/default/noauth.png create mode 100644 iconsets/roster/default/offline.png create mode 100644 iconsets/roster/default/online.dimming.png create mode 100644 iconsets/roster/default/online.png create mode 100644 iconsets/roster/default/perr.png create mode 100644 iconsets/roster/default/system.png create mode 100644 iconsets/roster/default/xa.png create mode 100644 iconsets/system/README create mode 100644 iconsets/system/default/account.png create mode 100644 iconsets/system/default/add.png create mode 100644 iconsets/system/default/advanced.png create mode 100644 iconsets/system/default/appearance.png create mode 100644 iconsets/system/default/arrow_down.png create mode 100644 iconsets/system/default/arrow_left.png create mode 100644 iconsets/system/default/arrow_right.png create mode 100644 iconsets/system/default/arrow_up.png create mode 100644 iconsets/system/default/browse.png create mode 100644 iconsets/system/default/cancel.png create mode 100644 iconsets/system/default/changeacc.png create mode 100644 iconsets/system/default/chatclear.png create mode 100644 iconsets/system/default/close.png create mode 100644 iconsets/system/default/closetab.png create mode 100644 iconsets/system/default/command.png create mode 100644 iconsets/system/default/configure-room.png create mode 100644 iconsets/system/default/configure_toolbars.png create mode 100644 iconsets/system/default/disco.png create mode 100644 iconsets/system/default/download.png create mode 100644 iconsets/system/default/events.png create mode 100644 iconsets/system/default/eye_blue.png create mode 100644 iconsets/system/default/filemanager.png create mode 100644 iconsets/system/default/groupchat.png create mode 100644 iconsets/system/default/help.png create mode 100644 iconsets/system/default/history.png create mode 100644 iconsets/system/default/icondef.xml create mode 100644 iconsets/system/default/info.png create mode 100644 iconsets/system/default/jabber.png create mode 100644 iconsets/system/default/key.png create mode 100644 iconsets/system/default/key_bad.png create mode 100644 iconsets/system/default/key_unknown.png create mode 100644 iconsets/system/default/logo_128.png create mode 100644 iconsets/system/default/logo_16.png create mode 100644 iconsets/system/default/logo_24.png create mode 100644 iconsets/system/default/logo_256.png create mode 100644 iconsets/system/default/logo_32.png create mode 100644 iconsets/system/default/logo_48.png create mode 100644 iconsets/system/default/logo_64.png create mode 100644 iconsets/system/default/logo_96.png create mode 100644 iconsets/system/default/ok.png create mode 100644 iconsets/system/default/options.png create mode 100644 iconsets/system/default/pgp.png create mode 100644 iconsets/system/default/play.png create mode 100644 iconsets/system/default/play_sounds.png create mode 100644 iconsets/system/default/psilogo.png create mode 100644 iconsets/system/default/psimain.png create mode 100644 iconsets/system/default/publish_tune.png create mode 100644 iconsets/system/default/quit.png create mode 100644 iconsets/system/default/register.png create mode 100644 iconsets/system/default/reload.png create mode 100644 iconsets/system/default/remove.png create mode 100644 iconsets/system/default/search.png create mode 100644 iconsets/system/default/self.png create mode 100644 iconsets/system/default/send.png create mode 100644 iconsets/system/default/shortcuts.png create mode 100644 iconsets/system/default/show_away.png create mode 100644 iconsets/system/default/show_hidden.png create mode 100644 iconsets/system/default/show_offline.png create mode 100644 iconsets/system/default/smile.png create mode 100644 iconsets/system/default/ssl_no.png create mode 100644 iconsets/system/default/ssl_yes.png create mode 100644 iconsets/system/default/start-chat.png create mode 100644 iconsets/system/default/status.png create mode 100644 iconsets/system/default/stop.png create mode 100644 iconsets/system/default/time.png create mode 100644 iconsets/system/default/tip.png create mode 100644 iconsets/system/default/upload.png create mode 100644 iconsets/system/default/url.png create mode 100644 iconsets/system/default/vcard.png create mode 100644 iconsets/system/default/whiteboarding/add_image.png create mode 100644 iconsets/system/default/whiteboarding/add_text.png create mode 100644 iconsets/system/default/whiteboarding/bring_forwards.png create mode 100644 iconsets/system/default/whiteboarding/bring_to_front.png create mode 100644 iconsets/system/default/whiteboarding/draw_circles.png create mode 100644 iconsets/system/default/whiteboarding/draw_ellipses.png create mode 100644 iconsets/system/default/whiteboarding/draw_lines.png create mode 100644 iconsets/system/default/whiteboarding/draw_paths.png create mode 100644 iconsets/system/default/whiteboarding/draw_rectangles.png create mode 100644 iconsets/system/default/whiteboarding/erase.png create mode 100644 iconsets/system/default/whiteboarding/group.png create mode 100644 iconsets/system/default/whiteboarding/rotate.png create mode 100644 iconsets/system/default/whiteboarding/scale.png create mode 100644 iconsets/system/default/whiteboarding/scroll.png create mode 100644 iconsets/system/default/whiteboarding/select.png create mode 100644 iconsets/system/default/whiteboarding/send_backwards.png create mode 100644 iconsets/system/default/whiteboarding/send_to_back.png create mode 100644 iconsets/system/default/whiteboarding/translate.png create mode 100644 iconsets/system/default/whiteboarding/ungroup.png create mode 100644 iconsets/system/default/whiteboarding/whiteboard.png create mode 100644 iconsets/system/default/xml.png create mode 100644 iris-legacy/cutestuff/cutestuff.pri create mode 100644 iris-legacy/cutestuff/legacy/ndns.cpp create mode 100644 iris-legacy/cutestuff/legacy/ndns.h create mode 100644 iris-legacy/cutestuff/legacy/safedelete.cpp create mode 100644 iris-legacy/cutestuff/legacy/safedelete.h create mode 100644 iris-legacy/cutestuff/legacy/servsock.cpp create mode 100644 iris-legacy/cutestuff/legacy/servsock.h create mode 100644 iris-legacy/cutestuff/legacy/srvresolver.cpp create mode 100644 iris-legacy/cutestuff/legacy/srvresolver.h create mode 100644 iris-legacy/cutestuff/network/bsocket.cpp create mode 100644 iris-legacy/cutestuff/network/bsocket.h create mode 100644 iris-legacy/cutestuff/network/httpconnect.cpp create mode 100644 iris-legacy/cutestuff/network/httpconnect.h create mode 100644 iris-legacy/cutestuff/network/httppoll.cpp create mode 100644 iris-legacy/cutestuff/network/httppoll.h create mode 100644 iris-legacy/cutestuff/network/socks.cpp create mode 100644 iris-legacy/cutestuff/network/socks.h create mode 100644 iris-legacy/cutestuff/util/bytestream.cpp create mode 100644 iris-legacy/cutestuff/util/bytestream.h create mode 100644 iris-legacy/iris/COPYING create mode 100644 iris-legacy/iris/TODO create mode 100644 iris-legacy/iris/example/conntest/configure create mode 100644 iris-legacy/iris/example/conntest/conntest.cpp create mode 100644 iris-legacy/iris/example/conntest/conntest.pro create mode 100644 iris-legacy/iris/example/conntest/conntest.qc create mode 100644 iris-legacy/iris/example/conntest/prepare create mode 100644 iris-legacy/iris/example/server/server.cpp create mode 100644 iris-legacy/iris/example/server/server.pro create mode 100644 iris-legacy/iris/example/xmpptest/ui_test.ui create mode 100644 iris-legacy/iris/example/xmpptest/xmpptest.cpp create mode 100644 iris-legacy/iris/example/xmpptest/xmpptest.pro create mode 100644 iris-legacy/iris/include/im.h create mode 100644 iris-legacy/iris/include/xmpp.h create mode 100644 iris-legacy/iris/include/xmpp_address.h create mode 100644 iris-legacy/iris/include/xmpp_agentitem.h create mode 100644 iris-legacy/iris/include/xmpp_chatstate.h create mode 100644 iris-legacy/iris/include/xmpp_client.h create mode 100644 iris-legacy/iris/include/xmpp_clientstream.h create mode 100644 iris-legacy/iris/include/xmpp_discoitem.h create mode 100644 iris-legacy/iris/include/xmpp_features.h create mode 100644 iris-legacy/iris/include/xmpp_htmlelement.h create mode 100644 iris-legacy/iris/include/xmpp_httpauthrequest.h create mode 100644 iris-legacy/iris/include/xmpp_jid.h create mode 100644 iris-legacy/iris/include/xmpp_liveroster.h create mode 100644 iris-legacy/iris/include/xmpp_liverosteritem.h create mode 100644 iris-legacy/iris/include/xmpp_message.h create mode 100644 iris-legacy/iris/include/xmpp_muc.h create mode 100644 iris-legacy/iris/include/xmpp_pubsubitem.h create mode 100644 iris-legacy/iris/include/xmpp_pubsubretraction.h create mode 100644 iris-legacy/iris/include/xmpp_receipts.h create mode 100644 iris-legacy/iris/include/xmpp_resource.h create mode 100644 iris-legacy/iris/include/xmpp_resourcelist.h create mode 100644 iris-legacy/iris/include/xmpp_roster.h create mode 100644 iris-legacy/iris/include/xmpp_rosteritem.h create mode 100644 iris-legacy/iris/include/xmpp_rosterx.h create mode 100644 iris-legacy/iris/include/xmpp_stanza.h create mode 100644 iris-legacy/iris/include/xmpp_status.h create mode 100644 iris-legacy/iris/include/xmpp_stream.h create mode 100644 iris-legacy/iris/include/xmpp_task.h create mode 100644 iris-legacy/iris/include/xmpp_url.h create mode 100644 iris-legacy/iris/include/xmpp_xdata.h create mode 100644 iris-legacy/iris/include/xmpp_yadatetime.h create mode 100644 iris-legacy/iris/include/xmpp_yalastmail.h create mode 100644 iris-legacy/iris/iris.pri create mode 100644 iris-legacy/iris/irisnet/Doxyfile create mode 100644 iris-legacy/iris/irisnet/TODO create mode 100644 iris-legacy/iris/irisnet/irisnet.pri create mode 100644 iris-legacy/iris/irisnet/irisnet.pro create mode 100644 iris-legacy/iris/irisnet/irisnetexport.h create mode 100644 iris-legacy/iris/irisnet/irisnetglobal.cpp create mode 100644 iris-legacy/iris/irisnet/irisnetglobal.h create mode 100644 iris-legacy/iris/irisnet/irisnetglobal_p.h create mode 100644 iris-legacy/iris/irisnet/irisnetplugin.cpp create mode 100644 iris-legacy/iris/irisnet/irisnetplugin.h create mode 100644 iris-legacy/iris/irisnet/jdns/README create mode 100644 iris-legacy/iris/irisnet/jdns/TODO create mode 100644 iris-legacy/iris/irisnet/jdns/jdns.c create mode 100644 iris-legacy/iris/irisnet/jdns/jdns.h create mode 100644 iris-legacy/iris/irisnet/jdns/jdns.pri create mode 100644 iris-legacy/iris/irisnet/jdns/jdns.pro create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_mdnsd.c create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_mdnsd.h create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_p.h create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_packet.c create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_packet.h create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_sys.c create mode 100644 iris-legacy/iris/irisnet/jdns/jdns_util.c create mode 100644 iris-legacy/iris/irisnet/jdns/main.cpp create mode 100644 iris-legacy/iris/irisnet/jdns/qjdns.cpp create mode 100644 iris-legacy/iris/irisnet/jdns/qjdns.h create mode 100644 iris-legacy/iris/irisnet/jdns/qjdns_sock.cpp create mode 100644 iris-legacy/iris/irisnet/jdns/qjdns_sock.h create mode 100644 iris-legacy/iris/irisnet/jdnsshared.cpp create mode 100644 iris-legacy/iris/irisnet/jdnsshared.h create mode 100644 iris-legacy/iris/irisnet/legacy/legacy.pri create mode 100644 iris-legacy/iris/irisnet/legacy/ndns.cpp create mode 100644 iris-legacy/iris/irisnet/legacy/ndns.h create mode 100644 iris-legacy/iris/irisnet/legacy/safedelete.cpp create mode 100644 iris-legacy/iris/irisnet/legacy/safedelete.h create mode 100644 iris-legacy/iris/irisnet/legacy/servsock.cpp create mode 100644 iris-legacy/iris/irisnet/legacy/servsock.h create mode 100644 iris-legacy/iris/irisnet/legacy/srvresolver.cpp create mode 100644 iris-legacy/iris/irisnet/legacy/srvresolver.h create mode 100644 iris-legacy/iris/irisnet/main.cpp create mode 100644 iris-legacy/iris/irisnet/netinterface.cpp create mode 100644 iris-legacy/iris/irisnet/netinterface.h create mode 100644 iris-legacy/iris/irisnet/netinterface_unix.cpp create mode 100644 iris-legacy/iris/irisnet/netnames.cpp create mode 100644 iris-legacy/iris/irisnet/netnames.h create mode 100644 iris-legacy/iris/irisnet/netnames_jdns.cpp create mode 100644 iris-legacy/iris/irisnet/processquit.cpp create mode 100644 iris-legacy/iris/irisnet/processquit.h create mode 100644 iris-legacy/iris/jabber/filetransfer.cpp create mode 100644 iris-legacy/iris/jabber/filetransfer.h create mode 100644 iris-legacy/iris/jabber/s5b.cpp create mode 100644 iris-legacy/iris/jabber/s5b.h create mode 100644 iris-legacy/iris/jabber/xmpp_ibb.cpp create mode 100644 iris-legacy/iris/jabber/xmpp_ibb.h create mode 100644 iris-legacy/iris/libidn.pri create mode 100644 iris-legacy/iris/libidn/gunicomp.h create mode 100644 iris-legacy/iris/libidn/gunidecomp.h create mode 100644 iris-legacy/iris/libidn/idn-int.h create mode 100644 iris-legacy/iris/libidn/idna.h create mode 100644 iris-legacy/iris/libidn/internal.h create mode 100644 iris-legacy/iris/libidn/nfkc.c create mode 100644 iris-legacy/iris/libidn/profiles.c create mode 100644 iris-legacy/iris/libidn/punycode.h create mode 100644 iris-legacy/iris/libidn/qint.h create mode 100644 iris-legacy/iris/libidn/rfc3454.c create mode 100644 iris-legacy/iris/libidn/stringprep.c create mode 100644 iris-legacy/iris/libidn/stringprep.h create mode 100644 iris-legacy/iris/unittest/yadatetime/testyadatetime.cpp create mode 100644 iris-legacy/iris/unittest/yadatetime/testyadatetime.pro create mode 100644 iris-legacy/iris/xmpp-core/compress.cpp create mode 100644 iris-legacy/iris/xmpp-core/compress.h create mode 100644 iris-legacy/iris/xmpp-core/compressionhandler.cpp create mode 100644 iris-legacy/iris/xmpp-core/compressionhandler.h create mode 100644 iris-legacy/iris/xmpp-core/connector.cpp create mode 100644 iris-legacy/iris/xmpp-core/jid.cpp create mode 100644 iris-legacy/iris/xmpp-core/parser.cpp create mode 100644 iris-legacy/iris/xmpp-core/parser.h create mode 100644 iris-legacy/iris/xmpp-core/protocol.cpp create mode 100644 iris-legacy/iris/xmpp-core/protocol.h create mode 100644 iris-legacy/iris/xmpp-core/securestream.cpp create mode 100644 iris-legacy/iris/xmpp-core/securestream.h create mode 100644 iris-legacy/iris/xmpp-core/simplesasl.cpp create mode 100644 iris-legacy/iris/xmpp-core/simplesasl.h create mode 100644 iris-legacy/iris/xmpp-core/stream.cpp create mode 100644 iris-legacy/iris/xmpp-core/td.h create mode 100644 iris-legacy/iris/xmpp-core/tlshandler.cpp create mode 100644 iris-legacy/iris/xmpp-core/xmlprotocol.cpp create mode 100644 iris-legacy/iris/xmpp-core/xmlprotocol.h create mode 100644 iris-legacy/iris/xmpp-core/xmpp_stanza.cpp create mode 100644 iris-legacy/iris/xmpp-core/xmpp_yadatetime.cpp create mode 100644 iris-legacy/iris/xmpp-im/client.cpp create mode 100644 iris-legacy/iris/xmpp-im/types.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_discoinfotask.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_discoinfotask.h create mode 100644 iris-legacy/iris/xmpp-im/xmpp_discoitem.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_features.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_task.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_tasks.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_tasks.h create mode 100644 iris-legacy/iris/xmpp-im/xmpp_vcard.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_vcard.h create mode 100644 iris-legacy/iris/xmpp-im/xmpp_xdata.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_xmlcommon.cpp create mode 100644 iris-legacy/iris/xmpp-im/xmpp_xmlcommon.h create mode 100644 iris/.gitignore create mode 100644 iris/COPYING create mode 100644 iris/README create mode 100644 iris/TODO create mode 100644 iris/common.pri create mode 100644 iris/conf_win.pri.example create mode 100644 iris/confapp.pri create mode 100644 iris/confapp_win.pri.example create mode 100644 iris/configure create mode 100644 iris/include/iris/addressresolver.h create mode 100644 iris/include/iris/bsocket.h create mode 100644 iris/include/iris/bytestream.h create mode 100644 iris/include/iris/filetransfer.h create mode 100644 iris/include/iris/httpconnect.h create mode 100644 iris/include/iris/httppoll.h create mode 100644 iris/include/iris/ice176.h create mode 100644 iris/include/iris/im.h create mode 100644 iris/include/iris/irisnetexport.h create mode 100644 iris/include/iris/irisnetglobal.h create mode 100644 iris/include/iris/irisnetplugin.h create mode 100644 iris/include/iris/jdnsshared.h create mode 100644 iris/include/iris/ndns.h create mode 100644 iris/include/iris/netavailability.h create mode 100644 iris/include/iris/netinterface.h create mode 100644 iris/include/iris/netnames.h create mode 100644 iris/include/iris/objectsession.h create mode 100644 iris/include/iris/processquit.h create mode 100644 iris/include/iris/qjdns.h create mode 100644 iris/include/iris/s5b.h create mode 100644 iris/include/iris/safedelete.h create mode 100644 iris/include/iris/servsock.h create mode 100644 iris/include/iris/socks.h create mode 100644 iris/include/iris/srvresolver.h create mode 100644 iris/include/iris/stunallocate.h create mode 100644 iris/include/iris/stunbinding.h create mode 100644 iris/include/iris/stunmessage.h create mode 100644 iris/include/iris/stuntransaction.h create mode 100644 iris/include/iris/turnclient.h create mode 100644 iris/include/iris/udpportreserver.h create mode 100644 iris/include/iris/xmpp.h create mode 100644 iris/include/iris/xmpp_address.h create mode 100644 iris/include/iris/xmpp_agentitem.h create mode 100644 iris/include/iris/xmpp_chatstate.h create mode 100644 iris/include/iris/xmpp_client.h create mode 100644 iris/include/iris/xmpp_clientstream.h create mode 100644 iris/include/iris/xmpp_discoinfotask.h create mode 100644 iris/include/iris/xmpp_discoitem.h create mode 100644 iris/include/iris/xmpp_features.h create mode 100644 iris/include/iris/xmpp_htmlelement.h create mode 100644 iris/include/iris/xmpp_httpauthrequest.h create mode 100644 iris/include/iris/xmpp_jid.h create mode 100644 iris/include/iris/xmpp_liveroster.h create mode 100644 iris/include/iris/xmpp_liverosteritem.h create mode 100644 iris/include/iris/xmpp_message.h create mode 100644 iris/include/iris/xmpp_muc.h create mode 100644 iris/include/iris/xmpp_pubsubitem.h create mode 100644 iris/include/iris/xmpp_pubsubretraction.h create mode 100644 iris/include/iris/xmpp_receipts.h create mode 100644 iris/include/iris/xmpp_resource.h create mode 100644 iris/include/iris/xmpp_resourcelist.h create mode 100644 iris/include/iris/xmpp_roster.h create mode 100644 iris/include/iris/xmpp_rosteritem.h create mode 100644 iris/include/iris/xmpp_rosterx.h create mode 100644 iris/include/iris/xmpp_stanza.h create mode 100644 iris/include/iris/xmpp_status.h create mode 100644 iris/include/iris/xmpp_stream.h create mode 100644 iris/include/iris/xmpp_task.h create mode 100644 iris/include/iris/xmpp_tasks.h create mode 100644 iris/include/iris/xmpp_url.h create mode 100644 iris/include/iris/xmpp_vcard.h create mode 100644 iris/include/iris/xmpp_xdata.h create mode 100644 iris/include/iris/xmpp_xmlcommon.h create mode 100644 iris/include/iris/xmpp_yadatetime.h create mode 100644 iris/include/iris/xmpp_yalastmail.h create mode 100644 iris/iris.pri create mode 100644 iris/iris.pro create mode 100644 iris/iris.qc create mode 100644 iris/qcm/README create mode 100644 iris/qcm/buildmode.qcm create mode 100644 iris/qcm/extra.qcm create mode 100644 iris/qcm/qca.qcm create mode 100644 iris/qcm/qt42.qcm create mode 100644 iris/qcm/universal.qcm create mode 100644 iris/qcm/zlib.qcm create mode 100644 iris/src/irisnet/appledns/appledns.cpp create mode 100644 iris/src/irisnet/appledns/appledns.pri create mode 100644 iris/src/irisnet/appledns/appledns.pro create mode 100644 iris/src/irisnet/appledns/qdnssd.cpp create mode 100644 iris/src/irisnet/appledns/qdnssd.h create mode 100644 iris/src/irisnet/appledns/sdtest.cpp create mode 100644 iris/src/irisnet/appledns/sdtest.pro create mode 100644 iris/src/irisnet/corelib/addressresolver.cpp create mode 100644 iris/src/irisnet/corelib/addressresolver.h create mode 100644 iris/src/irisnet/corelib/corelib.pri create mode 100644 iris/src/irisnet/corelib/corelib.pro create mode 100644 iris/src/irisnet/corelib/irisnetexport.h create mode 100644 iris/src/irisnet/corelib/irisnetglobal.cpp create mode 100644 iris/src/irisnet/corelib/irisnetglobal.h create mode 100644 iris/src/irisnet/corelib/irisnetglobal_p.h create mode 100644 iris/src/irisnet/corelib/irisnetplugin.cpp create mode 100644 iris/src/irisnet/corelib/irisnetplugin.h create mode 100644 iris/src/irisnet/corelib/jdnsshared.cpp create mode 100644 iris/src/irisnet/corelib/jdnsshared.h create mode 100644 iris/src/irisnet/corelib/netavailability.cpp create mode 100644 iris/src/irisnet/corelib/netavailability.h create mode 100644 iris/src/irisnet/corelib/netinterface.cpp create mode 100644 iris/src/irisnet/corelib/netinterface.h create mode 100644 iris/src/irisnet/corelib/netinterface_unix.cpp create mode 100644 iris/src/irisnet/corelib/netinterface_win.cpp create mode 100644 iris/src/irisnet/corelib/netnames.cpp create mode 100644 iris/src/irisnet/corelib/netnames.h create mode 100644 iris/src/irisnet/corelib/netnames_jdns.cpp create mode 100644 iris/src/irisnet/corelib/objectsession.cpp create mode 100644 iris/src/irisnet/corelib/objectsession.h create mode 100644 iris/src/irisnet/irisnet.pro create mode 100644 iris/src/irisnet/noncore/cutestuff/bsocket.cpp create mode 100644 iris/src/irisnet/noncore/cutestuff/bsocket.h create mode 100644 iris/src/irisnet/noncore/cutestuff/bytestream.cpp create mode 100644 iris/src/irisnet/noncore/cutestuff/bytestream.h create mode 100644 iris/src/irisnet/noncore/cutestuff/cutestuff.pri create mode 100644 iris/src/irisnet/noncore/cutestuff/httpconnect.cpp create mode 100644 iris/src/irisnet/noncore/cutestuff/httpconnect.h create mode 100644 iris/src/irisnet/noncore/cutestuff/httppoll.cpp create mode 100644 iris/src/irisnet/noncore/cutestuff/httppoll.h create mode 100644 iris/src/irisnet/noncore/cutestuff/socks.cpp create mode 100644 iris/src/irisnet/noncore/cutestuff/socks.h create mode 100644 iris/src/irisnet/noncore/ice176.cpp create mode 100644 iris/src/irisnet/noncore/ice176.h create mode 100644 iris/src/irisnet/noncore/icecomponent.cpp create mode 100644 iris/src/irisnet/noncore/icecomponent.h create mode 100644 iris/src/irisnet/noncore/icelocaltransport.cpp create mode 100644 iris/src/irisnet/noncore/icelocaltransport.h create mode 100644 iris/src/irisnet/noncore/icetransport.cpp create mode 100644 iris/src/irisnet/noncore/icetransport.h create mode 100644 iris/src/irisnet/noncore/iceturntransport.cpp create mode 100644 iris/src/irisnet/noncore/iceturntransport.h create mode 100644 iris/src/irisnet/noncore/legacy/legacy.pri create mode 100644 iris/src/irisnet/noncore/legacy/ndns.cpp create mode 100644 iris/src/irisnet/noncore/legacy/ndns.h create mode 100644 iris/src/irisnet/noncore/legacy/safedelete.cpp create mode 100644 iris/src/irisnet/noncore/legacy/safedelete.h create mode 100644 iris/src/irisnet/noncore/legacy/servsock.cpp create mode 100644 iris/src/irisnet/noncore/legacy/servsock.h create mode 100644 iris/src/irisnet/noncore/legacy/srvresolver.cpp create mode 100644 iris/src/irisnet/noncore/legacy/srvresolver.h create mode 100644 iris/src/irisnet/noncore/noncore.pri create mode 100644 iris/src/irisnet/noncore/noncore.pro create mode 100644 iris/src/irisnet/noncore/processquit.cpp create mode 100644 iris/src/irisnet/noncore/processquit.h create mode 100644 iris/src/irisnet/noncore/stunallocate.cpp create mode 100644 iris/src/irisnet/noncore/stunallocate.h create mode 100644 iris/src/irisnet/noncore/stunbinding.cpp create mode 100644 iris/src/irisnet/noncore/stunbinding.h create mode 100644 iris/src/irisnet/noncore/stunmessage.cpp create mode 100644 iris/src/irisnet/noncore/stunmessage.h create mode 100644 iris/src/irisnet/noncore/stuntransaction.cpp create mode 100644 iris/src/irisnet/noncore/stuntransaction.h create mode 100644 iris/src/irisnet/noncore/stuntypes.cpp create mode 100644 iris/src/irisnet/noncore/stuntypes.h create mode 100644 iris/src/irisnet/noncore/stunutil.cpp create mode 100644 iris/src/irisnet/noncore/stunutil.h create mode 100644 iris/src/irisnet/noncore/turnclient.cpp create mode 100644 iris/src/irisnet/noncore/turnclient.h create mode 100644 iris/src/irisnet/noncore/udpportreserver.cpp create mode 100644 iris/src/irisnet/noncore/udpportreserver.h create mode 100644 iris/src/jdns/README create mode 100644 iris/src/jdns/TODO create mode 100644 iris/src/jdns/jdns.c create mode 100644 iris/src/jdns/jdns.h create mode 100644 iris/src/jdns/jdns.pri create mode 100644 iris/src/jdns/jdns.pro create mode 100644 iris/src/jdns/jdns_mdnsd.c create mode 100644 iris/src/jdns/jdns_mdnsd.h create mode 100644 iris/src/jdns/jdns_p.h create mode 100644 iris/src/jdns/jdns_packet.c create mode 100644 iris/src/jdns/jdns_packet.h create mode 100644 iris/src/jdns/jdns_sys.c create mode 100644 iris/src/jdns/jdns_util.c create mode 100644 iris/src/jdns/main.cpp create mode 100644 iris/src/jdns/qjdns.cpp create mode 100644 iris/src/jdns/qjdns.h create mode 100644 iris/src/jdns/qjdns_sock.cpp create mode 100644 iris/src/jdns/qjdns_sock.h create mode 100644 iris/src/libbase.pri create mode 100644 iris/src/libidn/gunicomp.h create mode 100644 iris/src/libidn/gunidecomp.h create mode 100644 iris/src/libidn/idn-int.h create mode 100644 iris/src/libidn/idna.h create mode 100644 iris/src/libidn/internal.h create mode 100644 iris/src/libidn/libidn.pri create mode 100644 iris/src/libidn/nfkc.c create mode 100644 iris/src/libidn/profiles.c create mode 100644 iris/src/libidn/punycode.h create mode 100644 iris/src/libidn/qint.h create mode 100644 iris/src/libidn/rfc3454.c create mode 100644 iris/src/libidn/stringprep.c create mode 100644 iris/src/libidn/stringprep.h create mode 100644 iris/src/src.pro create mode 100644 iris/src/xmpp/base/base.pri create mode 100644 iris/src/xmpp/base/randomnumbergenerator.cpp create mode 100644 iris/src/xmpp/base/randomnumbergenerator.h create mode 100644 iris/src/xmpp/base/randrandomnumbergenerator.h create mode 100644 iris/src/xmpp/base/unittest/incrementingrandomnumbergenerator.h create mode 100644 iris/src/xmpp/base/unittest/randomnumbergeneratortest.cpp create mode 100644 iris/src/xmpp/base/unittest/randrandomnumbergeneratortest.cpp create mode 100644 iris/src/xmpp/base/unittest/unittest.pri create mode 100644 iris/src/xmpp/base/unittest/unittest.pro create mode 100644 iris/src/xmpp/base64/base64.cpp create mode 100644 iris/src/xmpp/base64/base64.h create mode 100644 iris/src/xmpp/base64/base64.pri create mode 100644 iris/src/xmpp/base64/unittest/base64test.cpp create mode 100644 iris/src/xmpp/base64/unittest/unittest.pri create mode 100644 iris/src/xmpp/base64/unittest/unittest.pro create mode 100644 iris/src/xmpp/common.pri create mode 100644 iris/src/xmpp/jid/jid.cpp create mode 100644 iris/src/xmpp/jid/jid.h create mode 100644 iris/src/xmpp/jid/jid.pri create mode 100644 iris/src/xmpp/jid/unittest/jidtest.cpp create mode 100644 iris/src/xmpp/jid/unittest/unittest.pri create mode 100644 iris/src/xmpp/jid/unittest/unittest.pro create mode 100644 iris/src/xmpp/modules.pri create mode 100644 iris/src/xmpp/qa/README create mode 100644 iris/src/xmpp/qa/qttestutil/example/example.pro create mode 100644 iris/src/xmpp/qa/qttestutil/example/myfirstclasstest.cpp create mode 100644 iris/src/xmpp/qa/qttestutil/example/mysecondclasstest.cpp create mode 100644 iris/src/xmpp/qa/qttestutil/qttestutil.h create mode 100644 iris/src/xmpp/qa/qttestutil/qttestutil.pri create mode 100644 iris/src/xmpp/qa/qttestutil/simplechecker.cpp create mode 100644 iris/src/xmpp/qa/qttestutil/testregistration.h create mode 100644 iris/src/xmpp/qa/qttestutil/testregistry.cpp create mode 100644 iris/src/xmpp/qa/qttestutil/testregistry.h create mode 100644 iris/src/xmpp/qa/unittest.pri create mode 100644 iris/src/xmpp/qa/unittest.template/myclasstest.cpp create mode 100644 iris/src/xmpp/qa/unittest.template/unittest.pri create mode 100644 iris/src/xmpp/qa/unittest.template/unittest.pro create mode 100644 iris/src/xmpp/qa/unittests.pri create mode 100644 iris/src/xmpp/qa/unittests/unittests.pro create mode 100644 iris/src/xmpp/sasl/digestmd5proplist.cpp create mode 100644 iris/src/xmpp/sasl/digestmd5proplist.h create mode 100644 iris/src/xmpp/sasl/digestmd5response.cpp create mode 100644 iris/src/xmpp/sasl/digestmd5response.h create mode 100644 iris/src/xmpp/sasl/plainmessage.cpp create mode 100644 iris/src/xmpp/sasl/plainmessage.h create mode 100644 iris/src/xmpp/sasl/sasl.pri create mode 100644 iris/src/xmpp/sasl/unittest/digestmd5responsetest.cpp create mode 100644 iris/src/xmpp/sasl/unittest/plainmessagetest.cpp create mode 100644 iris/src/xmpp/sasl/unittest/unittest.pri create mode 100644 iris/src/xmpp/sasl/unittest/unittest.pro create mode 100644 iris/src/xmpp/xmpp-core/compressionhandler.cpp create mode 100644 iris/src/xmpp/xmpp-core/compressionhandler.h create mode 100644 iris/src/xmpp/xmpp-core/connector.cpp create mode 100644 iris/src/xmpp/xmpp-core/parser.cpp create mode 100644 iris/src/xmpp/xmpp-core/parser.h create mode 100644 iris/src/xmpp/xmpp-core/protocol.cpp create mode 100644 iris/src/xmpp/xmpp-core/protocol.h create mode 100644 iris/src/xmpp/xmpp-core/securestream.cpp create mode 100644 iris/src/xmpp/xmpp-core/securestream.h create mode 100644 iris/src/xmpp/xmpp-core/simplesasl.cpp create mode 100644 iris/src/xmpp/xmpp-core/simplesasl.h create mode 100644 iris/src/xmpp/xmpp-core/stream.cpp create mode 100644 iris/src/xmpp/xmpp-core/td.h create mode 100644 iris/src/xmpp/xmpp-core/tlshandler.cpp create mode 100644 iris/src/xmpp/xmpp-core/xmlprotocol.cpp create mode 100644 iris/src/xmpp/xmpp-core/xmlprotocol.h create mode 100644 iris/src/xmpp/xmpp-core/xmpp.h create mode 100644 iris/src/xmpp/xmpp-core/xmpp_clientstream.h create mode 100644 iris/src/xmpp/xmpp-core/xmpp_stanza.cpp create mode 100644 iris/src/xmpp/xmpp-core/xmpp_stanza.h create mode 100644 iris/src/xmpp/xmpp-core/xmpp_stream.h create mode 100644 iris/src/xmpp/xmpp-core/xmpp_yadatetime.cpp create mode 100644 iris/src/xmpp/xmpp-core/xmpp_yadatetime.h create mode 100644 iris/src/xmpp/xmpp-im/client.cpp create mode 100644 iris/src/xmpp/xmpp-im/filetransfer.cpp create mode 100644 iris/src/xmpp/xmpp-im/filetransfer.h create mode 100644 iris/src/xmpp/xmpp-im/im.h create mode 100644 iris/src/xmpp/xmpp-im/s5b.cpp create mode 100644 iris/src/xmpp/xmpp-im/s5b.h create mode 100644 iris/src/xmpp/xmpp-im/types.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_address.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_agentitem.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_chatstate.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_client.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_discoinfotask.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_discoinfotask.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_discoitem.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_discoitem.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_features.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_features.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_htmlelement.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_httpauthrequest.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_ibb.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_ibb.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_liveroster.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_liverosteritem.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_message.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_muc.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_pubsubitem.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_pubsubretraction.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_receipts.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_resource.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_resourcelist.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_roster.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_rosteritem.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_rosterx.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_status.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_task.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_task.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_tasks.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_tasks.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_url.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_vcard.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_vcard.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_xdata.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_xdata.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_xmlcommon.cpp create mode 100644 iris/src/xmpp/xmpp-im/xmpp_xmlcommon.h create mode 100644 iris/src/xmpp/xmpp-im/xmpp_yalastmail.h create mode 100644 iris/src/xmpp/xmpp.pri create mode 100644 iris/src/xmpp/xmpp.pro create mode 100644 iris/src/xmpp/zlib/common.h create mode 100644 iris/src/xmpp/zlib/zlib.pri create mode 100644 iris/src/xmpp/zlib/zlibcompressor.cpp create mode 100644 iris/src/xmpp/zlib/zlibcompressor.h create mode 100644 iris/src/xmpp/zlib/zlibdecompressor.cpp create mode 100644 iris/src/xmpp/zlib/zlibdecompressor.h create mode 100644 iris/tools/icetunnel/icetunnel.pro create mode 100644 iris/tools/icetunnel/main.cpp create mode 100644 iris/tools/nettool/main.cpp create mode 100644 iris/tools/nettool/nettool.pro create mode 100644 iris/tools/tools.pro create mode 100644 iris/tools/xmpptest/test.ui create mode 100644 iris/tools/xmpptest/xmpptest.cpp create mode 100644 iris/tools/xmpptest/xmpptest.pro create mode 100644 iris/unittest/yadatetime/testyadatetime.cpp create mode 100644 iris/unittest/yadatetime/testyadatetime.pro create mode 100644 lang/.gitignore create mode 100644 lang/psi_ru.ts create mode 100644 lang/qt_ru.ts create mode 100644 mac/Info.plist create mode 100644 mac/Makefile.jingle create mode 100644 mac/application.icns create mode 100644 mac/normalize.rb create mode 100644 options/default.xml create mode 100644 options/macosx.xml create mode 100644 options/windows.xml create mode 100644 options/x11.xml create mode 100644 psi-jingle.qc create mode 100644 psi.desktop create mode 100644 psi.pro create mode 100644 psi.qc create mode 100644 psi.qrc create mode 100644 qa/guitest/guitest.cpp create mode 100644 qa/guitest/guitest.h create mode 100644 qa/guitest/guitest.pro create mode 100644 qa/guitest/guitestmanager.cpp create mode 100644 qa/guitest/guitestmanager.h create mode 100644 qa/oldtest/checkall create mode 100644 qa/oldtest/tests.txt create mode 100644 qa/oldtest/unittest.pri create mode 100644 qa/oldtest/unittest.pro create mode 100644 qa/oldtest/update.rb create mode 100644 qa/unittest/unittest.cpp create mode 100644 qa/unittest/unittest.pro create mode 100644 qa/unittest/unittestutil.cpp create mode 100644 qa/unittest/unittestutil.h create mode 100644 qa/valgrind/valgrind.pri create mode 100644 qcm/aspell.qcm create mode 100644 qcm/bundled-qca.qcm create mode 100644 qcm/certstore.qcm create mode 100644 qcm/conf.qcm create mode 100644 qcm/cyrussasl.qcm create mode 100644 qcm/debug.qcm create mode 100644 qcm/dnotify.qcm create mode 100644 qcm/ghbnr.qcm create mode 100644 qcm/google_ft.qcm create mode 100644 qcm/growl.qcm create mode 100644 qcm/jingle.qcm create mode 100644 qcm/kde.qcm create mode 100644 qcm/openssl.qcm create mode 100644 qcm/plugins.qcm create mode 100644 qcm/qca.qcm create mode 100644 qcm/qdbus.qcm create mode 100644 qcm/qt4.qcm create mode 100644 qcm/tests.qcm create mode 100644 qcm/universal.qcm create mode 100644 qcm/xmms.qcm create mode 100644 qcm/xss.qcm create mode 100644 qcm/zlib.qcm create mode 100644 qt-patches/001-all-all-don't emit signals when clearing selection.patch create mode 100644 qt-patches/002-all-all-SmoothScrollBar compatibility.patch create mode 100644 qt-patches/003-all-all-YaTabBar compatibility.patch create mode 100644 qt-patches/004-all-4.3-updated autoscroll region.patch create mode 100644 qt-patches/005-all-all-YaBoldMenu compatibility.patch create mode 100644 qt-patches/006-win-all-hide menu gutter.patch create mode 100644 qt-patches/007-win-4.4-YaWindow minimize fix.patch create mode 100644 qt-patches/008-win-4.3-QContextMenuEvent correctly handles modifiers.patch create mode 100644 qt-patches/009-all-all-disable inlining when debugging.patch create mode 100644 qt-patches/010-win-4.4-win improvements.patch create mode 100644 qt-patches/010-win-4.5-win improvements.patch create mode 100644 qt-patches/011-all-all-multiline tabs enabler.patch create mode 100644 qt-patches/012-win-all-com server installation.patch create mode 100644 qt-patches/013-all-all-YaFlashingScrollBar compatibility.patch create mode 100644 qt-patches/014-win-4.5-breakpad on exceptions.patch create mode 100644 qt-patches/015-win-all-getopenfilename thumbnails.patch create mode 100644 qt-patches/016-win-4.5-all-appwindow windows.patch create mode 100644 qt-patches/017-all-all-QPointer improvements.patch create mode 100644 qt-patches/018-win-all-disable CoUnitialize.patch create mode 100644 qt-patches/019-win-all-build with multiple processes.patch create mode 100644 qt-patches/020-all-all-prettify wavy underline.patch create mode 100644 qt-patches/patch-qt.rb create mode 100644 sound/chat1.wav create mode 100644 sound/chat2.wav create mode 100644 sound/ft_complete.wav create mode 100644 sound/ft_incoming.wav create mode 100644 sound/offline.wav create mode 100644 sound/online.wav create mode 100644 sound/send.wav create mode 100644 sound/subscribe.wav create mode 100644 sound/unsubscribe.wav create mode 100644 src/.gitignore create mode 100644 src/about.ui create mode 100644 src/aboutdlg.cpp create mode 100644 src/aboutdlg.h create mode 100644 src/accountadd.ui create mode 100644 src/accountadddlg.cpp create mode 100644 src/accountadddlg.h create mode 100644 src/accountlabel.cpp create mode 100644 src/accountlabel.h create mode 100644 src/accountmanage.ui create mode 100644 src/accountmanagedlg.cpp create mode 100644 src/accountmanagedlg.h create mode 100644 src/accountmodify.ui create mode 100644 src/accountmodifydlg.cpp create mode 100644 src/accountmodifydlg.h create mode 100644 src/accountreg.ui create mode 100644 src/accountregdlg.cpp create mode 100644 src/accountregdlg.h create mode 100644 src/accountremove.ui create mode 100644 src/accountscombobox.cpp create mode 100644 src/accountscombobox.h create mode 100644 src/actionlist.cpp create mode 100644 src/actionlist.h create mode 100644 src/activeprofiles.cpp create mode 100644 src/activeprofiles.h create mode 100644 src/activeprofiles_dbus.cpp create mode 100644 src/activeprofiles_stub.cpp create mode 100644 src/activeprofiles_win.cpp create mode 100644 src/addurl.ui create mode 100644 src/adduser.ui create mode 100644 src/adduserdlg.cpp create mode 100644 src/adduserdlg.h create mode 100644 src/adhoc_fileserver.cpp create mode 100644 src/adhoc_fileserver.h create mode 100644 src/ahcexecutetask.cpp create mode 100644 src/ahcexecutetask.h create mode 100644 src/ahcformdlg.cpp create mode 100644 src/ahcformdlg.h create mode 100644 src/ahcommand.cpp create mode 100644 src/ahcommand.h create mode 100644 src/ahcommanddlg.cpp create mode 100644 src/ahcommanddlg.h create mode 100644 src/ahcommandserver.cpp create mode 100644 src/ahcommandserver.h create mode 100644 src/ahcservermanager.cpp create mode 100644 src/ahcservermanager.h create mode 100644 src/alertable.cpp create mode 100644 src/alertable.h create mode 100644 src/alerticon.cpp create mode 100644 src/alerticon.h create mode 100644 src/applicationinfo.cpp create mode 100644 src/applicationinfo.h create mode 100644 src/avatars.cpp create mode 100644 src/avatars.h create mode 100644 src/bookmarkmanage.ui create mode 100644 src/bookmarkmanagedlg.cpp create mode 100644 src/bookmarkmanagedlg.h create mode 100644 src/bookmarkmanager.cpp create mode 100644 src/bookmarkmanager.h create mode 100644 src/capabilities/capabilities.pri create mode 100644 src/capabilities/capsmanager.cpp create mode 100644 src/capabilities/capsmanager.h create mode 100644 src/capabilities/capsregistry.cpp create mode 100644 src/capabilities/capsregistry.h create mode 100644 src/capabilities/capsspec.cpp create mode 100644 src/capabilities/capsspec.h create mode 100644 src/capabilities/unittest/capsmanagertest.cpp create mode 100644 src/capabilities/unittest/capsspectest.cpp create mode 100644 src/capabilities/unittest/unittest.pri create mode 100644 src/certutil.cpp create mode 100644 src/certutil.h create mode 100644 src/changepw.ui create mode 100644 src/changepwdlg.cpp create mode 100644 src/changepwdlg.h create mode 100644 src/chatdlg.cpp create mode 100644 src/chatdlg.h create mode 100644 src/chatdlg.ui create mode 100644 src/chatdlgbase.cpp create mode 100644 src/chatdlgbase.h create mode 100644 src/chateditproxy.cpp create mode 100644 src/chateditproxy.h create mode 100644 src/chatsplitter.cpp create mode 100644 src/chatsplitter.h create mode 100644 src/common.cpp create mode 100644 src/common.h create mode 100644 src/conf_iris.pri create mode 100644 src/conferencebookmark.cpp create mode 100644 src/conferencebookmark.h create mode 100644 src/contactlistgroup.cpp create mode 100644 src/contactlistgroup.h create mode 100644 src/contactlistgroupcache.cpp create mode 100644 src/contactlistgroupcache.h create mode 100644 src/contactlistgroupmenu.cpp create mode 100644 src/contactlistgroupmenu.h create mode 100644 src/contactlistgroupstate.cpp create mode 100644 src/contactlistgroupstate.h create mode 100644 src/contactlistitem.cpp create mode 100644 src/contactlistitem.h create mode 100644 src/contactlistitemmenu.cpp create mode 100644 src/contactlistitemmenu.h create mode 100644 src/contactlistitemproxy.h create mode 100644 src/contactlistmodel.cpp create mode 100644 src/contactlistmodel.h create mode 100644 src/contactlistmodelupdater.cpp create mode 100644 src/contactlistmodelupdater.h create mode 100644 src/contactlistnestedgroup.cpp create mode 100644 src/contactlistnestedgroup.h create mode 100644 src/contactlistproxymodel.cpp create mode 100644 src/contactlistproxymodel.h create mode 100644 src/contactlistview.cpp create mode 100644 src/contactlistview.h create mode 100644 src/contactlistviewdelegate.cpp create mode 100644 src/contactlistviewdelegate.h create mode 100644 src/contactupdatesmanager.cpp create mode 100644 src/contactupdatesmanager.h create mode 100644 src/contactview.cpp create mode 100644 src/contactview.h create mode 100644 src/dbus.cpp create mode 100644 src/dbus.h create mode 100644 src/deliveryconfirmationmanager.cpp create mode 100644 src/deliveryconfirmationmanager.h create mode 100644 src/desktoputil.cpp create mode 100644 src/desktoputil.h create mode 100644 src/disco.ui create mode 100644 src/discodlg.cpp create mode 100644 src/discodlg.h create mode 100644 src/dummystream.cpp create mode 100644 src/dummystream.h create mode 100644 src/eventdb.cpp create mode 100644 src/eventdb.h create mode 100644 src/eventdlg.cpp create mode 100644 src/eventdlg.h create mode 100644 src/filetrans.ui create mode 100644 src/filetransdlg.cpp create mode 100644 src/filetransdlg.h create mode 100644 src/fileutil.cpp create mode 100644 src/fileutil.h create mode 100644 src/gcuserview.cpp create mode 100644 src/gcuserview.h create mode 100644 src/geolocation.cpp create mode 100644 src/geolocation.h create mode 100644 src/globaleventqueue.cpp create mode 100644 src/globaleventqueue.h create mode 100644 src/googleftmanager.cpp create mode 100644 src/googleftmanager.h create mode 100644 src/groupchatcontact.cpp create mode 100644 src/groupchatcontact.h create mode 100644 src/groupchatcontactmenu.cpp create mode 100644 src/groupchatcontactmenu.h create mode 100644 src/groupchatdlg.cpp create mode 100644 src/groupchatdlg.h create mode 100644 src/groupchatdlg.ui create mode 100644 src/historydlg.cpp create mode 100644 src/historydlg.h create mode 100644 src/hoverabletreeview.cpp create mode 100644 src/hoverabletreeview.h create mode 100644 src/httpauthmanager.cpp create mode 100644 src/httpauthmanager.h create mode 100644 src/info.ui create mode 100644 src/infodlg.cpp create mode 100644 src/infodlg.h create mode 100644 src/irisprotocol/iris_discoinfoquerier.cpp create mode 100644 src/irisprotocol/iris_discoinfoquerier.h create mode 100644 src/irisprotocol/irisprotocol.pri create mode 100644 src/jidutil.cpp create mode 100644 src/jidutil.h create mode 100644 src/jinglevoicecaller.cpp create mode 100644 src/jinglevoicecaller.h create mode 100644 src/lastactivitytask.cpp create mode 100644 src/lastactivitytask.h create mode 100644 src/main.cpp create mode 100644 src/main.h create mode 100644 src/mainwin.cpp create mode 100644 src/mainwin.h create mode 100644 src/mainwin_p.cpp create mode 100644 src/mainwin_p.h create mode 100644 src/maybe.h create mode 100644 src/miniclient.cpp create mode 100644 src/miniclient.h create mode 100644 src/mood.cpp create mode 100644 src/mood.h create mode 100644 src/mood.ui create mode 100644 src/moodcatalog.cpp create mode 100644 src/moodcatalog.h create mode 100644 src/mooddlg.cpp create mode 100644 src/mooddlg.h create mode 100644 src/msgmle.cpp create mode 100644 src/msgmle.h create mode 100644 src/mucaffiliationsmodel.cpp create mode 100644 src/mucaffiliationsmodel.h create mode 100644 src/mucaffiliationsproxymodel.cpp create mode 100644 src/mucaffiliationsproxymodel.h create mode 100644 src/mucaffiliationsview.cpp create mode 100644 src/mucaffiliationsview.h create mode 100644 src/mucconfig.ui create mode 100644 src/mucconfigdlg.cpp create mode 100644 src/mucconfigdlg.h create mode 100644 src/mucjoin.ui create mode 100644 src/mucjoindlg.cpp create mode 100644 src/mucjoindlg.h create mode 100644 src/mucmanager.cpp create mode 100644 src/mucmanager.h create mode 100644 src/networkinterfacemanager.cpp create mode 100644 src/networkinterfacemanager.h create mode 100644 src/optioneditor.ui create mode 100644 src/options/opt_advanced.cpp create mode 100644 src/options/opt_advanced.h create mode 100644 src/options/opt_advanced.ui create mode 100644 src/options/opt_appearance.cpp create mode 100644 src/options/opt_appearance.h create mode 100644 src/options/opt_appearance.ui create mode 100644 src/options/opt_appearance_misc.ui create mode 100644 src/options/opt_application.cpp create mode 100644 src/options/opt_application.h create mode 100644 src/options/opt_application.ui create mode 100644 src/options/opt_chat.cpp create mode 100644 src/options/opt_chat.h create mode 100644 src/options/opt_chat.ui create mode 100644 src/options/opt_events.cpp create mode 100644 src/options/opt_events.h create mode 100644 src/options/opt_events.ui create mode 100644 src/options/opt_general_groupchat.ui create mode 100644 src/options/opt_groupchat.cpp create mode 100644 src/options/opt_groupchat.h create mode 100644 src/options/opt_iconset.cpp create mode 100644 src/options/opt_iconset.h create mode 100644 src/options/opt_iconset_emo.ui create mode 100644 src/options/opt_iconset_roster.ui create mode 100644 src/options/opt_iconset_system.ui create mode 100644 src/options/opt_lookfeel_toolbars.ui create mode 100644 src/options/opt_plugins.cpp create mode 100644 src/options/opt_plugins.h create mode 100644 src/options/opt_plugins.ui create mode 100644 src/options/opt_shortcuts.cpp create mode 100644 src/options/opt_shortcuts.h create mode 100644 src/options/opt_shortcuts.ui create mode 100644 src/options/opt_sound.cpp create mode 100644 src/options/opt_sound.h create mode 100644 src/options/opt_sound.ui create mode 100644 src/options/opt_status.cpp create mode 100644 src/options/opt_status.h create mode 100644 src/options/opt_status.ui create mode 100644 src/options/opt_toolbars.cpp create mode 100644 src/options/opt_toolbars.h create mode 100644 src/options/opt_tree.cpp create mode 100644 src/options/opt_tree.h create mode 100644 src/options/options.pri create mode 100644 src/options/optionsdlg.cpp create mode 100644 src/options/optionsdlg.h create mode 100644 src/options/optionsdlgiface.h create mode 100644 src/options/optionstab.cpp create mode 100644 src/options/optionstab.h create mode 100644 src/options/ui_isdetails.ui create mode 100644 src/options/ui_options.ui create mode 100644 src/options/ui_positiontoolbar.ui create mode 100644 src/passphrase.ui create mode 100644 src/passphrasedlg.cpp create mode 100644 src/passphrasedlg.h create mode 100644 src/pepmanager.cpp create mode 100644 src/pepmanager.h create mode 100644 src/pgpkey.ui create mode 100644 src/pgpkeydlg.cpp create mode 100644 src/pgpkeydlg.h create mode 100644 src/pgptransaction.cpp create mode 100644 src/pgptransaction.h create mode 100644 src/pgputil.cpp create mode 100644 src/pgputil.h create mode 100644 src/physicallocation.cpp create mode 100644 src/physicallocation.h create mode 100644 src/pixmaputil.cpp create mode 100644 src/pixmaputil.h create mode 100644 src/pluginmanager.cpp create mode 100644 src/pluginmanager.h create mode 100644 src/plugins/generic/chess/chess-standalone.pro create mode 100644 src/plugins/generic/chess/chessplugin.cpp create mode 100644 src/plugins/generic/chess/chessplugin.pro create mode 100644 src/plugins/generic/chess/game-README create mode 100644 src/plugins/generic/chess/gameboard.cpp create mode 100644 src/plugins/generic/chess/gameboard.h create mode 100644 src/plugins/generic/chess/gamesocket.cpp create mode 100644 src/plugins/generic/chess/gamesocket.h create mode 100644 src/plugins/generic/chess/main.cpp create mode 100644 src/plugins/generic/chess/mainwindow.cpp create mode 100644 src/plugins/generic/chess/mainwindow.h create mode 100644 src/plugins/generic/chess/xpm/black_bishop.xpm create mode 100644 src/plugins/generic/chess/xpm/black_castle.xpm create mode 100644 src/plugins/generic/chess/xpm/black_king.xpm create mode 100644 src/plugins/generic/chess/xpm/black_knight.xpm create mode 100644 src/plugins/generic/chess/xpm/black_pawn.xpm create mode 100644 src/plugins/generic/chess/xpm/black_queen.xpm create mode 100644 src/plugins/generic/chess/xpm/chess.xpm create mode 100644 src/plugins/generic/chess/xpm/new_game.xpm create mode 100644 src/plugins/generic/chess/xpm/quit.xpm create mode 100644 src/plugins/generic/chess/xpm/white_bishop.xpm create mode 100644 src/plugins/generic/chess/xpm/white_castle.xpm create mode 100644 src/plugins/generic/chess/xpm/white_king.xpm create mode 100644 src/plugins/generic/chess/xpm/white_knight.xpm create mode 100644 src/plugins/generic/chess/xpm/white_pawn.xpm create mode 100644 src/plugins/generic/chess/xpm/white_queen.xpm create mode 100644 src/plugins/generic/consoledump/consoledumpplugin.cpp create mode 100644 src/plugins/generic/consoledump/consoledumpplugin.pro create mode 100644 src/plugins/generic/echo/echoplugin.cpp create mode 100644 src/plugins/generic/echo/echoplugin.pro create mode 100644 src/plugins/generic/noughtsandcrosses/noughtsandcrossesplugin.cpp create mode 100644 src/plugins/generic/noughtsandcrosses/noughtsandcrossesplugin.pro create mode 100644 src/plugins/generic/noughtsandcrosses/tictac.cpp create mode 100644 src/plugins/generic/noughtsandcrosses/tictac.h create mode 100644 src/plugins/generic/null/nullplugin.cpp create mode 100644 src/plugins/generic/null/nullplugin.pro create mode 100644 src/plugins/generic/python/messagescript.py create mode 100644 src/plugins/generic/python/pythonplugin.cpp create mode 100644 src/plugins/generic/python/pythonplugin.pro create mode 100644 src/plugins/generic/python/xmlmessage.py create mode 100644 src/plugins/generic/urlwatcher/urlevent.h create mode 100644 src/plugins/generic/urlwatcher/urlwatcherplugin.cpp create mode 100644 src/plugins/generic/urlwatcher/urlwatcherplugin.pro create mode 100644 src/plugins/plugins.pri create mode 100644 src/plugins/windows/snarl/SnarlInterface.cpp create mode 100644 src/plugins/windows/snarl/SnarlInterface.h create mode 100644 src/plugins/windows/snarl/snarlplugin.cpp create mode 100644 src/plugins/windows/snarl/snarlplugin.pro create mode 100644 src/pongserver.cpp create mode 100644 src/pongserver.h create mode 100644 src/privacy/guitest/guitest.pri create mode 100644 src/privacy/guitest/mockprivacymanager.cpp create mode 100644 src/privacy/guitest/mockprivacymanager.h create mode 100644 src/privacy/guitest/privacydlgtest.cpp create mode 100644 src/privacy/guitest/privacyruledlgtest.cpp create mode 100644 src/privacy/privacy.pri create mode 100644 src/privacy/privacy.ui create mode 100644 src/privacy/privacydlg.cpp create mode 100644 src/privacy/privacydlg.h create mode 100644 src/privacy/privacylist.cpp create mode 100644 src/privacy/privacylist.h create mode 100644 src/privacy/privacylistblockedmodel.cpp create mode 100644 src/privacy/privacylistblockedmodel.h create mode 100644 src/privacy/privacylistitem.cpp create mode 100644 src/privacy/privacylistitem.h create mode 100644 src/privacy/privacylistmodel.cpp create mode 100644 src/privacy/privacylistmodel.h create mode 100644 src/privacy/privacymanager.h create mode 100644 src/privacy/privacyrule.ui create mode 100644 src/privacy/privacyruledlg.cpp create mode 100644 src/privacy/privacyruledlg.h create mode 100644 src/privacy/psiprivacymanager.cpp create mode 100644 src/privacy/psiprivacymanager.h create mode 100644 src/privacy/unittest/privacylistitemtest.cpp create mode 100644 src/privacy/unittest/unittest.pri create mode 100644 src/profiledlg.cpp create mode 100644 src/profiledlg.h create mode 100644 src/profilemanage.ui create mode 100644 src/profilenew.ui create mode 100644 src/profileopen.ui create mode 100644 src/profiles.h create mode 100644 src/protocol/discoinfoquerier.h create mode 100644 src/protocol/protocol.pri create mode 100644 src/proxy.cpp create mode 100644 src/proxy.h create mode 100644 src/proxy.ui create mode 100644 src/psi_profiles.cpp create mode 100644 src/psiaccount.cpp create mode 100644 src/psiaccount.h create mode 100644 src/psiaccountmenu.cpp create mode 100644 src/psiaccountmenu.h create mode 100644 src/psiactionlist.cpp create mode 100644 src/psiactionlist.h create mode 100644 src/psiactions.h create mode 100644 src/psiapplication.cpp create mode 100644 src/psiapplication.h create mode 100644 src/psichatdlg.cpp create mode 100644 src/psichatdlg.h create mode 100644 src/psicli.h create mode 100644 src/psicon.cpp create mode 100644 src/psicon.h create mode 100644 src/psicontact.cpp create mode 100644 src/psicontact.h create mode 100644 src/psicontactlist.cpp create mode 100644 src/psicontactlist.h create mode 100644 src/psicontactlistmodel.cpp create mode 100644 src/psicontactlistmodel.h create mode 100644 src/psicontactlistview.cpp create mode 100644 src/psicontactlistview.h create mode 100644 src/psicontactmenu.cpp create mode 100644 src/psicontactmenu.h create mode 100644 src/psidbusnotifier.cpp create mode 100644 src/psidbusnotifier.h create mode 100644 src/psievent.cpp create mode 100644 src/psievent.h create mode 100644 src/psigroupchatdlg.cpp create mode 100644 src/psigroupchatdlg.h create mode 100644 src/psigrowlnotifier.cpp create mode 100644 src/psigrowlnotifier.h create mode 100644 src/psihttpauthrequest.h create mode 100644 src/psiiconset.cpp create mode 100644 src/psiiconset.h create mode 100644 src/psilogger.cpp create mode 100644 src/psilogger.h create mode 100644 src/psinotifier.cpp create mode 100644 src/psinotifier.h create mode 100644 src/psinotifierbase.cpp create mode 100644 src/psinotifierbase.h create mode 100644 src/psioptions.cpp create mode 100644 src/psioptions.h create mode 100644 src/psioptionseditor.cpp create mode 100644 src/psioptionseditor.h create mode 100644 src/psiplugin.h create mode 100644 src/psipopup.cpp create mode 100644 src/psipopup.h create mode 100644 src/psiselfcontact.cpp create mode 100644 src/psiselfcontact.h create mode 100644 src/psitoolbar.cpp create mode 100644 src/psitoolbar.h create mode 100644 src/psitrayicon.cpp create mode 100644 src/psitrayicon.h create mode 100644 src/pubsubsubscription.cpp create mode 100644 src/pubsubsubscription.h create mode 100644 src/qwextend.cpp create mode 100644 src/qwextend.h create mode 100644 src/rc.cpp create mode 100644 src/rc.h create mode 100644 src/registrationdlg.cpp create mode 100644 src/registrationdlg.h create mode 100644 src/resourcemenu.cpp create mode 100644 src/resourcemenu.h create mode 100644 src/rosteritemexchangetask.cpp create mode 100644 src/rosteritemexchangetask.h create mode 100644 src/rtparse.cpp create mode 100644 src/rtparse.h create mode 100644 src/search.ui create mode 100644 src/searchdlg.cpp create mode 100644 src/searchdlg.h create mode 100644 src/serverinfomanager.cpp create mode 100644 src/serverinfomanager.h create mode 100644 src/serverlistquerier.cpp create mode 100644 src/serverlistquerier.h create mode 100644 src/shortcutmanager.cpp create mode 100644 src/shortcutmanager.h create mode 100644 src/showtextdlg.cpp create mode 100644 src/showtextdlg.h create mode 100644 src/src.pri create mode 100644 src/src.pro create mode 100644 src/sslcert.ui create mode 100644 src/sslcertdlg.cpp create mode 100644 src/sslcertdlg.h create mode 100644 src/statusdlg.cpp create mode 100644 src/statusdlg.h create mode 100644 src/statusmenu.cpp create mode 100644 src/statusmenu.h create mode 100644 src/statuspreset.cpp create mode 100644 src/statuspreset.h create mode 100644 src/systeminfo.cpp create mode 100644 src/systeminfo.h create mode 100644 src/tabcompletion.cpp create mode 100644 src/tabcompletion.h create mode 100644 src/tabcompletionmuc.h create mode 100644 src/tabs/tabbablewidget.cpp create mode 100644 src/tabs/tabbablewidget.h create mode 100644 src/tabs/tabdlg.cpp create mode 100644 src/tabs/tabdlg.h create mode 100644 src/tabs/tabmanager.cpp create mode 100644 src/tabs/tabmanager.h create mode 100644 src/tabs/tabs.pri create mode 100644 src/tasklist.h create mode 100644 src/textutil.cpp create mode 100644 src/textutil.h create mode 100644 src/tip.ui create mode 100644 src/tipdlg.cpp create mode 100644 src/tipdlg.h create mode 100644 src/tools/advwidget/advwidget.cpp create mode 100644 src/tools/advwidget/advwidget.h create mode 100644 src/tools/advwidget/advwidget.pri create mode 100644 src/tools/advwidget/movetest/main.cpp create mode 100644 src/tools/advwidget/movetest/test.pro create mode 100644 src/tools/animationhelpers/animationhelpers.pri create mode 100644 src/tools/animationhelpers/customtimeline.cpp create mode 100644 src/tools/animationhelpers/customtimeline.h create mode 100644 src/tools/atomicxmlfile/atomicxmlfile.cpp create mode 100644 src/tools/atomicxmlfile/atomicxmlfile.h create mode 100644 src/tools/atomicxmlfile/atomicxmlfile.pri create mode 100644 src/tools/breakpad/breakpad.cpp create mode 100644 src/tools/breakpad/breakpad.h create mode 100644 src/tools/breakpad/breakpad.pri create mode 100644 src/tools/carboncocoa/carboncocoa.h create mode 100644 src/tools/carboncocoa/carboncocoa.m create mode 100644 src/tools/carboncocoa/carboncocoa.pri create mode 100644 src/tools/crash/crash.cpp create mode 100644 src/tools/crash/crash.h create mode 100644 src/tools/crash/crash.pri create mode 100644 src/tools/crash/crash_dummy.cpp create mode 100644 src/tools/crash/crash_kde.cpp create mode 100644 src/tools/crash/crash_sigsegv.cpp create mode 100644 src/tools/crash/crash_sigsegv.h create mode 100644 src/tools/cutejson/cutejson.cpp create mode 100644 src/tools/cutejson/cutejson.h create mode 100644 src/tools/cutejson/cutejson.pri create mode 100644 src/tools/globalshortcut/NDKeyboardLayout.h create mode 100644 src/tools/globalshortcut/NDKeyboardLayout.m create mode 100644 src/tools/globalshortcut/globalshortcut.pri create mode 100644 src/tools/globalshortcut/globalshortcutmanager.cpp create mode 100644 src/tools/globalshortcut/globalshortcutmanager.h create mode 100644 src/tools/globalshortcut/globalshortcutmanager_mac.mm create mode 100644 src/tools/globalshortcut/globalshortcutmanager_win.cpp create mode 100644 src/tools/globalshortcut/globalshortcutmanager_x11.cpp create mode 100644 src/tools/globalshortcut/globalshortcuttrigger.h create mode 100644 src/tools/grepshortcutkeydlg/grepshortcutkeydlg.cpp create mode 100644 src/tools/grepshortcutkeydlg/grepshortcutkeydlg.h create mode 100644 src/tools/grepshortcutkeydlg/grepshortcutkeydlg.pri create mode 100644 src/tools/grepshortcutkeydlg/grepshortcutkeydlg.ui create mode 100644 src/tools/growlnotifier/growlnotifier.h create mode 100644 src/tools/growlnotifier/growlnotifier.mm create mode 100644 src/tools/growlnotifier/growlnotifier.pri create mode 100644 src/tools/growlnotifier/growltest.cpp create mode 100644 src/tools/growlnotifier/growltest.pro create mode 100644 src/tools/httphelper/fileuploaddevice.cpp create mode 100644 src/tools/httphelper/fileuploaddevice.h create mode 100644 src/tools/httphelper/httphelper.cpp create mode 100644 src/tools/httphelper/httphelper.h create mode 100644 src/tools/httphelper/httphelper.pri create mode 100644 src/tools/iconset/ICONSET-HOWTO create mode 100644 src/tools/iconset/anim.cpp create mode 100644 src/tools/iconset/anim.h create mode 100644 src/tools/iconset/iconset.cpp create mode 100644 src/tools/iconset/iconset.h create mode 100644 src/tools/iconset/iconset.pri create mode 100644 src/tools/iconset/unittest/iconsets/emoticons/puz.jisp create mode 100644 src/tools/iconset/unittest/iconsets/roster/default.jisp create mode 100644 src/tools/iconset/unittest/iconsets/roster/small.jisp create mode 100644 src/tools/iconset/unittest/iconsets/system/crystal_system.jisp create mode 100644 src/tools/iconset/unittest/testiconset.cpp create mode 100644 src/tools/iconset/unittest/testiconset.pro create mode 100644 src/tools/idle/idle.cpp create mode 100644 src/tools/idle/idle.h create mode 100644 src/tools/idle/idle.pri create mode 100644 src/tools/idle/idle_mac.cpp create mode 100644 src/tools/idle/idle_win.cpp create mode 100644 src/tools/idle/idle_x11.cpp create mode 100644 src/tools/idle/win32/idleui.cpp create mode 100644 src/tools/idle/win32/idleui.def create mode 100644 src/tools/idle/win32/idleui.dll create mode 100644 src/tools/idle/win32/idleui.h create mode 100644 src/tools/mac_dock/docktest.cpp create mode 100644 src/tools/mac_dock/docktest.pro create mode 100644 src/tools/mac_dock/mac_dock.h create mode 100644 src/tools/mac_dock/mac_dock.mm create mode 100644 src/tools/mac_dock/mac_dock.pri create mode 100644 src/tools/optionstree/optionstest/optionstest.cpp create mode 100644 src/tools/optionstree/optionstest/optionstest.pro create mode 100644 src/tools/optionstree/optionstree.cpp create mode 100644 src/tools/optionstree/optionstree.h create mode 100644 src/tools/optionstree/optionstree.pri create mode 100644 src/tools/optionstree/optionstreemodel.cpp create mode 100644 src/tools/optionstree/optionstreemodel.h create mode 100644 src/tools/optionstree/optionstreeviewtest/optionstreeviewtest.cpp create mode 100644 src/tools/optionstree/optionstreeviewtest/optionstreeviewtest.pro create mode 100644 src/tools/optionstree/varianttree.cpp create mode 100644 src/tools/optionstree/varianttree.h create mode 100644 src/tools/simplecli/simplecli.cpp create mode 100644 src/tools/simplecli/simplecli.h create mode 100644 src/tools/simplecli/simplecli.pri create mode 100644 src/tools/slickwidgets/m11edit.cpp create mode 100644 src/tools/slickwidgets/m11edit.h create mode 100644 src/tools/slickwidgets/m11editablelabel.cpp create mode 100644 src/tools/slickwidgets/m11editablelabel.h create mode 100644 src/tools/slickwidgets/slickwidgets.pri create mode 100644 src/tools/slickwidgets/utils.cpp create mode 100644 src/tools/slickwidgets/utils.h create mode 100644 src/tools/smoothscrollbar/form.ui create mode 100644 src/tools/smoothscrollbar/smoothscrollbar.cpp create mode 100644 src/tools/smoothscrollbar/smoothscrollbar.h create mode 100644 src/tools/smoothscrollbar/smoothscrollbar.pri create mode 100644 src/tools/smoothscrollbar/smoothscrollbartest.pro create mode 100644 src/tools/smoothscrollbar/smoothscrollbartestmain.cpp create mode 100644 src/tools/sparkle/sparkle.h create mode 100644 src/tools/sparkle/sparkle.mm create mode 100644 src/tools/sparkle/sparkle.pri create mode 100644 src/tools/spellchecker/aspellchecker.cpp create mode 100644 src/tools/spellchecker/aspellchecker.h create mode 100644 src/tools/spellchecker/macspellchecker.h create mode 100644 src/tools/spellchecker/macspellchecker.mm create mode 100644 src/tools/spellchecker/privateqt_mac.h create mode 100644 src/tools/spellchecker/privateqt_mac.mm create mode 100644 src/tools/spellchecker/spellchecker.cpp create mode 100644 src/tools/spellchecker/spellchecker.h create mode 100644 src/tools/spellchecker/spellchecker.pri create mode 100644 src/tools/spellchecker/spellcheckingtextedit.cpp create mode 100644 src/tools/spellchecker/spellcheckingtextedit.h create mode 100644 src/tools/spellchecker/spellhighlighter.cpp create mode 100644 src/tools/spellchecker/spellhighlighter.h create mode 100644 src/tools/spellchecker/yandexspeller.cpp create mode 100644 src/tools/spellchecker/yandexspeller.h create mode 100644 src/tools/svgstreamviewer/main.cpp create mode 100644 src/tools/svgstreamviewer/mainwindow.cpp create mode 100644 src/tools/svgstreamviewer/mainwindow.h create mode 100644 src/tools/svgstreamviewer/svgstreamrenderer.cpp create mode 100644 src/tools/svgstreamviewer/svgstreamrenderer.h create mode 100644 src/tools/svgstreamviewer/svgstreamviewer.pro create mode 100644 src/tools/svgstreamviewer/svgstreamwidget.cpp create mode 100644 src/tools/svgstreamviewer/svgstreamwidget.h create mode 100644 src/tools/systemwatch/systemwatch.cpp create mode 100644 src/tools/systemwatch/systemwatch.h create mode 100644 src/tools/systemwatch/systemwatch.pri create mode 100644 src/tools/systemwatch/systemwatch_mac.cpp create mode 100644 src/tools/systemwatch/systemwatch_mac.h create mode 100644 src/tools/systemwatch/systemwatch_unix.cpp create mode 100644 src/tools/systemwatch/systemwatch_unix.h create mode 100644 src/tools/systemwatch/systemwatch_win.cpp create mode 100644 src/tools/systemwatch/systemwatch_win.h create mode 100644 src/tools/trayicon/trayicon.cpp create mode 100644 src/tools/trayicon/trayicon.h create mode 100644 src/tools/trayicon/trayicon.pri create mode 100644 src/tools/trayicon/trayicon_mac.cpp create mode 100644 src/tools/trayicon/trayicon_win.cpp create mode 100644 src/tools/trayicon/trayicon_x11.cpp create mode 100644 src/tools/tunecontroller/combinedtunecontroller.cpp create mode 100644 src/tools/tunecontroller/combinedtunecontroller.h create mode 100644 src/tools/tunecontroller/filetunecontroller.cpp create mode 100644 src/tools/tunecontroller/filetunecontroller.h create mode 100644 src/tools/tunecontroller/plugins/itunes/itunescontroller.cpp create mode 100644 src/tools/tunecontroller/plugins/itunes/itunescontroller.h create mode 100644 src/tools/tunecontroller/plugins/itunes/itunesplugin.cpp create mode 100644 src/tools/tunecontroller/plugins/psifile/psifilecontroller.cpp create mode 100644 src/tools/tunecontroller/plugins/psifile/psifilecontroller.h create mode 100644 src/tools/tunecontroller/plugins/psifile/psifileplugin.cpp create mode 100644 src/tools/tunecontroller/plugins/psifile/psifileplugin.h create mode 100644 src/tools/tunecontroller/plugins/winamp/third-party/wa_ipc.h create mode 100644 src/tools/tunecontroller/plugins/winamp/winampcontroller.cpp create mode 100644 src/tools/tunecontroller/plugins/winamp/winampcontroller.h create mode 100644 src/tools/tunecontroller/plugins/winamp/winampplugin.cpp create mode 100644 src/tools/tunecontroller/plugins/winamp/winampplugin.h create mode 100644 src/tools/tunecontroller/plugins/xmms/xmmscontroller.cpp create mode 100644 src/tools/tunecontroller/plugins/xmms/xmmscontroller.h create mode 100644 src/tools/tunecontroller/plugins/xmms/xmmsplugin.cpp create mode 100644 src/tools/tunecontroller/pollingtunecontroller.cpp create mode 100644 src/tools/tunecontroller/pollingtunecontroller.h create mode 100644 src/tools/tunecontroller/src.pro create mode 100644 src/tools/tunecontroller/tune.h create mode 100644 src/tools/tunecontroller/tunecontroller.h create mode 100644 src/tools/tunecontroller/tunecontroller.pri create mode 100644 src/tools/tunecontroller/tunecontrollerinterface.h create mode 100644 src/tools/tunecontroller/tunecontrollermanager.cpp create mode 100644 src/tools/tunecontroller/tunecontrollermanager.h create mode 100644 src/tools/tunecontroller/tunecontrollerplugin.h create mode 100644 src/tools/yastuff/.gitignore create mode 100644 src/tools/yastuff/delayedvariable.h create mode 100644 src/tools/yastuff/delayedvariablebase.cpp create mode 100644 src/tools/yastuff/delayedvariablebase.h create mode 100644 src/tools/yastuff/fakegroupcontact.cpp create mode 100644 src/tools/yastuff/fakegroupcontact.h create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/angel.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/beer.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/blush.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/bomb.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/boyan1.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/boyan2.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/boyan3.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/brainsucker.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/brokenheart.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/cake.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/cup.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/earth.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/evil.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/glasses.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/hmm.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/icondef.xml create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/idea.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/jabber.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/kiss.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/lol.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/love.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/mad.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/mail.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/money.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/moon.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/music.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/no.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/phone.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/rain.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/rose.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/sad.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/sad_wink.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/sick.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/smile.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/snow.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/star.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/sun.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/tired.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/tongue.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/tss.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/wait.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/wet.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/wink.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/woot.gif create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/worry.png create mode 100644 src/tools/yastuff/iconsets/emoticons/yaemomidget/yes.gif create mode 100644 src/tools/yastuff/iconsets/roster/default/gc-available.png create mode 100644 src/tools/yastuff/iconsets/roster/default/gc-fav.png create mode 100644 src/tools/yastuff/iconsets/roster/default/gc-unavailable.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-away.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-busy.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-invisible.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-lock.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-offline.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-online.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icon-warning.png create mode 100644 src/tools/yastuff/iconsets/roster/default/icondef.xml create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/away.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/dnd.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/icondef.xml create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/invisible.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/lock.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/offline.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/online.png create mode 100644 src/tools/yastuff/iconsets/roster/roster-big/warning.png create mode 100644 src/tools/yastuff/images/addcontact.png create mode 100644 src/tools/yastuff/images/addcontactok.png create mode 100644 src/tools/yastuff/images/addcontactok_over.png create mode 100644 src/tools/yastuff/images/avatars/avatar01.png create mode 100644 src/tools/yastuff/images/avatars/avatar02.png create mode 100644 src/tools/yastuff/images/avatars/avatar03.png create mode 100644 src/tools/yastuff/images/avatars/avatar04.png create mode 100644 src/tools/yastuff/images/avatars/avatar05.png create mode 100644 src/tools/yastuff/images/avatars/avatar06.png create mode 100644 src/tools/yastuff/images/avatars/avatar07.png create mode 100644 src/tools/yastuff/images/avatars/avatar08.png create mode 100644 src/tools/yastuff/images/avatars/avatar09.png create mode 100644 src/tools/yastuff/images/avatars/avatar10.png create mode 100644 src/tools/yastuff/images/avatars/avatar11.png create mode 100644 src/tools/yastuff/images/avatars/avatar12.png create mode 100644 src/tools/yastuff/images/avatars/avatar13.png create mode 100644 src/tools/yastuff/images/avatars/avatar14.png create mode 100644 src/tools/yastuff/images/avatars/avatar15.png create mode 100644 src/tools/yastuff/images/avatars/avatar16.png create mode 100644 src/tools/yastuff/images/avatars/avatar17.png create mode 100644 src/tools/yastuff/images/avatars/avatar18.png create mode 100644 src/tools/yastuff/images/avatars/avatar19.png create mode 100644 src/tools/yastuff/images/avatars/avatar20.png create mode 100644 src/tools/yastuff/images/avatars/avatar21.png create mode 100644 src/tools/yastuff/images/avatars/avatar22.png create mode 100644 src/tools/yastuff/images/avatars/avatar23.png create mode 100644 src/tools/yastuff/images/avatars/avatar24.png create mode 100644 src/tools/yastuff/images/balloon/mood/arrow.png create mode 100644 src/tools/yastuff/images/balloon/mood/bottom_center.png create mode 100644 src/tools/yastuff/images/balloon/mood/bottom_left.png create mode 100644 src/tools/yastuff/images/balloon/mood/bottom_right.png create mode 100644 src/tools/yastuff/images/balloon/mood/middle_center.png create mode 100644 src/tools/yastuff/images/balloon/mood/middle_left.png create mode 100644 src/tools/yastuff/images/balloon/mood/middle_right.png create mode 100644 src/tools/yastuff/images/balloon/mood/top_center.png create mode 100644 src/tools/yastuff/images/balloon/mood/top_left.png create mode 100644 src/tools/yastuff/images/balloon/mood/top_right.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/arrow.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/bottom_center.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/bottom_left.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/bottom_right.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/middle_center.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/middle_left.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/middle_right.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/top_center.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/top_left.png create mode 100644 src/tools/yastuff/images/balloon/mood_editing/top_right.png create mode 100644 src/tools/yastuff/images/busy/0.png create mode 100644 src/tools/yastuff/images/busy/1.png create mode 100644 src/tools/yastuff/images/busy/2.png create mode 100644 src/tools/yastuff/images/busy/3.png create mode 100644 src/tools/yastuff/images/busy/4.png create mode 100644 src/tools/yastuff/images/busy/5.png create mode 100644 src/tools/yastuff/images/busy/6.png create mode 100644 src/tools/yastuff/images/chat/button.png create mode 100644 src/tools/yastuff/images/chat/button_pressed.png create mode 100644 src/tools/yastuff/images/chat/button_pressed_background.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/1.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/2.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/3.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/4.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/5.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/6.png create mode 100644 src/tools/yastuff/images/chat/closetab_button/7.png create mode 100644 src/tools/yastuff/images/chat/composing/keyboard.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0001.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0002.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0003.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0004.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0005.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0006.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0007.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0008.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0009.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0010.png create mode 100644 src/tools/yastuff/images/chat/composing/keys0011.png create mode 100644 src/tools/yastuff/images/chat/delivery_confirmation_fail.png create mode 100644 src/tools/yastuff/images/chat/delivery_confirmation_ok.png create mode 100644 src/tools/yastuff/images/chat/delivery_confirmation_server_fail.png create mode 100644 src/tools/yastuff/images/chat/delivery_confirmation_server_ok.png create mode 100644 src/tools/yastuff/images/chat/emoticon_background.png create mode 100644 src/tools/yastuff/images/chat/emoticon_overlay.png create mode 100644 src/tools/yastuff/images/chat/emoticon_overlay_hover.png create mode 100644 src/tools/yastuff/images/chat/fader.png create mode 100644 src/tools/yastuff/images/chat/info_button/0.png create mode 100644 src/tools/yastuff/images/chat/info_button/1.png create mode 100644 src/tools/yastuff/images/chat/info_button/2.png create mode 100644 src/tools/yastuff/images/chat/info_button/3.png create mode 100644 src/tools/yastuff/images/chat/info_button/4.png create mode 100644 src/tools/yastuff/images/chat/info_button/5.png create mode 100644 src/tools/yastuff/images/chat/info_button/6.png create mode 100644 src/tools/yastuff/images/chat/info_button/7.png create mode 100644 src/tools/yastuff/images/chat/profile_background.png create mode 100644 src/tools/yastuff/images/chat/profile_background_academic.png create mode 100644 src/tools/yastuff/images/chat/send_button/send.png create mode 100644 src/tools/yastuff/images/chat/send_button/send_disabled.png create mode 100644 src/tools/yastuff/images/chat/send_button/send_hover.png create mode 100644 src/tools/yastuff/images/chat/send_button/send_pressed.png create mode 100644 src/tools/yastuff/images/chat/smile.png create mode 100644 src/tools/yastuff/images/chat/sprite-16x16.png create mode 100644 src/tools/yastuff/images/chat/tab_active.png create mode 100644 src/tools/yastuff/images/chat/tab_inactive.png create mode 100644 src/tools/yastuff/images/chat/tooltip_area.png create mode 100644 src/tools/yastuff/images/chat/typo_disabled.png create mode 100644 src/tools/yastuff/images/chat/typo_disabled_hover.png create mode 100644 src/tools/yastuff/images/chat/typo_enabled.png create mode 100644 src/tools/yastuff/images/chat/typo_enabled_hover.png create mode 100644 src/tools/yastuff/images/chat/upload.png create mode 100644 src/tools/yastuff/images/chat_send.png create mode 100644 src/tools/yastuff/images/chat_windowicon.png create mode 100644 src/tools/yastuff/images/chat_windowicon32.png create mode 100644 src/tools/yastuff/images/checkbox_checked.png create mode 100644 src/tools/yastuff/images/checkbox_checked_disabled.png create mode 100644 src/tools/yastuff/images/checkbox_checked_hover.png create mode 100644 src/tools/yastuff/images/checkbox_checked_pressed.png create mode 100644 src/tools/yastuff/images/checkbox_unchecked.png create mode 100644 src/tools/yastuff/images/checkbox_unchecked_disabled.png create mode 100644 src/tools/yastuff/images/checkbox_unchecked_hover.png create mode 100644 src/tools/yastuff/images/checkbox_unchecked_pressed.png create mode 100644 src/tools/yastuff/images/chevron.png create mode 100644 src/tools/yastuff/images/chevron_blinking.png create mode 100644 src/tools/yastuff/images/chevron_pressed.png create mode 100644 src/tools/yastuff/images/closetab.png create mode 100644 src/tools/yastuff/images/closetab_chat.png create mode 100644 src/tools/yastuff/images/closetab_hover.png create mode 100644 src/tools/yastuff/images/closetab_pressed.png create mode 100644 src/tools/yastuff/images/down-arrow/hover.png create mode 100644 src/tools/yastuff/images/down-arrow/normal.png create mode 100644 src/tools/yastuff/images/down-arrow/pressed.png create mode 100644 src/tools/yastuff/images/down_arrow.png create mode 100644 src/tools/yastuff/images/down_arrow_disabled.png create mode 100644 src/tools/yastuff/images/envelope_overlay.png create mode 100644 src/tools/yastuff/images/eventnotifier_close.png create mode 100644 src/tools/yastuff/images/eventnotifier_close_informer.png create mode 100644 src/tools/yastuff/images/expand_closed.png create mode 100644 src/tools/yastuff/images/expand_opened.png create mode 100644 src/tools/yastuff/images/filter.png create mode 100644 src/tools/yastuff/images/gender/default_avatar.png create mode 100644 src/tools/yastuff/images/gender/default_multiple_avatar.png create mode 100644 src/tools/yastuff/images/gender/gm.gif create mode 100644 src/tools/yastuff/images/gender/gn.gif create mode 100644 src/tools/yastuff/images/gender/gw.gif create mode 100644 src/tools/yastuff/images/group/background.png create mode 100644 src/tools/yastuff/images/group/closed_hover.png create mode 100644 src/tools/yastuff/images/group/closed_normal.png create mode 100644 src/tools/yastuff/images/group/open_hover.png create mode 100644 src/tools/yastuff/images/group/open_normal.png create mode 100644 src/tools/yastuff/images/groupchat/edit_locked_idle.png create mode 100644 src/tools/yastuff/images/groupchat/edit_unlocked_hover.png create mode 100644 src/tools/yastuff/images/groupchat/edit_unlocked_idle.png create mode 100644 src/tools/yastuff/images/groupchat/fav_hover.png create mode 100644 src/tools/yastuff/images/groupchat/fav_idle.png create mode 100644 src/tools/yastuff/images/groupchat/fav_pressed.png create mode 100644 src/tools/yastuff/images/groupchat/gc-available.png create mode 100644 src/tools/yastuff/images/groupchat/join-close-hover.png create mode 100644 src/tools/yastuff/images/groupchat/join-close.png create mode 100644 src/tools/yastuff/images/groupchat/join-icon.png create mode 100644 src/tools/yastuff/images/groupchat/join-lineedit.png create mode 100644 src/tools/yastuff/images/groupchat/join-lineedit2.png create mode 100644 src/tools/yastuff/images/groupchat/join-locked.png create mode 100644 src/tools/yastuff/images/groupchat/join-unlocked.png create mode 100644 src/tools/yastuff/images/groupchat/occupants.png create mode 100644 src/tools/yastuff/images/groupchat/splitter.png create mode 100644 src/tools/yastuff/images/jabber.png create mode 100644 src/tools/yastuff/images/mail.png create mode 100644 src/tools/yastuff/images/main-window/connecting_animation.gif create mode 100644 src/tools/yastuff/images/main-window/contact-list/bottom_center.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/bottom_left.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/bottom_right.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/middle_center.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/middle_left.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/middle_right.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/top_center.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/top_left.png create mode 100644 src/tools/yastuff/images/main-window/contact-list/top_right.png create mode 100644 src/tools/yastuff/images/main-window/error_animation.gif create mode 100644 src/tools/yastuff/images/no-contacts/yaru.png create mode 100644 src/tools/yastuff/images/okbutton.png create mode 100644 src/tools/yastuff/images/okbutton_pressed.png create mode 100644 src/tools/yastuff/images/pushbutton/cancel/cancel_hover.png create mode 100644 src/tools/yastuff/images/pushbutton/cancel/cancel_idle.png create mode 100644 src/tools/yastuff/images/pushbutton/cancel/cancel_pressed.png create mode 100644 src/tools/yastuff/images/pushbutton/green/pushbutton.png create mode 100644 src/tools/yastuff/images/pushbutton/green/pushbutton_hover.png create mode 100644 src/tools/yastuff/images/pushbutton/green/pushbutton_pressed.png create mode 100644 src/tools/yastuff/images/pushbutton/ok/ok_hover.png create mode 100644 src/tools/yastuff/images/pushbutton/ok/ok_idle.png create mode 100644 src/tools/yastuff/images/pushbutton/ok/ok_pressed.png create mode 100644 src/tools/yastuff/images/pushbutton/preferences_tab/pushbutton.png create mode 100644 src/tools/yastuff/images/pushbutton/preferences_tab/pushbutton_hover.png create mode 100644 src/tools/yastuff/images/pushbutton/preferences_tab/pushbutton_pressed.png create mode 100644 src/tools/yastuff/images/pushbutton/red/pushbutton.png create mode 100644 src/tools/yastuff/images/pushbutton/red/pushbutton_hover.png create mode 100644 src/tools/yastuff/images/pushbutton/red/pushbutton_pressed.png create mode 100644 src/tools/yastuff/images/radiobutton_checked.png create mode 100644 src/tools/yastuff/images/radiobutton_checked_hover.png create mode 100644 src/tools/yastuff/images/radiobutton_checked_pressed.png create mode 100644 src/tools/yastuff/images/radiobutton_unchecked.png create mode 100644 src/tools/yastuff/images/radiobutton_unchecked_hover.png create mode 100644 src/tools/yastuff/images/radiobutton_unchecked_pressed.png create mode 100644 src/tools/yastuff/images/roster_lineedit.png create mode 100644 src/tools/yastuff/images/rostertab_background.png create mode 100644 src/tools/yastuff/images/rostertab_background2.png create mode 100644 src/tools/yastuff/images/rostertab_background_inactive.png create mode 100644 src/tools/yastuff/images/scrollbar/background_active.png create mode 100644 src/tools/yastuff/images/scrollbar/background_inactive.png create mode 100644 src/tools/yastuff/images/scrollbar/background_inactive2.png create mode 100644 src/tools/yastuff/images/scrollbar/dbutton_idle.png create mode 100644 src/tools/yastuff/images/scrollbar/dbutton_over.png create mode 100644 src/tools/yastuff/images/scrollbar/dbutton_pressed.png create mode 100644 src/tools/yastuff/images/scrollbar/handle_idle.png create mode 100644 src/tools/yastuff/images/scrollbar/handle_over.png create mode 100644 src/tools/yastuff/images/scrollbar/handle_pressed.png create mode 100644 src/tools/yastuff/images/scrollbar/ubutton_idle.png create mode 100644 src/tools/yastuff/images/scrollbar/ubutton_over.png create mode 100644 src/tools/yastuff/images/scrollbar/ubutton_pressed.png create mode 100644 src/tools/yastuff/images/sizegrip.png create mode 100644 src/tools/yastuff/images/spindown.png create mode 100644 src/tools/yastuff/images/spindown_hover.png create mode 100644 src/tools/yastuff/images/spindown_off.png create mode 100644 src/tools/yastuff/images/spindown_pressed.png create mode 100644 src/tools/yastuff/images/spinup.png create mode 100644 src/tools/yastuff/images/spinup_hover.png create mode 100644 src/tools/yastuff/images/spinup_off.png create mode 100644 src/tools/yastuff/images/spinup_pressed.png create mode 100644 src/tools/yastuff/images/trayicon/away.png create mode 100644 src/tools/yastuff/images/trayicon/dnd.png create mode 100644 src/tools/yastuff/images/trayicon/offline.png create mode 100644 src/tools/yastuff/images/trayicon/online.png create mode 100644 src/tools/yastuff/images/trayicon/problem.png create mode 100644 src/tools/yastuff/images/trayicon/problem_away.png create mode 100644 src/tools/yastuff/images/trayicon/problem_dnd.png create mode 100644 src/tools/yastuff/images/up_arrow.png create mode 100644 src/tools/yastuff/images/up_arrow_disabled.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_add.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_block.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_email.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_fotki.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_history.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_profile.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_remove.png create mode 100644 src/tools/yastuff/images/user-actions/button_glyph_rename.png create mode 100644 src/tools/yastuff/images/window/aa-corner/bottom_left.png create mode 100644 src/tools/yastuff/images/window/aa-corner/bottom_right.png create mode 100644 src/tools/yastuff/images/window/aa-corner/top_left.png create mode 100644 src/tools/yastuff/images/window/aa-corner/top_right.png create mode 100644 src/tools/yastuff/images/window/background/academic.png create mode 100644 src/tools/yastuff/images/window/background/baroque.png create mode 100644 src/tools/yastuff/images/window/background/glamour.png create mode 100644 src/tools/yastuff/images/window/background/hawaii.png create mode 100644 src/tools/yastuff/images/window/background/ice.png create mode 100644 src/tools/yastuff/images/window/background/logo/academic.png create mode 100644 src/tools/yastuff/images/window/background/logo/baroque.png create mode 100644 src/tools/yastuff/images/window/background/logo/glamour.png create mode 100644 src/tools/yastuff/images/window/background/logo/hawaii.png create mode 100644 src/tools/yastuff/images/window/background/logo/ice.png create mode 100644 src/tools/yastuff/images/window/background/logo/sea.png create mode 100644 src/tools/yastuff/images/window/background/logo/sky.png create mode 100644 src/tools/yastuff/images/window/background/logo/spring.png create mode 100644 src/tools/yastuff/images/window/background/logo/violet.png create mode 100644 src/tools/yastuff/images/window/background/relief/glamour.png create mode 100644 src/tools/yastuff/images/window/background/sea.png create mode 100644 src/tools/yastuff/images/window/background/sky.png create mode 100644 src/tools/yastuff/images/window/background/spring.png create mode 100644 src/tools/yastuff/images/window/background/violet.png create mode 100644 src/tools/yastuff/images/window/buttons/academic/close.png create mode 100644 src/tools/yastuff/images/window/buttons/academic/gear.png create mode 100644 src/tools/yastuff/images/window/buttons/academic/maximize.png create mode 100644 src/tools/yastuff/images/window/buttons/academic/minimize.png create mode 100644 src/tools/yastuff/images/window/buttons/black/close.png create mode 100644 src/tools/yastuff/images/window/buttons/glamour/close.png create mode 100644 src/tools/yastuff/images/window/buttons/glamour/gear.png create mode 100644 src/tools/yastuff/images/window/buttons/glamour/maximize.png create mode 100644 src/tools/yastuff/images/window/buttons/glamour/minimize.png create mode 100644 src/tools/yastuff/images/window/buttons/ice/close.png create mode 100644 src/tools/yastuff/images/window/buttons/ice/gear.png create mode 100644 src/tools/yastuff/images/window/buttons/ice/maximize.png create mode 100644 src/tools/yastuff/images/window/buttons/ice/minimize.png create mode 100644 src/tools/yastuff/images/window/buttons/normal/close.png create mode 100644 src/tools/yastuff/images/window/buttons/normal/gear.png create mode 100644 src/tools/yastuff/images/window/buttons/normal/maximize.png create mode 100644 src/tools/yastuff/images/window/buttons/normal/minimize.png create mode 100644 src/tools/yastuff/images/window/buttons/spring/close.png create mode 100644 src/tools/yastuff/images/window/buttons/spring/gear.png create mode 100644 src/tools/yastuff/images/window/buttons/spring/maximize.png create mode 100644 src/tools/yastuff/images/window/buttons/spring/minimize.png create mode 100644 src/tools/yastuff/images/window/online_expansion/academic.png create mode 100644 src/tools/yastuff/images/window/online_expansion/baroque.png create mode 100644 src/tools/yastuff/images/window/online_expansion/glamour.png create mode 100644 src/tools/yastuff/images/window/online_expansion/hawaii.png create mode 100644 src/tools/yastuff/images/window/online_expansion/ice.png create mode 100644 src/tools/yastuff/images/window/online_expansion/sea.png create mode 100644 src/tools/yastuff/images/window/online_expansion/sky.png create mode 100644 src/tools/yastuff/images/window/online_expansion/spring.png create mode 100644 src/tools/yastuff/images/window/online_expansion/violet.png create mode 100644 src/tools/yastuff/images/window/online_expansion_aa.png create mode 100644 src/tools/yastuff/images/window/online_expansion_mask.bmp create mode 100644 src/tools/yastuff/images/window/online_expansion_shadow.png create mode 100644 src/tools/yastuff/images/window/shadow/bottom_center.png create mode 100644 src/tools/yastuff/images/window/shadow/bottom_left.png create mode 100644 src/tools/yastuff/images/window/shadow/bottom_right.png create mode 100644 src/tools/yastuff/images/window/shadow/middle_center.png create mode 100644 src/tools/yastuff/images/window/shadow/middle_left.png create mode 100644 src/tools/yastuff/images/window/shadow/middle_right.png create mode 100644 src/tools/yastuff/images/window/shadow/top_center.png create mode 100644 src/tools/yastuff/images/window/shadow/top_left.png create mode 100644 src/tools/yastuff/images/window/shadow/top_right.png create mode 100644 src/tools/yastuff/images/window/shadow2/bottom_center.png create mode 100644 src/tools/yastuff/images/window/shadow2/bottom_left.png create mode 100644 src/tools/yastuff/images/window/shadow2/bottom_right.png create mode 100644 src/tools/yastuff/images/window/shadow2/middle_center.png create mode 100644 src/tools/yastuff/images/window/shadow2/middle_left.png create mode 100644 src/tools/yastuff/images/window/shadow2/middle_right.png create mode 100644 src/tools/yastuff/images/window/shadow2/top_center.png create mode 100644 src/tools/yastuff/images/window/shadow2/top_left.png create mode 100644 src/tools/yastuff/images/window/shadow2/top_right.png create mode 100644 src/tools/yastuff/images/window/themes.xml create mode 100644 src/tools/yastuff/images/window/top_left_corner_mask_4px.bmp create mode 100644 src/tools/yastuff/images/window/top_left_corner_mask_6px.bmp create mode 100644 src/tools/yastuff/images/window/top_left_corner_mask_8px.bmp create mode 100644 src/tools/yastuff/images/windowicon_green.png create mode 100644 src/tools/yastuff/images/windowicon_green32.png create mode 100644 src/tools/yastuff/images/windowicon_red.png create mode 100644 src/tools/yastuff/images/windowicon_red32.png create mode 100644 src/tools/yastuff/images/windowicon_yellow.png create mode 100644 src/tools/yastuff/images/windowicon_yellow32.png create mode 100644 src/tools/yastuff/syntaxhighlighters/combinedsyntaxhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/combinedsyntaxhighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/cpphighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/cpphighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/listhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/listhighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/quotationhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/quotationhighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/syntaxhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/syntaxhighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/syntaxhighlighters.pri create mode 100644 src/tools/yastuff/syntaxhighlighters/test/main.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/test/test.pro create mode 100644 src/tools/yastuff/syntaxhighlighters/typographyhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/typographyhighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/wikihighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/wikihighlighter.h create mode 100644 src/tools/yastuff/syntaxhighlighters/yaautoreplacer.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/yaautoreplacer.h create mode 100644 src/tools/yastuff/syntaxhighlighters/yaspellhighlighter.cpp create mode 100644 src/tools/yastuff/syntaxhighlighters/yaspellhighlighter.h create mode 100644 src/tools/yastuff/tostertest/main.cpp create mode 100644 src/tools/yastuff/tostertest/tostertest.pro create mode 100644 src/tools/yastuff/uitest/.gitignore create mode 100644 src/tools/yastuff/uitest/stylesheeteditor.cpp create mode 100644 src/tools/yastuff/uitest/stylesheeteditor.h create mode 100644 src/tools/yastuff/uitest/stylesheeteditor.ui create mode 100644 src/tools/yastuff/uitest/uitest.cpp create mode 100644 src/tools/yastuff/uitest/uitest.pro create mode 100644 src/tools/yastuff/yaabout.cpp create mode 100644 src/tools/yastuff/yaabout.h create mode 100644 src/tools/yastuff/yaabout.ui create mode 100644 src/tools/yastuff/yaaddcontacthelper.cpp create mode 100644 src/tools/yastuff/yaaddcontacthelper.h create mode 100644 src/tools/yastuff/yachatdialog.ui create mode 100644 src/tools/yastuff/yachatdlg.cpp create mode 100644 src/tools/yastuff/yachatdlg.h create mode 100644 src/tools/yastuff/yachatdlgshared.cpp create mode 100644 src/tools/yastuff/yachatdlgshared.h create mode 100644 src/tools/yastuff/yachattiplabel.cpp create mode 100644 src/tools/yastuff/yachattiplabel.h create mode 100644 src/tools/yastuff/yachattooltip.cpp create mode 100644 src/tools/yastuff/yachattooltip.h create mode 100644 src/tools/yastuff/yacommon.cpp create mode 100644 src/tools/yastuff/yacommon.h create mode 100644 src/tools/yastuff/yacontactlistcontactsmodel.cpp create mode 100644 src/tools/yastuff/yacontactlistcontactsmodel.h create mode 100644 src/tools/yastuff/yacontactlistmodel.cpp create mode 100644 src/tools/yastuff/yacontactlistmodel.h create mode 100644 src/tools/yastuff/yacontactlistmodelselection.cpp create mode 100644 src/tools/yastuff/yacontactlistmodelselection.h create mode 100644 src/tools/yastuff/yadayuse.cpp create mode 100644 src/tools/yastuff/yadayuse.h create mode 100644 src/tools/yastuff/yadebugconsole.cpp create mode 100644 src/tools/yastuff/yadebugconsole.h create mode 100644 src/tools/yastuff/yadebugconsole.ui create mode 100644 src/tools/yastuff/yaeventnotifier.cpp create mode 100644 src/tools/yastuff/yaeventnotifier.h create mode 100644 src/tools/yastuff/yaeventnotifier.ui create mode 100644 src/tools/yastuff/yaexception.cpp create mode 100644 src/tools/yastuff/yaexception.h create mode 100644 src/tools/yastuff/yagroupchatcombobox.cpp create mode 100644 src/tools/yastuff/yagroupchatcombobox.h create mode 100644 src/tools/yastuff/yagroupchatcontactlistmenu.cpp create mode 100644 src/tools/yastuff/yagroupchatcontactlistmenu.h create mode 100644 src/tools/yastuff/yagroupchatcontactlistmodel.cpp create mode 100644 src/tools/yastuff/yagroupchatcontactlistmodel.h create mode 100644 src/tools/yastuff/yagroupchatcontactlistview.cpp create mode 100644 src/tools/yastuff/yagroupchatcontactlistview.h create mode 100644 src/tools/yastuff/yagroupchatdialog.ui create mode 100644 src/tools/yastuff/yagroupchatdlg.cpp create mode 100644 src/tools/yastuff/yagroupchatdlg.h create mode 100644 src/tools/yastuff/yagroupchatroomlist.cpp create mode 100644 src/tools/yastuff/yagroupchatroomlist.h create mode 100644 src/tools/yastuff/yahistorycachemanager.cpp create mode 100644 src/tools/yastuff/yahistorycachemanager.h create mode 100644 src/tools/yastuff/yaiconsets.qrc create mode 100644 src/tools/yastuff/yainfo.ui create mode 100644 src/tools/yastuff/yainformersmodel.cpp create mode 100644 src/tools/yastuff/yainformersmodel.h create mode 100644 src/tools/yastuff/yaipc.cpp create mode 100644 src/tools/yastuff/yaipc.h create mode 100644 src/tools/yastuff/yaj2jtransport.cpp create mode 100644 src/tools/yastuff/yaj2jtransport.h create mode 100644 src/tools/yastuff/yalicense.cpp create mode 100644 src/tools/yastuff/yalicense.h create mode 100644 src/tools/yastuff/yalicense.ui create mode 100644 src/tools/yastuff/yalogeventsmanager.cpp create mode 100644 src/tools/yastuff/yalogeventsmanager.h create mode 100644 src/tools/yastuff/yaloginpage.cpp create mode 100644 src/tools/yastuff/yaloginpage.h create mode 100644 src/tools/yastuff/yaloginpage.ui create mode 100644 src/tools/yastuff/yamainwin.cpp create mode 100644 src/tools/yastuff/yamainwin.h create mode 100644 src/tools/yastuff/yamainwindow.ui create mode 100644 src/tools/yastuff/yamrimtransport.cpp create mode 100644 src/tools/yastuff/yamrimtransport.h create mode 100644 src/tools/yastuff/yamucmanager.cpp create mode 100644 src/tools/yastuff/yamucmanager.h create mode 100644 src/tools/yastuff/yanaroddiskmanager.cpp create mode 100644 src/tools/yastuff/yanaroddiskmanager.h create mode 100644 src/tools/yastuff/yaonline.cpp create mode 100644 src/tools/yastuff/yaonline.h create mode 100644 src/tools/yastuff/yaonlinemainwin.cpp create mode 100644 src/tools/yastuff/yaonlinemainwin.h create mode 100644 src/tools/yastuff/yaoptionsdialog.ui create mode 100644 src/tools/yastuff/yapddmanager.cpp create mode 100644 src/tools/yastuff/yapddmanager.h create mode 100644 src/tools/yastuff/yapopupnotification.cpp create mode 100644 src/tools/yastuff/yapopupnotification.h create mode 100644 src/tools/yastuff/yapreferences.cpp create mode 100644 src/tools/yastuff/yapreferences.h create mode 100644 src/tools/yastuff/yapreferences.ui create mode 100644 src/tools/yastuff/yaprivacymanager.cpp create mode 100644 src/tools/yastuff/yaprivacymanager.h create mode 100644 src/tools/yastuff/yaprofile.cpp create mode 100644 src/tools/yastuff/yaprofile.h create mode 100644 src/tools/yastuff/yapsi.qss create mode 100644 src/tools/yastuff/yapsiserver.cpp create mode 100644 src/tools/yastuff/yapsiserver.h create mode 100644 src/tools/yastuff/yaremoveconfirmationmessagebox.cpp create mode 100644 src/tools/yastuff/yaremoveconfirmationmessagebox.h create mode 100644 src/tools/yastuff/yaroster.cpp create mode 100644 src/tools/yastuff/yaroster.h create mode 100644 src/tools/yastuff/yarostertiplabel.cpp create mode 100644 src/tools/yastuff/yarostertiplabel.h create mode 100644 src/tools/yastuff/yarostertiplabel.ui create mode 100644 src/tools/yastuff/yarostertoolbutton.cpp create mode 100644 src/tools/yastuff/yarostertoolbutton.h create mode 100644 src/tools/yastuff/yarostertooltip.cpp create mode 100644 src/tools/yastuff/yarostertooltip.h create mode 100644 src/tools/yastuff/yastuff.pri create mode 100644 src/tools/yastuff/yastuff.qrc create mode 100644 src/tools/yastuff/yastyle.cpp create mode 100644 src/tools/yastuff/yastyle.h create mode 100644 src/tools/yastuff/yatabbednotifier.cpp create mode 100644 src/tools/yastuff/yatabbednotifier.h create mode 100644 src/tools/yastuff/yatoastercentral.cpp create mode 100644 src/tools/yastuff/yatoastercentral.h create mode 100644 src/tools/yastuff/yatokenauth.cpp create mode 100644 src/tools/yastuff/yatokenauth.h create mode 100644 src/tools/yastuff/yatoster.cpp create mode 100644 src/tools/yastuff/yatoster.h create mode 100644 src/tools/yastuff/yatransportmanager.cpp create mode 100644 src/tools/yastuff/yatransportmanager.h create mode 100644 src/tools/yastuff/yatrayicon.cpp create mode 100644 src/tools/yastuff/yatrayicon.h create mode 100644 src/tools/yastuff/yaunreadmessagesmanager.cpp create mode 100644 src/tools/yastuff/yaunreadmessagesmanager.h create mode 100644 src/tools/yastuff/yawidgets/accountinformerdelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/accountinformerdelegate.h create mode 100644 src/tools/yastuff/yawidgets/accountinformermodel.cpp create mode 100644 src/tools/yastuff/yawidgets/accountinformermodel.h create mode 100644 src/tools/yastuff/yawidgets/accountinformertest/accountinformertest.pro create mode 100644 src/tools/yastuff/yawidgets/accountinformertest/accountinformertest.ui create mode 100644 src/tools/yastuff/yawidgets/accountinformertest/accountinformertestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/accountinformertest/testmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/accountinformertest/testmodel.h create mode 100644 src/tools/yastuff/yawidgets/accountinformerview.cpp create mode 100644 src/tools/yastuff/yawidgets/accountinformerview.h create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidget.cpp create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidget.h create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidgettest.pro create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidgettest.ui create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidgettestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/baseanimatedstackedwidget.cpp create mode 100644 src/tools/yastuff/yawidgets/animatedstackedwidgettest/baseanimatedstackedwidget.h create mode 100644 src/tools/yastuff/yawidgets/borderrenderer.cpp create mode 100644 src/tools/yastuff/yawidgets/borderrenderer.h create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/busywidgettest.pro create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/busywidgettest.qrc create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/busywidgettest.ui create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/busywidgettestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/yabusywidget2.cpp create mode 100644 src/tools/yastuff/yawidgets/busywidgettest/yabusywidget2.h create mode 100644 src/tools/yastuff/yawidgets/chatseparatortest/chatseparatortest.pro create mode 100644 src/tools/yastuff/yawidgets/chatseparatortest/chatseparatortest.qrc create mode 100644 src/tools/yastuff/yawidgets/chatseparatortest/chatseparatortestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/chatviewbench/chatviewbench.pro create mode 100644 src/tools/yastuff/yawidgets/chatviewbench/chatviewbenchmain.cpp create mode 100644 src/tools/yastuff/yawidgets/chatviewtest/chatviewtest.pro create mode 100644 src/tools/yastuff/yawidgets/chatviewtest/chatviewtestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/chatviewtest/testmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/chatviewtest/testmodel.h create mode 100644 src/tools/yastuff/yawidgets/customwindowtest/customwindowtest.pro create mode 100644 src/tools/yastuff/yawidgets/customwindowtest/customwindowtest.qrc create mode 100644 src/tools/yastuff/yawidgets/customwindowtest/customwindowtestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/customwindowtest/mywindow.ui create mode 100644 src/tools/yastuff/yawidgets/expandingextrawidget.cpp create mode 100644 src/tools/yastuff/yawidgets/expandingextrawidget.h create mode 100644 src/tools/yastuff/yawidgets/expandingoverlaylineedittest/expandingoverlaylineedittest.pro create mode 100644 src/tools/yastuff/yawidgets/expandingoverlaylineedittest/expandingoverlaylineedittestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/expandingoverlaylineedittest/test.ui create mode 100644 src/tools/yastuff/yawidgets/fadingmultilinelabeltest/fadingmultilinelabel.cpp create mode 100644 src/tools/yastuff/yawidgets/fadingmultilinelabeltest/fadingmultilinelabel.h create mode 100644 src/tools/yastuff/yawidgets/fadingmultilinelabeltest/fadingmultilinelabeltest.pro create mode 100644 src/tools/yastuff/yawidgets/fadingmultilinelabeltest/fadingmultilinelabeltestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/newselfavatar.pro create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/newselfavatar.qrc create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/test.ui create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/yaselfmood.cpp create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/yaselfmood.h create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/yaselfmoodaction.cpp create mode 100644 src/tools/yastuff/yawidgets/newselfavatar/yaselfmoodaction.h create mode 100644 src/tools/yastuff/yawidgets/overlaywidget.h create mode 100644 src/tools/yastuff/yawidgets/private/qabstractitemview_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qabstractscrollarea_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qeffects_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qframe_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qobject_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qtextcontrol_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qtextcontrol_p_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qtreeview_p.h create mode 100644 src/tools/yastuff/yawidgets/private/qwidget_p.h create mode 100644 src/tools/yastuff/yawidgets/rostertabstest/rostertabtest.pro create mode 100644 src/tools/yastuff/yawidgets/rostertabstest/rostertabtestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/rostertest/rostertest.pri create mode 100644 src/tools/yastuff/yawidgets/rostertest/rostertest.pro create mode 100644 src/tools/yastuff/yawidgets/rostertest/rostertest.qrc create mode 100644 src/tools/yastuff/yawidgets/rostertest/rostertest.ui create mode 100644 src/tools/yastuff/yawidgets/rostertest/rostertestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/rostertest/testmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/rostertest/testmodel.h create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/0.png create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/1.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/2.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/3.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/4.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/5.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/6.jpg create mode 100644 src/tools/yastuff/yawidgets/rostertest/userpics/7.jpg create mode 100644 src/tools/yastuff/yawidgets/settingsbuttontest/settingsbuttontest.pro create mode 100644 src/tools/yastuff/yawidgets/settingsbuttontest/settingsbuttontestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/settingsbuttontest/settingstest.ui create mode 100644 src/tools/yastuff/yawidgets/settingsbuttontest/yasettingsbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/settingsbuttontest/yasettingsbutton.h create mode 100644 src/tools/yastuff/yawidgets/statusbartest/statusbartest.pro create mode 100644 src/tools/yastuff/yawidgets/statusbartest/statusbartest.qrc create mode 100644 src/tools/yastuff/yawidgets/statusbartest/statusbartest.ui create mode 100644 src/tools/yastuff/yawidgets/statusbartest/statusbartestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/statusbartest/testmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/statusbartest/testmodel.h create mode 100644 src/tools/yastuff/yawidgets/tabbartest/tabbartest.pro create mode 100644 src/tools/yastuff/yawidgets/tabbartest/tabbartest.qrc create mode 100644 src/tools/yastuff/yawidgets/tabbartest/tabbartestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/tabbartest2/tabbartest2.pro create mode 100644 src/tools/yastuff/yawidgets/tabbartest2/tabbartest2.qrc create mode 100644 src/tools/yastuff/yawidgets/tabbartest2/tabbartestmain2.cpp create mode 100644 src/tools/yastuff/yawidgets/trimmablemultilinelabel.cpp create mode 100644 src/tools/yastuff/yawidgets/trimmablemultilinelabel.h create mode 100644 src/tools/yastuff/yawidgets/trimmablemultilinelabeltest/main.ui create mode 100644 src/tools/yastuff/yawidgets/trimmablemultilinelabeltest/trimmablemultilinelabeltest.pro create mode 100644 src/tools/yastuff/yawidgets/trimmablemultilinelabeltest/trimmablemultilinelabeltestmain.cpp create mode 100644 src/tools/yastuff/yawidgets/unittest/yachatviewmodel/testyachatviewmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/unittest/yachatviewmodel/testyachatviewmodel.pro create mode 100644 src/tools/yastuff/yawidgets/visibletext.cpp create mode 100644 src/tools/yastuff/yawidgets/visibletext.h create mode 100644 src/tools/yastuff/yawidgets/yaaccountselector.cpp create mode 100644 src/tools/yastuff/yawidgets/yaaccountselector.h create mode 100644 src/tools/yastuff/yawidgets/yaavatarlabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yaavatarlabel.h create mode 100644 src/tools/yastuff/yawidgets/yaboldmenu.cpp create mode 100644 src/tools/yastuff/yawidgets/yaboldmenu.h create mode 100644 src/tools/yastuff/yawidgets/yabusywidget.cpp create mode 100644 src/tools/yastuff/yawidgets/yabusywidget.h create mode 100644 src/tools/yastuff/yawidgets/yachatcontactinfo.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatcontactinfo.h create mode 100644 src/tools/yastuff/yawidgets/yachatcontactstatus.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatcontactstatus.h create mode 100644 src/tools/yastuff/yawidgets/yachatedit.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatedit.h create mode 100644 src/tools/yastuff/yawidgets/yachatsendbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatsendbutton.h create mode 100644 src/tools/yastuff/yawidgets/yachatseparator.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatseparator.h create mode 100644 src/tools/yastuff/yawidgets/yachatview.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatview.h create mode 100644 src/tools/yastuff/yawidgets/yachatviewdelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatviewdelegate.h create mode 100644 src/tools/yastuff/yawidgets/yachatviewmodel.cpp create mode 100644 src/tools/yastuff/yawidgets/yachatviewmodel.h create mode 100644 src/tools/yastuff/yawidgets/yachevronbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yachevronbutton.h create mode 100644 src/tools/yastuff/yawidgets/yaclosebutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yaclosebutton.h create mode 100644 src/tools/yastuff/yawidgets/yacontactavatarlabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactavatarlabel.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlabel.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlistview.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlistview.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewdelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewdelegate.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewdelegateselector.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewdelegateselector.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewlargedelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewlargedelegate.h create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewslimdelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/yacontactlistviewslimdelegate.h create mode 100644 src/tools/yastuff/yawidgets/yaeditorcontextmenu.cpp create mode 100644 src/tools/yastuff/yawidgets/yaeditorcontextmenu.h create mode 100644 src/tools/yastuff/yawidgets/yaemptytextlineedit.cpp create mode 100644 src/tools/yastuff/yawidgets/yaemptytextlineedit.h create mode 100644 src/tools/yastuff/yawidgets/yaeventmessage.cpp create mode 100644 src/tools/yastuff/yawidgets/yaeventmessage.h create mode 100644 src/tools/yastuff/yawidgets/yaeventnotifierframe.cpp create mode 100644 src/tools/yastuff/yawidgets/yaeventnotifierframe.h create mode 100644 src/tools/yastuff/yawidgets/yaexpandingoverlaylineedit.cpp create mode 100644 src/tools/yastuff/yawidgets/yaexpandingoverlaylineedit.h create mode 100644 src/tools/yastuff/yawidgets/yafilteredcontactlistview.cpp create mode 100644 src/tools/yastuff/yawidgets/yafilteredcontactlistview.h create mode 100644 src/tools/yastuff/yawidgets/yaflashingscrollbar.cpp create mode 100644 src/tools/yastuff/yawidgets/yaflashingscrollbar.h create mode 100644 src/tools/yastuff/yawidgets/yainformer.cpp create mode 100644 src/tools/yastuff/yawidgets/yainformer.h create mode 100644 src/tools/yastuff/yawidgets/yainformerbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yainformerbutton.h create mode 100644 src/tools/yastuff/yawidgets/yajidlabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yajidlabel.h create mode 100644 src/tools/yastuff/yawidgets/yalabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yalabel.h create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformer.cpp create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformer.h create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformer.ui create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformerdelegate.cpp create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformerdelegate.h create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformermodel.cpp create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformermodel.h create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformerview.cpp create mode 100644 src/tools/yastuff/yawidgets/yalastmailinformerview.h create mode 100644 src/tools/yastuff/yawidgets/yalinkbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yalinkbutton.h create mode 100644 src/tools/yastuff/yawidgets/yamanageaccounts.cpp create mode 100644 src/tools/yastuff/yawidgets/yamanageaccounts.h create mode 100644 src/tools/yastuff/yawidgets/yamanageaccounts.ui create mode 100644 src/tools/yastuff/yawidgets/yamucjoin.cpp create mode 100644 src/tools/yastuff/yawidgets/yamucjoin.h create mode 100644 src/tools/yastuff/yawidgets/yamucjoin.ui create mode 100644 src/tools/yastuff/yawidgets/yamultilinetabbar.cpp create mode 100644 src/tools/yastuff/yawidgets/yamultilinetabbar.h create mode 100644 src/tools/yastuff/yawidgets/yaofficebackgroundhelper.cpp create mode 100644 src/tools/yastuff/yawidgets/yaofficebackgroundhelper.h create mode 100644 src/tools/yastuff/yawidgets/yaokbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yaokbutton.h create mode 100644 src/tools/yastuff/yawidgets/yapreferencestabbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yapreferencestabbutton.h create mode 100644 src/tools/yastuff/yawidgets/yaprogressdialog.cpp create mode 100644 src/tools/yastuff/yawidgets/yaprogressdialog.h create mode 100644 src/tools/yastuff/yawidgets/yaprogressdialog.ui create mode 100644 src/tools/yastuff/yawidgets/yapushbutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yapushbutton.h create mode 100644 src/tools/yastuff/yawidgets/yarostercombobox.cpp create mode 100644 src/tools/yastuff/yawidgets/yarostercombobox.h create mode 100644 src/tools/yastuff/yawidgets/yarotation.cpp create mode 100644 src/tools/yastuff/yawidgets/yarotation.h create mode 100644 src/tools/yastuff/yawidgets/yaselfavatarlabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yaselfavatarlabel.h create mode 100644 src/tools/yastuff/yawidgets/yaselflabel.cpp create mode 100644 src/tools/yastuff/yawidgets/yaselflabel.h create mode 100644 src/tools/yastuff/yawidgets/yaselfstatus.cpp create mode 100644 src/tools/yastuff/yawidgets/yaselfstatus.h create mode 100644 src/tools/yastuff/yawidgets/yasplitter.cpp create mode 100644 src/tools/yastuff/yawidgets/yasplitter.h create mode 100644 src/tools/yastuff/yawidgets/yastatusbar.cpp create mode 100644 src/tools/yastuff/yawidgets/yastatusbar.h create mode 100644 src/tools/yastuff/yawidgets/yastatusbarlayout.cpp create mode 100644 src/tools/yastuff/yawidgets/yastatusbarlayout.h create mode 100644 src/tools/yastuff/yawidgets/yatabbar.cpp create mode 100644 src/tools/yastuff/yawidgets/yatabbar.h create mode 100644 src/tools/yastuff/yawidgets/yatabbarbase.cpp create mode 100644 src/tools/yastuff/yawidgets/yatabbarbase.h create mode 100644 src/tools/yastuff/yawidgets/yatabwidget.cpp create mode 100644 src/tools/yastuff/yawidgets/yatabwidget.h create mode 100644 src/tools/yastuff/yawidgets/yatoolbox.cpp create mode 100644 src/tools/yastuff/yawidgets/yatoolbox.h create mode 100644 src/tools/yastuff/yawidgets/yatoolboxanimation.cpp create mode 100644 src/tools/yastuff/yawidgets/yatoolboxanimation.h create mode 100644 src/tools/yastuff/yawidgets/yatoolboxpage.cpp create mode 100644 src/tools/yastuff/yawidgets/yatoolboxpage.h create mode 100644 src/tools/yastuff/yawidgets/yavisualutil.cpp create mode 100644 src/tools/yastuff/yawidgets/yavisualutil.h create mode 100644 src/tools/yastuff/yawidgets/yawidgets.cpp create mode 100644 src/tools/yastuff/yawidgets/yawidgets.pri create mode 100644 src/tools/yastuff/yawidgets/yawidgets.pro create mode 100644 src/tools/yastuff/yawidgets/yawindow.cpp create mode 100644 src/tools/yastuff/yawidgets/yawindow.h create mode 100644 src/tools/yastuff/yawidgets/yawindowextrabutton.cpp create mode 100644 src/tools/yastuff/yawidgets/yawindowextrabutton.h create mode 100644 src/tools/yastuff/yawidgets/yawindowtheme.cpp create mode 100644 src/tools/yastuff/yawidgets/yawindowtheme.h create mode 100644 src/tools/zip/minizip/ChangeLogUnzip create mode 100644 src/tools/zip/minizip/miniunz.c create mode 100644 src/tools/zip/minizip/minizip.c create mode 100644 src/tools/zip/minizip/other/zip.c create mode 100644 src/tools/zip/minizip/other/zip.def create mode 100644 src/tools/zip/minizip/other/zip.h create mode 100644 src/tools/zip/minizip/readme.txt create mode 100644 src/tools/zip/minizip/unzip.c create mode 100644 src/tools/zip/minizip/unzip.def create mode 100644 src/tools/zip/minizip/unzip.h create mode 100644 src/tools/zip/minizip/win32/libz.a create mode 100644 src/tools/zip/minizip/win32/zconf.h create mode 100644 src/tools/zip/minizip/win32/zlib.h create mode 100644 src/tools/zip/minizip/zlibvc.def create mode 100644 src/tools/zip/minizip/zlibvc.dsp create mode 100644 src/tools/zip/minizip/zlibvc.dsw create mode 100644 src/tools/zip/zip.cpp create mode 100644 src/tools/zip/zip.h create mode 100644 src/tools/zip/zip.pri create mode 100644 src/translationmanager.cpp create mode 100644 src/translationmanager.h create mode 100644 src/unittest/contactlistnestedgroup/testcontactlistnestedgroup.cpp create mode 100644 src/unittest/contactlistnestedgroup/testcontactlistnestedgroup.pro create mode 100644 src/unittest/half_of_psi.pri create mode 100644 src/unittest/psiiconset/testpsiiconset.cpp create mode 100644 src/unittest/psiiconset/testpsiiconset.pro create mode 100644 src/unittest/psipopup/testpsipopup.cpp create mode 100644 src/unittest/psipopup/testpsipopup.pro create mode 100644 src/urlbookmark.cpp create mode 100644 src/urlbookmark.h create mode 100644 src/userlist.cpp create mode 100644 src/userlist.h create mode 100644 src/utilities/iodeviceopener.cpp create mode 100644 src/utilities/iodeviceopener.h create mode 100644 src/utilities/maybe.h create mode 100644 src/utilities/unittest/iodeviceopenertest.cpp create mode 100644 src/utilities/unittest/unittest.pri create mode 100644 src/utilities/utilities.pri create mode 100644 src/varlist.cpp create mode 100644 src/varlist.h create mode 100644 src/vcardfactory.cpp create mode 100644 src/vcardfactory.h create mode 100644 src/voicecall.ui create mode 100644 src/voicecalldlg.cpp create mode 100644 src/voicecalldlg.h create mode 100644 src/voicecaller.h create mode 100644 src/wbdlg.cpp create mode 100644 src/wbdlg.h create mode 100644 src/wbitems.cpp create mode 100644 src/wbitems.h create mode 100644 src/wbmanager.cpp create mode 100644 src/wbmanager.h create mode 100644 src/wbscene.cpp create mode 100644 src/wbscene.h create mode 100644 src/wbwidget.cpp create mode 100644 src/wbwidget.h create mode 100644 src/widgets/README create mode 100644 src/widgets/busywidget.cpp create mode 100644 src/widgets/busywidget.h create mode 100644 src/widgets/fancylabel.cpp create mode 100644 src/widgets/fancylabel.h create mode 100644 src/widgets/fancypopup.cpp create mode 100644 src/widgets/fancypopup.h create mode 100644 src/widgets/fancypopuplist.h create mode 100644 src/widgets/iconaction.cpp create mode 100644 src/widgets/iconaction.h create mode 100644 src/widgets/iconbutton.h create mode 100644 src/widgets/iconlabel.h create mode 100644 src/widgets/iconselect.cpp create mode 100644 src/widgets/iconselect.h create mode 100644 src/widgets/iconsetdisplay.h create mode 100644 src/widgets/iconsetselect.h create mode 100644 src/widgets/icontoolbutton.h create mode 100644 src/widgets/iconwidget.cpp create mode 100644 src/widgets/iconwidget.h create mode 100644 src/widgets/private/qeffects_p.h create mode 100644 src/widgets/psirichtext.cpp create mode 100644 src/widgets/psirichtext.h create mode 100644 src/widgets/psitabbar.cpp create mode 100644 src/widgets/psitabbar.h create mode 100644 src/widgets/psitabwidget.cpp create mode 100644 src/widgets/psitabwidget.h create mode 100644 src/widgets/psitextview.cpp create mode 100644 src/widgets/psitextview.h create mode 100644 src/widgets/psitiplabel.cpp create mode 100644 src/widgets/psitiplabel.h create mode 100644 src/widgets/psitooltip.cpp create mode 100644 src/widgets/psitooltip.h create mode 100644 src/widgets/psiwidgets.cpp create mode 100644 src/widgets/psiwidgets.h create mode 100644 src/widgets/stretchwidget.h create mode 100644 src/widgets/unittest/iconaction/iconaction.pro create mode 100644 src/widgets/unittest/iconaction/testiconaction.cpp create mode 100644 src/widgets/unittest/richtext/main.cpp create mode 100644 src/widgets/unittest/richtext/richtext.pro create mode 100644 src/widgets/updatingcombobox.h create mode 100644 src/widgets/urllabel.cpp create mode 100644 src/widgets/urllabel.h create mode 100644 src/widgets/urlobject.cpp create mode 100644 src/widgets/urlobject.h create mode 100644 src/widgets/widgets.pri create mode 100644 src/widgets/widgets.pro create mode 100644 src/xdata_widget.cpp create mode 100644 src/xdata_widget.h create mode 100644 src/xmlconsole.cpp create mode 100644 src/xmlconsole.h create mode 100644 src/xmlconsole.ui create mode 100644 src/yapsi_qt_translations.sh create mode 100644 src/yapsi_revision.sh create mode 100644 src/yapsi_translations.sh create mode 100644 src/yapsi_update_private_headers.sh create mode 100644 third-party/JsonQt/CMakeLists.txt create mode 100644 third-party/JsonQt/COMPATIBILITY create mode 100644 third-party/JsonQt/COPYING.HEADER create mode 100644 third-party/JsonQt/Doxyfile.cmake create mode 100644 third-party/JsonQt/add-copyright-header.sh create mode 100644 third-party/JsonQt/jsonqt.pri create mode 100644 third-party/JsonQt/lib/CMakeLists.txt create mode 100644 third-party/JsonQt/lib/JsonQtExport.h create mode 100644 third-party/JsonQt/lib/JsonRpc.cpp create mode 100644 third-party/JsonQt/lib/JsonRpc.h create mode 100644 third-party/JsonQt/lib/JsonRpcAdaptor.cpp create mode 100644 third-party/JsonQt/lib/JsonRpcAdaptor.h create mode 100644 third-party/JsonQt/lib/JsonRpcAdaptorPrivate.cpp create mode 100644 third-party/JsonQt/lib/JsonRpcAdaptorPrivate.h create mode 100644 third-party/JsonQt/lib/JsonToProperties.cpp create mode 100644 third-party/JsonQt/lib/JsonToProperties.h create mode 100644 third-party/JsonQt/lib/JsonToVariant.cpp create mode 100644 third-party/JsonQt/lib/JsonToVariant.h create mode 100644 third-party/JsonQt/lib/ParseException.cpp create mode 100644 third-party/JsonQt/lib/ParseException.h create mode 100644 third-party/JsonQt/lib/VariantToJson.cpp create mode 100644 third-party/JsonQt/lib/VariantToJson.h create mode 100644 third-party/JsonQt/tests/CMakeLists.txt create mode 100644 third-party/JsonQt/tests/JsonRpc.cpp create mode 100644 third-party/JsonQt/tests/JsonRpcAdaptor.cpp create mode 100644 third-party/JsonQt/tests/JsonToProperties.cpp create mode 100644 third-party/JsonQt/tests/JsonToVariant.cpp create mode 100644 third-party/JsonQt/tests/VariantToJson.cpp create mode 100644 third-party/qca/.gitignore create mode 100644 third-party/qca/qca-cyrus-sasl.pri create mode 100644 third-party/qca/qca-cyrus-sasl/qca-cyrus-sasl.cpp create mode 100644 third-party/qca/qca-gnupg.pri create mode 100644 third-party/qca/qca-gnupg/gpgop.cpp create mode 100644 third-party/qca/qca-gnupg/gpgop.h create mode 100644 third-party/qca/qca-gnupg/gpgproc/README create mode 100644 third-party/qca/qca-gnupg/gpgproc/gpgproc.cpp create mode 100644 third-party/qca/qca-gnupg/gpgproc/gpgproc.h create mode 100644 third-party/qca/qca-gnupg/gpgproc/gpgproc.pri create mode 100644 third-party/qca/qca-gnupg/gpgproc/sprocess.cpp create mode 100644 third-party/qca/qca-gnupg/gpgproc/sprocess.h create mode 100644 third-party/qca/qca-gnupg/qca-gnupg.cpp create mode 100644 third-party/qca/qca-ossl.pri create mode 100644 third-party/qca/qca-ossl/qca-ossl.cpp create mode 100644 third-party/qca/qca.pri create mode 100644 third-party/qca/qca.pro create mode 100644 third-party/qca/qca/certs/README create mode 100644 third-party/qca/qca/certs/rootcerts.pem create mode 100644 third-party/qca/qca/include/QtCrypto/QtCrypto create mode 100644 third-party/qca/qca/include/QtCrypto/qca.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_basic.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_cert.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_core.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_export.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_keystore.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_publickey.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_securelayer.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_securemessage.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_support.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_textfilter.h create mode 100644 third-party/qca/qca/include/QtCrypto/qca_tools.h create mode 100644 third-party/qca/qca/include/QtCrypto/qcaprovider.h create mode 100644 third-party/qca/qca/include/QtCrypto/qpipe.h create mode 100644 third-party/qca/qca/src/botantools/README create mode 100644 third-party/qca/qca/src/botantools/addlicenseheaders.sh create mode 100644 third-party/qca/qca/src/botantools/addnamespace.sh create mode 100644 third-party/qca/qca/src/botantools/botan/alloc_mmap/mmap_mem.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/alloc_mmap/mmap_mem.h create mode 100644 third-party/qca/qca/src/botantools/botan/big_base.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/big_code.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/big_io.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/big_ops2.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/big_ops3.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/bit_ops.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/botan/allocate.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/bigint.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/bit_ops.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/charset.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/defalloc.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/exceptn.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/libstate.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mem_ops.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mem_pool.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mmap_mem.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/modules.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mp_asm.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mp_asmi.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mp_core.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mp_types.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mutex.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/mux_qt.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/numthry.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/parsing.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/secmem.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/stl_util.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/types.h create mode 100644 third-party/qca/qca/src/botantools/botan/botan/util.h create mode 100644 third-party/qca/qca/src/botantools/botan/charset.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/defalloc.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/divide.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/exceptn.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/libstate.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/license.txt create mode 100644 third-party/qca/qca/src/botantools/botan/mem_pool.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/ml_unix/mlock.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/ml_win32/mlock.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/modules.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_asm.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_comba.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_misc.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_mul.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_mulop.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mp_shift.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mutex.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mux_qt/mux_qt.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/mux_qt/mux_qt.h create mode 100644 third-party/qca/qca/src/botantools/botan/parsing.cpp create mode 100644 third-party/qca/qca/src/botantools/botan/util.cpp create mode 100644 third-party/qca/qca/src/botantools/botantools.diff create mode 100644 third-party/qca/qca/src/botantools/botantools.h create mode 100644 third-party/qca/qca/src/botantools/botantools.pri create mode 100644 third-party/qca/qca/src/botantools/btest.cpp create mode 100644 third-party/qca/qca/src/botantools/btest.pro create mode 100644 third-party/qca/qca/src/botantools/wrapns.c create mode 100644 third-party/qca/qca/src/qca_basic.cpp create mode 100644 third-party/qca/qca/src/qca_cert.cpp create mode 100644 third-party/qca/qca/src/qca_core.cpp create mode 100644 third-party/qca/qca/src/qca_default.cpp create mode 100644 third-party/qca/qca/src/qca_keystore.cpp create mode 100644 third-party/qca/qca/src/qca_plugin.cpp create mode 100644 third-party/qca/qca/src/qca_plugin.h create mode 100644 third-party/qca/qca/src/qca_publickey.cpp create mode 100644 third-party/qca/qca/src/qca_safeobj.cpp create mode 100644 third-party/qca/qca/src/qca_safeobj.h create mode 100644 third-party/qca/qca/src/qca_securelayer.cpp create mode 100644 third-party/qca/qca/src/qca_securemessage.cpp create mode 100644 third-party/qca/qca/src/qca_systemstore.h create mode 100644 third-party/qca/qca/src/qca_systemstore_flatfile.cpp create mode 100644 third-party/qca/qca/src/qca_systemstore_mac.cpp create mode 100644 third-party/qca/qca/src/qca_systemstore_win.cpp create mode 100644 third-party/qca/qca/src/qca_textfilter.cpp create mode 100644 third-party/qca/qca/src/qca_tools.cpp create mode 100644 third-party/qca/qca/src/support/console.cpp create mode 100644 third-party/qca/qca/src/support/dirwatch.cpp create mode 100644 third-party/qca/qca/src/support/logger.cpp create mode 100644 third-party/qca/qca/src/support/qpipe.cpp create mode 100644 third-party/qca/qca/src/support/synchronizer.cpp create mode 100644 third-party/qca/qca/src/support/syncthread.cpp create mode 100644 win32/app.ico create mode 100644 win32/psi_win32.manifest create mode 100644 win32/psi_win32.rc create mode 100644 win32/tod.exe create mode 100644 win32/yapsi_version.rc create mode 100644 win32/yapsiserver.def create mode 100644 win32/yapsiserver.rc create mode 100644 yapsi_version diff --git a/.darcs_binaries b/.darcs_binaries new file mode 100644 index 0000000..8c39a32 --- /dev/null +++ b/.darcs_binaries @@ -0,0 +1,41 @@ +# Binary file regexps: +\.png$ +\.PNG$ +\.gz$ +\.GZ$ +\.pdf$ +\.PDF$ +\.jpg$ +\.JPG$ +\.gif$ +\.GIF$ +\.tar$ +\.TAR$ +\.bz2$ +\.BZ2$ +\.z$ +\.Z$ +\.zip$ +\.ZIP$ +\.jar$ +\.JAR$ +\.so$ +\.SO$ +\.a$ +\.A$ +\.tgz$ +\.TGZ$ +\.jpeg$ +\.JPEG$ +\.mpg$ +\.MPG$ +\.mpeg$ +\.MPEG$ +\.iso$ +\.ISO$ +\.exe$ +\.EXE$ +\.doc$ +\.DOC$ +\.jisp$ +\.JISP$ diff --git a/.darcs_boring b/.darcs_boring new file mode 100644 index 0000000..e4ff429 --- /dev/null +++ b/.darcs_boring @@ -0,0 +1,140 @@ +# Boring file regexps: +\.hi$ +#\.o$ +\.o\.cmd$ +\.ko$ +\.ko\.cmd$ +\.mod\.c$ +(^|/)\.tmp_versions($|/) +#(^|/)CVS($|/) +(^|/)RCS($|/) +~$ +#(^|/)\.[^/] +(^|/)_darcs($|/) +\.bak$ +\.BAK$ +\.orig$ +(^|/)vssver\.scc$ +\.swp$ +(^|/)MT($|/) +(^|/)\{arch\}($|/) +(^|/).arch-ids($|/) +(^|/), +\.class$ +\.prof$ +(^|/)\.DS_Store$ +(^|/)BitKeeper($|/) +(^|/)ChangeSet($|/) +(^|/)\.svn($|/) +\.py[co]$ +\# +#\.cvsignore$ +(^|/)Thumbs\.db$ +(^|/)\.gdb_history$ + +# Mac OS X metadata +\/\._(.*) +^\._(.*) + +# Iris +^iris/example/xmpptest/xmpptest.app$ +^iris/example/xmpptest/Makefile$ + +# Irisnet +^iris/irisnet/Makefile$ +^iris/irisnet/(.*)\.o$ +^iris/irisnet/(.*)\.moc$ +^iris/irisnet/moc_(.*)\.cpp$ +^iris/irisnet/irisnet$ +^iris/irisnet/jdns/(.*)\.o$ +^iris/irisnet/jdns/Makefile$ +^iris/irisnet/jdns/jdns$ +^iris/irisnet/jdns/(.*)\.o$ + +# libjingle +^third-party/libjingle/Makefile +^third-party/libjingle/liblibjingle.a +^third-party/qca/Makefile +^third-party/qca/libqca.a + +# Binaries +^src/psi$ +^src/psi.app$ +^src/yachat$ +^src/yachat.app$ +^third-party/qca/libqca_psi.a$ + +# Mac binaries +^mac/disk +^mac/Psi-.* +^mac/(template|wc)\.dmg($|\.bz2$) + +# Windows +^psiwin/.*$ + +# QMake makefiles +^Makefile +^src/Makefile +^src/widgets/Makefile + +# QConf +^conf.log +^conf.pri +^src/config.h + +# Qt dirs +(^|/).ui($|/) +(^|/).obj($|/) +(^|/).moc($|/) +(^|/).rcc($|/) + +# YaStuff +^src/tools/yastuff/uitest/Makefile$ +^src/tools/yastuff/uitest/uitest$ +^src/tools/yastuff/yawidgets/Makefile$ +^src/tools/yastuff/yawidgets/libyawidgets.(so|dylib)$ +^src/tools/yastuff/yapsi_revision\.h$ +^src/tools/yastuff/yawidgets/chatviewtest/Makefile$ +^src/tools/yastuff/yawidgets/chatviewtest/chatviewtest$ +^src/tools/yastuff/yawidgets/customwindowtest/Makefile$ +^src/tools/yastuff/yawidgets/customwindowtest/customwindowtest$ +^src/tools/yastuff/yawidgets/expandingoverlaylineedittest/Makefile$ +^src/tools/yastuff/yawidgets/expandingoverlaylineedittest/expandingoverlaylineedittest$ +^src/tools/yastuff/yawidgets/newselfavatar/Makefile$ +^src/tools/yastuff/yawidgets/newselfavatar/newselfavatar$ +^src/tools/yastuff/yawidgets/rostertabstest/Makefile$ +^src/tools/yastuff/yawidgets/rostertabstest/rostertabtest$ +^src/tools/yastuff/yawidgets/rostertest/Makefile$ +^src/tools/yastuff/yawidgets/statusbartest/Makefile$ +^src/tools/yastuff/yawidgets/statusbartest/statusbartest$ +^src/tools/yastuff/yawidgets/chatviewbench/Makefile$ +^src/tools/yastuff/yawidgets/chatviewbench/chatviewbench$ +^src/tools/yastuff/yawidgets/tabbartest/Makefile$ +^src/tools/yastuff/yawidgets/tabbartest/tabbartest$ +^src/tools/yastuff/yawidgets/expandingoverlaylineedittest/expandingoverlaylineedittest.app$ +^src/tools/yastuff/yawidgets/rostertabstest/rostertabtest.app$ +^src/tools/yastuff/yawidgets/animatedstackedwidgettest/Makefile$ +^src/tools/yastuff/yawidgets/animatedstackedwidgettest/animatedstackedwidgettest.app$ +^src/tools/yastuff/yawidgets/trimmablemultilinelabeltest/test/test.app$ +^src/tools/yastuff/yawidgets/accountinformertest/Makefile$ +^src/tools/yastuff/yawidgets/accountinformertest/accountinformertest$ +^src/tools/yastuff/yawidgets/busywidgettest/(Makefile|busywidgettest(\.app)?)$ +^src/tools/yastuff/yawidgets/settingsbuttontest/(Makefile|settingsbuttontest(\.app)?)$ + +# Stuff +^tmtags$ + +# Compiled translations +^lang/(.*)\.qm$ + +# Tools +^src/tools/optionstree/(.*)\.o +^src/tools/optionstree/(.*)\.app +^src/tools/optionstree/moc_(.*)\.cpp +^src/tools/optionstree/options(.*)\.xml +^src/tools/optionstree/Makefile +^src/tools/optionstree/optionstreeviewtest/Makefile +^src/tools/optionstree/optionstreeviewtest/moc_(.*)\.cpp +^src/tools/contactlist/example/(.*)\.o +^src/tools/contactlist/example/(moc_)?(.*)\.(cpp|o|moc) +^src/tools/contactlist/example/(Makefile|contactlist) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5a8be2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +*.hi +*.o +*.o.cmd +*.ko +*.ko.cmd +*.mod.c +*.bak +*.BAK +*.orig +*.swp +.svn +*.dylib +*.user +*.xcodeproj + +# Mac OS X metadata +._* +.DS_Store +.AppleDouble +:2e_* + +*.app +*.moc +*.obj +*.rcc +moc_*.cpp +ui_*.h +Makefile +*.supp + +/tmtags +/conf.log +/conf.pri +/yachat +/yapsi_revision + +/mac/YaChat.dmg +/mac/template.dmg +/mac/template.dmg.bz2 +/mac/wc.dmg + +/src/*.plist diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..e2aa4a0 --- /dev/null +++ b/COPYING @@ -0,0 +1,55 @@ +Перед иÑпользованием программы, пожалуйÑта, ознакомьтеÑÑŒ Ñ ÑƒÑловиÑми нижеÑледующего лицензионного ÑоглашениÑ. Любое иÑпользование вами программы означает полное и безоговорочное принÑтие вами его уÑловий. +ЕÑли вы не принимаете уÑÐ»Ð¾Ð²Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ð¾Ð³Ð¾ ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð² полном объеме, вы не имеете права иÑпользовать программу в каких-либо целÑÑ…. + +Лицензионное Ñоглашение +на иÑпользование программы «Я.Онлайн» + +1. Общие Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ +1.1. ÐаÑтоÑщее Лицензионное Ñоглашение («ЛицензиÑ») уÑтанавливает уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Ð´Ð»Ñ Ð­Ð’Ðœ «Я.Онлайн», Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ñе дополнительные модули или раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ðº ней («Программа»), и заключено между любым лицом, иÑпользующим Программу («Пользователь»), и ООО «ЯÐДЕКС», РоÑÑиÑ, 119021, г.МоÑква, ул. Льва ТолÑтого, д. 16, ÑвлÑющимÑÑ Ð¿Ñ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»ÐµÐ¼ иÑключительного права на Программу («Правообладатель»). +1.2. ÐšÐ¾Ð¿Ð¸Ñ€ÑƒÑ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ, уÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ ÐµÑ‘ на Ñвой перÑональный компьютер или иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ любым образом, Пользователь выражает Ñвое полное и безоговорочное ÑоглаÑие Ñо вÑеми уÑловиÑми Лицензии. +1.3. За иÑключением уÑловий, изложенных в разделе 5 наÑтоÑщей Лицензии, иÑпользование Программы разрешаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на уÑловиÑÑ… наÑтоÑщей Лицензии. ЕÑли Пользователь не принимает уÑÐ»Ð¾Ð²Ð¸Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸ в полном объеме, Пользователь не имеет права иÑпользовать Программу в каких-либо целÑÑ…. ИÑпользование Программы Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸ÐµÐ¼ (невыполнением) какого-либо из уÑловий Лицензии запрещено. +1.4. ИÑпользование Программы на уÑловиÑÑ… наÑтоÑщей Лицензии в личных некоммерчеÑких целÑÑ… оÑущеÑтвлÑетÑÑ Ð±ÐµÐ·Ð²Ð¾Ð·Ð¼ÐµÐ·Ð´Ð½Ð¾. ИÑпользование Программы на уÑловиÑÑ… и ÑпоÑобами, не предуÑмотренными наÑтоÑщей Лицензией, возможно только на оÑновании отдельного ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ñ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»ÐµÐ¼. +1.5. К наÑтоÑщей Лицензии и вÑем отношениÑм, ÑвÑзанным Ñ Ð¸Ñпользованием Программы, подлежит применению право РоÑÑийÑкой Федерации и любые претензии или иÑки, вытекающие из наÑтоÑщей Лицензии или иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹, должны быть поданы и раÑÑмотрены в Ñуде по меÑту Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ. +1.6. Правообладатель может предоÑтавить Пользователю перевод наÑтоÑщей Лицензии Ñ Ñ€ÑƒÑÑкого на другие Ñзыки, однако в Ñлучае Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ñ€ÐµÑ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ уÑловиÑми Лицензии на руÑÑком Ñзыке и ее переводом, юридичеÑкую Ñилу имеет иÑключительно руÑÑкоÑÐ·Ñ‹Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸. + +2. Права на Программу +2.1. ИÑключительное право на Программу принадлежит Правообладателю. + +3. Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ +3.1. Правообладатель безвозмездно, на уÑловиÑÑ… проÑтой (неиÑключительной) лицензии, предоÑтавлÑет Пользователю непередаваемое право иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ на территории Ñтран вÑего мира Ñледующими ÑпоÑобами: +3.1.1. ПрименÑть Программу по прÑмому функциональному назначению, в целÑÑ… чего произвеÑти её копирование и уÑтановку (воÑпроизведение) на перÑональном(-ых) компьютере(-ах) ПользователÑ. Пользователь вправе произвеÑти уÑтановку Программы на неограниченное чиÑло перÑональных компьютеров. При уÑтановке на перÑональный компьютер каждой копии Программы приÑваиваетÑÑ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ð¹ номер, который автоматичеÑки ÑообщаетÑÑ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»ÑŽ. +3.1.2. ВоÑпроизводить и раÑпроÑтранÑть Программу в некоммерчеÑких целÑÑ… (безвозмездно). + +4. ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ +4.1. За иÑключением иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² объемах и ÑпоÑобами, прÑмо предуÑмотренными наÑтоÑщей Лицензией или законодательÑтвом РФ, Пользователь не имеет права изменÑть, декомпилировать, дизаÑÑемблировать, дешифровать и производить иные дейÑÑ‚Ð²Ð¸Ñ Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð½Ñ‹Ð¼ кодом Программы или отдельных её компонентов, имеющие целью получение информации о реализации алгоритмов, иÑпользуемых в Программе, Ñоздавать производные Ð¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ Ð¸Ñпользованием Программы или её компонентов, а также оÑущеÑтвлÑть (разрешать оÑущеÑтвлÑть) иное иÑпользование Программы, без пиÑьменного ÑоглаÑÐ¸Ñ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ. +4.2. Пользователь не имеет права воÑпроизводить и раÑпроÑтранÑть Программу в коммерчеÑких целÑÑ… (в том чиÑле за плату), в том чиÑле в ÑоÑтаве Ñборников программных продуктов, без пиÑьменного ÑоглаÑÐ¸Ñ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ. +4.3. Программа должна иÑпользоватьÑÑ Ð¿Ð¾Ð´ наименованием: «Я.Онлайн». Пользователь не вправе изменÑть наименование Программы или отдельных её компонентов, изменÑть и/или удалÑть знак охраны авторÑкого права (copyright notice) или иное указание на ПравообладателÑ. + +5. УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… функций Программы +5.1. Пользователь наÑтоÑщим уведомлен и ÑоглашаетÑÑ, что при включении в Программе функции «ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ» (по умолчанию – включена) вÑе ÑообщениÑ, направленные Пользователем и/или в Ð°Ð´Ñ€ÐµÑ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¸Ñпользованием Программы, ÑохранÑÑŽÑ‚ÑÑ Ð½Ð° аппаратных ÑредÑтвах ПравообладателÑ, до момента Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ функции. +При включении функции «Хранить наÑтройки на Ñервере» (по умолчанию – включена) вÑе наÑтройки ПользователÑ, в том чиÑле введенные Пользователем логины и пароли Ð´Ð»Ñ Ð´Ð¾Ñтупа к его учетным запиÑÑм, ÑохранÑÑŽÑ‚ÑÑ Ð½Ð° аппаратных ÑредÑтвах ПравообладателÑ, до момента Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ функции. +ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ, Ñохраненные наÑтройки, а также управление параметрами ее ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны Ð´Ð»Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² наÑтройках Программы при вводе логина и Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи ПользователÑ. +5.2. Пользователь наÑтоÑщим уведомлен и ÑоглашаетÑÑ, что при включении в Программе функции «Сбор почты», Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº данной функции почтового Ñщика ПользователÑ, раÑположенного как в почтовом ÑервиÑе ПравообладателÑ, так и в почтовых ÑервиÑах, принадлежащих третьим лицам, Пользователь должен ввеÑти логин и пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа к ÑоответÑтвующей учетной запиÑи почтового ÑервиÑа, и они будут Ñохранены на аппаратных ÑредÑтвах ПравообладателÑ. Пользователь ÑамоÑтоÑтельно отвечает за правомерноÑть подобного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾Ð³Ð¸Ð½Ð¾Ð² и паролей учетных запиÑей и неÑет вÑе риÑки такого иÑпользованиÑ, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ€Ð¸Ñки Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑоответÑтвующего почтового ÑервиÑа и/или прав третьих лиц. +5.3. Пользователь может в любой момент отказатьÑÑ Ð¾Ñ‚ передачи данных, указанных в п. 5.1, отключив ÑоответÑтвующие функции. +5.4. ВÑе данные об иÑпользовании Программы, передаваемые в ÑоответÑтвии Ñ Ð½Ð°ÑтоÑщей Лицензией, ÑохранÑÑŽÑ‚ÑÑ Ð¸ обрабатываютÑÑ Ð² ÑоответÑтвии Ñ ÐŸÐ¾Ð»Ð¸Ñ‚Ð¸ÐºÐ¾Ð¹ конфиденциальноÑти (http://legal.yandex.ru/confidential/). +5.5. При Ñоздании программы «Я.Чат», раÑпроÑтранÑемой ÑовмеÑтно Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¾Ð¹, иÑпользован модифицированный иÑходный код программы «Psi» (Copyright © The Psi Team, 2001-2008), раÑпроÑтранÑемой на уÑловиÑÑ… лицензии GNU GPL верÑии 2. Ð’ ÑвÑзи Ñ Ñтим Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° также раÑпроÑтранÑетÑÑ Ð½Ð° уÑловиÑÑ… лицензии GNU GPL верÑии 2, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ можно ознакомитьÑÑ Ð¿Ð¾ адреÑу http://download.yandex.ru/online/GPL.txt. К иÑпользованию программы «Я.Чат» применÑÑŽÑ‚ÑÑ Ñ‚Ð°ÐºÐ¶Ðµ вÑе Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑтоÑщей Лицензии в чаÑти, не противоречащей уÑловиÑм лицензии GNU GPL верÑии 2. ИÑходный код программы «Я.Чат» доÑтупен по адреÑу: http://download.yandex.ru/online/yachat-source.zip. +5.6. При Ñоздании верÑии Программы Ð´Ð»Ñ Microsoft Windows иÑпользована библиотека isxdl.dll, входÑÑ‰Ð°Ñ Ð² ÑоÑтав программы «ISTools» (www.istool.org, Copyright © 2009, Bjørnar Henden. All rights reserved.). Указанное программное обеÑпечение может иÑпользоватьÑÑ Ð½Ð° уÑловиÑÑ…, доÑтупных Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу: http://download.yandex.ru/online/addons/ISToolLicense.rtf. +5.7. При Ñоздании Программы иÑпользовано программное обеÑпечение, разработанное The OpenSSL Project Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² «OpenSSL Toolkit» (www.openssl.org, Copyright © 1998-2008, The OpenSSL Project. All rights reserved.). Указанное программное обеÑпечение может иÑпользоватьÑÑ Ð½Ð° уÑловиÑÑ…, доÑтупных Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу: http://www.openssl.org/source/license.html. +5.8. При Ñоздании Программы иÑпользовано программное обеÑпечение разработанное Tim Hudson (tjh@cryptsoft.com). +5.9. При Ñоздании верÑии Программы Ð´Ð»Ñ Microsoft Windows иÑпользована библиотека «Loudmouth», Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Imendio AB (http://projects.imendio.com/loudmouth, Copyright © 2003 Imendio AB), раÑпроÑтранÑÐµÐ¼Ð°Ñ Ð½Ð° уÑловиÑÑ… лицензии GNU LGPL верÑии 3. Указанное программное обеÑпечение может иÑпользоватьÑÑ Ð½Ð° уÑловиÑÑ…, доÑтупных Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу: http://www.gnu.org/copyleft/lesser.html. + +6. Ограничение ответÑтвенноÑти по Лицензии +6.1. Программа предоÑтавлÑетÑÑ Ð½Ð° уÑловиÑÑ… «как еÑть» (as is). Правообладатель не предоÑтавлÑет никаких гарантий в отношении безошибочной и беÑперебойной работы Программы или отдельных её компонентов, ÑоответÑÑ‚Ð²Ð¸Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ конкретным целÑм и ожиданиÑм ПользователÑ, а также не предоÑтавлÑет никаких иных гарантий, прÑмо не указанных в наÑтоÑщей Лицензии. +6.2. Ð’ макÑимальной Ñтепени, допуÑтимой дейÑтвующим законодательÑтвом, Правообладатель не неÑет никакой ответÑтвенноÑти за какие-либо прÑмые или коÑвенные поÑледÑÑ‚Ð²Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ невозможноÑти иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ и/или ущерб, причиненный Пользователю и/или третьим Ñторонам в результате какого-либо иÑпользованиÑ, неиÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ невозможноÑти иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ или отдельных её компонентов и/или функций, в том чиÑле из-за возможных ошибок или Ñбоев в работе Программе. +6.3. Пользователь наÑтоÑщим уведомлен и ÑоглашаетÑÑ, что при иÑпользовании Программы Правообладателю в автоматичеÑком режиме анонимно (без привÑзки к Пользователю) передаетÑÑ ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ: тип операционной ÑиÑтемы компьютера ПользователÑ, верÑÐ¸Ñ Ð¸ идентификатор Программы, ÑтатиÑтика иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ Программы, а также Ð¸Ð½Ð°Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. + +7.ОбновлениÑ/новые верÑии Программы +7.1. ДейÑтвие наÑтоÑщей Лицензии раÑпроÑтранÑетÑÑ Ð½Ð° вÑе поÑледующие обновлениÑ/новые верÑии Программы. СоглашаÑÑÑŒ Ñ ÑƒÑтановкой обновлениÑ/новой верÑии Программы, Пользователь принимает уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑтоÑщей Лицензии Ð´Ð»Ñ ÑоответÑтвующих обновлений/новых верÑий Программы, еÑли обновление/уÑтановка новой верÑии Программы не ÑопровождаетÑÑ Ð¸Ð½Ñ‹Ð¼ лицензионным Ñоглашением. + +8. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑƒÑловий наÑтоÑщей Лицензии +8.1. ÐаÑтоÑщее лицензионное Ñоглашение может изменÑтьÑÑ ÐŸÑ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»ÐµÐ¼ в одноÑтороннем порÑдке. Уведомление ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾ внеÑенных изменениÑÑ… в уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð°ÑтоÑщей Лицензии публикуетÑÑ Ð½Ð° Ñтранице: http://legal.yandex.ru/online_agreement/. Указанные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² уÑловиÑÑ… лицензионного ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð²Ñтупают в Ñилу Ñ Ð´Ð°Ñ‚Ñ‹ их публикации, еÑли иное не оговорено в ÑоответÑтвующей публикации. + +ВерÑÐ¸Ñ Ð´Ð»Ñ Microsoft Windows © 2007-2011 ООО «ЯÐДЕКС» +ВерÑÐ¸Ñ Ð´Ð»Ñ Mac OS X © 2008-2011 ООО «ЯÐДЕКС» +ВерÑÐ¸Ñ Ð´Ð»Ñ Linux © 2008-2011 ООО «ЯÐДЕКС» + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..e8e6e6b --- /dev/null +++ b/INSTALL @@ -0,0 +1,35 @@ +Installation +------------ + +-=[ Important ]=- + + For best experience, use of patched Qt is adviced: all required patches + are provided in qt-patches directory. + +-=[ Linux / Unix ]=- + + For instructions on how to build and install Psi on Unix systems, see + the 'Compiling' section below. + +-=[ Windows ]=- + + No installation required for Windows. You can simply just + run the Psi executable. You might want to move everything into + C:\Program Files\Psi + +-=[ MacOS X ]=- + + Drag the Psi application file from the disk image into the Applications dir. + + +Compiling +--------- + +Requirements: + - Qt 4.5.x with patches + +You can obtain Qt at http://www.trolltech.com/ + +For information about building Psi on Unix, see doc/build-unix.txt. +For information about building Psi on Mac OS X, see doc/build-mac.txt. +For information about building Psi on Windows, see doc/build-win.txt. diff --git a/README b/README new file mode 100644 index 0000000..db4c25a --- /dev/null +++ b/README @@ -0,0 +1,21 @@ +Chat module of Ya.Online 3.0.3 +------------------------------ +Date: December 16, 2009 + +Project Manager: + Dmitry Matveev + http://matv.ru/ + +Lead Develoeper: + Michail Pishchagin + http://mblsha.psi-im.org/ + +Chat module of Ya.Online is project aimed to deliver a +Yandex-branded jabber client for the general public. + +Chat module of Ya.Online is based on Psi (http://psi-im.org). + +For installation or compiling instructions, see the INSTALL file. + +This program is licensed under the GNU General Public License. See +the COPYING file for more information. diff --git a/admin/bundle_qca.sh b/admin/bundle_qca.sh new file mode 100644 index 0000000..4570c5c --- /dev/null +++ b/admin/bundle_qca.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +TARGET=third-party + +################################################################################ +# QCA +################################################################################ + +QCA_SOURCE=../qca +QCA_TARGET=third-party/qca + +rm -rf $QCA_TARGET +cp -r $QCA_SOURCE/src $QCA_TARGET +cp -r $QCA_SOURCE/certs $QCA_TARGET +cp -r $QCA_SOURCE/include $QCA_TARGET +rm $QCA_TARGET/qt.tag $QCA_TARGET/src.pro +echo 'include(../qca.pri)' > $QCA_TARGET/qca.pro + +################################################################################ +# QCA-OpenSSL +################################################################################ + +QCAOPENSSL_SOURCE=../qca-openssl +QCAOPENSSL_TARGET=third-party/qca-openssl +rm -rf $QCAOPENSSL_TARGET +cp -r $QCAOPENSSL_SOURCE $QCA_OPENSSL_TARGET diff --git a/admin/legoptx.txt b/admin/legoptx.txt new file mode 100644 index 0000000..00a452b --- /dev/null +++ b/admin/legoptx.txt @@ -0,0 +1,154 @@ +==========bool: +useleft psi/options/ui/contactlist/use-left-click +singleclick psi/options/ui/contactlist/use-single-click +!hideMenubar psi/options/ui/contactlist/show-menubar +useTransportIconsForContacts psi/options/ui/contactlist/use-transport-icons +alwaysOnTop psi/options/ui/contactlist/always-on-top +keepSizes psi/options/ui/remember-window-sizes +ignoreHeadline psi/options/message/ignore-headlines +ignoreNonRoster psi/options/message/ignore-non-roster-contacts +excludeGroupChatsFromIgnore psi/options/messages/exclude-muc-from-ignore +scrollTo psi/options/ui/contactlist/ensure-contact-visible-on-event +useEmoticons psi/options/ui/emoticons/use-emoticons +alertOpenChats psi/options/ui/chat/alert-for-already-open-chats +raiseChatWindow psi/options/ui/chat/raise-chat-windows-on-new-messages +showSubjects psi/options/ui/message/show-subjects +showGroupCounts psi/options/ui/contactlist/show-group-counts +showCounter psi/options/ui/message/show-character-count +chatSays psi/options/ui/chat/use-chat-says-style +jidComplete psi/options/ui/message/use-jid-auto-completion +grabUrls psi/options/ui/message/auto-grab-urls-from-clipboard +smallChats psi/options/ui/chat/use-small-chats +brushedMetal psi/options/ui/mac/use-brushed-metal-windows +chatLineEdit psi/options/ui/chat/use-expanding-line-edit +useTabs psi/options/ui/tabs/use-tabs +usePerTabCloseButton UNUSED +putTabsAtBottom psi/options/ui/tabs/put-tabs-at-bottom +autoRosterSize psi/options/ui/contactlist/automatically-resize-roster +autoRosterSizeGrowTop psi/options/ui/contactlist/grow-roster-upwards +autoResolveNicksOnAdd psi/options/contactlist/resolve-nicks-on-contact-add +messageEvents psi/options/message/send-composing-events +inactiveEvents psi/options/message/send-inactivity-events +autoCopy psi/options/ui/automatically-copy-selected-text +useCaps DIE? +useRC psi/options/external-control/adhoc-remote-control/enable +useDock psi/options/systemtray/enable +dockDCstyle psi/options/systemtray/use-double-click +dockHideMW psi/options/contactlist/hide-on-start +dockToolMW psi/options/contactlist/use-toolwindow +autoAuth psi/options/subscriptions/automatically-allow-authorisation +notifyAuth psi/options/ui/notifications/successful-subscription +popupMsgs psi/options/ui/message/auto-popup +popupChats psi/options/ui/chat/auto-popup +popupHeadlines psi/options/ui/message/auto-popup-headlines +popupFiles psi/options/ui/file-transfer/auto-popup +noAwayPopup psi/options/ui/notifications/popup-dialogs/suppress-while-away +noUnlistedPopup psi/options/ui/notifications/popup-dialogs/suppress-when-not-on-roster +raise psi/options/ui/contactlist/raise-on-new-event +askOnline psi/options/status/ask-for-message-on-online +askOffline psi/options/status/ask-for-message-on-offline +rosterAnim psi/options/ui/contactlist/use-status-change-animation +autoVCardOnLogin psi/options/vcard/prompt-on-login-for-empty-vcard +xmlConsoleOnLogin psi/options/vcard/xml-console/enable-at-login +use_asAway psi/options/status/auto-away/use-away +use_asXa psi/options/status/auto-away/use-not-availible +use_asOffline psi/options/status/auto-away/use-offline +clNewHeadings psi/options/look/use-slim-group-headings +outlineHeadings psi/options/look/use-outlined-group-headings +noAwaySound psi/options/ui/notifications/sounds/silent-while-away +!noGCSound psi/options/ui/notifications/sounds/notify-every-muc-message +gcNickColoring psi/options/ui/muc/use-nick-coloring +gcHighlighting psi/options/ui/muc/use-highlighting +ppIsOn psi/options/ui/notifications/passive-popups/enabled +ppOnline psi/options/ui/notifications/passive-popups/status/online +ppOffline psi/options/ui/notifications/passive-popups/status/offline +ppStatus psi/options/ui/notifications/passive-popups/status/other-changes +ppMessage psi/options/ui/notifications/passive-popups/incoming-message +ppChat psi/options/ui/notifications/passive-popups/incoming-chat +ppHeadline psi/options/ui/notifications/passive-popups/incoming-headline +ppFile psi/options/ui/notifications/passive-popups/incoming-file-transfer +lockdown.roster psi/options/ui/contactlist/lockdown-roster +lockdown.services psi/options/ui/contactlist/disable-service-discovery +discoItems psi/options/ui/service-discovery/automatically-get-items +discoInfo psi/options/ui/service-discovery/automatically-browse-into +useSound psi/options/ui/notifications/sounds/enable + +==========int: +ppJidClip psi/options/ui/notifications/passive-popups/maximum-jid-length +ppStatusClip psi/options/ui/notifications/passive-popups/maximum-status-length +ppTextClip psi/options/ui/notifications/passive-popups/maximum-text-length +ppHideTime psi/options/ui/notifications/passive-popups/duration +eventPriorityMessage +eventPriorityChat +eventPriorityHeadline +eventPriorityAuth +eventPriorityFile +eventPriorityRosterExchange +dtPort psi/options/p2p/bytestreams/listen-port +asOffline psi/options/status/auto-away/offline-after +asXa psi/options/status/auto-away/not-availible-after +asAway psi/options/status/auto-away/away-after +alertStyle psi/options/ui/notifications/??? +delChats psi/options/ui/chat/contents-after +defaultAction psi/options/message/default-outgoing-message-type +incomingAs psi/options/message/force-incoming-message-type + +=========QSize: +sizeEventDlg psi/options/ui/message/size +sizeTabDlg psi/options/ui/tabs/size + +=========QColor +ppBorderColor psi/options/ui/look/colors/passive-popup/border +color.Online psi/options/ui/look/colors/contactlist/status/online +color.ListBack psi/options/ui/look/colors/contactlist/background +color.Away psi/options/ui/look/colors/contactlist/status/away +color.DND psi/options/ui/look/colors/contactlist/status/do-no-disturb +color.Offline psi/options/ui/look/colors/contactlist/status/offline +color.Status psi/options/ui/look/colors/contactlist/status-messages +color.GroupFore psi/options/ui/look/colors/contactlist/grouping/header-foreground +color.GroupBack psi/options/ui/look/colors/contactlist/grouping/header-background +color.ProfileFore psi/options/ui/look/colors/contactlist/profile/header-foreground +color.ProfileBack psi/options/ui/look/colors/contactlist/profile/header-background +color.AnimFront psi/options/ui/look/contactlist/status-change-animation/color1 +color.AnimBack psi/options/ui/look/contactlist/status-change-animation/color2 + +=========QStringList +emoticons psi/options/iconsets/emoticons +gcHighlights psi/options/ui/muc/highlight-words +gcNickColors psi/options/ui/look/colors/muc/nick-colors +recentGCList psi/options/muc/recent-joins/jids +recentBrowseList psi/options/ui/service-discovery/recent-jids + +=========QString: +systemIconset psi/options/iconsets/system +defaultRosterIconset psi/options/iconsets/status +asMessage psi/options/status/auto-away/message +player psi/options/ui/notifications/sounds/unix-sound-player +dtExternal psi/options/p2p/bytestreams/external-address +lastPath psi/options/ui/last-used-open-path +lastSavePath psi/options/ui/last-used-save-path +lastStatusString psi/options/status/last-message +onevent.Message psi/options/ui/notifications/sounds/incoming-message +onevent.Chat1 psi/options/ui/notifications/sounds/new-chat +onevent.Chat2 psi/options/ui/notifications/sounds/chat-message +onevent.System psi/options/ui/notifications/sounds/system-message +onevent.Headline psi/options/ui/notifications/sounds/incoming-headline +onevent.Online psi/options/ui/notifications/sounds/contact-online +onevent.Offline psi/options/ui/notifications/sounds/contact-offline +onevent.Send psi/options/ui/notifications/sounds/outgoing-chat +onevent.IncomingFT psi/options/ui/notifications/sounds/incoming-file-transfer +onevent.FTComplete psi/options/ui/notifications/sounds/completed-file-transfer +font.Roster psi/options/ui/look/font/contactlist +font.Message psi/options/ui/look/font/message +font.Chat psi/options/ui/look/font/chat +font.Popup psi/options/ui/look/font/passive-popup +bounceDock psi/options/ui/notifications/bounce-dock +rosterContactSortStyle psi/options/ui/contactlist/contact-sort-style +rosterGroupSortStyle psi/options/ui/contactlist/group-sort-style +rosterAccountSortStyle psi/options/ui/contactlist/account-sort-style + +=========== QMaps: +sp psi/options/status/presets +serviceRosterIconset psi/options/iconsets/service-status +customRosterIconset psi/options/iconsets/custom-status +mainwintoolbars psi/options/ui/contactlist/toolbars diff --git a/admin/prune.sh b/admin/prune.sh new file mode 100644 index 0000000..50badbb --- /dev/null +++ b/admin/prune.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +rm -rf _darcs .darcs_boring .darcs_binaries +rm -rf TODO +rm -rf configure-jingle psi-jingle.qc +rm -rf third-party/qca/qca third-party/qca/qca-openssl third-party/qca/qca-sasl third-party/qca/qca-gnupg +rm -rf third-party/customjinglefiles.txt third-party/libjingle third-party/libjingle.new +rm -rf admin diff --git a/admin/update_iconsets.sh b/admin/update_iconsets.sh new file mode 100644 index 0000000..10b53b0 --- /dev/null +++ b/admin/update_iconsets.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +SOURCE_DIR=../../iconsets +TARGET_DIR=../iconsets + +ROSTER_DEFAULT='crystal-roster' +ROSTER_EXTRAS=' + crystal-aim crystal-icq crystal-msn crystal-service crystal-yahoo + crystal-gadu crystal-sms crystal-roster + ' + +SYSTEM_DEFAULT='crystal-system' +SYSTEM_EXTRAS='' + +################################################################################ + +if test ! -d $SOURCE_DIR; then + echo "Cannot find source dir $SOURCE_DIR" + exit +fi + +if test ! -d $TARGET_DIR; then + echo "Cannot find target dir $TARGET_DIR" + exit +fi + +################################################################################ + +# Roster iconsets +echo '*** Updating Roster iconsets ***' +#cp -R $SOURCE_DIR/roster/$ROSTER_DEFAULT/* $TARGET_DIR/roster/default +rm -f $TARGET_DIR/roster/default/Makefile +for i in $ROSTER_EXTRAS; do + make -C $SOURCE_DIR/roster $i.jisp + cp $SOURCE_DIR/roster/$i.jisp $TARGET_DIR/roster +done + +################################################################################ + +# System iconsets +echo '*** Updating System iconsets ***' +#cp -R $SOURCE_DIR/system/$SYSTEM_DEFAULT/* $TARGET_DIR/system/default +rm -f $TARGET_DIR/system/default/Makefile +for i in $SYSTEM_EXTRAS; do + make -C $SOURCE_DIR/system $i.jisp + cp $SOURCE_DIR/system/$i.jisp $TARGET_DIR/system +done diff --git a/admin/update_options_ts.py b/admin/update_options_ts.py new file mode 100644 index 0000000..faf3260 --- /dev/null +++ b/admin/update_options_ts.py @@ -0,0 +1,27 @@ +#!/usr/bin/python + +from xml.dom.minidom import parse, parseString +import xml.dom +import sys + +def rec_parse(node, context): # node : xml.dom.Node + for i in node.childNodes: + if i.nodeType == xml.dom.Node.ELEMENT_NODE: + if i.hasAttribute("comment"): + print 'QT_TRANSLATE_NOOP("' + context + '","' + i.getAttribute("comment") + '");'; + rec_parse(i,context) + + +if len(sys.argv) != 2: + print "usage: %s options.xml > output.cpp" % sys.argv[0] + sys.exit(1) + +print "#define QT_TRANSLATE_NOOP(a,b)" + +dom = parse(sys.argv[1]) # parse an XML file by name + +toplevel = dom.getElementsByTagName("psi")[0] +options = toplevel.getElementsByTagName("options")[0] + +shortcuts = options.getElementsByTagName("shortcuts")[0] +rec_parse(shortcuts,"Shortcuts") diff --git a/certs/README b/certs/README new file mode 100644 index 0000000..bb498c5 --- /dev/null +++ b/certs/README @@ -0,0 +1,11 @@ +This directory contains the SSL certificates shipped with psi. The files should be in PEM format, and should have the extension '.crt' or '.pem'. + +Please use PSIDATADIR/certs for local additions. + +Default value of PSIDATADIR: + Linux, MacOS X and other Unices + ~/.psi/ + Windows NT, 2000, XP and Server 2003 + %UserProfile%\PsiData\ (usually C:\Documents and Settings\username\PsiData ) + Windows 95, 98 and Me + %ProgramFiles%\Psi\PsiData\ (usually C:\Program Files\Psi\PsiData ) diff --git a/certs/rootcerts.pem b/certs/rootcerts.pem new file mode 100644 index 0000000..ead8f9a --- /dev/null +++ b/certs/rootcerts.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIBrDCCAVYCCQCJJPs4An5zrTANBgkqhkiG9w0BAQQFADBdMQswCQYDVQQGEwJS +VTETMBEGA1UECBMKU29tZS1TdGF0ZTEPMA0GA1UEBxMGTW9zY293MQ8wDQYDVQQK +EwZZYW5kZXgxFzAVBgNVBAMTDm90cnMueWFuZGV4LnJ1MB4XDTA1MDMwNDExNTAy +MFoXDTA1MDUwMzExNTAyMFowXTELMAkGA1UEBhMCUlUxEzARBgNVBAgTClNvbWUt +U3RhdGUxDzANBgNVBAcTBk1vc2NvdzEPMA0GA1UEChMGWWFuZGV4MRcwFQYDVQQD +Ew5vdHJzLnlhbmRleC5ydTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDpsqoHlz06 +dkWHqBYvaw0xHHmXlLQ11HE8/LvKGmPIfkUEw27H9qjCCoRAqyGdsPr5jUVsRf46 +GeVZiFfN1YxNAgMBAAEwDQYJKoZIhvcNAQEEBQADQQDcCmIjo5OvcH1d8dXy9GCC +bNsa9RDPsR2XWfMd44vq1JmRnqTvbV44UdG+S5yKlOm5b9a4MbBJytSJr20/fUTE +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC7zCCAligAwIBAgIJAP1+T3fKl1p3MA0GCSqGSIb3DQEBBAUAMFkxEzARBgNV +BAoTCnlhbmRleC5uZXQxDDAKBgNVBAsTA2JvYTEQMA4GA1UEAxMHeWFiYmVyZDEi +MCAGCSqGSIb3DQEJARYTcm9vdEBib2EueWFuZGV4Lm5ldDAeFw0wNjA5MTkwOTM0 +NTdaFw0wNzA5MTkwOTM0NTdaMFkxEzARBgNVBAoTCnlhbmRleC5uZXQxDDAKBgNV +BAsTA2JvYTEQMA4GA1UEAxMHeWFiYmVyZDEiMCAGCSqGSIb3DQEJARYTcm9vdEBi +b2EueWFuZGV4Lm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz6nPMiYp +tTq3K1mB9r0w+yCb3xyj8xJ5fimq06K1mnC8sj9O5h8z+BC9Eq98CyOOJ1jnorP4 +YGT7KPPWxl1Cq1MUX7HAjaf/Q3ubSOUS+2kJHFcpxbjGO8ZW7KXRK+5mbCe8PEKB +jtnOaNtS68VMXY2bjW4TTxMf5KuxH1k8d4cCAwEAAaOBvjCBuzAdBgNVHQ4EFgQU +VZjHsJGTojkcBDqdtloLeNeLg84wgYsGA1UdIwSBgzCBgIAUVZjHsJGTojkcBDqd +tloLeNeLg86hXaRbMFkxEzARBgNVBAoTCnlhbmRleC5uZXQxDDAKBgNVBAsTA2Jv +YTEQMA4GA1UEAxMHeWFiYmVyZDEiMCAGCSqGSIb3DQEJARYTcm9vdEBib2EueWFu +ZGV4Lm5ldIIJAP1+T3fKl1p3MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQAD +gYEAMgOrhadTWkboYsYI4kAWvm+XuNrAIrjM2YGAfO4cSU8oWk24ZXGep3S+kbAC +2Yhm76I2ZS0tmQH9P3zjoIMGXbhoy3PGX7DNx8BOeI5bTzE6dMoonUSCXW4yFyRq +PnJ74wrRZK6UXHbwcJzZdqv1oXvltHKeiKe2+ilSv+XT838= +-----END CERTIFICATE----- diff --git a/certs/startcom_ca.crt b/certs/startcom_ca.crt new file mode 100644 index 0000000..957842c --- /dev/null +++ b/certs/startcom_ca.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- diff --git a/conf_windows.pri b/conf_windows.pri new file mode 100644 index 0000000..8c35a77 --- /dev/null +++ b/conf_windows.pri @@ -0,0 +1,31 @@ +# Windows build settings +CONFIG += release +CONFIG += qca-static + +# tell iris to use our internal libz +CONFIG += psi-zip + +# OpenSSL +qca-static { + DEFINES += HAVE_OPENSSL + DEFINES += OSSL_097 + OPENSSL_PREFIX = $$PWD/../vendor/openssl + INCLUDEPATH += $$OPENSSL_PREFIX/include + LIBS += -L$$OPENSSL_PREFIX/lib +} + +# SASL +#qca-static { +# CYRUSSASL_PREFIX = /local +# INCLUDEPATH += $$CYRUSSASL_PREFIX/include +# LIBS += $$CYRUSSASL_PREFIX/lib/libsasl.lib +#} + +# ASpell +#DEFINES += HAVE_ASPELL +contains(DEFINES, HAVE_ASPELL) { + ASPELL_PREFIX = ../../../aspell + INCLUDEPATH += "$$ASPELL_PREFIX/include" + LIBS += -L"$$ASPELL_PREFIX/lib" + LIBS += -laspell-15 +} diff --git a/configure b/configure new file mode 100644 index 0000000..60c2877 --- /dev/null +++ b/configure @@ -0,0 +1,2303 @@ +#!/bin/sh +# +# Generated by qconf 1.4 ( http://delta.affinix.com/qconf/ ) +# + +show_usage() { +cat </dev/null` + if echo $WHICH | grep 'shell built-in command' >/dev/null 2>&1; then + WHICH=which + elif [ -z "$WHICH" ]; then + if which which >/dev/null 2>&1; then + WHICH=which + else + for a in /usr/ucb /usr/bin /bin /usr/local/bin; do + if [ -x $a/which ]; then + WHICH=$a/which + break; + fi + done + fi + fi + + if [ -z "$WHICH" ]; then + OLD_IFS=$IFS + IFS=: + for a in $PATH; do + if [ -x $a/$1 ]; then + echo "$a/$1" + IFS=$OLD_IFS + export IFS + HOME=$OLD_HOME + export HOME + return 0 + fi + done + IFS=$OLD_IFS + export IFS + else + a=`"$WHICH" "$1" 2>/dev/null` + if [ ! -z "$a" -a -x "$a" ]; then + echo "$a" + HOME=$OLD_HOME + export HOME + return 0 + fi + fi + HOME=$OLD_HOME + export HOME + return 1 +} +WHICH=which_command + +# find a make command +if [ -z "$MAKE" ]; then + MAKE= + for mk in gmake make; do + if $WHICH $mk >/dev/null 2>&1; then + MAKE=`$WHICH $mk` + break + fi + done + if [ -z "$MAKE" ]; then + echo "You don't seem to have 'make' or 'gmake' in your PATH." + echo "Cannot proceed." + exit 1 + fi +fi + +show_qt_info() { + printf "Be sure you have a proper Qt 4.0 build environment set up. This means not\n" + printf "just Qt, but also a C++ compiler, a make tool, and any other packages\n" + printf "necessary for compiling C++ programs.\n" + printf "\n" + printf "If you are certain everything is installed, then it could be that Qt 4 is not\n" + printf "being recognized or that a different version of Qt is being detected by\n" + printf "mistake (for example, this could happen if \$QTDIR is pointing to a Qt 3\n" + printf "installation). At least one of the following conditions must be satisfied:\n" + printf "\n" + printf " 1) --qtdir is set to the location of Qt\n" + printf " 2) \$QTDIR is set to the location of Qt\n" + printf " 3) QtCore is in the pkg-config database\n" + printf " 4) qmake is in the \$PATH\n" + printf "\n" + printf "This script will use the first one it finds to be true, checked in the above\n" + printf "order. #3 and #4 are the recommended options. #1 and #2 are mainly for\n" + printf "overriding the system configuration.\n" + printf "\n" +} + +while [ $# -gt 0 ]; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --prefix=*) + PREFIX=$optarg + shift + ;; + + --bindir=*) + BINDIR=$optarg + shift + ;; + + --datadir=*) + DATADIR=$optarg + shift + ;; + + --qtdir=*) + EX_QTDIR=$optarg + shift + ;; + + --certstore-path=*) + QC_CERTSTORE_PATH=$optarg + shift + ;; + + --disable-bundled-qca) + QC_DISABLE_bundled_qca="Y" + shift + ;; + + --disable-openssl) + QC_DISABLE_openssl="Y" + shift + ;; + + --with-openssl-inc=*) + QC_WITH_OPENSSL_INC=$optarg + shift + ;; + + --with-openssl-lib=*) + QC_WITH_OPENSSL_LIB=$optarg + shift + ;; + + --with-zlib-inc=*) + QC_WITH_ZLIB_INC=$optarg + shift + ;; + + --with-zlib-lib=*) + QC_WITH_ZLIB_LIB=$optarg + shift + ;; + + --enable-universal) + QC_ENABLE_universal="Y" + shift + ;; + + --disable-qdbus) + QC_DISABLE_qdbus="Y" + shift + ;; + + --disable-growl) + QC_DISABLE_growl="Y" + shift + ;; + + --with-growl=*) + QC_WITH_GROWL=$optarg + shift + ;; + + --disable-xss) + QC_DISABLE_xss="Y" + shift + ;; + + --disable-dnotify) + QC_DISABLE_dnotify="Y" + shift + ;; + + --disable-ghbnr) + QC_DISABLE_ghbnr="Y" + shift + ;; + + --disable-aspell) + QC_DISABLE_aspell="Y" + shift + ;; + + --with-aspell-inc=*) + QC_WITH_ASPELL_INC=$optarg + shift + ;; + + --with-aspell-lib=*) + QC_WITH_ASPELL_LIB=$optarg + shift + ;; + + --enable-tests) + QC_ENABLE_tests="Y" + shift + ;; + + --with-cppunit-inc=*) + QC_WITH_CPPUNIT_INC=$optarg + shift + ;; + + --with-cppunit-lib=*) + QC_WITH_CPPUNIT_LIB=$optarg + shift + ;; + + --enable-debug) + QC_ENABLE_DEBUG="Y" + shift + ;; + + --verbose) + QC_VERBOSE="Y" + shift + ;; + --help) show_usage; exit ;; + *) show_usage; exit ;; + esac +done + +PREFIX=${PREFIX:-/usr/local} +BINDIR=${BINDIR:-$PREFIX/bin} +DATADIR=${DATADIR:-$PREFIX/share} + +echo "Configuring Psi ..." + +if [ "$QC_VERBOSE" = "Y" ]; then +echo +echo PREFIX=$PREFIX +echo BINDIR=$BINDIR +echo DATADIR=$DATADIR +echo EX_QTDIR=$EX_QTDIR +echo QC_CERTSTORE_PATH=$QC_CERTSTORE_PATH +echo QC_DISABLE_bundled_qca=$QC_DISABLE_bundled_qca +echo QC_DISABLE_openssl=$QC_DISABLE_openssl +echo QC_WITH_OPENSSL_INC=$QC_WITH_OPENSSL_INC +echo QC_WITH_OPENSSL_LIB=$QC_WITH_OPENSSL_LIB +echo QC_WITH_ZLIB_INC=$QC_WITH_ZLIB_INC +echo QC_WITH_ZLIB_LIB=$QC_WITH_ZLIB_LIB +echo QC_ENABLE_universal=$QC_ENABLE_universal +echo QC_DISABLE_qdbus=$QC_DISABLE_qdbus +echo QC_DISABLE_growl=$QC_DISABLE_growl +echo QC_WITH_GROWL=$QC_WITH_GROWL +echo QC_DISABLE_xss=$QC_DISABLE_xss +echo QC_DISABLE_dnotify=$QC_DISABLE_dnotify +echo QC_DISABLE_ghbnr=$QC_DISABLE_ghbnr +echo QC_DISABLE_aspell=$QC_DISABLE_aspell +echo QC_WITH_ASPELL_INC=$QC_WITH_ASPELL_INC +echo QC_WITH_ASPELL_LIB=$QC_WITH_ASPELL_LIB +echo QC_ENABLE_tests=$QC_ENABLE_tests +echo QC_WITH_CPPUNIT_INC=$QC_WITH_CPPUNIT_INC +echo QC_WITH_CPPUNIT_LIB=$QC_WITH_CPPUNIT_LIB +echo QC_ENABLE_DEBUG=$QC_ENABLE_DEBUG +echo +fi + +printf "Verifying Qt 4 build environment ... " + +# run qmake -v and check version +qmake_check_v4() { + if [ -x "$1" ]; then + if echo `$1 -v 2>&1` | grep "Qt version 4\." >/dev/null 2>&1; then + return 0 + elif [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: $1 not for Qt 4" + fi + fi + return 1 +} + +if [ "$QC_VERBOSE" = "Y" ]; then + echo +fi + +qm="" +names="qmake-qt4 qmake4 qmake" + +# qt4 check: --qtdir +if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then + for n in $names; do + qstr=$EX_QTDIR/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via --qtdir" +fi + +# qt4 check: QTDIR +if [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then + for n in $names; do + qstr=$QTDIR/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via \$QTDIR" +fi + +# qt4 check: pkg-config +if [ -z "$qm" ]; then + str=`pkg-config QtCore --variable=exec_prefix 2>/dev/null` + if [ ! -z "$str" ]; then + for n in $names; do + qstr=$str/bin/$n + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done + fi +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via pkg-config" +fi + +# qt4 check: PATH +if [ -z "$qm" ]; then + for n in $names; do + qstr=`$WHICH $n 2>/dev/null` + if qmake_check_v4 "$qstr"; then + qm=$qstr + break; + fi + done +fi +if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then + echo "Warning: qmake not found via \$PATH" +fi + +if [ -z "$qm" ]; then + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + printf "\n" + printf "Reason: Unable to find the 'qmake' tool for Qt 4.\n" + printf "\n" + show_qt_info + exit 1; +fi +if [ "$QC_VERBOSE" = "Y" ]; then + echo qmake found in $qm +fi + +gen_files() { +cat >$1/modules.cpp <= 4.1 +-----END QCMOD----- +*/ +class qc_qt4 : public ConfObj +{ +public: + qc_qt4(Conf *c) : ConfObj(c) {} + QString name() const { return "Qt >= 4.2.3"; } + QString shortname() const { return "qt4"; } + bool exec() + { + return(QT_VERSION >= 0x040203); + } +}; +#line 1 "bundled-qca.qcm" +/* +-----BEGIN QCMOD----- +name: Use bundled QCA +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_bundled_qca +//---------------------------------------------------------------------------- +class qc_bundled_qca : public ConfObj +{ +public: + qc_bundled_qca(Conf *c) : ConfObj(c) {} + QString name() const { return "bundled QCA 2.0"; } + QString shortname() const { return "bundled_qca"; } + + bool exec() + { + // FIXME: Check QCA version number + if (QFile::exists("third-party/qca/qca")) { + conf->addExtra("CONFIG += qca-static"); + conf->addDefine("QCA_NO_PLUGINS"); + return true; + } + else { + return false; + } + } +}; +#line 1 "qca.qcm" +/* +-----BEGIN QCMOD----- +name: external QCA 2.0 +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_qca +//---------------------------------------------------------------------------- +class qc_qca : public ConfObj +{ +public: + qc_qca(Conf *c) : ConfObj(c) {} + QString name() const { return "QCA 2.0"; } + QString shortname() const { return "qca"; } + + QString checkString() const { + if (QFile::exists("third-party/qca/qca") && conf->getenv("QC_DISABLE_bundled_qca").isEmpty()) + return ""; + else + return ConfObj::checkString(); + } + + bool exec() + { + // Check if we have a bundnled version + if (QFile::exists("third-party/qca/qca") && conf->getenv("QC_DISABLE_bundled_qca").isEmpty()) + return true; + + // test for "crypto" feature and check qca version number + + QString proextra = + "CONFIG += qt crypto\n" + "QT -= gui\n"; + + QString str = + "#include \n" + "\n" + "int main()\n" + "{\n" + " unsigned long x = QCA_VERSION;\n" + " if(x >= 0x016363) return 0; else return 1;\n" + "}\n"; + + int ret; + if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra, &ret)) + return false; + if(ret != 0) + return false; + + return true; + } +}; +#line 1 "openssl.qcm" +/* +-----BEGIN QCMOD----- +name: OpenSSL (bundled QCA only) +arg: with-openssl-inc=[path],Path to OpenSSL include files (bundled QCA only) +arg: with-openssl-lib=[path],Path to OpenSSL library files (bundled QCA only) +-----END QCMOD----- +*/ +class qc_openssl : public ConfObj +{ +public: + qc_openssl(Conf *c) : ConfObj(c) {} + QString name() const { return "OpenSSL"; } + QString shortname() const { return "openssl"; } + + QString checkString() const { + if (!QFile::exists("third-party/qca/qca") || !conf->getenv("QC_DISABLE_bundled_qca").isEmpty()) + return ""; + else + return ConfObj::checkString(); + } + + bool exec() + { + if (!QFile::exists("third-party/qca/qca") || !conf->getenv("QC_DISABLE_bundled_qca").isEmpty() || !QFile::exists("third-party/qca/qca-ossl")) + return false; + + QString inc, lib; + QString s; + bool kb = false; + QString kbdir = "/usr/kerberos/include"; + + // Redhat 9? + if(QFileInfo(kbdir).exists()) + kb = true; + + s = conf->getenv("QC_WITH_OPENSSL_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "openssl/ssl.h")) + return false; + inc = s; + } + else { + if(!conf->findHeader("openssl/ssl.h", QStringList(), &s)) + return false; + inc = s; + } + + s = conf->getenv("QC_WITH_OPENSSL_LIB"); + if(!s.isEmpty()) { + if(!conf->checkLibrary(s, "ssl")) + return false; + lib = s; + } + else { + if(!conf->findLibrary("ssl", &s)) + return false; + lib = s; + } + + // is it at least openssl 0.9.7? + QString str = + "#include\n" + "int main()\n" + "{\n" + " unsigned long x = OPENSSL_VERSION_NUMBER;\n" + " if(x >= 0x00907000) return 0; else return 1;\n" + "}\n"; + QString ext; + QStringList incs; + if(!inc.isEmpty()) + incs += inc; + if(kb) + incs += kbdir; + if(!lib.isEmpty()) + ext += QString("-L") + lib + " -lssl -lcrypto "; + int ret; + if(!conf->doCompileAndLink(str, incs, ext, QString(), &ret)) + return false; + if(ret == 0) + conf->addDefine("OSSL_097"); + + if(!inc.isEmpty()) + conf->addIncludePath(inc); + if(kb) + conf->addIncludePath(kbdir); + if(!lib.isEmpty()) + conf->addLib(QString("-L") + s); + conf->addLib("-lssl -lcrypto"); + + conf->addDefine("HAVE_OPENSSL"); + + return true; + } +}; +#line 1 "zlib.qcm" +/* +-----BEGIN QCMOD----- +name: zlib +arg: with-zlib-inc=[path],Path to zlib include files +arg: with-zlib-lib=[path],Path to zlib library files +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_zlib +//---------------------------------------------------------------------------- +class qc_zlib : public ConfObj +{ +public: + qc_zlib(Conf *c) : ConfObj(c) {} + QString name() const { return "zlib"; } + QString shortname() const { return "zlib"; } + bool exec() + { + QString inc, lib; + QString s; + + s = conf->getenv("QC_WITH_ZLIB_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "zlib.h")) + return false; + inc = s; + } + else { + if(!conf->findHeader("zlib.h", QStringList(), &s)) + return false; + inc = s; + } + + s = conf->getenv("QC_WITH_ZLIB_LIB"); + if(!s.isEmpty()) { + if(!conf->checkLibrary(s, "z")) + return false; + lib = s; + } + else { + if(!conf->findLibrary("z", &s)) + return false; + lib = s; + } + + if(!inc.isEmpty()) + conf->addIncludePath(inc); + if(!lib.isEmpty()) + conf->addLib(QString("-L") + s); + conf->addLib("-lz"); + + return true; + } +}; +#line 1 "universal.qcm" +/* +-----BEGIN QCMOD----- +name: Mac OS X universal binary support +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_universal +//---------------------------------------------------------------------------- +class qc_universal : public ConfObj +{ +public: + qc_universal(Conf *c) : ConfObj(c) {} + QString name() const { return "universal binary support"; } + QString shortname() const { return "universal"; } + QString checkString() const { return QString(); } + + bool exec() + { +#ifdef Q_WS_MAC + conf->addExtra("CONFIG += qc_universal"); +#endif + return true; + } +}; +#line 1 "certstore.qcm" +/* +-----BEGIN QCMOD----- +name: certstore +section: project +arg: certstore-path=[path],Path to the SSL/X509 Certificate store file (bundled QCA only) +-----END QCMOD----- +*/ + +class qc_certstore : public ConfObj +{ +public: + qc_certstore(Conf *c) : ConfObj(c) {} + QString name() const { return "certstore"; } + QString shortname() const { return "certstore"; } + + QString checkString() const { + if (!QFile::exists("third-party/qca/qca") || !conf->getenv("QC_DISABLE_bundled_qca").isEmpty()) + return ""; + else + return ConfObj::checkString(); + } + + bool exec() + { + if (!QFile::exists("third-party/qca/qca") || !conf->getenv("QC_DISABLE_bundled_qca").isEmpty() || !QFile::exists("third-party/qca/qca-ossl")) { + return true; + } + + bundled = false; + +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) + // use built-in + return true; +#else + QStringList pathsToTry; + + path = conf->getenv("QC_CERTSTORE_PATH"); + if(!path.isEmpty()) + { + if(QFile::exists(path)) + { + QString certPathString = + "QCA_SYSTEMSTORE_PATH=\\\\\\\\\\\\\"" + path + "\\\\\\\\\\\\\""; + conf->addDefine(certPathString); + return true; + } + return false; + } + + // This is from Debian + pathsToTry.append( QString("/etc/ssl/certs/ca-certificates.crt") ); + + // Fedora Core 2 uses these + pathsToTry.append( QString("/usr/share/ssl/cert.pem") ); + pathsToTry.append( QString("/usr/share/ssl/certs/ca-bundle.crt") ); + + // Fedora Core 5 changes to this + pathsToTry.append( QString("/etc/pki/tls/cert.pem") ); + + for(int n = 0; n < pathsToTry.count(); ++n) + { + if(QFile::exists(pathsToTry[n])) + { + path = pathsToTry[n]; + break; + } + } + + // fall back to bundled + if(path.isEmpty()) + { + // --prefix=\$pwd ? + if(QFile::exists(conf->getenv("PREFIX") + "/certs/rootcerts.pem")) + path = "\$\$PREFIX/certs/rootcerts.pem"; + else + path = "\$\$DATADIR/yachat/certs/rootcerts.pem"; + + QString extra = + "qcasharedfiles.path = \$\$DATADIR/yachat\n" + "qcasharedfiles.files = third-party/qca/qca/certs\n" + "INSTALLS += qcasharedfiles\n"; + conf->addExtra(extra); + bundled = true; + } + + // Qt<4.2 workaround + QString certPathString = + "QCA_SYSTEMSTORE_PATH=\\\\\\\\\\\\\"" + path + "\\\\\\\\\\\\\""; + conf->addDefine(certPathString); + + return true; +#endif + } + + QString resultString() const + { +#if defined(Q_OS_WIN) + return "using Windows built-in"; +#elif defined(Q_OS_MAC) + return "using Mac built-in"; +#else + if(success) + { + if(bundled) + return "using bundled"; + else + return path; + } + else + return ConfObj::resultString(); +#endif + } + +private: + QString path; + bool bundled; +}; +#line 1 "qdbus.qcm" +/* +-----BEGIN QCMOD----- +name: QDBUS +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_qdbus +//---------------------------------------------------------------------------- +class qc_qdbus : public ConfObj +{ +public: + qc_qdbus(Conf *c) : ConfObj(c) {} + QString name() const { return "QDBUS"; } + QString shortname() const { return "qdbus"; } + bool exec() + { + if (!conf->getenv("QC_DISABLE_qdbus").isEmpty()) + return false; + + // test for "qdbus" feature + + QString proextra = + "CONFIG += qt qdbus\n" + "QT -= gui\n"; + + QString str = + "\n" + "int main()\n" + "{\n" + " return 0;\n" + "}\n"; + + int ret; + if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra, &ret)) + return false; + if(ret != 0) + return false; + + conf->addExtra("CONFIG += dbus"); + return true; + } +}; +#line 1 "growl.qcm" +/* +-----BEGIN QCMOD----- +name: Growl +arg: with-growl=[path],Path to the Growl framework +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_growl +//---------------------------------------------------------------------------- +class qc_growl : public ConfObj +{ +public: + qc_growl(Conf *c) : ConfObj(c) {} + QString name() const { return "Growl"; } + QString shortname() const { return "growl"; } +#ifndef Q_WS_MAC + QString checkString() const { return QString(); } +#endif + + // TODO: This should go into ConfObj + bool checkFramework(const QString &path, const QString &name) + { + QString str = + "int main()\n" + "{\n" + " return 0;\n" + "}\n"; + + QString extra; + if(!path.isEmpty()) + extra += QString("-F") + path + ' '; + extra += QString("-framework ") + name; + if(!conf->doCompileAndLink(str, QStringList(), extra, "", NULL)) + return false; + return true; + } + + // TODO: This should go into ConfObj + void addFrameworkPath(const QString& str) + { + conf->addExtra("QMAKE_CXXFLAGS += -F" + str); + conf->addLib("-F" + str); + } + + bool exec() + { +#ifdef Q_WS_MAC + QString growl_path = conf->getenv("QC_WITH_GROWL"); + if(!checkFramework(growl_path, "Growl")) + return false; + + if(!growl_path.isEmpty()) + addFrameworkPath(growl_path); + conf->addLib("-framework Growl"); + conf->addDefine("HAVE_GROWL"); + + return true; +#else + return false; +#endif + } +}; +#line 1 "xss.qcm" +/* +-----BEGIN QCMOD----- +name: the XScreenSaver extension +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_xss +//---------------------------------------------------------------------------- +class qc_xss : public ConfObj +{ +public: + qc_xss(Conf *c) : ConfObj(c) {} + + QString name() const { return "the XScreenSaver extension"; } + QString shortname() const { return "xss"; } + + bool exec() + { + QString str = + "#include\n" + "#include\n" + "#include\n" + "\n" + "int main()\n" + "{\n" + " XScreenSaverQueryExtension(NULL, NULL, NULL);\n" + " return 0;\n" + "}\n"; + QString proextra = "CONFIG += x11\n"; + + if (!conf->doCompileAndLink(str, QStringList(), "-lXss", proextra, NULL)) { + if (!conf->doCompileAndLink(str, QStringList(), QString(), proextra, NULL)) { + return false; + } + } + else { + conf->addLib("-lXss"); + } + + conf->addDefine("HAVE_XSS"); + return true; + } +}; +#line 1 "dnotify.qcm" +/* +-----BEGIN QCMOD----- +name: Linux Directory Notification +-----END QCMOD----- +*/ + +#include +#include +#include +#include + +//---------------------------------------------------------------------------- +// qc_dnotify +//---------------------------------------------------------------------------- +class qc_dnotify : public ConfObj +{ +public: + qc_dnotify(Conf *c) : ConfObj(c) { } + + QString name() const { return "Linux Directory Notification"; } + QString shortname() const { return "dnotify"; } + + bool exec() + { + QString str = + "#define _GNU_SOURCE\n" + "#include\n" + "#include\n" + "#include\n" + "#include\n" + "\n" + "int main()\n" + "{\n" + " DN_DELETE|DN_CREATE|DN_RENAME|DN_MULTISHOT|DN_MODIFY|DN_ATTRIB;\n" + " return 0;\n" + "}\n"; + int ret; + if (!conf->doCompileAndLink(str, QStringList(), QString(), QString(), &ret) || ret != 0) + return false; + + conf->addDefine("HAVE_DNOTIFY"); + return true; + } +}; +#line 1 "ghbnr.qcm" +/* +-----BEGIN QCMOD----- +name: gethostbyname_r() +-----END QCMOD----- +*/ +class qc_ghbnr : public ConfObj +{ +public: + qc_ghbnr(Conf *c) : ConfObj(c) { } + + QString name() const { return "gethostbyname_r()"; } + QString shortname() const { return "ghbnr"; } + + bool exec() + { + QString str = + "#include\n" + "\n" + "int main()\n" + "{\n" + " gethostbyname_r(\"\", 0, 0, 0, 0, 0);\n" + " return 0;\n" + "}\n"; + if (!conf->doCompileAndLink(str, QStringList(), QString(), QString(), NULL)) + return false; + + conf->addDefine("HAVE_GETHOSTBYNAME_R"); + return true; + } +}; +#line 1 "aspell.qcm" +/* +-----BEGIN QCMOD----- +name: ASPELL +arg: with-aspell-inc=[path],Path to Aspell include files +arg: with-aspell-lib=[path],Path to Aspell library files +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_spell +//---------------------------------------------------------------------------- +class qc_aspell : public ConfObj +{ +public: + qc_aspell(Conf *c) : ConfObj(c) {} + QString name() const { return "Aspell support"; } + QString shortname() const { return "aspell"; } + bool exec() + { + QString s; + + s = conf->getenv("QC_WITH_ASPELL_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "aspell.h")) { + conf->debug("Aspell includes not found!"); + return false; + } + conf->addIncludePath(s); + } + else { + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + if(!conf->findHeader("aspell.h", sl, &s)) { + conf->debug("Aspell includes not found!"); + return false; + } + conf->addIncludePath(s); + } + + s = conf->getenv("QC_WITH_ASPELL_LIB"); + if(!s.isEmpty()) { + if(!conf->checkLibrary(s, "aspell")) { + conf->debug("Aspell libraries not found!"); + return false; + } + conf->addLib(QString("-L") + s); + } + else { + if(!conf->findLibrary("aspell", &s)) { + conf->debug("Aspell libraries not found!"); + return false; + } + if (!s.isEmpty()) + conf->addLib(QString("-L") + s); + } + + // conf->addLib("-laspell"); + // conf->addDefine("HAVE_ASPELL"); + + return true; + } +}; +#line 1 "tests.qcm" +/* +-----BEGIN QCMOD----- +name: Tests +arg: with-cppunit-inc=[path],Path to CppUnit include files +arg: with-cppunit-lib=[path],Path to CppUnit library files +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_tests +//---------------------------------------------------------------------------- +class qc_tests : public ConfObj +{ +public: + qc_tests(Conf *c) : ConfObj(c) {} + QString name() const { return "tests"; } + QString shortname() const { return "tests"; } + bool exec() + { + QString s = conf->getenv("QC_WITH_CPPUNIT_INC"); + if(!s.isEmpty()) { + if(!conf->checkHeader(s, "cppunit/Test.h")) { + conf->debug("CppUnit includes not found!"); + return false; + } + conf->addIncludePath(s); + } + else { + QStringList sl; + sl += "/usr/include"; + sl += "/usr/local/include"; + sl += "/sw/include"; + sl += "/opt/local/include"; + if(!conf->findHeader("cppunit/Test.h", sl, &s)) { + conf->debug("CppUnit includes not found!"); + return false; + } + conf->addIncludePath(s); + } + + s = conf->getenv("QC_WITH_CPPUNIT_LIB"); + if(!s.isEmpty()) { + if(!conf->checkLibrary(s, "cppunit")) { + conf->debug("CppUnit libraries not found!"); + return false; + } + conf->addLib(QString("-L") + s); + } + else { + if(!conf->findLibrary("cppunit", &s)) { + conf->debug("CppUnit libraries not found!"); + return false; + } + if (!s.isEmpty()) + conf->addLib(QString("-L") + s); + } + + conf->addLib("-lcppunit"); + conf->addExtra("CONFIG += tests"); + + return true; + } +}; +#line 1 "debug.qcm" +/* +-----BEGIN QCMOD----- +name: Debugging support +arg: enable-debug,Enable debugging support +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_debug +//---------------------------------------------------------------------------- +class qc_debug : public ConfObj +{ +public: + qc_debug(Conf *c) : ConfObj(c) {} + QString name() const { return "debugging support"; } + QString shortname() const { return "debug"; } + QString checkString() const { return QString(); } + + bool exec() + { + if (conf->getenv("QC_ENABLE_DEBUG").isEmpty()) + conf->addExtra("CONFIG += release"); + else + conf->addExtra("CONFIG += debug"); + return true; + } +}; +#line 1 "conf.qcm" +/* +-----BEGIN QCMOD----- +name: Psi Configuration +-----END QCMOD----- +*/ + +//---------------------------------------------------------------------------- +// qc_conf +//---------------------------------------------------------------------------- +class qc_conf : public ConfObj +{ +public: + qc_conf(Conf *c) : ConfObj(c) {} + QString name() const { return "Psi Configuration"; } + QString shortname() const { return "conf"; } + QString checkString() const { return QString(); } + bool exec() + { + conf->addExtra(QString("PSI_DATADIR=%1/yachat").arg(conf->getenv("DATADIR"))); + + QFile file("src/config.h"); + if ( file.open(QIODevice::WriteOnly | QIODevice::Text) ) { + QTextStream stream( &file ); + stream << "#define PSI_DATADIR \"" << conf->getenv("DATADIR") << "/yachat\"" << endl; + } + + conf->addDefine("HAVE_CONFIG"); + + return true; + } +}; + +EOT +cat >$1/modules_new.cpp <required = true; + o->disabled = false; + o = new qc_bundled_qca(conf); + o->required = false; + o->disabled = false; + o = new qc_qca(conf); + o->required = true; + o->disabled = false; + o = new qc_openssl(conf); + o->required = false; + o->disabled = false; + o = new qc_zlib(conf); + o->required = true; + o->disabled = false; + o = new qc_universal(conf); + o->required = false; + o->disabled = true; + o = new qc_certstore(conf); + o->required = true; + o->disabled = false; + o = new qc_qdbus(conf); + o->required = false; + o->disabled = false; + o = new qc_growl(conf); + o->required = false; + o->disabled = false; + o = new qc_xss(conf); + o->required = false; + o->disabled = false; + o = new qc_dnotify(conf); + o->required = false; + o->disabled = false; + o = new qc_ghbnr(conf); + o->required = false; + o->disabled = false; + o = new qc_aspell(conf); + o->required = false; + o->disabled = false; + o = new qc_tests(conf); + o->required = false; + o->disabled = true; + o = new qc_debug(conf); + o->required = true; + o->disabled = false; + o = new qc_conf(conf); + o->required = true; + o->disabled = false; + +EOT +cat >$1/conf4.h < + +class Conf; + +enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny }; + +// ConfObj +// +// Subclass ConfObj to create a new configuration module. +class ConfObj +{ +public: + Conf *conf; + bool required; + bool disabled; + bool success; + + ConfObj(Conf *c); + virtual ~ConfObj(); + + // long or descriptive name of what is being checked/performed + // example: "KDE >= 3.3" + virtual QString name() const = 0; + + // short name + // example: "kde" + virtual QString shortname() const = 0; + + // string to display during check + // default: "Checking for [name] ..." + virtual QString checkString() const; + + // string to display after check + // default: "yes" or "no", based on result of exec() + virtual QString resultString() const; + + // this is where the checking code goes + virtual bool exec() = 0; +}; + +// Conf +// +// Interact with this class from your ConfObj to perform detection +// operations and to output configuration parameters. +class Conf +{ +public: + bool debug_enabled; + QString qmake_path; + QString maketool; + + QString DEFINES; + QString INCLUDEPATH; + QString LIBS; + QString extra; + + QList list; + QMap vars; + + Conf(); + ~Conf(); + + QString getenv(const QString &var); + QString qvar(const QString &s); + + bool exec(); + + void debug(const QString &s); + + QString expandIncludes(const QString &inc); + QString expandLibs(const QString &lib); + + int doCommand(const QString &s, QByteArray *out = 0); + int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0); + + bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0); + bool checkHeader(const QString &path, const QString &h); + bool findHeader(const QString &h, const QStringList &ext, QString *inc); + bool checkLibrary(const QString &path, const QString &name); + bool findLibrary(const QString &name, QString *lib); + QString findProgram(const QString &prog); + bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs); + bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags); + bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags); + + void addDefine(const QString &str); + void addLib(const QString &str); + void addIncludePath(const QString &str); + void addExtra(const QString &str); + +private: + bool first_debug; + + friend class ConfObj; + void added(ConfObj *o); +}; + +#endif + +EOT +cat >$1/conf4.cpp < +#include + +class MocTestObject : public QObject +{ + Q_OBJECT +public: + MocTestObject() {} +}; + +QString qc_getenv(const QString &var) +{ + char *p = ::getenv(var.toLatin1().data()); + if(!p) + return QString(); + return QString(p); +} + +QStringList qc_pathlist() +{ + QStringList list; + QString path = qc_getenv("PATH"); + if(!path.isEmpty()) + list = path.split(':', QString::SkipEmptyParts); + return list; +} + +QString qc_findprogram(const QString &prog) +{ + QString out; + QStringList list = qc_pathlist(); + for(int n = 0; n < list.count(); ++n) + { + QFileInfo fi(list[n] + '/' + prog); + if(fi.exists() && fi.isExecutable()) + { + out = fi.filePath(); + break; + } + } + return out; +} + +QString qc_findself(const QString &argv0) +{ + if(argv0.contains('/')) + return argv0; + else + return qc_findprogram(argv0); +} + +int qc_runcommand(const QString &command, QByteArray *out, bool showOutput) +{ + QString fullcmd = command; + if(!showOutput) + fullcmd += " 2>/dev/null"; + FILE *f = popen(fullcmd.toLatin1().data(), "r"); + if(!f) + return -1; + if(out) + out->clear(); + while(1) + { + char c = (char)fgetc(f); + if(feof(f)) + break; + if(out) + out->append(c); + if(showOutput) + fputc(c, stdout); + } + int ret = pclose(f); + if(ret == -1) + return -1; + return ret; +} + +int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput) +{ + QString fullcmd = prog; + QString argstr = args.join(" "); + if(!argstr.isEmpty()) + fullcmd += QString(" ") + argstr; + return qc_runcommand(fullcmd, out, showOutput); + + // TODO: use QProcess once it is fixed + /* + QProcess process; + if(showOutput) + process.setReadChannelMode(ForwardedChannels); + process.start(prog, args); + process.waitForFinished(-1); + return process.exitCode(); + */ +} + +bool qc_removedir(const QString &dirPath) +{ + QDir dir(dirPath); + if(!dir.exists()) + return false; + QStringList list = dir.entryList(); + foreach(QString s, list) + { + if(s == "." || s == "..") + continue; + QFileInfo fi(dir.filePath(s)); + if(fi.isDir()) + { + if(!qc_removedir(fi.filePath())) + return false; + } + else + { + if(!dir.remove(s)) + return false; + } + } + QString dirName = dir.dirName(); + if(!dir.cdUp()) + return false; + if(!dir.rmdir(dirName)) + return false; + return true; +} + +void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags) +{ + incs->clear(); + otherflags->clear(); + + QStringList cflagsList = cflags.split(" "); + for(int n = 0; n < cflagsList.count(); ++n) + { + QString str = cflagsList[n]; + if(str.startsWith("-I")) + { + // we want everything except the leading "-I" + incs->append(str.remove(0, 2)); + } + else + { + // we want whatever is left + otherflags->append(str); + } + } +} + +QString qc_escapeArg(const QString &str) +{ + QString out; + for(int n = 0; n < (int)str.length(); ++n) { + if(str[n] == '-') + out += '_'; + else + out += str[n]; + } + return out; +} + +//---------------------------------------------------------------------------- +// ConfObj +//---------------------------------------------------------------------------- +ConfObj::ConfObj(Conf *c) +{ + conf = c; + conf->added(this); + required = false; + disabled = false; + success = false; +} + +ConfObj::~ConfObj() +{ +} + +QString ConfObj::checkString() const +{ + return QString("Checking for %1 ...").arg(name()); +} + +QString ConfObj::resultString() const +{ + if(success) + return "yes"; + else + return "no"; +} + +//---------------------------------------------------------------------------- +// qc_internal_pkgconfig +//---------------------------------------------------------------------------- +class qc_internal_pkgconfig : public ConfObj +{ +public: + QString pkgname, desc; + VersionMode mode; + QString req_ver; + + qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c) + { + pkgname = _name; + desc = _desc; + mode = _mode; + req_ver = _req_ver; + } + + QString name() const { return desc; } + QString shortname() const { return pkgname; } + + bool exec() + { + QStringList incs; + QString version, libs, other; + if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other)) + return false; + + for(int n = 0; n < incs.count(); ++n) + conf->addIncludePath(incs[n]); + if(!libs.isEmpty()) + conf->addLib(libs); + //if(!other.isEmpty()) + // conf->addExtra(QString("QMAKE_CFLAGS += %1\n").arg(other)); + return true; + } +}; + +//---------------------------------------------------------------------------- +// Conf +//---------------------------------------------------------------------------- +Conf::Conf() +{ + // TODO: no more vars? + //vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC)); + //vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR)); + //vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB)); + //vars.insert("QMAKE_CC", CC); + + debug_enabled = false; +} + +Conf::~Conf() +{ + qDeleteAll(list); +} + +void Conf::added(ConfObj *o) +{ + list.append(o); +} + +QString Conf::getenv(const QString &var) +{ + return qc_getenv(var); +} + +void Conf::debug(const QString &s) +{ + if(debug_enabled) + { + if(first_debug) + printf("\n"); + first_debug = false; + printf(" * %s\n", qPrintable(s)); + } +} + +bool Conf::exec() +{ + for(int n = 0; n < list.count(); ++n) + { + ConfObj *o = list[n]; + + // if this was a disabled-by-default option, check if it was enabled + if(o->disabled) + { + QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname()); + if(getenv(v) != "Y") + continue; + } + // and the opposite? + else + { + QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname()); + if(getenv(v) == "Y") + continue; + } + + bool output = true; + QString check = o->checkString(); + if(check.isEmpty()) + output = false; + + if(output) + { + printf("%s", check.toLatin1().data()); + fflush(stdout); + } + + first_debug = true; + bool ok = o->exec(); + o->success = ok; + + if(output) + { + QString result = o->resultString(); + if(!first_debug) + printf(" -> %s\n", result.toLatin1().data()); + else + printf(" %s\n", result.toLatin1().data()); + } + + if(!ok && o->required) + { + printf("\nError: need %s!\n", o->name().toLatin1().data()); + return false; + } + } + return true; +} + +QString Conf::qvar(const QString &s) +{ + return vars.value(s); +} + +QString Conf::expandIncludes(const QString &inc) +{ + return QString("-I") + inc; +} + +QString Conf::expandLibs(const QString &lib) +{ + return QString("-L") + lib; +} + +int Conf::doCommand(const QString &s, QByteArray *out) +{ + debug(QString("[%1]").arg(s)); + int r = qc_runcommand(s, out, debug_enabled); + debug(QString("returned: %1").arg(r)); + return r; +} + +int Conf::doCommand(const QString &prog, const QStringList &args, QByteArray *out) +{ + QString fullcmd = prog; + QString argstr = args.join(" "); + if(!argstr.isEmpty()) + fullcmd += QString(" ") + argstr; + debug(QString("[%1]").arg(fullcmd)); + int r = qc_runprogram(prog, args, out, debug_enabled); + debug(QString("returned: %1").arg(r)); + return r; +} + +bool Conf::doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode) +{ + QDir tmp(".qconftemp"); + if(!tmp.mkdir("atest")) + { + debug("unable to create atest dir"); + return false; + } + QDir dir(tmp.filePath("atest")); + if(!dir.exists()) + { + debug("atest dir does not exist"); + return false; + } + + QString fname = dir.filePath("atest.cpp"); + QString out = "atest"; + QFile f(fname); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + debug("unable to open atest.cpp for writing"); + return false; + } + if(f.write(filedata.toLatin1()) == -1) + { + debug("error writing to atest.cpp"); + return false; + } + f.close(); + + debug(QString("Wrote atest.cpp:\n%1").arg(filedata)); + + QString pro = QString( + "CONFIG += console\n" + "CONFIG -= qt app_bundle\n" + "SOURCES += atest.cpp\n"); + QString inc = incs.join(" "); + if(!inc.isEmpty()) + pro += "INCLUDEPATH += " + inc + '\n'; + if(!libs.isEmpty()) + pro += "LIBS += " + libs + '\n'; + pro += proextra; + + fname = dir.filePath("atest.pro"); + f.setFileName(fname); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + debug("unable to open atest.pro for writing"); + return false; + } + if(f.write(pro.toLatin1()) == -1) + { + debug("error writing to atest.pro"); + return false; + } + f.close(); + + debug(QString("Wrote atest.pro:\n%1").arg(pro)); + + QString oldpath = QDir::currentPath(); + QDir::setCurrent(dir.path()); + + bool ok = false; + int r = doCommand(qmake_path, QStringList() << "atest.pro"); + if(r == 0) + { + r = doCommand(maketool, QStringList()); + if(r == 0) + { + ok = true; + if(retcode) + *retcode = doCommand(QString("./") + out, QStringList()); + } + r = doCommand(maketool, QStringList() << "distclean"); + if(r != 0) + debug("error during atest distclean"); + } + + QDir::setCurrent(oldpath); + + // cleanup + //dir.remove("atest.pro"); + //dir.remove("atest.cpp"); + //tmp.rmdir("atest"); + + // remove whole dir since distclean doesn't always work + qc_removedir(tmp.filePath("atest")); + + if(!ok) + return false; + return true; +} + +bool Conf::checkHeader(const QString &path, const QString &h) +{ + QFileInfo fi(path + '/' + h); + if(fi.exists()) + return true; + return false; +} + +bool Conf::findHeader(const QString &h, const QStringList &ext, QString *inc) +{ + if(checkHeader("/usr/include", h)) + { + *inc = ""; + return true; + } + QStringList dirs; + dirs += "/usr/local/include"; + dirs += ext; + for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it) + { + if(checkHeader(*it, h)) + { + *inc = *it; + return true; + } + } + return false; +} + +bool Conf::checkLibrary(const QString &path, const QString &name) +{ + QString str = + //"#include \n" + "int main()\n" + "{\n" + //" printf(\"library checker running\\\\n\");\n" + " return 0;\n" + "}\n"; + + QString libs; + if(!path.isEmpty()) + libs += QString("-L") + path + ' '; + libs += QString("-l") + name; + if(!doCompileAndLink(str, QStringList(), libs, QString())) + return false; + return true; +} + +bool Conf::findLibrary(const QString &name, QString *lib) +{ + if(checkLibrary("", name)) + { + *lib = ""; + return true; + } + if(checkLibrary("/usr/local/lib", name)) + { + *lib = "/usr/local/lib"; + return true; + } + return false; +} + +QString Conf::findProgram(const QString &prog) +{ + return qc_findprogram(prog); +} + +bool Conf::findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs) +{ + QString inc, lib; + QString s; + + s = getenv(incvar); + if(!s.isEmpty()) { + if(!checkHeader(s, incname)) + return false; + inc = s; + } + else { + if(!findHeader(incname, QStringList(), &s)) + return false; + inc = s; + } + + s = getenv(libvar); + if(!s.isEmpty()) { + if(!checkLibrary(s, libname)) + return false; + lib = s; + } + else { + if(!findLibrary(libname, &s)) + return false; + lib = s; + } + + QString lib_out; + if(!lib.isEmpty()) + lib_out += QString("-L") + s; + lib_out += QString("-l") + libname; + + *incpath = inc; + *libs = lib_out; + return true; +} + +bool Conf::findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags) +{ + QStringList args; + QByteArray out; + int ret; + + args += "--version"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString version_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += "--libs"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString libs_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += "--cflags"; + ret = doCommand(path, args, &out); + if(ret != 0) + return false; + + QString cflags = QString::fromLatin1(out).trimmed(); + + QStringList incs_out, otherflags_out; + qc_splitcflags(cflags, &incs_out, &otherflags_out); + + *version = version_out; + *incs = incs_out; + *libs = libs_out; + *otherflags = otherflags_out.join(" "); + return true; +} + +bool Conf::findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags) +{ + QStringList args; + QByteArray out; + int ret; + + args += name; + args += "--exists"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + if(mode != VersionAny) + { + args.clear(); + args += name; + if(mode == VersionMin) + args += QString("--atleast-version=%1").arg(req_version); + else if(mode == VersionMax) + args += QString("--max-version=%1").arg(req_version); + else + args += QString("--exact-version=%1").arg(req_version); + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + } + + args.clear(); + args += name; + args += "--modversion"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString version_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += name; + args += "--libs"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString libs_out = QString::fromLatin1(out).trimmed(); + + args.clear(); + args += name; + args += "--cflags"; + ret = doCommand("pkg-config", args, &out); + if(ret != 0) + return false; + + QString cflags = QString::fromLatin1(out).trimmed(); + + QStringList incs_out, otherflags_out; + qc_splitcflags(cflags, &incs_out, &otherflags_out); + + *version = version_out; + *incs = incs_out; + *libs = libs_out; + *otherflags = otherflags_out.join(" "); + return true; +} + +void Conf::addDefine(const QString &str) +{ + if(DEFINES.isEmpty()) + DEFINES = str; + else + DEFINES += QString(" ") + str; + debug(QString("DEFINES += %1").arg(str)); +} + +void Conf::addLib(const QString &str) +{ + if(LIBS.isEmpty()) + LIBS = str; + else + LIBS += QString(" ") + str; + debug(QString("LIBS += %1").arg(str)); +} + +void Conf::addIncludePath(const QString &str) +{ + if(INCLUDEPATH.isEmpty()) + INCLUDEPATH = str; + else + INCLUDEPATH += QString(" ") + str; + debug(QString("INCLUDEPATH += %1").arg(str)); +} + +void Conf::addExtra(const QString &str) +{ + extra += str + '\n'; + debug(QString("extra += %1").arg(str)); +} + +//---------------------------------------------------------------------------- +// main +//---------------------------------------------------------------------------- +#include "conf4.moc" + +#ifdef HAVE_MODULES +# include"modules.cpp" +#endif + +int main() +{ + Conf *conf = new Conf; + ConfObj *o; + o = 0; +#ifdef HAVE_MODULES +# include"modules_new.cpp" +#endif + + conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false; + if(conf->debug_enabled) + printf(" -> ok\n"); + else + printf("ok\n"); + + QString confCommand = qc_getenv("QC_COMMAND"); + QString proName = qc_getenv("QC_PROFILE"); + conf->qmake_path = qc_getenv("QC_QMAKE"); + conf->maketool = qc_getenv("QC_MAKETOOL"); + + if(conf->debug_enabled) + printf("conf command: [%s]\n", qPrintable(confCommand)); + + QString confPath = qc_findself(confCommand); + if(confPath.isEmpty()) + { + printf("Error: cannot find myself; rerun with an absolute path\n"); + return 1; + } + + QString srcdir = QFileInfo(confPath).absolutePath(); + QString builddir = QDir::current().absolutePath(); + QString proPath = QDir(srcdir).filePath(proName); + + if(conf->debug_enabled) + { + printf("conf path: [%s]\n", qPrintable(confPath)); + printf("srcdir: [%s]\n", qPrintable(srcdir)); + printf("builddir: [%s]\n", qPrintable(builddir)); + printf("profile: [%s]\n", qPrintable(proPath)); + printf("qmake path: [%s]\n", qPrintable(conf->qmake_path)); + printf("make tool: [%s]\n", qPrintable(conf->maketool)); + printf("\n"); + } + + bool success = false; + if(conf->exec()) + { + QFile f("conf.pri"); + if(!f.open(QFile::WriteOnly | QFile::Truncate)) + { + printf("Error writing %s\n", qPrintable(f.fileName())); + return 1; + } + + QString str; + str += "# qconf\n\n"; + + QString var; + var = qc_getenv("PREFIX"); + if(!var.isEmpty()) + str += QString("PREFIX = %1\n").arg(var); + var = qc_getenv("BINDIR"); + if(!var.isEmpty()) + str += QString("BINDIR = %1\n").arg(var); + var = qc_getenv("INCDIR"); + if(!var.isEmpty()) + str += QString("INCDIR = %1\n").arg(var); + var = qc_getenv("LIBDIR"); + if(!var.isEmpty()) + str += QString("LIBDIR = %1\n").arg(var); + var = qc_getenv("DATADIR"); + if(!var.isEmpty()) + str += QString("DATADIR = %1\n").arg(var); + str += '\n'; + + if(qc_getenv("QC_STATIC") == "Y") + str += "CONFIG += staticlib\n"; + + // TODO: don't need this? + //str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\n'; + + if(!conf->DEFINES.isEmpty()) + str += "DEFINES += " + conf->DEFINES + '\n'; + if(!conf->INCLUDEPATH.isEmpty()) + str += "INCLUDEPATH += " + conf->INCLUDEPATH + '\n'; + if(!conf->LIBS.isEmpty()) + str += "LIBS += " + conf->LIBS + '\n'; + if(!conf->extra.isEmpty()) + str += conf->extra; + str += '\n'; + + QByteArray cs = str.toLatin1(); + f.write(cs); + f.close(); + success = true; + } + QString qmake_path = conf->qmake_path; + delete conf; + + if(!success) + return 1; + + // run qmake on the project file + int ret = qc_runprogram(qmake_path, QStringList() << proPath, 0, true); + if(ret != 0) + return 1; + + return 0; +} + +EOT +cat >$1/conf4.pro </dev/null + $MAKE clean >/dev/null 2>&1 + $MAKE >../conf.log 2>&1 +) + +if [ "$?" != "0" ]; then + rm -rf .qconftemp + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + printf "\n" + printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n" + printf "\n" + show_qt_info + if [ "$QC_VERBOSE" = "Y" ]; then + echo "conf.log:" + cat conf.log + fi + exit 1; +fi + +QC_COMMAND=$0 +export QC_COMMAND +QC_PROFILE=psi.pro +export QC_PROFILE +QC_QMAKE=$qm +export QC_QMAKE +QC_MAKETOOL=$MAKE +export QC_MAKETOOL +.qconftemp/conf +ret="$?" +if [ "$ret" = "1" ]; then + rm -rf .qconftemp + echo + exit 1; +else + if [ "$ret" != "0" ]; then + rm -rf .qconftemp + if [ "$QC_VERBOSE" = "Y" ]; then + echo " -> fail" + else + echo "fail" + fi + echo + echo "Reason: Unexpected error launching 'conf'" + echo + exit 1; + fi +fi +rm -rf .qconftemp + +echo +echo "Good, your configure finished. Now run $MAKE." +echo diff --git a/crashreporter/.gitignore b/crashreporter/.gitignore new file mode 100644 index 0000000..af365b1 --- /dev/null +++ b/crashreporter/.gitignore @@ -0,0 +1,12 @@ +/Makefile +/Makefile.Debug +/Makefile.Release +/_moc +/_obj +/_ui +/debug +/release +/.moc +/.obj +/.ui +/crashreporter \ No newline at end of file diff --git a/crashreporter/crashreporter.cpp b/crashreporter/crashreporter.cpp new file mode 100644 index 0000000..e40fc3d --- /dev/null +++ b/crashreporter/crashreporter.cpp @@ -0,0 +1,294 @@ +/* + * crashreporter.cpp - simple crash reporter + * Copyright (C) 2008 Michail Pishchagin + * + * 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ui_crashreporter.h" + +#if defined(Q_WS_WIN) +#include "mailmsg_windows.h" +#endif + +class CrashReporter : public QWidget +{ + Q_OBJECT +public: + CrashReporter() + : QWidget() + , http_(0) + , restartButton_(0) + , quitButton_(0) + { + ui_.setupUi(this); + + appName_ = "Application"; + + http_ = new QHttp(this); + connect(http_, SIGNAL(done(bool)), SLOT(httpDone(bool))); + + ui_.textEdit->setFocus(); + } + + void doShow() + { + ui_.label->setText(ui_.label->text().arg(appName_)); + + if (!appPath_.isEmpty()) { + restartButton_ = ui_.buttonBox->addButton(tr("Restart %1").arg(appName_), QDialogButtonBox::AcceptRole); + connect(restartButton_, SIGNAL(clicked()), SLOT(restartApp())); + } + + quitButton_ = ui_.buttonBox->addButton(tr("Quit %1").arg(appName_), QDialogButtonBox::RejectRole); + connect(quitButton_, SIGNAL(clicked()), SLOT(quitApp())); + + show(); + } + + void setAppName(const QString& appName) + { + appName_ = appName; + } + + void setAppVersion(const QString& appVersion) + { + appVersion_ = appVersion; + } + + void setAppPath(const QString& appPath) + { + appPath_ = appPath; + } + + void setMinidump(const QString& minidump) + { + minidump_ = minidump; + } + + void setReportURL(const QString& reportURL) + { + reportURL_ = reportURL; + } + + void setReportEmail(const QString& reportEmail) + { + reportEmail_ = reportEmail; + } + +private slots: + void restartApp() + { + if (!appPath_.isEmpty()) { + QProcess::startDetached(appPath_); + } + close(); + } + + void quitApp() + { + close(); + } + + QByteArray makeFormField(const QString& name, const QByteArray& data) + { + QByteArray result; + result.append("------FormBoundary5WRMUdn8jqMNiFOP\r\n"); + result.append("Content-Disposition: form-data; name=\"" + name + "\"\r\n"); + result.append("\r\n"); + result.append(data); + result.append("\r\n"); + return result; + } + + bool reportCrash() + { + if (reportURL_.isEmpty()) { + qWarning("report url is empty"); + return false; + } + + QFileInfo fi(minidump_); + if (!fi.exists()) { + qWarning("minidump not found"); + return false; + } + + QFile minidump(minidump_); + if (!minidump.open(QIODevice::ReadOnly)) { + qWarning("unable to open minidump"); + return false; + } + + if (!ui_.groupBox->isChecked() || !http_) + return false; + + if (restartButton_) + restartButton_->setEnabled(false); + if (quitButton_) + quitButton_->setEnabled(false); + + QUrl url(reportURL_, QUrl::TolerantMode); + QHttpRequestHeader header("POST", url.path()); + header.setValue("User-Agent", "crashreporter"); + header.setValue("Host", url.port() == -1 ? url.host() : QString("%1:%2").arg(url.host(), url.port())); + header.setValue("Accept-Language", "en-us"); + header.setValue("Content-Type", "multipart/form-data; boundary=----FormBoundary5WRMUdn8jqMNiFOP"); + header.setValue("Accept", "*/*"); + + QByteArray bytes; + bytes.append(makeFormField("app-name", appName_.toUtf8())); + bytes.append(makeFormField("app-version", appVersion_.toUtf8())); + bytes.append(makeFormField("comments", ui_.textEdit->toPlainText().toUtf8())); + bytes.append(makeFormField("upload_file_minidump", minidump.readAll())); + + bytes.append("------FormBoundary5WRMUdn8jqMNiFOP--"); + bytes.append("\r\n"); + + int contentLength = bytes.length(); + header.setContentLength(contentLength); + + http_->setHost(url.host(), url.port() == -1 ? 80 : url.port()); + http_->request(header, bytes); + + return true; + } + + void httpDone(bool error) + { + if (error) { + qWarning("CrashReporter: ERROR: %s", qPrintable(http_->errorString())); + sendEmail(); + http_->abort(); + } + else { + QString result(http_->readAll()); + QRegExp rx("CrashID\\=([\\d\\w-]+)"); + if (rx.indexIn(result) != -1) { + qWarning("CrashReporter: CrashID=%s", qPrintable(rx.capturedTexts().at(1))); + } + } + + delete http_; + http_ = 0; + close(); + } + + void sendEmail() + { + if (reportEmail_.isEmpty()) { + qWarning("report email is empty"); + return; + } + +#if defined(Q_WS_WIN) + QStringList attachments; + QFileInfo fi(minidump_); + if (fi.exists()) { + attachments << fi.absoluteFilePath(); + } + + MailMsg::sendEmail(reportEmail_, + "Crash report", + ui_.textEdit->toPlainText(), + attachments); +#endif + } + +protected: + // reimplemented + void closeEvent(QCloseEvent* e) + { + if (reportCrash()) { + e->ignore(); + return; + } + QWidget::closeEvent(e); + } + +private: + Ui::CrashReporter ui_; + QHttp* http_; + QPushButton* restartButton_; + QPushButton* quitButton_; + QString appName_; + QString appVersion_; + QString appPath_; + QString minidump_; + QString reportURL_; + QString reportEmail_; +}; + +static QString optionValue(const QString& optionName, const QString string) +{ + if (string.startsWith(QString("-%1=").arg(optionName))) { + QStringList list = string.split("="); + list.removeFirst(); + if (!list.isEmpty()) { + return list.join("="); + } + } + + return QString(); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + CrashReporter crashReporter; + + for (int n = 1; n < argc; ++n) { + QString str = argv[n]; + if (!optionValue("appName", str).isEmpty()) { + crashReporter.setAppName(optionValue("appName", str)); + } + + if (!optionValue("appVersion", str).isEmpty()) { + crashReporter.setAppVersion(optionValue("appVersion", str)); + } + + if (!optionValue("appPath", str).isEmpty()) { + crashReporter.setAppPath(optionValue("appPath", str)); + } + + if (!optionValue("minidump", str).isEmpty()) { + crashReporter.setMinidump(optionValue("minidump", str)); + } + + if (!optionValue("reportURL", str).isEmpty()) { + crashReporter.setReportURL(optionValue("reportURL", str)); + } + + if (!optionValue("reportEmail", str).isEmpty()) { + crashReporter.setReportEmail(optionValue("reportEmail", str)); + } + } + + crashReporter.doShow(); + return app.exec(); +} + +#include "crashreporter.moc" diff --git a/crashreporter/crashreporter.pro b/crashreporter/crashreporter.pro new file mode 100644 index 0000000..466a585 --- /dev/null +++ b/crashreporter/crashreporter.pro @@ -0,0 +1,33 @@ +TEMPLATE = app +CONFIG += qt debug +CONFIG -= app_bundle +QT += gui network +SOURCES += crashreporter.cpp +INTERFACES += crashreporter.ui +include($$PWD/mailmsg/mailmsg.pri) + +include(/users/mblsha/src/psi-git/qa/oldtest/unittest.pri) + +mac { + QMAKE_POST_LINK = rm -f ../test/test.app/Contents/Resources/crashreporter; mkdir -p ../test/test.app/Contents/Resources; cp crashreporter ../test/test.app/Contents/Resources +} + +win32 { + QMAKE_POST_LINK = del /Q ..\test\release\crashreporter.exe && copy release\crashreporter.exe ..\test\release\crashreporter.exe +} + +windows { + # otherwise we would get 'unresolved external _WinMainCRTStartup' + # when compiling with MSVC + MOC_DIR = _moc + OBJECTS_DIR = _obj + UI_DIR = _ui + RCC_DIR = _rcc +} +!windows { + MOC_DIR = .moc + OBJECTS_DIR = .obj + UI_DIR = .ui + RCC_DIR = .rcc +} + diff --git a/crashreporter/crashreporter.ui b/crashreporter/crashreporter.ui new file mode 100644 index 0000000..914f47e --- /dev/null +++ b/crashreporter/crashreporter.ui @@ -0,0 +1,59 @@ + + CrashReporter + + + + 0 + 0 + 422 + 313 + + + + Crash Reporter + + + + + + %1 had a problem and crashed. We'll try to restore all your data when it restarts. To help us diagnose and fix the problem, you can send us a crash report. + + + true + + + + + + + Send crash report + + + true + + + + + + Add a comment: + + + + + + + + + + + + + QDialogButtonBox::NoButton + + + + + + + + diff --git a/crashreporter/mailmsg/mailmsg.pri b/crashreporter/mailmsg/mailmsg.pri new file mode 100644 index 0000000..1751ddf --- /dev/null +++ b/crashreporter/mailmsg/mailmsg.pri @@ -0,0 +1,7 @@ +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +win32 { + SOURCES += $$PWD/mailmsg_windows.cpp + HEADERS += $$PWD/mailmsg_windows.h +} diff --git a/crashreporter/mailmsg/mailmsg_windows.cpp b/crashreporter/mailmsg/mailmsg_windows.cpp new file mode 100644 index 0000000..31029aa --- /dev/null +++ b/crashreporter/mailmsg/mailmsg_windows.cpp @@ -0,0 +1,124 @@ +/* + * mailmsg_windows.cpp - send e-mails programmaticaly. On Windows. + * Copyright (C) 2008 Michail Pishchagin + * + * 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +// based on code taken from MailMsg.cpp by Michael Carruth +// http://code.google.com/p/crashrpt/ + +#include +#include + +#include "mailmsg_windows.h" + +#include +#include +#include + +LPSTR qStringToLPSTR(const QString& qString) +{ + // return qString.toLocal8Bit().data(); + return qString.toLatin1().data(); +} + +QString mapi32path() +{ + // // try to determine default Simple MAPI handler + // // first, look for current user's default client + // registry::tstring default_client = registry::const_key(HKEY_CURRENT_USER, "Software\\Clients\\Mail")[""].reg_sz(""); + // + // if (default_client.empty()) { + // // then look for machine-wide settings + // default_client = registry::const_key(HKEY_LOCAL_MACHINE, "Software\\Clients\\Mail")[""].reg_sz(""); + // } + // + // if (!default_client.empty()) { + // registry::const_key regClient(HKEY_LOCAL_MACHINE, registry::tstring("Software\\Clients\\Mail\\" + default_client).c_str()); + // registry::tstring s = regClient["DLLPath"].reg_sz(""); + // + // if (s.empty()) + // s = regClient["DLLPathEx"].reg_sz(""); + // + // if (!s.empty()) + // dllpath = s; + // } + + return "mapi32"; +} + +void MailMsg::sendEmail(const QString& to, const QString& subject, const QString& message, const QStringList& attachments) +{ + qWarning("sending off email..."); + QLibrary mapi32(mapi32path()); + if (!mapi32.load()) { + qWarning("MailMsg: failed to load mapi32.dll"); + return; + } + + LPMAPISENDMAIL mapiSendMail = 0; + mapiSendMail = (LPMAPISENDMAIL)mapi32.resolve("MAPISendMail"); + if (!mapiSendMail) { + qWarning("MailMsg: failed to resolve MAPISendMail"); + return; + } + + MapiRecipDesc* pRecipients = NULL; + MapiFileDesc* pAttachments = NULL; + MapiMessage msg; + + pRecipients = new MapiRecipDesc[1]; + pRecipients[0].ulReserved = 0; + pRecipients[0].ulRecipClass = MAPI_TO; + pRecipients[0].lpszAddress = qStringToLPSTR(to); + pRecipients[0].lpszName = qStringToLPSTR(to); + pRecipients[0].ulEIDSize = 0; + pRecipients[0].lpEntryID = NULL; + + if (attachments.size()) + pAttachments = new MapiFileDesc[attachments.size()]; + for (int i = 0; i < attachments.size(); ++i) { + pAttachments[i].ulReserved = 0; + pAttachments[i].flFlags = 0; + pAttachments[i].nPosition = 0xFFFFFFFF; + pAttachments[i].lpszPathName = qStringToLPSTR(attachments[i]); + pAttachments[i].lpszFileName = qStringToLPSTR(attachments[i]); + pAttachments[i].lpFileType = NULL; + } + + msg.ulReserved = 0; + msg.lpszSubject = qStringToLPSTR(subject); + msg.lpszNoteText = qStringToLPSTR(message); + msg.lpszMessageType = NULL; + msg.lpszDateReceived = NULL; + msg.lpszConversationID = NULL; + msg.flFlags = 0; + msg.lpOriginator = NULL; + msg.nRecipCount = 1; + msg.lpRecips = pRecipients; + msg.nFileCount = attachments.size(); + msg.lpFiles = pAttachments; + + int status = mapiSendMail(0, 0, &msg, MAPI_DIALOG | MAPI_LOGON_UI | MAPI_NEW_SESSION, 0); + Q_UNUSED(status); + + if (pRecipients) + delete[] pRecipients; + + if (pAttachments) + delete[] pAttachments; +} diff --git a/crashreporter/mailmsg/mailmsg_windows.h b/crashreporter/mailmsg/mailmsg_windows.h new file mode 100644 index 0000000..266d421 --- /dev/null +++ b/crashreporter/mailmsg/mailmsg_windows.h @@ -0,0 +1,31 @@ +/* + * mailmsg_windows.h - send e-mails programmaticaly. On Windows. + * Copyright (C) 2008 Michail Pishchagin + * + * 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef MAILMSG_WINDOWS_H +#define MAILMSG_WINDOWS_H + +class QString; +class QStringList; + +namespace MailMsg { + void sendEmail(const QString& to, const QString& subject, const QString& message, const QStringList& attachments); +}; + +#endif diff --git a/doc/Doxyfile.private b/doc/Doxyfile.private new file mode 100644 index 0000000..9eb2ca3 --- /dev/null +++ b/doc/Doxyfile.private @@ -0,0 +1,288 @@ +# Doxyfile 1.4.5 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = Psi +PROJECT_NUMBER = +OUTPUT_DIRECTORY = doc/api/private +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 5 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = . +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.PY +RECURSIVE = YES +EXCLUDE = _darcs/ \ + third-party/ \ + iris/libidn/ \ + iris/irisnet/ \ + iris/irisnet/jdns \ + iris/example \ + src/tools/tunecontroller/plugins/winamp/third-party \ + src/tools/iconset/unittest \ + src/tools/optionstree/optionstreeviewtest \ + src/tools/zip/minizip \ + src/unittest \ + src/widgets/private/ \ + src/widgets/unittest/ \ + doc/ +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = */.ui/* \ + */.moc/* \ + moc_* +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = YES +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = NO +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = YES diff --git a/doc/Doxyfile.public b/doc/Doxyfile.public new file mode 100644 index 0000000..5c47082 --- /dev/null +++ b/doc/Doxyfile.public @@ -0,0 +1,288 @@ +# Doxyfile 1.4.5 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = Psi +PROJECT_NUMBER = +OUTPUT_DIRECTORY = doc/api/public +CREATE_SUBDIRS = no +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 5 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = . +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.PY +RECURSIVE = YES +EXCLUDE = _darcs/ \ + third-party/ \ + iris/libidn/ \ + iris/irisnet/ \ + iris/irisnet/jdns \ + iris/example \ + src/tools/tunecontroller/plugins/winamp/third-party \ + src/tools/iconset/unittest \ + src/tools/optionstree/optionstreeviewtest \ + src/tools/zip/minizip \ + src/unittest \ + src/widgets/private/ \ + src/widgets/unittest/ \ + doc/ +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = */.ui/* \ + */.moc/* \ + moc_* +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +USE_HTAGS = NO +VERBATIM_HEADERS = NO +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = YES diff --git a/doc/build-mac.txt b/doc/build-mac.txt new file mode 100644 index 0000000..f2e28fa --- /dev/null +++ b/doc/build-mac.txt @@ -0,0 +1,22 @@ +Building Psi on Mac OS X +------------------------ + +To simply compile Psi, the same instructions apply as for other *nix +platforms: +1. First, configure the build using the 'configure' script, optionally + adding parameters to specify where to find certain dependencies: + ./configure +2. Build the binary: + make +After this, the built binary 'psi.app' will be available in src/. +For more details, check 'doc/build-unix.txt'. + +To make a distributable copy of your binary, do the following: +1. As above, use configure to configure the build +2. Alter the first lines of 'mac/Makefile' to reflect your setting +3. Run 'make -C mac/'. + This will create a distributable binary 'Psi.app' in 'mac/disk/'. +4. (OPTIONAL) Create a DMG image by running 'make -C mac/ dmg'. + This will create a 'Psi-.dmg' file in 'mac/'. + You can create your own DMG template to make the resulting DMG + look different. For more instructions on this, see 'mac/Makefile'. diff --git a/doc/build-unix.txt b/doc/build-unix.txt new file mode 100644 index 0000000..d05566f --- /dev/null +++ b/doc/build-unix.txt @@ -0,0 +1,75 @@ +Requirements +------------ + +* You need Qt 4.2 or higher to build Psi. If a packaged version of Qt is not +available for your OS (or if you want debug symbols in your Qt libraries), you +will need to build and install Qt 4.1 yourself. See the Qt instructions to find +out how to do this. + +* You need QCA 2.0 and the QCA OpenSSL plugin, which you can get at + http://delta.affinix.com/qca/2.0/beta2 +Instructions on how to build these packages can be found below. + +The 'Building QCA' and 'Building QCA the OpenSSL plugin' sections can be +skipped by downloading the sources of these packages, and unpackaging them +in third-party/qca (see the INSTALL file for the exact location of each +package). + + +Building QCA +------------ + +After unpacking the QCA sources, run the following command: + + ./configure --prefix=/usr/local/qca2 + +If configure cannot find your Qt4 library, use the --qtdir option to specify +the path to Qt (e.g. /usr/share/qt4), or make sure that the qmake binary for +Qt4 occurs first in your PATH. If something else goes wrong, use the --debug +option to get more information on the configuration process. + +After QCA configured, run + + make + make install + +To be able to run applications using QCA2, you will need to add +/usr/local/qca2/lib to /etc/ld.so.conf and run ldconfig, or add +/usr/local/qca2/lib to your LD_LIBRARY_PATH. + + + +Building the QCA OpenSSL plugin +------------------------------- +After unpacking the QCA OpenSSL plugin's sources, run the following commands + + ./configure + make + make install + +See above on how to troubleshoot configure problems. + + + +Building the QCA GnuPG plugin +------------------------------- +After unpacking the QCA GnuPG plugin's sources, run the following commands + + ./configure + make + make install + +See above on how to troubleshoot configure problems. + + +Building Psi +------------ + +From the toplevel Psi source dir, run the following commands: + + ./configure --prefix=/usr/local/psi + make + make install + +This should configure, build, and install Psi. See above on how to troubleshoot +configure problems. diff --git a/doc/build-win.txt b/doc/build-win.txt new file mode 100644 index 0000000..63f2ef9 --- /dev/null +++ b/doc/build-win.txt @@ -0,0 +1,79 @@ +Requirements +------------ + +* You need Qt 4.2 or higher to build Psi. Just download and install the MingW32 +self-installer. All the instructions below are performed from within the Qt command +prompt (found in the Start menu) + +* You need QCA 2.0 and the QCA OpenSSL plugin, which you can get at + http://delta.affinix.com/qca/2.0/beta2 +Instructions on how to build these packages can be found below. + +* If you want to use the QCA OpenSSL plugin on Windows, you will need to +download and install the OpenSSL package from + http://www.openssl.org/related/binaries.html + +The 'Building QCA' and 'Building QCA the OpenSSL plugin' sections can be +skipped by downloading the sources of these packages, and unpackaging them +in third-party/qca (see the INSTALL file for the exact location of each +package). Then, uncomment the 'CONFIG += qca-static' in conf_windows.pri. + + +Building QCA +------------ + +* Edit crypto_win.prf and change the QCA_PATH to the dir where you unpacked QCA. Then, +change -lqca to -lqca2. + +* Copy crypto_win.prf to the mkspecs/features subdir of your Qt dir, and rename it to +crypto.prf. + +* In the src/ dir, run the following commands: + + qmake + mingw32-make + +* Copy lib/qca2.dll to your system dir (e.g. \Windows\System32) + + + +Building the QCA OpenSSL plugin +------------------------------- + +* Go to the dir where you unpacked OpenSSL. In the lib\MingW subdir of that dir, copy the +files ssleay32.a and libeay32.a to ssleay32.lib and libeay32.lib respectively. + +* Edit qca-openssl.pro, and change the OPENSSL_PREFIX in +the windows section to point to the dir where you installed OpenSSL (e.g. C:/OpenSSL). +Change -L$$OPENSSL_PREFIX/lib into -L$$OPENSSL_PREFIX/lib/MingW. + +* Run the following commands: + + qmake + mingw32-make + + + +Building Psi +------------ + +* Edit src/src.pro in the Psi tree, and remove the line CONFIG += DEBUG. + +* From the toplevel dir in your tree, run the following commands: + + qmake + mingw32-make + +* There should now be a binary psi.exe in src/release. + + + +Packaging Psi +------------- + +To package everything up into a self-containing dir, edit win32/Makefile to reflect your +local setup, and run + + mingw32-make -C win32 + +This should make a dir win32/psi with all the necessary files. diff --git a/dsa_pub.pem b/dsa_pub.pem new file mode 100644 index 0000000..e428e97 --- /dev/null +++ b/dsa_pub.pem @@ -0,0 +1,20 @@ +-----BEGIN PUBLIC KEY----- +MIIDOzCCAi4GByqGSM44BAEwggIhAoIBAQD9PC101SLooiS7UiAYZWszXSsLlXVx +oY2sMy7Loy37K0Dj7TfxtoA6X7wUzxPSGxo7SfeETjqwO1Xd0kFx+njQWUv04TlE +Ut8jzVCM28h1Sj6vygq57I4/xNvStWWAuhpt+s4jPDryE0ixihRzRZFZYdiOWI7j +PnkQAPeONjIrygva+EN0kJgw7x4OEp2B7rRlMM9N6VpaVxRIkFrdBXyVyTivWHt3 +ndsN7yNYWkEa0kmEM1f3pDNwwOiToIW8vt7Jfxmq+EUi+wAoSR+7NbhmEHQwqrv1 +/BPrHJuTnlzPPBxGgGNhw5Chj3zyKVM3iy4NWP+fMUIMdew9d3z1BSitAhUAp6SZ +1/fwORUQ4HJ2QN86QI8ypaMCggEBAIx1tFPhnxOGcIv8pl63yJt+U49PPGFRbsYs +L6w30faZa8HJ/z44U99dq4egt983ZWJlsThkjl7CeL2UE3UO12Z76aONfaigIOik +ij/D7/A+U9m0e1WqPc4/HmMLIVSYsVMtbcZkrvZcBA0A5c0JCBc0ZsUT6ImBsaSt +NWE7o0CZGzUKJ7OUuxWL4/a5hvyi52DXrJmK5T5v15VbcEf17MQtpNSsLsNugPsw +OAO8eljmDtOWW5aDtLe75UFZuDgHKch8xxMpnuKW+mGc9HC/U7I0GBhhq1LA17Xf +pEv+UfyDFyYWzKuZQ61cCdC+tCvDqeF7iyMgIQjmh6f0I23Kz+cDggEFAAKCAQBu +GFIbwJHL6w/d3Jgw03b7YQQQYX7G4S1rOW/nCs9upklwNo1OI58qvrBvBl3SwubM +uTQfdgjg8IUI24rhwAvtMvvvHkXEPypW9XrmxcABKloGNk0LVdYpzSl3tUH6I95w +YBu7WdWrutFKhLEouWUXHH930fIlm/tnTJlh2J1oE7u1SiH+hHNzjO4ip40qwSjS +CHFm+TBASkg1RJGK5JHTp+9g6kllRGIqKYZ5gf0GT3Xr1kbdahlwQzR4AI+Sgjz9 +z5uCWe/zc2mPhJgkCV/s7KV2oSu7qETkmEyQg8pjiJP0tzRCiQ6FK1GDFmOdQIpl +btKfiD4qC+U4HKBH4xcn +-----END PUBLIC KEY----- diff --git a/iconsets.qrc b/iconsets.qrc new file mode 100644 index 0000000..e1c5a09 --- /dev/null +++ b/iconsets.qrc @@ -0,0 +1,160 @@ + + + + iconsets/system/default/icondef.xml + iconsets/system/default/ssl_no.png + iconsets/system/default/ssl_yes.png + iconsets/system/default/logo_16.png + iconsets/system/default/logo_32.png + iconsets/system/default/logo_48.png + iconsets/system/default/logo_96.png + iconsets/system/default/logo_128.png + + + diff --git a/iconsets/emoticons/default/angry.png b/iconsets/emoticons/default/angry.png new file mode 100644 index 0000000000000000000000000000000000000000..22e285d6b7b86e065da5d369ab59459f87468f85 GIT binary patch literal 679 zcmV;Y0$BZtP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@36D`QcU3I?`lpmC}fQY z2G*=g&}VQ_XRrn9P|$Pn$c?csoWLHGAP)r{Bk6Qw`1Chm6$)CW$;sr~N6)lCy3l+n zSkASv<|(I2@To6i0+CegbH&pxS#!?FdUNtF6l_(_sF}(ld6|B>jW7M=_(>Z0?_~f0 N002ovPDHLkV1m}?3kLuI literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/bat.png b/iconsets/emoticons/default/bat.png new file mode 100644 index 0000000000000000000000000000000000000000..2767603050b228dd70c5ca1d445ea50ced36a5e9 GIT binary patch literal 678 zcmV;X0$KfuP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@36`YXd=H>@tX7bOG;}YakHa)8iJ!Shzux*>oAl#+7A;e-5o5^t& z0vG_KgE|k%2QEzn$j;yxoE?Ds!)=hX$K<{k+}DDs_jxUA#G}DL?e%OsFIZ>2(_dP4e+$4N``4EU0NVOwKi+401GbiB9{m1YK>z>% M07*qoM6N<$g5fL@)c^nh literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/beer.png b/iconsets/emoticons/default/beer.png new file mode 100644 index 0000000000000000000000000000000000000000..b28d7e3225224541aebbfaf251904c4ffdd8f565 GIT binary patch literal 695 zcmV;o0!aOdP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3DmeCQd%UF#C4)?R)lZi^DYYruTj`Z~pHABEmlwpM0lvO9kM~=QZGI z3FyrLcO$@6*9=k)-}ZnHSNQ8jK-?*yGXPw)0mt=Eh;sOOl$B^rogC&eH?aYGWfc+v zs4{zwFOKlrq3D3(z7F6!a|aBFcEAAcpjDI*A3%4Fo4m=I1r0#c4iboWPsaK>h#Qs$ zAgR6q)bbjDbxsSYWFi1ofv21VAYaWIWTZzzQ;xhi1>m=y1GKFe07FP3)|stSg0QlF q*!UMnXOfDhO#|aQC;o+Bf8z_T?ntEXUYacc0000KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3ExfIvo4qSs1xz(L<$I2MD zvNEnsjH&H|sVyyNbTI+?Iv?}?Dk7@>QC{ToTwejS`Fwh--xKXNiy&uq#>+5D-VfUX z0Vn{R8Ah0qLLd{!LOg&?8r6WbmI3B}*XHXj0+7T&^7vvlfHHRM*8$JArF&f$W$S=3 z>5Bj+Klmx4riqIv;=1+(02h?rbz@u@zuv|dz1h+eRXGuH00000NkvXXu0mjfPE-HT literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/boy.png b/iconsets/emoticons/default/boy.png new file mode 100644 index 0000000000000000000000000000000000000000..9502e878b16d3faf90cf5738697932842db8dfeb GIT binary patch literal 678 zcmV;X0$KfuP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@33==Rb|T_x5j;s?l2%P!451pxswTc}Qa1R!lW5JM-`jJO zTLkkwCw%W>4nEv72x|~l;jRSB^5`c(A*qluc0BuZW~G2}(Ey@hq9{g@86e|7CSA-3&lsZ{T+iUzM)mZBZ52n*aa+ M07*qoM6N<$f+1K2X#fBK literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/brflower.png b/iconsets/emoticons/default/brflower.png new file mode 100644 index 0000000000000000000000000000000000000000..d8be5ea617bd9ab2be633a0173338280c349ec57 GIT binary patch literal 701 zcmV;u0z&KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3KyCTmXuku~Ce(Q2;~$uuG5xYyl>n1GwfK^fCU++1*kZI^*kh!15-GNfZhm) z3lZi$1;oQ6b>dY_9|2{a)b19E-o9oV0Wd0x$iEP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3g&>_aC(t*WeF(THpNHwxoMyX)WHJEI>p?c_0%|qRKMF7!K|F3f zsY984yB_n6eEY8Be;r+^c~`MQ}b;aK$m0000KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3rjc<-_Lt+tt^#|HM@{V%{wEwVulGqd#qtaacUz4It02I^UdcQ>y=kPbA` z#|+s>Lk=~Pok{q)&N8u)BAFEdswRQL@>Wfu^9j>#0NbT7-agf{g%UJ?y*;=C9j1 zKuv5#@MjMU{m8g{Bbzx;(E@P*6L1fjGzA_plZF68*y^PS5;SX8J|+V-Qt%G+HR30Q zZZ8W{(BlH}wFv57B~&*VH&0Gmmwk${le-kjtq6*51oDxB>}N9ewn)m^b+zee$Y?0Ui0000KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3chC0rEBpR=uzQEV{p|H^Kve$AmFu zlYRz}DcIV=BY<*@{i0)pnC}@NKsuzIFaN}_3o1YdKJLQ5+xP|5xm`avoT6I*0000< KMNUMnLSTY5y7Zv{ literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/cry.png b/iconsets/emoticons/default/cry.png new file mode 100644 index 0000000000000000000000000000000000000000..4136f7ff23cdbe8658cfee299c5abb05ce6cd18c GIT binary patch literal 779 zcmV+m1N8ifP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3NDcrq!!DKgTgTM97}idgOnWJSdv*oh94qjeD_EHxf(!ugif2kN zlj9w@VRo=RXIh?00QjUCMr4;=p|u+NHfK%sN&-L=OvuGEnYRyLuA7eQLH^o|sWzDa z(8Q^nk*)LgVZ1l1nfLxwbu0q#D{yB{75{1Cz&Eilo?apQWkE2-&2dn#O<2x8fN%g; zfk*C4X4@KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3YH_rknh|ATRV7)2L z&lTUqB&);8M&pUi7cmtU4k)-_J#o3KY`;5pkbN_}IOn$4xjx^mzC98I2jt=aKrK+3 zQ4{z%HNtBnL`-BYNHI7Mpg7w$F##lEK>x#>?5A6( zFR!ErU>hirLN$>y*4Z;)&L6BLmdI~Wu(^b07*qoM6N<$f&`5ha{vGU literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/devil.png b/iconsets/emoticons/default/devil.png new file mode 100644 index 0000000000000000000000000000000000000000..f469a1d7b775b7c35412c4442a4b0ea1ddc37829 GIT binary patch literal 684 zcmV;d0#p5oP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3^q-7IK>n4eIBPfp|uuLO1*7g4PSVNKwJos%u~TX!C9UP zhT%;`ArOarR?xP0PcmKoX2@p+oLM<|d@N-oA;Emx=`0URXCyGq)a-)GPT@nqSY000bOA=0-PWc(8jF@oAG_@AS-C{ON1O> zVk8(VCQ$*{T$wXQ0=xoB_)>AYvu0mV+QQn0az#df;9q$$Z{m$fK`7#+>VO|(sVD0A SF)C3Cv literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/drink.png b/iconsets/emoticons/default/drink.png new file mode 100644 index 0000000000000000000000000000000000000000..970a96131f959b6f1ddc325da81c52c1fc1c2735 GIT binary patch literal 673 zcmV;S0$%-zP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3wvZe{c`s^+u zc&ilhT$uqaD0nu|!ioD>`#XX13JlJmiy)SrfN6bWcrXVz8bHwOtp)t8fGVp&vo(O2 z$IU0TY2F6#Klmx&rv`rAK>V@6*E688`xb0XtT*>x<&gFUd?FanrXzjF00000NkvXX Hu0mjfV;2V^ literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/flower.png b/iconsets/emoticons/default/flower.png new file mode 100644 index 0000000000000000000000000000000000000000..6151ff5aaf4d6d79fbd0b63940e448056009c6f9 GIT binary patch literal 681 zcmV;a0#^NrP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3J}ErMfa zY$5j?Hv948Fa{&Z;f;&(zI_WC5iza8-$nq@`38^^kZgUd*MQuubp0m*CaDI@E+^q!h7zD~GtJ@YleKmq z1|T+j%yd67e+6*o_MYdCi*(IhfYq)Z<0dIV>fHH(J^=GPCu5QtZK=X literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/frowning.png b/iconsets/emoticons/default/frowning.png new file mode 100644 index 0000000000000000000000000000000000000000..ab04d33e721f79882131761b566acac94ca10dc5 GIT binary patch literal 944 zcmV;h15f;kP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3hwlPAg~A}??<5MUT#c#6ncCwEjOKx8__AT6*emB$$# zGW7F#@v58UcM$n-%jSd+WX~W3%H%c^msu~5m3kr7iuq}mB|vJ4SRc1&Y%(IxHK&!A zMe>T<=0c#C&TBrFKLSdAK<}|gXLf-?#);gq6DirrzYrIA{Gf?1>OcL^3qBMJcTv>3 zP`YSF>CBDdcZox1$fqS_lM zkwoZ(&4^$k`q9c?2Zh?5_KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3VMU2pKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3mJ&h5 z3W$;pDwccE4XO8Ir^To63@>r*rR#Ul!JYz3HnkyiGt=K@?qU7T+}3SEy@50L+Jm50IItb6aj(6)B4I#pl(Od6DS|7~C{JpgZvmPE1cjeP(B N002ovPDHLkV1fZ#^dKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3ZRV_BBPw5~51-yY3%t^&ab0g_9#_y~Y8Pf(It z9Mpw7KyCq~rk(Vt1~x!|La5{xz-pA1WLF^yDJZh%lB~M>3N+(RHIz&SC>`~K{RALVW52* fZuU415^eqfjLw44%-Ev|00000NkvXXu0mjfi|Qlp literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/hugright.png b/iconsets/emoticons/default/hugright.png new file mode 100644 index 0000000000000000000000000000000000000000..5865d5a9695e0063d9c7ca36885d7db821e72710 GIT binary patch literal 712 zcmV;(0yq7MP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@34!K~y-)l~c))!!QhEJ!v9U@a@gT=vmDuE5n97GbvqWOAT&t(kEKOtU>Kj)wKI|Dz4sS^ ub%A9 literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/icondef.xml b/iconsets/emoticons/default/icondef.xml new file mode 100644 index 0000000..aabeb19 --- /dev/null +++ b/iconsets/emoticons/default/icondef.xml @@ -0,0 +1,280 @@ + + + + Stellar (default) + 1.0 + Default Psi 0.9.3 iconset + 2003-07-08 + http://psi.affinix.com + Jason Kim + Michail Pishchagin (icondef.xml) + + + + + :-) + :) + + smile.png + + + + ;-) + ;) + + wink.png + + + + :-P + :-p + :P + :p + + tongue.png + + + + :-D + :-d + :D + :d + :-> + :> + + biggrin.png + + + + :-( + :( + + unhappy.png + + + + :'-( + :'( + ;-( + ;( + + cry.png + + + + :-O + :-o + :O + :o + + oh.png + + + + :-@ + :@ + + angry.png + + + + :-$ + :$ + + blush.png + + + + :-| + :| + + stare.png + + + + :-S + :-s + :S + :s + + frowning.png + + + + B-) + B) + (H) + (h) + + coolglasses.png + + + + :-[ + :[ + + bat.png + + + + + (L) + (l) + + heart.png + + + + (U) + (u) + + brheart.png + + + + (Y) + (y) + + yes.png + + + + (N) + (n) + + no.png + + + + (Z) + (z) + + boy.png + + + + (X) + (x) + + girl.png + + + + (@) + + pussy.png + + + + (}) + + hugleft.png + + + + ({) + + hugright.png + + + + (6) + + devil.png + + + + (R) + (r) + + rainbow.png + + + + (W) + (w) + + brflower.png + + + + (F) + (f) + + flower.png + + + + (P) + (p) + + photo.png + + + + (T) + (t) + + phone.png + + + + (*) + + star.png + + + + (8) + + music.png + + + + (I) + (i) + + lamp.png + + + + (B) + (b) + + beer.png + + + + (D) + (d) + + drink.png + + + + (C) + (c) + + coffee.png + + + + (%) + + cuffs.png + + + + (E) + (e) + + mail.png + + + + (K) + (k) + + kiss.png + + diff --git a/iconsets/emoticons/default/kiss.png b/iconsets/emoticons/default/kiss.png new file mode 100644 index 0000000000000000000000000000000000000000..b951063f7ab50dfc09343e7c5df526e47754fbaf GIT binary patch literal 681 zcmV;a0#^NrP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3{KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3=}|t41h;yY|0 zyh3;bGfVfV7ZDTyIKao+d2)CG>S*QwdIrt1(+66BkDq#6PUZmN1Na0}b$aME&`;%L zl9@A@d8en};A;{WR!VNocJ-hE+qmsgG7j`S{SO*Q_t{iw+kJBdZk?GW0jx?OpABoU z%g$_9;J4Y_-@GcdPy>jr(%tnIm(1z(02##0xmDHe-Tg7&0mP*DKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3xCn`?Ve0#ZcZO51xJ$U3e?)$y> zzIU+zSjWUsVgpEq3D}q+x{Y=b4`U?vbUtCI=QWg6_!Hn>xj0;Uts#~I)x1JJ%MB#H zixJ+0@UA`BeH+0bFnj*WVRg&_ zQV4Umdwv4<(t*{8^QU}wzkDy@U3mt^9#d#h0+OSC&)|{3?wx{-Jg8-g=*DS{XnNWu z)Ef1oMmEmCrp)x}^gHB1fP9*vn1+yx6jDmg63VBu_-0DV!0JlHM*i8 zKQxE>WCl{c6)ixml4X3P002ovPDHLkV1g_(b{7Bu literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/music.png b/iconsets/emoticons/default/music.png new file mode 100644 index 0000000000000000000000000000000000000000..56fa9c3d0d22fec69fd0e5ac25a3552f6f912e6b GIT binary patch literal 794 zcmV+#1LgdQP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3px`_( zci|m*@K1cT&U$PM@K1eBuf$*yAij^$)*V0O%D2}+_LjkNNWwr89pE0gY81}7 z?xHb5I1iOTqwLPCx+=!#1V|~jn~EH$RdFL4V^Dyt04hqj5=}LoOwEAN*{B;Z`vpJ& zk{DivMhIy}K>n30aeO{D0)oq026Tn$E!bsvRqDw@qD}fbKZYH+cL6#QO&R zJW_`0A+_mrrF($nKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3A@5;kB53Y}ggHb5hx zVGRmDOCX{l8VeA`iyctg!sVMdlbQGYD^BjaGjqN>_s+|iS?(Xj$t``Qv^fHBU^{Et zVb!zssBV=~-f7w{Sff^S@ewEja1a65FFF~}a#+rQGS!J8Xxy(l0On-gauO&4$OJ@f zkYnciwCj2aa`!&3uKsDq&I`LF6CZ(i09AA_?432Bn2wu)YbS(w00vbQK(`3ZMDh$k zl{GM=YM6k@%o<>P(GcGWW7_Ni?<4?&3(X$^FzEU}12lQw{wDx80HWXcD*)2Vp!D7q X^~r;St^O@400000NkvXXu0mjff{Y0b literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/oh.png b/iconsets/emoticons/default/oh.png new file mode 100644 index 0000000000000000000000000000000000000000..41907a2323abf8c3606474a1b2866dd36a5aff9c GIT binary patch literal 780 zcmV+n1M~ceP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@34Wn5cS@y}7Z4*E6(1hY(&_v# z#A=Vl<^o~>;52{G(TU0~08lEGtr2)~vW^Z^_F!;oKp21-Rh6&`=698?aGLr4~ z-X%bXV7mwog{Gnd%#60J$yeWk$1~Do$Q7N=CvrIYf4_x$U*j*@o|gt-x`b;00000< KMNUMnLSTYo0X}K~ literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/phone.png b/iconsets/emoticons/default/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..b5600c959ffd6590df9076da671e604b7e5dd82b GIT binary patch literal 580 zcmV-K0=xZ*P)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3hWQ|g6kN&~SN5?wIGDDKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3oq0(M0L5=8{!hW} zO^M5^Yw)*v+@M-F;Hl#IZ9#cgp?+!>sPzV|yiM@=>wgl3l7ih^huyod@1Q>{+83QC z(}d6VIC{_*9yd;*fCfG+=zYLQ35!hcU=9wQ6^<^1p#=kMiNa zx;UL-mZSn2aB9*I;T4)^E$RmC*2qrtlonQDM3mA68h*5%` z6Xpgs+`YFRCHjplj?>#$gG!dkEBKOBur#na+{LBw?j(oD7(NB2g+bCkaO*a2oxwbL n2vc3uXGu0-$xqL}|Cl}j`@9q!n#*l300000NkvXXu0mjfXJRr@ literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/pussy.png b/iconsets/emoticons/default/pussy.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1473e085dcddc38f3482b8707c4dc58ecc830e GIT binary patch literal 753 zcmVKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3mXpJh>*V`di-V60WH1NN+8x>JUO})Q00iO>d#+II zG(82ERu49{wkrV0IN9H?E5=dS6j8<7Bj3^Cv-UBhl1AsL13KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3Z%i}yxN#a%qdCjq+hA%~F2;G2a*g;aojA$DywQ9OH95p`BFUAH;m zZrwoJU83pQioiE9+}3lUq!M8g!$|5}kV&+z3%h!$u;`%{->8s^ND@}%UW|55PRKHB zGY>nL(P*6`-RnJyFx}>m?}ZCCx*X}ui0VwTkZP?d0vqYoc9yw_q+umjRH3<{5@Ru* z#ueuyIeh4&7mW2>iiio#Sed&}fyJ(fPl3X{7Y;BPPjuU564sK6tU=DYBNd*80}vz- z_x(^oviDwJ70=;gSk4gSFrj|7KJg`-a|+)7`gxzu9cRtI|BWAi^|P!eE#l<>0000< KMNUMnLSTZXQc=DD literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/smile.png b/iconsets/emoticons/default/smile.png new file mode 100644 index 0000000000000000000000000000000000000000..981b7d915d23798a88c70808e08205a0075f04c2 GIT binary patch literal 770 zcmV+d1O5DoP)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3D&+D3*=RHjKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3mLP@^V2U}o+(+zC2_&p;Nu?xg`t8)i{L&exiYNh8a^=ZnRgC;&b3C$Juo;ApQ>KvV3l_U6GUOxnTN_KM~Kd#>Q~{d!DRz$<&Q&@ z%;3TzH+cDt;JB(`yueU_$~OZ<1=WKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3?Kc3Uk7a)=! zFXV@sd|Q>Tcjfc--k`4H=NtK@k({l|1kyN?>s#{Kvb;C*6Vg@u+LYh!lao72?vCZF z9l5qDAC%=vz8mrlpfklGmHSg&Zl1K?4rk?!G$1^Of=KRE5O1Mieyk1o1mG3V{mfu( zQl1-40hl()bVPR67OD&K_LRIbA(wI~07-O0E}l8LNAc;BykAP>FOJK_kraR=WKuvd zb?#A&_sxP_&LvS8>;S|T@W`sNzQPE+PY?B2BLkunYhq9lNTw@=#bG%=kO2q?9syLo wAPlS%kS^}|FR*9iGHnJHo`3xp{`xn*1NdD)iy?>KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3%iK~y-6rIWD{fFKM-f5T$T=LoLg2(*k~=?abz z?~n_Dgy?DUiU9usNs`cQEOxOUa)~F vbq%v%aRe+`!C1#0!}DGc0U30A;cGWuKZatfdr;gH00000NkvXXu0mjfUw!1$ literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/unhappy.png b/iconsets/emoticons/default/unhappy.png new file mode 100644 index 0000000000000000000000000000000000000000..464b3de4229080e6a06858062735fcc6265ea5a3 GIT binary patch literal 825 zcmV-91IGM`P)KLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3;Gxp zFaO84KK&nB`{2J<@lBitp=i#Y@aBKX^p9YLAR5F683N+F=3o17k$fJ*5V&TLjWEs4 zOMm^ZTlgK!2Z@K*KLm?gr(OK76L|u~5V!##XTvo2to;wB%V&KCi$^v*f_pLjWG zAP&d|WEX%ivI}5hFc--B9Do}FHXx|#9@wuSKf@HGhXDwK!ay_Z*neryeW(V2oCgYR zkYbRH*kZvx^YVYAxHJD%f{y$bbK8SzfMfO*up*F4K;8lQ8AOBlAaRhqdD6N6TH(jR z&KGptiE02y5@Z7?syvGjagK~ZepmEA^k2+%_kV7itq22Pu>f)&ES_!CFM$IL#0QCk zYzB#o1D(!iw;g*lg8T*wAdpR>?$&1~kIFb#ki0t#J_VmaRfU>d{+ z1sKTBAZMd%#+erc9Cm;)$VM*ft^e6AHWSVZKLZ*U+}7DyFQ_caOwTA$FtoI^RB%km zPfAq?t}HG|%`H~&%uCKMD#$NNEJ;lPs)e`@3t|eGx%oFMYfSKAra0GU;x+A@y(>XZFsSbIy2!r0}1UUyRGyvlM_|9zO>?JqF#5 zg06-^gEK1xN;SW|27SCI@nw>LjIM)*=cd!H>G;rofTWtI)1cWbiR3W3zX`gGS@e6R z_K~T%mj?L;U@{Q^j^__|b01D(fc<&~z%@IAMdO@-=gy$EIS2UyKr5P;@u0D5+Kw^+ zxXooIPR99L=(J6(rm0>tRZAHFE-?wZXeN?Vzv!EKop^dHp}(_bs;p-Km;g-&!*z1% zG^72Xk$kU~P36@E0N(-{SrxyD{gr91#LXKkIRFlVM)pj^ wZ45&*w4<{9 literal 0 HcmV?d00001 diff --git a/iconsets/emoticons/default/yes.png b/iconsets/emoticons/default/yes.png new file mode 100644 index 0000000000000000000000000000000000000000..91ea768e2a16f626c12f8e99f27bb49b8a4e2635 GIT binary patch literal 693 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 C$nq2b literal 0 HcmV?d00001 diff --git a/iconsets/roster/crystal-icq.jisp b/iconsets/roster/crystal-icq.jisp new file mode 100644 index 0000000000000000000000000000000000000000..e93626fc1186040796595146665ff45edb70990e GIT binary patch literal 11312 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 literal 0 HcmV?d00001 diff --git a/iconsets/roster/crystal-msn.jisp b/iconsets/roster/crystal-msn.jisp new file mode 100644 index 0000000000000000000000000000000000000000..60d3f30b7eb6ecf985135a7866ca75c8e0e0bd1c GIT binary patch literal 10376 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 literal 0 HcmV?d00001 diff --git a/iconsets/roster/crystal-roster.jisp b/iconsets/roster/crystal-roster.jisp new file mode 100644 index 0000000000000000000000000000000000000000..bf26c83b1bba55a4f148fba2016a2c5b383c1107 GIT binary patch literal 44279 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 CrYZ=B5IBFlFffPx@#cSC$bk!h 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∈AXjQmAYH zT$|@g3b8ymbv&`#H$$)CeQ3Dv(#7l|-UeNCy?mXP#ULflZG1W?^de29*|=96KgZ+# zTTQG4Qy+&3SpxOD;MZmEj2oCsG^ z;;md=+P(eX99|;f)yOKow}@cX?SqBYiP|iG18LDCruaxe`ksXd8U$qG8;WF@y=eg5 zk5X9gZG|~YA%$`e*|d06lS)3D#A!(R)2uG6IlCM!P2VD^MFO%Ho+7b?lAXQUNGpPW zCO#H6E$H7ykx0(Jig}O&-{sDazYZqh{yCVW=M7-ugFm7EvLZi^B>e>i0MCQ2{|4$m z14{pb`0H@SkBE^NOZ89X%>FZ~fr0#UOygH2f9?VQ2>Ag2SI8eb!vCV@dFAZq?$VE- zZbZL={-@XU3*x`ky#GYR#OIi`6d?N*@uv#-FBkuJsQ+`Z^hZ=xivJb$kJ2dy_&oOi z-L3z*bok=}Bw~`|f8Hp&p9_iqvJAggD}Ge?ALd@mElKKX=s0i z{ITZnFM6H_$3N##KY~Wl{|fq3M)fbN`fJGjBkF7DZ%}^-!2bpGe6RlO>wg4|VfhvG aFVFwewd0=82?8XTr#z-56LInU?Ee6u(g~#i literal 0 HcmV?d00001 diff --git a/iconsets/roster/crystal-sms.jisp b/iconsets/roster/crystal-sms.jisp new file mode 100644 index 0000000000000000000000000000000000000000..87e4fcd638f5f2dc1b7676a8e46bda02ac6b3ac4 GIT binary patch literal 10874 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 literal 0 HcmV?d00001 diff --git a/iconsets/roster/crystal-yahoo.jisp b/iconsets/roster/crystal-yahoo.jisp new file mode 100644 index 0000000000000000000000000000000000000000..e5a0243e2ae3ed66373d55b5bb18e60c3f23a7a9 GIT binary patch literal 9705 zcmcgyWmr^e*WNILk}@lr%_pN(o3KNP{36Im3*ttXNc(Q2>zYTVs)HQ*iyX90)T77`vm}IYsPGC zY4n#k0Sa>B7^pnD$DgXB9Z+^hMZX2d7I_6F@P+j^CJ>dj zwhN67_=@V4&dt8GvL4%nmH90p&XuyEnhA5TVOdUW9qD2glJk2!=3JT)* zmY#;P`sr!zWNny?OD!qp3{|G=*4CvhcP!5U1l7db+go60XegN(Kd7&CY?D^coB+ra zIav{$eT%lRP&X}#sLK_cVsn?NtgKEnn$+lPZnbQN(%A7*2rHqUWYN+C11{Afq(J?k55og+(FlGjmE%kO{ z5_oD9KtyPvl2q7p=1G=&El)RfZhU)1lx>q$jZ2jou=2D}k&( z*_6Y66Ji;pyQ|6C?#$jvlKM80kI(IDP078uyv6a{T?^sll~6H%RZC?>onD?tSHXh0YS5Ju>Ge$zwxTxR{81%yw9f(Vo-e{L$!u#T46K}M8OY>8AbmRA`n zYtkv+e=m3-ngLVDI~*E(&#WfKLF(sp$-C%As)J4^)Yvr#+g2438PU+tXd50L-ePNY zxD=S%K0LfzUWs!x{A@=fbz2`7po@hK4pSVj<7HEutaW6Fzuq+;MgS%%dN5N^0Ns+& zFE~S{N(ZO=^;VNxT^v46s*D?{OWxjNuRVG0Si2zr(;(bK{wK`iSvqhI0FqES(L!Mz zubZ?CPOqhaz$tlc_`lN95$60K;N=wnKhx@RBH?cQB`=GA=Vi!K4GCNXT)sy&z10h5 zj*ogcID*`sh58e{vcU9~l2nwD>h|{!6fPI``dqX}2?_R>Xiw!2ru9|`i%^jMo=!%1 zO5ZkV7c?|w(MDqAuyTaO$6nq$QkUe)vNGu!|1hqz7_qgO>j=NT@;Oqs#Cx5}_Pn9_ z5pN_Apg`y)QZ(-zcaWtk7p!IB!7ndR#gY(?!}29(1g}@ngQ(Fcd7T+1kaU#y0Srtu zSrtL;zV8|0jc@ztsTI-~h+_(+0pRLl{;WBgSY+ni5;mA2J?)S@#5lYo?eY1tU}Q(N z2ZQrn`=IUd4n=Lj&>x6I)AvQD5`zZ~=T<$nV0F9n=x5C(GzgeU!VP*GDej3#S z(!AT=w8ZwA3v%7C(wpb&{yIb_&Kn_)%Lh9hO!v)-xWL`)JF;-!60}$#x5C zDuo{qsEA2bRaS8JV$rxf-;@oeM^OG(4h2wU?Qdl>S( z_wIpvWyH|nyP(J@|6WL?jbc30>H3K8GafoAOyY*K%P+`N)x*NjlDk7-Ph`a870UaC zC$|N>2H{W2ru%0X=J0NlIm566V!2z2wJ-R2ZD?C|RGNS20S2y(W@k6!{!Q`x`W&chE#pe{6M8iI4g1VZsvLtdgyYIZ2A*_l$^( zY*+Y~%LDBg8>ZUk&YDiS{62mj3cRBAm$3$~VVRS2!q7xf@e0Zn2pT;R0A;b~5cb;2 zt`fA}Vpj$aYvH&jYleZ_y`c#;Im-|aL$Xe@jwrT9Q z2$6U$f_AY5G|LF;9Tri(`4%@Lj(As8^IM!g$r{ka)mnYWaf(f6!v}q*lG#F>=^JQ# zvRpAV@3!2>6cJfrJH5PIO<8LI!3ifTJRlV}<`3C8^h=uKAWKU_g{QW0N1 zi{jnlG@>`n>*0ak!;BmN+j{!*-opgZKf9%Tk}7rCT)KboD8{J}!c?>YAhYO}F2K%P zzuC|`*roQ*Gc8a?)h51u-Y`_>Z-^%m!Igs#SW+T zQ9_NlI%}P&W@f3)<90Rsd&&{{q;M?4^UZ7fHO17o)cM%P?0n||8aj$d_5M4wU5fRG-l+6p$axHJ(rEq3YQsjMNZ43JFleTP1U-du zb-(Ob3&!gT&XphaRyjeikITH)PBYET&b|97$FOnoj~Rj|;YV*NIYRlo;vaR9pHi1w6FTVbQ8PV-dkg+L+u&6tjIho@I9oCv5ZQ+ovk<+7;M+o=`i4YOc!Anqvb* zF!N2XjEyTpr1*w6?WObn$BW294=^51F&^_zHt|CEtk4Uisnf-%+oKHE*Ah#lHlmX> zo&+0srSnn^`XN8;`FtjVsCsS$5WYn8qv5RLuGWv_ClOF^VB6-)fthT;q|XpvgjBaU z=Z?%fV*<=&V@nHD_5KRtmC{ld+`i#9L}qERw?ixBERT58KjkNIs`0&X#t9(`Ty5oF z2_nzE6p`T)Q)N6t$Zw2Y>GYkwoPPPryS3H7x+cJmo1%{26%{cgL6$wYC@p9Bo57@m{)e=>z|(4Zk;6~3k3Q==#kMyw1V6r22#zL{sHQ&A0J8dEz<5#kKC6Pf9KJ2 z3m0$6KxVP{Q)%Fe>EWwXg9RL4jPu`oAU#?(;?VA;O^d~sPL*`bqdXBOj4T(bBFFec|BIbt+Tk6It&a? zVV)BVX@YZh)f~SSh2mCyl*y{t|x0pab|;Dha#Mg!0bL>8|5)6ADHAb4&BoVRPH++YLY$c5FuN9 z^dZGqcJD2QDT&h%ox}pI92uHGf-G|W3`S%Mk!&@|9qLT_s+XEhce``G9;_|zgGj9B zXTBneedPj|-AP#((}##RH#wc7%FnSUVb1S-1>rR79}$Lh=W`{<66|2d4;DdM%b=T{ z8@EWvazedR9L0CUb=Zj`XvMyJTDsQpRL(fMR)SL_@r50i#OO!2kNL-=40b_!Wyf)I z>1yuB9U7Xm}6=t?V_J=gtk5hg~l(;dxE?nKKsnlj!Rh+5{gu&zkZvTZyB$MVnX_iG2FEbjR!#eq_&JdB-Y@3|)J&lPP zn-9msDWEtQ*0^|d8}0k_=Yhd!VmnQ`i+dr|)Qh}E{PRyVAH6`feMhtu&)3A!N}9f0 zFRcHuS}M!;V@$fMi}|IG0W8#>3R^2 zs^mT=$}t$^MSadYwAmSu?J~gycA2PtLY{9`ESWC$YHFJH2M>xoU;HP@I67*TNK2T) zm1=?Adcg(GIq15i_$2z?dbMMO4en-xZNe)rz z?TyT@NOg&mPZ6shejMEJa%cjabkd+|(cq?o>qvak`&E%XyUYNxoXwHEv04{7t@ zs<{u^7^!B~(a{BMvy?+3`kt^myhb_5mK~)lW6er2={``jXR6L}S|KW*?opoihFjx{ z@9`2p7_2Lx9QAiV!f;m?i@G}{fstg-rx!D$;QTJr%S(!SxKX_>+aUA7b6fm)NRRFj zQpC_Yg>=g;vzE79nZ%xV8CON=>v6oB%`|hqVcjKWIn?5=GLNXV2H(!l3)!KQ);W() zL>9Ri7N&lygh3!zZauLG`Sg8uxg3k9LGmtzeSO{O{Jz1_2u^)Yi%vlaomJ4_)$nY9 z!By-Jq?;99@kM1B89WKSwtK%m4oe3UTN7P#ga1ZsZ2UbozKN8VP(mPXYuL7MZLX@* zO4NNOC97`grGzRTD}{PM=43oe$G)nd{LMnt&r(yg)}aTm=-$&J59@I zY0TFB=4pF1)E*1GuP@x?XYO4_9K(g0(a}*sE@CZpZSB{}`RltSc|YVys5LCSVH|7d zbG9n!r7cU20Kgn;#!84DQMeH$mm?WL75GKB{L?21_lDFL%p+vCeS<#ZT$q?<)U^3v zYGUO00)Ru!#rnw!*Ii$sQpQLsN!+(>bm0;T^wAWGxEz1tghmqikVKlavk~+`fAxdJ+hsKWw>|z){ai^xU5>&FEA|+xUMuF9UL4Om8nrh zO8N+si)JXs$vpT_Pyn;B!Om4i?dj=B>(Y{0d_6h#P%7Y+$J1P&7tFWwhXQkR>4HN; zy$sa4dwO8{`rxv%vf}5A)-_WK3{l*lP@csYK(JzBW61+4#wRA4SkaePR=y4nf-5I5 z%Er)h2AoewAXxs$nwpw~q@-d-Ml=8!1X%|LL#V5(qs0%Jb-uI)fT%75`0L>C&=am~ zVeyh;s;jFPfBg6c?tx$POIi;kKz5+Gt`0+XKp|Jz!80$9BC>-lvZK+mG6QdTxB&=! zr=zQjI502}MrAVc!Gs7q0E`RuEZlfsSlB8py^y4%n|K8E7o`{xPVbK(LpD-YdDXjL zTbZ4G>y0o%Ns)HMwsu3p9M_!-ZxMp~)*CG7A$w=_FRfr@V?JA3TSBRQjs^w>OYrbY z-2D0gt#Mp;N@kPd>!0H)Dm<@+pl_xEX>Tn(8S!}w`C8{>*lg& zVyS0tuWvxc%*^t~_n7}Bv!bHH%+0yUsAz>`WV9tkOQtskyC&ZfT1qqZXlB@U#cf&gYYt3y3ha;7~aef^3hNqQ-ECiY4M+ zPum|ygNdhXH2lX`+9|xJ7m}=mn_q5q7?ur0P+bHZw|pBI*vIMH=g%KP6-EXc*=3Cr zZb?Rb1A##EXMiZ~7fvBaMT>5Ul6!-IG9x~D*Is9Te?LlV9KGZ>`-YhY8teeK)1wlT zgtWXo=B`rScnK!3~MPY&wXRejIy;HXdK2mu!a{a`- zJd8lY+zI6~UX%rs?XVZpa)$DN;-+^eu~o~f|rFk_`*YK?9dW&j!{G z_<&+C33Bq5CI3LhM?+PWE4~?)vN9t=JtenX+;gzh@zxzH{U%!Nx2`Wz5*@dvL)#YG z?&_V!_N?(^5?q+i9QAE*Q$~Mhwk=ACuwE%zL%ZF+-gL1X^+omjY`7L(P|o4z(24i^ z!i^xSJCZBIQn^ES13s!Igy$6;4wDUip04`h%e?I((v$r#L2k*~+f3i+z5rj8>d@5_ zp%Cl?AKg$Bx&ZL|Bba7grJJ9zg&hj9rW^gjV^xMi)~=A2!NKG0Jr587dfrg`g6nF- zcpdYI5tOecJa-@IEjz(7B8)Zk(PMTj0Nm)%|Al1RG}k=G1!3bZQj7`-69e``%!T4O zYD-GM9w?;5TU>lhGF`OZVso~+u(IAGZnlu}QTNbLHb+GsKW&`&GkTV!Y1tTuY}fg1 z2vc*o671OV{$Mq+^g!RC#$=39*H?MRc5d;yT&RCFiek)^E|tyT#Ml@Q8{5kewis6= zL6ppRkwog8DtUQYfs`&RWdt3|zp}1VbV4wB|?}lW8EDUw`$(bJ2YaaczBFoNmbypm|oLt+l znYoprp}C3WesE0`$f0(wvZ;p3(Dwc* z@uABFhZG*J4e zFvo6qH_h5WzzVnq+KN$=#_ZK&#_V@!voO({SA7ItLX-AgfjcPVyJO}@!E6;nmX$me z7Tby0&csLG27oWRyJipLc>zFb?ODT2sz!|cvHrd~0E|{#xHuaI*FBcqUuBC7UX8{HBJT#;UK;R{ZolkpdLqt0}hDf4h~TbejjC zgq;_&&R-mbYW>@nNMs?Qu^l?Xu7{iu%Z=pv z;(AK1_p^S6cv_$Kjw>ema7&ONHb{-4hek?jZJ41U>%r8q$S|bO$Dn}Q;v5n>9a!C# ztLYEP*;S&tLN7aOCmPNYODHP2bK5wPVUkdRf+UQ)G*sN=T@$jf-inVo_ow`43afC) zMSP+dkyV3N=V8^PoS2M@n=t;(b*lh=(muF%R8MP*DBRZ9e?;uLxSeQ>I(|nXr}9~|MR>Gyh(4!Hwz$sH^vLLV z-{lo&QiKv(Inh@UfY^>_`~5Z&(D>zPP+}ON$2;NWg${QWrcu@Ka+3v}0+ZA1y~?)M z<)yQ+bM+~((n>=p$p5i~X3NzgO=Dw*`ijLvroWyp*S+F1!7q(m@I2(&aDS;doM8Wf zJmmlED2@I*50SuCB=ntmRQ8CwH=)9;ps@N~c~;F=ONH!k+#?YrAyJgb6l zYKJ8%M&^PgitITHCAiSk7a+U~&BD5X-785ftQs;e`&cGm+uOY+Jl^@?c+0x}_{q%i z9?3V)y*uY3Sc{Yy?Va|^W&F?Q*0Kv# zsg8$X8%4DC_XQ+mgDJcBsajHFP72VLrn~RAm`dgbNT+j&$2ABo)Y$lMeFl;35#qmH zn}6z__ThXhZ+yKDAj6+DU?#A#uzFSH&Xj9zfd(atshR4oyL@T0XPQi3?P_k-XQMb~ zS19Z{5E zu8_OY%G;s1Z-h;qm4zW*UBmJPL&S(PCwMnKojgT?>LjRxN?`bY$q~zwE_t5Bc{xuf zquX@2ry$ReGj5(r*C=cn^XI|j(NdmI1M_t6O^kQ?oQE1thji|nB+6ePDI|^*PVj0g z;*GZJKkT+IUKeQu%ZmUq4#PcJ9if#)O%zoMJ@rAFv_*a-d}z}f*k)fJX}LwZy*5$ zBCIpPDKo$ryi3P0KUCI{#KI;7qDAe#C z)cA5YbTFT9ru+-JBRcklP3V5nn?5i^NTJp~8l#4LqH=4xOjpw)E8k03cf9qYrsI6E z$J1}VW%dQnRuZfk?as`fy@ zIj}t}3ghdpgYRbeIe|bxBmn*0W(_#%ZwCbUE_8kI=dBw^zi-`8aRLAZ>ED5_tC?#i z-`uqE2M_>cdR`;l1p4@8IbMvp8vkeTp*_@IMVZ@n7p7ucJ^(J#*aT}k}2v$S}BM*XAkRZ)fmUKhxJ<>t*=_h&cL zegXWs^8FhhuP6G=r2A(`)4PB6@kR>%H<-U>P5+De-Sgt!FPJ~&P;kh;FP# gdNPv!8S;-fd&5H{xZDrlMg>1<;p%KY`Sqv&0h004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_00SOLL_t(|+HI3PXd7n$ zhM(`gJLyiA&pK?Y@sC>n5sZUn2gjv_&=%sw&2!jk_g`A^b)CtZjBP=cTNdEi}M$;B800|Q^o&CRVS zrMip7;xpg(>p=5OQC?I#j`Pvt;^NoS)6*@XP-rZbN*z@yl~;fZ`2TmcH)BoH!tr=~ zc5G~{ZEtUnSS%Kpn3(u95C{wd!3!7Yy6#w(btx1Ib+@;-PtDKIf9^PrQ7)I!G!4tL zqSUmyS*L4Fhn$2bv@I_~5=goLL{@LK*;Fa#~?wD3%fHjGnXpKB=-xd>#>a`x&(m}37O{y5^tCm1HaBs5 zdT^DZUa#Z2E=nnKxm+%tPOr-5_IB<4jg9FKZ`=slv$JTEljychV04tOkr8T-AG4(t zUL^A0igY?%NF);9Rjbvk_TJgq*km9OYKcZswvBxL9PiE@+*}SK5k{rNT3<&9f#-Q7 zlgZbstEmb z)4{>PufQfy(rs|`QVA**c=Cj5Umw9okI0W`JO(dceL2!*br z0WzPbe*Zqfd>%{FIFpimUmpNM2*Tm8Bc%)j1|YPg<0O6zhc`}b8_l+94iCfi>xiKt zXlo;381s?Ro9>3XEtHpY=+3_jU{3Ikq%eqp(|4^@g^9mj` c|CTT0FLE004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00RU`L_t(|+KrQ2Xj69p z#()2F$w{)LNxHO2YG^AJTU1tqE88CCuofm0q1eH!;6xOC6Q!`hm^TI+6JcWyZtP(= z*v8y^aGjT_Ojxb7-e{q=tlHX3dQD@RwlT@c$vI~a`m&9r5{-9Gwx(_Ud%ORuM*Zy&9|5ld^75{<+)%-@xo*Y2 z`Yo^dn7Yr(SlID?Eck&(rVh}S_hkU5M4-f>gndq>qQ)&ZeQ|hOTg7^(N_+&>3t>qw z@99nC@+N7Aj4EtY!zKsV;+t);Uk-fvd271;GyuttyQBuwEX|u_7cGX0KHAz>5$~Pm z;n2du_?$jHFi{xpnzq`zll&w)_rxAY@}jh_CrQz;F!MG=OJLeEIa{Hm#$?CGUQi7% zvyfkcT!vd04dczTtW~;Z6Sub>Y}*oTX~6Ba|F>^!EXStEQ81FQm;oaLB8Q%`7)UV+ zMC5_VrNKI5{2eRY6pU5}@kc|1*VGWGj4;~!8+HC}Ff(9fLFnkSCKs+Vd7_&$k9CIS zC4=O>p=95>pxNXr+fY&(_M*C-{Bxm$nD;w8jyVtpXpo(;`1P;i&}X;!ad3f~KwJi_ zMT42Ck-mxgDyhXAZs7d68@y3^l4#i!s4}PuxKz@^MUG!CoV%UiDlh`fNPsP%5Ur@J zu5H}Q>R5#B&98H*|6Q`aAoxAlE+@D&Tp%*{94Q#O}5A$G`o0*D)>e2g$e}6Oo53Opln3YY+%2o2%ifcwyk$Xvi2?I(ZcMfrcIgfR+uQvrkk0000$e?oN;p65I(A+}&jZEU*ay0t62bbdg}e0t5&w8X&j_mjxDg zXR+n+yY*h(SGR80%$)vbdb+2+?|i4vOtg-cG9f-SJ^%oOswzr)0Dz|R*e4;u{?FCu zR`C(AZPb;O9`UhVzk-E50-l$OiSHw-{MY%W-&GC(SWv1;FAd($ALM|*WK+uz?J{*C zDVj|7DT$cL3XETMSR=_ z=l2=S+Bply5)?|ZJ&?TMJ#_hg@{$b13ucNJ@EASTPN?7LOoS1cuBknSP zx_3pUV2#4n7L`e&9pB<5=Xth$(6(Y#@DjYK)j`U)RYe`G1|#X){u>?)lSlq;cKzeh zpNN$=yQ~;+T9+(2yFHSsI-ed%>fg#4L7lCape+aDgupE2zaoDB_pSeTAb7^%J(ke> z4{E%I-)~##9gG{?CMvjS$Sr0YG_PJ6%%mJeM&`;xvv|lc$d;LHlx4gYw~ir`#KReq z!JX(ZZLqr_KHS>B6#3dh4WLU?$^It6KG@$mr-GVI1__?ScD zKc>7}n{VKoPhR5c>sk{d~_X-d25^Z-ms}KkTajJzu3hQHGH1X)}&(@g=i2;Iy!%puLHdPI!*}kM4^S{Dt`j(d5QyKOkJ+g&PuXiR^lY~7 zWlfF0KOdii2xNqj^7;Hn#G(5sTL+A1I^Op7)Hjw-1<69DA`|c`dcAL+raWh$eE!ybU)sKN z$l-=6lF78f@OP)Z_rw0d{VOmDF6Qfx%wOnUNbVfHQYOr83p|^gH$rS)(g+na8WryB zpfNg+V}y!HYE?|UPnmwq4D;Q(&5)%fKjJg;LeVU189U$C*j)^pw;xS@vM@6{AFkZ= z`Dcl@3VKY5_}=#Pn(|`5a^wIa)t|KtcrP{=ghV)7J2`nfJO1|f^%dcM;s{yE`xg0j;Rj*hCQm#7lL3KO+Ou z$`E$YP{CC&TZEvswE<6`c6Q=pL6n%E-A~^&w6zs>xnXm1l~vE|0HNR7%bgGtDI78h zMp;!7`%CIopu@Thef{x9lj+B3KH_Ne$(Dca5{A0gy@kfyS^c>^(nean_fd&c`T7g& z_U4}g1N4KX(!No#%{OCSl03^NnCNJL>=@O{2w$`1oq^v~*5aloh5oIw?>gB&zyHUBP z3|3P5*ElYZ-0u>s`DV}c$ah_s=z!zzK!~kmuetC>%M|C)L2Lb1L#u0Er`JXKnSaz- zwb{ zXvW0RXkwD%M=0iZS&L%;xDk}tR#foo+Ev`aQ1jq|Mr6tEu1$5bySc8W=5rb~i7nZ0 zIqvKiojC#}B_gI7Jm*7eYr!XM2sZh_`siphyw$X)$f1mI!^m&l^=y>5 zJo|;pMaJWE-W0yU02q_3C?Np`2lM>0gH`nha*0<8Z{EyxO!s8Q_VnaPsMZxc4Qp1eO zQFe&ZOji@qD1Tdy27K2ez}OBf_?3Sz*>&f>Mq#;G3G*wnQH(Ns7#PmFNx8XbMtl2q zUC1X25x3B2A_IyHuCF<<0IzD#V!dDz)_caPnGTJK#>-rr;(^P!&Az-SK8aPXG?%$K z>$UANEzZ4UQ30uVmudU->=L(If$Q2kVmb~r|;l+AdrctXg#6!l#z(OF+5B_ zlo06frj4Scjf$5ff>?9L*rRbuO+l&pYmIQobm>YcH?!_U{0?*@xkm1H!YOv9%Ed&Y z36Brx?uvx+F{b&UfwUsd81$d-{H0-Z z3Rm@q43{UY8TVeVO+n#HsKH}`kTZ~jFRIr$oBpQR34lY4k_a<4cs)BuVL|Dn zNh{&l`CWBXy@W5uw9w$M=~|{DG;uI>Adj((Oo4MINTh>K);cc`r^WJOp?CX< z>lK~lAtB0q^l8iO9fO0T0-^@&ufRD(K*x^Ky#iw%ClJYmTSD4lwY@Ev0nA%&XS*j! z(_X_|g@5(1>kr(%wgj1P9}LIwO8bZ3@0MGhY+$q)P*Ctui`)Mi?WRKf)g-2RP(N=9 zy?+Cxu3`SD$Blu`%(CGFBz;B%1wGOuQOTKBTi2==aDFK+K|=s&8n_laCl4F4mYbGB zOJ*$L`nf;ui(xV|y4R{3u;43HOcXqHy zV_+!9V}6slT8+XXx|1@prmC3XBOj2!!<&Q+Y{C5+>dZ0)-%V{)sRDnu_2589nv zTUtw~yk`5q5G#e%mlW{ZHO0NZG~B6rI|x!LyyHF=+uk1rpJTCKXtH#5)!zB?gjwDR zt>IyUe3G2eXJJ>1O_|idPL@&0VPD}+&vf{zy=619b4R_5FoQca{jsTG2|7=Fe#)5~ zWlfUKnzX|5YHtljAT$st7d9j)O6Ya&^zL1VEHI>=bs3jYOtBKB=qm9WiE(CRwI^c0 z9ihm6c7;PJ6L4%*^z4KrozYF)@5?9R)Y$g6J<2YmPvO}%O2A@hz{LaG3!M2w)~=wm zX(#Go9NF{J`bC&=kIP)}4tJ^sdlDxZ&=vVwsm~4o$RaR%J(TGwViYer&&;mEeQ389 zu;?a#P2weH1nwD{(m+;+$+{wNV=~Qs?EG(~Ddh8a%;8rPZ@HtDIJ>YPU)h9NG6g5^Yrd`<25Pq`OFg7kABM1+}!rDV2#~% zuoaxs#RLucxHVZv#ynh3tYe^v?eF__pNk&?5|V6$VNO11-pd7Q#R~ z3~91!mnD@8YU-1d>grthD<5zo3Gi?s^0IMsG&D3MKq7_K43Ye&=4T2jpC5NEaN@iD z{ZpSTLPj|`?tulG4*S{n7`{hnpex8aAv(11jO7gh?e-Q<;%$w-tR#?eDszp6_53+D zM#otG{jGWtux&!#VgDW_#&Gf;qkn4~Woz5@2Mh*$C?qXn3X;CV`vv$ae@r+5HZ~u_ zg$RI-RfSw^3$H+oe={8?>Oyy0Eea>})RFm|kkZl)1pxubBBSYRCCqm%u$0HQXTCIt zM?$r;6@?i|VHSmfCm0qo^XDn_>|^Y};1ki8jGYQsq~x0jmUN8uk$SryTKQ$&Id?ZV znVD(ikTIPm+6$r-yw@Wpm8JDaREKY1CqfpzWo7=Lv@KCN9-4=VrCOxNrQng^?cL4< z*2s;8Px#zk9xMQ8Xv|N!8!Zx;w}u@2h8j66;V&pOznLjI*B9J28tb%5 zl>iBu^Ypt0KhV`i`P9WlYAVpy))H0SNb!1vis0Qr&VAz68G6DCuREo#9s>7=)l=f4U%vu<8?4dfeK45rdbU>7VbqaPA0lET&(<#&T6%02 zj&|YmFYJ@zKW+&L7jV&nwDe))DGYYMwDhnfi&}DjSag3_DhiuzD{8FT4e(fW;uhBO z=S9F~q0qa#mew8{NHXbs&Y#iiJiEw~W7)gg4{+IPgz3`zk1OfIz@gX}sx@0;a?N1> z%dtpg|7}CLE~C=8E9f+f_@56QO{HNd*Un62RrTuqMc}f+X=D<@%pn835U6u3qUxaG zuI>6fF01><;~V06hGhH z3u!_|3{Hlq8@ber4nLucJehfLCpz->_P!2+>6cPrn^zVp%4S=;H~2!Q_}Hr9%~R>n zx52149(Ev!*CxCwkVo=aYNK67Oi65Uux?+8y4QKrb{y2jg$^Y+oSj@!TMCPDlnBVP z?e}F-6-rC1OgJh1iLwSug=KX?w`9Wr6)&NEEp6Jzv1oC;_R?cAG(L2CjhS4ddFLc_ z`kZLjz~uus+|*+y%Vt;t|D3=EcbXGmfwWORC}TziC_+*bL+5LMw>Mz&1m97p(Z88t zVL&;VqsnY&P(Ja}KQtZO{3c3w&zMIcFmT3p*ir4O;n&x6331doh&)WdAGCKt zgrm^dfTG;wOf8wKE_uHF z=tG5deAy6>sQIh9sUK~UySndXP#2!G~QWp*0|_++ya7k z$;;J*M@!n9oSZpf^hfi>2iho#m+P|TGu1}N$J4Lf)j81`&<<|9n8Zf~ta6U;7p6*u#V2otpgjHzL0rt$Gra-2=vXZC# z%GTfC#KaPndb;QsTRxg2(~9`=&>GswmTK%`_8p%RxT3Y zYvh#tn%6fCj%o@*opKjfSe27lW?yo0+nv5ffa_d0i*o$FRI|9JiDSuR*(8(vb4`{o zyw~}mb60XmJiJkgSS&iHewJTz$W6YLvpusJ$%*q19UV6mv^i3wBFRi zhv5=M=A^ZC!OKFKLlpQ=ZcnfHwJp72sI$@bIpoFN`PXLYsKUCsd^B$v8Qu67;oy*; zyr;Ifn5FbcyetiN5`g5>RE#xH651ET`nP;aX0omZ)N$JfZaP+?hVZJ=)5AU1GLy=e_205Sg-Kk=BpmN%7jRpx< z7tdX<&Hg!sX+Gw``787(m*8GZ!78ylefb8bH%9)ojnsz7+esGNtQL9QzG@|@&$ zm{jbEkMHeiy>sgay1(k_p{433MrQ^Vxt)3AjA(znEv$~>y%7?on;=_~XeDMKo;3C~ zb2kpqmu<*kv-oe(thKn+v>n!(^TOfDl;asGKmi|f)|in^PHRY4^PO(>ImqlBn+(T< zTE5uad&#ME!1yfxh9Y)6M}_rsf=|}411T<`H#9{P_ji82S=RjIZ(lLHOZeIIz08S; zHgL+Hpnol=^YyKoGbx!5p@-Syvr`fOaTJ#8`g)B|AJ-U-c~YbojR`^62|sp)2v*#J zrmWAtpPm-`X=eC)x$~vG3f;yZNYW8x_}$8+9k%1otLMm{lQ-B?Z_3mT4$d_ZsLowCb{s+fm$FA0 z=Dc@kp*lG)(B@=yrmxj4D#mBo=If|M)Un#-q}UOhc$j(~6x*|dDfwQIud?Q;LVluJ zgd${mI+woudEU?COZQ6h4ylg$>c)+A)pH(H%zwOKi#Bs-mF<=`N9|h(KEJ=7>)w2Q z@a1ANme-A6K)|EKd}AwoqTK=_dXJj5`Z>pmzp~z6Q88@@JPKY?e6(gynzn!;GFerdVgA>P9CjS{K+UNEPpfw{|9p&99 z11~F3Iq~gAUb3?Ako4qma(F-Pd$iQ2;-p zu~7xn%EVqjrP|6k*jc;wIwYn5B;z@2c&rZLmy;co>b`0GXArAKI`dnxTsDB0qokEC zFE6ic*$GoHL*-e9IO|V9IKy~fy5XI3CIUD;+uJ=40-DUq$fAMI0-$y9Esy1 z76L?LDx5a|#E$8<+11=-I9H3sO8(7WCEqT9xYrK_HMYZU+hM)!umdRUpdEHTdLfXq zyYj-VVeY3RPX(M`F63qoxiczuU{<#|U%xk#k_-?rw1ET17}pOkPtiYrAt1Uu_0c5o zqU~_QHf|5?PyWsd#P)cUa6%3ii0QZma5&XuYIiE7U;$_yT0c*<)@3g9Pmg86pi@4t zC!s!)N=7u`gyG*o7ttJ>Sm$Z+)c$7(Q{5fh+1BHF?M01m&7=Oy~@ z7QH3021lXde1h=JZ!emD9#2=+*rMs_ou09M!;0ob+v_e4 zDN=VFp_QeEFgj)0qiMB=+IsAHCzW!sfEG|k3A7)61s^+ae`HQJV7;muUe+_o_$8HS z-#GG3*TTX?$_7)x!67j40mb>toEr-lH*v7XhLu2+5MnKP=miXAN!Y8I(YkQNWAp{p z7|f=yrT*x7&Xq3rB8*-QZKV~y5*$v%?fh=eNy;*ysa}kUNl>SjDzBj--@1>4Rf&no z$yuEj`}pitE_o~#RzKpmiV_JR;=s!Ow;LD}6&_8!r0ulbBb&A%~&HD zNa0AJd`cfr{sR*oGEz$)?hn&*4lLb+y>ql?0$!}eFvG&(#KwX?X6=^0yIhhcrOvzZ zBwSp8f4j@epK&3P*p<_8hMuo@5rB_WbK7L}I%OB@vrKGCF>YyTPFw{>M%*;4pNoPC ztfwI%blIzly`{S@zX83zYr;@Ll@DaNAMuZqA}zbu&@euh#uGhC2e)Ep$cR?f@C*f? zf(<3a_zPxw@py8h0%K||Z%5usCMG$#Qh7ZxfLy~f|MGlK*=Qk_ARS5A85YifCY&e8 zYu89tcXWP594IF_OG#i=Bbh^qoi}q5@Z>IEU z;uB=IdYUQj$wB7oQU`MBDIWfeO!CBW3~wU-rFwqK@b@?FDNH!RrOi%HIcRgZHl<+{qeH~#HgG%r_I325lB)31`9 z%f{#ACHri4;Dw0Lq9(X47TUVd-y#MQ; zDU3I9?@mtcTD>)&MQcRn4uv6C7n^Q^0I*#-Xx=0%PSPc2o4!Lp7De>n+O54P!TPcq zM@7ScJ2uw*j)!JcbXQojxJ#yXvMEqZ?5SC;yQ%{Cjz{WjnNIi>dy1MjZ7-Tu_V0ko zA}j^oy&uC1>LlOO>kZPE#*PIBkItzuW5dG{h{8g?TVM^5I*>`-Ex?bh5`xeuZ0NR= z{^VFBOgJ@FQ>Ge~YnVWJGBMSJ6&~B#!upJLsH{v%ijEGbmAdhMZse4?yzlkR28q{q zbj)!xMB!xcqcfa^g^mc)8J;>YZP;C1iS_$tXzrPNVgIkI;UQj^z_(MS$^HJs0yJ{q z@nlDkGJ_6xkIg#Xqk+n^w}Ylb4Ss~vny&ujn3XUZ za@aa12s>J7(dfKTOXi)%!#!$ikLSG%D=Q}_=jR0+AkSdl?Q``My4@#>p=n9YVrYqZ z`vzx4sY1&~Zm^L6rBgXM0Wt~-*oIC7Y5i9GG_TqRpTI-R z{ztue2s8dqy4>sFuXvFix-9SUO|Qr3jHQ>I8jt?v~#h@ z0R+fo0_SlIE0T}M&gZK}$SGW9F`zgpM66jt8&)*1a4b!|}TPd{z zDfcda(~lM_2ZMhS=m#MhEi5K``(eJJ&te6@#^;6s)()G{wO@WXXw476{j+uJ$Lx*H!CQ{MX~J%KBvm*0)MZjJAgo zzEFwC1bio-iKmk>+}AHxJ-Hm=D}SkJfJtuCMN%0+cZffBzWIG zLH2ySHYVs*T{il3tsY5~O5Mtbc7%yJE4XBI04IAsE};_52i>~Ey5mEy$xAGLefFJe zprDlVB(@eM7sSB8Jny4r>k`HGOt(uzuI3X<*hF1*GXY5zo=i0k=|_oG55 zxf@<@r^Lr`W1>MHAO6T_4%~13R84rC(#H>W*Go&N!^4L|`iH}YFpq|ZusBp;GROaa f+(%73U004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00Rk0L_t(|+KrP-Xk29g zg}?v)_cbqXr^a-eNld3TO(9X!g;HNtn=ZPkf(n|wy3kFF;6elu7orHd5-JKJ640HZ zE+kY6wMnd+fKA#w#>tp@C6i2MGBdsR&fJHKDo9Z9TOQ8l!1*Nqf&lG--so!|K6T&s zMt7%gvDW$74{?Ej|HGk(ICb^iiF)XM6fV4f%6;SjuL8FNa&K4J8)y(8KbC&}-ZS@D zl&+CEp3k3r5uC!uovc#&>5zze8m793ti;lqG~e58Y+F-5BkwKC$XHn(u(HaccpK zHP(QGa=q3pK0a(dnI3;3;+eltspm12IfCFfHX98h>I#MxVAncmo(hL^+~7x` ztRxbV=)tt?5%@TMhOz`t7U{TMR=vZtJjvvBF5akf1y}<%R0zRuf^(Dp zxk+Xx-a?HkU`l>{`eAC;TXczQ9PYw zCdR-?3!(Z1jzsrWQgM>HLj2Zg5whdqUjMzlIFfWv9y(&C^ti;Z49ujC7MJ*RnEhe9 zXfK4ws%>1D=}ygWG8^8S;EKOLJ$MHr=bqEvc=Uet!Aze_5sENZ^a_`La;HD|GPsbh z(gKoy8Ce1fKwJD%jD(4m?qSeMun(Zoq+Z-2-*jmFm$`oeFE3K-vHra700000NkvXX Hu0mjf8nCp! literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/dnd.png b/iconsets/roster/default/dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..20d71a8adc969ed5df3803f04a1531fd23d89231 GIT binary patch literal 894 zcmV-^1A+XBP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00QDkL_t(|+KrP-XjFF? z#ee_%nwwY(^&oG znUA}#`kZw0M5=t-tsnu9H$i)q=(}}dAXAZNE90m70gV6CBr1E$v8QLS$O=IG92%^OXf*fjbI2rIJj z?r733xnv9#T~yGW3N}y?odI=c@7mUZ^=n$zMcV3HI=fmzZR-OV-ZWT65RwHePi!>7 zgNNDdqj{N_h?ggCB)ng5KI4M;<=~dYu5XWqkx$4Ck5d?nvtVZsK8L0cO>|8{#RlC0 zw+N*?*cN~P<~Un^WStg`$40YPF7GJ(RHo+L_wipE!HdmOR8(%CGYIVqvbIk^&H~2* zVIxx>6DekZm1-(p%Iz`xK5ad+Uooft#W!>bQxmKZ9&N59I$k2{FVomAK}h6Nm!Us- zeEcTopGzi{PxQC@SN3mHxpoakMj#Y|U~rLjb@b>44=&o26hSeq^26^u{OShhqFJs3 z3H7_}yML~)6_C$^>p~;~9UY4|5&^@&&1ZSs;8CLpzP?<(_)n6nz%=kg(~8fbw-+{V zUba}ZovX-{(^NJ2sH?Jk3S>N(2W%xbHO2hc*z&csEb#lmr%~Nx(%GQ2`ZNr{1w3sm zmzw!}aIl@>VK5BPG!Ozj4;%-iBvz3$zGb461z|ryL&0x@4hZE!A$9s*avlPKSKN3%U-90U{wSylGzNf0G&!biSzo*Kus~iBpJFfQT^}E2O!@L0BcZQdj z-OZW>YRA#(6RaY8Q`k>+>!@|>ta1O4#Kv~AQt?Fmq||%EO!ygds#vv#^^C1JSt?7j zHNZn2aSs>JAp^VKuXe9`Rfz{wRrco*UHa(2LJB%BB{3dA{PchYx2nW8@h{K#JO05} zVI)Lm<>gUE_Qalcp%=6}-#NZ!4R`UxqUWLR8_oaBuXyjM!U?-SuJwU7(BMA^8+4}V z*+(Ph8ZKUU;3A~S-BdmH=8bQ4IE8|DmB*Zw0=Moh5=wwM|K+6@X^_l5_YU^}d1Bls z$tcO1mUEay4{kt(OQ5-3WBs_mjD@IiMX?ACk>OBWgzXxmxo*o#$`mSlH zd?4Y``$Ko6y!}P$qVQC};a{m#l*>ismfcE)wh$V7Xm-wEM=_#;J*?HDS^DHaa~>G2J_h;a}5i z3`Y51s%88S%1QwdxeHyg1KkcN(VSyV)5ceRZ*LZUZT)@&4>%V#1V*rTt?5JsAj^LW<*oi z>^t_aE`{05^4_#d)s#7%Jm6_>MGYn(uQmV_FMqaCNSXwv;#F_qnpDqSM`dZl`H=pA z<|*bcc!7{bb4ei~p@CKTUEQ@o{!S6=uv;&#q=iGj`#2_^d zzBe~>$raJ2iz8B!E$Z@ER&u`oMoc<~W49P+!CyI^B~A+1&3^IL=8mc6BCyf&4?U>G z^50d5tSr;in3-zz6DKZSc8ZAK=DEzRLf$?c$F$;3CIhp^rJa_#t1iv`dU z8CrOA*4o_UM)Te@<2^%vZg-nSabsg{=#zEcj*r+Z*HZJgN0l8N9C97!$#u;-`MId8 zb;qScAyRQ%cuCA6_Y1V+p)t4!HMbU;I_}(oXW+rNz5Kc7u@rtn67POA*V*RFe0!4{7a-M?p z9H?_wm15+t8C=flEzIZ%MoO*D~n2V|@jI@%;#J z5T2^kF2i061dL`smTlNg_wYen@U^3wUW0BzOJ&wxb#K!QC{e66H+7utm6mArauI}I ze{_4EGnA8zx3m!~^?^(%Jstw&AzZV1IXUtd0GLf4>MnUWIYI{}p#!1lz>)625p>{Q zH=6Fd#&mj+n8VQNc}cTKV!2;?=lga>02R;GQ9H0bVk`%JgS_%u-z#Mfv^p@c>WTR9 zVR;$7(kJWnqq4FL|7ySDPn@_LU?&UIYKiWI3|tL`Ry&z$Yd>NS8noU$^-sP3F6hsn zqPYY{p&sAXW#Xn7jP*gwIUPQk-(DPI1wpMxsNcV-6J;KH{I)#;3gm$84i1>9W>l;S zo`KU*Q|)c6Mi{%6HlDo>lkT-jrIiI>Xq4@zrw;5xg)9cJ7WRJ}gOVW1y; zwmZYcj>Gb1UW?-Avbk7mI9Mdub7W7vyv^_(XH}!p6034qc{TXO)W@$?%^;-NJM6nU zuXD$W^y~XMS+>%Bs2AMk&b7XJ(d+hB{%+zLc_a*jdP^|OxIG0?OIR%h)QD;ZOTO7Gvd`;*{WWv3LE_Z+!4hXtO#>PFvY zGfnLb}UFZkh%w+RvZ~7&ey97 z$GnYM1g6jlmPsmtRJP}0BN>BN_+%b z&c6%@puDsUK)RqAWtQw0m)~?;=pK5Qjn;_iZ9;GJE~FVj7ke+_pXO7%M+6Wl5 zINm&Nd@Mswwlug)()7ex|MKq-&hX-~VG(bJ>dDNOZS^i?K8*(q(>G<_I|CoguDrzbRYzM6)S_{eQ1h~XVF1*gnjOZ=WU%> zj2aJe=gfLV%ns1~wRCJIG~5gxBr9$3_g^VV#u^@8c8iQ8SgtACG=ZYzo7V+$GPMWv-En_vO0Grw+E@)zQ(F!+*s&ZN8M$mk=1_RdlaMI`aRH|3_6n5lVu}&(&D$$Ax~14l zkdS3kA^#mj=@W|PpxIv{Cwy|snHgVuI>%NUU`o5o&{y+(=F2d2Bo^*z2aGWRGh%IR0dL{ZL!7mz@i>Xi zo!MipE1-K$^*(H&cBVL5O2pR;y;J3XyNvbaH$GFcRsZZAN-tnqD6M(i8(2;!OLz3pn=_x#(4 z!VNek@jYIxvu#-01$Vzo^LuA#7!+jBuHYd865Pkeh^xi(Y^MdE?LLwN`TV;rx?|z| zZ&_JtvgAf=ZvL(HAT9GveEhy*of@D-M>?W0SaIl?0s_Mw1}Uj?6jsXAdYioTt}7Dm z-3FPz_7CZV3_8J&4*WBkxOM&&)bnf)LTG!>)9t6dqWo|pEHMs1JI%L(D_N5>b+(AU zjzQQ?aHl)dUz5Cl?JGxFyTP165Kc2H3X$vU#l_K3Na{%zORa&UuEelcCsNAMk?-%2 z?&&k|-`ldX^pcy(=lu&%_jy7cmuw{PfwH=$!hjl+dam2b2Igu8?b=Ft>dqHbK3~4I zCB|&GmUZ`Wdhs%_xu6}|2$LKy`zJHu;N${&*@bWY;VV8H_4zD5Ov1x$jKxvf@%Eyy zUD2^Y?(f*j&39v|b`wM7sdmlJp?DRIo6j6q!_S^2OrQstbr_FoDkCCKyNN1O*X<6c!f;s_9-f;i~uSjniJLNvh=a4TSEGf`hKiHvH z^a@!4`pibk)PZQSja*7AocI*uzf)ieo2W&_r#=lm?1_|m6FIgPMh#EuELxA#=GV-V zvQt9ORLjDe4sXm?zhxysAdq*E(Cl?pRaI?|m8EUWP&pteHlRm@)-t_FkEKeWInMS2 zOXwE3XH{0fT5;HY`?mk?ryg#;WZJPM6W(3WZSVOr@wvI9;Db?){d8cvOMy|fSgoIH zyu5?=B_yI{pvXk-{vM`owzoe=iu*dPbw!K~7&WP>y|3xV zAnP;A{bZe;j+5yS4^>yBnHMqT8cAUr>8S?ZUgSw&94yqi!wQuYCZXowslTb*4{%Z2#qAVRQiq8-=E>;DR zzcSdkq)c+5HzKtG$44t4KPqg5<*Y5VhJ zB7*a@!x>Yqpug7(z*_!lB*J-L3NG}A!j)Q)M*gCxeDWs`ma_6-Vp=-p+e8MLz&i=g zz$*xC%qolBN?HkHth6Y~9PQUGf`nE+l27eCZ*PF!mIM%2hG}Pmg^e!Z4PazS1n3yr z@3do}j)x>oY~WFtrc_RkoG#TV;N!;9&X);38>L;JfF$%M$=aH(RZDyMT-yWN2d;o5 zYmTzr?A#T8$R_u1-!NVSM2J0GGY6x{Oi4bPNITKNg*}7|8VLupUVcZG(%+ficndt>E~+08(gCIIoBDvL8B*k>6MkEqwz!;gzG^HdVm-#UBiee zRW>rKP(yooo|hkRnx^0!3)&F$!?~VlX6BvY>9)}li(lOMPSi70Oztf}KJ`UYUe(`1+pokrL9##Fe zNWs^5zceGs3eFi)DApbmkQ`d*$5aUMG^EI$Z}?Ym0;%%ee0Ms#zprKKQ1gC`J_)0!-pr&7>(ix*_EJZ)wCCTaWX&rQ;a?QtP8z6M!d&Z)VsLC!MLYsHB@ z^hiAk1eFWRBdRr0tO0(q+as038v=9pd20^VE5)0?yx^L`qK#VgbKpWl>!30CZLH83Kk{}aYLxtC*X%_5@KH*43xjQM4s=U&SaBi^k-!a1-> z5mQ;MZ$WpDK)^d9kf~@B3N)rv!xZ6VAc+2Ay1Y=@MV<#>jfWPj~&SqX-UL*zF!&lHJOz4w*^hrASBprP+1-_dKA$4;L zJ^n+DiDJRD9=o{5wDbsZ&{7Xd|hFCIor52FC)W&2V+UI#dgBIAK*$70pZ$;aN`HmeNn@_u`|g~q%GM{t!_%^k3X&0{ zUq{us>%Fg;c5c8R!5!55do^m?|FXKj7ZqKbRy2)Y3&J2Sy3dH=<{hzQJg1kB?x#k@ zIZ`&t-*)h5=yS5E0ZJI&;;o<8KdT+=UwtfqC9pASVT;E(*P5&ghw%kp*H3CS`KPfX z{&H8W;dAT-2id3!_|MK;j`H8x2CSYa^?ql2Of;_sMEgo*36L*CgA9-{;(?HOOa&u( zDgt|gNr$)~l4XyagpWg#;>Miu9@I#ao%iV&Y*!ky5Vw z`M5mXbS0D$CPuztzPb_}e$Lwx_bdG|{5$A5hoJEt`SNnREPT(1p!@^>9Sj#f<;nWY znAjjdR%s&qai;r@G(#dPa!NH?f4!!gWc1xj5z#8f0RNAA4I!6*?$DZMG$ye2O3id6 z5(^_j|FrZ4(Onw@SI`#IUAdh&sZw~;?5}-S6vX~$9%*J$7(P(x@KV_j>L`*cIL<4+f4Odye zI_c~C@w~^$vBbn@Q8*%-ZlI>z<*{1;ALd`xKUeRsy}9vdD$h%Z5)vj%k)kflX+N4HwnFR=rt_{i>h-s+q6VIIRSBUVu_G@nW zD*_Z*LkgMJ3v826hwTW)7{l`|;n{8m7$e>ru*j-7p(5+30+jF?Rv+8NgJPCSy**mh zbDX<8lC2N-%s9~a_O0Fja3Oj7?zd1lp7r|@r__&and_6k9H1hoi8n>jfVh~-Q5ZaV zJIpwpI=}5#xq90lC!xVdP`W%mN4pP2p0gW!tYoh?tVH|>@Bfrg)9v=AVv&}XQTmZr z7YoP{;ym3vuMg(nu-wJ}62vAlCIFa@f1^opr4MXHPOR%XX&^RzFF4 zpVXcxKK#XMFW%Gu-;37i7&&z#{&IsP1RnyCQ$|%wjjr>2TwhKO{i*iJl?S|97YNo6 z?LGa~^q;J2S9&4%p@NsY>9!jK1GAU;JhHHj-N|*>Qq9hACZ@{{KWz&rn5RQ=oy@{ItFZ|8#eHjrDytthhc;fEZpovG zLd&#RLpTKy0|Xnfbd}}km=D+mHAuW_LbwyTU)3o zk=TY-Lr~wKK86j2Ae}ucMH9&rIyv|3mpYRo*KjBQGgIJOKJVc{glsLTI4VcxX^e~v zgPib>&9a-h^K%^H>k;zCi$knP2*l)bjF)Hve%Fq!>Om)8D6@JNqHwu9#xChiAN^Lm z6SJv`^ckC)AVp^u^ThKnr=kf7F>SeJG6Cxci;>871RK}zaIcjF1EH5Gm4QH|orRXI zq@Ex~W%}*EEx5C^^ z{IBS&FYsRu7pW*euRrju*QJJMzZ^NYX8<~K(YG;$kU{`{on5OUkxC$=4r=Z4YLe09 z=~*K`zuj1RRrCVE-G>Xb8hKIst5Np!PC4$gr=)tG;*5a} z$H{-Qa>Rh##9@-j1wzVt^$kJ!AI-AfCL{o-UPbI{kf z9pz6wOKe)Vc{KFQ(PHF1SeA>6gF`U+<8l^8kJsqB9YNODg>=e%M<#x;W2HhX-TBCZ zSna!FmCHj{fgjfn!PcyRFGuCo56!dxn?eRW(7aSnTm0)5MnFbTH%4EmD>0hlq4f=( zIjCkB>6sbEL?UeLj*{hm@$>?1ds#o4VlA4$9)}g-x7C3WvB2@4W^m}WS&30KShK9d z@O{ZB7TXuvUl3>04-;;HLI1tC&)xbS<6X(Az~iTove3yU7-bABt2BHipxn9E}FmHRc9Bn3mb6?!kO6iov>hn>LyT1BZrnSh)G*(CO6VP)!s`r^xl zP9EXcKRN3d*qhWMTgEU3Li5FqvqH}K$LXKOm`>~~b~W}|fV#9l+czKVNJlu=0}Ims zc==2B%#eOB*X(^oAS^@4?hjp6GBkCjK`7agcsC^T;n}seLR&t1srkjjMmd<>W3!F;mh4 z(j^u4JsY_^g#n5j=Tky2S;;Xk2E=*nbJ)9n@8?19DKUW5%C7-L{o6MA0+0M;Xig%BIBeK;2gGBdIX^&R)g1x-W;yIOO-b$3xFwuO@u!%ross3YgKa+F zYbykw6obFCRW^_4fCwW=4zU1{1Hg<5ijwI;z2_gqNZjl5yh#}QbjZn~VbbZ$NO<~w zXizi0*qHWHRp~#`V6WVj{PZ1f!R`#$n1nWmm8pj~_qP;_>Yb2B?z^ z%loD<)tV-l;8zb;{<`34T0yMcH3M|uCAeb{+<^dhY+H70gFDXFz)%dsoma=)4H(^P z$E4U13M^z_?RWMQRI;8MQ|>tHr|#Sm$~#t@D1TAO>3)pkidEZqN+U+Z-6h~8lXc<| zMF%r#_;jgVEWL9(gi~I1zKks-GrxYN&ND2N9?fXJCm7X|Re`LtbKmi@Uu$lo>Hk%L z-P#|KaP!&w!d*A&waRrrY#GPy0_KA#x~ybM_iDEbT9) z=!l-M)}sazfiQKF3d=?q@MWg{KJP==EnK5G90yv)LOmFW7$~AEBk{GGnB15Cbqw|s zz1q=Z`wjo{F%v^!nvTvlFKBt;xbuAuaV<}K9&LnN!K0{2+$C~!GV|_;eaj%q{*U#8 z{BYzj1dQ{ zgNrS@9Ac*s;3o0iJT2|r{Bm62gABSf6Z7u!zX)fSmRRr1xcK!Qv3glF`qJ#xVpXy@ zVh@EJ_$diKDhldQHiW)NHlanSa;f{!HVoOeUjZT#H^6dA8FXM;X3w$a{RdYJ>cHbAz$+2_?rS+K-TW)l;%EfG`7 zDH}sbxMupbHf5je&VWzPEjknAvf=TsR;oH}8vgj3tCJIUs*)4_nW0S2v0kiCbWt8b zHY-1$&4C8zjMIMN5ss2g_huPMDRu^g3grh?Gl0 zeh|;>`P#81hv9;Yi}u`cz+8S4t?{(U(2!iR&dX^AlC4d((~%&YyG41V zPQgo^ua-EyowHro@>ikhe^Ty56M~2-OA24>MNll~7y3cV_nVdFQ&TT^xurX7Z~L;f zQ;IofXWgiU;QLZY@knB z+sMKGmB`nbUJrny59r96&6lH;(Ocp9NiE7;TyD}>20so|^OwvFaY(vO-fEqDndS?- zucmH#C@aIL?>5UhiJurYR>mL7J+9U^tgzJA)fE$S$Zc_3#;^o?pC4}zSS}poF3A~w zQvCV#R1R03g*O3_H=g-6`D28u%e!X_s6RCYMzUOL{1f8*yx|Ayy$NaDN8D%uvWfGQ z6xC>VDeKm39=p5?W+1#!O8{ zBqkyvBG5}V(!s(#P8z*YM_u^qam!Z{xBQQ-{bqc{`<84CdLt*ZLm(H#HDZLFc$_Xx zCUq)X%r6QH*Kfsg-cA+hD=VZ&SNuy?t^t$4|oTMXQm-mT&AH!&SA+ zF}QPsvD+bg%f3W=Rhui~T^q^<=S^9YzO17~FA7mDCl1Mvd*kBqYGuo(qxTuIh}Ry&2lms=r&FN)ImlJU^j!`_=z(H&XNYU8w3=9l@C7iLh> zDsv9G{g$^2a8Jq%qf3G#QtZ*SGykO(2>!Zo@MB{r)1ganYT4!^4|1l^n@`|JN5{?V zkE+Jq#c#PMV4ZaO0T8=%)7(K#~ynik99!6JlsDq&w-ODhK?ZKO39XEWbvDt39! zC`H7->-~JADUoqn1R>fnxGlwH*iD-#B0|GY*O0*UDKf;9G%xf$29f(tj$B2woA?+! zZv-ON>34J1>i^bg&YxaF*E{`kE_~`7z2!lx7XotLvkcSb5DU`I#bX-@aA{3QK-Tcr zPs`{XoNq*WL;o?!R%b7vlA=$UWQEwF;o$`^pf6~4jJ&K`%ypCirP2hVL!lQRj6mM; z9ac0SUH>+}Nq_dtutv_QBJ8eyWIv{*Y1lrysWNya;G8sHqK@}^=44{##oO%hH%d3m zetzB6GTE`={vq8N0gWzKWuP@RLR_=1`P*~X#_{$j%k^_6I=$ru+`QVDtZt2^-fNq=8KXJ7FCd|Q(vj4r$Yskzy^6^w zX$U@gu6}HV>;BGvd?Zd(;eQ%G@D_OBqsJGPpKsWwe0zfX zf}gjg1yML1e|iG=nJ4L_8xLZ(W&SqrHT!CVp};XGBRBpeH=}s*Fwx*~M3UeJ<#lMw zBZ5+tyoW5Ne?zab&cum?vg09^=2RZP6V80{OLeA8Cwm=~n9nxE;(j!}GcPBL7-jWI ztwcetapTuaq^uR=`Hen5lkBJB-PAe3+5A+@cH}?)`m)uciPW8Wi9Lhxa`U~}0LqSx z_RUNBC-<@8$`m3Aa>@nILwMp=-yZjS=MQpRVJAs3(8Lzzx-`=x6V8_yQ&ZgSa^{Zj zdL>5|1X)<`S3_(=H$paUXWG{SqYC=D6xX7$W&V2UcD#oX!HCT3=QS*U@NY!0e8so> za9#%4unpDBi&dna`siEk{DXLD{WHsis4sDPi^VdY2R5~zL_F&N8C*?$PyCENOj_fC z`2JeJMW}& zo2OLC8b9>f@~a28+Y&FFNYyCou%v6p;k~NyTMT>|hK{pYAPU9Hsm_61l;r297tNu+ zj*dI2;XVc}T;oU%?X3uCP&+gRw-sx-aLaCkcZ0Xk(p%{MLwKZ+-W$2o;ZdhlK1iH% zA)7V%%SmsoBKhfpliaa^1jK;PNXPs5KF-8onK=p9T+s-9nK;L)J)XrJf?@&3Dp(31msZgpTU-l0bTpxlTjS+hd!Y2vwB>2{v^> z{BKvkm}CVoXcx9ltVHq=1j0fR;)osQk)a;`E1V)Xv4g?z^0&_yKJfYm3aEA$TiVo> zKgZ#s0X6${wyp+pa^bH`B$%guRk)mx{WW&I+<;tY8DvC^V*u`b&<|jZ|E2iPf_aTc kX1yCN{+~HV@7~B~&WeSh;7Lu7Tf6~k%Gz(L6|Fw}9|P&4nJ za0`Jj{nO?ITd8*`?nVuSzy literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/groupopen.png b/iconsets/roster/default/groupopen.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba4c058a15168efc5166fadd535a566f435a5e2 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?iy0WWg+Z8+Vb&Z8pdd@S zqpu?a!^Xav-+_~Xe1&9>AYTTCDpdxChGqtapZ|gMO9qBg0|tgy2@DKYGZ+}e^C!h0 zbpxus*q#0uwn)IFy-BnD#jQk@smj zV4}dR&~SiDLb6Lj!Al`XVClaEGY5vowLj+HJN}{Tp{l?>hRN$2F3fKN+V>zQ+O!oJB5We-;ytYh_dPGMl;Sk*95F-a`> zmt@;|p8FD2jbVPXS&e~;AKYWn{5ij_H&N}vyO*0K9!_Iq5l~*ZfQ>_;iIG*nfkhPP ka7R`KMwb9ahXzK5cS5=WJr|0Tfxct#boFyt=akR{09EO0{{R30 literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/headline.png b/iconsets/roster/default/headline.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c29744992cfa7fd9e22b03e056e9e8d67a0440 GIT binary patch literal 833 zcmV-H1HSx;P)kvfv!LIIJ-v27;uH8Z633U~CaH-d^SA&5`brk*TY5b4!W!^_-ZWkBi2} z*0Vb^>TY5n5O8NQobh<}o~y4vaMJB|AY^X62{QLmn+BFwHV9mmP~m zMpYG5RnXIO`Zc?~=C}fQE?oTN_J{Ai(jI?eP}veV?K-;Ef~MIBM-5tzdeLkaBw0dH zWK>nc=c`ddp?ewG+x+(V>gV>f`G+Q%k8YqU7Sfpl#zq!ZQCM3yxfeCCSQRwQg05TG z-c}eJn-!*6sZpQzwf2N&7O`qJUhi~K=XFyq3pP@l80$Hnu4ah+q0`w0*=(87(OWR@aL()V;u${vbYI17GxA9o&cwegLfg z`{~q3I5hf$y}IM}od_<610=z%p?S8p?vl(_Xm!{qro!LsCId*I`Hr5vG$B{j)Y@$_ znpL4#DwEwTBP5Mjc=*@i@86#W(z^u|sAQ7H(%r+2$4 + + + Stellar3 + Stellar3 Iconset + 0.1 + 2006-08-30 + Jason Kim (Base icon) + Everaldo Coelho (Overlay icons) + Remko Troncon (Packaging) + + + + + status/online + online.png + + + + status/offline + offline.png + + + + status/away + away.png + + + + status/xa + xa.png + + + + status/dnd + dnd.png + + + + status/invisible + invisible.png + + + + status/chat + chatty.png + + + + + status/ask + ask.png + + + + status/noauth + noauth.png + + + + status/error + perr.png + + + + + psi/chat + animation + chat.fading.png + + + + psi/message + animation + message.fading.png + + + + psi/headline + headline.png + + + + psi/file + animation + file.fading.png + + + + psi/system + + system.png + + + + psi/connect + animation + online.dimming.png + + + + psi/groupClosed + groupclose.png + + + + + psi/groupEmpty + groupopen.png + + + + psi/groupOpen + groupopen.png + + diff --git a/iconsets/roster/default/invisible.png b/iconsets/roster/default/invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..5af7e412f2c7745a34c9d9bc8e3abbbc05c7a520 GIT binary patch literal 932 zcmV;V16%xwP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 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 literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/offline.png b/iconsets/roster/default/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c46e452eff944e9287259d6856f8a33334a3f189 GIT binary patch literal 866 zcmV-o1D*VdP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00PEIL_t(|+Le>dOJipk z#ees`U%5J(gqTYcM`9#`c7%XX!J<%I6e*N0T!b#V>tE6TqT8-o=(4LW1Eo-~pj5Cz z2LcW8<7OH&H!|_2H`n*QA6?8;rZSrzcy{L;o`>fgop)e;ecjyL-2AH5YPD;%S~U#A z-)?Vj?}79&SAUm5v)TNp)oOjczrR1Llxhx#!`tiY>*r~jN+5fiD;|rtwzi(sYPBy{ zS6B1H;gCwDVl^6#mg~A}fc=;y5Nr64Ep!NfMGIK`Dil5-H`wR$&-k z02SSFoK6q~AC^ibSJO1&IDVMN!hg*?&+8u_AAdUVL{Bz&0$&A>xAh#nx>Iu8A+0mWf{3#j@j8++ceEr zN~xE?Q~=cLb;EI-XO82b>pGTYA%s9Fg%ASEvM>w-$8jhYi%;|UyagmcY5=5ZYR=5e zR4mIv*L9?nTwPs_FE1~DuU4yTwOY-!Z5vI~$mMcH+qRzoCZHJr{eFL1tyX`zxw-iw zP1CT`>HKZ*0StB<@(?F2c&#qUJjYP`Tzg`07*qoM6N<$f*{0?2LJ#7 literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/online.dimming.png b/iconsets/roster/default/online.dimming.png new file mode 100644 index 0000000000000000000000000000000000000000..6a05778503058f72281cf44117a0851597237a0f GIT binary patch literal 11917 zcmZ8{WmH^2)8+sHf&_O61SfcKhv4qP-JRghK!OB!w*bLHaCd_H;O;)SGwAH(-Q92B zv-O<0eSgfU>guZQTUA{Vs>(9&P)Se$0KhvrSxI#O08R|{j)jE;d-6W`{)P=mW(qQr zun|TN5^X@(fbvyV*9|tx{^ut>Y%c-;u(HTWe%AC}KJD<+(cHW1?z(eyLLWm8vXX7B2rPMpJlUAg>c-^Ja1=({O$c!)$?)5;3g8*p(VI+7 zf=t6&&PK;xUoIO#CM7}}2M=@3z7wDq(9_A%$;;BQ;jy88$MKpU!Ub@(n)pIQNK$Ra zciTx#)KK$g>$^hQn$N^>4s?ok9Jhzp;e+2Lu8yrc*Q0&nbC=OQbc_NyYm+~68h_xx z<}osIJ-~YD9qAD7g~-@5;g!Uuf{uckh88{94`FT1oBgvvXGVrQ zUrxpnl{~Yx>R`qG0PlI@L1avS%pyE)eg^|fe`U3)(Qy?EX2bp4i3jg6UZoaO1XC)i zOKu=#7jj_O`A0_E>k#k`V^n11VF{~l!s%^sRlAVS#E#n?S7r^QWXdSj3V@374YG!1!AVhbPQO2xcR6G)&usQp(WR z@1#Yxw)Akuo&b8R)pOkOP*PvD?Lf+-s&PS4bNnj)Dttj^prkf~Iq3d-o)AA}01s~? zefxHOo~J?KdNl0a?6Eh>4K(x_zZy@S;pj>?lQy!ipn%N~)2a1Ux{7z9WQFu$JnWsO za3@kH1nr@!=LJhnt*$FF(4e!V)JA3}pl!eM!uOmw?=jOA_P+wWXSwEAwq55iK>!1z zVPT-2))&qC`_bo-8_bUNCy-K$M5lKz(v&?U2>|WALe_`=ZG?V^1OCV$7SL|xr#82K zX%p14bL2@XYx6rd%H61YUi%eZ!Ig98ep0#(8A(xni}rz^3O+{)3rHa9YoAVIVJAIs zhjJcpC!RAtzqB-^ruO%GMO07F(uYOq*vd|@SM>Q9V&|b#*v>(1K00zQ;s=(?s;D?! zZTZcZ3pLwV{-^@{Jd>2;;w8ylWq@+u3*USNI*{qihcGbHQ=4DcY;W^!J2s}K?pt-_ z9*BZ<1uf^Uxr9G*izr+_7!P9JGoEYITUj`eHJ$Bw#V$I~tMKs5&s{zv7kEt@jTeDY zQbWMY6DdrlaLhr7KoR2xNf>CTcV0@?fk!VT4vmlh$Tt^Af0|S8HErX&3US#PjDa3Q z{-%m9K4Lb$Ap1QduR#0BlR=3gmKOf^C(8j$T8j<@QA_P^^dRjqATKx&U&)wM(z2UdQPz+kin%nA(bR$65?zv9GU{tU)0PN$b&bQIgPVkPb%+6|Xi&#B)&dj>_&v z^sSlb=pJX9@(NE;$IlO^XSzugXfidp3;8_wc(tDeJifWV zMEGNikf#mpadxT*Cbd?==IXycRv&}fKQz=WW=tXGKhvyTk3yy93yG$m=GotmRMA*S zT6q-`2}C#kVN9Q9>}kE+F%yP{I^Ego;Iv#S{)x+?=H?#3rimV}f9(U#IM0}lw{Cz_ z<)O=wCF8EjZdL!nw*B6fLZda`1KP?!y8ywA#v zvu4#mEu~am^R|l`Sba<3{)Bl4!K{T+rz{FxjP7YS9J%6BFflamPVxV)=L+pP=FWPD z6co~=u^#6mNs}p~xWThkzG?veVj(1Qud>V5ZSga0v?`E|+p;GPCOG^c(Y6F1HSANC zzCIidqlV~@3>KWdvCLQ3=cJYv4yH@m#ygc=;MZg6gXA^GU+l zp0fFX!()3pcp}mBX*O;@$pYX+mxJ6cW=qQzM-SWuY-uL{ovP5NL1-7JenErsu$i=~APkTw^vvCF!vkMu%vc=o;#Kgcr2VjNBhL{2( zHK)w3()9wYCR%pS2!+XuqnPf!mK-z*Ysj@V@R)<0WD6KJJ^^u^pWnZ>^(j-S7olc+ zyj4)=BJuflBVR_(qoq;0jBPbM!l}_Uo`D@8vgn+9&l)+6T2l zlqtE5WY(CNFVuzI@DDang$%6<&lT_y8)g+tbY0Kl$<&wBa zmKb%5+|3;vW(l`8N-IZ3^wwVv>Ep5)nKjq2G793=lGmIX^eO;+u@K73#Faj;(m6-b zhBPAMd+$Z~#_ZGTrJKR2F&R6EK!Az@VBuZdJGB0F$!Ahw&l6@UivAqhXo7{~va? zwww7_C#x;jJ+Hrsvi*pUU`*Vj%FKw>g17^9LdRS4EB z&%()?>&Ox&f8;#l1SXD43yTq5+C=tHL2yhMBA+s#=}ph{#@Vsj=5eK(`MTS;1w=7) z?opD|zEnJ(t7VgVaO8k^#~pAl|aM z5=`FHLvtZ=feGFumByvg?~Pn)fr~GK&+5;P=o)1`BmKPU8#Y{~ zF*qd*Ogx_L+>(s7mX;l3m9lLe1=Z}nJ;^j+_sFXU*q6^2z#vbD08oXBubyZ9(#k7P zPP;w7_HK6(LCJHdi)h>ytX^S2o%t;2u7P*|-ucY}@QN1aSs5Z(g!-bZn3%;)B9-dR z{r-64z-9>TslVN_O3q7T)7l^I$jhOMvqDKM7m3oZyWl*0o zPu~FD+z?Vk?w>!rOu6ax-TFF2ZqTA(9C|6Zn;W7S03JRpy2h$Q$Wz>?(#lKUfaF_7 z4DJXYGle`k@Jy-opmBag9o-$>dLvb{@(>4&{XZd)NeqzLl;OF#-SzLcB|r5RxyJVP z&#*<|NDW25!y=?zfiXkeLY0u-O!plbCLV|8xd0s{w z*xvrUn)XuD*jLNp=t)!A&c^8`op|;)xuCs$HwO2bj_cUnrPn3TzH{D={s^}Yhc)iU zq|NpYH8otjQInrHQTIWiZ5YahtzP_w&B-ysq1qi8`B3c&avqtH33S%sth0t~aM_N% zUin1WUKgg~YrW6k3r9=KPasJrj4m!tx5wPFquDr^j)BU{+@F8V^a~fB#t~P|(XD5v z3p(jbO1ir{IB4Pp4eq$cL<7FAKKNHH>|A;S6pJU6lTdzo6_%NqbghX%KwHGr_*QP` z4OYGJOD60PzsjR31~y)!g{I{zd0pL``BEmT%ds&9(M(VG-^^^zW_x`Z5q|Ei%?Nrz z#k%D=>>Q?GZ(EqSdTCsI#7%dB98W>O;3xD^_^;WZK^OA}VPQJlAlq+cJwm-s6s4{kkzpVMMr)b3-N?56I*izYhAlWU6afLo_W^774Qoyw zI`6f@msaC$&0o_0PQF{4e7CpP@gMq|_CFyhH8d@Qm>J63$@r|ELCbkPvh%S>PRhqe zBR5Nvq)V(sp){Jb%4xWPsh& z|KJkr?G>>qjzlaRx$m$=iQ+!QYh~T^(C`F)kqptw%KoDc2VjpLe$##J#Ji2ajt&@Y zHBhD(b9PoxfJJ75)l+tc4oz8B?-rUtnd4!jigEloND{qX#ZJ6NMuD!4d-&(AwY9&V zQlcS`V`Jsl>eGWOS6A*(#ou$4li-1joqL(ndAp>QMC5uGY-~M8`AB(0F)ZelnePyC zOw@d?_nY@OT-+JsfcKal=yB1DryWi2GS*V8+>RTHdA#!essiWhGtU^)`{zKK+4rOwmuJd*Oli6;xRzUcS83AUOexBYcb zBcpN7WbzlrdRnRCj2Jlj9Gq3$w7mUnBcoY70n;WY5(0))eFst}b9PCXzsMpxD59^r{??G`YqT5HOHDKZ(|z=v z0lN|%uV;DW8Lc*{(mR*U28D$H^zUaY#~y7t%78R`cXx|7hM2cZ^8S3Wme_eaIy~Kk zf!0J}*buIFCf;`jzzr7Wr~QkAe!qRNJ7|HR(&%jR`23x5@{?Gb^p0zb0c=Mr6+Yd1 z$D8u!6c&0u>4?bt>uAY_yy@IHzlN)3UbZH>xo3_#`Q=vfceUJd=^iuS?yokJdus`y zNXG>@)b}NzYW033pvs0zxnu_Hj)Wu7M2e_Id1+2GyCJ@Pzalw#aQ%Qq@xuDtG3n{` zkLpf}m9lsom+|}`zE?m^R)E!mqE|rQfa>RsLBCW(pD3NGu9qY0F5On`!Y#fyWZFgM zV|VzkWJj1`#Kbi^@jG5^2v<)prN%z%=Q93e2Yi68yq$KVK93gFo})`ZHfsfGjgr;U z(*_%pzn<4pTD7GcvT5A!x@f$3t+DJW_5Mp;H=bY1OXPeT|4cGovHysG*$dixlv(g`^< zmm-PTIKRcfpn5%I*w(E8h~&*JZ^XgFEMEy?XZTRy8`e!Pmx{RQ6DxrNuOyfQ5Q=-O zF!gL0ZHTpWK6$X~zYxzk%c|_(FmjWw>f+yTu-C4);et)*pNB}xU^{yg1s#NkKRp7x z*Y{jourP0VkF;T>HY|v2AfRetOH9U)HE0JS($o}d$+@?Z>Z9)7dSy=`;@l_MrIBRj#}~tX19y%RG=s-vrwGXvJmFK zEg1f0&&QpbnTbzm_bV|{!{LC={NB|AKtMm-$#ZRT2?f9=E}^J6xL~Nca2*q~U-tgJ zlF!l-9{y$?8v|;yP#k=8_4z$@Cny~9t@nU06(1f^sZebD8t$e!jMe3rrzbo>EI=`O zE4Q+?k~$_PAmBY(R#sgd3cN7iaP7B3Lil6n2iZWFIio<~@J=5#^ShbeNT=TV@?&)4 ziC8p@0{39j!`qI*6AC1xe!c=CLVi5m)Msy5E=ks;z#RB!x)LABz*pHJ4h znfrWzYfFiDjpjKy)fAU8{R3@+qBagE{?&yIj%J=but+`(jvbxDVe3(ZVi3jk=_Odw zp4nKod4Ns`PNerMnHX?uQu#P`LYeP|Den`9baBm;2|E!wQs1CUauCWvoYF~P956rR zya}biG6x1jYkG%oO4T1B{{p?wO;D3K=!d7SyQ8zLRzhAL3>EO9jm^*mL4+igg|;$1 zsykUY{QD#1&#&DtKT(4=;&yKzRDWK=qO67=Aa>;v5VFa$&7sSA!Gtn^;TxNo+47!n zTN`&w3^nzD-|=x>UB6kv+uQQqVE7U&8$^*rpabydjyO<|taJk_@4#pM81W}~O0A3H z=L`R_fR(*9y(ZO5lkn2aQb$vbi~FpN&|{!yBdm~682J9ZR0KjI1pv_i0D!rBcy$~+ z#VD1Zlz*-a?%QAxyJs5+dD6GZgUze74tM=I1=yH&W;nTch{{P~?>sS)D%)p9L%2;H zMKUUb5*QT6Xkyb>aIM-!DI(tiuvxaceuA4YbauS+LOkj6P(DvyrywO2CNI2HmGx}Y zWK8&ZynI?%cyO)uH0YmvK`8=|{{Z_ATvlkorrz&-3wZP2#WCDdwwrmK#vDO<$M=Q; z=wNUJc0`)3z?|K;pA5M&7#GjPJg%iZ=OPqG-g%got0EL5LWqN7wS|Rb$g1~NFE72; zO2urQ0?%I#@M&oaH!HU6(8Dmw%hqv>bU*5CL0tM0b45DcdWt@6!ND9^-~;;(!7_jX zF&jWZ{Kj<>eaGFEOzb6!z7|u9H5HMs=2cVE`1^4Eb;9>5ZXX5t z>`l1h0h2?$87A)Y(mx?(X9tD}VDQe^j$Q+$9d|75o3IypwMGU zT0lvc!+tB1Qt>&)VNzgA{jWa6T#{B88&khFB~8mBV-?VqlcI`BdJ20%hh7B%PCh`T zlrINlt(!lMC(HLnIKMBtSeIaP%-TB6lZ-2ak@t}F*oonz%Xj2!fvl7Va9`2UI^ zwRK?;M^GSS#t5ELSSq*u~%#Hhnifj+G|1n15K! z5+BCq2CtH-IcCvX1(mV<>YAsMO!-;1RHy(>q~pC^aFohg+S0bg~nU}Pif>F z(@sg?j>J~O*cMt^>P^JX0TVvA`D7E7vOm$xWJ70XDk^z55DN*Kd@YS+%}Dsu2Y=1) z#G_k$!Avyh@Oi~>Hojjc4-g>W2?TOwGmZ{j{Spf^1^GW>3t};UC!gcXJZE)vi4C0s zyPFw=g?&8bW%}eAG7Bs?@>J3z^Fxp?L*=tnw0PNs7V2aCw-UPshJg0CY2> z<#CH}^73K9m2hu6pa0GSt4~E2ck;dh#|fU~!@?%o*KZ#tZ4}UGq8*4c6EjIRu!)iA z8}!h7+0)R*5y&uhFAOV#dT}`vb7eC4!xCu1@@Yw95lYFm@2g&qS5~?fJ(}Cg8|&*! z{47ci!h6FLB7J>@3>5_zHsxfLdqNM8cp5J0{@9MhxJ>X)&RmUb^dGN-U;^1~qPqXp}^Q-qs^mjQlWj z6eCk`5QUB}?92-3izpT*4};_5IZI1#q&+>|fVzKm>*XyfLU@^XK5awr_f6*?tZ!=Y zNL-^9K1(GykD9Q~@hB@BDU3YAO44GY!Go~`^-Lcw7U`IR-I()C+l|8DY`lL>xmo%9 z`B|2U91Q)Pp8h;~(L^nX;BUoLm$I}xKcBMp57XPZhcKjPl6dl*I4tT`XvuDd(3^3JFgo@Ly0J+Z>pkbxD)q=hrLmcOjE;o#E2Mk?`*_{t6Kn6UsZkjE??F*4?@P z9U1w)vB}x4jO7GaRbOB3WkLxcWu>NM9-k3}khCXw{ghn!{nvK{LpwC`=NjwdtF zX6OK6@jA|~#@@*9$uGfUcw%5$U82pg$r%`QerO&irlP+Rv9l)1Kdq-nqj$~Jp#dXl za}0s?#d zt@+;)y|Olv{;a5=>^vsE_hMnGwSL6$OP`&c{kACK39~g$L_an4P+`874$0jUHbo3( zFkAZr*z^AW=>@Q|QP~_UxUl|ul_WzEe6OGYa;!f`f;d3N{je9SmrL8^XSO4oYbbC7iJId1LZIIZdlT`K!$q45o%_HP7Y`gI7^e;V{BB z_720K{nn*a5AQ#Vi5Ge%QQDm&FOuTV*wX5Icrv+^Uk5b)pKJ$M{j$+*b@1sfthLo} zY^u$VoRPJ0Y0T=T7A=fFNA}!2?-RV3KRPZ12W5NI0tY3N!IY>wt}c_JY5$A1*L?J@ zpCfSW9Mf&MrOv~{n2qmF5(v=|K^22#4DWL3^j|(``bLRY#WnrhT)^$&)FGv{OU>H)LU^tZl^ov1lsX+i zit=GM+T_)5laLM8*J%J_wW1_$uKAt%zH#XO+(nMug1j&gnTgWX_zZ1i7G?`Tu;^>{l5 z?AXygZ0!7ehM#gY4Amb*wi7IDN)^M5dQ)XpKj1)UP(CDtgv!wXu5iFqM-#>m`mgDj z)YS-DoYD2t1^C>X%?6d~F?&fgt`~TrcuHzRld?FcxNlIq`C|1VBw5pB0piOvagp2o zW)ADXEm9N0KjuVBqW#E{+AtL=HN(Q-Rq?iwAf*(NR5ZL&l>NvM2FiHZc*-yaT9ruT zz`Z7;ARyU@DO#`WygWuE+~A&TC>0l;7>#&vPJt>DPW}^CL`Wdk8Kw)0_-5hG^zko{ zTqj}Fr#;}7wiu!&dvvq10exlfIyj69v~(8NdGd2&U>ea0?VR&K_kdzCs(f?f2Dyb-`xf>XRa!#631i zWb@XREB~@+UK|}j-PXHV2OVob&WX;y>&n_NC=Ve|45v3_B1z;MsMn=Mh>ng6&ybCV zrhBlunjKcL?~M;+XJ%%mc|%Kc_?-w|ltY~vNtG;NthXepKYg$3;ygI+L$+y84~?$_ zH_Wm%HHQdH>K`8`BNW5VB=W_cOBwpK872-2QGzr{@M#GU80HlY%rK!N;b<3mL6`s{ z=_#s;;5^ub}=1_}heC2{VvXBU(ksEQd&9-jeQaHOEZB}h>Jm{d*PDrgZMTyiMgjl2up;bToH zz))qR#R&>wNzkPnc5x|)8xD6N&18DZjh?*lIs%0k4WW(yrG?XCAR<+gG>nJZCxefa zC<({X?Zr26C5MAZ_7{89f&pMdC?$gR=wU#{oxA!C1Thz>ArlQ=lTQ5P{)^F}QJFp| zG?cPa)%0^1%LOc77pK)GlX;HE!ux@U_%lOwtRX>^DKH|c5Pg@xY!DIRb~yuyq9K0& z-Xn%X3nq2)0p9rSO^*T&SvdJ`!n=>CYk8`{iSlYDk(JR78tXWOG6eDZZ;ufljbptw zH{shDY2UKZz2N-i^!nt>@Jl_w&~C(0{0z&rGl;XYutu<$n?eSQi8~ zjZyF^{cs3<0iRq9Os15iY>|ze(q>^ma9pZ)$SeKZ{H_o{^cm2=)gtm28>{lHvPiVB z8{Dh=vmgWAFiLqLNx$FVRVXS#YhaM5kdRg&nKt8;ONJsdQv5I#6%9^MUv_CBRe(V@ zByYEOagT6QG{iZ)O^)L-xYTwQB}bVqDpDY?O0$5iGau;Q??Qm4ch$!ZGZ8VOxJ5XJ zuEj4&c=pS*QfDc*?d?8_gtBTV{PV3hu_E>GuUCfXp((IM?crgKKf1&MChRhM@ahvY z2hQc5YoB&G%rAcFQ!ONWCb6tSz;ArFX*i_7-?kY-R<)$`|te-Xay4s-+MLk--5xda~m zWgVju4mmFM8$5Jsxkz}Er3CCuB%9f}6WfKwQwm*PR)K=~V|)6SMUQ>^sL9qETW3VTJzpTgs4GW9QdU^o@40aUuh~v%hE90<^#sq zop_ZHxMFzFbK2&dHhf*n>&#k=jG^OO;1Ya-s6q2ON|DEAn%Kf}rp(qpqtkS}1~Fzq zpP4-F!jQ3VkR83(C8+w#)lhuX7shR?p2#jgxK8qg9p6Y)x6qazgM(`ns*5p01v3~5 z);gc|*4WMib*r3pR;!y$Yx=4DS)~_4XtyVKVX#Pvtj5vmdHnB_dj-1n#hZFoEm=S! zg)WenF04TH1NN@9Zu#6XqRsQq-_7Q6Yp<_k_o5Y;Q^)oPDGRww^*T1KP1@e}xR(JU z=m?{uA;Wy~s7TQQFqD$qAMVgk@j?{kt&h>7xTMLia zxq4+I=lV>B-lgMp^LLKmvQvW&QE?mTWoY%73m*p7(g)GcMdg}!%Jn7{gquv4#y{f= zxNtQ^)!WR?7*J_(h{6UaNA;ME*u*6Mdd0bWE}z=(SMV>1!)m*Ur^m}||F{(*uzaBs ziLGM}gDa&U1`haXGTLDWqWhi2J?wHr)S7b(%o@Xt6^`KjHLqbep><2gh^18<9)1gT zo=@dy#wiU;H;@%mk^9_7eU#PK>df=&)Q%Yq+a_U8_tI`O^GnOVBgZh4iGV zrh~0FeV_zP+0d|D5N}4iQP2)&SMK`vrPK0rJtg9%1pa0ar2cTV0TlTgn{qwx-OD>6n66zY?jux{ZS4}WwR3BRMh?{*IC(>1B78q+E<7~$Gp^F|Wa%OA%ZO~ly z_vEC7*YLr2`7xVpPx|4MBTIeB6L??!P`7X8%b7IF`j`Sd^xBQv&Aoen z;~gE&X{5_e7i zqgVnbV#52X?H8!7t}4@CYT+h;pWpO5Wm9M}W6JxaHXL7jm{Q_&(Mld|rnfq0M6Vo9 z#7$#6;E7Wh=8m5T@7d0bv-4Dp6<|2_q_`x5VRoKJf|E<)OA6Cq%Ff6q64F2K=8?)J z6V(&`AxC&c1cuxsYEZKE2xrO&t4vzq=+x>Mvk3t^S_t0dIsN}`ZNj{QV75Zra`Zu6 z+n3oVoJRadQ^(_IDqYiE0-_spvJ`jP&1-^f_f&B_jC5vosgE$jQ&I<|ct!=1^37*^v8V3OOrltzpb+Lv+>28)3iK z13GN&ze?9Rw`03%-@eTMx$4}n?6N4B`{7|i1}yx_*YuQC^faH9S5@&+R{U|Dz~~FN zgV)-g260TAR<Gk_R{Mn>AMIOtQE@I* zxwPe@>`UyOUo?GP*>sI7>74PNNGe{qx10ltUibudCKd8tpEs}RGch(|9@*Ig*>hgk z8_Iv%eGPm11r3^ljCX2y4tC%Sd+@$r;<<`DIeG5a2I9Z^D=Xh1Q{tyflnL?7at@C2 z@V0H3j6Z`#$)Pv?PMCjgy<;A1mlW~?B*kgKe{8}MZ{t~!sZ*x(v4W#_jI0k&2`aeLjv>LG8PwJOKVYon+X!|c6Rn6obGpEiMkJDK9}}&X?$E6 zcLj~2d98Z){NumAKv+xhJOt{6O`< U7k(nFgB&0yr7T$~Zu0Ga0ci-u=l}o! literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/online.png b/iconsets/roster/default/online.png new file mode 100644 index 0000000000000000000000000000000000000000..54292d58d8766dbc3a8b4990f5432d2c2ce1127c GIT binary patch literal 986 zcmV<0110>4P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZqxh<%s(_T$@` zJD(YT0;T?;s|5%ktf*d@-RZ{U_z(Yo&ia3Qvdhm_BgQgL76xIU6f?S7fB<4b7s%mc z;E~c)O;NJf;AePtg+W?ZjLkqpB3y@yK?5kwj;`{Pgnx75^Yi-W z>FW92?DGAxbIkyx0*LWQq1|)qx@-xCpD!2~{(fX&`1Xc@;muP9hOb|M<^#j+2hfoJ z-x(NKe*@)#>>ogvegDF6cKh$&Cd(PL0Ro8S|M!;{zTZFM!O8K9f#KsP28KUBAsQL~ z05$#syMW;rP~#_{fxm&6@jJuMcmEjP{$O|j^nxTn05PlmdwY}V=@Tn4c|kE&uD?J< zK->QRfY=JM@$VN1{s-~S&zFB0P9A4?I`JICf}0;1?g9i5^WNtSZv=mQzQ*?InU=V~ zducZI_dpxpL%j13sF49^5aVxf_$gU6R#Ow z=&=9%s4nv}m`@%k@*n7YR!|%<0%@QUR$ydtvNC+Q`-frSkzZ@(-(=VYlm&(|!wY}_ z0!8EhDno`}YT`^xJTiPhh1?APS(z9ZIe=2^z-03CAJ8|y85mjqF>s3iVi4u|%Fe~| z|HHRG44`QI4iG@#gybyGz#<^Pq|GJ4$-uzD#=t1d1x_M=o&lZC$il!V%FV#Q%fY}U z&cUD{%p@bv%fJRy@E7EIfB*s~q+hH|tU`RulB~QykFv2d{CWDF;r5|dA5WkCc2Q58 zT|?VSSd3MclY!|MBZB}3gCHL}0}lhllZ*fX1UBHz^MBusn0_C6e*9JJ@4t-S_8=K%08pSU4+&$HZvX%Q07*qo IM6N<$f{snazW@LL literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/perr.png b/iconsets/roster/default/perr.png new file mode 100644 index 0000000000000000000000000000000000000000..9152973b927f3e8be343880ae75bec01a106e6f8 GIT binary patch literal 792 zcmV+z1LypSP)suPh4 z_9EGYm8};kUU;)zMX<1zLWjf&mbM5|O1U`&X@5A9e3gAa58-$4hc>abtJ}z|yCQWEe!0!Nj54K<7y7c$Us?WD|8iF4) z55brOgR<7#y!{n?3&3x1OL}@lG8vJ0Tr$Uw6+8Ar)G&-mZ?DMf*CLM|$!24tv_X&_ z_#xZWBr-WEGB+nOF(DbRcQ-^`gfa2^MW&}kW@kl)hvmN0nL7&I0Gx(!wysVj5)rv} zO(YVLtjAOAhEN24mJ=sLqEV6YaglT9eeyLYplTU)^wa2r6C08b&7Twl+fN~KzCHk$=aLo-dNsez>>n3*9F zkFRyUe;+EDKL7wcf!IPmzaFsLTXeg9XS;M7UcO{LlgYJiZ1lZ?sofrJPuiN#G#hl& zw4m!?v4G76rb*S2Bl>ZNqhjA}ch}MS`qA%Bp6u5Q!$M^xR98bq1t^8XYPAMjuE2|x zmDFE_LSipK{o?gTziDd=VHi6hdOR#GENtiwhhFA(TPPOMLG!y@{#WUA>fz>Qq6E;# zyx!>7EiECOPH?&4@L`_byO(Vn9qs#LadEc8=R2h;D`BG?Pm+xcR#2tdf~ z9+aUWc@_@mjw;o)H|di44jl^1z<@mO>U#T`)q3WGVUJ;i_ci}V-G*`g^YZe(()(YS Wm?w$n@ZUoK00002BR0pdd@S zqpu?a!^Xav-+_~Xe1&9>AYTTCDpdxChGqtapZ|gMO9qBg0|tgy2@DKYGZ+}e^C!h0 zbz@*)-011z7*cU7>CgZF_ROjb3Jns4o@=<%Ua$wT2E1!ou$8Cv#uY{u0ll+)4uAe1 zp4#;Py}#5S_Kl87H?At0M@E(Qb#e*~GcK5DGpwxHyMlo&Y#DPwp&1_=o23b;59FpB{FzOb?Ao`tQWgI_%(^I?63_vS43ZI3XN^=?vh;%SkO zVau{O#;~RHpnyVygWd{u);V)dGVah-`14kl`S4s}hZ?REb>|zD)Ymid1PB&1Tw`Vt zIMKl3YtQI$V4>s(-i+hh`vs&T`vhO8#@23lE(G)gtINNCdIvr{mtJMOvyoA4J^#n1 z28|1U-mmyH-`=5#9qgh&|FpCm77hhBug%5|4U7y6f+wBb=2+SSjA#Z=S3j3^P6* literal 0 HcmV?d00001 diff --git a/iconsets/roster/default/xa.png b/iconsets/roster/default/xa.png new file mode 100644 index 0000000000000000000000000000000000000000..e859acb94abede5c73dd1ac3e2dac75518980648 GIT binary patch literal 953 zcmV;q14jIbP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00SLKL_t(|+KrP>OdMqZ z#ed(-&g{cwEenN0SBOiX6~vm**kGF)8=A%#4F}`Jc=FPicrac(8NGNj(Rk2= zHZi@}#$F6!V``z1Qes<_w)`m|D}NSdWp;;|Z)Vm5jR&HM@A&fG;U({<@-GsgJ>L+0 z|Fc(~{XQ(W8)vrMNxy;v1pFVh8e;I5PlnBk^F`(Ur-ROk6z>6bfVw}c>^C%szu1|1 ztLLTe1grNrd@QZMdaVBSxJoAw-k(p$?sVs%f|@o5{5`*Je68Gj+{f3G`qAtTG4(&)Q*m zI?uyL#p2S2lb=~}=f?BF)rn0;#Fe*?=g)n7A-!d9Gv(G$at&%qC06qmvHT4E`d!l1 z>!3;S%dooxw#BV$QXcavL_hd%u(J} zxire7561cOL6M(W`UAS-V_9WpXJ=VlTto-~fRqwx+az_BQk8~L9j3;x!U~uHYyfu1TUva) z<_cmBF><*a*=!ci^Y+S8qG(}k=>Y-JRD_Otr764+=(dLs1WNh#jT@trkJkz=2q6f9 z0M~W@nXzuGEG)0kt}mguf^?jut`OflEkX^-R%y$O)KsOrpUY+SBb=|k;XTaY1 bFLM6|@>*Ys{UQFt00000NkvXXu0mjfEG@bN literal 0 HcmV?d00001 diff --git a/iconsets/system/README b/iconsets/system/README new file mode 100644 index 0000000..68076ff --- /dev/null +++ b/iconsets/system/README @@ -0,0 +1,79 @@ +System iconset README +~~~~~~~~~~~~~~~~~~~~~ + +For general information about creation of iconsets, see psi/libpsi/iconset/ICONSET-HOWTO. +This file contains only required icon names and some details about them. + +System iconset, is a special iconset, that contains icons that are used in labels, +buttons and other widgets in Psi. + +And a little note about animations: Icons could contain animations, and system Psi +animations are a bit special. Their first frame is used only for creation of static +images (such as in popup menus, or if Psi's alert style is set to 'blink'). This first +frame is not used in animation (since it's stripped out of them). + +PS: If you would use Psi's .png-style animation don't forget to add animation +tag to the icon. + +psi/account - Used in Modify accounts dialog +psi/addContact - Add contact +psi/arrowUp - Arrow up +psi/arrowDown - Arrow down +psi/arrowLeft - Arrow left +psi/arrowRight - Arrow right +psi/profile - Change account +psi/clearChat - Clear chat +psi/groupChat - GroupChat +psi/help - Help menu +psi/history - Chat history +psi/vCard - vCard/User info +psi/info - Info icon +psi/jabber - Jabber icon +psi/options - Options +psi/toolbars - Configure Toolbars +psi/pgp - PGP +psi/keySingle - Single (public) PGP key +psi/keyBad - Bad PGP key +psi/keyDouble - Double (public + private) PGP key +psi/keyUnknown - Unknown PGP key +psi/playSounds - Play sounds +psi/psiMain - Psi logo, used in roster and tray context menu +psi/quit - Quit +psi/register - Register service +psi/reload - Reload button +psi/stop - Stop button +psi/remove - Remove/Delete item +psi/search - Search service +psi/sendMessage - New plain message/Send message +psi/cryptoYes - Encryption enabled +psi/cryptoNo - Encryption disabled +psi/time - Time +psi/www - URL icon +psi/email - Email icon +psi/xml - XML icon +psi/psi16 - 16x16 Psi icon +psi/psi32 - 32x32 Psi icon +psi/psi48 - 48x48 Psi icon +psi/psiMac - 128x128 Psi MacOS X icon +psi/psiLogo - Psi logo. Used in the first dialog. NOTE: the leftmost and the + rightmost vertical lines of that icon are used for stretching +psi/smile - Used in the profile creation dialog +psi/ok - Check icon +psi/cancel - Cross icon +psi/done - Done icon -- TODO +psi/close - Close icon -- TODO: add to default iconset +psi/apply - Apply icon -- TODO: add +psi/edit/clear - Clear icon +psi/edit/copy - Copy icon +psi/edit/cut - Cut icon +psi/edit/delete - Delete icon +psi/edit/paste - Paste icon +psi/edit - Edit icon +psi/edit/trash - Trash icon +psi/tip - Tip of the Day +psi/browse - Browse file +psi/play - Play sound +psi/eye - Used to determine Hidden group visibility +psi/upload - Upload icon +psi/download - Download icon +psi/filemanager - Transfer Manager diff --git a/iconsets/system/default/account.png b/iconsets/system/default/account.png new file mode 100644 index 0000000000000000000000000000000000000000..0240ab6e18e5d907c760983bf23717247d47c49e GIT binary patch literal 969 zcmXYwdrXsO6vofjuawfh2*V|`1II_BusMceB>|VU)N!4n&R{ktVnsW%u%%?mCPHap zv4vzJ@s@fiP27^jxLLX_7G^C)F0w%>I5sw;D~yef+h{4ZExo+^SoX&`PtHlslXHH_ zY1y}@D3UPoVjREw0jq0;ZE7LeD=l1Wk@(`!1E zi#}6|gdL$((w&>1LrRfYCJpzn#>efh^D#V?T_g<6ygTSxa;#&e-QAK`^bK*i51pdo+O`b1rfvN+ z&%Tvux4qBsrKnyijSO0=KJRf&r@hkakf-o-wl|L8)Df4{CTFEx(WBw=%_yV%dzA6y z&4# zl$WL{1RQ)B=DJ2kU5{)MssTnB&Cgv)sH&<8UcPjR!{hV$7DaFXZr0Y;@-0d{;_}YF z&C1Hk>hRzDWQq5psGgToGdCVfDS%+^Z5bOIV;PM`q*kkuKp;S~v$LqRwG~m^Wsiq% zHk*0Os3?Ag`80js!#GkaQbA>7)}4y`9HDONhl}YbeQ*15e<&dAou4r9pZ)W6$ZE6M zT$4Sd`h1G`=0=$cnv$v)el-><6bcQ!!M5`523?~@qnUEr^~fZ5uwFY{P;i#m=!=Bw z)HUKLZ*U+ zMZqD61UKR0ATHv^)-h>I5gck1NwPJ`rHVGW++068`4T>agNvh}Z%}a%oO}c~K^z<$ zB4lt7!84uz8UFmBvEp_7ZetEcxivx0mthpknMbB+0>B_Gwb$=&1LQ@n_`&-#0^n)Y z>-b&%#%!vM1wMhzOqD5!bs#&l+Jd+Q+~i1G5LbX}_JTHuJHQ!MJ^`Gh@)y7{VHAUS z1>9j6#n1q7lgeGdwd&jgvH7ey+o)$(IW?)qYRQsyk zp4P`o20fquC5&QO+1m~R5DSyK)ubop^jn2^`2DVbjPJnEQ_@xV|$`ith~00004XF*Lt007wQ^&Awc0000WV@Og>004R=004l4008tQ004y1 z003=Y008K0002CT000|UgXaf$0009(Nkl%WGU^7{-6!`MxtVXU@!IW-^&% z5*wwlrcEHJB-K=12vwv77e)|Dtp&R%qJMyYfVi@5L^tBfg^C-&x(Ed^8ZQmDLVAl< zZJU^cOfvV(%*nZYpNm~u1f^QB6z z*umXb{lL2uhCV_F0L1?cG^CQoK0XnBT4`GI9k0vCP?iG+$Eh|lw{Bj)akACgUb8F( zfF*$coPe}j_&``<{?zF=cyQt*t9NSr_Um1g@+Y)$-tIAbP)X~b^a$_)Aw6Rd5}4Yb_YRY=(r%IHytP1j;AWf9phY7EVGb(q6(22mYsmqH4n z$o?ba=+%xqO8n3n?6^RtCmo~#X~4o_Rd-0_G7Jpmud2HL{OC|RL%7HHi@$7iLiw7V zo!!!-XYn;yO3|wl1Hu57lT@+HXIr;S+D&km!{DL?(Ga8o?8Vzl}ymY(XsI}Lfqj7KkCat}FY&%9Gu9S)Cgcv^WDz6q_ zFpd*WW_iV}LU+zj%VH4fP#A46M&tVt#_*$(T7=1Ta3b&o zfo~QHu4Lc=&9_#&(qHPI>i#@V6pQeqkVr=uV=x%P&=7{Yw*w=QE{j)PNukf`faV9Na7v z+-z~mAQTmc1ltsB2PF+ns6wzc)tZzV>YdSCa{vDCoJ=gW;-+u0r{^HB54Eh2 zio$llBW33nfC`3DCmQuJHDwcze`0X(Bz=9SfiQOV9raC8zXK+$m#^`hbzp;hUZRx3 zvMiFxG$2qLCf3|jYLbafAal~;=t3Kfb)jqdI$!QgjhX0kkgcAwAjA?!M- zy<^P{w&dXLHKJOeW4b-okKEOPVXWfR%A}r@X~}*eRB}x`PV|m9Z{YhC7@MbX{itK9 zrSd@Ju!UY-!?(6Vuw+x6_mGMkryez@@0i5&W$t*Ie*W8ZegMx%%Wk~D9&Z2u002ovPDHLkV1j+o3se9A literal 0 HcmV?d00001 diff --git a/iconsets/system/default/appearance.png b/iconsets/system/default/appearance.png new file mode 100644 index 0000000000000000000000000000000000000000..33c376752f858e707fa7c5fc6836bc300ea13ad2 GIT binary patch literal 900 zcmV-~1AF|5P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;`bk7VRCwB?lW%C$bpXac-}~Kk=k2EHxm9R;D93l}L_htuw95{61*RKzr_CB7>GV~XrZ8J#X$R_GezFN_px!9raFG-H1-mH|9 zB;S{^j=a>2PVBB7t1D%jBqYJ%dT85XZNG5n316}$Ni<6NUrD?so&4pT)L19K?@Ouq z6)Bg|`PRq%4aGby369iL{qx(knd5IgIJ3QsGiqI@cj8G^_DRLZ9mzQ@J&N>hNa_1f zF5W9S6YAQtK2s8++H}3Rvi;i1>Wx>|A20x`jd`hGAMPQw7}6tPmO^42I}<|5enO!N zSp5i$e?r5|)_f*2rCj`F6lWf@q*0l2eeGg}E6>O+k7Z5^+pw2+oH|_t@n9VKX$Ga;&aV?^x$| zqg`h^&w4BEi8V_queV5~Ae{m?hsnkM17=8LA`Sj&c;Rf{#{Vlr{CQq11GmqpVpG&_Urk8S}Lu`_H~KBhCkVl-iFuIYhb-`pGd%I%9P`$L=DH_N5>QDzrq{M*aI7G?LZ;K|!dxHlT6C_E1{k-$FoJ4e46p(W$f19;{?JT?jx00!`ZNx;5R a{y6|=FS{^>76Xm|0000Hs2wNDsWGx9b zM)V7lA|@pxO{vI`KFsOVt(rM&we6~HjkRA49lf3Rtb23Q9(dqA=e+N8&UxR5VYUIw z&)2ZLU&WecbgapzXHDM2_1x>7+vQdl*0TJ9owa;Q%i7~`yfXqP?O~9$$ACQ(OxKyb zE(JHf?|;R6SaTrMY!l$gyFA1aMabkgC==;*826>&#C0OX&nA?{(Z;Icxmwn|5Hj>7 zAsETQx3wbWt!DzIxDE>ixO6{`B1yG=XzwNgzXNZc3jTtb&pC;idPz57u>b?{sS9!{*m z;Hw`M6fwV?qwD?=0h+suptJ$V+M;mC;Auqxo%YIiaJb`eb6Al6jTA8%$b$7w3R-#! z&~O!~K>fu8D2-zsD4;)bISy9WDh#|RKRXoLpvfZcz6G#6D95v3fr==IK!b7A#-K^$ zWX?@pB{=`6Bo+B1zoi(9Hph*fK)s=kTfyZ zqPtc{$4DIJ)Y@WT97s_*o@cfchhpo}Ip!*iZyu8|mc2mixm#xTg)My%=ol0z?@c77 z;x8*jX&-ZB{B-n~zDr4cAVSG`4#>^EWzM+-H{2`W9A1T|lRx48$1II;56|ShH+t0I z)RN*|Of}G+=rDDgKYPml0j&LDN{rQK{W*O0-(^b literal 0 HcmV?d00001 diff --git a/iconsets/system/default/arrow_left.png b/iconsets/system/default/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f5722b251a3624b49f9f2875706320ffe79481 GIT binary patch literal 707 zcmV;!0zCbRP)${Kp_P@E;*PNb z#F7G-5ia%*i!T3}bx`wJ?a076CDLCQ?_Mm{xdi4v81Tq@(P7(PGRG|G*9t^_F01DVU zuVkRtzY3v9<$rt{9oGQ#M4&^Mb~9)a9oh4-!A**V7Z1o9>s}!C+{;OF!ZntJfyu0jPq`{ZV-9OLaV~YjK4_pmP{P0m59uWNBk%hF zHv>8FJzmuSbNEjuhEvBKJ}V*bVVVQ&i4HUMMayTrZ=iQPL4jw}g=ht@{ipN4WF_!g p=rA-1?ip8w)5d|}n>E)a@f!?qU|qDo{@nlo002ovPDHLkV1nc4Jca-O literal 0 HcmV?d00001 diff --git a/iconsets/system/default/arrow_right.png b/iconsets/system/default/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..b7746b35feca0a7b06940c1b067a5a840494d3ea GIT binary patch literal 710 zcmV;%0y+JOP)JWr3w|n*u=Xc zbY4yZcWm6x^ZW*e45V@YI$Qu86f!K31C&_WwZ~}VoWoo<`%2C$GFozQ-k_YSq2I_+<4192hPLk(% z-v_u7mWllHyHFBha4cFjIG=c+~R-x~|44@!NDVqT;pxcK)}x s3cMCN3{8T2##Q08abWmn&9w=B1E@w{9Dj8l&;S4c07*qoM6N<$f^}Foxc~qF literal 0 HcmV?d00001 diff --git a/iconsets/system/default/arrow_up.png b/iconsets/system/default/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..36547c11554aab61651ea5c129659aa2f13875e9 GIT binary patch literal 728 zcmV;}0w?{6P)4Q*ji(Paz>fZ}k#E|H1XnMRPXDVht*K3Jijc-L<=hq=gWLu4cBvmJe3! z!7N1VK_5!cl!^$S=5(b-X0ulNrEZNiH<`Bj^gUO-bJpm<2fp8P&-tA5J?C>d?jOcW z@5*?|ujQ>1M&9Z(@mBAlD)Hq`?tjJ-%Xw+a#oIrmgvJO?IfFRk3P5NKgFio$sNN0b_h^N*t;!EN5Ek-0w#x<59-L~Yn<-Bcb*4&xE zOfZA5i#ZuRFP0S0JrG^Nsny)+$Gq20efc<%{@^C4@VPn^59`?)1mt9#|*>`RJQU@`jF^-3FFi@z?)A@+5`TH29a# zy56JyUO)z&YcBXR)b>W@3a*q0000< KMNUMnLSTZQY)RYz literal 0 HcmV?d00001 diff --git a/iconsets/system/default/browse.png b/iconsets/system/default/browse.png new file mode 100644 index 0000000000000000000000000000000000000000..037c2da98d1c629fd33957baa64edc60197ef767 GIT binary patch literal 1080 zcmV-81jqY{P)mwqz<1P}`@lm7u-_Wk>BJ5^%+ZkvZGVS)t0! zQI3z3gPGyiuYU}Vb_%h}R$p1k!oqau&p$@6MF0WBqM^#0m>4g@@b(h}!`D9y4B8s( z3_q_w^hpYolhoD}Wcc=tf#J)Szd$E3FgV-F@E$t#qVw;?H{n3*AAt-22p}dlR)#Nv z0!$2?91IM<9)4iZ{{Nn#DPKoYS6h(b_iqMHl}znhny{{;vj7NEfl%s?A{uyZo3I`f9%-1|=qzkmK_`1AKK!(X5aKml{* z_D6>MAD9{BbmbYI{a|GfG?C$ZbNr>lpRZ5P0t67t-~ay@Sb(-1xcH4h^gkf9L(b$NR4`G5q_n7a#xtK>)u0 z1pfX10Pyqx0O{iN0E>Ge0QUL(00kEX0Mz3F0PfoV0P5-g0ORQY0PE-Y0Pp1O0P)-A z0Qu$e<^Toy3IGTG%mRpo1!(=Tv)>ss<#`y`g_#&mTxVc-``{nLgXhc)ckljVc=G56 z!?UNq7(P6F%kb;ndyo@=A;$QRf$8@nhW~%B0R#{e1JL;wF1};1Gv;Kt0hE9IosHot z(17Bh=mEkYL9e@C0dHCojgQhAQ zgQOS-13yrW79RtHkPI`!$9KOOq?rFO2>$%WAi?~X;Wse({sktKpI`qlK6(6)=k>F{ zml+rt{{RFK%l$i_8Jvyz8Qg$|fLy}>H2a4n12_SF`}&XJrv(ecH(j%TvAHNx{-T3?rD0v*1#25eqh>^u`|9ew25gu-KCI(>C15?dku-||G_yzPg2>)dG y1=REh$o}&Sltce8yt@Bq5yKybWRPV50R{k_prTCyBf954Ntsf?BjyTdk-C>p`VawC}=FJ$MkJA_c*d6rue9VlIML z5xnH;(Yqg@q|hqZ;!0HNs%Ty7(WKo9opGLIQ$yUmFsJ1=&oeX662MstoL10X=%wPDedKI@fHL4;H*%%wlksTf&Y|GT z*>wKn@V_R27yDEBrSo0E%Juz`KVX+$?Ivfgn;N#E447w2^5@00EEjr%4=2d043VX< zrOF=Q=>D+q^ce|FE}Gv(MQvcCK?b&=447X&lC@{I`0Ldk|J?u?h0W5roqp}!Nd~-n z`><4wZVeQ6wHo`v%&-k*!2Ent)*fHs&t^~fX|y|Bojk=GQzKF>^fBOhCzYS;YTFZL zhHWSV=BEW&e{ez8r%u;x*KYQ6Wiacjs`nqHDwpS{BRyezzOgY=3L40Qq3&YG!Wxzb%Bh`@|>^mu68+c`_ZG_f4 zW7}95W`=Dj1Kv2EmEXA(`xXV|H05U~Zi09sVXb$rZ@aND1KUsr%v(rmMDms>&<3tn zhU(eYcp_nKcgD6Y%naL52FzODi6VuIS~lUwK(-N2BrNI9m>IUA4EQxsNnvNEbq~mP z98Wjt&X_s24P~eOJK@Jbwm0LM@GvuMw<`Yysl7sJoWkVw00000NkvXXu0mjfsbDp8 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/changeacc.png b/iconsets/system/default/changeacc.png new file mode 100644 index 0000000000000000000000000000000000000000..66a9fe80d608d199e0e1ec7d83639bcabd2d05a4 GIT binary patch literal 782 zcmV+p1M&QcP)Tk%vMTSSD_uy@}eS0 z^r9{bg2JmH0xRgoi*AApq?;lNAtaZSiaC`O)TzwFrgL+1`{(BN|6eyQB7*`Sc(2~) zc@MnL3+xfX{~?((U~81nQ?Wt=|F~2H?Yr&gVZc(@F>h$WK z`W+d|CSr6k}g1fgyN zTMu#Nq^ubL!U^U#a58$jgO6|!a6ck4L145{$~gRvNbcnE8=eOQ=xiKG%$ zE~AW<>$B91+*mJ4RqdxomZ>S9KeXZXde#7N!q7INj0!a-$!3v6p{1l52G~D;;xm{M zRGqy}EqYk^eCyIQRV^)!>ril_zPz#F!c|*s{rNt7zg;MSMwg>&uY8^mKP)!*b9+u)tta28}CBb|g=5o`Lm!T)76+l1$ zw=;_x8503vFW9*Wq-B*MS3p6tvIv<>fyfpIpDzr?n0JVFM<$p1oiFU0@d!WbWyxlc zCkv{~qHJrOZb$*dq#^`4EpdE#=}vqf@Vix+^oG|@1w#?cJEwl^aw1*T+Sb)-QE}i% zDF7Bgcqjhy3yRFLbcNcKLUTL~AOV2mgw!@4=e8E7zXDj>rP&L90zHKsWJop;cmMzZ M07*qoM6N<$f?tMb5C8xG literal 0 HcmV?d00001 diff --git a/iconsets/system/default/chatclear.png b/iconsets/system/default/chatclear.png new file mode 100644 index 0000000000000000000000000000000000000000..79e15acd2f83fd684696a875e6231b69d85b708e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?iy0WWg+Q3`(%rg0KtX#? z7sn8d^T`#*8{~}yRzCP&ACkx-e=7Ay{~DH={jMCLmTh_^mp9z#ekGSw>)67{a>wC- jxJxVZy$MU)QXaN3D9sSK^I%st$QlMuS3j3^P61BCpEP)LlpwB6OzX}2}jJKg5BO-;-eS$U((3ph#?o3vt@zGzI*ha$wQP+Qvqm#Z7i&E2T0yNvAY zQ;^GfpGsx2|5qR(;h-})Ie*3D5ivG4gD+n~SYO}3#>NIhq3@WST!0|-Vb`vL6{V7Q zZWAD9n@*Rv=JgI@YRZq9nYWmjm?z9h7$2X*^t2zdvy15Kdkl6~E@uVud7n*VDK9WzQnCtk1;>LB<(Q_3=E^G=_-wqkC>SKJQo|AA=qqH=;#VkFW$H>p;-!izr&96z%wN7hb>iZ#i!!`SdA>`uZ*yjm5~! zJdNb!Ttr9f1?nK3XFr%Kb6;5aJ+s$)heqqh$B%(uorJ({i=~K*ONUIhmz8LxYqX4- z&85-^Lqjjfc^x-yJU~uPHMv#77TCUVafge}cJ>%4GY(xSwx3)s~cGTPrH6 zrzhNrmX_NnDRC1nptRI2_0!sV8&0Peg@tFK)tc8LBX`?KfRh9m=#4vdy4;n+htEp4 z;c{J*Zl>_e= ztEu%uioM@Q&h}06KLSMN=#LUk2l*X4i~{Y6DitrvWO^YYVmD8O@IT26KLE{n0h?>C RTmS$7002ovPDHLkV1juXnyLT* literal 0 HcmV?d00001 diff --git a/iconsets/system/default/closetab.png b/iconsets/system/default/closetab.png new file mode 100644 index 0000000000000000000000000000000000000000..597a070aba1d38f2c3f131feedc2d174d886e4e1 GIT binary patch literal 529 zcmV+s0`C2ZP)F=*McIc_)5|-NHxA62`R~uKCJr9qQ);$}XF>8n`~ga1HQ*-@KhSY22xH~o zdGzhWb4NB#zUNvlIlF=4&w%(85I+VvA73E;ym4?g!=Inu1VNlXzrG89efLBZ$h-l> zkD!*|j)jX`I)s2WZ((3$V3g8w+RV(t_UrD6WntgmKLZ)U3dD?f4fy-_*B*xd{}rUQ zU6)Cy*`5_swOR~xg}~jDD<%S^HG!B5rvc|THthv!HWX1XS|z4z0rK;CaTTj6{F3TZ zfB*O_b9MKmg+MViAm+rH4h;S4LV%PpRMAr)J_p3FmCYkMfHWu|rGZ!&h&h1xJB9&3 z@B@fJas3d8KSC4CA0U1K#K(b{AFAdDRu@1`eT*e$K!&`6V%$j?lr%{N009O7o$8qD TbdBU?00000NkvXXu0mjfsoCkX literal 0 HcmV?d00001 diff --git a/iconsets/system/default/command.png b/iconsets/system/default/command.png new file mode 100644 index 0000000000000000000000000000000000000000..efc3a71f2d71af36352b870545ff5e1fceb708b7 GIT binary patch literal 796 zcmV+%1LOROP))wm zz)}!t|Aj(8aM!L}*hN-t_aY%AA^|@T0>Ev@I22xIXUUBuC9J7j*gE0o|&2XxZQ43PzuYo zu`KI@WPmhH84L!@&d##Dy!^BM(fGL9-QDFXiYS*#{PE%iZw3Q|5Fd1*wWi%}v%bEL z@B3pmLSR`I!ONF?_22>ZJ9qf$;X^X55mLSHWQc3`7jRwCzdc^LN zC%k_33LylxZDZMX9zh5}k|cPZ$8b0Vz;+ymIF9-5{(TCbN4;L>i+lGNuhlqhwRryQ z8O9jWG$l<_dc7VK6BD^3+p;W#5Tv6K+HnY@h^LPqqm&{FLy{yxYfT)-L{UT(MF=6# zTE7(lux*=awMwyA#P@xo;gC@rBc-HLsW2Lia9tP2anM@hx-My&z7>#CBBjLhJPL&Z zrBVr{6prH{gdoc@k|fFRFbs1c09y!wQi|#6X^O=n<#HLN6t3$cr9^8@k|cy-$Z$BM zTrN|u*D=OmS(dP`uC8tt78WYo+uNjRN|GeRag5fQEX(rpwAOj{EX#0Rmz$fLk#%-< zmMEn@3xeSC@bK_;zu$Mq#>NU!6cL6YQ52CR3B6uV@9pjV83e&!-EKG9-{0?SZf>p% zKmaA6ytK5m(rh-rX*3!Y&+`yMV2sJzKR-VY*4Ea3+}YXr4bZ@we9vaH`Ga|f%gamC z>2yrD+cgv}i**mOD_V~jCD5Dco->gTt-{A>FCzBM^HdAC-pm6cNY0=H9oo=3Oa zWn*LGXlrZh7og8O`~StK^Yimx&dtruPfbmI;`_dDj4{{O*MnB8b$)Pg@bvWb^jF}Y aTf)E7D04m{(6~7O0000)u014Kkn1^4&({_*ki{s#vI#oXNG@BRJ!JR2Jo2NM$z00II4 zG}hMN*7*4P)cN`R0Q>v<0P^zn02db$03#zD00M{!XvlJ)nWmpVe`UCO^$x?+r!OX* zIdkpghYz2@Hpt0IG4Swkdj9zFgZbC5Uku;A|72ieV`Gq#5(CQv1Q3&qjCioDtoX`b zzkcif{ri`JgM+==+S<^DmzNvpt>0ipKyS#t|MZjl>(}oLpFVzJ;N|6H(9ux>%K-!s z3mY5rH&<6%MPQ(Vf4!IgG^xblzj4+9&+XLuk21Q4^BnC74V{~3HWG~^jXLgw-0|Nj64_V)My>gw$P_xJb!1_=-V1MJ2C8Rd}x8TjQ701*dC^Y#Yx^6BZv@#xt9 z0R##E0*Em*w3Ok?moGpKKfO6QIqZ3Pxir3h{rN&jOwusSLBK@j)g%U~-}e|qfYyEE zWMz27$ouE+ZRX;yUw=&c{OvCTKmf6T{K3e`#K6kRvK1K0TR(mJ#`%wt>ATp!z2^Tf z-rT07^-+kIoeS(=?*9x7%1l34{{H9eyK8D>l|NF+q!{#cX#>&jV&(6RAq?rHyXAtH3#q^Jf+2i?Z#+LvA#KM3B z{AXZf`1O}*%8@e+Y`^|9^q9J_GBUjT!NBm~3j^by{|vgqzZoA3ayJ455KaTYQN+x^ z08Cqb`;IXD`T6}vpN;BYW(E#m;(h;{feDz%xS9S60R#|U17L;#y*6pr5e9~z&;Iv0 zTd^=Ru>WUx|B`{>$|L4W00BhM0C0K-TKbO>Xvi&2hI=o6)Cuu0u-|*ne*NtarW}9( Z0|4(~c&K0)VI}|o002ovPDHLkV1f~|8dU%Q literal 0 HcmV?d00001 diff --git a/iconsets/system/default/configure_toolbars.png b/iconsets/system/default/configure_toolbars.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1d04f872f5673adc2cc9c033ea81469a6f43da GIT binary patch literal 1017 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 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/events.png b/iconsets/system/default/events.png new file mode 100644 index 0000000000000000000000000000000000000000..fd49f31f29876d426c89678fcdf87d53198b6b28 GIT binary patch literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdd@S zqpu?a!^Xav-+_~Xe1&9>AYTTCDpdxChGqtapZ|gMO9qBg0|tgy2@DKYGZ+}e^C!h0 zbz@*)-011z7*cU7>CgZF_ROjb3Jns4o@=<%Ua$wT2E1!ou$8Cv#uY{u0ll+)4uAe1 zp4#;Py}#5S_Kl87H?At0M@E(Qb#e*~GcK5DGpwxHyMlo&Y#DPwp&1_=o23b;59FpB{FzOb?Ao`tQWgI_%(^I?63_vS43ZI3XN^=?vh;%SkO zVau{O#;~RHpnyVygWd{u);V)dGVah-`14kl`S4s}hZ?REb>|zD)Ymid1PB&1Tw`Vt zIMKl3YtQI$V4>s(-i+hh`vs&T`vhO8#@23lE(G)gtINNCdIvr{mtJMOvyoA4J^#n1 z28|1U-mmyH-`=5#9qgh&|FpCm77hhBug%5|4U7y6f+wBb=2+SSjA#Z=S3j3^P6* literal 0 HcmV?d00001 diff --git a/iconsets/system/default/eye_blue.png b/iconsets/system/default/eye_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f671311b20807950880fcd1b1541ee1aae95a878 GIT binary patch literal 708 zcmV;#0z3VQP)01rF?7doF=00004XF*Lt006O%3;baP00070NklDk!Wgh@+FZxj#^ zxWvuPeV2`m?F}z4?@e)W@x7|5s?&^&j0(KHy>)=Wpc8{RI5@s4X=#57Oi22t>*oE} zJ)`KaNkHiT!m_gebLPzXpOTXDmyeI{9nd9H0|NtP;0E~l`6-Kui@&q=@c2{F-S>Ov z&Yk}m7#RK=dHMf$OV9dY=^ya>_U+sMuUxtEzo)0?H_(97{{H@oU;{t_qM)F#bi#xQ zZ+tRyz8Smw{L9bJ2OA)xsq^16r|_?9OzeM{0lRna{-2qd`3e+XU;}_5ZX+Qfu`?z% z_Mdrh=ud~pxZm7-{C{}_1pnJbCj50tO#7FRU-cb_^a#e`OzdG?4wyo^gm<2(0`5rf&Z)P>i#!3H~$7Y`zJ6EuK)wp z7$q8khH%)~*#*eR$ZX)@Zk8ZT qz|?056ypWSk(8N0sS}22mKy;(aY|zu2b literal 0 HcmV?d00001 diff --git a/iconsets/system/default/filemanager.png b/iconsets/system/default/filemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..41b3f436790fc9d996a410069fbd3c54e51279b8 GIT binary patch literal 838 zcmV-M1G)T(P)6{{8>=@8ADv%Z~mJ$)5fH z#KlKoK03a7@9qEM+79gQtT&gPo-|gSM&^Rs(+g_`&ex z;bVs1zkmG&@c{w|V!$_$KYuYi`}K>##zYlp`(K9F@4qrUd;JH@{s(l;?|=UozI^`5 zaPstZhEJb9F#x>-HV_~HhjWYrAP59e^xyxM6jX-An2oTbA+8jY-@VKR+y|kTQqRQ1 zn87{&D&gRA$BvFQLm{5rTKfQ>0D>3*4E4`IL;eFH9}hbND=Q-dGb01Tf1r!L|NF(j z`12 z@&hRPpJCzZJq*__U4a__5J1pCgv9aBAAcEMz5EGu5zuB}lzazi28x3W`14!<#qn7=*akf!_HB=70YV(F8N-`}gk*OpHuG{#Rf?ego=)!~#G7L1WJ0tjNjr!TA@UcO;?$Gsl>91cufEcLhKO@73*RL7=eg6d1#mEZM3lKnzpuphg_qfNz_+N;D z@izlEHwQS8{Qdh6Yzrt!gVewh&eyLWfvNB_kj45An3z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ($!B4&j1355v1ru0)rqs6GI`7o=?EPAD?xrlawmoBzim8|s zsjO>`V(5Y8(;1deTX1K?GX@uc0Ac}Y7FN|gAeY#!$0jTbQ=_eLafi0Z!cGR(AI}(` zUfYN2EG8BPUUmi*WljcffB<67F=m*ll9B1g#`}YT;rD$w<`80L`1#@v!{Z}|7~cQ+ z#PI3WU4~;jk22gkf1g2JOP|5pMUmm?`HQCk0*HlQT{w=7{Tu_sSBT+%zW-%-eE12& z=O^3@{A$h&?|x2XxOemf!-r3N4Bq}e42~A+3=AKhFuZ>Hn!!w(!4x0>06_r0{{#mc z@Bje+z5x98008aM008F84FDiOW&j~64*&r1<^bRtBmgBgF#t6+D*yoa^8f($=l}o) z1OWB?`~ctZ0OkUS<9+6b1;}%8$+DO z#sQ{&|NPEy>dcuBzD2XI0|XGuo<|IEkt%{`lx)Kgfg~sark>up%5eSag%>=0+!ErN zwhaIO1I_;Mn&H%*O&|VRRxOB*Pw58;AW$@N%noHJwlvXiQL>3*;N%x&`2FK6!~Khg z8TM}9@*r!?w@D^8zPhTiauF|oNpiA(y76My;hj_ee1FvfvIHQ2KnP@rfR84F|3X`a zGrRN{{;$(x_+F;VuoozvE$LK0A+-DI|3mkF|G)p?|NrSbU;H-V{>qgMvtKi9zn;Ft)6ZQCB^iAC`jcUL!-{V& zPqn%N1Q0Vwpp1cGxpqv9i>Q+m0|zrR11A?3gQTe`gXEPHst+Z!7|wHRG2DC40LB+z zGBBKd1B?YOA=V!k?(zWy5X%t;21hAXRX<*!CWf+j)93=*%=^!SpG0DB#M0b!oYCm3`7E$V}9Sc!|)F%#suV=0I~X`0}PKe z9Do@HHATNxRuKXSAQm2Wc6%-m@8LtBwSR#T&&j~b!^6M;!ayMM>lcIKj+qRPZoXys z`tujV-yc8>r2qZ;!|?OfI|hINV)?IK9mMyc6J7in=AG|y0P2| dTXqKsFaUn!PVf2Jqptt}002ovPDHLkV1hJy+R6X` literal 0 HcmV?d00001 diff --git a/iconsets/system/default/help.png b/iconsets/system/default/help.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3216278e22b70154be196a3bff4571f22de8e9 GIT binary patch literal 698 zcmV;r0!96aP)_QpaH#4vgnUHBNq+PHTA@UNNNogx(vewcE z=^_MOWD{vAi6o&gL$DDMHAxFIBkf|gy0g18=hvCDw79HBFFee=XXbgY&#~E-u^neg z-Cl)bTP2Py<)qsF*LJ#b?sB8;seycNgaQfav$-5?<7u4B5;M+`BFTXRR|F5cO(tdp zqmw!#6FOsGqCD>pliLtweHnqZrKBvCIdHPsp#OuQcQnlVDV@LeW6ogkqt4KzprR$n z8W(}2viH{uItK(V2BLhQiz?#uFPQiSh8YW_jT^ii5@dS}R+TJj$LiVBX42jZ9eok? z^Xxpzx6m^jt7iNww7wQp-w%^kf)<~)<2?8}1kIh$(j^$5h9_@Pe)BWg&g6m$&?;w> z+bGDn3UZ*VJTA9mttzX|q_&MDT=It)n+hrNyU!+vn@mNvu(cBG$ArU{UV$U?qTtjm z65x{P9-LF;;ZG)oK9hru#F1Vpuoue!mPj(H;mCCfpHR<&YshRc^HWEcBRP6QkSG1c z*idF-FEU~R+jIskze(Wqk$|Ut2L2wB&hxy26~%@Y--4yEy|o6Vw~51b)1a$A$eWP} zWp_yUw%Z+%*&~Unv=mn8UBLYSg{r$@OcC3EeLL~ik?!TJsAHllCd$vt?)CG>ACLcxjH{Vg7-Rl}i~yMk!~g-r z@{f^e4J!}VY_=b)Dt{Rm&;R`Wr}xj_|C-h&(v_luYz#oxG3aYcv>7omGP8($=G}1S zv*^;N!QyjQSD`UyL+lxOpW+`5d*?MeLO1 zc$q;4{Qk|rz{Y6$bN4-iun-T!od=(Rfy@Xr zis$D85zUnYP6V*35<2gBbV-xS(#jDRi`F}vO{{Z9uKf~*HKNvVUSQsQlIT>Vl85va6C7c+(|C9#^Af|sn zfBgITo8iaDFSj1P`?u%Qe^!P^Pd+mU334(#efo(3kN4kH zbhL%{#GA6o^RfJ9ke3%>cnJ)T=Wo6-y#2+>aOcHuhFcGQ+`4w^?zaE$KP>_XAVwzZ zP00C=;omP{%K7s@#LGi|MVJ{UGvn_c4DWuiGweC@k>TQ*=a-+n`nmv^sx|`scNdgQ z0Ro7T!C)my76xaMzkeB6*qQrOG(~eog}4~5p1gnN-IMoi44=N9WDw$g#Q;n@48W)b d + + + Crystal - System (default) + 1.0 + Crystal System Iconset + 2005-11-23 + http://psi.affinix.com + Jason Kim (Logo and misc. icons) + Everaldo Coelho (Crystal icons) + + + + psi/appearance + appearance.png + + + + psi/account + account.png + + + + psi/statusmsg + info.png + + + + psi/addContact + add.png + + + + psi/arrowUp + arrow_up.png + + + + psi/arrowDown + arrow_down.png + + + + psi/arrowLeft + arrow_left.png + + + + psi/arrowRight + arrow_right.png + + + + psi/profile + changeacc.png + + + + psi/clearChat + chatclear.png + + + + psi/compact + ok.png + + + + psi/disco + disco.png + + + + psi/events + events.png + + + + psi/groupChat + groupchat.png + + + + psi/help + help.png + + + + psi/history + history.png + + + + psi/shortcuts + shortcuts.png + + + + psi/vCard + vcard.png + + + + psi/jabber + jabber.png + + + + psi/options + options.png + + + + psi/toolbars + configure_toolbars.png + + + + psi/configure-room + configure-room.png + + + + psi/pgp + pgp.png + + + + psi/gpg-yes + key.png + + + + psi/gpg-no + key.png + + + + psi/keyBad + key_bad.png + + + + psi/keyUnknown + key_unknown.png + + + + psi/playSounds + play_sounds.png + + + + psi/voice + play_sounds.png + + + + psi/main + psimain.png + + + + psi/quit + quit.png + + + + psi/register + register.png + + + + psi/reload + reload.png + + + + psi/stop + stop.png + + + + psi/remove + remove.png + + + + psi/search + search.png + + + + psi/status + status.png + + + + psi/sendMessage + send.png + + + + psi/start-chat + start-chat.png + + + + psi/cryptoYes + ssl_yes.png + + + + psi/cryptoNo + ssl_no.png + + + + psi/time + time.png + + + + psi/www + url.png + + + + psi/xml + xml.png + + + + psi/logo_16 + logo_16.png + + + + psi/logo_32 + logo_32.png + + + + psi/logo_48 + logo_48.png + + + + psi/logo_64 + logo_64.png + + + + psi/logo_128 + logo_128.png + + + + psi/psiLogo + psilogo.png + + + + psi/smile + smile.png + + + + psi/email + send.png + + + + psi/ok + ok.png + + + + psi/done + close.png + + + + psi/closetab + closetab.png + + + + psi/cancel + cancel.png + + + + psi/close + close.png + + + + psi/apply + ok.png + + + + psi/info + info.png + + + + psi/tip + tip.png + + + + psi/browse + browse.png + + + + psi/play + play.png + + + + psi/eye + eye_blue.png + + + + psi/upload + upload.png + + + + psi/download + download.png + + + + psi/filemanager + filemanager.png + + + + psi/command + command.png + + + + + + psi/roster + url.png + + + + psi/advanced + advanced.png + + + + psi/show_self + self.png + + + + psi/show_offline + show_offline.png + + + + psi/show_away + show_away.png + + + + psi/show_hidden + show_hidden.png + + + + psi/publishTune + publish_tune.png + + + + + psi/whiteboard + whiteboarding/whiteboard.png + + + + psi/select + whiteboarding/select.png + + + + psi/translate + whiteboarding/translate.png + + + + psi/rotate + whiteboarding/rotate.png + + + + psi/scale + whiteboarding/scale.png + + + + psi/scroll + whiteboarding/scroll.png + + + + psi/erase + whiteboarding/erase.png + + + + psi/drawPaths + whiteboarding/draw_paths.png + + + + psi/drawLines + whiteboarding/draw_lines.png + + + + psi/drawEllipses + whiteboarding/draw_ellipses.png + + + + psi/drawCircles + whiteboarding/draw_circles.png + + + + psi/drawRectangles + whiteboarding/draw_rectangles.png + + + + psi/addText + whiteboarding/add_text.png + + + + psi/addImage + whiteboarding/add_image.png + + + + psi/bringForwards + whiteboarding/bring_forwards.png + + + + psi/bringToFront + whiteboarding/bring_to_front.png + + + + psi/sendBackwards + whiteboarding/send_backwards.png + + + + psi/sendToBack + whiteboarding/send_to_back.png + + + + psi/group + whiteboarding/group.png + + + + psi/ungroup + whiteboarding/ungroup.png + + + diff --git a/iconsets/system/default/info.png b/iconsets/system/default/info.png new file mode 100644 index 0000000000000000000000000000000000000000..1903fabccd8c10b7aecb3d8874d049a47ab9019d GIT binary patch literal 855 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 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/key_unknown.png b/iconsets/system/default/key_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..a21c0a1e4ec34e635944f466fea9f218e6338073 GIT binary patch literal 826 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 S92VsO0000 zZAepL6vv-W_Q4`hKLjS!hdx9_A`z9LNlExNapu(NbUHV$Q>Uh=1QHb_sFh$iO)OSw zzL1%znH3hPiEL&GWtuP3>6B9Urf&DTozA_oWOcZI?!C`>{=etka}P;K%_XU68AP5g zCVBEWlAkF!h~nkRV{`DmP(cX`vZ=%@%!gC5RG&1djEE(ftPhn(ICCbIM9|=dMtDK^(ei$ya9|6fH4DOHEim%KgL>{8}3V_R2TyGh$J~2#Ch@_1f-}3ySsp12e5B} z#b$t(?A$@!AIU=y-dyFe@Cz0eo5;YpSta&di4Voe0w33c2S6vlhIRP5^Ka zhr`Oh=LGD=#N_PP;E3dCl94W^XzSVr zTbeVDGY?n_r5d@>?l*HoE}09;~hzATo}+%ML{vL)$iS(G{{f z1fI_bqzqrdyDNaE8JL}4WKIR}Z?VG=tXtG;{sqJhhk;BZgoRBlc)ZvJu=~uG4e0A1 znDjdzDIu{*xjs+ZURE*8HrVZUV53Xl4nDnmVQEXZ1L#Hovjec%XjoWWhN9~g9lqyy zCrMPiobUt`|HHt@t1YV)OtcY>z4wN)pEq`zxP^e%1Pt^#XV$O$0_DTzK{RJ$1%v~H zL`mH7pHf}D{cpxr#-M(#ngg+6#_6orDq+>M26OXEQ1zg30L>++{r;C?2@!}CBs@k& zf6DekY-|Dr)SvHbW1BRIjyyK_ViB|mX!CPQGwcbCMbsBBoY!Y&Lc62 zS=>v&Wg$6zA^JF$mg?)zD+}REYQtirb!ezS$xwbMa`vKt+mHPte*jvQvrP$hF+czS N002ovPDHLkV1h@RebxW~ literal 0 HcmV?d00001 diff --git a/iconsets/system/default/logo_24.png b/iconsets/system/default/logo_24.png new file mode 100644 index 0000000000000000000000000000000000000000..10bdcfa8ab7b735df21425c8c2f8981cdfcffff6 GIT binary patch literal 1364 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
AddressList; +}; + +#endif diff --git a/iris-legacy/iris/include/xmpp_agentitem.h b/iris-legacy/iris/include/xmpp_agentitem.h new file mode 100644 index 0000000..dcd9151 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_agentitem.h @@ -0,0 +1,55 @@ +/* + * xmpp_agentitem.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_AGENTITEM +#define XMPP_AGENTITEM + +#include + +#include "xmpp_jid.h" +#include "xmpp_features.h" + +namespace XMPP { + class AgentItem + { + public: + AgentItem() { } + + const Jid & jid() const { return v_jid; } + const QString & name() const { return v_name; } + const QString & category() const { return v_category; } + const QString & type() const { return v_type; } + const Features & features() const { return v_features; } + + void setJid(const Jid &j) { v_jid = j; } + void setName(const QString &n) { v_name = n; } + void setCategory(const QString &c) { v_category = c; } + void setType(const QString &t) { v_type = t; } + void setFeatures(const Features &f) { v_features = f; } + + private: + Jid v_jid; + QString v_name, v_category, v_type; + Features v_features; + }; +} + +#endif + diff --git a/iris-legacy/iris/include/xmpp_chatstate.h b/iris-legacy/iris/include/xmpp_chatstate.h new file mode 100644 index 0000000..f9f4f5e --- /dev/null +++ b/iris-legacy/iris/include/xmpp_chatstate.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_CHATSTATE +#define XMPP_CHATSTATE + +namespace XMPP { + typedef enum { + StateNone, + StateActive, + StateComposing, + StatePaused, + StateInactive, + StateGone + } ChatState; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_client.h b/iris-legacy/iris/include/xmpp_client.h new file mode 100644 index 0000000..cd385ac --- /dev/null +++ b/iris-legacy/iris/include/xmpp_client.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_CLIENT_H +#define XMPP_CLIENT_H + +#include +#include + +#include "xmpp_jid.h" +#include "xmpp_status.h" +#include "xmpp_discoitem.h" + +class QString; +class QDomElement; +class QDomDocument; +namespace XMPP { + class ClientStream; + class Features; + class FileTransferManager; + class IBBManager; + class JidLinkManager; + class LiveRoster; + class LiveRosterItem; + class Message; + class Resource; + class ResourceList; + class Roster; + class RosterItem; + class S5BManager; + class Stream; + class Task; +} + +namespace XMPP +{ + class Client : public QObject + { + Q_OBJECT + + public: + Client(QObject *parent=0); + ~Client(); + + bool isActive() const; + void connectToServer(ClientStream *s, const Jid &j, bool auth=true); + void start(const QString &host, const QString &user, const QString &pass, const QString &resource); + void close(bool fast=false); + + Stream & stream(); + QString streamBaseNS() const; + const LiveRoster & roster() const; + const ResourceList & resourceList() const; + + void send(const QDomElement &); + void send(const QString &); + + QString host() const; + QString user() const; + QString pass() const; + QString resource() const; + Jid jid() const; + + void rosterRequest(); + void sendMessage(const Message &); + void sendSubscription(const Jid &, const QString &, const QString& nick = QString()); + void setPresence(const Status &); + + void debug(const QString &); + QString genUniqueId(); + Task *rootTask(); + QDomDocument *doc() const; + + QString OSName() const; + QString timeZone() const; + int timeZoneOffset() const; + QString clientName() const; + QString clientVersion() const; + QString capsNode() const; + QString capsVersion() const; + QString capsExt() const; + + void setOSName(const QString &); + void setTimeZone(const QString &, int); + void setClientName(const QString &); + void setClientVersion(const QString &); + void setCapsNode(const QString &); + void setCapsVersion(const QString &); + + void setIdentity(DiscoItem::Identity); + DiscoItem::Identity identity(); + + void setFeatures(const Features& f); + const Features& features() const; + + void addExtension(const QString& ext, const Features& f); + void removeExtension(const QString& ext); + const Features& extension(const QString& ext) const; + QStringList extensions() const; + + S5BManager *s5bManager() const; + IBBManager *ibbManager() const; + JidLinkManager *jidLinkManager() const; + + void setFileTransferEnabled(bool b); + FileTransferManager *fileTransferManager() const; + + QString groupChatPassword(const QString& host, const QString& room) const; + bool groupChatJoin(const QString &host, const QString &room, const QString &nick, const QString& password = QString(), int maxchars = -1, int maxstanzas = -1, int seconds = -1, const Status& = Status()); + void groupChatSetStatus(const QString &host, const QString &room, const Status &); + void groupChatChangeNick(const QString &host, const QString &room, const QString &nick, const Status &); + void groupChatLeave(const QString &host, const QString &room); + + signals: + void activated(); + void disconnected(); + //void authFinished(bool, int, const QString &); + void rosterRequestFinished(bool, int, const QString &); + void rosterItemAdded(const RosterItem &); + void rosterItemUpdated(const RosterItem &); + void rosterItemRemoved(const RosterItem &); + void resourceAvailable(const Jid &, const Resource &); + void resourceUnavailable(const Jid &, const Resource &); + void presenceError(const Jid &, int, const QString &); + void subscription(const Jid &, const QString &, const QString &); + void messageReceived(const Message &); + void debugText(const QString &); + void xmlIncoming(const QString &); + void xmlOutgoing(const QString &); + void groupChatJoined(const Jid &); + void groupChatLeft(const Jid &); + void groupChatPresence(const Jid &, const Status &); + void groupChatError(const Jid &, int, const QString &); + + void incomingJidLink(); + + void beginImportRoster(); + void endImportRoster(); + + private slots: + //void streamConnected(); + //void streamHandshaken(); + //void streamError(const StreamError &); + //void streamSSLCertificateReady(const QSSLCert &); + //void streamCloseFinished(); + void streamError(int); + void streamReadyRead(); + void streamIncomingXml(const QString &); + void streamOutgoingXml(const QString &); + + void slotRosterRequestFinished(); + + // basic daemons + void ppSubscription(const Jid &, const QString &, const QString&); + void ppPresence(const Jid &, const Status &); + void pmMessage(const Message &); + void prRoster(const Roster &); + + void s5b_incomingReady(); + void ibb_incomingReady(); + + public: + class GroupChat; + private: + void cleanup(); + void distribute(const QDomElement &); + void importRoster(const Roster &); + void importRosterItem(const RosterItem &); + void updateSelfPresence(const Jid &, const Status &); + void updatePresence(LiveRosterItem *, const Jid &, const Status &); + + class ClientPrivate; + ClientPrivate *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_clientstream.h b/iris-legacy/iris/include/xmpp_clientstream.h new file mode 100644 index 0000000..8975dea --- /dev/null +++ b/iris-legacy/iris/include/xmpp_clientstream.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_CLIENTSTREAM_H +#define XMPP_CLIENTSTREAM_H + +#include + +#include "xmpp_stream.h" + +class QByteArray; +class QString; +class QDomDocument; +class QDomElement; +class QObject; +class ByteStream; +class QHostAddress; + +namespace XMPP +{ + class TLSHandler; + class Connector; + + class ClientStream : public Stream + { + Q_OBJECT + public: + enum Error { + ErrConnection = ErrCustom, // Connection error, ask Connector-subclass what's up + ErrNeg, // Negotiation error, see condition + ErrTLS, // TLS error, see condition + ErrAuth, // Auth error, see condition + ErrSecurityLayer, // broken SASL security layer + ErrBind // Resource binding error + }; + enum Warning { + WarnOldVersion, // server uses older XMPP/Jabber "0.9" protocol + WarnNoTLS // there is no chance for TLS at this point + }; + enum NegCond { + HostGone, // host no longer hosted + HostUnknown, // unknown host + RemoteConnectionFailed, // unable to connect to a required remote resource + SeeOtherHost, // a 'redirect', see errorText() for other host + UnsupportedVersion // unsupported XMPP version + }; + enum TLSCond { + TLSStart, // server rejected STARTTLS + TLSFail // TLS failed, ask TLSHandler-subclass what's up + }; + enum SecurityLayer { + LayerTLS, + LayerSASL + }; + enum AuthCond { + GenericAuthError, // all-purpose "can't login" error + NoMech, // No appropriate auth mech available + BadProto, // Bad SASL auth protocol + BadServ, // Server failed mutual auth + EncryptionRequired, // can't use mech without TLS + InvalidAuthzid, // bad input JID + InvalidMech, // bad mechanism + InvalidRealm, // bad realm + MechTooWeak, // can't use mech with this authzid + NotAuthorized, // bad user, bad password, bad creditials + TemporaryAuthFailure // please try again later! + }; + enum BindCond { + BindNotAllowed, // not allowed to bind a resource + BindConflict // resource in-use + }; + enum AllowPlainType { + NoAllowPlain, + AllowPlain, + AllowPlainOverTLS + }; + + ClientStream(Connector *conn, TLSHandler *tlsHandler=0, QObject *parent=0); + ClientStream(const QString &host, const QString &defRealm, ByteStream *bs, QCA::TLS *tls=0, QObject *parent=0); // server + ~ClientStream(); + + Jid jid() const; + void connectToServer(const Jid &jid, bool auth=true); + void accept(); // server + bool isActive() const; + bool isAuthenticated() const; + + // login params + void setUsername(const QString &s); + void setPassword(const QString &s); + void setRealm(const QString &s); + void setAuthzid(const QString &s); + void continueAfterParams(); + + // SASL information + QString saslMechanism() const; + int saslSSF() const; + + // binding + void setResourceBinding(bool); + + // Language + void setLang(const QString&); + + // security options (old protocol only uses the first !) + void setAllowPlain(AllowPlainType); +#ifdef YAPSI + void setAllowXFacebookPlatform(bool); +#endif + void setRequireMutualAuth(bool); + void setSSFRange(int low, int high); + void setOldOnly(bool); + void setSASLMechanism(const QString &s); + void setLocalAddr(const QHostAddress &addr, Q_UINT16 port); + + // Compression + void setCompress(bool); + + // reimplemented + QDomDocument & doc() const; + QString baseNS() const; + bool old() const; + + void close(); + bool stanzaAvailable() const; + Stanza read(); + void write(const Stanza &s); + + int errorCondition() const; + QString errorText() const; + QDomElement errorAppSpec() const; + + // extra + void writeDirect(const QString &s); + void setNoopTime(int mills); + + signals: + void connected(); + void securityLayerActivated(int); + void needAuthParams(bool user, bool pass, bool realm); + void authenticated(); + void warning(int); + void incomingXml(const QString &s); + void outgoingXml(const QString &s); + + public slots: + void continueAfterWarning(); + + private slots: + void cr_connected(); + void cr_error(); + + void bs_connectionClosed(); + void bs_delayedCloseFinished(); + void bs_error(int); // server only + + void ss_readyRead(); + void ss_bytesWritten(int); + void ss_tlsHandshaken(); + void ss_tlsClosed(); + void ss_error(int); + + void sasl_clientFirstStep(bool, const QByteArray&); + void sasl_nextStep(const QByteArray &stepData); + void sasl_needParams(const QCA::SASL::Params&); + void sasl_authCheck(const QString &user, const QString &authzid); + void sasl_authenticated(); + void sasl_error(); + + void doNoop(); + void doReadyRead(); + + private: + class Private; + Private *d; + + void reset(bool all=false); + void processNext(); + int convertedSASLCond() const; + bool handleNeed(); + void handleError(); + void srvProcessNext(); + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_discoitem.h b/iris-legacy/iris/include/xmpp_discoitem.h new file mode 100644 index 0000000..b587679 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_discoitem.h @@ -0,0 +1,86 @@ +/* + * xmpp_discoitem.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_DISCOITEM +#define XMPP_DISCOITEM + +#include + +#include "xmpp_jid.h" +#include "xmpp_features.h" +#include "xmpp_agentitem.h" + +namespace XMPP { + class DiscoItem + { + public: + DiscoItem(); + ~DiscoItem(); + + const Jid &jid() const; + const QString &node() const; + const QString &name() const; + + void setJid(const Jid &); + void setName(const QString &); + void setNode(const QString &); + + enum Action { + None = 0, + Remove, + Update + }; + + Action action() const; + void setAction(Action); + + const Features &features() const; + void setFeatures(const Features &); + + struct Identity + { + QString category; + QString name; + QString type; + }; + + typedef QList Identities; + + const Identities &identities() const; + void setIdentities(const Identities &); + + // some useful helper functions + static Action string2action(QString s); + static QString action2string(Action a); + + DiscoItem & operator= (const DiscoItem &); + DiscoItem(const DiscoItem &); + + operator AgentItem() const { return toAgentItem(); } + AgentItem toAgentItem() const; + void fromAgentItem(const AgentItem &); + + private: + class Private; + Private *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_features.h b/iris-legacy/iris/include/xmpp_features.h new file mode 100644 index 0000000..be4079a --- /dev/null +++ b/iris-legacy/iris/include/xmpp_features.h @@ -0,0 +1,88 @@ +/* + * xmpp_features.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_FEATURES_H +#define XMPP_FEATURES_H + +#include + +class QString; + +namespace XMPP +{ + class Features + { + public: + Features(); + Features(const QStringList &); + Features(const QString &); + ~Features(); + + QStringList list() const; // actual featurelist + void setList(const QStringList &); + void addFeature(const QString&); + + // features + bool canRegister() const; + bool canSearch() const; + bool canMulticast() const; + bool canGroupchat() const; + bool canVoice() const; + bool canDisco() const; + bool canChatState() const; + bool canCommand() const; + bool isGateway() const; + bool haveVCard() const; + bool canMessageReceipts() const; + + enum FeatureID { + FID_Invalid = -1, + FID_None, + FID_Register, + FID_Search, + FID_Groupchat, + FID_Disco, + FID_Gateway, + FID_VCard, + FID_AHCommand, + + // private Psi actions + FID_Add + }; + + // useful functions + bool test(const QString &) const; + bool test(const QStringList &) const; + + QString name() const; + static QString name(long id); + static QString name(const QString &feature); + + long id() const; + static long id(const QString &feature); + static QString feature(long id); + + class FeatureName; + private: + QStringList _list; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_htmlelement.h b/iris-legacy/iris/include/xmpp_htmlelement.h new file mode 100644 index 0000000..68d34a9 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_htmlelement.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_HTMLELEMENT_H +#define XMPP_HTMLELEMENT_H + +#include + +class QString; + +namespace XMPP +{ + class HTMLElement + { + public: + HTMLElement(); + HTMLElement(const QDomElement &body); + + void setBody(const QDomElement &body); + const QDomElement& body() const; + QString toString(const QString &rootTagName = "body") const; + QString text() const; + + private: + QDomDocument doc_; + QDomElement body_; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_httpauthrequest.h b/iris-legacy/iris/include/xmpp_httpauthrequest.h new file mode 100644 index 0000000..32fe9b3 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_httpauthrequest.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2006 Maciek Niedzielski + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_AUTHREQUEST_H +#define XMPP_AUTHREQUEST_H + +#include + +class QDomElement; +class QDomDocument; + +namespace XMPP +{ + class HttpAuthRequest + { + public: + HttpAuthRequest(const QString &m, const QString &u, const QString &i); + HttpAuthRequest(const QString &m = "", const QString &u = ""); + HttpAuthRequest(const QDomElement &); + + bool isEmpty() const; + + void setMethod(const QString&); + void setUrl(const QString&); + void setId(const QString&); + QString method() const; + QString url() const; + QString id() const; + bool hasId() const; + + QDomElement toXml(QDomDocument &) const; + bool fromXml(const QDomElement &); + + static Stanza::Error denyError; + private: + QString method_, url_, id_; + bool hasId_; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_jid.h b/iris-legacy/iris/include/xmpp_jid.h new file mode 100644 index 0000000..dc3b2be --- /dev/null +++ b/iris-legacy/iris/include/xmpp_jid.h @@ -0,0 +1,83 @@ +/* + * xmpp_jid.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_JID_H +#define XMPP_JID_H + +#include + +namespace XMPP +{ + class Jid + { + public: + Jid(); + ~Jid(); + + Jid(const QString &s); + Jid(const char *s); + Jid & operator=(const QString &s); + Jid & operator=(const char *s); + + bool operator==(const Jid& other) const; + + void set(const QString &s); + void set(const QString &domain, const QString &node, const QString &resource=""); + + void setDomain(const QString &s); + void setNode(const QString &s); + void setResource(const QString &s); + + bool isNull() const { return null; } + const QString & domain() const { return d; } + const QString & node() const { return n; } + const QString & resource() const { return r; } + const QString & bare() const { return b; } + const QString & full() const { return f; } + + Jid withNode(const QString &s) const; + Jid withResource(const QString &s) const; + + bool isValid() const; + bool isEmpty() const; + bool compare(const Jid &a, bool compareRes=true) const; + + static bool validDomain(const QString &s, QString *norm=0); + static bool validNode(const QString &s, QString *norm=0); + static bool validResource(const QString &s, QString *norm=0); + + // TODO: kill these later + const QString & host() const { return d; } + const QString & user() const { return n; } + const QString & userHost() const { return b; } + + private: + void reset(); + void update(); + + QString f, b, d, n, r; + bool valid, null; + }; +} + +// TODO: doesn't seem to have any effect at all on gcc 4.2.3 / linux +uint qHash(const XMPP::Jid& jid); + +#endif diff --git a/iris-legacy/iris/include/xmpp_liveroster.h b/iris-legacy/iris/include/xmpp_liveroster.h new file mode 100644 index 0000000..6e1625b --- /dev/null +++ b/iris-legacy/iris/include/xmpp_liveroster.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_LIVEROSTER_H +#define XMPP_LIVEROSTER_H + +#include + +#include "xmpp_liverosteritem.h" + +namespace XMPP +{ + class Jid; + + class LiveRoster : public QList + { + public: + LiveRoster(); + ~LiveRoster(); + + void flagAllForDelete(); + LiveRoster::Iterator find(const Jid &, bool compareRes=true); + LiveRoster::ConstIterator find(const Jid &, bool compareRes=true) const; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_liverosteritem.h b/iris-legacy/iris/include/xmpp_liverosteritem.h new file mode 100644 index 0000000..9d5ee7e --- /dev/null +++ b/iris-legacy/iris/include/xmpp_liverosteritem.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_LIVEROSTERITEM_H +#define XMPP_LIVEROSTERITEM_H + +#include "xmpp_status.h" +#include "xmpp_resourcelist.h" +#include "xmpp_rosteritem.h" + +namespace XMPP +{ + class LiveRosterItem : public RosterItem + { + public: + LiveRosterItem(const Jid &j=""); + LiveRosterItem(const RosterItem &); + ~LiveRosterItem(); + + void setRosterItem(const RosterItem &); + + ResourceList & resourceList(); + ResourceList::Iterator priority(); + + const ResourceList & resourceList() const; + ResourceList::ConstIterator priority() const; + + bool isAvailable() const; + const Status & lastUnavailableStatus() const; + bool flagForDelete() const; + + void setLastUnavailableStatus(const Status &); + void setFlagForDelete(bool); + + private: + ResourceList v_resourceList; + Status v_lastUnavailableStatus; + bool v_flagForDelete; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_message.h b/iris-legacy/iris/include/xmpp_message.h new file mode 100644 index 0000000..61507c4 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_message.h @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_MESSAGE_H +#define XMPP_MESSAGE_H + +#include "xmpp_stanza.h" +#include "xmpp_url.h" +#include "xmpp_chatstate.h" +#include "xmpp_receipts.h" +#include "xmpp_address.h" +#include "xmpp_rosterx.h" +#include "xmpp_muc.h" + +class QString; +class QDateTime; +#ifdef YAPSI +class YaLastMail; +#endif + +namespace XMPP { + class Jid; + class PubSubItem; + class PubSubRetraction; + class HTMLElement; + class HttpAuthRequest; + class XData; + + typedef enum { OfflineEvent, DeliveredEvent, DisplayedEvent, + ComposingEvent, CancelEvent } MsgEvent; + + class Message + { + public: + Message(const Jid &to=""); + Message(const Message &from); + Message & operator=(const Message &from); + ~Message(); + + Jid to() const; + Jid from() const; + QString id() const; + QString type() const; + QString lang() const; + QString subject(const QString &lang="") const; + QString body(const QString &lang="") const; + QString thread() const; + Stanza::Error error() const; + + void setTo(const Jid &j); + void setFrom(const Jid &j); + void setId(const QString &s); + void setType(const QString &s); + void setLang(const QString &s); + void setSubject(const QString &s, const QString &lang=""); + void setBody(const QString &s, const QString &lang=""); + void setThread(const QString &s, bool send = false); + void setError(const Stanza::Error &err); + + // JEP-0060 + const QString& pubsubNode() const; + const QList& pubsubItems() const; + const QList& pubsubRetractions() const; + + // JEP-0091 + QDateTime timeStamp() const; + void setTimeStamp(const QDateTime &ts, bool send = false); + + // JEP-0071 + HTMLElement html(const QString &lang="") const; + void setHTML(const HTMLElement &s, const QString &lang=""); + bool containsHTML() const; + + // JEP-0066 + UrlList urlList() const; + void urlAdd(const Url &u); + void urlsClear(); + void setUrlList(const UrlList &list); + + // JEP-0022 + QString eventId() const; + void setEventId(const QString& id); + bool containsEvents() const; + bool containsEvent(MsgEvent e) const; + void addEvent(MsgEvent e); + + // JEP-0085 + ChatState chatState() const; + void setChatState(ChatState); + + // XEP-0184 + MessageReceipt messageReceipt() const; + void setMessageReceipt(MessageReceipt); + + // JEP-0027 + QString xencrypted() const; + void setXEncrypted(const QString &s); + + // JEP-0033 + AddressList addresses() const; + AddressList findAddresses(Address::Type t) const; + void addAddress(const Address &a); + void clearAddresses(); + void setAddresses(const AddressList &list); + + // JEP-144 + const RosterExchangeItems& rosterExchangeItems() const; + void setRosterExchangeItems(const RosterExchangeItems&); + + // JEP-172 + void setNick(const QString&); + const QString& nick() const; + + // JEP-0070 + void setHttpAuthRequest(const HttpAuthRequest&); + HttpAuthRequest httpAuthRequest() const; + + // JEP-0004 + void setForm(const XData&); + const XData& getForm() const; + + // JEP-xxxx Whiteboarding + void setWhiteboard(const QDomElement&); + const QDomElement& whiteboard() const; + + // MUC + void setMUCStatus(int); + bool hasMUCStatus() const; + int mucStatus() const; + void addMUCInvite(const MUCInvite&); + const QList& mucInvites() const; + void setMUCDecline(const MUCDecline&); + const MUCDecline& mucDecline() const; + const QString& mucPassword() const; + void setMUCPassword(const QString&); + + // Obsolete invitation + QString invite() const; + void setInvite(const QString &s); + + // for compatibility. delete me later + bool spooled() const; + void setSpooled(bool); + bool wasEncrypted() const; + void setWasEncrypted(bool); + + Stanza toStanza(Stream *stream) const; + bool fromStanza(const Stanza &s, int tzoffset); + +#ifdef YAPSI + const YaLastMail& lastMailNotify() const; + void setLastMailNotify(const YaLastMail& lastMailNotify); + int spamFlag() const; + + QString twin() const; + void setTwin(const QString& twin); + + QString yaMessageId() const; + void setYaMessageId(const QString& yaMessageId); + + int yaFlags() const; + void setYaFlags(int flags); +#endif + + const QDomElement& getExtension(const QString& ns) const; + + private: + class Private; + Private *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_muc.h b/iris-legacy/iris/include/xmpp_muc.h new file mode 100644 index 0000000..4057679 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_muc.h @@ -0,0 +1,137 @@ +/* + * xmpp_muc.h + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_MUC_H +#define XMPP_MUC_H + +#include +#include + +#include "xmpp_jid.h" + +namespace XMPP +{ + class MUCItem + { + public: + enum Affiliation { UnknownAffiliation, Outcast, NoAffiliation, Member, Admin, Owner }; + enum Role { UnknownRole, NoRole, Visitor, Participant, Moderator }; + + MUCItem(Role = UnknownRole, Affiliation = UnknownAffiliation); + MUCItem(const QDomElement&); + + void setNick(const QString&); + void setJid(const Jid&); + void setAffiliation(Affiliation); + void setRole(Role); + void setActor(const Jid&); + void setReason(const QString&); + + const QString& nick() const; + const Jid& jid() const; + Affiliation affiliation() const; + Role role() const; + const Jid& actor() const; + const QString& reason() const; + + void fromXml(const QDomElement&); + QDomElement toXml(QDomDocument&); + + bool operator==(const MUCItem& o); + + private: + QString nick_; + Jid jid_, actor_; + Affiliation affiliation_; + Role role_; + QString reason_; + }; + + class MUCInvite + { + public: + MUCInvite(); + MUCInvite(const QDomElement&); + MUCInvite(const Jid& to, const QString& reason = QString()); + + const Jid& to() const; + void setTo(const Jid&); + const Jid& from() const; + void setFrom(const Jid&); + const QString& reason() const; + void setReason(const QString&); + bool cont() const; + void setCont(bool); + + + void fromXml(const QDomElement&); + QDomElement toXml(QDomDocument&) const; + bool isNull() const; + + private: + Jid to_, from_; + QString reason_, password_; + bool cont_; + }; + + class MUCDecline + { + public: + MUCDecline(); + MUCDecline(const Jid& to, const QString& reason); + MUCDecline(const QDomElement&); + + const Jid& to() const; + void setTo(const Jid&); + const Jid& from() const; + void setFrom(const Jid&); + const QString& reason() const; + void setReason(const QString&); + + void fromXml(const QDomElement&); + QDomElement toXml(QDomDocument&) const; + bool isNull() const; + + private: + Jid to_, from_; + QString reason_; + }; + + class MUCDestroy + { + public: + MUCDestroy(); + MUCDestroy(const QDomElement&); + + const Jid& jid() const; + void setJid(const Jid&); + const QString& reason() const; + void setReason(const QString&); + + void fromXml(const QDomElement&); + QDomElement toXml(QDomDocument&) const; + + private: + Jid jid_; + QString reason_; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_pubsubitem.h b/iris-legacy/iris/include/xmpp_pubsubitem.h new file mode 100644 index 0000000..0d48884 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_pubsubitem.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_PUBSUBITEM_H +#define XMPP_PUBSUBITEM_H + +#include +#include + +namespace XMPP +{ + class PubSubItem + { + public: + PubSubItem(); + PubSubItem(const QString& id, const QDomElement& payload); + const QString& id() const; + const QDomElement& payload() const; + + private: + QString id_; + QDomElement payload_; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_pubsubretraction.h b/iris-legacy/iris/include/xmpp_pubsubretraction.h new file mode 100644 index 0000000..d41781a --- /dev/null +++ b/iris-legacy/iris/include/xmpp_pubsubretraction.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_PUBSUBRETRACTION_H +#define XMPP_PUBSUBRETRACTION_H + +#include +#include + +namespace XMPP +{ + + class PubSubRetraction + { + public: + PubSubRetraction(); + PubSubRetraction(const QString& id); + const QString& id() const; + + private: + QString id_; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_receipts.h b/iris-legacy/iris/include/xmpp_receipts.h new file mode 100644 index 0000000..151c106 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_receipts.h @@ -0,0 +1,32 @@ +/* + * xmpp_receipts.h - XEP-0184 support helper file + * Copyright (C) 2007 Michail Pishchagin + * + * 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_RECEIPTS_H +#define XMPP_RECEIPTS_H + +namespace XMPP { + typedef enum { + ReceiptNone, + ReceiptRequest, + ReceiptReceived + } MessageReceipt; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_resource.h b/iris-legacy/iris/include/xmpp_resource.h new file mode 100644 index 0000000..7e0b93e --- /dev/null +++ b/iris-legacy/iris/include/xmpp_resource.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_RESOURCE_H +#define XMPP_RESOURCE_H + +#include + +#include "xmpp_status.h" + +namespace XMPP +{ + class Resource + { + public: + Resource(const QString &name="", const Status &s=Status()); + ~Resource(); + + const QString & name() const; + int priority() const; + const Status & status() const; + + void setName(const QString &); + void setStatus(const Status &); + + private: + QString v_name; + Status v_status; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_resourcelist.h b/iris-legacy/iris/include/xmpp_resourcelist.h new file mode 100644 index 0000000..0aa58cc --- /dev/null +++ b/iris-legacy/iris/include/xmpp_resourcelist.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_RESOURCELIST_H +#define XMPP_RESOURCELIST_H + +#include + +#include "xmpp_resource.h" + +class QString; + +namespace XMPP +{ + class ResourceList : public QList + { + public: + ResourceList(); + ~ResourceList(); + + ResourceList::Iterator find(const QString &); + ResourceList::Iterator priority(); + + ResourceList::ConstIterator find(const QString &) const; + ResourceList::ConstIterator priority() const; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_roster.h b/iris-legacy/iris/include/xmpp_roster.h new file mode 100644 index 0000000..b151793 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_roster.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_ROSTER_H +#define XMPP_ROSTER_H + +#include + +#include "xmpp_rosteritem.h" + +class QDomDocument; +class QDomElement; + +namespace XMPP +{ + class Jid; + class Roster : public QList + { + public: + Roster(); + ~Roster(); + + Roster::Iterator find(const Jid &); + Roster::ConstIterator find(const Jid &) const; + + private: + class RosterPrivate *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_rosteritem.h b/iris-legacy/iris/include/xmpp_rosteritem.h new file mode 100644 index 0000000..0a9f955 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_rosteritem.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_ROSTERITEM_H +#define XMPP_ROSTERITEM_H + +#include +#include + +#include "xmpp_jid.h" + +namespace XMPP +{ + class Subscription + { + public: + enum SubType { None, To, From, Both, Remove }; + + Subscription(SubType type=None); + + int type() const; + + QString toString() const; + bool fromString(const QString &); + + private: + SubType value; + }; + + class RosterItem + { + public: + RosterItem(const Jid &jid=""); + virtual ~RosterItem(); + + const Jid & jid() const; + const QString & name() const; + const QStringList & groups() const; + const Subscription & subscription() const; + const QString & ask() const; + bool isPush() const; + bool inGroup(const QString &) const; + + virtual void setJid(const Jid &); + void setName(const QString &); + void setGroups(const QStringList &); + void setSubscription(const Subscription &); + void setAsk(const QString &); + void setIsPush(bool); + bool addGroup(const QString &); + bool removeGroup(const QString &); + + QDomElement toXml(QDomDocument *) const; + bool fromXml(const QDomElement &); + + private: + Jid v_jid; + QString v_name; + QStringList v_groups; + Subscription v_subscription; + QString v_ask; + bool v_push; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_rosterx.h b/iris-legacy/iris/include/xmpp_rosterx.h new file mode 100644 index 0000000..b833008 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_rosterx.h @@ -0,0 +1,66 @@ +/* + * rosterexchangeitem.h + * Copyright (C) 2003 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_ROSTERX_H +#define XMPP_ROSTERX_H + +#include +#include + +#include "xmpp_jid.h" + +class QDomElement; + +namespace XMPP +{ + class Stanza; + + class RosterExchangeItem + { + public: + enum Action { Add, Delete, Modify }; + + RosterExchangeItem(const Jid& jid, const QString& name = "", const QStringList& groups = QStringList(), Action = Add); + RosterExchangeItem(const QDomElement&); + + const Jid& jid() const; + Action action() const; + const QString& name() const; + const QStringList& groups() const; + bool isNull() const; + + void setJid(const Jid&); + void setAction(Action); + void setName(const QString&); + void setGroups(const QStringList&); + + QDomElement toXml(Stanza&) const; + void fromXml(const QDomElement&); + + private: + Jid jid_; + QString name_; + QStringList groups_; + Action action_; + }; + typedef QList RosterExchangeItems; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_stanza.h b/iris-legacy/iris/include/xmpp_stanza.h new file mode 100644 index 0000000..e165b8b --- /dev/null +++ b/iris-legacy/iris/include/xmpp_stanza.h @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_STANZA_H +#define XMPP_STANZA_H + +#include +#include +#include + +class QDomDocument; + +namespace XMPP +{ + class Jid; + class Stream; + + class Stanza + { + public: + enum Kind { Message, Presence, IQ }; + + Stanza(); + Stanza(const Stanza &from); + Stanza & operator=(const Stanza &from); + virtual ~Stanza(); + + class Error + { + public: + enum ErrorType { Cancel = 1, Continue, Modify, Auth, Wait }; + enum ErrorCond + { + BadRequest = 1, + Conflict, + FeatureNotImplemented, + Forbidden, + Gone, + InternalServerError, + ItemNotFound, + JidMalformed, + NotAcceptable, + NotAllowed, + NotAuthorized, + PaymentRequired, + RecipientUnavailable, + Redirect, + RegistrationRequired, + RemoteServerNotFound, + RemoteServerTimeout, + ResourceConstraint, + ServiceUnavailable, + SubscriptionRequired, + UndefinedCondition, + UnexpectedRequest + }; + + Error(int type=Cancel, int condition=UndefinedCondition, const QString &text="", const QDomElement &appSpec=QDomElement()); + + int type; + int condition; + QString text; + QDomElement appSpec; + + int code() const; + bool fromCode(int code); + + QPair description() const; + + QDomElement toXml(QDomDocument &doc, const QString &baseNS) const; + bool fromXml(const QDomElement &e, const QString &baseNS); + private: + class Private; + int originalCode; + + }; + + bool isNull() const; + + QDomElement element() const; + QString toString() const; + + QDomDocument & doc() const; + QString baseNS() const; + QDomElement createElement(const QString &ns, const QString &tagName); + QDomElement createTextElement(const QString &ns, const QString &tagName, const QString &text); + void appendChild(const QDomElement &e); + + Kind kind() const; + void setKind(Kind k); + + Jid to() const; + Jid from() const; + QString id() const; + QString type() const; + QString lang() const; + + void setTo(const Jid &j); + void setFrom(const Jid &j); + void setId(const QString &id); + void setType(const QString &type); + void setLang(const QString &lang); + +#ifdef YAPSI + void setAttribute(const QString& name, const QString& value); +#endif + + Error error() const; + void setError(const Error &err); + void clearError(); + + private: + friend class Stream; + Stanza(Stream *s, Kind k, const Jid &to, const QString &type, const QString &id); + Stanza(Stream *s, const QDomElement &e); + + class Private; + Private *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_status.h b/iris-legacy/iris/include/xmpp_status.h new file mode 100644 index 0000000..c04f9bd --- /dev/null +++ b/iris-legacy/iris/include/xmpp_status.h @@ -0,0 +1,151 @@ +/* + * xmpp_status.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_STATUS_H +#define XMPP_STATUS_H + +#include +#include + +#include "xmpp_muc.h" + +namespace XMPP +{ + class Status + { + public: + enum Type { + Offline, Online, Away, XA, DND, Invisible, FFC +#ifdef YAPSI + , Blocked, Reconnecting, NotAuthorizedToSeeStatus + , GC_Active, GC_Inactive, GC_Favorited +#endif + }; + + Status(const QString &show="", const QString &status="", int priority=0, bool available=true); + Status(Type type, const QString& status="", int priority=0); + ~Status(); + + int priority() const; + Type type() const; + QString typeString() const; + const QString & show() const; + const QString & status() const; + QDateTime timeStamp() const; + const QString & keyID() const; + bool isAvailable() const; + bool isAway() const; + bool isInvisible() const; + bool hasError() const; + int errorCode() const; + const QString & errorString() const; + + const QString & xsigned() const; + const QString & songTitle() const; + const QString & capsNode() const; + const QString & capsVersion() const; + const QString & capsExt() const; +#ifdef YAPSI + const QString & notifyValue() const; +#endif + + bool isMUC() const; + bool hasMUCItem() const; + const MUCItem & mucItem() const; + bool hasMUCDestroy() const; + const MUCDestroy & mucDestroy() const; + bool hasMUCStatus() const; + QList getMUCStatuses() const; + int mucStatus() const; + const QString& mucPassword() const; + bool hasMUCHistory() const; + int mucHistoryMaxChars() const; + int mucHistoryMaxStanzas() const; + int mucHistorySeconds() const; + + void setPriority(int); + void setType(Type); + void setType(QString); + void setShow(const QString &); + void setStatus(const QString &); + void setTimeStamp(const QDateTime &); + void setKeyID(const QString &); + void setIsAvailable(bool); + void setIsInvisible(bool); + void setError(int, const QString &); + void setCapsNode(const QString&); + void setCapsVersion(const QString&); + void setCapsExt(const QString&); + + void setMUC(); + void setMUCItem(const MUCItem&); + void setMUCDestroy(const MUCDestroy&); + void setMUCStatus(int); + void setMUCPassword(const QString&); + void setMUCHistory(int maxchars, int maxstanzas, int seconds); + + void setXSigned(const QString &); + void setSongTitle(const QString &); +#ifdef YAPSI + void setNotifyValue(const QString &); +#endif + + // JEP-153: VCard-based Avatars + const QString& photoHash() const; + void setPhotoHash(const QString&); + bool hasPhotoHash() const; + + private: + int v_priority; + QString v_show, v_status, v_key; + QDateTime v_timeStamp; + bool v_isAvailable; + bool v_isInvisible; + QString v_photoHash; + bool v_hasPhotoHash; + + QString v_xsigned; + // gabber song extension + QString v_songTitle; + QString v_capsNode, v_capsVersion, v_capsExt; + + // MUC + bool v_isMUC, v_hasMUCItem, v_hasMUCDestroy; + MUCItem v_mucItem; + MUCDestroy v_mucDestroy; + int v_mucStatus; + QString v_mucPassword; + int v_mucHistoryMaxChars, v_mucHistoryMaxStanzas, v_mucHistorySeconds; + +#ifdef YAPSI + QString v_notifyValue; +#endif + + int ecode; + QString estr; + }; + +} + +#include + +Q_DECLARE_METATYPE(XMPP::Status) + +#endif diff --git a/iris-legacy/iris/include/xmpp_stream.h b/iris-legacy/iris/include/xmpp_stream.h new file mode 100644 index 0000000..46e0d4b --- /dev/null +++ b/iris-legacy/iris/include/xmpp_stream.h @@ -0,0 +1,81 @@ +/* + * xmpp.h - XMPP "core" library API + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_STREAM_H +#define XMPP_STREAM_H + +#include +#include + +#include "xmpp_stanza.h" +#include "xmpp_jid.h" + +class QDomDocument; + +namespace XMPP +{ + class Stream : public QObject + { + Q_OBJECT + public: + enum Error { ErrParse, ErrProtocol, ErrStream, ErrCustom = 10 }; + enum StreamCond { + GenericStreamError, + Conflict, + ConnectionTimeout, + InternalServerError, + InvalidFrom, + InvalidXml, + PolicyViolation, + ResourceConstraint, + SystemShutdown + }; + + Stream(QObject *parent=0); + virtual ~Stream(); + + virtual QDomDocument & doc() const=0; + virtual QString baseNS() const=0; + virtual bool old() const=0; + + virtual void close()=0; + virtual bool stanzaAvailable() const=0; + virtual Stanza read()=0; + virtual void write(const Stanza &s)=0; + + virtual int errorCondition() const=0; + virtual QString errorText() const=0; + virtual QDomElement errorAppSpec() const=0; + + Stanza createStanza(Stanza::Kind k, const Jid &to="", const QString &type="", const QString &id=""); + Stanza createStanza(const QDomElement &e); + + static QString xmlToString(const QDomElement &e, bool clip=false); + + signals: + void connectionClosed(); + void delayedCloseFinished(); + void readyRead(); + void stanzaWritten(); + void error(int); + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_task.h b/iris-legacy/iris/include/xmpp_task.h new file mode 100644 index 0000000..270c86b --- /dev/null +++ b/iris-legacy/iris/include/xmpp_task.h @@ -0,0 +1,82 @@ +/* + * xmpp_task.h + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_TASK_H +#define XMPP_TASK_H + +#include +#include + +class QDomDocument; +class QDomElement; + +namespace XMPP { + class Client; + class Jid; + + class Task : public QObject + { + Q_OBJECT + public: + enum { ErrDisc }; + Task(Task *parent); + Task(Client *, bool isRoot); + virtual ~Task(); + + Task *parent() const; + Client *client() const; + QDomDocument *doc() const; + QString id() const; + + bool success() const; + int statusCode() const; + const QString & statusString() const; + + void go(bool autoDelete=false); + virtual bool take(const QDomElement &); + void safeDelete(); + + signals: + void finished(); + + protected: + virtual void onGo(); + virtual void onDisconnect(); + void send(const QDomElement &); + void setSuccess(int code=0, const QString &str=""); + void setError(const QDomElement &); + void setError(int code=0, const QString &str=""); + void debug(const char *, ...); + void debug(const QString &); + bool iqVerify(const QDomElement &x, const Jid &to, const QString &id, const QString &xmlns=""); + + private slots: + void clientDisconnected(); + void done(); + + private: + void init(); + + class TaskPrivate; + TaskPrivate *d; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_url.h b/iris-legacy/iris/include/xmpp_url.h new file mode 100644 index 0000000..e9a80c2 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_url.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_URL +#define XMPP_URL + +class QString; + +namespace XMPP +{ + class Url + { + public: + Url(const QString &url="", const QString &desc=""); + Url(const Url &); + Url & operator=(const Url &); + ~Url(); + + QString url() const; + QString desc() const; + + void setUrl(const QString &); + void setDesc(const QString &); + + private: + class Private; + Private *d; + }; + + typedef QList UrlList; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp_xdata.h b/iris-legacy/iris/include/xmpp_xdata.h new file mode 100644 index 0000000..6169f91 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_xdata.h @@ -0,0 +1,158 @@ +/* + * xmpp_xdata.h - a class for jabber:x:data forms + * Copyright (C) 2003-2004 Michail Pishchagin + * + * 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPPXDATA_H +#define XMPPXDATA_H + +#include +#include +#include +#include +#include + +class QDomElement; +class QDomDocument; + +namespace XMPP { + + class XData + { + public: + XData(); + + QString title() const; + void setTitle(const QString &); + + QString instructions() const; + void setInstructions(const QString &); + + enum Type { + Data_Form, + Data_Result, + Data_Submit, + Data_Cancel + }; + + Type type() const; + void setType(Type); + + struct ReportField { + ReportField() { } + ReportField( QString _label, QString _name ) { label = _label; name = _name; } + QString label; + QString name; + }; + const QList &report() const; + + typedef QMap ReportItem; + const QList &reportItems() const; + + void fromXml(const QDomElement &); + QDomElement toXml(QDomDocument *, bool submitForm = true) const; + bool isValid() const; + + public: + class Field { + public: + Field(); + ~Field(); + + QString desc() const; + void setDesc(const QString &); + + struct Option { + QString label; + QString value; + }; + + typedef QList

%pn3E4(EU+y9#B%3j{mL@I(0zUq|coVI$AZZJRR}&i`iX$(-Z)K${>{ zLB#vzet_?!0N-m3e@TFH@Gju?M1`U&80uT=m zP@6GM42TRQRS?6LfsrD>!vmZQ zq}Ok}>DCJe54o;S$4;F(T4eJg1NdB1305_HKtF@jffg!oQKt~_;j0Mn9>Jq}c?5b~ z=A&)iV63lwEq@=y_s~w|oH#9x<=VG=+2RA@-g{+OvW^6P1p#`zoQDISl>2U=A2Jj1 zz-I&yx*Fh!+yJf!tOOC@B}9@8B&E=*by~`8cl`U}i!bSWk*Eq%r0_r`1I_cx?ZsLz z0U`mpuYgy7$6}Ft3}~ca#)UT%?2?yP!0uKyXh8#6A&_z4!(M%y1n@^l6zF}Sx8J#a z>%rwqf7vZ|@SP<ckz*OUx+rZ&j`RgHNg2$1U5nu#8Gku4&soKibJls zu4Dg!S9a~%wR>l=w;&OP2&6hd1YogPbX|t1|3JeAJVGOZ}cawb`R4^$s7(JpT7ze`c;-z2dMK z>z4!lbm&R~;N=7vR1)z$F7;go2|iCW0-q5;_`(97NEFiY1bFozjuI}Q@7u2%HoQ~6 z%LiWA>4MIk5)Z)~q;O4%7Y`=$(YzCm(%zds>X| zCK7x?v;vv6ZgAWaE zt(BFz@5r8AJC3hkv+Ahm=_`OX^U*~BAD8@<#Pdp^Z{DG0_1zfwb-<5y@G}Ake|~^e z1QskufQJWmB2*v`JcN)2m^5wHJZZqdD?9YK=;DrPX>D32B{yiGd2-$-*zwm$;7fS| zpkJS0bbWETFC9QD)8W8ZpJQ=8nz|!{9}$3C9k_}E9`2$mCi2c?A3B(`Vf`Q3N3yf> zfwuVz4fsw1+%&*DiKHGrlMm18*Gb?r0;s*vz+w;{_#y<70PMu?Sev(KncU~nerXvO zbV+NS*0x2n<}I4Sk^++QI>2)T;MM1xSF(_HlaSX8)#tqwfRf3_i2$hpi2yuq>}zd5 zmxBCr=f%DAat~!?p4_!#YmNx`0s@>>7;s78(@22k&*;}_;4=cKJtCl04vffv ze6;)c8m~Y|&%1W(k=ik%bJJF>+cpsiBDHa9lg7!(4U&1Kq@_iQt^kf5% zCl-Lu2%vU}0IwS0s(>sdlHmf4AaqKA_#K>JRMP3vwR@`AiI~u~eR^uchAH*MR^`M7 z4O5aGj(7*h^A>T?QHoKlPXoW62;{Gei;9XxfL98FM>w5(Di3Dpb5G{v=jEL#I$w}q zzJ2T8xdiCklmpMc<8r@>0&JRRcM`-wdU~>7KW2c>2%vU}fHMdWXd!|xQowr-jDCjp zein>;@c&o$cZs1y{nVz->WLSL!>$)+lnfMOb!X=OJ^AP*;JpKrK!Dx|_(tHT0oz4U z2l%6#;^}EEyPjA9JtKg~A_9&Q9`FQENrhl^*oZ_U4fs~dd*f<^qdd~K?!=#y7ZC@P zFW`F&fL}$4`Duh;bQqBeIglf28+hsr0mQIzl&@(3wD<`Zj0nQw<7X`fO29%85&9bd z2z>uuBk&6p5W4*+05=8HzJOjud0)XGwikR57&ArywMGV2l+mLfu0dST_*#ecs@WV0~#R&^T<^L{Qi=Fq#E!9NC<)tk52RM4DgHq zVwMc>*E|%7P6IRz?7jeB9q;ciB=Gnl1Tt*Ezt228BLHUAAcR1`90=GsgGYaVlVI?* zP|dFa13V)DX2B7H(d$OZJX*5PNcIOqOh%b_p&F#dj1d4c6G*`yn7L{K-{1c&1o3w= zV+6pghRGq2?{f^u%oqVM@?aL@#JuCpRAi24T#sJJ`3!|t+xY-JXA-4!W|f5^kxRdz=d z9efPpmQ|pmwIa2=+QvR2Z6PVN&{p~`ZBv@IX`W5frb&}uUSChnWD=UBiD%|BN$#27 z?|kmPC-?Ug0Hz=)5cCQ790DGLfU`%y(JC<36sB1?40UoLL|O>AdIj8r0+N-k85amh zbbUYoNJ_#%zR>Ta8x9GKw+oEc3%5yq?}Smk+ikjZ!Dp*CkpxHxlt;kP;c;48+x6PI z+&Xp1CK9@pm=6C0PXY-3cmck^J3=$=;=<#D=O2cSp*zy0`}T;ulYg_eS&7oMQM3KD}yFuE%sJ# z$Lg<_-oz5(5nLTS5BNrz5v#ucqYvL-M-p?1X^A8z&7Ako(IQ+!RT)0Z#VfP|puGpY zHqf5JAN1kimH*<7!_%SoSR_Q%S3-6CK)^$|A$caG+}zwZNZ<})Myy11&%Jg*%PYq9 zRksI*HN6=79@JET-v!De6kE&ILvdIz8;aKARM%H%GB+T<{aAQBB%lO1f*}#c>-FK- z@#7zmz`|Gw-Ww_+;L-}%ucrH~H5%S)_Ylv5Z$we7ErjBKg4wIi#?4V@&_r@79ScMy zNInnBMLML42s~Ob&e)`T!9~=4CsmYEC=91w;B7sO=H87^X8fbD%gb7`34?UcjUY=aUNrgF#q^NAPWV zrJagr5w{B#ur?L(LBo3=A7}bbLjJj63bc7~`C79kl2;8Xku2<^4m32iBQx{910?Ws zL4}26@9gHImAgAW2A%zo=LzQTn$3v>B6*cQxxkpiiN@v*JooG07LvfD+yen;uLF{q z4~?l}L)BWy^93?aq@!o-`eXr%hI2$p0mrx#-?wxkYs=Ou5_pCmp#<+g8DNUwA{i&s zAwMDT@VR?%$$Vi_j>Z|)P)Y&bf|vfWy_N*l@v}ZKG30`8lm(JSL0=x^Cq;y1%AaEE zrSYpPA%Z~2lyPQ zsJe^=cP-2(foJ(B?$frvN1r6%MXG2Sy@uP)O^58P!0zU3a1RV?Lcf`cBm!=a2W_2N zd~xE8n~Hx-JkIZK-xPecoKL`@52@l0m!F2LNZ`(rbQs)vuz*by8e=LM5t>U zvHhQ~-Js(CA$}of*#*UHtJTt&q6hfqvSPu!-nJ7IQ2`#GTEHVo=+f$NuCyxnvj-k5 zrJ64i8T>v#kycbx`~scTY#I#4i}vUmZrrq_e?V^=ce>#7`6Cie|2TeGeHUb9G<($? zSS3rG0Oc4Kh!*Fgx4Eqgr%TRb<*KI}sLlc63F4MXFQqhV5gOdJd(ZQI{d%`;WE7I* z<(nMPz6n`{VD|U?EB=(UYa)3T;AQ8TbMdp^R$}v(zxB}lbBJ}sZA4mBAi4@^#Qf|X zJGWhHX?N-kW@v4_xVv%=WGaEos(Bdk+7b#-o+&q%@axx*(ZVNQVUY@3UVK?g_dQBv z5%&@^;$O?764MC9s#R;AFDX^&YC9V7QQJWr={bZN%SE19Y>ayCINpB*pY|TcbwfAL zy6k)nj^!14pIWoFk?wbd*g`BK(&Jyt6HCa5CtiMKN3OEGaxBzD9bLW94H#fBS-Gpt zRvV0FD+csNbavlBZGAIJztbSEpg8c-wpVp?=gmJw_t+m^_RQGg@dEMN@e|^KnKNho zant4(zTE%r2c3my%iN*a5nN2EQsa!W5?`M#3+~(h{_y&ZS*>?wEC>}oNc@#pPADSF zo?0LZHJ}Jx7+#Hsh~E&~X3w7e_VN{vpIEkh#i^ys9z9KetuJW&6XHGMHDV*Nf>=n* zBDmpF3#1mA8@}m-#4=(fu{wOHJVyMAxSx;{Gb4qQ@B`$In002ovPDHLk FV1f`PomT(= literal 0 HcmV?d00001 diff --git a/iconsets/system/default/logo_48.png b/iconsets/system/default/logo_48.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9dbec2e106eb6d85bee4c63449423f00a010d4 GIT binary patch literal 2886 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 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/logo_64.png b/iconsets/system/default/logo_64.png new file mode 100644 index 0000000000000000000000000000000000000000..25d37716ba901fc26ed4045607cac21d4e70d846 GIT binary patch literal 3867 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 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/logo_96.png b/iconsets/system/default/logo_96.png new file mode 100644 index 0000000000000000000000000000000000000000..562b6b8306917f61371a2dd1b045b89ed878a02c GIT binary patch literal 8524 zcmV-SA+z3zP)xLdp>L?}hWbGjHbIH}9N#zwf*4MfPh+L}bJv zzbE+TvfolG5zVn=$rAb0sZ$kAI8{f!;-!~fGG^xiqA4A}hA#R$*0PXup&>(r55BBDZezPW4T(vd%YKX*XizFi#geKWw6pDX9( z$fKf`uxluoFtXp0NWOx6eebT_rvLczPhI`Ie;$!?+3)lGl<BmFr3eF~LN-h?u zOD+{@O0QOG%dgdH%C2+7)oMzBvKytE@|#8K(zvXu{Mbu5DQEWHiaWmSSm?f~OTPQ- z;E^LocH)A_SPQv%)7Qke{@OEenaV0V}?&QBCgS`Iu z@yGA=WW+NeTwPsFS^huYDp+kJ`tME7oI1fN<5Sw))kz}CN0RO+e9i5UXxCw z%o9jeB9OXLAWf}6f(p<8T7jrB@EM01-&X=vIJZoox)QuDCZbZHmNeDb>hgl5E4LHQ zy6tjb`zn5l4bTzjuzub=Q!a$j|5S~STC&8L-;`pKhvO1p8jOJ#)zy|$@H*n0<2aWQHK>W8oa&R1FuTVJPCDT4XLgw z%M1<-_yV`&h-k^WXV0F@S+~E|z?$gRty@L%FGXw|ugp7kowTs?RWLWIVz8(NsOiK5 zEZr%;P2ZpVl7{c@NhZI@MA)p6k<)skM~1VToUGSCfE`_Ut9n2Zm}#oz6-Famzjk$7 zKO`10jUPYW0y*~$?ZnYCupgCv)qA0)FuI0RH&N@e)G#;1%}tX{4ohmSind%`L;c;I zs3WVvt7X(_gMwT(7=uhXIj)yIGMwDdYPbN}CjBM>|J4vdC4M zq9K_NM9T$`hOmG}{B31rSu0kon2KAshflD1tSw;)kL?#N`jbOZO7LD%$HL?!!Q_;( z=%!iZGn4a%-x%tETJN$^PEH#@rkhL;m=PRTkON-Ztc6|Yu)GTvfGs24O$wAHes}QB zM-zaXBsApumQYz)RkC*N+D~xrE<=V4u|wX$;C{i^S2Q{D>C@kKDNhRtB~2U&wW(@^ zbL`hPi~L)qi8N|&f0!I*Zj2id$XbH^IwLY!h4(N={oEaC$j+`b&SwNoKJ+U6;m|mm z6fl;i1x=)3yL*rwuk|e!Kq`cIVpUajm4}DNd~ndId-v{o5e(*Vktv1^>uFn@7V1wL zINRzp4eR?-$t-rqa(jr z0(=(nA(?=DmrWpSgG>TOz8T1W%l~D%T5ypB>G_i0Zk?vy@BDE3D^X0CD}6am8zI0t z2(YVp0!Vw~TCsqVlCt9Y^A~==S^|2_wr%bcw${h_itIT56{NmKB$}N{Y7Y76*^0Su zq9<%NxA%?6SBT`#3Y$U|stO(<;gZb9@KCiu3*Z8L-G&12#6`%-&Ci)W{eyRz2#$`9 zR&6B$I$7umA|;*o`jjfp6V;?>>bvm#W}0F53v2S|Ij^V4VjZvj8)bSpZ<340KRogd zRjaFX;i*LI2MVx8TBg$`2(TUk?3M`7DlH*CA?cd6we_=1gf3mWm?KxTNe}nP!Bx+y z3Ze_CHjyw?+zj%$06a?Ca&4_hRHrSl`Y`b5MF`Z|<`ja(tvYX`+0Z{wJEY+y1b)vOr z0Z2enq0@XT^-keyue~-Ie0Aggpk-5@e2Bs5;O_sts40r6rRo&o;bw~kc>l=TWW}80 z7C7I{GCf?jD5xWZ@k!bvan_F{Knw&}Czhoz7uON5H+T;hpp}zaqtVu>G!zkeJRF=2 zfdHMEDQZdozz9vr1i5v2=CPxsNrveu&cM3=1!UN#qCBLwhl8v$6os#VreW_F%>(W1rQfVW;_bCa=f4XVPcP}{Fp05>4f=OP4mf@67=KwMP$a}{B0m; ztBixamy;z(T6t-yF6M8Z0B0e98wAjoU*FQKHbH>BZ6^TZN2#pS7L``e>NV@ug2R4& z`t)%|{%Dgqy0QJZGhXvZmB5CU5%s8urxv$>k0Yj#Vm)fSyRn2I`z`EP2Rf1-DEWT7 z7eLwygzB0)iaCEd-PN`KTcEMKlarHWlUo5_ohF|(>+LR;Ij66ZCXGm4uKUF;cD~h! zY~BbOO&vFaAa@Y7O(w!=n-SSUfZn@pD53O*&i*%FfDMhyx7yss0`OE@tJLNfme7)= z|6Ta z)~Kod_c~LlvP9>!nTB&VuB`)m&D zob~V2sgu(~BO;=D=eu|Nzs73Hu9lN3i_qy}?6;Z#7xH7M$8HOv1hicS)W5cZ zC?kFQ=xTrS1vn1@Sf65t;=ko@uP=YFmq7%ex;i-Hk_z(P?;izDe}^%m?#Rs^=!|dr z`kJsjE$+x#EF(cFg<2N(x26DRa-*s9E`*>vxB$o*oOXgB*yc-lOVOv#=RWhyGarN2C$Xx+7P7Wgry{!RAudGsD34zzt_6g>x!TOq(MMWgZu?>C$P%DOsDaak2@cHbSzopBGT z8EV|~mB*g-|CT75nIAPbKdowlVqk*0c)$eh0x7#70CGTlZ4FyJXn$v_)7G`j315H! z+aSPhg`|9|?GV7nZ~~xXEEE=(VW|38Zjau*XMo?nc6N3)_cKGrfJ0VNls8d6391Ul zSgQ+gz4!_}>Fr21%q;AdGa*DcG68VR)ytmlRHW(p4$Tr^F$6Gy0M5G=lJYH?z+3=B zB@9ywSFR_}3onfM68sM3eFEcq*?;3nlP319$hjC#+8nl4vbD^Qbm>XuZ5nydl`NS6 z9uQ!+OoZcZBeDZgT|GO}$(*At>WD4A2m#z7fQLd-KD*{1U&9JeQCTGAl8&j2A7O{d;YByq4;6=srUaEglK2)zr`%p)Zi>b`Z1&1bN8xaP&Yc zfC!s!t|pe$g1Y$vNXr+?w%iE;4j5K|+S)qdc18}ZS-+WuqhsL*dLuUnj2iZSP5nIA zPbX~#v;VyF)w)T|37T{2Ly|Ka?P)9#z-13cLs4@-J^9}Mi~uT?TFA;RBro59WN`eZ ziHS*nN;Qnczy}60^uM?0(Q(CWNl4cr)xRC zP67D+7MGOKsk4{0lc&vaW04U00^KE%5MNBxxjZi}fvC8t18^-|mQqS1gZh${CkXd~ z2>WDuuvTFU(z^Rt(&eHHI#bki0j@v*i0ka7kd$e;2LkvTUI4aa<;?l3^wF%(c7o>@ zY;0_LAvbF%K-cPm_*+D!5J1&N0!TY$`)=)^jvgS&8_|%LOadow1zA9x7mp03tm-?Q z;5sH?(*zL9Rp`re^nw7M5Fo(7CWr}8RzYVkUZYR{^2I(D^H^Iuxk^G&K5^Wwwj?E! zsI098(34oFQPQ*%6R6`JkhNdYPy`%ts0Et~stw^Rphq{v0zIwtP zyk!!wV-_$+z5N{MKXE@$X`Ozy?EYgxtOamUb>%pELx6oUT}?aK8T9;%Or62k&_K-usMVnez+GcyflYS z0vOO9;x(Z3hCde!%gQ=V{uE4?V#1t5`|>Bo{#91D?oEzaB$WC5eIz*%AUWys4|7 znMkgauL6J&J~9a$eU0kj1K_>Q{>HGEp2Hx1-_jcb1Q}KUcCEa^B8oVEM)Uf_x3;hr zfGDVsP5?<1bSv>B&xH*jQ;1*<`|sk12+3D=UqFn8xbOEY_d|eS z!}o-z=>q`{8&CkgQ0q=+E*%UCuXb>7`c67CChZA3hXnfk2m$yC z=*N=;{*R@E@*DKcmAUjpfCbqx68%7~pG*QAYeY7V-}8Hxz7Qb9umaT8sf4848MJGk zUokkIV{B~vBCGR&X~VTZ4*yxU_)kPNk5vF99@8s{rSnCnsat^gJq2()h#qqz!rPYs zRn;}ZwfGeJdCkTYaQq1b7=^qOVA5zbbn@hP#wjcFYe=XOt=D6eK;P+_b^bjvVWFr$ zLdt_OJsA1sAau^fkH{}`A9>x`MSIhCP;mA^ntJ+mvcP9f{&LCpEe{x8fReIu;oRjo ztc+N68XSLs;ppMW9RcHp6EZgadiNfYm6jAsq!FK!@HkrlOVI^K$(q$(f7E<`nI7!D z4UYEE_}Ugu&?c!(#fYc-EgfO>)^Mn6v$%*22^dyuGu^Pvu;fJ0rGuvFgz zW)8eoQ%fv;fBh@!z*+zV;OB^CSQuCU%!W}4?EitlaBZJHPyP&kCz_g?_Csz37&Tm! zYl+O!(_{O$L~3G>YY_}#C`2jLLoDN}p2t+;|(U&r7?&v~T>0n&k z*YyG%Qs~cP?QUH}&O{r;_LaM*);d6(y$Jp?wE}>z*7ia5MOvhWP(!~Yhe2GhOb_hD=Uye#Lm({#q#c&&;cyt_Lzv%1^&_QL*|b#= z@en{-mROEO5Ck~db^@mjmW}1=pzPQ>TxMj!)Bi5s{jcwJ!B%GGpW)0r^K{5;%n_#Ls-PJth9)p#mg8 zfFSXFeOau0i^CA$cudysY<3H$9syzIEKm_k#7nTC!8HE?kV84zdZ`T2i@)nM~1#w6dBk@p8AkF0FXBAJ z2!e-FXfX!z(Ar<2E~n9FhLSlKpkeK|3unhWP-sD*M6`Ax0PpFhre_LAPhOy3+_sfH z(WBRP@Gzf;oI?SphYdHkia!84V|eu$NXoYeg8`31^6 z8XVn?tiwbB7$Fj{V>YO%r%O)g&TEkXCJ?|m(pXZyr6@qxM-l*i9`tgnDLyGx8+t5; z7XP#|uXE=v?rfOZ#Kde0^5H-iPQJwMx48&FSM2y3iTtg2M!A#&icz0W8)61<#PEv*!)S{ z>~t|W`BJB>ZwXy&ZEe{PdJUbmuiba(RlaQas`0MnZ~k6mz=kws=&%@bb7Y z7U#q7%>nsuvW^xf|FQo`E2Fy{vkM&3VB}-*BR~4`tH1f3JaeHM&q-iYbXt{Ct)=#w z1VOCzl^D^yot`C}L9O>W6hU8qw=}(1pT2BK$=`8LGm($u18gpUncn8NgQVc$mjgN_ zec_;=$Ll}z8!%w0+oo+-W8;#vIr&9YP+TNb)l_5EsfM)dpP)yp&o!XT`$9U7uc7Li z8iARc%NR~R9C?aXZ`@HacKpOhnOy!eOb&~5-eVn5z!h+4KjceWf}D3iY}f__IA<0i zy$;NrGG*G%z55T|iH%DZGII*VX}fB4;OZSU{u?}rrbaZ6cQSK?OV{Fs$mk2S(S2|2 z%-LVWT3TDP&ebB+`cD-K(>K^?Fdx^q0Zf_`Y8u)(TX2)qACnRJ@H$AK&}4*rNFf!E| z1gRpl92x$$| z&ptOM7&Uzro4W-*M{At{|23YQn_k@3n;W3k8_YLY0!~10HjDw&^a^v-z=wGK&F_9U zddu_=W*z>=lAmI?dw3UxN1dfp*xVd*@j6|NOQN{MR1E*7QPQnDlzck_Q-GPsfz%A~ zcw9m%UA~@3XYu{0)0Zgh_*ps>dV;p@_E9eS=km;HAIv=a+~}7BJ9qB771vx0EMPVs zn8JU{FrYX8jg~F{>v-*7h#o9#wX(7s4FX>0V*CmC($3CdS)V?xZm*1=aNvWF{~Wb& z(URB|Yc^)C+qffdho^7lPEWt8UHkm2cklDB-R|LA|1i;$N>u-h+8vK;Ev$M+OUu8$2hEci!$TqcKEH9w^A$NkV{^3H2UmUlKu}^?p0S2KvWz60000b9J({MB=7bO>ez#bJdN)p+v4N2N$i3ukfVGL%% zt{=rka@ucgTZYYKoVd{9AnRhvK{AiSq9m4+yz4o>p5D*%e#4tfMKB3tdoeJD%|1<* zIZs9Q65nBxHA0jzhW0Eth9XFw5jMPPieI(}JN9YH(L?%H%4AB60L4$jLpap1^5!h$ zScNNv3474~n-C>TpyL>Kd~sQ>q&a8q(N8hGw@!M{@Z;2mwd&NF)J=EPec@U6T$T0H-PhjrYCnKMgRZ+07*qo IM6N<$f;>6m&j0`b literal 0 HcmV?d00001 diff --git a/iconsets/system/default/options.png b/iconsets/system/default/options.png new file mode 100644 index 0000000000000000000000000000000000000000..5d92de3fc9edabb6c1069dfa2a6318148e53bf45 GIT binary patch literal 900 zcmV-~1AF|5P)5i3wUSxX=KCA|lPuVWz`e&;9au(X_6rPx4*;lF#BNR#!h`csK*d9>dVT zpPU>Wj^jvHtBum}arsuO<$M|hp(O;5bKQX1*&O-&vna0Xb9h+9^Zd4Ld!IOt(=j=D zp=*Br`SF>V+((+Geh4xlgg^)$?@{WNE3YLS$Bi3}R%{rFZ}<0$wI~YbhlkG^y}jKi z3Nt%9f9<%gzvX!$K@iYvT4XY5#>PfafX_k9wpte3+xrxYrNZXs&JXo^3xIRyhUn@t zmtEIYec#7+Jak=WXs90mWn?6CJ)6yZ>HEQ@D2hlXjrZo}F3+b@op@dVfTpS0TGQ*a zEQe;JO)6zFJw5vHrt7M`w6t)cT5Wt$Dn0mSaq)$>E?#_!M#DnWG)_TXxnjS*}OB|tJJq* z5u(%j_lf=elcAJco0vFHUtc%2?Gwk6Ac#0RDp7C4d2@esK-|3+`Elqt@<-8;CcE%v z0#MY6iI;xf-93oPL+- zG*gNjH{PY)ZsR!KifJZaPNg~~EXymU`v))Ie5HG4q+DPqIG_)(%>+jx75@2$`i^C} zg_a$m0SKXxNNBe$%emcb+GZ>ir$4^)qWop=tI=E|oiaKA=#(&~xLPF5wXJO(-JqaO zP0bMm0dX87B}k!%17@Aqvp*Hvt=QJP^reAk5-Mj5NT{fhpTHwTN($>6;2q1g#k{6sNNOjrb)^3KzW{)uKrAS%|88<{;=Z5m!Z@fIzg1o3 a?SBC8VR)#mYHyMN0000ny|r8Z;0f~X#e<+|Np7j)}&uk zPfSQvLPJ+laf(4-d8&Fa>cvL);cxr(m+{<%m}xJ>p+xb>DY=3ol4~-MWi806W#!6y zyM`dapHT4He5-~@e^Mf^i9PJiSh<}Y^JtO0O1_mbxe+SS|PsVKw4BlYw286=`LHyMSmxeJi wu0VErBv5(@l0YmY<3beAB{0s%@GSxW0CZy(5p6_P=>Px#07*qoM6N<$f~Bz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;Ye_^wRCwBA{Qv(y0|+oOGBUt`L-=_H5gtBF!~&be)918g|k4GxVka}I~VJJ zWVHYRgw+71zkeA1e0T?{ttyJ9qpxidujG!fL>uPoEh6e*X%hKY(Z; z`1Jb0ImVm!85n-Ne2StLAb@Zf@Ri~JpMN0w9f$^j^N-v4zIQQ;p-<<7XSnh3yfi8v!3Dq_sYdQizNF)xAq! z_b)zi;>VYdkQib3!|>wYnK|gL1qdLx0TRL@YqFyat$BGMNm^P~oLgB()p<_q88AQ0 z=Oj28|N8O^#Q=Z+f*T;rC2D=~5=1k|+t0r+Fuec5&hYEcFK{#**`Cj^37Cj}FnnO> znS)3Q009Iy;Pt(y_aCszDuVJBOq%cCKZX}~PhJNyzdrkW0$X@900a=+fX7$YhH-!Y zxI$S=SD6Et>%KgF!*KiHwyPK3PH6?1&wv8}1P~)qb_Tg$K%ULbf%*48iSPeky?f4Z n=`zS{ApVS!)c+&A01#jRL*E3ESgM3R00000NkvXXu0mjf-@->0 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/play_sounds.png b/iconsets/system/default/play_sounds.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7b6ae106d4ff1acbb0a3cd1e11e1290c408455 GIT binary patch literal 778 zcmV+l1NHogP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;fJsC_RCwBA`2YVu0}P{sQVYflr4~&8Ed&^Rfm{wC zW<*y5(gzSgObj?ck_LmLoe_h+odp{M2Ma?nP)H1jS+S`F2q2t>eEq@Tq@e_Hod6G$ z9FP(QVs>n50Rjl8A)mf8FmZCi6@gsAiOVGb0ff_#&p#P1-Fg6FfBVDm5UQ3Dn_7SX z!fD9c-wX$~9AxP|j-48NZ+FudH2FaSvZ24WQ+1_l#Bh8RP327PGq02>4lKq!W& z+cV^Ad+PHsd^*m+@bC=W01(Xz3>Q5v1_m1|23=7maIWTur89s4LJ8QtI~ihLyqR5R z;H0D`sqDZYt?+_@f%`MVqdPAc&RqD#aPd9E>*Eg@PM!F{umPGG!Hxh3AoO$s%4Fgo zti!>e&%wyR_vb$Y6G+9~pA2`u{0F=32h@EpKp_Rx{}&*@0Ll{R<9RjOoB#j-07*qo IM6N<$f&$|}-2eap literal 0 HcmV?d00001 diff --git a/iconsets/system/default/psilogo.png b/iconsets/system/default/psilogo.png new file mode 100644 index 0000000000000000000000000000000000000000..5a005f6fef04beb21c250379eec1a0bb758975cc GIT binary patch literal 1513 zcmYjRdpOg37#~YxY%W_Jx4D$cB@8))R;}q+F4+iaF?FH{TbBFTj7e_CC63%LS@AGd zIPUg)l1dTf7FJYGnp>-<5RN%N)pMTn$NPTY=lgv>@AvaQpXd1`ySn^_fUCnH5D0?k zKp;aPQb)krRaP3zAKYwTKp--FBH^feE6!)7v_FbDrdAkvH*VR!?K-q-J}=z(kmMe5ItJD}a?T;5cT!Ufb|2 zf@K@A_(w?1NFWODnqMS2E-S_DIhdwogVp6Aon*_QC_HR0XOJzY%b?;Nq=N2rso;-* zxAA=iUwmbC%fJ_Q_;lD8j*_bg;OJP;mr=SzdgxTKW=rcJo9M0D>LTu--Yi|axN7$0 zRjlkh5P(z4MtT7G(Z(3mL#HI96ZwE&LcO0847X8|xy@jh_9&(NUK#X8CC~cK8(%T= znO01CPS2cM7^jlx0?bVAPf*6X!X1zuaWwZ#^=M-TPVvl=zxqS^^o>xG7v$i?;_`I% z+-!zXt$pqX@k$Idt1gar&DNvV2OWvDyCdN@&+3>5ZrajM;6YaPRG~Zy57F zN^+UYtk<}K`cyg~Ks3zRXQe=cH1d#?7{OS?*tosgnI-SO!>8uY{Ub6$p9@hBem9yc zA8ic(yxz%n@B|XgX2LuHkM8Zo6=l#N_FYU1LtynOw$Q>af#^}aBSSkX89!WGe_7ae zDv#vOvq7hmKa}%kssj#pT(@vr9$)~vhd)+z}yU!>2mMMh|UDRl< zqYMTq17rL>zx=iS_c)WDn@X1{;=TP<+weP9SQJ{m!K~l36ZRJb5CKEXx4|%Uh5sKH zesH}1ZNn$1CnRl3+=N?rcpX`L63w96!AAL|rv=ae6@)eIHu-lL?wdkl)oI`H7Vf6M z<$C_e=&m$9s?~87zQ%4FK8`fV&eHT6VEWtecY0_=rr`UWZ_z0Iwl%facKokX&Z}Hs z1T>|e3CZAOZ}c&!mdK7xIXJ1I>j~X5$U0VXb!1nX2yposYlNe)x+vk3KhbM14QxK8 zbY_sQw_XZVYhKsg&U@YE+uRnY{GEZ^%k->mwXSH!G&`*(px2#j)SJziK9u2lybCfYJlYfL)Dahk&`s6(8v>(Eu7$-oVY_BRkf0K}O66Er*C! zS@RyA#`hfx)r6{-EE2X>?RxuyU3hXAa)0nX1;OTc$UcPy*yu;#R=d`g7!a-;{gwMj z1?`vsT{Jo9tGYW_?^8LfFm$~>7eO#t#qXbOx_4sU_TGjG+{_B$3L+47I}=UA2YMV#!^bFF zvs+fhU$dFsdxYA{o)@bb)4|OoaB=zzPD_YaQzlc`m!8EGIz`cEfvYp*_gS@2$HS%* znNu*W@o4!iQ7@RR$tawapM`bFC)mSAjo~&}vdKuO=n>C;R)W0=HJvg~02LidqZsbQ zGK?!Fe6%Sq%fkfh!?g6-Csf(DN@&#d#uKpDu_$n$K)Kbu`ZXc&%}Nq4nnZY>?_{Rm zWV#|iv^n>3ZCZ+Xm{R*r?Xd4^fhZ(P=Y>#F{Nz720C58?gembN^vQGtp zeEX?{AAZfsXP=%yr38D?I8v<>XfsQWR~gyj189foYTIb2*ox^40X4m zK{I@;z-!0LN+p7xX#RAsDeAikN-qMay#Gw_ZYpSk5^0U@NVw$#Iuo>T2+`h!P=}|+ F{|h5=y=MRb literal 0 HcmV?d00001 diff --git a/iconsets/system/default/psimain.png b/iconsets/system/default/psimain.png new file mode 100644 index 0000000000000000000000000000000000000000..f74bd1236d1f9aebfd4325719250b7c25f0d929e GIT binary patch literal 1067 zcmV+`1l0S9P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ#r7GIMB6};m<>c|9@^UfB--M zF)?5OMuz|Ye=_|0`;Fnx_b&{xiY(ij)#e z7eD~9K&bx=fByjSufGg`S^hCF|M|ke@b?h|1CzFbx`DF(v2zRzSFfHvC?L)HZS#`e zC9It6jL)8nN-})EFAdau4`c#B0D%qq&&;7BBFF8js?KA_&c(%bdLQ?)w;$M7@~e87 zDX0tcpS$qv&yP2E&ixa1QvLXei{t63EnEJ4xpW5EM*sl?Ht6T~{my>L@x7i-qMSTH zkI?^4iUw%`$DV7PSQ)OCh`9Jicf>Lwan3hH#_efs+9%B92L*nk3n00Nu% ziB{4OhSs>d~(W$XMnN$^3mmk9MZnR@0kQ- zE<9vl`1SquYl!y0aDxB>2<$Z$v0w&P4naO83wP7|FBupfT|Kf*&d6W$EfWL#>uV3b zeR+Q7u$)7zm7p{a|F?Hv7=FIHbr(IZ0Rjl@B2|Y%1`WqFQzca)IkqqNe|-P&>X4d= zm4mD#(9V|!&oKy?Kh?9h$(EC0VEFyw*!7>EZeK<>2q1vKF5(wvW8mgyh9U=fYeKLg8%}E5tK!E)M6PpdHD5< zx?7J6i12ehxbfzJu(*IU3o8@r>&Gu%%W6mnvvD#pt?ZkAe9x?`2%x@4FatpPK>#3t zAPi=pQy6#|O#I8*XPy81fBD`2|7TtN|9|PN|NmD%{{O#c|GPg{VYS;B7}yNZT>{b% z!TRS>|*DajReYxFkk^Ng8%{u97ba1X<)&B ze}4UD;u1Z`^q=wHyQjYx4z6Fa<=(0FWeh|BfB*uA5tq0Yk`@2B{{Q-7{rAs5o@0Y?A; literal 0 HcmV?d00001 diff --git a/iconsets/system/default/publish_tune.png b/iconsets/system/default/publish_tune.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf51d2039845ff14397f6b2b1e9562ecdfeb38d GIT binary patch literal 988 zcmV<210(#2P)%=gRWk16)hJOs#fCgP;hy$u(0b)jwa)1EBhCmW*K+FZi+(66& z!~zVF+;$A77+*8I0~&OnAqgnP3Q`LYK#Um9XJVKD)GEZl2Q-L-VJ1T`!wRS@&{j@f zhNC|(Fc|%lVmQU%&0x>42Oxk@4X9&T&hVP`Ap_^%KMX4Wtr?X5*fNOz|HAMKXpAMp z0f-_VUWQX&A2IO$|IeVwAO{dYjERYf5!~F|(-|2V1(=zc|8R10K7RZ5ZSJgDvyL+` z2y!#*|FnTY?XMv)V3QdX7?uD{_{R{$s>M+F`y#_Vre=TuVhjxp{mswM&+_lzKd|{s zOiTgEPZkupx68&N1*XN&*BB)1N`I z#D4$&J;US2kF6$8o_ql)^p_#{Pb|ZE#%sW!Tma;Af)(BZhS#DuOI-}h8D23k0t65f z(7%5`P6jGwICbh2$mtB>;o%Gt5)up?92^Wld4*N0R;^}O%J2jjeU}+{86u%k$iVQ0 z=@&o%0WD^BH8V4l|M>AE!;>dZ7@j_T$^Z;V27iBlhUd?pGqAF9DoaXAu0Q$r zBoD(6CVhrO|Cci4F-&22&3+XifS7f4brU{)`Xp~{ZOw4|_HD5LU%!6MASWlsz{A7C zz{SM{GK5h^Mpk(B{Z$eS4>`6lT={d3fs6Mx!$y{+00G3TrKKhO>(?(gQ0Uv(*f89? zcaP!6j~^hXGiYmTgJT3_2rwA6;l8P zu(+$Mp}mojUaXFejs!58e_gzIbzf_1Q#DZEE2s|lu;P{BZdkr%pTMt(rh6LOUUx6f*{(9G_)|Y zM5shTD+jTZF{Vt3$^}tLouP3laZRvN5}VCIn=u_GmkKqrz{-Uvr8wPlZG7;9`|$tw zo^Ltle2OAM=e;zxY^4hI`*xrfnv2-Wh=Ep!MST;YpyM`1VJsrwWf( zd&DYkFhTE|a$!z93QI~DtT)6-i-1iNfey_XbZXDSb|(_HtSG#>9|NZ$85Ns-M3UvP z3M&sj%R$2)A2f#s;(0_6S|WF$H97=653jnG)6t-_shsw$X zyW_XZia~uQM(PTHAER?WXQ$DX83SuZBk)~q&`Q-fncLserEu8vWaFuJJ_g0YuF@i{7N=0Ik%DADlP`SO?%Q| pGzoR4RAifkab}(OVp-V@{s#oPw-zKiVYUDO002ovPDHLkV1iqEf!zQA literal 0 HcmV?d00001 diff --git a/iconsets/system/default/register.png b/iconsets/system/default/register.png new file mode 100644 index 0000000000000000000000000000000000000000..325daef903a3591fe5cbd859449e638e7b28fa91 GIT binary patch literal 562 zcmV-20?qx2P)LaOTAJrC*@JDV>S{n`vBC1j1HFljw3FC5F$PbK=1`=^0c~gdGB=kgif(I z2VWN$M`aj)y$ zyj6Vq)_Ya+{1-q${l#RWKmynR9AFJV{r_kB2F}r$n|IKv)c^nh07*qoM6N<$f?4eT Ag#Z8m literal 0 HcmV?d00001 diff --git a/iconsets/system/default/reload.png b/iconsets/system/default/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..667219f988ebb824fd713a7f29b3b9663d755bce GIT binary patch literal 832 zcmV-G1Hb%oUhH$sjK}@^?vGycua$sO;CM!=^ zwlV!Z2!q85hwCRuZTW(*Ec@v=!PH^^rA>BlZ%nkYJxS)UO-do>Yw7c1$hd_`vjc}~ zaVL&=7_C zrH_(A;V6_H5eOegu<6@PFsRdokzWUzjXbGN${`6OO)Pv6MPXwUBeUT++3nrN;i~8i zfNWLqMUBo|z3IFlplmh&aO4dkjww@Jf9B2fm*NsYe&wtfR-0&i;2rcK8H0000< KMNUMnLSTZ=vv%hI literal 0 HcmV?d00001 diff --git a/iconsets/system/default/remove.png b/iconsets/system/default/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..7eff52d70388dbfdf834074c02a70ce8f950cda6 GIT binary patch literal 699 zcmV;s0!00ZP)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ50006; zNkl)jPVf3??`o4BppkwT^8&G@DP!_kEgAXEgT$N|Km7-=mr9+8d3# zFAfe~zg;F+>-YQW{?1NkI2!6?Au>vnl(Jlsk~xkj$|Yh&TW4qA5BK(-sTG33U_j+^ znaq+&Ig;``Cn*&YuycEeQKpW=AT%7uUTMKhg^Q_2sSsjRtVO* z-EQaW$qB?t(8@Yl)(uEYAc7WgqKO!e<51;hg^rF6jTHiZv|24{x7)P4`w0C@DwRrF zmujs>_4;j)TKZkCMO|H*fRng9hMo)lD+%GG-s|-`ZQtAeFIj8A4^HATxonOZ?1aRP z8C+pu8C=!%1o(NLw?rTd64=V%_b~>F_iG6Zlq_HuETw|*QYWcV%to;rhQT@63IXoJ z6wbBhMN3jA$Q)Cc<@#oJX;HybU<~{KewvFbDF{MJ;^?1* literal 0 HcmV?d00001 diff --git a/iconsets/system/default/search.png b/iconsets/system/default/search.png new file mode 100644 index 0000000000000000000000000000000000000000..d99f70bcf156ad3f480c9151fa7652078b1cc7dc GIT binary patch literal 1025 zcmV+c1pfPpP)AAXu;QUsj>H_lH zZ&#e?xobSusWaxc4I5J%znk|8O-zHmqZ+9z|iB zKI)6>2Ghk~mpE-EO#*2qIk!rly*bG@)2c=Qdk+AR%VUs{QJtBbT>4gC-l8ylD`qoh9RH`>c4;E#W{^Vpn>46(b_j862GaHY$7X z@tKu0uake6$tNZoXN)%fzF_0e27y=ZS^3Qv**$6_d}6N3-q?Ho(4kxg1}0D@Q-q_q zQ)e`o$R{i0jFFsNv~l#YjW@=vyl`io=X4hK>II(GE)%|rAMNcOg1x=Nev--J%6)xf z9Ff_s69ylV+6jRJ6E=Q7Ze_22o!z%A>>OU>8SN@Nez36q`WoSXWCVbpot*>R+;&1L z-2rUzji{{C%(MR?d0ubjxe*JyhS%7pS>>1CnpuBwg)LV|-;6V6IK5H@U_1Ve%j*HV z4wm)I_l=R4^`v@Wm971&tiNDlP1g!*)dEv$7x<3qE8EEv7!*U~`CK5Sv>gy_+9%KJ zSj=f3<5?})c*(}r2hm|>RXQT-65{P#=UTt zskSA4J}Zq=8C?(8EV)E{HoMvNiQfef1|S;10Xx9wwU2dVsDXwX$5|2y?FM^ng;LodO-U(x z-`(9aATF+e&d%EsMSsn0_*(}6kUHU$n!`@il>2dFsEJekMJ$UJ4Wh2@>pKMn^}68T z_oB11s&}QOeHwWG{zI?k<|h1?S0%_(#l9d6p9-S(bQCY=Nr>$1TAMy{c662`H7F29>5GDNyCE*6U?KNt200000NkvXXu0mjfP$T7p literal 0 HcmV?d00001 diff --git a/iconsets/system/default/self.png b/iconsets/system/default/self.png new file mode 100644 index 0000000000000000000000000000000000000000..65f5d9a8e97554f86ab628de78e3147fb9ff2d35 GIT binary patch literal 768 zcmV+b1ONPqP)C}%EIML{8D$V1E~<;5 zF1qYb=%y|rh$6Z$D59Y=s5w^~Q_A zUhNg|EziJVq^{9tJD`jWG8PJglp~YYh)u?@7uoTzSC zn?Q?0&Op{sKqmY5*?)#P2z5SJPMkVk_0qGst(e3tWHb;0bb7Fuc-GzX^Ses_f17Au zXFomBdqs%wQz6D*2{Hash~Y<~uk&2WW986)TL2hhd*V}S8~*8E%q11FnR!e_4hH3e z^V4!yXi)+AC@WjjeDD5nd^9RVctVJ-uAu1d9u$!&AtF&B&R=*K1hZ?gMqbR%oV|Lp zWpA@@W(KnJ(AO6xHk-p$S(bb)P-=skDv8?K+WNd7OioPdoX)DI z74BsgYq0^h%S?r9IZaJ9)cbA75=0f1yLY<6w{Km$o=nER07y%UaJk*yW}nZ$*5#_G yC@Co_6p|28C6)|@LZbr%pFc#SBX5AQ1;KA|JQyVixm^VS000025EHw literal 0 HcmV?d00001 diff --git a/iconsets/system/default/send.png b/iconsets/system/default/send.png new file mode 100644 index 0000000000000000000000000000000000000000..d42bb0ae12349a63d01c6efbe18547858d6fa574 GIT binary patch literal 688 zcmV;h0#E&kP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;CP_p=RCwBA{Qv(y10?_;fS4F41ONfVvhety|8hbM z4FCQCG0-*t{z377G#boiKoL8C|2qRf0I|pmF)}!)GozRa^AyN;|Ix*f#D4z%#{dvO zEO%c0VbGUhVi4qJ1l#Z*Nh31&~of2gSoB*gQx%t*nrm`|1g}s`ig-M=*=)^0R|2}VTNB| zgWoU!1P}`-G(iAl%Rgo|26gd242G&A4ENtNFg$tvi{bmPKMVpq3=B5fj0~*otZ>ag zf#L8Q=tqD6VgW@7$d(^K;@Qhr3_@a(4F6f!8I(8~7^Ed23PBov{S{>R@bMGFt5+`> zIQT_@VZsEo^gjbY0I~c5n(_mP-+uVSz#|~c@Rx}d9LhicK|=c%j0R$6Ek_oS6Uuh++c(0t^5S WYd(k$abC~>0000`@483NbXNdy}?A(g={m6iX7 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 Y0NB(_6O>>+KmY&$07*qoM6N<$f~sP-#{d8T literal 0 HcmV?d00001 diff --git a/iconsets/system/default/show_offline.png b/iconsets/system/default/show_offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c46e452eff944e9287259d6856f8a33334a3f189 GIT binary patch literal 866 zcmV-o1D*VdP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00PEIL_t(|+Le>dOJipk z#ees`U%5J(gqTYcM`9#`c7%XX!J<%I6e*N0T!b#V>tE6TqT8-o=(4LW1Eo-~pj5Cz z2LcW8<7OH&H!|_2H`n*QA6?8;rZSrzcy{L;o`>fgop)e;ecjyL-2AH5YPD;%S~U#A z-)?Vj?}79&SAUm5v)TNp)oOjczrR1Llxhx#!`tiY>*r~jN+5fiD;|rtwzi(sYPBy{ zS6B1H;gCwDVl^6#mg~A}fc=;y5Nr64Ep!NfMGIK`Dil5-H`wR$&-k z02SSFoK6q~AC^ibSJO1&IDVMN!hg*?&+8u_AAdUVL{Bz&0$&A>xAh#nx>Iu8A+0mWf{3#j@j8++ceEr zN~xE?Q~=cLb;EI-XO82b>pGTYA%s9Fg%ASEvM>w-$8jhYi%;|UyagmcY5=5ZYR=5e zR4mIv*L9?nTwPs_FE1~DuU4yTwOY-!Z5vI~$mMcH+qRzoCZHJr{eFL1tyX`zxw-iw zP1CT`>HKZ*0StB<@(?F2c&#qUJjYP`Tzg`07*qoM6N<$f*{0?2LJ#7 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/smile.png b/iconsets/system/default/smile.png new file mode 100644 index 0000000000000000000000000000000000000000..3567cd098e6e2efd4207d033b688857a872fe47d GIT binary patch literal 869 zcmWlYeN0nV7{=eWmukgIt#dSUtThFL%NFOv=@_GB>qZe#hBK+lT(20`C73Y3LN~$Q zq8mCBQ^)29FiQ;xCJW5C>?3~M&0vI)!7{fX=(sCxVrK@_(r9Rtq%UzgDwrB(Yp#~9<`}jy(Y^27vYRM<(QK)xxz)rjIZshp5z+ah zb@Cfc>}=WYtSBS;Fo#GuK$HN}2+`i>i2mV;@=p?F)_m%|_BxUJR*9qNP48&sBfzG~ zF-sV`x^_<2`M)7as{v)*BTRM1 z8G5gOL8SsbdmZR$S8S4no_DC)GcCdo+Je&qDw3cidaaD%$~leSlH0%~1Qc;N_R{35Gw zf5zi7jPFG>At2~fYmP??oh$6**L$z@tGm9-I<%WHZH`K9;oA_(s+SHbeGhDH`|kKY zI#ug`$H|C37ze)1@sH6@syMUSOZ+_rzjE_M7w;TkbN&AU4|f=BqBdWCaSGBJP7$SQ z=D40Yty!+p^V||L*m=!UgAw8+@zK8s+j zS~GLh^h^4Deg$!cn^Z2;iJCp5_5H97>J(po(|vrt{w#(jb}7EK{uoZV?xOZBuY$rH z7LslR(opQGW}!vkwYddSF0){5VI=E>s8l)*anh)us<96?Plp0ATL#kFnyV`i?B)*^ zTkZ7YB4h5(OJn-SE~c%|J5jaN)E+tWq{HgEFoWS+u5zQ%PND3oKyOUn3eo-7965%~ z5tb=w;>TImo`hm^4;(!9nMys^y2{_GePGTFobK@?QI~ZGjWN^Ccb5rN*_QW`hBHxM X%dz;|P4&Cjm!Oi@HaNOp;T!%3h6Kio literal 0 HcmV?d00001 diff --git a/iconsets/system/default/ssl_no.png b/iconsets/system/default/ssl_no.png new file mode 100644 index 0000000000000000000000000000000000000000..e3532f24e1a8f9383e0b0f406ac5d1a86dd5587c GIT binary patch literal 460 zcmV;-0Wr@(EZB65oMYLJS52Vl)~s7$mibKM6rB zDzwP$joW*B-}gO+TTM)!Go0Z(IXS-r|6oOJ!RqSipB-52%^5x(Ubf#3s;?UY&=LuS z^zhQuN`9m}Ofr<|oOIg1u8M9`m}|{W7nTPHichDz7w6SPCL7O|@A~g=4A=l(qHjE% zxpmIgOIud>eig3e(y6?6#23T>zGEe;_ z4+XT;jVqqEq>*B^!=7m$MS+QFM8YKVsq{xtZMN+%*K9C-sh#OaZyR{RE-n=sf`^Ao00@FXQNu^@sYQZ8Q76El&}cLv3c+BS zF#$oNQ7AMDjX@)k-~{UWU`!j~w+w=beLnaB|MLU5fULA02pkCj0000=DBWUu`k|W1ByVK1mmZ9brP7<5TL-JFpWo&4 zyBoT0ghxluWmHuiDV22iDYClm)~6hPzL~C7vNYmzv@>sN053@DF4!r%oVd?naj&h+h)^REB!Vq z9d4_Bg=vmeKN)-i$i}x2;D^kpl%ci@c3Sz-d3I$<`!bgr%&2?N+!8fvH3a#gaxI=` zeZTN=HXSDaz#PTSPX%MCQGQ%)4vNZVKoK1P;6e#D5T6Waks-HHE-<6`mO1><)%l;E zmAVp&Mn{J3U%nXzb-si7*bpIb9n>4cSPh^m;3y-XmehN-L-`zl2Pl@?a5WcbT41df z0M>sX-KH&oLKFHnLrM4b?x3to41`>uLO_cH?3A1U5P9M<2WlNukItZ6Wj%n^k>JMw z33{1z-tpl0$$ay|g7@6JQJPg#aXZ*#!{u zffxfA0n+t=j`Tpb?4?71D?yHD?gU_%lH0p1x9}Pld~QI32oQhwm(p8D5I_Ve;M+6R fou=*M_#g2Hk6umFhfq4e00000NkvXXu0mjfSo}zG literal 0 HcmV?d00001 diff --git a/iconsets/system/default/start-chat.png b/iconsets/system/default/start-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b17b18b80e6ccb971ad0749f13a49cde49dd8e GIT binary patch literal 533 zcmV+w0_y#VP)J!KnY-Cpb)U2@!5bl3WzO%SPO_bk>t(-@jf74iOYZl7G|dTPDYXpS_%RTa^llfg(`xy`C&n26Z`pyiVSA`YA)-s;dnD z{{078{udGk|NrO2xhoUY3<7SZ(hSx*VjyN9JP`l=`x9!SAwqP(8LNZUy21_k|NkE+ zDIqV&3kqun3Ah1&etdp%>F#@?4S4bHJBYduH{jccXX}>lxySJ4;}4vgfPu#F^~WDD z``pd9AZj<NPukCXB{_%PI^yiNf=WQ0&U}9n8mKWy%8}{SZ?+AurvnTCG*CuN&0bi5kLN-~v>pQ=7b`>0iYp)&v;w7Ta3y6p0J@3~=z-6d=F= X09Blm*mDF+00000NkvXXu0mjf+ScYr literal 0 HcmV?d00001 diff --git a/iconsets/system/default/status.png b/iconsets/system/default/status.png new file mode 100644 index 0000000000000000000000000000000000000000..38b638864cbfcf4fd05f0f488e8ab10605955f78 GIT binary patch literal 669 zcmV;O0%HA%P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;6G=otRCwBA{Qv(y10y3N13Gv=sZ`+qzrXu`|NPAG z^XofDxu&%r(A9wS0t65f0~YY6FIV8tudn-megAOb`=?hIzI}SN|3Zp}05-J%0mO*z zf|s4CV4MH^{&7L3ZdoEo>|CPC{2yQ582tS9(a~}1{}0G600_S3jF)`XaC>d zKQG8PuS-O>X}=HCe4q{kAQNr~NH0JD!M*ULF~Z>Y&oBFbe*1u-83Y`+`~!&{0GYMl zn-T6EfB*u!;9*Um!N0%1_W$|yZG&3hfkXy80H`?uNacgfblCFm13&<=fCRt1f3*MG z$CnSjet7zDzc)hz177eSX7_#|VF(aFU<1B0{S{CxS!lrU?=J{5F#P=k#lIOCegpBJ zUknUCz5v-k`rBu)_?-hwz{UUs5ZC|~Zhi&z>%2XskIMF-Of2^AtNr{SW400006VoOIv0RI600RN!9r;`8x0&+=2 zK~y-6byD3+Q(+iCS0NEWcXbm%|H0YLho0@YR?(EE23|x(p){$eBoT}iA`#SuA43bW zn~=gH2#P|?KCUXzt*M!1HbdOmn(kxo-F*re;9d2wE|%a}Y=iOA98&;%JDnQy=*cJ@ii z&i|3OkJzNKc&Qh^9y~-^i(%O?EG#8;%s+nt?eH;#c_G=OsIENn5HC{YG2M3xsnJhJ zPfcxz#ffi-`7cuvy<6S0V=V!jw>ef?hM#ZVVR3vMCaanXhx3r}FN8vfva#OU-@S3o<(CPB8j|$e7VT0PWUojPT+@z*Dk|5;!Mi2d2C3V&-1A zh2M#U6-?)kzL#rc{qYl|OT2*MLX<7}X_4~?C8(NW?Z;Z$5D&B?-hRVEI;tVpjEuea=K1(q%c~d>G8s3qnHi;Ecx7p71C;wKSRSX zJ*)tWWlKz5Ew8Xy&&U+ksxk6h%^56>eX)X#<~Hk|L9U--UrR;z*)y(afyr}Q$Sy@D z&(5LEE=8}ERVbDYGWJYScZURd;ww|*_m%(>t@$7y{R;|mw9Q*y z%E()}^+xg}g$=6ih0zmLh}70upl{|&QQNDP|0QRP+9HLKNa&sEsc74@Fq%29ZDxM~ X2`N7@F2#KpY>rI#L zIHRgkmdiCGmpfek`IozQCMR#*NT>hZ0RR9H6B9EShJm7}=OdBO=!uTD?s~(ZTsO#9 z46I5M)okLhYRo3)9(^(L$)$yb`%?e_Qc8)UsOO*Rj7`O2;qFYaNz>*a7z(hq(nJr3 zsd@aYyPo{`qtC~>x}JLn06+qPj%es+An5ZX({*ee5!^vH(qW}m@EYz9Yu40RZF@zvrhf)jN5j&<0Mn1g4r|(`Q z7>|=oH8|T7_xJS;T?Q;N;CH=|uNZ9AoHPwdzG_lxz_A5t3XEL&jIXak|MG$Ih3rneVsTNhL`6GkmpBY;H?fAkj_A|Tu_2pFxxh)(nAAkHfPPU>`mT|To z?s4XUdl_K93DvZbvI_ zQYu$X5U9Dm!?oxM$GL#x7@x;QyT`=u(KvnieFR_%C{!T3Z;(ASsO%SUm?f6dyN?Z{ zS&%sbUOq*DnT9m8iZ`%R=}-+R~P6GiSuw76@$6CzZXr@SeIjCU)`Kd zJV^CKZDv)y(z|s-j>M3cpRKh@P~Q$?oy+_XOr%nrwE@82@JUc0QlG0sN-`WV1V~$z*ap z5~Bfh5!HnaJ&7z0|T#K zI@kZog+MSAF%3hON>wwpliE)vXP4&Z6L)L1(htB2&;Sqs0001h0`jz?s9j(>LC|V7 i3Sh1S+du&T0N{V*pkxiSfKI&t00005iM9$dVha@fgU&x8igMU)6gv#bO`tI=T3 z%&fLj%^(3ZZtWMf^2qsc>f+>1ztIi|n6Z*b3{* z5kVz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-hDk(0RCwBA{Qv(y11`Xryag=zf36QBE;RrF!~ik? z8)it_{2vCOY^>@40tm0>E%$-=9t7hu1R#JI(Y*k2HqglolP(~MfxH34`IEO`cn2VW zPz-=+&OeCcMI-|lfyAW6sD=Op5LOp}=w)R-3`=i9G=spFjawM71t>rOF<}HMRDr4h z1H;453=9uGL1c6a_z#ouoARHLfe5fEhw(owb^rp1<@-+thOn+Su*8ZK#{c27|1qw5 zyNcn!+XD>8?j2*W+47vBjZcK(#*Oa`7a#m$;4^;qKdc*~epP7|13&<=e1-Y*)oTV2 zdwwhv*jFY%<4vGaYd*eaVB}(8V9{n^`1S)T_!6id$OZ@?mhUiu=Pwx&r?fE;4PLwe z8wLOaHJ?>|`p0*LAFzkdvW{{E9>Vq{YP|BsmwX28EcKNvpW*~RehHv_}pZ{L8<|DSAS zrXc(qXvd513=GRRUSatD;KUh#0Ak|fVvEiR*Sa{hE#yLQ>ddW-j3Tm7H!%GD`I+JG z?>`K`zWo#smX%6TRuo`(3$*>nZ3c$@>sMW4_<46PKmai*>ZtcJ$;yg8X=h|&Wnke_V)*mvBg3!X|D&{wROEqS&G7061H+abHyA!$Te}IU>^eXIv7CCr zE^z1&1H)%v;Qs(hGB9&007(u8MwTC71HOIcM*a4(Ni@Th`rY_<4Oh zP~BI60Al*MZ`Eq{_dgh9SQ!}jPVV`|@bbtpkoy@KS%6Xam*LMJW`7Y~E$v@G+us1g z0-m^rk*zB+Y^f#KbHp!iQ#J|l+zzc`s0 zMFb1DmE;-T0&RcwiGktTj`hzOeq8{m`2;cmAb?mHSs6b3cz>`3WGT?&%)qew!^q47 zjDK}tG=6vC(6lrE%E-j<3h2ex=N~bAytHOFP~SOlC<6gN0I|pfEMVYdXJ_MQWM;dt zf6bR)PZlvSv4}D-G0HRi=i$lwDX+%x>NC*qz!dXh_vVibzt3y{>U#%^Zh!z{;ujQg zi}KRHkREOH#Mat!5hDYa@ZX=07=C|#ZO*M{==PnHjo}qA-d|pO$?)Uqiv7S;aSD`7 zUseP(Vk%>i2mRH)kh?R>+`rVDg*Z%!~u$+N`=_Uh%usSQJP9ZxFkMNh* nmu@gHJe&(u{{Y2BR0pdd@S zqpu?a!^Xav-+_~Xe1&9>AYTTCDpdxChGqtapZ|gMO9qBg0|tgy2@DKYGZ+}e^C!h0 zbz@*)^zw9Z45_%4^ymM7duCMzg@y=+BM+p&p5hGK_!+^Pm|NmeA{lB_s z!&k;wegTIBaf1#E1A{j#QYTI|$ZuBIC@FIw3aFCx*^*RsNr`Fi8I2?qEiQ?lxX+ei z?D$hr;Ogn?Mg}?eT0U?&FdXFV_{8{#Aw+tyl3}diR0flYo(y>mAn^~nO*c**;Mtlf zeB{~L)s5?-`Jb$3`{;NsG5N-xNJfa78#dBsmu0Aw@hCfo*ziwKW;-Gj@JDP7ze0mR z;s)lV-=BH~>fPI%f3B7|xGd+MPXCff8IVTBLkc`u(KcWqgU;VAsIl zv?D=y(*MS7Zf=eir>EC5-pXq{D!{?Oq0qt|)cSBzU?IoRz`z$~-3B!^1)?B>44Z<4 wRXrsY8YDE&`YWO3(`_cf+b25@DJ#zdQm}8GzWtq2-QnZ8W6mB^kfeK5f%S{ zUW%tGMCwrwic~ZrQcG=4f?5bkV+3dRk8hw6bk~y$KX#b!y*J4EJ~>;dRASqrSu;ZpM>?P}K~6AT zWv6Dmq?v&9LdXC(m%WCO6ma_di$R(v$@ad_>@R41N3N5lSJq9@6CGhX84-$%Xrd_6 z;){?{E|Ytt5$S-&Au>t4wDlIxdkfe-a22LMj``McG};r8@{GsRPm*+8fFey6C)@ifDBXVyTw(N@Xd41b45OFg6x_QA zpwLiigyy~cVoPxW^r~C7ZQpr%>1$*HKmv~AY-qJw4;gUecS--wnqslISSS=^KA&Ic n@BK|Onfz#3R%n{$a)0j^sqv5F(1NTL00000NkvXXu0mjf3S}fX literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/add_text.png b/iconsets/system/default/whiteboarding/add_text.png new file mode 100644 index 0000000000000000000000000000000000000000..b7960db9dae7d1da77ef3acc46d0a6a9da584267 GIT binary patch literal 567 zcmV-70?7S|P)(R5;6H z`2YVu10|S&W(GL4-*9m5zR~L0cWa7s=goeHmKzfsTW-vJJns=rXO>fi=YdvYp=OyIuL^83ysEIf(LtP34vHf@P1syLa4L>s)tjLDRY?|E+S*&m<}gEDA3wCC|S1 zC~n%F`=*)aLx8xUX62**Ryh}!5;VXx>jJY=!}V2J^Y4E*NjsaSAA6F^IPpwJ<+6wW zU8=5LQujKb`Z+F#fckUgU8t^YpU|s(=Orx83-p>b9R3rvXOE zXGG&B-+ooO{Lz1}<{Ou-vd(X^%s98zwd(4P#ubnMhqc}OsqDB<8mj>Yv8NgBOD@j_ z`PDq_3`$^`C!g6^zTp1k={a?|3Z-|`5HYOAUEHcimi|xPlFJZ#%{{hX{-)aXO=~Z^xE1+b* zM@!rH@FJ(e3$Fs}uKo9|x%%HQ^w?fm%Wa0V&kJ-j001RVucl)dd}jav002ovPDHLk FV1mw881w)D literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/bring_forwards.png b/iconsets/system/default/whiteboarding/bring_forwards.png new file mode 100644 index 0000000000000000000000000000000000000000..00818f63635ef3b3c04260c0d8f160b19570cb62 GIT binary patch literal 597 zcmV-b0;>IqP)62!*BTExOSjY%3)*jT5svJpGKf=$3CUqKK-1RDzx8ymlZ zwS;W;-7_=ySiHB1u9f68hg;0tAIzK-5q6bH&%Yeqk1(r}i84|~$mldU469wb{r=gf zuYVfkh}abCXHiD56XS1@m(?2&*9kHq6O|^j@r%)9WR;gBSR*+^{BUiAhv zLTNl5-SWcMf`$Z#q6Tzk02$5(j=VTsw!_ijI|?3O5Ws14CO8uvli9}fO~g1=Dv?Sg z6QM+>P3O~zsHL}l?cjL#8yuEVU~n|V*x($S*`2dri>5x}hU56pjd4M7=H5jVf&jnh_YoHFW1pQh33@EE+GcT-uHR1*sID5Hzvg z6g2}hp<@K+0FD7#ACek+3k!>iLhA`|uU)j;i__)Z&Fgb3t?v-b7s4*agaQ+5 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/bring_to_front.png b/iconsets/system/default/whiteboarding/bring_to_front.png new file mode 100644 index 0000000000000000000000000000000000000000..00818f63635ef3b3c04260c0d8f160b19570cb62 GIT binary patch literal 597 zcmV-b0;>IqP)62!*BTExOSjY%3)*jT5svJpGKf=$3CUqKK-1RDzx8ymlZ zwS;W;-7_=ySiHB1u9f68hg;0tAIzK-5q6bH&%Yeqk1(r}i84|~$mldU469wb{r=gf zuYVfkh}abCXHiD56XS1@m(?2&*9kHq6O|^j@r%)9WR;gBSR*+^{BUiAhv zLTNl5-SWcMf`$Z#q6Tzk02$5(j=VTsw!_ijI|?3O5Ws14CO8uvli9}fO~g1=Dv?Sg z6QM+>P3O~zsHL}l?cjL#8yuEVU~n|V*x($S*`2dri>5x}hU56pjd4M7=H5jVf&jnh_YoHFW1pQh33@EE+GcT-uHR1*sID5Hzvg z6g2}hp<@K+0FD7#ACek+3k!>iLhA`|uU)j;i__)Z&Fgb3t?v-b7s4*agaQ+5 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/draw_circles.png b/iconsets/system/default/whiteboarding/draw_circles.png new file mode 100644 index 0000000000000000000000000000000000000000..6535b0c657e9fa7e40a998e7343ec09df28f2daf GIT binary patch literal 781 zcmV+o1M>WdP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00MDIL_t(I%f(YYZxcZj zoV&Hp&KaG3aRLYhCqzQ2T%cGMKL80jen7fZh>kKX1wSA{DH4e`Jp~N~RT>l7MIg~B zAy)ixvWU-d%*lJZw|kEUM|Pm+NmIP1d83(Pfd4(l^s=|N2O_e4-*?;Xc7}6qCP@M! z()oNo%4V}e0DOCUdsbj~cNcSWb5^g{dup2IOWU?z5Yb)6SVk#DVHk2Dgg+PzJ_kYY zQEUBmYimoE%ViilJ3CNHSw!?YpU=NpSy@?HTwFA>*(?}ikWyka8X*V*_`a_^&uezO z-S@Rx?StoeA=}*COa(#kYISw>ZM9mxS1OeZ+qPjC2DH{tO2IG;Se6CHaZJ~Bi$qk7 z<9Iw648F7V_4OyYT<%?^Qdue%i%?1-j$_1e45bv5Qjk*K+!$kEjM@Eu{~_o6#B8_Q z_X~x>Bgb)Oh?D0D;y8xZ8d_`QayhuJ`zVT{a*A`FW{g=x1S#c>?SDC$002zW%m^VC zQt5P>4~N5WG#WXUWz7go+n>HgQ3THU7=Sb#$2sqGI`vko1tA245Rg(rN(mtZ;y9iW z(OTp3@)8#p7w6;g_?#Ua91Pah*7`z-3K11EnG7azCJ`pjQ52!m>Co}C#x zFAM-0jYe~Re!kW3_eHB`;?Ch)-hT%7@bsIov-0p^9 z7`ADe3q<4+Q4W9wAOSEYq9K3)z%KytUuC*gG6uk$;v|2dr-{D-Ck4kCWdP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_00MDIL_t(I%f(YYZxcZj zoV&Hp&KaG3aRLYhCqzQ2T%cGMKL80jen7fZh>kKX1wSA{DH4e`Jp~N~RT>l7MIg~B zAy)ixvWU-d%*lJZw|kEUM|Pm+NmIP1d83(Pfd4(l^s=|N2O_e4-*?;Xc7}6qCP@M! z()oNo%4V}e0DOCUdsbj~cNcSWb5^g{dup2IOWU?z5Yb)6SVk#DVHk2Dgg+PzJ_kYY zQEUBmYimoE%ViilJ3CNHSw!?YpU=NpSy@?HTwFA>*(?}ikWyka8X*V*_`a_^&uezO z-S@Rx?StoeA=}*COa(#kYISw>ZM9mxS1OeZ+qPjC2DH{tO2IG;Se6CHaZJ~Bi$qk7 z<9Iw648F7V_4OyYT<%?^Qdue%i%?1-j$_1e45bv5Qjk*K+!$kEjM@Eu{~_o6#B8_Q z_X~x>Bgb)Oh?D0D;y8xZ8d_`QayhuJ`zVT{a*A`FW{g=x1S#c>?SDC$002zW%m^VC zQt5P>4~N5WG#WXUWz7go+n>HgQ3THU7=Sb#$2sqGI`vko1tA245Rg(rN(mtZ;y9iW z(OTp3@)8#p7w6;g_?#Ua91Pah*7`z-3K11EnG7azCJ`pjQ52!m>Co}C#x zFAM-0jYe~Re!kW3_eHB`;?Ch)-hT%7@bsIov-0p^9 z7`ADe3q<4+Q4W9wAOSEYq9K3)z%KytUuC*gG6uk$;v|2dr-{D-Ck4kCRq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/draw_paths.png b/iconsets/system/default/whiteboarding/draw_paths.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfecd50ee9f5bc5828f0c0745aa3e0effcbe250 GIT binary patch literal 450 zcmV;z0X_bSP)Rq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/draw_rectangles.png b/iconsets/system/default/whiteboarding/draw_rectangles.png new file mode 100644 index 0000000000000000000000000000000000000000..b485a39448d578b9ff6d74e376c79d4890b73e8d GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMY7)lKo7+xhXFj&oCU=Yur6o1qWsFp3s+ueoXKL{?^yBwsO zv%n*=n1O*?7=#%aX3ddcU|^K@ba4!^IK6bTVb&1?0oVCDp_)wGdOX!LL|!sg^Ta3g zKe^;LQ<)`b*$K@jWsw^u+IR^rIT2;8c*G!Mf=T@U{~r(7+h5(LdtmalUmI6x@e4Tp zunNgCX8-cFs`l-!cSjjA*2?=Wzq~V3%B4lXiA&JYh2c`x+NJM*D}TsSs=91)rL_0E zov7~VB4MQ_!?wzK?;D#t=eV%EuVuQS)%S3Yx7>`Fc%2@eB2LR@0Vc1N`3*t&e3Qhd zJ>XREI-&3GS*ZVP=SuB{Ag6tKZ`Z20H2gU_zvoU$K#*SJsm-zc-)`-A?l|@T_5G!a z?;SoVs6Dnw>N#k+eOHWFH^=nTtpZI<2A543_wXM6VB>rF?y(1V{1yb=iu%oHF?D7o g3t#<=6!shbftIHvPfY*Y0t`O}Pgg&ebxsLQ00`8oxBvhE literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/erase.png b/iconsets/system/default/whiteboarding/erase.png new file mode 100644 index 0000000000000000000000000000000000000000..79e15acd2f83fd684696a875e6231b69d85b708e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?iy0WWg+Q3`(%rg0KtX#? z7sn8d^T`#*8{~}yRzCP&ACkx-e=7Ay{~DH={jMCLmTh_^mp9z#ekGSw>)67{a>wC- jxJxVZy$MU)QXaN3D9sSK^I%st$QlMuS3j3^P6$`dXYaZs9=SbAto%g@>T~?_bH&lTUn@`uo|1bXE{eSR(AO)ESb=V4`uk}mK|39Px&03WLbv~pzk+s7D@lK^ zn+aB+sp)&Y_x-B3>;6ywU--WQNUr<8>TU0P-|L#1U&;A)67w(+> pDf@fM7q9#F25QXo3rUI;002ro52U44e~JJA002ovPDHLkV1l;_q@Mr) literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/rotate.png b/iconsets/system/default/whiteboarding/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..24349480a9716d4c4d83a8c4111b76200349dbb2 GIT binary patch literal 1041 zcmV+s1n&EZP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZo--$_VFM1B4G^%x@~<9~nvVgX4484Umb|JVKY z?c2|P|Nh+qYWnH!?#`p5qr(8?GcYkRG5r4hn_=b3l?m6Z>u^&>z4 zF@ZFH|Nh+osOYeil+=zdU%sdb3JR_{bLPy~&!0bo4F}l{R0GD+($b=DO^}0w+ACY4eocL3Et0J`8Q$cq30!~zOgpu)#M z(>j2e=rPb1GhhNT1x6P?NDheqUAc1Q2GH53fobA8FugnjdhG#F56FOj009KfOhC?G zpr0QA4Osw87Z>i`yLT4I7Y5}qv`72QKZD2It1RDGUq!%E7zy^Sv z2^9DSlz0ME2=vvjd%$oJ0gCehF(VNF1RDMcDE|m#GfXoG00bBSdQiQ>h>i8<00000 LNkvXXu0mjfGKa{^ literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/scale.png b/iconsets/system/default/whiteboarding/scale.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0377c773011342ff95d5650f592d96b07b7c3a GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPF)%O+d%8G=Se$;_zcK4jfP|a>ySxuxf%Ev`Hf3@Vtqr#axo zoQu~D)?YXoSTI$oquYWtXx0%`k7H_lQ=QtSo?l|NzyIO0?2iZY?HjIrn(pv@4#Rwh zLO+I(?gi2;2VWOh>|u}45qtmn=O4}=JHixf&+nG*b>rWCw{MX~-nZX>yB}MmUN(uE zwQMcZCLLu@p|I7WufP5(vzlx7y~_60F15bL?{oJDKCk?@;`OfECcMislOo0b*2&-A zb~A5#hxc0p9_{0W_nH(EY~+k*`e>YWW=I5Rl}zuENrQ28Pt;CX(qKOcDU|M8F&Z%jVGSZA7t& zSX&s1bi|{*v*DgAz3ST9+K6Us3~0Q9*~BWe6PID=&0x|wWdf!IWgI(}6lv9v-FpSS zw1U9OL{Ex%ACuJL>=wxTZg0 zEf8`!jsrze5UvA~SqG-HeEY!{P)iC{?3#nq?S616TB~hnMW{0-6j9tLvf?&u+XiC{ z?O_E0jiYQZlqIojGL$5a1qk9N)mlxpmZq1W6gHT`ec`8K>j$jl3}`WfukS z{=!u2#P1a^U!H8Xl5T`7??NT1t zUc_pqB=&-xQ}oxwg~5^6HaUDuDLGXE;y3!@QP_pOFSc-kKKIu gX8xa5{%_a#2W_ovs9z>%07*qoM6N<$f|edvg8%>k literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/select.png b/iconsets/system/default/whiteboarding/select.png new file mode 100644 index 0000000000000000000000000000000000000000..532f532d87ef60b5f2cdcdeb573ec949d2918def GIT binary patch literal 354 zcmV-o0iFJdP)I0T{~(qIu$a8Oa`;1VJZ+NJ#? z)Z`G6Xm=;i@Oy^O@W4+X<|%s@Z9U8K%Cou=JW=N{umR|dc<1KC5j-&Bmny}u z1Gr;ImmX!ZVOvnb2Z3IG9yvhp5kdn#W^JX2LP{w9t>Mgm0h`0-w1g7ei1zafe zdny~;a&&9~i}?5QG&nFlE(hRq9e(XsJj>7i0YpGB?|)P=F8}}l07*qoM6N<$f=`l= A>i_@% literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/send_backwards.png b/iconsets/system/default/whiteboarding/send_backwards.png new file mode 100644 index 0000000000000000000000000000000000000000..00818f63635ef3b3c04260c0d8f160b19570cb62 GIT binary patch literal 597 zcmV-b0;>IqP)62!*BTExOSjY%3)*jT5svJpGKf=$3CUqKK-1RDzx8ymlZ zwS;W;-7_=ySiHB1u9f68hg;0tAIzK-5q6bH&%Yeqk1(r}i84|~$mldU469wb{r=gf zuYVfkh}abCXHiD56XS1@m(?2&*9kHq6O|^j@r%)9WR;gBSR*+^{BUiAhv zLTNl5-SWcMf`$Z#q6Tzk02$5(j=VTsw!_ijI|?3O5Ws14CO8uvli9}fO~g1=Dv?Sg z6QM+>P3O~zsHL}l?cjL#8yuEVU~n|V*x($S*`2dri>5x}hU56pjd4M7=H5jVf&jnh_YoHFW1pQh33@EE+GcT-uHR1*sID5Hzvg z6g2}hp<@K+0FD7#ACek+3k!>iLhA`|uU)j;i__)Z&Fgb3t?v-b7s4*agaQ+5 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/send_to_back.png b/iconsets/system/default/whiteboarding/send_to_back.png new file mode 100644 index 0000000000000000000000000000000000000000..00818f63635ef3b3c04260c0d8f160b19570cb62 GIT binary patch literal 597 zcmV-b0;>IqP)62!*BTExOSjY%3)*jT5svJpGKf=$3CUqKK-1RDzx8ymlZ zwS;W;-7_=ySiHB1u9f68hg;0tAIzK-5q6bH&%Yeqk1(r}i84|~$mldU469wb{r=gf zuYVfkh}abCXHiD56XS1@m(?2&*9kHq6O|^j@r%)9WR;gBSR*+^{BUiAhv zLTNl5-SWcMf`$Z#q6Tzk02$5(j=VTsw!_ijI|?3O5Ws14CO8uvli9}fO~g1=Dv?Sg z6QM+>P3O~zsHL}l?cjL#8yuEVU~n|V*x($S*`2dri>5x}hU56pjd4M7=H5jVf&jnh_YoHFW1pQh33@EE+GcT-uHR1*sID5Hzvg z6g2}hp<@K+0FD7#ACek+3k!>iLhA`|uU)j;i__)Z&Fgb3t?v-b7s4*agaQ+5 literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/translate.png b/iconsets/system/default/whiteboarding/translate.png new file mode 100644 index 0000000000000000000000000000000000000000..bb90fb2e6987eb3b22d8c270819b2a5a96cbe733 GIT binary patch literal 665 zcmV;K0%rY*P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;4@pEpRCwBA{Qv(y10?_;0LyW90{{qwKok=@*%G%W ztx>>u#UCD1?_}m82}vMz97n&F_!Vr!_s@ymT8Rj30R%SS`}gk*)22;BG5P<$e+++t z_#aU5Ul0be|NH^cKto(yT^OD{d-fk_03$#EF@Y5S`0)dw5$Gk5hCe{Of8Rca-#`t& z{=i)J3&@7J2nGNG2+4r|4F5p3f;0m)ZQrq-;mw=349k`+g*Y3e8R*SlKYxMwFaQuh za06f(|NQ;~rtR(Q8D77A%@7a}$nf*$Z?HzN0YD7$4h#SU5ZHj9KYv0r1M%wBs~KPc z`sVdphM&KFGW-VeE2}EOY>*r>00jp_n`0D`yx>c78#|1hMdrvv@_6C5TVKD+~K0L4UKe?OT0=l5R}0{{XD z>;iZQgYi$W!t{&`psk-665`{*VF1CuQDOiD00IbVz;Cc-kW0Yc0n$C)-3*_NQAe{Pzz;|3fhVAb`LIfCT;g z{K(2o009IxV8@OfjG(kljsXAx#7Jp&1_&?!cJ-2zDdMB$00000NkvXXu0mjf1#J(< literal 0 HcmV?d00001 diff --git a/iconsets/system/default/whiteboarding/ungroup.png b/iconsets/system/default/whiteboarding/ungroup.png new file mode 100644 index 0000000000000000000000000000000000000000..f66e2974efabf02bc8537899e25594978da8eadf GIT binary patch literal 600 zcmV-e0;m0nP)PbXFR5;7s zQbA~vVHh@k7qp$ajUZx&gbqS_iCr|e_8-)LqL<%OF#5$(JDAmU3Z>uMWC-Hc^m(S-Bi9|X+pYImKESqKGXh#~-{uQ9t>n~cZ)~J`?O(xSR&-1X`?Ps8wINFhhwB(rt++ar#gb&GNvR^C~zm>~nFxeKF=OosmQ6jmTLP{}-6iF>nO8f(+aY2!Xm^*5Av6NhR zD0!Nar%`rnu~v@R4hO^8&iS41=VQN>+65QO>m_E!|B#IbuI^pAy5?9WYjHC`6;s8j z!_-hy%sJEya}KAD$C|Z-~!ZLFQctG09Uhp@QPcl?mU}7$E{?cz}t3fC%LK?;}5+keI!OTyHb6 z@j}nbBm-HHT&CJnb^IYBAVSCka_RdNzT74;XDve?FCx*eM2ky^TZSvCN4lf#zADBt{VLMZ58~8Xlk&tIj2}J+_M1=n24SuBB zC|kIW{HG=&F(WrHgY=^pRBSp=QTYN)m5{Hh{2@SBTQi04uPMk>dS9PrQdx|l%yhmz zOH#Sz0@1`YLTX0HPj&aS)SnFM)H&2CwbI1q`b)fRK1k<-HpW#}^Sv*{jiIgdH9W>t zQ6<#EFflVmJF;g{aA;S(kLP%K=NdiTT|X03N>|n%ZExo<#LO72ZdK{vlG)|{vIVoS lXs&IrKfQB()wm zz)}!t|Aj(8aM!L}*hN-t_aY%AA^|@T0>Ev@I22xIXUUBuC9J7j*gE0o|&2XxZQ43PzuYo zu`KI@WPmhH84L!@&d##Dy!^BM(fGL9-QDFXiYS*#{PE%iZw3Q|5Fd1*wWi%}v%bEL z@B3pmLSR`I!ONF?_22>ZJ9qf$;X^X55mLSHWQc3`7jRwCzdc^LN zC%k_33LylxZDZMX9zh5}k|cPZ$8b0Vz;+ymIF9-5{(TCbN4;L>i+lGNuhlqhwRryQ z8O9jWG$l<_dc7VK6BD^3+p;W#5Tv6K+HnY@h^LPqqm&{FLy{yxYfT)-L{UT(MF=6# zTE7(lux*=awMwyA#P@xo;gC@rBc-HLsW2Lia9tP2anM@hx-My&z7>#CBBjLhJPL&Z zrBVr{6prH{gdoc@k|fFRFbs1c09y!wQi|#6X^O=n<#HLN6t3$cr9^8@k|cy-$Z$BM zTrN|u*D=OmS(dP`uC8tt78WYo+uNjRN|GeRag5fQEX(rpwAOj{EX#0Rmz$fLk#%-< zmMEn@3xeSC@bK_;zu$Mq#>NU!6cL6YQ52CR3B6uV@9pjV83e&!-EKG9-{0?SZf>p% zKmaA6ytK5m(rh-rX*3!Y&+`yMV2sJzKR-VY*4Ea3+}YXr4bZ@we9vaH`Ga|f%gamC z>2yrD+cgv}i**mOD_V~jCD5Dco->gTt-{A>FCzBM^HdAC-pm6cNY0=H9oo=3Oa zWn*LGXlrZh7og8O`~StK^Yimx&dtruPfbmI;`_dDj4{{O*MnB8b$)Pg@bvWb^jF}Y aTf)E7D04m{(6~7O0000 +#include +#include +#include +//Added by qt3to4: +#include +#include +#include +#include + +#ifdef Q_OS_UNIX +#include +#include +#include +#include +#include +#endif + +#ifdef Q_OS_WIN32 +#include +#endif + +#include "psilogger.h" + +// CS_NAMESPACE_BEGIN + +//! \if _hide_doc_ +class NDnsWorker : public QThread +{ +public: + NDnsWorker(QObject *, const Q3CString &); + ~NDnsWorker(); + + bool success; + bool cancelled; + QHostAddress addr; + +protected: + void run(); + +private: + Q3CString host; +}; +//! \endif + +//---------------------------------------------------------------------------- +// NDnsManager +//---------------------------------------------------------------------------- +#ifndef HAVE_GETHOSTBYNAME_R +#ifndef Q_WS_WIN +static QMutex *workerMutex = 0; +static QMutex *workerCancelled = 0; +#endif +#endif +static NDnsManager *manager_instance = 0; +bool winsock_init = false; + +class NDnsManager::Item +{ +public: + NDns *ndns; + NDnsWorker *worker; +}; + +class NDnsManager::Private +{ +public: + Item *find(const NDns *n) + { + Q3PtrListIterator it(list); + for(Item *i; (i = it.current()); ++it) { + if(i->ndns == n) + return i; + } + return 0; + } + + Item *find(const NDnsWorker *w) + { + Q3PtrListIterator it(list); + for(Item *i; (i = it.current()); ++it) { + if(i->worker == w) + return i; + } + return 0; + } + + Q3PtrList list; +}; + +NDnsManager::NDnsManager() +: QObject(QCoreApplication::instance()) +{ +#ifndef HAVE_GETHOSTBYNAME_R +#ifndef Q_WS_WIN + workerMutex = new QMutex; + workerCancelled = new QMutex; +#endif +#endif + +#ifdef Q_OS_WIN32 + if(!winsock_init) { + winsock_init = true; + Q3SocketDevice *sd = new Q3SocketDevice; + delete sd; + } +#endif + + d = new Private; + d->list.setAutoDelete(true); + + connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), SLOT(app_aboutToQuit())); +} + +NDnsManager::~NDnsManager() +{ + delete d; + +#ifndef HAVE_GETHOSTBYNAME_R +#ifndef Q_WS_WIN + delete workerMutex; + workerMutex = 0; + delete workerCancelled; + workerCancelled = 0; +#endif +#endif +} + +void NDnsManager::resolve(NDns *self, const QString &name) +{ + Item *i = new Item; + i->ndns = self; + i->worker = new NDnsWorker(this, name.utf8()); + connect(i->worker, SIGNAL(finished()), SLOT(workerFinished())); + d->list.append(i); + + i->worker->start(); +} + +void NDnsManager::stop(NDns *self) +{ + Item *i = d->find(self); + if(!i) + return; + // disassociate + i->ndns = 0; + +#ifndef HAVE_GETHOSTBYNAME_R +#ifndef Q_WS_WIN + // cancel + workerCancelled->lock(); + i->worker->cancelled = true; + workerCancelled->unlock(); +#endif +#endif + + d->list.removeRef(i); +} + +bool NDnsManager::isBusy(const NDns *self) const +{ + Item *i = d->find(self); + return (i ? true: false); +} + +void NDnsManager::workerFinished() +{ + NDnsWorker* worker = dynamic_cast(sender()); + Q_ASSERT(worker); + if (!worker) + return; + worker->wait(); // ensure that the thread is terminated + + Item *i = d->find(worker); + if(i) { + QHostAddress addr = i->worker->addr; + QPointer ndns = i->ndns; + d->list.removeRef(i); + + // nuke manager if no longer needed (code that follows MUST BE SAFE!) + tryDestroy(); + + // requestor still around? + if(ndns) { + ndns->finished(addr); + } + } + + worker->deleteLater(); +} + +void NDnsManager::tryDestroy() +{ +// mblsha: NDnsManager is now singleton +#if 0 + if(d->list.isEmpty()) { + manager_instance = 0; + deleteLater(); + } +#endif +} + +void NDnsManager::app_aboutToQuit() +{ +// mblsha: NDnsManager is now singleton +#if 0 + while(man) { + QCoreApplication::instance()->processEvents(QEventLoop::WaitForMoreEvents); + } +#endif +} + + +//---------------------------------------------------------------------------- +// NDns +//---------------------------------------------------------------------------- + +//! \fn void NDns::resultsReady() +//! This signal is emitted when the DNS resolution succeeds or fails. + +//! +//! Constructs an NDns object with parent \a parent. +NDns::NDns(QObject *parent) +:QObject(parent) +{ +} + +//! +//! Destroys the object and frees allocated resources. +NDns::~NDns() +{ + stop(); + PsiLogger::instance()->log(QString("%1 NDns::~NDns()").arg(LOG_THIS)); +} + +//! +//! Resolves hostname \a host (eg. psi.affinix.com) +void NDns::resolve(const QString &host) +{ + PsiLogger::instance()->log(QString("%1 NDns::resolve(%2)").arg(LOG_THIS).arg(host)); + stop(); + if(!manager_instance) + manager_instance = new NDnsManager; + manager_instance->resolve(this, host); +} + +//! +//! Cancels the lookup action. +//! \note This will not stop the underlying system call, which must finish before the next lookup will proceed. +void NDns::stop() +{ + PsiLogger::instance()->log(QString("%1 NDns::stop()").arg(LOG_THIS)); + if(manager_instance) + manager_instance->stop(this); +} + +//! +//! Returns the IP address as QHostAddress. This will be a Null QHostAddress if the lookup failed. +//! \sa resultsReady() +QHostAddress NDns::result() const +{ + return addr; +} + +//! +//! Returns the IP address as a string. This will be an empty string if the lookup failed. +//! \sa resultsReady() +QString NDns::resultString() const +{ + if (addr.isNull()) + return QString(); + else + return addr.toString(); +} + +//! +//! Returns TRUE if busy resolving a hostname. +bool NDns::isBusy() const +{ + if(!manager_instance) + return false; + return manager_instance->isBusy(this); +} + +void NDns::finished(const QHostAddress &a) +{ + PsiLogger::instance()->log(QString("%1 NDns::finished(%2)").arg(LOG_THIS).arg(a.toString())); + addr = a; + resultsReady(); +} + +//---------------------------------------------------------------------------- +// NDnsWorker +//---------------------------------------------------------------------------- +NDnsWorker::NDnsWorker(QObject *_par, const Q3CString &_host) +: QThread(_par) +{ + success = cancelled = false; + host = _host.copy(); // do we need this to avoid sharing across threads? +} + +NDnsWorker::~NDnsWorker() +{ +} + +void NDnsWorker::run() +{ + hostent *h = 0; + +#ifdef HAVE_GETHOSTBYNAME_R + hostent buf; + char char_buf[1024]; + int err; + gethostbyname_r(host.data(), &buf, char_buf, sizeof(char_buf), &h, &err); +#else +#ifndef Q_WS_WIN + // lock for gethostbyname + QMutexLocker locker(workerMutex); + + // check for cancel + workerCancelled->lock(); + bool cancel = cancelled; + workerCancelled->unlock(); + + if(!cancel) +#endif + h = gethostbyname(host.data()); +#endif + + // FIXME: not ipv6 clean, currently. + if(!h || h->h_addrtype != AF_INET) { + success = false; + return; + } + + in_addr a = *((struct in_addr *)h->h_addr_list[0]); + addr.setAddress(ntohl(a.s_addr)); + success = true; +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/legacy/ndns.h b/iris-legacy/cutestuff/legacy/ndns.h new file mode 100644 index 0000000..3167e89 --- /dev/null +++ b/iris-legacy/cutestuff/legacy/ndns.h @@ -0,0 +1,90 @@ +/* + * ndns.h - native DNS resolution + * Copyright (C) 2001, 2002 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_NDNS_H +#define CS_NDNS_H + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include + +// CS_NAMESPACE_BEGIN + +class NDnsWorker; +class NDnsManager; + +class NDns : public QObject +{ + Q_OBJECT +public: + NDns(QObject *parent=0); + ~NDns(); + + void resolve(const QString &); + void stop(); + bool isBusy() const; + + QHostAddress result() const; + QString resultString() const; + +signals: + void resultsReady(); + +private: + QHostAddress addr; + + friend class NDnsManager; + void finished(const QHostAddress &); +}; + +class NDnsManager : public QObject +{ + Q_OBJECT +public: + ~NDnsManager(); + class Item; + +//! \if _hide_doc_ +protected slots: + void workerFinished(); +//! \endif + +private slots: + void app_aboutToQuit(); + +private: + class Private; + Private *d; + + friend class NDns; + NDnsManager(); + void resolve(NDns *self, const QString &name); + void stop(NDns *self); + bool isBusy(const NDns *self) const; + void tryDestroy(); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/legacy/safedelete.cpp b/iris-legacy/cutestuff/legacy/safedelete.cpp new file mode 100644 index 0000000..51dd388 --- /dev/null +++ b/iris-legacy/cutestuff/legacy/safedelete.cpp @@ -0,0 +1,111 @@ +#include "safedelete.h" + +#include + +//---------------------------------------------------------------------------- +// SafeDelete +//---------------------------------------------------------------------------- +SafeDelete::SafeDelete() +{ + lock = 0; +} + +SafeDelete::~SafeDelete() +{ + if(lock) + lock->dying(); +} + +void SafeDelete::deleteLater(QObject *o) +{ + if(!lock) + deleteSingle(o); + else + list.append(o); +} + +void SafeDelete::unlock() +{ + lock = 0; + deleteAll(); +} + +void SafeDelete::deleteAll() +{ + if(list.isEmpty()) + return; + + QObjectList::Iterator it = list.begin(); + for(QObjectList::Iterator it = list.begin(); it != list.end(); ++it) + deleteSingle(*it); + list.clear(); +} + +void SafeDelete::deleteSingle(QObject *o) +{ + o->deleteLater(); +} + +//---------------------------------------------------------------------------- +// SafeDeleteLock +//---------------------------------------------------------------------------- +SafeDeleteLock::SafeDeleteLock(SafeDelete *sd) +{ + own = false; + if(!sd->lock) { + _sd = sd; + _sd->lock = this; + } + else + _sd = 0; +} + +SafeDeleteLock::~SafeDeleteLock() +{ + if(_sd) { + _sd->unlock(); + if(own) + delete _sd; + } +} + +void SafeDeleteLock::dying() +{ + _sd = new SafeDelete(*_sd); + own = true; +} + +//---------------------------------------------------------------------------- +// SafeDeleteLater +//---------------------------------------------------------------------------- +SafeDeleteLater *SafeDeleteLater::self = 0; + +SafeDeleteLater *SafeDeleteLater::ensureExists() +{ + if(!self) + new SafeDeleteLater(); + return self; +} + +SafeDeleteLater::SafeDeleteLater() +{ + self = this; + QTimer::singleShot(0, this, SLOT(explode())); +} + +SafeDeleteLater::~SafeDeleteLater() +{ + while (!list.isEmpty()) + delete list.takeFirst(); + self = 0; +} + +void SafeDeleteLater::deleteItLater(QObject *o) +{ + list.append(o); +} + +void SafeDeleteLater::explode() +{ + delete this; +} diff --git a/iris-legacy/cutestuff/legacy/safedelete.h b/iris-legacy/cutestuff/legacy/safedelete.h new file mode 100644 index 0000000..b33174f --- /dev/null +++ b/iris-legacy/cutestuff/legacy/safedelete.h @@ -0,0 +1,60 @@ +#ifndef SAFEDELETE_H +#define SAFEDELETE_H + +#include +#include + +class SafeDelete; +class SafeDeleteLock +{ +public: + SafeDeleteLock(SafeDelete *sd); + ~SafeDeleteLock(); + +private: + SafeDelete *_sd; + bool own; + friend class SafeDelete; + void dying(); +}; + +class SafeDelete +{ +public: + SafeDelete(); + ~SafeDelete(); + + void deleteLater(QObject *o); + + // same as QObject::deleteLater() + static void deleteSingle(QObject *o); + +private: + QObjectList list; + void deleteAll(); + + friend class SafeDeleteLock; + SafeDeleteLock *lock; + void unlock(); +}; + +class SafeDeleteLater : public QObject +{ + Q_OBJECT +public: + static SafeDeleteLater *ensureExists(); + void deleteItLater(QObject *o); + +private slots: + void explode(); + +private: + SafeDeleteLater(); + ~SafeDeleteLater(); + + QObjectList list; + friend class SafeDelete; + static SafeDeleteLater *self; +}; + +#endif diff --git a/iris-legacy/cutestuff/legacy/servsock.cpp b/iris-legacy/cutestuff/legacy/servsock.cpp new file mode 100644 index 0000000..47ca927 --- /dev/null +++ b/iris-legacy/cutestuff/legacy/servsock.cpp @@ -0,0 +1,111 @@ +/* + * servsock.cpp - simple wrapper to QServerSocket + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "servsock.h" + +// CS_NAMESPACE_BEGIN + +//---------------------------------------------------------------------------- +// ServSock +//---------------------------------------------------------------------------- +class ServSock::Private +{ +public: + Private() {} + + ServSockSignal *serv; +}; + +ServSock::ServSock(QObject *parent) +:QObject(parent) +{ + d = new Private; + d->serv = 0; +} + +ServSock::~ServSock() +{ + stop(); + delete d; +} + +bool ServSock::isActive() const +{ + return (d->serv ? true: false); +} + +bool ServSock::listen(quint16 port) +{ + stop(); + + d->serv = new ServSockSignal(this); + if(!d->serv->listen(QHostAddress::Any, port)) { + delete d->serv; + d->serv = 0; + return false; + } + connect(d->serv, SIGNAL(connectionReady(int)), SLOT(sss_connectionReady(int))); + + return true; +} + +void ServSock::stop() +{ + delete d->serv; + d->serv = 0; +} + +int ServSock::port() const +{ + if(d->serv) + return d->serv->serverPort(); + else + return -1; +} + +QHostAddress ServSock::address() const +{ + if(d->serv) + return d->serv->serverAddress(); + else + return QHostAddress(); +} + +void ServSock::sss_connectionReady(int s) +{ + connectionReady(s); +} + + +//---------------------------------------------------------------------------- +// ServSockSignal +//---------------------------------------------------------------------------- +ServSockSignal::ServSockSignal(QObject *parent) +:QTcpServer(parent) +{ + setMaxPendingConnections(16); +} + +void ServSockSignal::incomingConnection(int socketDescriptor) +{ + connectionReady(socketDescriptor); +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/legacy/servsock.h b/iris-legacy/cutestuff/legacy/servsock.h new file mode 100644 index 0000000..382697b --- /dev/null +++ b/iris-legacy/cutestuff/legacy/servsock.h @@ -0,0 +1,68 @@ +/* + * servsock.h - simple wrapper to QServerSocket + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_SERVSOCK_H +#define CS_SERVSOCK_H + +#include + +// CS_NAMESPACE_BEGIN + +class ServSock : public QObject +{ + Q_OBJECT +public: + ServSock(QObject *parent=0); + ~ServSock(); + + bool isActive() const; + bool listen(quint16 port); + void stop(); + int port() const; + QHostAddress address() const; + +signals: + void connectionReady(int); + +private slots: + void sss_connectionReady(int); + +private: + class Private; + Private *d; +}; + +class ServSockSignal : public QTcpServer +{ + Q_OBJECT +public: + ServSockSignal(QObject *parent = 0); + +signals: + void connectionReady(int); + +protected: + // reimplemented + void incomingConnection(int socketDescriptor); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/legacy/srvresolver.cpp b/iris-legacy/cutestuff/legacy/srvresolver.cpp new file mode 100644 index 0000000..c8de2d5 --- /dev/null +++ b/iris-legacy/cutestuff/legacy/srvresolver.cpp @@ -0,0 +1,313 @@ +/* + * srvresolver.cpp - class to simplify SRV lookups + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "srvresolver.h" + +#include +#include +#include +//Added by qt3to4: +#include +#include +#include "safedelete.h" +#include "psilogger.h" + +#ifndef NO_NDNS +#include "ndns.h" +#endif + +// CS_NAMESPACE_BEGIN + +bool serverLessThan(const Q3Dns::Server &s1, const Q3Dns::Server &s2) +{ + int a = s1.priority; + int b = s2.priority; + int j = s1.weight; + int k = s2.weight; + return a < b || (a == b && j < k); +} + +static void sortSRVList(QList &list) +{ + qStableSort(list.begin(), list.end(), serverLessThan); +} + +class SrvResolver::Private +{ +public: + Private() {} + + Q3Dns *qdns; +#ifndef NO_NDNS + NDns ndns; +#endif + + bool failed; + QHostAddress resultAddress; + Q_UINT16 resultPort; + + bool srvonly; + QString srv; + QList servers; + bool aaaa; + + QTimer t; + SafeDelete sd; +}; + +SrvResolver::SrvResolver(QObject *parent) +:QObject(parent) +{ + d = new Private; + d->qdns = 0; + +#ifndef NO_NDNS + connect(&d->ndns, SIGNAL(resultsReady()), SLOT(ndns_done())); +#endif + connect(&d->t, SIGNAL(timeout()), SLOT(t_timeout())); + stop(); +} + +SrvResolver::~SrvResolver() +{ + stop(); + delete d; +} + +void SrvResolver::resolve(const QString &server, const QString &type, const QString &proto, bool srvOnly) +{ + PsiLogger::instance()->log(QString("SrvResolver::resolve(%1, %2, %3, %4)").arg(server).arg(type).arg(proto).arg(srvOnly)); + stop(); + + d->failed = false; + d->srvonly = srvOnly; + d->srv = QString("_") + type + "._" + proto + '.' + server; + d->t.start(15000, true); + d->qdns = new Q3Dns; + connect(d->qdns, SIGNAL(resultsReady()), SLOT(qdns_done())); + d->qdns->setRecordType(Q3Dns::Srv); + d->qdns->setLabel(d->srv); +} + +void SrvResolver::resolve(const QString &server, const QString &type, const QString &proto) +{ + resolve(server, type, proto, false); +} + +void SrvResolver::resolveSrvOnly(const QString &server, const QString &type, const QString &proto) +{ + resolve(server, type, proto, true); +} + +void SrvResolver::next() +{ + if(d->servers.isEmpty()) + return; + + tryNext(); +} + +void SrvResolver::stop() +{ + if(d->t.isActive()) + d->t.stop(); + if(d->qdns) { + d->qdns->disconnect(this); + d->sd.deleteLater(d->qdns); + d->qdns = 0; + } +#ifndef NO_NDNS + if(d->ndns.isBusy()) + d->ndns.stop(); +#endif + d->resultAddress = QHostAddress(); + d->resultPort = 0; + d->servers.clear(); + d->srv = ""; + d->failed = true; +} + +bool SrvResolver::isBusy() const +{ +#ifndef NO_NDNS + if(d->qdns || d->ndns.isBusy()) +#else + if(d->qdns) +#endif + return true; + else + return false; +} + +QList SrvResolver::servers() const +{ + return d->servers; +} + +bool SrvResolver::failed() const +{ + return d->failed; +} + +QHostAddress SrvResolver::resultAddress() const +{ + return d->resultAddress; +} + +Q_UINT16 SrvResolver::resultPort() const +{ + return d->resultPort; +} + +void SrvResolver::tryNext() +{ +#ifndef NO_NDNS + PsiLogger::instance()->log(QString("SrvResolver(%1)::tryNext() d->ndns.resolve(%2)").arg(d->srv).arg(d->servers.first().name)); + d->ndns.resolve(d->servers.first().name); +#else + d->qdns = new Q3Dns; + connect(d->qdns, SIGNAL(resultsReady()), SLOT(ndns_done())); + if(d->aaaa) + d->qdns->setRecordType(Q3Dns::Aaaa); // IPv6 + else + d->qdns->setRecordType(Q3Dns::A); // IPv4 + d->qdns->setLabel(d->servers.first().name); +#endif +} + +void SrvResolver::qdns_done() +{ + PsiLogger::instance()->log(QString("SrvResolver(%1)::qdns_done() d->qdns = %2; d->qdns->isWorking() = %3; d->qdns->servers().count() = %4").arg(d->srv).arg((long)d->qdns).arg(d->qdns ? d->qdns->isWorking() : 0).arg(d->qdns ? d->qdns->servers().count() : 0)); + if(!d->qdns) + return; + + // apparently we sometimes get this signal even though the results aren't ready + if(d->qdns->isWorking()) + return; + d->t.stop(); + + SafeDeleteLock s(&d->sd); + + // grab the server list and destroy the qdns object + QList list; + if(d->qdns->recordType() == Q3Dns::Srv) + list = d->qdns->servers(); + d->qdns->disconnect(this); + d->sd.deleteLater(d->qdns); + d->qdns = 0; + + if(list.isEmpty()) { + stop(); + resultsReady(); + return; + } + sortSRVList(list); + d->servers = list; + + if(d->srvonly) + resultsReady(); + else { + // kick it off + d->aaaa = true; + tryNext(); + } +} + +void SrvResolver::ndns_done() +{ +#ifndef NO_NDNS + SafeDeleteLock s(&d->sd); + + QHostAddress r = d->ndns.result(); + int port = d->servers.first().port; + d->servers.remove(d->servers.begin()); + + PsiLogger::instance()->log(QString("SrvResolver(%1)::ndns_done() r.isNull = %2, r = %3, port = %4").arg(d->srv).arg(r.isNull()).arg(r.toString()).arg(port)); + + if(!r.isNull()) { + d->resultAddress = r; + d->resultPort = port; + resultsReady(); + } + else { + // failed? bail if last one + if(d->servers.isEmpty()) { + stop(); + resultsReady(); + return; + } + + // otherwise try the next + tryNext(); + } +#else + if(!d->qdns) + return; + + // apparently we sometimes get this signal even though the results aren't ready + if(d->qdns->isWorking()) + return; + + SafeDeleteLock s(&d->sd); + + // grab the address list and destroy the qdns object + QList list; + if(d->qdns->recordType() == Q3Dns::A || d->qdns->recordType() == Q3Dns::Aaaa) + list = d->qdns->addresses(); + d->qdns->disconnect(this); + d->sd.deleteLater(d->qdns); + d->qdns = 0; + + if(!list.isEmpty()) { + int port = d->servers.first().port; + d->servers.remove(d->servers.begin()); + d->aaaa = true; + + d->resultAddress = list.first(); + d->resultPort = port; + resultsReady(); + } + else { + if(!d->aaaa) + d->servers.remove(d->servers.begin()); + d->aaaa = !d->aaaa; + + // failed? bail if last one + if(d->servers.isEmpty()) { + stop(); + resultsReady(); + return; + } + + // otherwise try the next + tryNext(); + } +#endif +} + +void SrvResolver::t_timeout() +{ + SafeDeleteLock s(&d->sd); + + stop(); + resultsReady(); +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/legacy/srvresolver.h b/iris-legacy/cutestuff/legacy/srvresolver.h new file mode 100644 index 0000000..0b456a4 --- /dev/null +++ b/iris-legacy/cutestuff/legacy/srvresolver.h @@ -0,0 +1,66 @@ +/* + * srvresolver.h - class to simplify SRV lookups + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_SRVRESOLVER_H +#define CS_SRVRESOLVER_H + +#include +#include + +// CS_NAMESPACE_BEGIN + +class SrvResolver : public QObject +{ + Q_OBJECT +public: + SrvResolver(QObject *parent=0); + ~SrvResolver(); + + void resolve(const QString &server, const QString &type, const QString &proto); + void resolveSrvOnly(const QString &server, const QString &type, const QString &proto); + void next(); + void stop(); + bool isBusy() const; + + QList servers() const; + + bool failed() const; + QHostAddress resultAddress() const; + Q_UINT16 resultPort() const; + +signals: + void resultsReady(); + +private slots: + void qdns_done(); + void ndns_done(); + void t_timeout(); + +private: + class Private; + Private *d; + + void tryNext(); + void resolve(const QString &server, const QString &type, const QString &proto, bool srvOnly); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/network/bsocket.cpp b/iris-legacy/cutestuff/network/bsocket.cpp new file mode 100644 index 0000000..ca7ce7b --- /dev/null +++ b/iris-legacy/cutestuff/network/bsocket.cpp @@ -0,0 +1,474 @@ +/* + * bsocket.cpp - QSocket wrapper based on Bytestream with SRV DNS support + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include + +#include "bsocket.h" + +//#include "safedelete.h" +#ifndef NO_NDNS +#include "ndns.h" +#endif +#include "srvresolver.h" + +//#define BS_DEBUG + +#ifdef BS_DEBUG +#include +#endif + +#define READBUFSIZE 65536 + +// CS_NAMESPACE_BEGIN + +#include "psilogger.h" + +class QTcpSocketSignalRelay : public QObject +{ + Q_OBJECT +public: + QTcpSocketSignalRelay(QTcpSocket *sock, QObject *parent = 0) + :QObject(parent) + { + qRegisterMetaType("QAbstractSocket::SocketError"); + connect(sock, SIGNAL(hostFound()), SLOT(sock_hostFound()), Qt::QueuedConnection); + connect(sock, SIGNAL(connected()), SLOT(sock_connected()), Qt::QueuedConnection); + connect(sock, SIGNAL(disconnected()), SLOT(sock_disconnected()), Qt::QueuedConnection); + connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()), Qt::QueuedConnection); + connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)), Qt::QueuedConnection); + connect(sock, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(sock_error(QAbstractSocket::SocketError)), Qt::QueuedConnection); + } + +signals: + void hostFound(); + void connected(); + void disconnected(); + void readyRead(); + void bytesWritten(qint64); + void error(QAbstractSocket::SocketError); + +public slots: + void sock_hostFound() + { + emit hostFound(); + } + + void sock_connected() + { + emit connected(); + } + + void sock_disconnected() + { + emit disconnected(); + } + + void sock_readyRead() + { + emit readyRead(); + } + + void sock_bytesWritten(qint64 x) + { + emit bytesWritten(x); + } + + void sock_error(QAbstractSocket::SocketError x) + { + emit error(x); + } +}; + +class BSocket::Private +{ +public: + Private() + { + qsock = 0; + qsock_relay = 0; + } + + QTcpSocket *qsock; + QTcpSocketSignalRelay *qsock_relay; + int state; + +#ifndef NO_NDNS + NDns ndns; +#endif + SrvResolver srv; + QString host; + int port; + //SafeDelete sd; +}; + +BSocket::BSocket(QObject *parent) +:ByteStream(parent) +{ + d = new Private; +#ifndef NO_NDNS + connect(&d->ndns, SIGNAL(resultsReady()), SLOT(ndns_done())); +#endif + connect(&d->srv, SIGNAL(resultsReady()), SLOT(srv_done())); + + reset(); +} + +BSocket::~BSocket() +{ + reset(true); + delete d; + PsiLogger::instance()->log(QString("%1 BSocket::~BSocket()").arg(LOG_THIS)); +} + +void BSocket::reset(bool clear) +{ + PsiLogger::instance()->log(QString("%1 BSocket::reset()").arg(LOG_THIS)); + + if(d->qsock) { + delete d->qsock_relay; + d->qsock_relay = 0; + + /*d->qsock->disconnect(this); + + if(!clear && d->qsock->isOpen() && d->qsock->isValid()) {*/ + // move remaining into the local queue + QByteArray block(d->qsock->bytesAvailable(), 0); + d->qsock->read(block.data(), block.size()); + appendRead(block); + //} + + //d->sd.deleteLater(d->qsock); + // delete d->qsock; + d->qsock->deleteLater(); + d->qsock = 0; + } + else { + if(clear) + clearReadBuffer(); + } + + if(d->srv.isBusy()) + d->srv.stop(); +#ifndef NO_NDNS + if(d->ndns.isBusy()) + d->ndns.stop(); +#endif + d->state = Idle; +} + +void BSocket::ensureSocket() +{ + PsiLogger::instance()->log(QString("%1 BSocket::ensureSocket()").arg(LOG_THIS)); + if(!d->qsock) { + d->qsock = new QTcpSocket; +#if QT_VERSION >= 0x030200 + d->qsock->setReadBufferSize(READBUFSIZE); +#endif + d->qsock_relay = new QTcpSocketSignalRelay(d->qsock); + connect(d->qsock_relay, SIGNAL(hostFound()), SLOT(qs_hostFound())); + connect(d->qsock_relay, SIGNAL(connected()), SLOT(qs_connected())); + connect(d->qsock_relay, SIGNAL(disconnected()), SLOT(qs_closed())); + connect(d->qsock_relay, SIGNAL(readyRead()), SLOT(qs_readyRead())); + connect(d->qsock_relay, SIGNAL(bytesWritten(qint64)), SLOT(qs_bytesWritten(qint64))); + connect(d->qsock_relay, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(qs_error(QAbstractSocket::SocketError))); + } +} + +void BSocket::connectToHost(const QString &host, quint16 port) +{ + PsiLogger::instance()->log(QString("%1 BSocket::connectToHost(%2, %3)").arg(LOG_THIS).arg(host).arg(port)); + reset(true); + d->host = host; + d->port = port; +#ifdef NO_NDNS + d->state = Connecting; + do_connect(); +#else + d->state = HostLookup; + d->ndns.resolve(d->host); +#endif +} + +void BSocket::connectToServer(const QString &srv, const QString &type) +{ + PsiLogger::instance()->log(QString("%1 BSocket::connectToServer(%2, %3)").arg(LOG_THIS).arg(srv).arg(type)); + reset(true); + d->state = HostLookup; + d->srv.resolve(srv, type, "tcp"); +} + +int BSocket::socket() const +{ + if(d->qsock) + return d->qsock->socketDescriptor(); + else + return -1; +} + +void BSocket::setSocket(int s) +{ + PsiLogger::instance()->log(QString("%1 BSocket::setSocket(%2)").arg(LOG_THIS).arg(s)); + reset(true); + ensureSocket(); + d->state = Connected; + d->qsock->setSocketDescriptor(s); +} + +int BSocket::state() const +{ + return d->state; +} + +bool BSocket::isOpen() const +{ + if(d->state == Connected) + return true; + else + return false; +} + +void BSocket::close() +{ + PsiLogger::instance()->log(QString("%1 BSocket::close()").arg(LOG_THIS)); + if(d->state == Idle) + return; + + if(d->qsock) { + d->qsock->close(); + d->state = Closing; + if(d->qsock->bytesToWrite() == 0) + reset(); + } + else { + reset(); + } +} + +void BSocket::write(const QByteArray &a) +{ + if(d->state != Connected) + return; +#ifdef BS_DEBUG + QString s = QString::fromUtf8(a); + fprintf(stderr, "BSocket: writing [%d]: {%s}\n", a.size(), s.latin1()); +#endif + d->qsock->write(a.data(), a.size()); +} + +QByteArray BSocket::read(int bytes) +{ + QByteArray block; + if(d->qsock) { + int max = bytesAvailable(); + if(bytes <= 0 || bytes > max) + bytes = max; + block.resize(bytes); + d->qsock->read(block.data(), block.size()); + } + else + block = ByteStream::read(bytes); + +#ifdef BS_DEBUG + QString s = QString::fromUtf8(block); + fprintf(stderr, "BSocket: read [%d]: {%s}\n", block.size(), s.latin1()); +#endif + return block; +} + +int BSocket::bytesAvailable() const +{ + if(d->qsock) + return d->qsock->bytesAvailable(); + else + return ByteStream::bytesAvailable(); +} + +int BSocket::bytesToWrite() const +{ + if(!d->qsock) + return 0; + return d->qsock->bytesToWrite(); +} + +QHostAddress BSocket::address() const +{ + if(d->qsock) + return d->qsock->localAddress(); + else + return QHostAddress(); +} + +quint16 BSocket::port() const +{ + if(d->qsock) + return d->qsock->localPort(); + else + return 0; +} + +QHostAddress BSocket::peerAddress() const +{ + if(d->qsock) + return d->qsock->peerAddress(); + else + return QHostAddress(); +} + +quint16 BSocket::peerPort() const +{ + if(d->qsock) + return d->qsock->peerPort(); + else + return 0; +} + +void BSocket::srv_done() +{ + PsiLogger::instance()->log(QString("%1 BSocket::srv_done()").arg(LOG_THIS)); + if(d->srv.failed()) { +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Error resolving hostname.\n"); +#endif + error(ErrHostNotFound); + return; + } + + d->host = d->srv.resultAddress().toString(); + d->port = d->srv.resultPort(); + do_connect(); + //QTimer::singleShot(0, this, SLOT(do_connect())); + //hostFound(); +} + +void BSocket::ndns_done() +{ + PsiLogger::instance()->log(QString("%1 BSocket::ndns_done()").arg(LOG_THIS)); +#ifndef NO_NDNS + if(!d->ndns.result().isNull()) { + d->host = d->ndns.resultString(); + d->state = Connecting; + do_connect(); + //QTimer::singleShot(0, this, SLOT(do_connect())); + //hostFound(); + } + else { +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Error resolving hostname.\n"); +#endif + error(ErrHostNotFound); + } +#endif +} + +void BSocket::do_connect() +{ + PsiLogger::instance()->log(QString("%1 BSocket::do_connect()").arg(LOG_THIS)); +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Connecting to %s:%d\n", d->host.latin1(), d->port); +#endif + ensureSocket(); + d->qsock->connectToHost(d->host, d->port); +} + +void BSocket::qs_hostFound() +{ + PsiLogger::instance()->log(QString("%1 BSocket::qs_hostFound()").arg(LOG_THIS)); + //SafeDeleteLock s(&d->sd); +} + +void BSocket::qs_connected() +{ + PsiLogger::instance()->log(QString("%1 BSocket::qs_connected()").arg(LOG_THIS)); + d->state = Connected; +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Connected.\n"); +#endif + //SafeDeleteLock s(&d->sd); + connected(); +} + +void BSocket::qs_closed() +{ + PsiLogger::instance()->log(QString("%1 BSocket::qs_closed()").arg(LOG_THIS)); + if(d->state == Closing) + { +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Delayed Close Finished.\n"); +#endif + //SafeDeleteLock s(&d->sd); + reset(); + delayedCloseFinished(); + } +} + +void BSocket::qs_readyRead() +{ + //SafeDeleteLock s(&d->sd); + readyRead(); +} + +void BSocket::qs_bytesWritten(qint64 x64) +{ + int x = x64; +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: BytesWritten [%d].\n", x); +#endif + //SafeDeleteLock s(&d->sd); + bytesWritten(x); +} + +void BSocket::qs_error(QAbstractSocket::SocketError x) +{ + PsiLogger::instance()->log(QString("%1 BSocket::qs_error(%2)").arg(LOG_THIS).arg(x)); + if(x == QTcpSocket::RemoteHostClosedError) { +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Connection Closed.\n"); +#endif + //SafeDeleteLock s(&d->sd); + reset(); + connectionClosed(); + return; + } + +#ifdef BS_DEBUG + fprintf(stderr, "BSocket: Error.\n"); +#endif + //SafeDeleteLock s(&d->sd); + + // connection error during SRV host connect? try next + if(d->state == HostLookup && (x == QTcpSocket::ConnectionRefusedError || x == QTcpSocket::HostNotFoundError)) { + d->srv.next(); + return; + } + + reset(); + if(x == QTcpSocket::ConnectionRefusedError) + error(ErrConnectionRefused); + else if(x == QTcpSocket::HostNotFoundError) + error(ErrHostNotFound); + else + error(ErrRead); +} + +#include "bsocket.moc" + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/network/bsocket.h b/iris-legacy/cutestuff/network/bsocket.h new file mode 100644 index 0000000..1b3e6cc --- /dev/null +++ b/iris-legacy/cutestuff/network/bsocket.h @@ -0,0 +1,90 @@ +/* + * bsocket.h - QSocket wrapper based on Bytestream with SRV DNS support + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_BSOCKET_H +#define CS_BSOCKET_H + +#include + +#include "bytestream.h" + +class QString; +class QObject; +class QByteArray; + +// CS_NAMESPACE_BEGIN + +class BSocket : public ByteStream +{ + Q_OBJECT +public: + enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound }; + enum State { Idle, HostLookup, Connecting, Connected, Closing }; + BSocket(QObject *parent=0); + ~BSocket(); + + void connectToHost(const QString &host, quint16 port); + void connectToServer(const QString &srv, const QString &type); + int socket() const; + void setSocket(int); + int state() const; + + // from ByteStream + bool isOpen() const; + void close(); + void write(const QByteArray &); + QByteArray read(int bytes=0); + int bytesAvailable() const; + int bytesToWrite() const; + + // local + QHostAddress address() const; + quint16 port() const; + + // remote + QHostAddress peerAddress() const; + quint16 peerPort() const; + +signals: + void hostFound(); + void connected(); + +private slots: + void qs_hostFound(); + void qs_connected(); + void qs_closed(); + void qs_readyRead(); + void qs_bytesWritten(qint64); + void qs_error(QAbstractSocket::SocketError); + void srv_done(); + void ndns_done(); + void do_connect(); + +private: + class Private; + Private *d; + + void reset(bool clear=false); + void ensureSocket(); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/network/httpconnect.cpp b/iris-legacy/cutestuff/network/httpconnect.cpp new file mode 100644 index 0000000..b7e5b01 --- /dev/null +++ b/iris-legacy/cutestuff/network/httpconnect.cpp @@ -0,0 +1,363 @@ +/* + * httpconnect.cpp - HTTP "CONNECT" proxy + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "httpconnect.h" + +#include +//Added by qt3to4: +#include +#include "bsocket.h" +#include + +#ifdef PROX_DEBUG +#include +#endif + +// CS_NAMESPACE_BEGIN + +static QString extractLine(QByteArray *buf, bool *found) +{ + // Scan for newline + int index = buf->indexOf ("\r\n"); + if (index == -1) { + // Newline not found + if (found) + *found = false; + return ""; + } + else { + // Found newline + QString s = QString::fromAscii(buf->left(index)); + buf->remove(0, index + 2); + + if (found) + *found = true; + return s; + } +} + +static bool extractMainHeader(const QString &line, QString *proto, int *code, QString *msg) +{ + int n = line.find(' '); + if(n == -1) + return false; + if(proto) + *proto = line.mid(0, n); + ++n; + int n2 = line.find(' ', n); + if(n2 == -1) + return false; + if(code) + *code = line.mid(n, n2-n).toInt(); + n = n2+1; + if(msg) + *msg = line.mid(n); + return true; +} + +class HttpConnect::Private +{ +public: + Private() {} + + BSocket sock; + QString host; + int port; + QString user, pass; + QString real_host; + int real_port; + + QByteArray recvBuf; + + bool inHeader; + QStringList headerLines; + + int toWrite; + bool active; +}; + +HttpConnect::HttpConnect(QObject *parent) +:ByteStream(parent) +{ + d = new Private; + connect(&d->sock, SIGNAL(connected()), SLOT(sock_connected())); + connect(&d->sock, SIGNAL(connectionClosed()), SLOT(sock_connectionClosed())); + connect(&d->sock, SIGNAL(delayedCloseFinished()), SLOT(sock_delayedCloseFinished())); + connect(&d->sock, SIGNAL(readyRead()), SLOT(sock_readyRead())); + connect(&d->sock, SIGNAL(bytesWritten(int)), SLOT(sock_bytesWritten(int))); + connect(&d->sock, SIGNAL(error(int)), SLOT(sock_error(int))); + + reset(true); +} + +HttpConnect::~HttpConnect() +{ + reset(true); + delete d; +} + +void HttpConnect::reset(bool clear) +{ + if(d->sock.state() != BSocket::Idle) + d->sock.close(); + if(clear) { + clearReadBuffer(); + d->recvBuf.resize(0); + } + d->active = false; +} + +void HttpConnect::setAuth(const QString &user, const QString &pass) +{ + d->user = user; + d->pass = pass; +} + +void HttpConnect::connectToHost(const QString &proxyHost, int proxyPort, const QString &host, int port) +{ + reset(true); + + d->host = proxyHost; + d->port = proxyPort; + d->real_host = host; + d->real_port = port; + +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: Connecting to %s:%d", proxyHost.latin1(), proxyPort); + if(d->user.isEmpty()) + fprintf(stderr, "\n"); + else + fprintf(stderr, ", auth {%s,%s}\n", d->user.latin1(), d->pass.latin1()); +#endif + d->sock.connectToHost(d->host, d->port); +} + +bool HttpConnect::isOpen() const +{ + return d->active; +} + +void HttpConnect::close() +{ + d->sock.close(); + if(d->sock.bytesToWrite() == 0) + reset(); +} + +void HttpConnect::write(const QByteArray &buf) +{ + if(d->active) + d->sock.write(buf); +} + +QByteArray HttpConnect::read(int bytes) +{ + return ByteStream::read(bytes); +} + +int HttpConnect::bytesAvailable() const +{ + return ByteStream::bytesAvailable(); +} + +int HttpConnect::bytesToWrite() const +{ + if(d->active) + return d->sock.bytesToWrite(); + else + return 0; +} + +void HttpConnect::sock_connected() +{ +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: Connected\n"); +#endif + d->inHeader = true; + d->headerLines.clear(); + + // connected, now send the request + QString s; + s += QString("CONNECT ") + d->real_host + ':' + QString::number(d->real_port) + " HTTP/1.0\r\n"; + if(!d->user.isEmpty()) { + QString str = d->user + ':' + d->pass; + s += QString("Proxy-Authorization: Basic ") + QCA::Base64().encodeString(str) + "\r\n"; + } + s += "Pragma: no-cache\r\n"; + s += "\r\n"; + + Q3CString cs = s.utf8(); + QByteArray block(cs.length()); + memcpy(block.data(), cs.data(), block.size()); + d->toWrite = block.size(); + d->sock.write(block); +} + +void HttpConnect::sock_connectionClosed() +{ + if(d->active) { + reset(); + connectionClosed(); + } + else { + error(ErrProxyNeg); + } +} + +void HttpConnect::sock_delayedCloseFinished() +{ + if(d->active) { + reset(); + delayedCloseFinished(); + } +} + +void HttpConnect::sock_readyRead() +{ + QByteArray block = d->sock.read(); + + if(!d->active) { + ByteStream::appendArray(&d->recvBuf, block); + + if(d->inHeader) { + // grab available lines + while(1) { + bool found; + QString line = extractLine(&d->recvBuf, &found); + if(!found) + break; + if(line.isEmpty()) { + d->inHeader = false; + break; + } + d->headerLines += line; + } + + // done with grabbing the header? + if(!d->inHeader) { + QString str = d->headerLines.first(); + d->headerLines.remove(d->headerLines.begin()); + + QString proto; + int code; + QString msg; + if(!extractMainHeader(str, &proto, &code, &msg)) { +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: invalid header!\n"); +#endif + reset(true); + error(ErrProxyNeg); + return; + } + else { +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: header proto=[%s] code=[%d] msg=[%s]\n", proto.latin1(), code, msg.latin1()); + for(QStringList::ConstIterator it = d->headerLines.begin(); it != d->headerLines.end(); ++it) + fprintf(stderr, "HttpConnect: * [%s]\n", (*it).latin1()); +#endif + } + + if(code == 200) { // OK +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: << Success >>\n"); +#endif + d->active = true; + connected(); + + if(!d->recvBuf.isEmpty()) { + appendRead(d->recvBuf); + d->recvBuf.resize(0); + readyRead(); + return; + } + } + else { + int err; + QString errStr; + if(code == 407) { // Authentication failed + err = ErrProxyAuth; + errStr = tr("Authentication failed"); + } + else if(code == 404) { // Host not found + err = ErrHostNotFound; + errStr = tr("Host not found"); + } + else if(code == 403) { // Access denied + err = ErrProxyNeg; + errStr = tr("Access denied"); + } + else if(code == 503) { // Connection refused + err = ErrConnectionRefused; + errStr = tr("Connection refused"); + } + else { // invalid reply + err = ErrProxyNeg; + errStr = tr("Invalid reply"); + } + +#ifdef PROX_DEBUG + fprintf(stderr, "HttpConnect: << Error >> [%s]\n", errStr.latin1()); +#endif + reset(true); + error(err); + return; + } + } + } + } + else { + appendRead(block); + readyRead(); + return; + } +} + +void HttpConnect::sock_bytesWritten(int x) +{ + if(d->toWrite > 0) { + int size = x; + if(d->toWrite < x) + size = d->toWrite; + d->toWrite -= size; + x -= size; + } + + if(d->active && x > 0) + bytesWritten(x); +} + +void HttpConnect::sock_error(int x) +{ + if(d->active) { + reset(); + error(ErrRead); + } + else { + reset(true); + if(x == BSocket::ErrHostNotFound) + error(ErrProxyConnect); + else if(x == BSocket::ErrConnectionRefused) + error(ErrProxyConnect); + else if(x == BSocket::ErrRead) + error(ErrProxyNeg); + } +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/network/httpconnect.h b/iris-legacy/cutestuff/network/httpconnect.h new file mode 100644 index 0000000..4ab84b2 --- /dev/null +++ b/iris-legacy/cutestuff/network/httpconnect.h @@ -0,0 +1,67 @@ +/* + * httpconnect.h - HTTP "CONNECT" proxy + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_HTTPCONNECT_H +#define CS_HTTPCONNECT_H + +#include "bytestream.h" + +// CS_NAMESPACE_BEGIN + +class HttpConnect : public ByteStream +{ + Q_OBJECT +public: + enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth }; + HttpConnect(QObject *parent=0); + ~HttpConnect(); + + void setAuth(const QString &user, const QString &pass=""); + void connectToHost(const QString &proxyHost, int proxyPort, const QString &host, int port); + + // from ByteStream + bool isOpen() const; + void close(); + void write(const QByteArray &); + QByteArray read(int bytes=0); + int bytesAvailable() const; + int bytesToWrite() const; + +signals: + void connected(); + +private slots: + void sock_connected(); + void sock_connectionClosed(); + void sock_delayedCloseFinished(); + void sock_readyRead(); + void sock_bytesWritten(int); + void sock_error(int); + +private: + class Private; + Private *d; + + void reset(bool clear=false); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/network/httppoll.cpp b/iris-legacy/cutestuff/network/httppoll.cpp new file mode 100644 index 0000000..da7113c --- /dev/null +++ b/iris-legacy/cutestuff/network/httppoll.cpp @@ -0,0 +1,666 @@ +/* + * httppoll.cpp - HTTP polling proxy + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "httppoll.h" + +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +#include "bsocket.h" + +#ifdef PROX_DEBUG +#include +#endif + +#define POLL_KEYS 64 + +// CS_NAMESPACE_BEGIN + +static QByteArray randomArray(int size) +{ + QByteArray a(size); + for(int n = 0; n < size; ++n) + a[n] = (char)(256.0*rand()/(RAND_MAX+1.0)); + return a; +} + +//---------------------------------------------------------------------------- +// HttpPoll +//---------------------------------------------------------------------------- +static QString hpk(int n, const QString &s) +{ + if(n == 0) + return s; + else + return QCA::Base64().arrayToString( QCA::Hash("sha1").hash( Q3CString(hpk(n - 1, s).latin1()) ).toByteArray() ); +} + +class HttpPoll::Private +{ +public: + Private() {} + + HttpProxyPost http; + QString host; + int port; + QString user, pass; + QString url; + bool use_proxy; + + QByteArray out; + + int state; + bool closing; + QString ident; + + QTimer *t; + + QString key[POLL_KEYS]; + int key_n; + + int polltime; +}; + +HttpPoll::HttpPoll(QObject *parent) +:ByteStream(parent) +{ + d = new Private; + + d->polltime = 30; + d->t = new QTimer; + connect(d->t, SIGNAL(timeout()), SLOT(do_sync())); + + connect(&d->http, SIGNAL(result()), SLOT(http_result())); + connect(&d->http, SIGNAL(error(int)), SLOT(http_error(int))); + + reset(true); +} + +HttpPoll::~HttpPoll() +{ + reset(true); + delete d->t; + delete d; +} + +void HttpPoll::reset(bool clear) +{ + if(d->http.isActive()) + d->http.stop(); + if(clear) + clearReadBuffer(); + clearWriteBuffer(); + d->out.resize(0); + d->state = 0; + d->closing = false; + d->t->stop(); +} + +void HttpPoll::setAuth(const QString &user, const QString &pass) +{ + d->user = user; + d->pass = pass; +} + +void HttpPoll::connectToUrl(const QString &url) +{ + connectToHost("", 0, url); +} + +void HttpPoll::connectToHost(const QString &proxyHost, int proxyPort, const QString &url) +{ + reset(true); + + // using proxy? + if(!proxyHost.isEmpty()) { + d->host = proxyHost; + d->port = proxyPort; + d->url = url; + d->use_proxy = true; + } + else { + Q3Url u = url; + d->host = u.host(); + if(u.hasPort()) + d->port = u.port(); + else + d->port = 80; + d->url = u.encodedPathAndQuery(); + d->use_proxy = false; + } + + resetKey(); + bool last; + QString key = getKey(&last); + +#ifdef PROX_DEBUG + fprintf(stderr, "HttpPoll: Connecting to %s:%d [%s]", d->host.latin1(), d->port, d->url.latin1()); + if(d->user.isEmpty()) + fprintf(stderr, "\n"); + else + fprintf(stderr, ", auth {%s,%s}\n", d->user.latin1(), d->pass.latin1()); +#endif + QPointer self = this; + syncStarted(); + if(!self) + return; + + d->state = 1; + d->http.setAuth(d->user, d->pass); + d->http.post(d->host, d->port, d->url, makePacket("0", key, "", QByteArray()), d->use_proxy); +} + +QByteArray HttpPoll::makePacket(const QString &ident, const QString &key, const QString &newkey, const QByteArray &block) +{ + QString str = ident; + if(!key.isEmpty()) { + str += ';'; + str += key; + } + if(!newkey.isEmpty()) { + str += ';'; + str += newkey; + } + str += ','; + Q3CString cs = str.latin1(); + int len = cs.length(); + + QByteArray a(len + block.size()); + memcpy(a.data(), cs.data(), len); + memcpy(a.data() + len, block.data(), block.size()); + return a; +} + +int HttpPoll::pollInterval() const +{ + return d->polltime; +} + +void HttpPoll::setPollInterval(int seconds) +{ + d->polltime = seconds; +} + +bool HttpPoll::isOpen() const +{ + return (d->state == 2 ? true: false); +} + +void HttpPoll::close() +{ + if(d->state == 0 || d->closing) + return; + + if(bytesToWrite() == 0) + reset(); + else + d->closing = true; +} + +void HttpPoll::http_result() +{ + // check for death :) + QPointer self = this; + syncFinished(); + if(!self) + return; + + // get id and packet + QString id; + QString cookie = d->http.getHeader("Set-Cookie"); + int n = cookie.find("ID="); + if(n == -1) { + reset(); + error(ErrRead); + return; + } + n += 3; + int n2 = cookie.find(';', n); + if(n2 != -1) + id = cookie.mid(n, n2-n); + else + id = cookie.mid(n); + QByteArray block = d->http.body(); + + // session error? + if(id.right(2) == ":0") { + if(id == "0:0" && d->state == 2) { + reset(); + connectionClosed(); + return; + } + else { + reset(); + error(ErrRead); + return; + } + } + + d->ident = id; + bool justNowConnected = false; + if(d->state == 1) { + d->state = 2; + justNowConnected = true; + } + + // sync up again soon + if(bytesToWrite() > 0 || !d->closing) + d->t->start(d->polltime * 1000, true); + + // connecting + if(justNowConnected) { + connected(); + } + else { + if(!d->out.isEmpty()) { + int x = d->out.size(); + d->out.resize(0); + takeWrite(x); + bytesWritten(x); + } + } + + if(!self) + return; + + if(!block.isEmpty()) { + appendRead(block); + readyRead(); + } + + if(!self) + return; + + if(bytesToWrite() > 0) { + do_sync(); + } + else { + if(d->closing) { + reset(); + delayedCloseFinished(); + return; + } + } +} + +void HttpPoll::http_error(int x) +{ + reset(); + if(x == HttpProxyPost::ErrConnectionRefused) + error(ErrConnectionRefused); + else if(x == HttpProxyPost::ErrHostNotFound) + error(ErrHostNotFound); + else if(x == HttpProxyPost::ErrSocket) + error(ErrRead); + else if(x == HttpProxyPost::ErrProxyConnect) + error(ErrProxyConnect); + else if(x == HttpProxyPost::ErrProxyNeg) + error(ErrProxyNeg); + else if(x == HttpProxyPost::ErrProxyAuth) + error(ErrProxyAuth); +} + +int HttpPoll::tryWrite() +{ + if(!d->http.isActive()) + do_sync(); + return 0; +} + +void HttpPoll::do_sync() +{ + if(d->http.isActive()) + return; + + d->t->stop(); + d->out = takeWrite(0, false); + + bool last; + QString key = getKey(&last); + QString newkey; + if(last) { + resetKey(); + newkey = getKey(&last); + } + + QPointer self = this; + syncStarted(); + if(!self) + return; + + d->http.post(d->host, d->port, d->url, makePacket(d->ident, key, newkey, d->out), d->use_proxy); +} + +void HttpPoll::resetKey() +{ +#ifdef PROX_DEBUG + fprintf(stderr, "HttpPoll: reset key!\n"); +#endif + QByteArray a = randomArray(64); + QString str = QString::fromLatin1(a.data(), a.size()); + + d->key_n = POLL_KEYS; + for(int n = 0; n < POLL_KEYS; ++n) + d->key[n] = hpk(n+1, str); +} + +const QString & HttpPoll::getKey(bool *last) +{ + *last = false; + --(d->key_n); + if(d->key_n == 0) + *last = true; + return d->key[d->key_n]; +} + + +//---------------------------------------------------------------------------- +// HttpProxyPost +//---------------------------------------------------------------------------- +static QString extractLine(QByteArray *buf, bool *found) +{ + // scan for newline + int n; + for(n = 0; n < (int)buf->size()-1; ++n) { + if(buf->at(n) == '\r' && buf->at(n+1) == '\n') { + //Q3CString cstr; + //cstr.resize(n+1); + QByteArray cstr; + cstr.resize(n); + memcpy(cstr.data(), buf->data(), n); + n += 2; // hack off CR/LF + + memmove(buf->data(), buf->data() + n, buf->size() - n); + buf->resize(buf->size() - n); + QString s = QString::fromUtf8(cstr); + + if(found) + *found = true; + return s; + } + } + + if(found) + *found = false; + return ""; +} + +static bool extractMainHeader(const QString &line, QString *proto, int *code, QString *msg) +{ + int n = line.find(' '); + if(n == -1) + return false; + if(proto) + *proto = line.mid(0, n); + ++n; + int n2 = line.find(' ', n); + if(n2 == -1) + return false; + if(code) + *code = line.mid(n, n2-n).toInt(); + n = n2+1; + if(msg) + *msg = line.mid(n); + return true; +} + +class HttpProxyPost::Private +{ +public: + Private() {} + + BSocket sock; + QByteArray postdata, recvBuf, body; + QString url; + QString user, pass; + bool inHeader; + QStringList headerLines; + bool asProxy; + QString host; +}; + +HttpProxyPost::HttpProxyPost(QObject *parent) +:QObject(parent) +{ + d = new Private; + connect(&d->sock, SIGNAL(connected()), SLOT(sock_connected())); + connect(&d->sock, SIGNAL(connectionClosed()), SLOT(sock_connectionClosed())); + connect(&d->sock, SIGNAL(readyRead()), SLOT(sock_readyRead())); + connect(&d->sock, SIGNAL(error(int)), SLOT(sock_error(int))); + reset(true); +} + +HttpProxyPost::~HttpProxyPost() +{ + reset(true); + delete d; +} + +void HttpProxyPost::reset(bool clear) +{ + if(d->sock.state() != BSocket::Idle) + d->sock.close(); + d->recvBuf.resize(0); + if(clear) + d->body.resize(0); +} + +void HttpProxyPost::setAuth(const QString &user, const QString &pass) +{ + d->user = user; + d->pass = pass; +} + +bool HttpProxyPost::isActive() const +{ + return (d->sock.state() == BSocket::Idle ? false: true); +} + +void HttpProxyPost::post(const QString &proxyHost, int proxyPort, const QString &url, const QByteArray &data, bool asProxy) +{ + reset(true); + + d->host = proxyHost; + d->url = url; + d->postdata = data; + d->asProxy = asProxy; + +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: Connecting to %s:%d", proxyHost.latin1(), proxyPort); + if(d->user.isEmpty()) + fprintf(stderr, "\n"); + else + fprintf(stderr, ", auth {%s,%s}\n", d->user.latin1(), d->pass.latin1()); +#endif + d->sock.connectToHost(proxyHost, proxyPort); +} + +void HttpProxyPost::stop() +{ + reset(); +} + +QByteArray HttpProxyPost::body() const +{ + return d->body; +} + +QString HttpProxyPost::getHeader(const QString &var) const +{ + for(QStringList::ConstIterator it = d->headerLines.begin(); it != d->headerLines.end(); ++it) { + const QString &s = *it; + int n = s.find(": "); + if(n == -1) + continue; + QString v = s.mid(0, n); + if(v == var) + return s.mid(n+2); + } + return ""; +} + +void HttpProxyPost::sock_connected() +{ +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: Connected\n"); +#endif + d->inHeader = true; + d->headerLines.clear(); + + Q3Url u = d->url; + + // connected, now send the request + QString s; + s += QString("POST ") + d->url + " HTTP/1.0\r\n"; + if(d->asProxy) { + if(!d->user.isEmpty()) { + QString str = d->user + ':' + d->pass; + s += QString("Proxy-Authorization: Basic ") + QCA::Base64().encodeString(str) + "\r\n"; + } + s += "Pragma: no-cache\r\n"; + s += QString("Host: ") + u.host() + "\r\n"; + } + else { + s += QString("Host: ") + d->host + "\r\n"; + } + s += "Content-Type: application/x-www-form-urlencoded\r\n"; + s += QString("Content-Length: ") + QString::number(d->postdata.size()) + "\r\n"; + s += "\r\n"; + + // write request + Q3CString cs = s.utf8(); + QByteArray block(cs.length()); + memcpy(block.data(), cs.data(), block.size()); + d->sock.write(block); + + // write postdata + d->sock.write(d->postdata); +} + +void HttpProxyPost::sock_connectionClosed() +{ + d->body = d->recvBuf; + reset(); + result(); +} + +void HttpProxyPost::sock_readyRead() +{ + QByteArray block = d->sock.read(); + ByteStream::appendArray(&d->recvBuf, block); + + if(d->inHeader) { + // grab available lines + while(1) { + bool found; + QString line = extractLine(&d->recvBuf, &found); + if(!found) + break; + if(line.isEmpty()) { + d->inHeader = false; + break; + } + d->headerLines += line; + } + + // done with grabbing the header? + if(!d->inHeader) { + QString str = d->headerLines.first(); + d->headerLines.remove(d->headerLines.begin()); + + QString proto; + int code; + QString msg; + if(!extractMainHeader(str, &proto, &code, &msg)) { +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: invalid header!\n"); +#endif + reset(true); + error(ErrProxyNeg); + return; + } + else { +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: header proto=[%s] code=[%d] msg=[%s]\n", proto.latin1(), code, msg.latin1()); + for(QStringList::ConstIterator it = d->headerLines.begin(); it != d->headerLines.end(); ++it) + fprintf(stderr, "HttpProxyPost: * [%s]\n", (*it).latin1()); +#endif + } + + if(code == 200) { // OK +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: << Success >>\n"); +#endif + } + else { + int err; + QString errStr; + if(code == 407) { // Authentication failed + err = ErrProxyAuth; + errStr = tr("Authentication failed"); + } + else if(code == 404) { // Host not found + err = ErrHostNotFound; + errStr = tr("Host not found"); + } + else if(code == 403) { // Access denied + err = ErrProxyNeg; + errStr = tr("Access denied"); + } + else if(code == 503) { // Connection refused + err = ErrConnectionRefused; + errStr = tr("Connection refused"); + } + else { // invalid reply + err = ErrProxyNeg; + errStr = tr("Invalid reply"); + } + +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: << Error >> [%s]\n", errStr.latin1()); +#endif + reset(true); + error(err); + return; + } + } + } +} + +void HttpProxyPost::sock_error(int x) +{ +#ifdef PROX_DEBUG + fprintf(stderr, "HttpProxyPost: socket error: %d\n", x); +#endif + reset(true); + if(x == BSocket::ErrHostNotFound) + error(ErrProxyConnect); + else if(x == BSocket::ErrConnectionRefused) + error(ErrProxyConnect); + else if(x == BSocket::ErrRead) + error(ErrProxyNeg); +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/network/httppoll.h b/iris-legacy/cutestuff/network/httppoll.h new file mode 100644 index 0000000..0b79802 --- /dev/null +++ b/iris-legacy/cutestuff/network/httppoll.h @@ -0,0 +1,104 @@ +/* + * httppoll.h - HTTP polling proxy + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_HTTPPOLL_H +#define CS_HTTPPOLL_H + +#include "bytestream.h" + +// CS_NAMESPACE_BEGIN + +class HttpPoll : public ByteStream +{ + Q_OBJECT +public: + enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth }; + HttpPoll(QObject *parent=0); + ~HttpPoll(); + + void setAuth(const QString &user, const QString &pass=""); + void connectToUrl(const QString &url); + void connectToHost(const QString &proxyHost, int proxyPort, const QString &url); + + int pollInterval() const; + void setPollInterval(int seconds); + + // from ByteStream + bool isOpen() const; + void close(); + +signals: + void connected(); + void syncStarted(); + void syncFinished(); + +protected: + int tryWrite(); + +private slots: + void http_result(); + void http_error(int); + void do_sync(); + +private: + class Private; + Private *d; + + void reset(bool clear=false); + QByteArray makePacket(const QString &ident, const QString &key, const QString &newkey, const QByteArray &block); + void resetKey(); + const QString & getKey(bool *); +}; + +class HttpProxyPost : public QObject +{ + Q_OBJECT +public: + enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocket, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth }; + HttpProxyPost(QObject *parent=0); + ~HttpProxyPost(); + + void setAuth(const QString &user, const QString &pass=""); + bool isActive() const; + void post(const QString &proxyHost, int proxyPort, const QString &url, const QByteArray &data, bool asProxy=true); + void stop(); + QByteArray body() const; + QString getHeader(const QString &) const; + +signals: + void result(); + void error(int); + +private slots: + void sock_connected(); + void sock_connectionClosed(); + void sock_readyRead(); + void sock_error(int); + +private: + class Private; + Private *d; + + void reset(bool clear=false); +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/network/socks.cpp b/iris-legacy/cutestuff/network/socks.cpp new file mode 100644 index 0000000..31d728d --- /dev/null +++ b/iris-legacy/cutestuff/network/socks.cpp @@ -0,0 +1,1231 @@ +/* + * socks.cpp - SOCKS5 TCP proxy client/server + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "socks.h" + +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include + +#ifdef Q_OS_UNIX +#include +#include +#endif + +#ifdef Q_OS_WIN32 +#include +#endif + +#ifdef Q_OS_UNIX +#include +#include +#endif + +#include "servsock.h" +#include "bsocket.h" + +#ifdef PROX_DEBUG +#include +#endif + +// CS_NAMESPACE_BEGIN + +//---------------------------------------------------------------------------- +// SocksUDP +//---------------------------------------------------------------------------- +static QByteArray sp_create_udp(const QString &host, Q_UINT16 port, const QByteArray &buf) +{ + // detect for IP addresses + //QHostAddress addr; + //if(addr.setAddress(host)) + // return sp_set_request(addr, port, cmd1); + + Q3CString h = host.utf8(); + h.truncate(255); + h = QString::fromUtf8(h).utf8(); // delete any partial characters? + int hlen = h.length(); + + int at = 0; + QByteArray a(4); + a[at++] = 0x00; // reserved + a[at++] = 0x00; // reserved + a[at++] = 0x00; // frag + a[at++] = 0x03; // address type = domain + + // host + a.resize(at+hlen+1); + a[at++] = hlen; + memcpy(a.data() + at, h.data(), hlen); + at += hlen; + + // port + a.resize(at+2); + unsigned short p = htons(port); + memcpy(a.data() + at, &p, 2); + at += 2; + + a.resize(at+buf.size()); + memcpy(a.data() + at, buf.data(), buf.size()); + + return a; +} + +struct SPS_UDP +{ + QString host; + Q_UINT16 port; + QByteArray data; +}; + +static int sp_read_udp(QByteArray *from, SPS_UDP *s) +{ + int full_len = 4; + if((int)from->size() < full_len) + return 0; + + QString host; + QHostAddress addr; + unsigned char atype = from->at(3); + + if(atype == 0x01) { + full_len += 4; + if((int)from->size() < full_len) + return 0; + Q_UINT32 ip4; + memcpy(&ip4, from->data() + 4, 4); + addr.setAddress(ntohl(ip4)); + host = addr.toString(); + } + else if(atype == 0x03) { + ++full_len; + if((int)from->size() < full_len) + return 0; + unsigned char host_len = from->at(4); + full_len += host_len; + if((int)from->size() < full_len) + return 0; + Q3CString cs(host_len+1); + memcpy(cs.data(), from->data() + 5, host_len); + host = QString::fromLatin1(cs); + } + else if(atype == 0x04) { + full_len += 16; + if((int)from->size() < full_len) + return 0; + Q_UINT8 a6[16]; + memcpy(a6, from->data() + 4, 16); + addr.setAddress(a6); + host = addr.toString(); + } + + full_len += 2; + if((int)from->size() < full_len) + return 0; + + Q_UINT16 p; + memcpy(&p, from->data() + full_len - 2, 2); + + s->host = host; + s->port = ntohs(p); + s->data.resize(from->size() - full_len); + memcpy(s->data.data(), from->data() + full_len, s->data.size()); + + return 1; +} + +class SocksUDP::Private +{ +public: + Q3SocketDevice *sd; + QSocketNotifier *sn; + SocksClient *sc; + QHostAddress routeAddr; + int routePort; + QString host; + int port; +}; + +SocksUDP::SocksUDP(SocksClient *sc, const QString &host, int port, const QHostAddress &routeAddr, int routePort) +:QObject(sc) +{ + d = new Private; + d->sc = sc; + d->sd = new Q3SocketDevice(Q3SocketDevice::Datagram); + d->sd->setBlocking(false); + d->sn = new QSocketNotifier(d->sd->socket(), QSocketNotifier::Read); + connect(d->sn, SIGNAL(activated(int)), SLOT(sn_activated(int))); + d->host = host; + d->port = port; + d->routeAddr = routeAddr; + d->routePort = routePort; +} + +SocksUDP::~SocksUDP() +{ + delete d->sn; + delete d->sd; + delete d; +} + +void SocksUDP::change(const QString &host, int port) +{ + d->host = host; + d->port = port; +} + +void SocksUDP::write(const QByteArray &data) +{ + QByteArray buf = sp_create_udp(d->host, d->port, data); + d->sd->setBlocking(true); + d->sd->writeBlock(buf.data(), buf.size(), d->routeAddr, d->routePort); + d->sd->setBlocking(false); +} + +void SocksUDP::sn_activated(int) +{ + QByteArray buf(8192); + int actual = d->sd->readBlock(buf.data(), buf.size()); + buf.resize(actual); + packetReady(buf); +} + +//---------------------------------------------------------------------------- +// SocksClient +//---------------------------------------------------------------------------- +#define REQ_CONNECT 0x01 +#define REQ_BIND 0x02 +#define REQ_UDPASSOCIATE 0x03 + +#define RET_SUCCESS 0x00 +#define RET_UNREACHABLE 0x04 +#define RET_CONNREFUSED 0x05 + +// spc = socks packet client +// sps = socks packet server +// SPCS = socks packet client struct +// SPSS = socks packet server struct + +// Version +static QByteArray spc_set_version() +{ + QByteArray ver(4); + ver[0] = 0x05; // socks version 5 + ver[1] = 0x02; // number of methods + ver[2] = 0x00; // no-auth + ver[3] = 0x02; // username + return ver; +} + +static QByteArray sps_set_version(int method) +{ + QByteArray ver(2); + ver[0] = 0x05; + ver[1] = method; + return ver; +} + +struct SPCS_VERSION +{ + unsigned char version; + QByteArray methodList; +}; + +static int spc_get_version(QByteArray *from, SPCS_VERSION *s) +{ + if(from->size() < 1) + return 0; + if(from->at(0) != 0x05) // only SOCKS5 supported + return -1; + if(from->size() < 2) + return 0; + int num = from->at(1); + if(num > 16) // who the heck has over 16 auth methods?? + return -1; + if(from->size() < 2 + num) + return 0; + QByteArray a = ByteStream::takeArray(from, 2+num); + s->version = a[0]; + s->methodList.resize(num); + memcpy(s->methodList.data(), a.data() + 2, num); + return 1; +} + +struct SPSS_VERSION +{ + unsigned char version; + unsigned char method; +}; + +static int sps_get_version(QByteArray *from, SPSS_VERSION *s) +{ + if(from->size() < 2) + return 0; + QByteArray a = ByteStream::takeArray(from, 2); + s->version = a[0]; + s->method = a[1]; + return 1; +} + +// authUsername +static QByteArray spc_set_authUsername(const Q3CString &user, const Q3CString &pass) +{ + int len1 = user.length(); + int len2 = pass.length(); + if(len1 > 255) + len1 = 255; + if(len2 > 255) + len2 = 255; + QByteArray a(1+1+len1+1+len2); + a[0] = 0x01; // username auth version 1 + a[1] = len1; + memcpy(a.data() + 2, user.data(), len1); + a[2+len1] = len2; + memcpy(a.data() + 3 + len1, pass.data(), len2); + return a; +} + +static QByteArray sps_set_authUsername(bool success) +{ + QByteArray a(2); + a[0] = 0x01; + a[1] = success ? 0x00 : 0xff; + return a; +} + +struct SPCS_AUTHUSERNAME +{ + QString user, pass; +}; + +static int spc_get_authUsername(QByteArray *from, SPCS_AUTHUSERNAME *s) +{ + if(from->size() < 1) + return 0; + unsigned char ver = from->at(0); + if(ver != 0x01) + return -1; + if(from->size() < 2) + return 0; + unsigned char ulen = from->at(1); + if((int)from->size() < ulen + 3) + return 0; + unsigned char plen = from->at(ulen+2); + if((int)from->size() < ulen + plen + 3) + return 0; + QByteArray a = ByteStream::takeArray(from, ulen + plen + 3); + + Q3CString user, pass; + user.resize(ulen+1); + pass.resize(plen+1); + memcpy(user.data(), a.data()+2, ulen); + memcpy(pass.data(), a.data()+ulen+3, plen); + s->user = QString::fromUtf8(user); + s->pass = QString::fromUtf8(pass); + return 1; +} + +struct SPSS_AUTHUSERNAME +{ + unsigned char version; + bool success; +}; + +static int sps_get_authUsername(QByteArray *from, SPSS_AUTHUSERNAME *s) +{ + if(from->size() < 2) + return 0; + QByteArray a = ByteStream::takeArray(from, 2); + s->version = a[0]; + s->success = ((char) a[1] == 0 ? true: false); + return 1; +} + +// connectRequest +static QByteArray sp_set_request(const QHostAddress &addr, unsigned short port, unsigned char cmd1) +{ + int at = 0; + QByteArray a(4); + a[at++] = 0x05; // socks version 5 + a[at++] = cmd1; + a[at++] = 0x00; // reserved + if(addr.isIp4Addr()) { + a[at++] = 0x01; // address type = ipv4 + Q_UINT32 ip4 = htonl(addr.ip4Addr()); + a.resize(at+4); + memcpy(a.data() + at, &ip4, 4); + at += 4; + } + else { + a[at++] = 0x04; + Q_UINT8 a6[16]; + QStringList s6 = QStringList::split(':', addr.toString(), true); + int at = 0; + Q_UINT16 c; + bool ok; + for(QStringList::ConstIterator it = s6.begin(); it != s6.end(); ++it) { + c = (*it).toInt(&ok, 16); + a6[at++] = (c >> 8); + a6[at++] = c & 0xff; + } + a.resize(at+16); + memcpy(a.data() + at, a6, 16); + at += 16; + } + + // port + a.resize(at+2); + unsigned short p = htons(port); + memcpy(a.data() + at, &p, 2); + + return a; +} + +static QByteArray sp_set_request(const QString &host, Q_UINT16 port, unsigned char cmd1) +{ + // detect for IP addresses + QHostAddress addr; + if(addr.setAddress(host)) + return sp_set_request(addr, port, cmd1); + + Q3CString h = host.utf8(); + h.truncate(255); + h = QString::fromUtf8(h).utf8(); // delete any partial characters? + int hlen = h.length(); + + int at = 0; + QByteArray a(4); + a[at++] = 0x05; // socks version 5 + a[at++] = cmd1; + a[at++] = 0x00; // reserved + a[at++] = 0x03; // address type = domain + + // host + a.resize(at+hlen+1); + a[at++] = hlen; + memcpy(a.data() + at, h.data(), hlen); + at += hlen; + + // port + a.resize(at+2); + unsigned short p = htons(port); + memcpy(a.data() + at, &p, 2); + + return a; +} + +struct SPS_CONNREQ +{ + unsigned char version; + unsigned char cmd; + int address_type; + QString host; + QHostAddress addr; + Q_UINT16 port; +}; + +static int sp_get_request(QByteArray *from, SPS_CONNREQ *s) +{ + int full_len = 4; + if((int)from->size() < full_len) + return 0; + + QString host; + QHostAddress addr; + unsigned char atype = from->at(3); + + if(atype == 0x01) { + full_len += 4; + if((int)from->size() < full_len) + return 0; + Q_UINT32 ip4; + memcpy(&ip4, from->data() + 4, 4); + addr.setAddress(ntohl(ip4)); + } + else if(atype == 0x03) { + ++full_len; + if((int)from->size() < full_len) + return 0; + unsigned char host_len = from->at(4); + full_len += host_len; + if((int)from->size() < full_len) + return 0; + Q3CString cs(host_len+1); + memcpy(cs.data(), from->data() + 5, host_len); + host = QString::fromLatin1(cs); + } + else if(atype == 0x04) { + full_len += 16; + if((int)from->size() < full_len) + return 0; + Q_UINT8 a6[16]; + memcpy(a6, from->data() + 4, 16); + addr.setAddress(a6); + } + + full_len += 2; + if((int)from->size() < full_len) + return 0; + + QByteArray a = ByteStream::takeArray(from, full_len); + + Q_UINT16 p; + memcpy(&p, a.data() + full_len - 2, 2); + + s->version = a[0]; + s->cmd = a[1]; + s->address_type = atype; + s->host = host; + s->addr = addr; + s->port = ntohs(p); + + return 1; +} + +enum { StepVersion, StepAuth, StepRequest }; + +class SocksClient::Private +{ +public: + Private() {} + + BSocket sock; + QString host; + int port; + QString user, pass; + QString real_host; + int real_port; + + QByteArray recvBuf; + bool active; + int step; + int authMethod; + bool incoming, waiting; + + QString rhost; + int rport; + + int pending; + + bool udp; + QString udpAddr; + int udpPort; +}; + +SocksClient::SocksClient(QObject *parent) +:ByteStream(parent) +{ + init(); + + d->incoming = false; +} + +SocksClient::SocksClient(int s, QObject *parent) +:ByteStream(parent) +{ + init(); + + d->incoming = true; + d->waiting = true; + d->sock.setSocket(s); +} + +void SocksClient::init() +{ + d = new Private; + connect(&d->sock, SIGNAL(connected()), SLOT(sock_connected())); + connect(&d->sock, SIGNAL(connectionClosed()), SLOT(sock_connectionClosed())); + connect(&d->sock, SIGNAL(delayedCloseFinished()), SLOT(sock_delayedCloseFinished())); + connect(&d->sock, SIGNAL(readyRead()), SLOT(sock_readyRead())); + connect(&d->sock, SIGNAL(bytesWritten(int)), SLOT(sock_bytesWritten(int))); + connect(&d->sock, SIGNAL(error(int)), SLOT(sock_error(int))); + + reset(true); +} + +SocksClient::~SocksClient() +{ + reset(true); + delete d; +} + +void SocksClient::reset(bool clear) +{ + if(d->sock.state() != BSocket::Idle) + d->sock.close(); + if(clear) + clearReadBuffer(); + d->recvBuf.resize(0); + d->active = false; + d->waiting = false; + d->udp = false; + d->pending = 0; +} + +bool SocksClient::isIncoming() const +{ + return d->incoming; +} + +void SocksClient::setAuth(const QString &user, const QString &pass) +{ + d->user = user; + d->pass = pass; +} + +void SocksClient::connectToHost(const QString &proxyHost, int proxyPort, const QString &host, int port, bool udpMode) +{ + reset(true); + + d->host = proxyHost; + d->port = proxyPort; + d->real_host = host; + d->real_port = port; + d->udp = udpMode; + +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Connecting to %s:%d", proxyHost.latin1(), proxyPort); + if(d->user.isEmpty()) + fprintf(stderr, "\n"); + else + fprintf(stderr, ", auth {%s,%s}\n", d->user.latin1(), d->pass.latin1()); +#endif + d->sock.connectToHost(d->host, d->port); +} + +bool SocksClient::isOpen() const +{ + return d->active; +} + +void SocksClient::close() +{ + d->sock.close(); + if(d->sock.bytesToWrite() == 0) + reset(); +} + +void SocksClient::writeData(const QByteArray &buf) +{ + d->pending += buf.size(); + d->sock.write(buf); +} + +void SocksClient::write(const QByteArray &buf) +{ + if(d->active && !d->udp) + d->sock.write(buf); +} + +QByteArray SocksClient::read(int bytes) +{ + return ByteStream::read(bytes); +} + +int SocksClient::bytesAvailable() const +{ + return ByteStream::bytesAvailable(); +} + +int SocksClient::bytesToWrite() const +{ + if(d->active) + return d->sock.bytesToWrite(); + else + return 0; +} + +void SocksClient::sock_connected() +{ +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Connected\n"); +#endif + + d->step = StepVersion; + writeData(spc_set_version()); +} + +void SocksClient::sock_connectionClosed() +{ + if(d->active) { + reset(); + connectionClosed(); + } + else { + error(ErrProxyNeg); + } +} + +void SocksClient::sock_delayedCloseFinished() +{ + if(d->active) { + reset(); + delayedCloseFinished(); + } +} + +void SocksClient::sock_readyRead() +{ + QByteArray block = d->sock.read(); + + if(!d->active) { + if(d->incoming) + processIncoming(block); + else + processOutgoing(block); + } + else { + if(!d->udp) { + appendRead(block); + readyRead(); + } + } +} + +void SocksClient::processOutgoing(const QByteArray &block) +{ +#ifdef PROX_DEBUG + // show hex + fprintf(stderr, "SocksClient: client recv { "); + for(int n = 0; n < (int)block.size(); ++n) + fprintf(stderr, "%02X ", (unsigned char)block[n]); + fprintf(stderr, " } \n"); +#endif + ByteStream::appendArray(&d->recvBuf, block); + + if(d->step == StepVersion) { + SPSS_VERSION s; + int r = sps_get_version(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + if(s.version != 0x05 || s.method == 0xff) { +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Method selection failed\n"); +#endif + reset(true); + error(ErrProxyNeg); + return; + } + + QString str; + if(s.method == 0x00) { + str = "None"; + d->authMethod = AuthNone; + } + else if(s.method == 0x02) { + str = "Username/Password"; + d->authMethod = AuthUsername; + } + else { +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Server wants to use unknown method '%02x'\n", s.method); +#endif + reset(true); + error(ErrProxyNeg); + return; + } + + if(d->authMethod == AuthNone) { + // no auth, go straight to the request + do_request(); + } + else if(d->authMethod == AuthUsername) { + d->step = StepAuth; +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Authenticating [Username] ...\n"); +#endif + writeData(spc_set_authUsername(d->user.latin1(), d->pass.latin1())); + } + } + } + if(d->step == StepAuth) { + if(d->authMethod == AuthUsername) { + SPSS_AUTHUSERNAME s; + int r = sps_get_authUsername(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + if(s.version != 0x01) { + reset(true); + error(ErrProxyNeg); + return; + } + if(!s.success) { + reset(true); + error(ErrProxyAuth); + return; + } + + do_request(); + } + } + } + else if(d->step == StepRequest) { + SPS_CONNREQ s; + int r = sp_get_request(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + if(s.cmd != RET_SUCCESS) { +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: client << Error >> [%02x]\n", s.cmd); +#endif + reset(true); + if(s.cmd == RET_UNREACHABLE) + error(ErrHostNotFound); + else if(s.cmd == RET_CONNREFUSED) + error(ErrConnectionRefused); + else + error(ErrProxyNeg); + return; + } + +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: client << Success >>\n"); +#endif + if(d->udp) { + if(s.address_type == 0x03) + d->udpAddr = s.host; + else + d->udpAddr = s.addr.toString(); + d->udpPort = s.port; + } + + d->active = true; + + QPointer self = this; + connected(); + if(!self) + return; + + if(!d->recvBuf.isEmpty()) { + appendRead(d->recvBuf); + d->recvBuf.resize(0); + readyRead(); + } + } + } +} + +void SocksClient::do_request() +{ +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: Requesting ...\n"); +#endif + d->step = StepRequest; + int cmd = d->udp ? REQ_UDPASSOCIATE : REQ_CONNECT; + QByteArray buf; + if(!d->real_host.isEmpty()) + buf = sp_set_request(d->real_host, d->real_port, cmd); + else + buf = sp_set_request(QHostAddress(), 0, cmd); + writeData(buf); +} + +void SocksClient::sock_bytesWritten(int x) +{ + int bytes = x; + if(d->pending >= bytes) { + d->pending -= bytes; + bytes = 0; + } + else { + bytes -= d->pending; + d->pending = 0; + } + if(bytes > 0) + bytesWritten(bytes); +} + +void SocksClient::sock_error(int x) +{ + if(d->active) { + reset(); + error(ErrRead); + } + else { + reset(true); + if(x == BSocket::ErrHostNotFound) + error(ErrProxyConnect); + else if(x == BSocket::ErrConnectionRefused) + error(ErrProxyConnect); + else if(x == BSocket::ErrRead) + error(ErrProxyNeg); + } +} + +void SocksClient::serve() +{ + d->waiting = false; + d->step = StepVersion; + continueIncoming(); +} + +void SocksClient::processIncoming(const QByteArray &block) +{ +#ifdef PROX_DEBUG + // show hex + fprintf(stderr, "SocksClient: server recv { "); + for(int n = 0; n < (int)block.size(); ++n) + fprintf(stderr, "%02X ", (unsigned char)block[n]); + fprintf(stderr, " } \n"); +#endif + ByteStream::appendArray(&d->recvBuf, block); + + if(!d->waiting) + continueIncoming(); +} + +void SocksClient::continueIncoming() +{ + if(d->recvBuf.isEmpty()) + return; + + if(d->step == StepVersion) { + SPCS_VERSION s; + int r = spc_get_version(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + if(s.version != 0x05) { + reset(true); + error(ErrProxyNeg); + return; + } + + int methods = 0; + for(int n = 0; n < (int)s.methodList.size(); ++n) { + unsigned char c = s.methodList[n]; + if(c == 0x00) + methods |= AuthNone; + else if(c == 0x02) + methods |= AuthUsername; + } + d->waiting = true; + incomingMethods(methods); + } + } + else if(d->step == StepAuth) { + SPCS_AUTHUSERNAME s; + int r = spc_get_authUsername(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + d->waiting = true; + incomingAuth(s.user, s.pass); + } + } + else if(d->step == StepRequest) { + SPS_CONNREQ s; + int r = sp_get_request(&d->recvBuf, &s); + if(r == -1) { + reset(true); + error(ErrProxyNeg); + return; + } + else if(r == 1) { + d->waiting = true; + if(s.cmd == REQ_CONNECT) { + if(!s.host.isEmpty()) + d->rhost = s.host; + else + d->rhost = s.addr.toString(); + d->rport = s.port; + incomingConnectRequest(d->rhost, d->rport); + } + else if(s.cmd == REQ_UDPASSOCIATE) { + incomingUDPAssociateRequest(); + } + else { + requestDeny(); + return; + } + } + } +} + +void SocksClient::chooseMethod(int method) +{ + if(d->step != StepVersion || !d->waiting) + return; + + unsigned char c; + if(method == AuthNone) { + d->step = StepRequest; + c = 0x00; + } + else { + d->step = StepAuth; + c = 0x02; + } + + // version response + d->waiting = false; + writeData(sps_set_version(c)); + continueIncoming(); +} + +void SocksClient::authGrant(bool b) +{ + if(d->step != StepAuth || !d->waiting) + return; + + if(b) + d->step = StepRequest; + + // auth response + d->waiting = false; + writeData(sps_set_authUsername(b)); + if(!b) { + reset(true); + return; + } + continueIncoming(); +} + +void SocksClient::requestDeny() +{ + if(d->step != StepRequest || !d->waiting) + return; + + // response + d->waiting = false; + writeData(sp_set_request(d->rhost, d->rport, RET_UNREACHABLE)); + reset(true); +} + +void SocksClient::grantConnect() +{ + if(d->step != StepRequest || !d->waiting) + return; + + // response + d->waiting = false; + writeData(sp_set_request(d->rhost, d->rport, RET_SUCCESS)); + d->active = true; +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: server << Success >>\n"); +#endif + + if(!d->recvBuf.isEmpty()) { + appendRead(d->recvBuf); + d->recvBuf.resize(0); + readyRead(); + } +} + +void SocksClient::grantUDPAssociate(const QString &relayHost, int relayPort) +{ + if(d->step != StepRequest || !d->waiting) + return; + + // response + d->waiting = false; + writeData(sp_set_request(relayHost, relayPort, RET_SUCCESS)); + d->udp = true; + d->active = true; +#ifdef PROX_DEBUG + fprintf(stderr, "SocksClient: server << Success >>\n"); +#endif + + if(!d->recvBuf.isEmpty()) + d->recvBuf.resize(0); +} + +QHostAddress SocksClient::peerAddress() const +{ + return d->sock.peerAddress(); +} + +Q_UINT16 SocksClient::peerPort() const +{ + return d->sock.peerPort(); +} + +QString SocksClient::udpAddress() const +{ + return d->udpAddr; +} + +Q_UINT16 SocksClient::udpPort() const +{ + return d->udpPort; +} + +SocksUDP *SocksClient::createUDP(const QString &host, int port, const QHostAddress &routeAddr, int routePort) +{ + return new SocksUDP(this, host, port, routeAddr, routePort); +} + +//---------------------------------------------------------------------------- +// SocksServer +//---------------------------------------------------------------------------- +class SocksServer::Private +{ +public: + Private() {} + + ServSock serv; + Q3PtrList incomingConns; + Q3SocketDevice *sd; + QSocketNotifier *sn; +}; + +SocksServer::SocksServer(QObject *parent) +:QObject(parent) +{ + d = new Private; + d->sd = 0; + d->sn = 0; + connect(&d->serv, SIGNAL(connectionReady(int)), SLOT(connectionReady(int))); +} + +SocksServer::~SocksServer() +{ + stop(); + d->incomingConns.setAutoDelete(true); + d->incomingConns.clear(); + delete d; +} + +bool SocksServer::isActive() const +{ + return d->serv.isActive(); +} + +bool SocksServer::listen(Q_UINT16 port, bool udp) +{ + stop(); + if(!d->serv.listen(port)) + return false; + if(udp) { + d->sd = new Q3SocketDevice(Q3SocketDevice::Datagram); +#ifdef Q_OS_UNIX + ::fcntl(d->sd->socket(), F_SETFD, FD_CLOEXEC); +#endif + d->sd->setBlocking(false); + if(!d->sd->bind(QHostAddress(), port)) { + delete d->sd; + d->sd = 0; + d->serv.stop(); + return false; + } + d->sn = new QSocketNotifier(d->sd->socket(), QSocketNotifier::Read); + connect(d->sn, SIGNAL(activated(int)), SLOT(sn_activated(int))); + } + return true; +} + +void SocksServer::stop() +{ + delete d->sn; + d->sn = 0; + delete d->sd; + d->sd = 0; + d->serv.stop(); +} + +int SocksServer::port() const +{ + return d->serv.port(); +} + +QHostAddress SocksServer::address() const +{ + return d->serv.address(); +} + +SocksClient *SocksServer::takeIncoming() +{ + if(d->incomingConns.isEmpty()) + return 0; + + SocksClient *c = d->incomingConns.getFirst(); + d->incomingConns.removeRef(c); + + // we don't care about errors anymore + disconnect(c, SIGNAL(error(int)), this, SLOT(connectionError())); + + // don't serve the connection until the event loop, to give the caller a chance to map signals + QTimer::singleShot(0, c, SLOT(serve())); + + return c; +} + +void SocksServer::writeUDP(const QHostAddress &addr, int port, const QByteArray &data) +{ + if(d->sd) { + d->sd->setBlocking(true); + d->sd->writeBlock(data.data(), data.size(), addr, port); + d->sd->setBlocking(false); + } +} + +void SocksServer::connectionReady(int s) +{ + SocksClient *c = new SocksClient(s, this); + connect(c, SIGNAL(error(int)), this, SLOT(connectionError())); + d->incomingConns.append(c); + incomingReady(); +} + +void SocksServer::connectionError() +{ + SocksClient *c = (SocksClient *)sender(); + d->incomingConns.removeRef(c); + c->deleteLater(); +} + +void SocksServer::sn_activated(int) +{ + QByteArray buf(8192); + int actual = d->sd->readBlock(buf.data(), buf.size()); + buf.resize(actual); + QHostAddress pa = d->sd->peerAddress(); + int pp = d->sd->peerPort(); + SPS_UDP s; + int r = sp_read_udp(&buf, &s); + if(r != 1) + return; + incomingUDP(s.host, s.port, pa, pp, s.data); +} + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/network/socks.h b/iris-legacy/cutestuff/network/socks.h new file mode 100644 index 0000000..0721ee7 --- /dev/null +++ b/iris-legacy/cutestuff/network/socks.h @@ -0,0 +1,160 @@ +/* + * socks.h - SOCKS5 TCP proxy client/server + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_SOCKS_H +#define CS_SOCKS_H + +#include "bytestream.h" + +// CS_NAMESPACE_BEGIN + +class QHostAddress; +class SocksClient; +class SocksServer; + +class SocksUDP : public QObject +{ + Q_OBJECT +public: + ~SocksUDP(); + + void change(const QString &host, int port); + void write(const QByteArray &data); + +signals: + void packetReady(const QByteArray &data); + +private slots: + void sn_activated(int); + +private: + class Private; + Private *d; + + friend class SocksClient; + SocksUDP(SocksClient *sc, const QString &host, int port, const QHostAddress &routeAddr, int routePort); +}; + +class SocksClient : public ByteStream +{ + Q_OBJECT +public: + enum Error { ErrConnectionRefused = ErrCustom, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth }; + enum Method { AuthNone=0x0001, AuthUsername=0x0002 }; + enum Request { ReqConnect, ReqUDPAssociate }; + SocksClient(QObject *parent=0); + SocksClient(int, QObject *parent=0); + ~SocksClient(); + + bool isIncoming() const; + + // outgoing + void setAuth(const QString &user, const QString &pass=""); + void connectToHost(const QString &proxyHost, int proxyPort, const QString &host, int port, bool udpMode=false); + + // incoming + void chooseMethod(int); + void authGrant(bool); + void requestDeny(); + void grantConnect(); + void grantUDPAssociate(const QString &relayHost, int relayPort); + + // from ByteStream + bool isOpen() const; + void close(); + void write(const QByteArray &); + QByteArray read(int bytes=0); + int bytesAvailable() const; + int bytesToWrite() const; + + // remote address + QHostAddress peerAddress() const; + Q_UINT16 peerPort() const; + + // udp + QString udpAddress() const; + Q_UINT16 udpPort() const; + SocksUDP *createUDP(const QString &host, int port, const QHostAddress &routeAddr, int routePort); + +signals: + // outgoing + void connected(); + + // incoming + void incomingMethods(int); + void incomingAuth(const QString &user, const QString &pass); + void incomingConnectRequest(const QString &host, int port); + void incomingUDPAssociateRequest(); + +private slots: + void sock_connected(); + void sock_connectionClosed(); + void sock_delayedCloseFinished(); + void sock_readyRead(); + void sock_bytesWritten(int); + void sock_error(int); + void serve(); + +private: + class Private; + Private *d; + + void init(); + void reset(bool clear=false); + void do_request(); + void processOutgoing(const QByteArray &); + void processIncoming(const QByteArray &); + void continueIncoming(); + void writeData(const QByteArray &a); +}; + +class SocksServer : public QObject +{ + Q_OBJECT +public: + SocksServer(QObject *parent=0); + ~SocksServer(); + + bool isActive() const; + bool listen(Q_UINT16 port, bool udp=false); + void stop(); + int port() const; + QHostAddress address() const; + SocksClient *takeIncoming(); + + void writeUDP(const QHostAddress &addr, int port, const QByteArray &data); + +signals: + void incomingReady(); + void incomingUDP(const QString &host, int port, const QHostAddress &addr, int sourcePort, const QByteArray &data); + +private slots: + void connectionReady(int); + void connectionError(); + void sn_activated(int); + +private: + class Private; + Private *d; +}; + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/cutestuff/util/bytestream.cpp b/iris-legacy/cutestuff/util/bytestream.cpp new file mode 100644 index 0000000..e85defe --- /dev/null +++ b/iris-legacy/cutestuff/util/bytestream.cpp @@ -0,0 +1,269 @@ +/* + * bytestream.cpp - base class for bytestreams + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bytestream.h" +//Added by qt3to4: +#include + +// CS_NAMESPACE_BEGIN + +//! \class ByteStream bytestream.h +//! \brief Base class for "bytestreams" +//! +//! This class provides a basic framework for a "bytestream", here defined +//! as a bi-directional, asynchronous pipe of data. It can be used to create +//! several different kinds of bytestream-applications, such as a console or +//! TCP connection, or something more abstract like a security layer or tunnel, +//! all with the same interface. The provided functions make creating such +//! classes simpler. ByteStream is a pure-virtual class, so you do not use it +//! on its own, but instead through a subclass such as \a BSocket. +//! +//! The signals connectionClosed(), delayedCloseFinished(), readyRead(), +//! bytesWritten(), and error() serve the exact same function as those from +//! QSocket. +//! +//! The simplest way to create a ByteStream is to reimplement isOpen(), close(), +//! and tryWrite(). Call appendRead() whenever you want to make data available for +//! reading. ByteStream will take care of the buffers with regards to the caller, +//! and will call tryWrite() when the write buffer gains data. It will be your +//! job to call tryWrite() whenever it is acceptable to write more data to +//! the underlying system. +//! +//! If you need more advanced control, reimplement read(), write(), bytesAvailable(), +//! and/or bytesToWrite() as necessary. +//! +//! Use appendRead(), appendWrite(), takeRead(), and takeWrite() to modify the +//! buffers. If you have more advanced requirements, the buffers can be accessed +//! directly with readBuf() and writeBuf(). +//! +//! Also available are the static convenience functions ByteStream::appendArray() +//! and ByteStream::takeArray(), which make dealing with byte queues very easy. + +class ByteStream::Private +{ +public: + Private() {} + + QByteArray readBuf, writeBuf; +}; + +//! +//! Constructs a ByteStream object with parent \a parent. +ByteStream::ByteStream(QObject *parent) +:QObject(parent) +{ + d = new Private; +} + +//! +//! Destroys the object and frees allocated resources. +ByteStream::~ByteStream() +{ + delete d; +} + +//! +//! Returns TRUE if the stream is open, meaning that you can write to it. +bool ByteStream::isOpen() const +{ + return false; +} + +//! +//! Closes the stream. If there is data in the write buffer then it will be +//! written before actually closing the stream. Once all data has been written, +//! the delayedCloseFinished() signal will be emitted. +//! \sa delayedCloseFinished() +void ByteStream::close() +{ +} + +//! +//! Writes array \a a to the stream. +void ByteStream::write(const QByteArray &a) +{ + if(!isOpen()) + return; + + bool doWrite = bytesToWrite() == 0 ? true: false; + appendWrite(a); + if(doWrite) + tryWrite(); +} + +//! +//! Reads bytes \a bytes of data from the stream and returns them as an array. If \a bytes is 0, then +//! \a read will return all available data. +QByteArray ByteStream::read(int bytes) +{ + return takeRead(bytes); +} + +//! +//! Returns the number of bytes available for reading. +int ByteStream::bytesAvailable() const +{ + return d->readBuf.size(); +} + +//! +//! Returns the number of bytes that are waiting to be written. +int ByteStream::bytesToWrite() const +{ + return d->writeBuf.size(); +} + +//! +//! Writes string \a cs to the stream. +void ByteStream::write(const Q3CString &cs) +{ + QByteArray block(cs.length()); + memcpy(block.data(), cs.data(), block.size()); + write(block); +} + +//! +//! Clears the read buffer. +void ByteStream::clearReadBuffer() +{ + d->readBuf.resize(0); +} + +//! +//! Clears the write buffer. +void ByteStream::clearWriteBuffer() +{ + d->writeBuf.resize(0); +} + +//! +//! Appends \a block to the end of the read buffer. +void ByteStream::appendRead(const QByteArray &block) +{ + appendArray(&d->readBuf, block); +} + +//! +//! Appends \a block to the end of the write buffer. +void ByteStream::appendWrite(const QByteArray &block) +{ + appendArray(&d->writeBuf, block); +} + +//! +//! Returns \a size bytes from the start of the read buffer. +//! If \a size is 0, then all available data will be returned. +//! If \a del is TRUE, then the bytes are also removed. +QByteArray ByteStream::takeRead(int size, bool del) +{ + return takeArray(&d->readBuf, size, del); +} + +//! +//! Returns \a size bytes from the start of the write buffer. +//! If \a size is 0, then all available data will be returned. +//! If \a del is TRUE, then the bytes are also removed. +QByteArray ByteStream::takeWrite(int size, bool del) +{ + return takeArray(&d->writeBuf, size, del); +} + +//! +//! Returns a reference to the read buffer. +QByteArray & ByteStream::readBuf() +{ + return d->readBuf; +} + +//! +//! Returns a reference to the write buffer. +QByteArray & ByteStream::writeBuf() +{ + return d->writeBuf; +} + +//! +//! Attempts to try and write some bytes from the write buffer, and returns the number +//! successfully written or -1 on error. The default implementation returns -1. +int ByteStream::tryWrite() +{ + return -1; +} + +//! +//! Append array \a b to the end of the array pointed to by \a a. +void ByteStream::appendArray(QByteArray *a, const QByteArray &b) +{ + int oldsize = a->size(); + a->resize(oldsize + b.size()); + memcpy(a->data() + oldsize, b.data(), b.size()); +} + +//! +//! Returns \a size bytes from the start of the array pointed to by \a from. +//! If \a size is 0, then all available data will be returned. +//! If \a del is TRUE, then the bytes are also removed. +QByteArray ByteStream::takeArray(QByteArray *from, int size, bool del) +{ + QByteArray a; + if(size == 0) { + a = *from; + if(del) + from->resize(0); + } + else { + if(size > (int)from->size()) + size = from->size(); + a.resize(size); + char *r = from->data(); + memcpy(a.data(), r, size); + if(del) { + int newsize = from->size()-size; + memmove(r, r+size, newsize); + from->resize(newsize); + } + } + return a; +} + void connectionClosed(); + void delayedCloseFinished(); + void readyRead(); + void bytesWritten(int); + void error(int); + +//! \fn void ByteStream::connectionClosed() +//! This signal is emitted when the remote end of the stream closes. + +//! \fn void ByteStream::delayedCloseFinished() +//! This signal is emitted when all pending data has been written to the stream +//! after an attempt to close. + +//! \fn void ByteStream::readyRead() +//! This signal is emitted when data is available to be read. + +//! \fn void ByteStream::bytesWritten(int x); +//! This signal is emitted when data has been successfully written to the stream. +//! \a x is the number of bytes written. + +//! \fn void ByteStream::error(int code) +//! This signal is emitted when an error occurs in the stream. The reason for +//! error is indicated by \a code. + +// CS_NAMESPACE_END diff --git a/iris-legacy/cutestuff/util/bytestream.h b/iris-legacy/cutestuff/util/bytestream.h new file mode 100644 index 0000000..85c676f --- /dev/null +++ b/iris-legacy/cutestuff/util/bytestream.h @@ -0,0 +1,78 @@ +/* + * bytestream.h - base class for bytestreams + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef CS_BYTESTREAM_H +#define CS_BYTESTREAM_H + +#include +#include + +// CS_NAMESPACE_BEGIN + +// CS_EXPORT_BEGIN +class ByteStream : public QObject +{ + Q_OBJECT +public: + enum Error { ErrRead, ErrWrite, ErrCustom = 10 }; + ByteStream(QObject *parent=0); + virtual ~ByteStream()=0; + + virtual bool isOpen() const; + virtual void close(); + virtual void write(const QByteArray &); + virtual QByteArray read(int bytes=0); + virtual int bytesAvailable() const; + virtual int bytesToWrite() const; + + void write(const Q3CString &); + + static void appendArray(QByteArray *a, const QByteArray &b); + static QByteArray takeArray(QByteArray *from, int size=0, bool del=true); + +signals: + void connectionClosed(); + void delayedCloseFinished(); + void readyRead(); + void bytesWritten(int); + void error(int); + +protected: + void clearReadBuffer(); + void clearWriteBuffer(); + void appendRead(const QByteArray &); + void appendWrite(const QByteArray &); + QByteArray takeRead(int size=0, bool del=true); + QByteArray takeWrite(int size=0, bool del=true); + QByteArray & readBuf(); + QByteArray & writeBuf(); + virtual int tryWrite(); + +private: +//! \if _hide_doc_ + class Private; + Private *d; +//! \endif +}; +// CS_EXPORT_END + +// CS_NAMESPACE_END + +#endif diff --git a/iris-legacy/iris/COPYING b/iris-legacy/iris/COPYING new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/iris-legacy/iris/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/iris-legacy/iris/TODO b/iris-legacy/iris/TODO new file mode 100644 index 0000000..001df66 --- /dev/null +++ b/iris-legacy/iris/TODO @@ -0,0 +1,18 @@ +- Stream::id(), Stream::lang() +- whitespace pings (but disable when using http poll) +- make stanza error conditions work for both 1.0 and old + +- xmpp-im (messages, roster, subscriptions, presence, privacy) +- document xmpp-core +- provide complete support for xmpp-core. this means all functionality from + the draft, and noting behavior issues (like IQ semantics) in the + library documentation. + +- SASL "EXTERNAL" w/ client certificate +- SASL "ANONYMOUS" ? + +credits: + MD5 algorithm by Peter Deutsch (Aladdin Enterprises) + +- s5b: support multiple streamhosts in proxy reply + diff --git a/iris-legacy/iris/example/conntest/configure b/iris-legacy/iris/example/conntest/configure new file mode 100644 index 0000000..f78cf2e --- /dev/null +++ b/iris-legacy/iris/example/conntest/configure @@ -0,0 +1,609 @@ +#!/bin/sh + +show_usage() { +cat </dev/null` + if [ ! -x "$m" ]; then + echo fail + echo + echo "We found Qt in $QTDIR, but we were unable to locate" + echo "the moc utility. It was not found in $QTDIR/bin" + echo "nor in PATH. This seems to be a very unusual setup." + echo "You might try using the --qtdir option." + echo + exit 1; + fi + qtpre=`echo $m | awk '{ n = index($0, "/bin/moc"); if (!n) { exit 1; } print substr($0, 0, n-1); exit 0; }' 2>/dev/null` + ret="$?" + if [ "$ret" != "0" ]; then + echo fail + echo + echo "We found Qt in $QTDIR, but the location of moc" + echo "($m) is not suitable for use with this build system." + echo "This is a VERY unusual and likely-broken setup. You" + echo "should contact the maintainer of your Qt package." + echo + exit 1; + fi + QTDIR=$qtpre + fi +fi + +if [ ! -x "$QTDIR/bin/qmake" ]; then + if [ "$QC_DEBUG" = "Y" ]; then + echo Warning: qmake not in \$QTDIR/bin/qmake + echo trying to find it in \$PATH + fi + qm=`which qmake 2>/dev/null` + if [ -x "$qm" ]; then + if [ "$QC_DEBUG" = "Y" ]; then + echo qmake found in $qm + fi + else + echo fail + echo + echo Sorry, you seem to have a very unusual setup, + echo or I missdetected \$QTDIR=$QTDIR + echo + echo Please set \$QTDIR manually and make sure that + echo \$QTDIR/bin/qmake exists. + echo + exit 1; + fi +else + qm=$QTDIR/bin/qmake +fi + +gen_files() { +cat >$1/modules.cpp <$1/modules_new.cpp <$1/conf.cpp < +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class MocTestObject : public QObject +{ + Q_OBJECT +public: + MocTestObject() {} +}; + +class Conf; + +class ConfObj +{ +public: + ConfObj(Conf *c); + virtual ~ConfObj(); + + virtual QString name() const=0; + virtual QString shortname() const=0; + virtual QString checkString() const; + virtual QString resultString() const; + virtual bool exec()=0; + + Conf *conf; + bool required; + bool disabled; +}; + +typedef QPtrList ConfObjList; +typedef QPtrListIterator ConfObjListIt; + +class Conf +{ +public: + Conf() : vars(17) + { + list.setAutoDelete(true); + vars.setAutoDelete(true); + + vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC)); + vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR)); + vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB)); + vars.insert("QMAKE_CC", new QString(CC)); + + do_debug = false; + done_debug = false; + } + + ~Conf() + { + } + + void added(ConfObj *o) + { + list.append(o); + } + + QString getenv(const QString &var) + { + char *p = ::getenv(var.latin1()); + if(!p) + return QString::null; + return QString(p); + } + + void debug(const QString &s) + { + if(do_debug) { + if(!done_debug) + printf("\n"); + done_debug = true; + printf(" * %s\n", s.latin1()); + } + } + + bool exec() + { + if(getenv("QC_DEBUG") == "Y") + do_debug = true; + + ConfObjListIt it(list); + for(ConfObj *o; (o = it.current()); ++it) { + // if this was a disabled-by-default option, check if it was enabled + if(o->disabled) { + QString v = QString("QC_ENABLE_") + o->shortname(); + if(getenv(v) != "Y") + continue; + } + // and the opposite? + else { + QString v = QString("QC_DISABLE_") + o->shortname(); + if(getenv(v) == "Y") + continue; + } + + QString check = o->checkString(); + if(check.isEmpty()) + check = QString("Checking for %1 ...").arg(o->name()); + printf("%s", check.latin1()); + fflush(stdout); + + done_debug = false; + bool ok = o->exec(); + + QString result = o->resultString(); + if(result.isEmpty()) { + if(ok) + result = "yes"; + else + result = "no"; + } + if(done_debug) + printf(" -> %s\n", result.latin1()); + else + printf(" %s\n", result.latin1()); + + if(!ok && o->required) { + printf("\nError: need %s!\n", o->name().latin1()); + return false; + } + } + return true; + } + + const QString & qvar(const QString &s) + { + QString *p = vars.find(s); + if(p) + return *p; + else + return blank; + } + + QString expandIncludes(const QString &inc) + { + return QString("-I") + inc; + } + + QString expandLibs(const QString &lib) + { + return QString("-L") + lib; + } + + int doCommand(const QString &s) + { + debug(QString("[%1]").arg(s)); + QString fullcmd; + if(do_debug) + fullcmd = s; + else + fullcmd = s + " 1>/dev/null 2>/dev/null"; + int r = system(fullcmd.latin1()); + debug(QString("returned: %1").arg(r)); + return r; + } + + bool doCompileAndLink(const QString &filedata, const QString &flags, int *retcode=0) + { + QDir dir("."); + QString fname = "atest.c"; + QString out = "atest"; + QFile f(fname); + QCString cs = filedata.latin1(); + if(!f.open(IO_WriteOnly | IO_Truncate)) { + debug("unable to open atest.c for writing"); + return false; + } + if(f.writeBlock(cs.data(), cs.length()) == -1) { + debug("error writing to atest.c"); + return false; + } + f.close(); + + debug(QString("Wrote atest.c:\n%1").arg(filedata)); + + QString str = qvar("QMAKE_CC") + ' ' + fname + " -o " + out; + if(!flags.isEmpty()) { + str += ' '; + str += flags; + } + + int r = doCommand(str); + if(r == 0 && retcode) + *retcode = doCommand(QString("./") + out); + dir.remove(fname); + dir.remove(out); + if(r != 0) + return false; + return true; + } + + bool checkHeader(const QString &path, const QString &h) + { + QFileInfo fi(path + '/' + h); + if(fi.exists()) + return true; + return false; + } + + bool findHeader(const QString &h, const QStringList &ext, QString *inc) + { + if(checkHeader("/usr/include", h)) { + *inc = ""; + return true; + } + QStringList dirs; + dirs += "/usr/local/include"; + dirs += ext; + for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it) { + if(checkHeader(*it, h)) { + *inc = *it; + return true; + } + } + return false; + } + + bool checkLibrary(const QString &path, const QString &name) + { + QString str = + "int main()\n" + "{\n" + " return 0;\n" + "}\n"; + + QString extra; + if(!path.isEmpty()) + extra += QString("-L") + path + ' '; + extra += QString("-l") + name; + if(!doCompileAndLink(str, extra)) + return false; + return true; + } + + bool findLibrary(const QString &name, QString *lib) + { + if(checkLibrary("", name)) { + *lib = ""; + return true; + } + if(checkLibrary("/usr/local/lib", name)) { + *lib = "/usr/local/lib"; + return true; + } + return false; + } + + void addDefine(const QString &str) + { + if(DEFINES.isEmpty()) + DEFINES = str; + else + DEFINES += QString(" ") + str; + debug(QString("DEFINES += %1").arg(str)); + } + + void addLib(const QString &str) + { + if(LIBS.isEmpty()) + LIBS = str; + else + LIBS += QString(" ") + str; + debug(QString("LIBS += %1").arg(str)); + } + + void addIncludePath(const QString &str) + { + if(INCLUDEPATH.isEmpty()) + INCLUDEPATH = str; + else + INCLUDEPATH += QString(" ") + str; + debug(QString("INCLUDEPATH += %1").arg(str)); + } + + void addExtra(const QString &str) + { + extra += str + '\n'; + debug(QString("extra += %1").arg(str)); + } + + QString DEFINES; + QString INCLUDEPATH; + QString LIBS; + QString extra; + +private: + ConfObjList list; + QDict vars; + QString blank; + bool do_debug, done_debug; +}; + +ConfObj::ConfObj(Conf *c) +{ + conf = c; + conf->added(this); + required = false; + disabled = false; +} + +ConfObj::~ConfObj() +{ +} + +QString ConfObj::checkString() const +{ + return QString(); +} + +QString ConfObj::resultString() const +{ + return QString(); +} + +#include"modules.cpp" + +//---------------------------------------------------------------------------- +// main +//---------------------------------------------------------------------------- +int main() +{ + Conf *conf = new Conf; + ConfObj *o; + o = 0; +#include"modules_new.cpp" + + printf("ok\n"); + bool success = false; + if(conf->exec()) { + QFile f("conf.pri"); + if(!f.open(IO_WriteOnly | IO_Truncate)) { + printf("Error writing %s\n", f.name().latin1()); + return 1; + } + + QString str; + str += "# qconf\n"; + str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\n'; + if(!conf->DEFINES.isEmpty()) + str += "DEFINES += " + conf->DEFINES + '\n'; + if(!conf->INCLUDEPATH.isEmpty()) + str += "INCLUDEPATH += " + conf->INCLUDEPATH + '\n'; + if(!conf->LIBS.isEmpty()) + str += "LIBS += " + conf->LIBS + '\n'; + if(!conf->extra.isEmpty()) + str += conf->extra; + str += '\n'; + + char *p = getenv("BINDIR"); + if(p) { + str += QString("target.path = ") + p + '\n'; + str += "INSTALLS += target\n"; + } + + QCString cs = str.latin1(); + f.writeBlock(cs.data(), cs.length()); + f.close(); + success = true; + } + delete conf; + + if(success) + return 0; + else + return 1; +} + +#include"conf.moc" + + +EOT +cat >$1/conf.pro </dev/null + QTDIR=$QTDIR make clean >/dev/null 2>&1 + QTDIR=$QTDIR make >../conf.log 2>&1 +) + +if [ "$?" != "0" ]; then + rm -rf .qconftemp + echo fail + echo + echo "There was an error compiling 'conf'. Be sure you have a proper" + echo "Qt 3.x Multithreaded (MT) build environment set up. This" + echo "means not just Qt, but also a C++ compiler, the 'make' command," + echo "and any other packages necessary to compile C++ programs." + echo "See conf.log for details." + if [ ! -f "$QTDIR/lib/libqt-mt.so.3" ]; then + echo + echo "One possible reason is that you don't have" + echo "libqt-mt.so.3 installed in $QTDIR/lib/." + fi + echo + exit 1; +fi + +.qconftemp/conf +ret="$?" +if [ "$ret" = "1" ]; then + rm -rf .qconftemp + echo + exit 1; +else + if [ "$ret" != "0" ]; then + rm -rf .qconftemp + echo fail + echo + echo Unexpected error launching 'conf' + echo + exit 1; + fi +fi +rm -rf .qconftemp + +if [ -x "./qcextra" ]; then + ./qcextra +fi +# run qmake +$qm conntest.pro +if [ "$?" != "0" ]; then + echo + exit 1; +fi +cat >Makefile.tmp <> Makefile.tmp +rm -f Makefile +cp -f Makefile.tmp Makefile +rm -f Makefile.tmp + +echo +echo Good, your configure finished. Now run \'make\'. +echo diff --git a/iris-legacy/iris/example/conntest/conntest.cpp b/iris-legacy/iris/example/conntest/conntest.cpp new file mode 100644 index 0000000..6e6f1d9 --- /dev/null +++ b/iris-legacy/iris/example/conntest/conntest.cpp @@ -0,0 +1,578 @@ +#include +#include "bconsole.h" +#include +#include "xmpp.h" + +#include + +#define ROOTCERT_PATH "/usr/local/share/psi/certs/rootcert.xml" + +QCA::Cert readCertXml(const QDomElement &e) +{ + QCA::Cert cert; + // there should be one child data tag + QDomElement data = e.elementsByTagName("data").item(0).toElement(); + if(!data.isNull()) + cert.fromDER(Base64::stringToArray(data.text())); + return cert; +} + +QPtrList getRootCerts(const QString &store) +{ + QPtrList list; + + // open the Psi rootcerts file + QFile f(store); + if(!f.open(IO_ReadOnly)) { + printf("unable to open %s\n", f.name().latin1()); + return list; + } + QDomDocument doc; + doc.setContent(&f); + f.close(); + + QDomElement base = doc.documentElement(); + if(base.tagName() != "store") { + printf("wrong format of %s\n", f.name().latin1()); + return list; + } + QDomNodeList cl = base.elementsByTagName("certificate"); + if(cl.count() == 0) { + printf("no certs found in %s\n", f.name().latin1()); + return list; + } + + int num = 0; + for(int n = 0; n < (int)cl.count(); ++n) { + QCA::Cert *cert = new QCA::Cert(readCertXml(cl.item(n).toElement())); + if(cert->isNull()) { + printf("error reading cert\n"); + delete cert; + continue; + } + + ++num; + list.append(cert); + } + printf("imported %d root certs\n", num); + + return list; +} + +static QString prompt(const QString &s) +{ + printf("* %s ", s.latin1()); + fflush(stdout); + char line[256]; + fgets(line, 255, stdin); + QString result = line; + if(result[result.length()-1] == '\n') + result.truncate(result.length()-1); + return result; +} + +static void showCertInfo(const QCA::Cert &cert) +{ + fprintf(stderr, "-- Cert --\n"); + fprintf(stderr, " CN: %s\n", cert.subject()["CN"].latin1()); + fprintf(stderr, " Valid from: %s, until %s\n", + cert.notBefore().toString().latin1(), + cert.notAfter().toString().latin1()); + fprintf(stderr, " PEM:\n%s\n", cert.toPEM().latin1()); +} + +static QString resultToString(int result) +{ + QString s; + switch(result) { + case QCA::TLS::NoCert: + s = QObject::tr("No certificate presented."); + break; + case QCA::TLS::Valid: + break; + case QCA::TLS::HostMismatch: + s = QObject::tr("Hostname mismatch."); + break; + case QCA::TLS::Rejected: + s = QObject::tr("Root CA rejects the specified purpose."); + break; + case QCA::TLS::Untrusted: + s = QObject::tr("Not trusted for the specified purpose."); + break; + case QCA::TLS::SignatureFailed: + s = QObject::tr("Invalid signature."); + break; + case QCA::TLS::InvalidCA: + s = QObject::tr("Invalid CA certificate."); + break; + case QCA::TLS::InvalidPurpose: + s = QObject::tr("Invalid certificate purpose."); + break; + case QCA::TLS::SelfSigned: + s = QObject::tr("Certificate is self-signed."); + break; + case QCA::TLS::Revoked: + s = QObject::tr("Certificate has been revoked."); + break; + case QCA::TLS::PathLengthExceeded: + s = QObject::tr("Maximum cert chain length exceeded."); + break; + case QCA::TLS::Expired: + s = QObject::tr("Certificate has expired."); + break; + case QCA::TLS::Unknown: + default: + s = QObject::tr("General validation error."); + break; + } + return s; +} + +class App : public QObject +{ + Q_OBJECT +public: + XMPP::AdvancedConnector *conn; + QCA::TLS *tls; + XMPP::QCATLSHandler *tlsHandler; + XMPP::ClientStream *stream; + BConsole *c; + XMPP::Jid jid; + QPtrList rootCerts; + + App(const XMPP::Jid &_jid, const XMPP::AdvancedConnector::Proxy &proxy, const QString &host, int port, bool opt_ssl, bool opt_probe) + :QObject(0) + { + c = 0; + jid = _jid; + + // Connector + conn = new XMPP::AdvancedConnector; + conn->setProxy(proxy); + if(!host.isEmpty()) + conn->setOptHostPort(host, port); + conn->setOptProbe(opt_probe); + conn->setOptSSL(opt_ssl); + + // TLSHandler + tls = 0; + tlsHandler = 0; + rootCerts.setAutoDelete(true); + if(QCA::isSupported(QCA::CAP_TLS)) { + rootCerts = getRootCerts(ROOTCERT_PATH); + tls = new QCA::TLS; + tls->setCertificateStore(rootCerts); + tlsHandler = new XMPP::QCATLSHandler(tls); + connect(tlsHandler, SIGNAL(tlsHandshaken()), SLOT(tls_handshaken())); + } + + // Stream + stream = new XMPP::ClientStream(conn, tlsHandler); + connect(stream, SIGNAL(connected()), SLOT(cs_connected())); + connect(stream, SIGNAL(securityLayerActivated(int)), SLOT(cs_securityLayerActivated())); + connect(stream, SIGNAL(needAuthParams(bool, bool, bool)), SLOT(cs_needAuthParams(bool, bool, bool))); + connect(stream, SIGNAL(authenticated()), SLOT(cs_authenticated())); + connect(stream, SIGNAL(connectionClosed()), SLOT(cs_connectionClosed())); + connect(stream, SIGNAL(readyRead()), SLOT(cs_readyRead())); + connect(stream, SIGNAL(stanzaWritten()), SLOT(cs_stanzaWritten())); + connect(stream, SIGNAL(warning(int)), SLOT(cs_warning(int))); + connect(stream, SIGNAL(error(int)), SLOT(cs_error(int))); + + fprintf(stderr, "conntest: Connecting ...\n"); + stream->setSSFRange(0, 256); + stream->connectToServer(jid); + } + + ~App() + { + delete stream; + delete tls; // this destroys the TLSHandler also + delete conn; + delete c; + } + +signals: + void quit(); + +private slots: + void tls_handshaken() + { + QCA::Cert cert = tls->peerCertificate(); + int vr = tls->certificateValidityResult(); + + fprintf(stderr, "conntest: Successful TLS handshake.\n"); + if(!cert.isNull()) + showCertInfo(cert); + if(vr == QCA::TLS::Valid) + fprintf(stderr, "conntest: Valid certificate.\n"); + else + fprintf(stderr, "conntest: Invalid certificate: %s\n", resultToString(vr).latin1()); + + tlsHandler->continueAfterHandshake(); + } + + void cs_connected() + { + fprintf(stderr, "conntest: Connected\n"); + } + + void cs_securityLayerActivated() + { + fprintf(stderr, "conntest: Security layer activated (%s)\n", tls->isHandshaken() ? "TLS": "SASL"); + } + + void cs_needAuthParams(bool user, bool pass, bool realm) + { + fprintf(stderr, "conntest: need auth params -"); + if(user) + fprintf(stderr, " (user)"); + if(pass) + fprintf(stderr, " (pass)"); + if(realm) + fprintf(stderr, " (realm)"); + fprintf(stderr, "\n"); + + if(user) + stream->setUsername(jid.node()); + if(pass) + stream->setPassword(prompt("Password (not hidden!) :")); + stream->continueAfterParams(); + } + + void cs_authenticated() + { + fprintf(stderr, "conntest: <<< Authenticated >>>\n"); + + // console + c = new BConsole; + connect(c, SIGNAL(connectionClosed()), SLOT(con_connectionClosed())); + connect(c, SIGNAL(readyRead()), SLOT(con_readyRead())); + } + + void cs_connectionClosed() + { + fprintf(stderr, "conntest: Disconnected by peer\n"); + quit(); + } + + void cs_readyRead() + { + for(XMPP::Stanza s; !(s = stream->read()).isNull();) { + QString str = s.toString(); + printf("%s\n", str.local8Bit().data()); + } + } + + void cs_stanzaWritten() + { + fprintf(stderr, "conntest: Stanza written\n"); + } + + void cs_warning(int warn) + { + if(warn == XMPP::ClientStream::WarnOldVersion) { + fprintf(stderr, "conntest: Warning: pre-1.0 protocol server\n"); + } + else if(warn == XMPP::ClientStream::WarnNoTLS) { + fprintf(stderr, "conntest: Warning: TLS not available!\n"); + } + stream->continueAfterWarning(); + } + + void cs_error(int err) + { + if(err == XMPP::ClientStream::ErrParse) { + fprintf(stderr, "conntest: XML parsing error\n"); + } + else if(err == XMPP::ClientStream::ErrProtocol) { + fprintf(stderr, "conntest: XMPP protocol error\n"); + } + else if(err == XMPP::ClientStream::ErrStream) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::Stream::GenericStreamError) + s = "generic stream error"; + else if(x == XMPP::ClientStream::Conflict) + s = "conflict (remote login replacing this one)"; + else if(x == XMPP::ClientStream::ConnectionTimeout) + s = "timed out from inactivity"; + else if(x == XMPP::ClientStream::InternalServerError) + s = "internal server error"; + else if(x == XMPP::ClientStream::InvalidXml) + s = "invalid XML"; + else if(x == XMPP::ClientStream::PolicyViolation) + s = "policy violation. go to jail!"; + else if(x == XMPP::ClientStream::ResourceConstraint) + s = "server out of resources"; + else if(x == XMPP::ClientStream::SystemShutdown) + s = "system is shutting down NOW"; + fprintf(stderr, "conntest: XMPP stream error: %s\n", s.latin1()); + } + else if(err == XMPP::ClientStream::ErrConnection) { + int x = conn->errorCode(); + QString s; + if(x == XMPP::AdvancedConnector::ErrConnectionRefused) + s = "unable to connect to server"; + else if(x == XMPP::AdvancedConnector::ErrHostNotFound) + s = "host not found"; + else if(x == XMPP::AdvancedConnector::ErrProxyConnect) + s = "proxy connect"; + else if(x == XMPP::AdvancedConnector::ErrProxyNeg) + s = "proxy negotiating"; + else if(x == XMPP::AdvancedConnector::ErrProxyAuth) + s = "proxy authorization"; + else if(x == XMPP::AdvancedConnector::ErrStream) + s = "stream error"; + fprintf(stderr, "conntest: connection error: %s\n", s.latin1()); + } + else if(err == XMPP::ClientStream::ErrNeg) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::HostGone) + s = "host no longer hosted"; + else if(x == XMPP::ClientStream::HostUnknown) + s = "host unknown"; + else if(x == XMPP::ClientStream::RemoteConnectionFailed) + s = "a required remote connection failed"; + else if(x == XMPP::ClientStream::SeeOtherHost) + s = QString("see other host: [%1]").arg(stream->errorText()); + else if(x == XMPP::ClientStream::UnsupportedVersion) + s = "server does not support proper xmpp version"; + fprintf(stderr, "conntest: stream negotiation error: %s\n", s.latin1()); + } + else if(err == XMPP::ClientStream::ErrTLS) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::TLSStart) + s = "server rejected STARTTLS"; + else if(x == XMPP::ClientStream::TLSFail) { + int t = tlsHandler->tlsError(); + if(t == QCA::TLS::ErrHandshake) + s = "TLS handshake error"; + else + s = "broken security layer (TLS)"; + } + fprintf(stderr, "conntest: %s\n", s.latin1()); + } + else if(err == XMPP::ClientStream::ErrAuth) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::GenericAuthError) + s = "unable to login"; + else if(x == XMPP::ClientStream::NoMech) + s = "no appropriate auth mechanism available for given security settings"; + else if(x == XMPP::ClientStream::BadProto) + s = "bad server response"; + else if(x == XMPP::ClientStream::BadServ) + s = "server failed mutual authentication"; + else if(x == XMPP::ClientStream::EncryptionRequired) + s = "encryption required for chosen SASL mechanism"; + else if(x == XMPP::ClientStream::InvalidAuthzid) + s = "invalid authzid"; + else if(x == XMPP::ClientStream::InvalidMech) + s = "invalid SASL mechanism"; + else if(x == XMPP::ClientStream::InvalidRealm) + s = "invalid realm"; + else if(x == XMPP::ClientStream::MechTooWeak) + s = "SASL mechanism too weak for authzid"; + else if(x == XMPP::ClientStream::NotAuthorized) + s = "not authorized"; + else if(x == XMPP::ClientStream::TemporaryAuthFailure) + s = "temporary auth failure"; + fprintf(stderr, "conntest: auth error: %s\n", s.latin1()); + } + else if(err == XMPP::ClientStream::ErrSecurityLayer) + fprintf(stderr, "conntest: broken security layer (SASL)\n"); + quit(); + } + + void con_connectionClosed() + { + fprintf(stderr, "conntest: Closing.\n"); + stream->close(); + quit(); + } + + void con_readyRead() + { + QByteArray a = c->read(); + QCString cs; + cs.resize(a.size()+1); + memcpy(cs.data(), a.data(), a.size()); + QString s = QString::fromLocal8Bit(cs); + stream->writeDirect(s); + } +}; + +#include "conntest.moc" + +int main(int argc, char **argv) +{ + QApplication app(argc, argv, false); + + if(argc < 2) { + printf("usage: conntest [options] [jid]\n"); + printf(" Options:\n"); + printf(" --host=host:port\n"); + printf(" --sslhost=host:port\n"); + printf(" --probe\n"); + printf(" --proxy=[https|poll|socks],host:port,url\n"); + printf(" --proxy-auth=user,pass\n"); + printf("\n"); + return 0; + } + + bool have_tls = QCA::isSupported(QCA::CAP_TLS); + + XMPP::Jid jid; + XMPP::AdvancedConnector::Proxy proxy; + QString host; + int port = 0; + bool opt_ssl = false; + bool opt_probe = false; + + for(int at = 1; at < argc; ++at) { + QString s = argv[at]; + + // is it an option? + if(s.left(2) == "--") { + QString name; + QStringList args; + int n = s.find('=', 2); + if(n != -1) { + name = s.mid(2, n-2); + ++n; + args = QStringList::split(',', s.mid(n), true); + } + else { + name = s.mid(2); + args.clear(); + } + + // eat the arg + --argc; + for(int x = at; x < argc; ++x) + argv[x] = argv[x+1]; + --at; // don't advance + + // process option + if(name == "proxy") { + QString proxy_host; + int proxy_port = 0; + QString type = args[0]; + QString s = args[1]; + int n = s.find(':'); + if(n == -1) { + if(type != "poll") { + printf("Invalid host:port for proxy\n"); + return 0; + } + } + else { + proxy_host = s.mid(0, n); + ++n; + proxy_port = s.mid(n).toInt(); + } + + if(type == "https") { + proxy.setHttpConnect(proxy_host, proxy_port); + } + else if(type == "poll") { + if(args.count() < 3) { + printf("poll needs more args\n"); + return 0; + } + QString proxy_url = args[2]; + proxy.setHttpPoll(proxy_host, proxy_port, proxy_url); + } + else if(type == "socks") { + proxy.setSocks(proxy_host, proxy_port); + } + else { + printf("No such proxy type '%s'\n", type.latin1()); + return 0; + } + } + else if(name == "proxy-auth") { + proxy.setUserPass(args[0], args[1]); + } + else if(name == "host") { + QString s = args[0]; + int n = s.find(':'); + if(n == -1) { + printf("Invalid host:port for host\n"); + return 0; + } + host = s.mid(0, n); + ++n; + port = s.mid(n).toInt(); + } + else if(name == "sslhost") { + QString s = args[0]; + int n = s.find(':'); + if(n == -1) { + printf("Invalid host:port for host\n"); + return 0; + } + host = s.mid(0, n); + ++n; + port = s.mid(n).toInt(); + opt_ssl = true; + } + else if(name == "probe") { + opt_probe = true; + } + else { + printf("Unknown option '%s'\n", name.latin1()); + return 0; + } + } + } + + if(argc < 2) { + printf("No host specified!\n"); + return 0; + } + jid = argv[1]; + + if((opt_ssl || opt_probe) && !have_tls) { + printf("TLS not supported, so the sslhost and probe options are not allowed.\n"); + return 0; + } + + printf("JID: %s\n", jid.full().latin1()); + if(proxy.type() != XMPP::AdvancedConnector::Proxy::None) { + printf("Proxy: "); + if(proxy.type() == XMPP::AdvancedConnector::Proxy::HttpConnect) + printf("HttpConnect (%s:%d)", proxy.host().latin1(), proxy.port()); + else if(proxy.type() == XMPP::AdvancedConnector::Proxy::HttpPoll) { + printf("HttpPoll {%s}", proxy.url().latin1()); + if(!proxy.host().isEmpty()) { + printf(" (%s:%d)", proxy.host().latin1(), proxy.port()); + } + } + else if(proxy.type() == XMPP::AdvancedConnector::Proxy::Socks) + printf("Socks (%s:%d)", proxy.host().latin1(), proxy.port()); + printf("\n"); + } + if(proxy.type() != XMPP::AdvancedConnector::Proxy::HttpPoll) { + if(!host.isEmpty()) { + printf("Host: %s:%d", host.latin1(), port); + if(opt_ssl) + printf(" (ssl)"); + printf("\n"); + } + else { + if(opt_probe) + printf("Probe active\n"); + } + } + printf("----------\n"); + + App *a = new App(jid, proxy, host, port, opt_ssl, opt_probe); + QObject::connect(a, SIGNAL(quit()), &app, SLOT(quit())); + app.exec(); + delete a; + + return 0; +} diff --git a/iris-legacy/iris/example/conntest/conntest.pro b/iris-legacy/iris/example/conntest/conntest.pro new file mode 100644 index 0000000..44f4721 --- /dev/null +++ b/iris-legacy/iris/example/conntest/conntest.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +CONFIG += qt thread console +TARGET = conntest +QT += qt3support network xml + +# Dependencies +CONFIG += crypto +include(../../../cutestuff/cutestuff.pri) +include(../../iris.pri) +irisnet { + include(../../irisnet/irisnet.pri) +} + +SOURCES += conntest.cpp + diff --git a/iris-legacy/iris/example/conntest/conntest.qc b/iris-legacy/iris/example/conntest/conntest.qc new file mode 100644 index 0000000..afcdb84 --- /dev/null +++ b/iris-legacy/iris/example/conntest/conntest.qc @@ -0,0 +1,4 @@ + + Iris Conntest + conntest.pro + diff --git a/iris-legacy/iris/example/conntest/prepare b/iris-legacy/iris/example/conntest/prepare new file mode 100644 index 0000000..d3e8d32 --- /dev/null +++ b/iris-legacy/iris/example/conntest/prepare @@ -0,0 +1,30 @@ +#!/bin/sh + +CS_BASE=../../../cutestuff +QCA_BASE=../../../qca +IRIS_BASE=../.. + +# import cutestuff +mkdir cutestuff +cp -a $CS_BASE/util cutestuff +cp -a $CS_BASE/network cutestuff + +# import qca +mkdir qca +cp -a $QCA_BASE/src/* qca + +# import iris +mkdir iris +cp -a $IRIS_BASE/libidn iris +cp -a $IRIS_BASE/libidn.pri iris +cp -a $IRIS_BASE/include iris +cp -a $IRIS_BASE/xmpp-core iris +cp -a $IRIS_BASE/xmpp-im iris +cp -a $IRIS_BASE/jabber iris +cp -a $IRIS_BASE/iris.pri iris + +# other stuff +cp -a $IRIS_BASE/cs.pri . +cp -a $IRIS_BASE/example/example.pri . +cp -a $IRIS_BASE/COPYING . + diff --git a/iris-legacy/iris/example/server/server.cpp b/iris-legacy/iris/example/server/server.cpp new file mode 100644 index 0000000..4f4fdd3 --- /dev/null +++ b/iris-legacy/iris/example/server/server.cpp @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "bsocket.h" +#include "xmpp.h" + +#include + +char pemdata_cert[] = + "-----BEGIN CERTIFICATE-----\n" + "MIIDbjCCAtegAwIBAgIBADANBgkqhkiG9w0BAQQFADCBhzELMAkGA1UEBhMCVVMx\n" + "EzARBgNVBAgTCkNhbGlmb3JuaWExDzANBgNVBAcTBklydmluZTEYMBYGA1UEChMP\n" + "RXhhbXBsZSBDb21wYW55MRQwEgYDVQQDEwtleGFtcGxlLmNvbTEiMCAGCSqGSIb3\n" + "DQEJARYTZXhhbXBsZUBleGFtcGxlLmNvbTAeFw0wMzA3MjQwNzMwMDBaFw0wMzA4\n" + "MjMwNzMwMDBaMIGHMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEP\n" + "MA0GA1UEBxMGSXJ2aW5lMRgwFgYDVQQKEw9FeGFtcGxlIENvbXBhbnkxFDASBgNV\n" + "BAMTC2V4YW1wbGUuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFtcGxlQGV4YW1wbGUu\n" + "Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCobzCF268K2sRp473gvBTT\n" + "4AgSL1kjeF8N57vxS1P8zWrWMXNs4LuH0NRZmKTajeboy0br8xw+smIy3AbaKAwW\n" + "WZToesxebu3m9VeA8dqWyOaUMjoxAcgVYesgVaMpjRe7fcWdJnX1wJoVVPuIcO8m\n" + "a+AAPByfTORbzpSTmXAQAwIDAQABo4HnMIHkMB0GA1UdDgQWBBTvFierzLmmYMq0\n" + "cB/+5rK1bNR56zCBtAYDVR0jBIGsMIGpgBTvFierzLmmYMq0cB/+5rK1bNR566GB\n" + "jaSBijCBhzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDzANBgNV\n" + "BAcTBklydmluZTEYMBYGA1UEChMPRXhhbXBsZSBDb21wYW55MRQwEgYDVQQDEwtl\n" + "eGFtcGxlLmNvbTEiMCAGCSqGSIb3DQEJARYTZXhhbXBsZUBleGFtcGxlLmNvbYIB\n" + "ADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGqGhXf7xNOnYNtFO7gz\n" + "K6RdZGHFI5q1DAEz4hhNBC9uElh32XGX4wN7giz3zLC8v9icL/W4ff/K5NDfv3Gf\n" + "gQe/+Wo9Be3H3ul6uwPPFnx4+PIOF2a5TW99H9smyxWdNjnFtcUte4al3RszcMWG\n" + "x3iqsWosGtj6F+ridmKoqKLu\n" + "-----END CERTIFICATE-----\n"; + +char pemdata_privkey[] = + "-----BEGIN RSA PRIVATE KEY-----\n" + "MIICXAIBAAKBgQCobzCF268K2sRp473gvBTT4AgSL1kjeF8N57vxS1P8zWrWMXNs\n" + "4LuH0NRZmKTajeboy0br8xw+smIy3AbaKAwWWZToesxebu3m9VeA8dqWyOaUMjox\n" + "AcgVYesgVaMpjRe7fcWdJnX1wJoVVPuIcO8ma+AAPByfTORbzpSTmXAQAwIDAQAB\n" + "AoGAP83u+aYghuIcaWhmM03MLf69z/WztKYSi/fu0BcS977w67bL3MC9CVPoPRB/\n" + "0nLSt/jZIuRzHKUCYfXLerSU7v0oXDTy6GPzWMh/oXIrpF0tYNbwWF7LSq2O2gGZ\n" + "XtA9MSmUNNJaKzQQeXjqdVFOY8A0Pho+k2KByBiCi+ChkcECQQDRUuyX0+PKJtA2\n" + "M36BOTFpy61BAv+JRlXUnHuevOfQWl6NR6YGygqCyH1sWtP1sa9S4wWys3DFH+5A\n" + "DkuAqk7zAkEAzf4eUH2hp5CIMsXH+WpIzKj09oY1it2CAKjVq4rUELf8iXvmGoFl\n" + "000spua4MjHNUYm7LR0QaKesKrMyGZUesQJAL8aLdYPJI+SD9Tr/jqLtIkZ4frQe\n" + "eshw4pvsoyheiHF3zyshO791crAr4EVCx3sMlxB1xnmqLXPCPyCEHxO//QJBAIBY\n" + "IYkjDZJ6ofGIe1UyXJNvfdkPu9J+ut4wU5jjEcgs6mK62J6RGuFxhy2iOQfFMdjo\n" + "yL+OCUg7mDCun7uCxrECQAtSvnLOFMjO5qExRjFtwi+b1rcSekd3Osk/izyRFSzg\n" + "Or+AL56/EKfiogNnFipgaXIbb/xj785Cob6v96XoW1I=\n" + "-----END RSA PRIVATE KEY-----\n"; + +QCA::Cert *cert; +QCA::RSAKey *privkey; + +using namespace XMPP; + +int id_num = 0; + +class Session : public QObject +{ + Q_OBJECT +public: + Session(const QString &host, const QString &defRealm, ByteStream *bs) : QObject(0) + { + id = id_num++; + + tls = new QCA::TLS; + tls->setCertificate(*cert, *privkey); + + cs = new ClientStream(host, defRealm, bs, tls); + connect(cs, SIGNAL(connectionClosed()), SLOT(cs_connectionClosed())); + connect(cs, SIGNAL(error(int)), SLOT(cs_error(int))); + } + + ~Session() + { + delete cs; + delete tls; + printf("[%d]: deleted\n", id); + } + + void start() + { + printf("[%d]: New session!\n", id); + cs->accept(); + } + +signals: + void done(); + +private slots: + void cs_connectionClosed() + { + printf("[%d]: Connection closed by peer\n", id); + done(); + } + + void cs_error(int) + { + printf("[%d]: Error\n", id); + done(); + } + +private: + int id; + ClientStream *cs; + QCA::TLS *tls; +}; + +class ServerTest : public QServerSocket +{ + Q_OBJECT +public: + enum { Idle, Handshaking, Active, Closing }; + + ServerTest(const QString &_host, int _port) : QServerSocket(_port), host(_host), port(_port) + { + cert = new QCA::Cert; + privkey = new QCA::RSAKey; + + cert->fromPEM(pemdata_cert); + privkey->fromPEM(pemdata_privkey); + + list.setAutoDelete(true); + } + + ~ServerTest() + { + } + + void start() + { + char buf[256]; + int r = gethostname(buf, sizeof(buf)-1); + if(r == -1) { + printf("Error getting hostname!\n"); + QTimer::singleShot(0, this, SIGNAL(quit())); + return; + } + QString myhostname = buf; + + realm = myhostname; + if(host.isEmpty()) + host = myhostname; + + if(cert->isNull() || privkey->isNull()) { + printf("Error loading cert and/or private key!\n"); + QTimer::singleShot(0, this, SIGNAL(quit())); + return; + } + if(!ok()) { + printf("Error binding to port %d!\n", port); + QTimer::singleShot(0, this, SIGNAL(quit())); + return; + } + printf("Listening on %s:%d ...\n", host.latin1(), port); + } + + void newConnection(int s) + { + BSocket *bs = new BSocket; + bs->setSocket(s); + Session *sess = new Session(host, realm, bs); + list.append(sess); + connect(sess, SIGNAL(done()), SLOT(sess_done())); + sess->start(); + } + +signals: + void quit(); + +private slots: + void sess_done() + { + Session *sess = (Session *)sender(); + list.removeRef(sess); + } + +private: + QString host, realm; + int port; + QPtrList list; +}; + +#include "server.moc" + +int main(int argc, char **argv) +{ + QApplication app(argc, argv, false); + QString host = argc > 1 ? QString(argv[1]) : QString(); + int port = argc > 2 ? QString(argv[2]).toInt() : 5222; + + if(!QCA::isSupported(QCA::CAP_TLS)) { + printf("TLS not supported!\n"); + return 1; + } + + if(!QCA::isSupported(QCA::CAP_SASL)) { + printf("SASL not supported!\n"); + return 1; + } + + srand(time(NULL)); + + ServerTest *s = new ServerTest(host, port); + QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit())); + s->start(); + app.exec(); + delete s; + + // clean up + QCA::unloadAllPlugins(); + + return 0; +} diff --git a/iris-legacy/iris/example/server/server.pro b/iris-legacy/iris/example/server/server.pro new file mode 100644 index 0000000..4f2dc6f --- /dev/null +++ b/iris-legacy/iris/example/server/server.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +CONFIG += qt thread console +TARGET = server + +MOC_DIR = .moc +OBJECTS_DIR = .obj +UI_DIR = .ui + +include(../xmpptest/iris.pri) + +SOURCES += server.cpp + +# gentoo hack? +LIBS += -lcrypto + diff --git a/iris-legacy/iris/example/xmpptest/ui_test.ui b/iris-legacy/iris/example/xmpptest/ui_test.ui new file mode 100644 index 0000000..f199ee1 --- /dev/null +++ b/iris-legacy/iris/example/xmpptest/ui_test.ui @@ -0,0 +1,470 @@ + + + + + TestUI + + + + 0 + 0 + 652 + 591 + + + + Form1 + + + + + + + Core + + + + 0 + + + + + Server + + + + + + 0 + + + + + Full JID: + + + + + + + + + + + + 0 + + + + + User (if needed): + + + + + + + + + + + + + + Pass: + + + + + + + QLineEdit::Password + + + + + + + + + 0 + + + + + SSL + + + + + + + + None + + + + + HTTP(S) + + + + + SOCKS5 + + + + + HTTP Polling + + + + + + + + Host:Port: + + + + + + + Legacy SSL probe + + + + + + + Proxy: + + + + + + + + + + + + Proxy Settings + + + + + + Host:Port: + + + + + + + + + + User/Pass: + + + + + + + + + + / + + + + + + + QLineEdit::Password + + + + + + + Polling URL: + + + + + + + + + + + + + Security Settings + + + + + + Allow plaintext login + + + + + + + Require mutual authentication + + + + + + + 0 + + + + + SASL SSF min/max: + + + + + + + + + + / + + + + + + + + + + + + + + + + + + 0 + + + + + &Connect + + + Alt+C + + + + + + + + 130 + 20 + + + + Expanding + + + Horizontal + + + + + + + &About + + + + + + + + + + 20 + 16 + + + + Expanding + + + Vertical + + + + + + + Quick XML >> + + + + + + 0 + + + + + To: + + + + + + + + + + + + 0 + + + + + &IM Session + + + + + + + &Message + + + + + + + IQ &Version + + + + + + + + + + + + + IM + + + + + + + + 0 + + + + + + 300 + 0 + + + + AtWordOrDocumentBoundary + + + true + + + + + + + + 32767 + 200 + + + + + + + + 0 + + + + + + 40 + 20 + + + + Expanding + + + Horizontal + + + + + + + &Send + + + Alt+S + + + + + + + + + + + qPixmapFromMimeSource + + le_jid + le_user + le_pass + ck_probe + le_host + ck_ssl + cb_proxy + le_proxyhost + le_proxyuser + le_proxypass + le_proxyurl + ck_plain + ck_mutual + sb_ssfmin + sb_ssfmax + pb_go + pb_about + le_to + pb_im + pb_msg + pb_iqv + te_input + pb_send + te_log + + diff --git a/iris-legacy/iris/example/xmpptest/xmpptest.cpp b/iris-legacy/iris/example/xmpptest/xmpptest.cpp new file mode 100644 index 0000000..d3cd22f --- /dev/null +++ b/iris-legacy/iris/example/xmpptest/xmpptest.cpp @@ -0,0 +1,916 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//Added by qt3to4: +#include +#include +//#include +#include "xmpp.h" +#include "im.h" + +#include +#include + +#include "ui_ui_test.h" + +#include + +#define AppName "xmpptest" + +static QString plain2rich(const QString &plain) +{ + QString rich; + int col = 0; + + for(int i = 0; i < (int)plain.length(); ++i) { + if(plain[i] == '\n') { + rich += "
"; + col = 0; + } + else if(plain[i] == '\t') { + rich += QChar::nbsp; + while(col % 4) { + rich += QChar::nbsp; + ++col; + } + } + else if(plain[i].isSpace()) { + if(i > 0 && plain[i-1] == ' ') + rich += QChar::nbsp; + else + rich += ' '; + } + else if(plain[i] == '<') + rich += "<"; + else if(plain[i] == '>') + rich += ">"; + else if(plain[i] == '\"') + rich += """; + else if(plain[i] == '\'') + rich += "'"; + else if(plain[i] == '&') + rich += "&"; + else + rich += plain[i]; + ++col; + } + + return rich; +} + +/*static void showCertInfo(const QCA::Cert &cert) +{ + fprintf(stderr, "-- Cert --\n"); + fprintf(stderr, " CN: %s\n", cert.subject()["CN"].latin1()); + fprintf(stderr, " Valid from: %s, until %s\n", + cert.notBefore().toString().latin1(), + cert.notAfter().toString().latin1()); + fprintf(stderr, " PEM:\n%s\n", cert.toPEM().latin1()); +}*/ + +static QString resultToString(int result) +{ + QString s; + switch(result) { + case QCA::TLS::NoCertificate: + s = QObject::tr("No certificate presented."); + break; + case QCA::TLS::Valid: + break; + case QCA::TLS::HostMismatch: + s = QObject::tr("Hostname mismatch."); + break; + case QCA::TLS::InvalidCertificate: + s = QObject::tr("Invalid Certificate."); + break; + // TODO: Inspect why +// case QCA::TLS::Untrusted: +// s = QObject::tr("Not trusted for the specified purpose."); +// break; +// case QCA::TLS::SignatureFailed: +// s = QObject::tr("Invalid signature."); +// break; +// case QCA::TLS::InvalidCA: +// s = QObject::tr("Invalid CA certificate."); +// break; +// case QCA::TLS::InvalidPurpose: +// s = QObject::tr("Invalid certificate purpose."); +// break; +// case QCA::TLS::SelfSigned: +// s = QObject::tr("Certificate is self-signed."); +// break; +// case QCA::TLS::Revoked: +// s = QObject::tr("Certificate has been revoked."); +// break; +// case QCA::TLS::PathLengthExceeded: +// s = QObject::tr("Maximum cert chain length exceeded."); +// break; +// case QCA::TLS::Expired: +// s = QObject::tr("Certificate has expired."); +// break; +// case QCA::TLS::Unknown: + default: + s = QObject::tr("General validation error."); + break; + } + return s; +} + +class TestDebug : public XMPP::Debug +{ +public: + void msg(const QString &); + void outgoingTag(const QString &); + void incomingTag(const QString &); + void outgoingXml(const QDomElement &); + void incomingXml(const QDomElement &); +}; + +class TestDlg : public QDialog, public Ui::TestUI +{ + Q_OBJECT +public: + bool active, connected; + XMPP::AdvancedConnector *conn; + QCA::TLS *tls; + XMPP::QCATLSHandler *tlsHandler; + XMPP::ClientStream *stream; + XMPP::Jid jid; + + TestDlg(QWidget *parent=0) : QDialog(parent) + { + setupUi(this); + setWindowTitle(tr("XMPP Test")); + + connect(ck_probe, SIGNAL(toggled(bool)), SLOT(probe_toggled(bool))); + connect(cb_proxy, SIGNAL(activated(int)), SLOT(proxy_activated(int))); + connect(pb_go, SIGNAL(clicked()), SLOT(go())); + connect(pb_send, SIGNAL(clicked()), SLOT(send())); + connect(pb_im, SIGNAL(clicked()), SLOT(sc_im())); + connect(pb_msg, SIGNAL(clicked()), SLOT(sc_msg())); + connect(pb_iqv, SIGNAL(clicked()), SLOT(sc_iqv())); + connect(pb_about, SIGNAL(clicked()), SLOT(about())); + + sb_ssfmin->setMinValue(0); + sb_ssfmin->setMaxValue(256); + sb_ssfmax->setMinValue(0); + sb_ssfmax->setMaxValue(256); + + pb_send->setEnabled(false); + proxy_activated(0); + ck_probe->setChecked(true); + ck_mutual->setChecked(false); + pb_go->setText(tr("&Connect")); + + //le_jid->setText("psitest@jabberd.jabberstudio.org/Test"); + //ck_probe->setChecked(false); + //le_host->setText("jabberd.jabberstudio.org:15222"); + //ck_mutual->setChecked(false); + //le_jid->setText("sasltest@e.jabber.ru/Test"); + //le_jid->setText("psitest@jabber.cz/Test"); + //le_pass->setText("psitest"); + //cb_proxy->setCurrentItem(3); + //le_proxyurl->setText("http://connect.jabber.cz/"); + + // setup xmpp + conn = new XMPP::AdvancedConnector; + connect(conn, SIGNAL(srvLookup(const QString &)), SLOT(conn_srvLookup(const QString &))); + connect(conn, SIGNAL(srvResult(bool)), SLOT(conn_srvResult(bool))); + connect(conn, SIGNAL(httpSyncStarted()), SLOT(conn_httpSyncStarted())); + connect(conn, SIGNAL(httpSyncFinished()), SLOT(conn_httpSyncFinished())); + + if(QCA::isSupported("tls")) { + tls = new QCA::TLS; + tlsHandler = new XMPP::QCATLSHandler(tls); + tlsHandler->setXMPPCertCheck(true); + connect(tlsHandler, SIGNAL(tlsHandshaken()), SLOT(tls_handshaken())); + } + else { + tls = 0; + tlsHandler = 0; + } + + stream = new XMPP::ClientStream(conn, tlsHandler); + //stream->setOldOnly(true); + connect(stream, SIGNAL(connected()), SLOT(cs_connected())); + connect(stream, SIGNAL(securityLayerActivated(int)), SLOT(cs_securityLayerActivated(int))); + connect(stream, SIGNAL(needAuthParams(bool, bool, bool)), SLOT(cs_needAuthParams(bool, bool, bool))); + connect(stream, SIGNAL(authenticated()), SLOT(cs_authenticated())); + connect(stream, SIGNAL(connectionClosed()), SLOT(cs_connectionClosed())); + connect(stream, SIGNAL(delayedCloseFinished()), SLOT(cs_delayedCloseFinished())); + connect(stream, SIGNAL(readyRead()), SLOT(cs_readyRead())); + connect(stream, SIGNAL(stanzaWritten()), SLOT(cs_stanzaWritten())); + connect(stream, SIGNAL(warning(int)), SLOT(cs_warning(int))); + connect(stream, SIGNAL(error(int)), SLOT(cs_error(int))); + + QTimer::singleShot(0, this, SLOT(adjustLayout())); + + le_jid->setFocus(); + active = false; + connected = false; + } + + ~TestDlg() + { + delete stream; + delete tls; // this destroys the TLSHandler also + delete conn; + } + +private slots: + void adjustLayout() + { + tb_main->setFixedWidth(tb_main->minimumSizeHint().width()); + resize(minimumSizeHint()); + show(); + } + + void about() + { + QMessageBox::about(this, tr("About %1").arg(AppName), tr( + "%1 v1.0\n" + "\n" + "Utility to demonstrate the Iris XMPP library.\n" + "\n" + "Currently supports:\n" + " draft-ietf-xmpp-core-21\n" + " JEP-0025\n" + "\n" + "Copyright (C) 2003 Justin Karneges").arg(AppName)); + } + + void probe_toggled(bool) + { + setHostState(); + } + + void proxy_activated(int x) + { + bool ok = (x != 0); + bool okpoll = (x == 3); + gb_proxy->setEnabled(ok); + lb_proxyurl->setEnabled(okpoll); + le_proxyurl->setEnabled(okpoll); + ck_probe->setEnabled(!okpoll); + setHostState(); + } + + void cleanup() + { + pb_send->setEnabled(false); + pb_go->setEnabled(true); + pb_go->setText(tr("&Connect")); + pb_go->setFocus(); + gb_server->setEnabled(true); + active = false; + connected = false; + } + + void start() + { + if(active) + return; + + jid = XMPP::Jid(le_jid->text()); + if(jid.domain().isEmpty() || jid.node().isEmpty() || jid.resource().isEmpty()) { + QMessageBox::information(this, tr("Error"), tr("Please enter the Full JID to connect with.")); + return; + } + + int p = cb_proxy->currentItem(); + XMPP::AdvancedConnector::Proxy proxy; + if(p > 0) { + QString s = le_proxyhost->text(); + QString url = le_proxyurl->text(); + if(p != 3 && s.isEmpty()) { + QMessageBox::information(this, tr("Error"), tr("You must specify a host:port for the proxy.")); + return; + } + if(p == 3 && s.isEmpty() && url.isEmpty()) { + QMessageBox::information(this, tr("Error"), tr("You must at least enter a URL to use http poll.")); + return; + } + QString host; + int port = 0; + if(!s.isEmpty()) { + int n = s.find(':'); + if(n == -1) { + QMessageBox::information(this, tr("Error"), tr("Please enter the proxy host in the form 'host:port'.")); + return; + } + host = s.mid(0, n); + port = s.mid(n+1).toInt(); + } + if(p == 1) + proxy.setHttpConnect(host, port); + else if(p == 2) + proxy.setSocks(host, port); + else if(p == 3) { + proxy.setHttpPoll(host, port, url); + proxy.setPollInterval(2); // fast during login + } + proxy.setUserPass(le_proxyuser->text(), le_proxypass->text()); + } + bool probe = (p != 3 && ck_probe->isChecked()); + bool useHost = (!probe && !le_host->text().isEmpty()); + QString host; + int port = 0; + bool ssl = false; + if(useHost) { + QString s = le_host->text(); + int n = s.find(':'); + if(n == -1) { + QMessageBox::information(this, tr("Error"), tr("Please enter the host in the form 'host:port'.")); + return; + } + host = s.mid(0, n); + port = s.mid(n+1).toInt(); + + if(ck_ssl->isChecked()) + ssl = true; + } + if(sb_ssfmin->value() > sb_ssfmax->value()) { + QMessageBox::information(this, tr("Error"), tr("Error: SSF Min is greater than SSF Max.")); + return; + } + + if((probe || ssl) && !tls) { + QMessageBox::information(this, tr("Error"), tr("Error: TLS not available. Disable any TLS options.")); + return; + } + + // prepare + conn->setProxy(proxy); + if(useHost) + conn->setOptHostPort(host, port); + else + conn->setOptHostPort("", 0); + conn->setOptProbe(probe); + conn->setOptSSL(ssl); + + if(tls) { + tls->setTrustedCertificates(QCA::systemStore()); + } + + stream->setNoopTime(55000); // every 55 seconds + stream->setAllowPlain(ck_plain->isChecked() ? XMPP::ClientStream::AllowPlain : XMPP::ClientStream::NoAllowPlain); + stream->setRequireMutualAuth(ck_mutual->isChecked()); + stream->setSSFRange(sb_ssfmin->value(), sb_ssfmax->value()); + //stream->setOldOnly(true); + stream->setCompress(true); + + gb_server->setEnabled(false); + pb_go->setText(tr("&Disconnect")); + pb_go->setFocus(); + active = true; + + appendSysMsg("Connecting..."); + stream->connectToServer(jid); + } + + void stop() + { + if(!active) + return; + + if(connected) { + pb_go->setEnabled(false); + appendSysMsg("Disconnecting..."); + stream->close(); + } + else { + stream->close(); + appendSysMsg("Disconnected"); + cleanup(); + } + } + + void go() + { + if(active) + stop(); + else + start(); + } + + void send() + { + if(te_input->text().isEmpty()) + return; + + // construct a "temporary" document to parse the input + QString str = "\n"; + str += te_input->text() + '\n'; + str += ""; + + QDomDocument doc; + QString errMsg; + int errLine, errCol; + if(!doc.setContent(str, true, &errMsg, &errLine, &errCol)) { + int lines = QStringList::split('\n', str, true).count(); + --errLine; // skip the first line + if(errLine == lines-1) { + errLine = lines-2; + errCol = te_input->paragraphLength(errLine-1)+1; + errMsg = "incomplete input"; + } + te_input->setCursorPosition(errLine-1, errCol-1); + QMessageBox::information(this, tr("Error"), tr("Bad XML input (%1,%2): %3\nPlease correct and try again.").arg(errCol).arg(errLine).arg(errMsg)); + return; + } + QDomElement e = doc.firstChild().toElement(); + + int num = 0; + QDomNodeList nl = e.childNodes(); + QList stanzaList; + for(uint x = 0; x < nl.count(); ++x) { + QDomNode n = nl.item(x); + if(n.isElement()) { + QDomElement e = n.toElement(); + XMPP::Stanza s = stream->createStanza(e); + if(s.isNull()) { + QMessageBox::information(this, tr("Error"), tr("Bad Stanza '%1'. Must be 'message', 'presence', or 'iq'").arg(e.tagName())); + return; + } + stanzaList += s; + ++num; + } + } + if(num == 0) { + QMessageBox::information(this, tr("Error"), tr("You must enter at least one stanza!")); + return; + } + + // out the door + for(QList::ConstIterator it = stanzaList.begin(); it != stanzaList.end(); ++it) { + appendXmlOut(XMPP::Stream::xmlToString((*it).element(), true)); + stream->write(*it); + } + + te_input->setText(""); + } + + void sc_im() + { + /*XMPP::Message m("justin@andbit.net/Psi"); + m.setSubject("Hi"); + m.setBody("I send you this in order to have your advice."); + m.setBody("Escucha lechuga!", "es"); + XMPP::Stanza stanza = m.toStanza(stream); + QString str = stanza.toString(); + printf("[%s]\n", str.latin1()); + + XMPP::Message n; + n.fromStanza(stanza); + printf("subject: [%s]\n", n.subject().latin1()); + printf("body: [%s]\n", n.body().latin1()); + printf("body-es: [%s]\n", n.body("es").latin1());*/ + + QString s; + s += "\n"; + s += " \n"; + s += ""; + te_input->setText(s); + te_input->setFocus(); + } + + void sc_msg() + { + QString to = le_to->text(); + QString s; + if(!to.isEmpty()) + s += QString("\n").arg(to); + else + s += QString("\n"); + s += " hello world\n"; + s += ""; + te_input->setText(s); + if(!to.isEmpty()) { + te_input->setCursorPosition(1, 7); + te_input->setSelection(1, 7, 1, 18); + } + else + te_input->setCursorPosition(0, 13); + te_input->setFocus(); + } + + void sc_iqv() + { + QString to = le_to->text(); + QString s; + if(!to.isEmpty()) + s += QString("\n").arg(to); + else + s += QString("\n"); + s += " \n"; + s += ""; + te_input->setText(s); + if(!to.isEmpty()) { + te_input->setCursorPosition(0, 8); + te_input->setSelection(0, 8, 0, 8 + to.length()); + } + else + te_input->setCursorPosition(0, 8); + te_input->setFocus(); + } + + void conn_srvLookup(const QString &server) + { + appendLibMsg(QString("SRV lookup on [%1]").arg(server)); + } + + void conn_srvResult(bool b) + { + if(b) + appendLibMsg("SRV lookup success!"); + else + appendLibMsg("SRV lookup failed"); + } + + void conn_httpSyncStarted() + { + appendLibMsg("HttpPoll: syncing"); + } + + void conn_httpSyncFinished() + { + appendLibMsg("HttpPoll: done"); + } + + void tls_handshaken() + { + //QCA::Certificate cert = tls->peerCertificate(); + int vr = tls->peerIdentityResult(); + if (vr == QCA::TLS::Valid && !tlsHandler->certMatchesHostname()) vr = QCA::TLS::HostMismatch; + + appendSysMsg("Successful TLS handshake."); + if(vr == QCA::TLS::Valid) + appendSysMsg("Valid certificate."); + else { + appendSysMsg(QString("Invalid certificate: %1").arg(resultToString(vr)), Qt::red); + appendSysMsg("Continuing anyway"); + } + + tlsHandler->continueAfterHandshake(); + } + + void cs_connected() + { + QString s = "Connected"; + if(conn->havePeerAddress()) + s += QString(" (%1:%2)").arg(conn->peerAddress().toString()).arg(conn->peerPort()); + if(conn->useSSL()) + s += " [ssl]"; + appendSysMsg(s); + } + + void cs_securityLayerActivated(int type) + { + appendSysMsg(QString("Security layer activated (%1)").arg((type == XMPP::ClientStream::LayerTLS) ? "TLS": "SASL")); + } + + void cs_needAuthParams(bool user, bool pass, bool realm) + { + QString s = "Need auth parameters -"; + if(user) + s += " (Username)"; + if(pass) + s += " (Password)"; + if(realm) + s += " (Realm)"; + appendSysMsg(s); + + if(user) { + if(!le_user->text().isEmpty()) + stream->setUsername(le_user->text()); + else + stream->setUsername(jid.node()); + } + if(pass) { + if(!le_pass->text().isEmpty()) + stream->setPassword(le_pass->text()); + else { + conn->changePollInterval(10); // slow down during prompt + bool ok; + QString s = QInputDialog::getText(tr("Password"), tr("Enter the password for %1").arg(jid.full()), QLineEdit::Password, QString::null, &ok, this); + if(!ok) { + stop(); + return; + } + stream->setPassword(s); + + conn->changePollInterval(2); // resume speed + } + } + if(realm) + stream->setRealm(jid.domain()); + + stream->continueAfterParams(); + } + + void cs_authenticated() + { + connected = true; + pb_send->setEnabled(true); + conn->changePollInterval(10); // slow down after login + appendSysMsg("Authenticated"); + } + + void cs_connectionClosed() + { + appendSysMsg("Disconnected by peer"); + cleanup(); + } + + void cs_delayedCloseFinished() + { + appendSysMsg("Disconnected"); + cleanup(); + } + + void cs_readyRead() + { + while(stream->stanzaAvailable()) { + XMPP::Stanza s = stream->read(); + appendXmlIn(XMPP::Stream::xmlToString(s.element(), true)); + } + } + + void cs_stanzaWritten() + { + appendSysMsg("Stanza sent"); + } + + void cs_warning(int warn) + { + if(warn == XMPP::ClientStream::WarnOldVersion) { + appendSysMsg("Warning: pre-1.0 protocol server", Qt::red); + } + else if(warn == XMPP::ClientStream::WarnNoTLS) { + appendSysMsg("Warning: TLS not available!", Qt::red); + } + stream->continueAfterWarning(); + } + + void cs_error(int err) + { + if(err == XMPP::ClientStream::ErrParse) { + appendErrMsg("XML parsing error"); + } + else if(err == XMPP::ClientStream::ErrProtocol) { + appendErrMsg("XMPP protocol error"); + } + else if(err == XMPP::ClientStream::ErrStream) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::Stream::GenericStreamError) + s = "generic stream error"; + else if(x == XMPP::ClientStream::Conflict) + s = "conflict (remote login replacing this one)"; + else if(x == XMPP::ClientStream::ConnectionTimeout) + s = "timed out from inactivity"; + else if(x == XMPP::ClientStream::InternalServerError) + s = "internal server error"; + else if(x == XMPP::ClientStream::InvalidFrom) + s = "invalid from address"; + else if(x == XMPP::ClientStream::InvalidXml) + s = "invalid XML"; + else if(x == XMPP::ClientStream::PolicyViolation) + s = "policy violation. go to jail!"; + else if(x == XMPP::ClientStream::ResourceConstraint) + s = "server out of resources"; + else if(x == XMPP::ClientStream::SystemShutdown) + s = "system is shutting down NOW"; + appendErrMsg(QString("XMPP stream error: %1").arg(s)); + } + else if(err == XMPP::ClientStream::ErrConnection) { + int x = conn->errorCode(); + QString s; + if(x == XMPP::AdvancedConnector::ErrConnectionRefused) + s = "unable to connect to server"; + else if(x == XMPP::AdvancedConnector::ErrHostNotFound) + s = "host not found"; + else if(x == XMPP::AdvancedConnector::ErrProxyConnect) + s = "proxy connect"; + else if(x == XMPP::AdvancedConnector::ErrProxyNeg) + s = "proxy negotiating"; + else if(x == XMPP::AdvancedConnector::ErrProxyAuth) + s = "proxy authorization"; + else if(x == XMPP::AdvancedConnector::ErrStream) + s = "stream error"; + appendErrMsg(QString("Connection error: %1").arg(s)); + } + else if(err == XMPP::ClientStream::ErrNeg) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::HostGone) + s = "host no longer hosted"; + else if(x == XMPP::ClientStream::HostUnknown) + s = "host unknown"; + else if(x == XMPP::ClientStream::RemoteConnectionFailed) + s = "a required remote connection failed"; + else if(x == XMPP::ClientStream::SeeOtherHost) + s = QString("see other host: [%1]").arg(stream->errorText()); + else if(x == XMPP::ClientStream::UnsupportedVersion) + s = "server does not support proper xmpp version"; + appendErrMsg(QString("Stream negotiation error: %1").arg(s)); + } + else if(err == XMPP::ClientStream::ErrTLS) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::TLSStart) + s = "server rejected STARTTLS"; + else if(x == XMPP::ClientStream::TLSFail) { + int t = tlsHandler->tlsError(); + if(t == QCA::TLS::ErrorHandshake) + s = "TLS handshake error"; + else + s = "broken security layer (TLS)"; + } + appendErrMsg(s); + } + else if(err == XMPP::ClientStream::ErrAuth) { + int x = stream->errorCondition(); + QString s; + if(x == XMPP::ClientStream::GenericAuthError) + s = "unable to login"; + else if(x == XMPP::ClientStream::NoMech) + s = "no appropriate auth mechanism available for given security settings"; + else if(x == XMPP::ClientStream::BadProto) + s = "bad server response"; + else if(x == XMPP::ClientStream::BadServ) + s = "server failed mutual authentication"; + else if(x == XMPP::ClientStream::EncryptionRequired) + s = "encryption required for chosen SASL mechanism"; + else if(x == XMPP::ClientStream::InvalidAuthzid) + s = "invalid authzid"; + else if(x == XMPP::ClientStream::InvalidMech) + s = "invalid SASL mechanism"; + else if(x == XMPP::ClientStream::InvalidRealm) + s = "invalid realm"; + else if(x == XMPP::ClientStream::MechTooWeak) + s = "SASL mechanism too weak for authzid"; + else if(x == XMPP::ClientStream::NotAuthorized) + s = "not authorized"; + else if(x == XMPP::ClientStream::TemporaryAuthFailure) + s = "temporary auth failure"; + appendErrMsg(QString("Auth error: %1").arg(s)); + } + else if(err == XMPP::ClientStream::ErrSecurityLayer) + appendErrMsg("Broken security layer (SASL)"); + cleanup(); + } + +private: + void setHostState() + { + bool ok = false; + if(!ck_probe->isChecked() && cb_proxy->currentItem() != 3) + ok = true; + lb_host->setEnabled(ok); + le_host->setEnabled(ok); + ck_ssl->setEnabled(ok); + } + + void appendSysMsg(const QString &s, const QColor &_c=QColor()) + { + QString str; + QColor c; + if(_c.isValid()) + c = _c; + else + c = Qt::blue; + + if(c.isValid()) + str += QString("").arg(c.name()); + str += QString("*** %1").arg(s); + if(c.isValid()) + str += QString(""); + te_log->append(str); + } + +public: + void appendLibMsg(const QString &s) + { + appendSysMsg(s, Qt::magenta); + } + + void appendErrMsg(const QString &s) + { + appendSysMsg(s, Qt::red); + } + + void appendXmlOut(const QString &s) + { + QStringList lines = QStringList::split('\n', s, true); + QString str; + bool first = true; + for(QStringList::ConstIterator it = lines.begin(); it != lines.end(); ++it) { + if(!first) + str += "
"; + str += QString("%2").arg(QColor(Qt::darkGreen).name()).arg(plain2rich(*it)); + first = false; + } + te_log->append(str); + } + + void appendXmlIn(const QString &s) + { + QStringList lines = QStringList::split('\n', s, true); + QString str; + bool first = true; + for(QStringList::ConstIterator it = lines.begin(); it != lines.end(); ++it) { + if(!first) + str += "
"; + str += QString("%2").arg(QColor(Qt::darkBlue).name()).arg(plain2rich(*it)); + first = false; + } + te_log->append(str); + } +}; + +TestDlg *td_glob = 0; + +void TestDebug::msg(const QString &s) +{ + if(td_glob) + td_glob->appendLibMsg(s); +} + +void TestDebug::outgoingTag(const QString &s) +{ + if(td_glob) + td_glob->appendXmlOut(s); +} + +void TestDebug::incomingTag(const QString &s) +{ + if(td_glob) + td_glob->appendXmlIn(s); +} + +void TestDebug::outgoingXml(const QDomElement &e) +{ + QString out = XMPP::Stream::xmlToString(e, true); + if(td_glob) + td_glob->appendXmlOut(out); +} + +void TestDebug::incomingXml(const QDomElement &e) +{ + QString out = XMPP::Stream::xmlToString(e, true); + if(td_glob) + td_glob->appendXmlIn(out); +} + +#include "xmpptest.moc" + +int main(int argc, char **argv) +{ + QCA::Initializer init; + +#ifdef Q_OS_WIN32 + QApplication::addLibraryPath("."); + putenv("SASL_PATH=.\\sasl"); +#endif + QApplication app(argc, argv); + + // seed the random number generator (needed at least for HttpPoll) + srand(time(NULL)); + + TestDlg *w = new TestDlg(0); + td_glob = w; + TestDebug *td = new TestDebug; + XMPP::setDebug(td); + QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); + app.exec(); + XMPP::setDebug(0); + delete td; + delete w; + + // we need this for a clean exit + QCA::unloadAllPlugins(); + + return 0; +} + +#ifdef QCA_STATIC +#include +#ifdef HAVE_OPENSSL +Q_IMPORT_PLUGIN(qca_openssl) +#endif +#endif diff --git a/iris-legacy/iris/example/xmpptest/xmpptest.pro b/iris-legacy/iris/example/xmpptest/xmpptest.pro new file mode 100644 index 0000000..f9cd363 --- /dev/null +++ b/iris-legacy/iris/example/xmpptest/xmpptest.pro @@ -0,0 +1,41 @@ +TEMPLATE = app +CONFIG += thread +CONFIG -= app_bundle +TARGET = xmpptest +QT += xml network qt3support +DEFINES += QT_STATICPLUGIN + +MOC_DIR = .moc +OBJECTS_DIR = .obj +UI_DIR = .ui + +#DEFINES += CS_XMPP +DEFINES += XMPP_DEBUG + +# Dependencies +include(../../../conf.pri) +windows:include(../../../conf_windows.pri) + +!qca-static { + CONFIG += crypto +} +qca-static { + # QCA + DEFINES += QCA_STATIC + include(../../../third-party/qca/qca.pri) + + # QCA-OpenSSL + contains(DEFINES, HAVE_OPENSSL) { + include(../../../third-party/qca/qca-openssl.pri) + } +} + +include(../../../cutestuff/cutestuff.pri) +include(../../iris.pri) +irisnet { + include(../../irisnet/irisnet.pri) +} + +SOURCES += xmpptest.cpp +INTERFACES += ui_test.ui + diff --git a/iris-legacy/iris/include/im.h b/iris-legacy/iris/include/im.h new file mode 100644 index 0000000..a570fb0 --- /dev/null +++ b/iris-legacy/iris/include/im.h @@ -0,0 +1,133 @@ +/* + * im.h - XMPP "IM" library API + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_IM_H +#define XMPP_IM_H + +#include +//Added by qt3to4: +#include + +#include "xmpp.h" +#include "xmpp_jid.h" +#include "xmpp_muc.h" +#include "xmpp_message.h" +#include "xmpp_chatstate.h" +#include "xmpp_status.h" +#include "xmpp_htmlelement.h" +#include "xmpp_features.h" +#include "xmpp_httpauthrequest.h" +#include "xmpp_url.h" +#include "xmpp_task.h" +#include "xmpp_resource.h" +#include "xmpp_resourcelist.h" +#include "xmpp_roster.h" +#include "xmpp_rosteritem.h" +#include "xmpp_liverosteritem.h" +#include "xmpp_liveroster.h" +#include "xmpp_rosterx.h" +#include "xmpp_xdata.h" +#include "xmpp_discoitem.h" +#include "xmpp_agentitem.h" +#include "xmpp_client.h" +#include "xmpp_address.h" +#include "xmpp_pubsubitem.h" +#include "xmpp_pubsubretraction.h" + +namespace XMPP +{ + typedef QMap StringMap; + + typedef QList AgentList; + typedef QList DiscoList; + + class FormField + { + public: + enum { username, nick, password, name, first, last, email, address, city, state, zip, phone, url, date, misc }; + FormField(const QString &type="", const QString &value=""); + ~FormField(); + + int type() const; + QString fieldName() const; + QString realName() const; + bool isSecret() const; + const QString & value() const; + void setType(int); + bool setType(const QString &); + void setValue(const QString &); + + private: + int tagNameToType(const QString &) const; + QString typeToTagName(int) const; + + int v_type; + QString v_value; + + class Private; + Private *d; + }; + + class Form : public QList + { + public: + Form(const Jid &j=""); + ~Form(); + + Jid jid() const; + QString instructions() const; + QString key() const; + void setJid(const Jid &); + void setInstructions(const QString &); + void setKey(const QString &); + + private: + Jid v_jid; + QString v_instructions, v_key; + + class Private; + Private *d; + }; + + class SearchResult + { + public: + SearchResult(const Jid &jid=""); + ~SearchResult(); + + const Jid & jid() const; + const QString & nick() const; + const QString & first() const; + const QString & last() const; + const QString & email() const; + + void setJid(const Jid &); + void setNick(const QString &); + void setFirst(const QString &); + void setLast(const QString &); + void setEmail(const QString &); + + private: + Jid v_jid; + QString v_nick, v_first, v_last, v_email; + }; +} + +#endif diff --git a/iris-legacy/iris/include/xmpp.h b/iris-legacy/iris/include/xmpp.h new file mode 100644 index 0000000..b9fb959 --- /dev/null +++ b/iris-legacy/iris/include/xmpp.h @@ -0,0 +1,235 @@ +/* + * xmpp.h - XMPP "core" library API + * Copyright (C) 2003 Justin Karneges + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_H +#define XMPP_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xmpp_jid.h" +#include "xmpp_stanza.h" +#include "xmpp_stream.h" +#include "xmpp_clientstream.h" + +namespace QCA +{ + class TLS; +}; + +#ifndef CS_XMPP +class ByteStream; +#endif + +#include // For QCA::SASL::Params + +namespace XMPP +{ + // CS_IMPORT_BEGIN cutestuff/bytestream.h +#ifdef CS_XMPP + class ByteStream; +#endif + // CS_IMPORT_END + + class Debug + { + public: + virtual ~Debug(); + + virtual void msg(const QString &)=0; + virtual void outgoingTag(const QString &)=0; + virtual void incomingTag(const QString &)=0; + virtual void outgoingXml(const QDomElement &)=0; + virtual void incomingXml(const QDomElement &)=0; + }; + + void setDebug(Debug *); + + class Connector : public QObject + { + Q_OBJECT + public: + Connector(QObject *parent=0); + virtual ~Connector(); + + virtual void connectToServer(const QString &server)=0; + virtual ByteStream *stream() const=0; + virtual void done()=0; + + bool useSSL() const; + bool havePeerAddress() const; + QHostAddress peerAddress() const; + Q_UINT16 peerPort() const; + + signals: + void connected(); + void error(); + + protected: + void setUseSSL(bool b); + void setPeerAddressNone(); + void setPeerAddress(const QHostAddress &addr, Q_UINT16 port); + + private: + bool ssl; + bool haveaddr; + QHostAddress addr; + Q_UINT16 port; + }; + + class AdvancedConnector : public Connector + { + Q_OBJECT + public: + enum Error { ErrConnectionRefused, ErrHostNotFound, ErrProxyConnect, ErrProxyNeg, ErrProxyAuth, ErrStream }; + AdvancedConnector(QObject *parent=0); + virtual ~AdvancedConnector(); + + class Proxy + { + public: + enum { None, HttpConnect, HttpPoll, Socks }; + Proxy(); + ~Proxy(); + + int type() const; + QString host() const; + Q_UINT16 port() const; + QString url() const; + QString user() const; + QString pass() const; + int pollInterval() const; + + void setHttpConnect(const QString &host, Q_UINT16 port); + void setHttpPoll(const QString &host, Q_UINT16 port, const QString &url); + void setSocks(const QString &host, Q_UINT16 port); + void setUserPass(const QString &user, const QString &pass); + void setPollInterval(int secs); + + private: + int t; + QString v_host, v_url; + Q_UINT16 v_port; + QString v_user, v_pass; + int v_poll; + }; + + void setProxy(const Proxy &proxy); + void setOptHostPort(const QString &host, Q_UINT16 port); + void setOptProbe(bool); + void setOptSSL(bool); + + void changePollInterval(int secs); + + void connectToServer(const QString &server); + ByteStream *stream() const; + void done(); + + int errorCode() const; + + signals: + void srvLookup(const QString &server); + void srvResult(bool success); + void httpSyncStarted(); + void httpSyncFinished(); + + private slots: + void dns_done(); + void srv_done(); + void bs_connected(); + void bs_error(int); + void http_syncStarted(); + void http_syncFinished(); + + private: + class Private; + Private *d; + + void cleanup(); + void do_resolve(); + void do_connect(); + void tryNextSrv(); + }; + + class TLSHandler : public QObject + { + Q_OBJECT + public: + TLSHandler(QObject *parent=0); + virtual ~TLSHandler(); + + virtual void reset()=0; + virtual void startClient(const QString &host)=0; + virtual void write(const QByteArray &a)=0; + virtual void writeIncoming(const QByteArray &a)=0; + + signals: + void success(); + void fail(); + void closed(); + void readyRead(const QByteArray &a); + void readyReadOutgoing(const QByteArray &a, int plainBytes); + }; + + class QCATLSHandler : public TLSHandler + { + Q_OBJECT + public: + QCATLSHandler(QCA::TLS *parent); + ~QCATLSHandler(); + + QCA::TLS *tls() const; + int tlsError() const; + + void setXMPPCertCheck(bool enable); + bool XMPPCertCheck(); + bool certMatchesHostname(); + + void reset(); + void startClient(const QString &host); + void write(const QByteArray &a); + void writeIncoming(const QByteArray &a); + + signals: + void tlsHandshaken(); + + public slots: + void continueAfterHandshake(); + + private slots: + void tls_handshaken(); + void tls_readyRead(); + void tls_readyReadOutgoing(); + void tls_closed(); + void tls_error(); + + private: + class Private; + Private *d; + }; +}; + +#endif diff --git a/iris-legacy/iris/include/xmpp_address.h b/iris-legacy/iris/include/xmpp_address.h new file mode 100644 index 0000000..e532069 --- /dev/null +++ b/iris-legacy/iris/include/xmpp_address.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2006 Remko Troncon + * + * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef XMPP_ADDRESS_H +#define XMPP_ADDRESS_H + +#include + +#include "xmpp_jid.h" + +class QDomElement; + +namespace XMPP +{ + class Address + { + public: + typedef enum { Unknown, To, Cc, Bcc, ReplyTo, ReplyRoom, NoReply, OriginalFrom, OriginalTo } Type; + + Address(Type type = Unknown, const Jid& jid = Jid()); + Address(const QDomElement&); + + const Jid& jid() const; + const QString& uri() const; + const QString& node() const; + const QString& desc() const; + bool delivered() const; + Type type() const; + + QDomElement toXml(Stanza&) const; + void fromXml(const QDomElement& t); + + void setJid(const Jid &); + void setUri(const QString &); + void setNode(const QString &); + void setDesc(const QString &); + void setDelivered(bool); + void setType(Type); + + private: + Jid v_jid; + QString v_uri, v_node, v_desc; + bool v_delivered; + Type v_type; + }; + + typedef QList